From 3676da83fa2ae9e3937e74d827f30623d4f17bfe Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:43:53 +0100 Subject: [PATCH 01/24] sync(common-v8): port 19030df Add keyed mutex/semaphore and refactor instances Source upstream commit: 19030df63b6495bfd985584fcc7cd9e72900fe87 Port scope: adapted (resolved Task/Instances/Shared/Relay conflicts against fork runtime layout). --- packages/common/src/Instances.ts | 49 +- packages/common/src/Resources.ts | 578 ++-- packages/common/src/Task.ts | 1028 ++++--- packages/common/src/local-first/Relay.ts | 213 +- packages/common/src/local-first/Shared.ts | 654 ++--- packages/common/test/Instances.test.ts | 665 ++--- packages/common/test/Task.test.ts | 2389 +++++++++++++---- .../common/test/local-first/Evolu.test.ts | 124 +- packages/web/src/Task.ts | 2 +- 9 files changed, 3530 insertions(+), 2172 deletions(-) diff --git a/packages/common/src/Instances.ts b/packages/common/src/Instances.ts index 004c20740..bd3900ad0 100644 --- a/packages/common/src/Instances.ts +++ b/packages/common/src/Instances.ts @@ -1,30 +1,35 @@ /** - * A multiton for disposable instances. + * A keyed instance registry for disposable instances. * * @module */ /** - * A multiton for disposable instances. + * A keyed instance registry for disposable instances. * - * A multiton guarantees exactly one instance per key. + * Guarantees exactly one live instance per key. Also known as a multiton (a + * keyed singleton). * - * Use cases: + * ### Example * - * - One Mutex per key to prevent concurrent writes - * - Preserving state during hot module reloading + * Real usage from `local-first/Relay.ts`: one mutex per owner to serialize + * writes for the same owner. * - * Note: Do not use this as global shared state. Use it locally or pass it as a - * dependency instead. The only exception is hot reloading, where Evolu uses - * this to keep a single instance across module reloads. Bundler hot-reload APIs - * are not consistent across environments, so this is a portable fallback. - * Having two Evolu instances with the same name would mean two SQLite - * connections to the same file, which could corrupt data. + * ```ts + * const ownerMutexes = createInstances(); * - * // TODO: Example. + * const result = await run( + * ownerMutexes.ensure(ownerId, createMutex).withLock(async () => { + * // Write messages for ownerId. + * return ok(); + * }), + * ); + * ``` */ -export interface Instances - extends Disposable { +export interface Instances< + K extends string, + T extends Disposable, +> extends Disposable { /** * Ensures an instance exists for the given key, creating it if necessary. If * the instance already exists, the optional `onCacheHit` callback is invoked @@ -85,21 +90,13 @@ export const createInstances = < }, [Symbol.dispose]: () => { - const errors: Array = []; + using stack = new globalThis.DisposableStack(); + for (const instance of instances.values()) { - try { - instance[Symbol.dispose](); - } catch (error) { - errors.push(error); - } + stack.use(instance); } instances.clear(); - - if (errors.length === 1) throw errors[0]; - if (errors.length > 1) { - throw new AggregateError(errors, "Multiple disposal errors occurred"); - } }, }; }; diff --git a/packages/common/src/Resources.ts b/packages/common/src/Resources.ts index 835fcfae7..f0bd4d89e 100644 --- a/packages/common/src/Resources.ts +++ b/packages/common/src/Resources.ts @@ -1,400 +1,272 @@ /** - * Reference-counted resource management with delayed disposal. + * Reference-counted resource management. * * @module */ -import type { Result } from "./Result.js"; -import { err, ok } from "./Result.js"; -import type { Duration, TimeDep, TimeoutId } from "./Time.js"; -import { PositiveInt, type Typed } from "./Type.js"; +import { assert } from "./Assert.js"; +import { isNone } from "./Option.js"; +import { createRefCount, type RefCount } from "./RefCount.js"; +import { createRelation } from "./Relation.js"; +import { ok } from "./Result.js"; +import { createMutexByKey, unabortable, type Task } from "./Task.js"; /** - * A generic resource manager that handles reference counting and delayed - * disposal of shared resources. Useful for managing expensive resources like - * WebSocket connections that need to be shared among multiple consumers. + * Async reference-counted resource management. + * + * Tracks which consumers use which shared resources and keeps resources alive + * while at least one consumer is attached. + * + * ### Example + * + * ```ts + * interface TransportConfig { + * readonly url: UrlString; + * } + * + * interface Owner { + * readonly id: OwnerId; + * } + * + * const resources = createResources< + * WebSocket, + * UrlString, + * TransportConfig, + * Owner, + * OwnerId + * >({ + * createResource: async (transport) => { + * const { createWebSocket } = run.deps; + * return await run.orThrow( + * createWebSocket(transport.url, { + * onOpen: handleWebSocketOpen(transport.url), + * }), + * ); + * }, + * getResourceId: (transportConfig) => transportConfig.url, + * getConsumerId: (owner) => owner.id, + * }); + * + * const handleWebSocketOpen = (transportUrl: UrlString) => (): void => { + * const ownerIds = resources.getConsumerIdsForResource(transportUrl); + * dbWorker.postMessage({ type: "CreateSyncMessages", ownerIds }); + * }; + * + * dbWorker.onMessage = (message) => { + * switch (message.type) { + * case "OnSyncMessage": + * for (const [ownerId, syncMessage] of message.messagesByOwnerId) { + * const webSockets = resources.getResourcesForConsumerId(ownerId); + * for (const webSocket of webSockets) { + * if (webSocket.isOpen()) webSocket.send(syncMessage); + * } + * } + * } + * }; + * + * await run( + * resources.addConsumer({ id: "owner-1" as OwnerId }, [ + * { url: "wss://server1.com" as UrlString }, + * { url: "wss://server2.com" as UrlString }, + * ]), + * ); + * + * await run( + * resources.addConsumer({ id: "owner-2" as OwnerId }, [ + * { url: "wss://server1.com" as UrlString }, + * ]), + * ); + * + * await run( + * resources.removeConsumer({ id: "owner-1" as OwnerId }, [ + * { url: "wss://server1.com" as UrlString }, + * { url: "wss://server2.com" as UrlString }, + * ]), + * ); + * + * // The WebSocket for wss://server2.com is disposed because it has no consumers. + * // The WebSocket for wss://server1.com stays alive because owner-2 still uses it. + * ``` */ export interface Resources< TResource extends Disposable, - TResourceKey extends string, + TResourceId extends string, TResourceConfig, TConsumer, TConsumerId extends string, -> extends Disposable { - /** - * Adds a consumer to resources, creating them if necessary. Increments - * reference counts for existing consumer-resource pairs. - */ +> extends AsyncDisposable { + /** Attaches a consumer to resources. */ readonly addConsumer: ( consumer: TConsumer, resourceConfigs: ReadonlyArray, - ) => void; + ) => Task; - /** - * Removes a consumer from resources. Decrements reference counts and - * schedules disposal when no consumers remain. - * - * Returns an error if the resource doesn't exist or if the consumer wasn't - * added to the resource. - */ + /** Detaches a consumer from resources. */ readonly removeConsumer: ( consumer: TConsumer, resourceConfigs: ReadonlyArray, - ) => Result< - void, - | ResourceNotFoundError - | ConsumerNotFoundError - >; - - /** Gets the resource for the specified key, or null if it doesn't exist. */ - readonly getResource: (key: TResourceKey) => TResource | null; - - /** Gets all consumer IDs currently using the specified resource key. */ - readonly getConsumersForResource: ( - key: TResourceKey, - ) => ReadonlyArray; - - /** Checks if a consumer is currently using any resources. */ - readonly hasConsumerAnyResource: (consumer: TConsumer) => boolean; + ) => Task; - /** - * Gets the consumer for the specified consumer ID, or null if not found or - * not using any resources. - */ - readonly getConsumer: (consumerId: TConsumerId) => TConsumer | null; -} - -/** Error when trying to remove a consumer from a resource that doesn't exist. */ -export interface ResourceNotFoundError - extends Typed<"ResourceNotFoundError"> { - readonly resourceKey: TResourceKey; -} + readonly getConsumerIdsForResource: ( + resourceId: TResourceId, + ) => ReadonlySet; -/** Error when trying to remove a consumer that wasn't added to a resource. */ -export interface ConsumerNotFoundError< - TConsumerId extends string = string, - TResourceKey extends string = string, -> extends Typed<"ConsumerNotFoundError"> { - readonly consumerId: TConsumerId; - readonly resourceKey: TResourceKey; + readonly getResourcesForConsumerId: ( + consumerId: TConsumerId, + ) => ReadonlySet; } -export interface ResourcesConfig< +/** Creates {@link Resources}. */ +export const createResources = < TResource extends Disposable, - TResourceKey extends string, + TResourceId extends string, TResourceConfig, TConsumer, TConsumerId extends string, -> { - /** Creates a new resource for the given config. */ - readonly createResource: (config: TResourceConfig) => TResource; - - /** Extracts a unique key from a resource config for deduplication. */ - readonly getResourceKey: (config: TResourceConfig) => TResourceKey; - - /** Extracts a unique identifier from a consumer for reference counting. */ - readonly getConsumerId: (consumer: TConsumer) => TConsumerId; - - /** - * Delay before disposing unused resources. Helps avoid resource churn during - * rapid add/remove cycles. Defaults to `"100ms"`. - */ - readonly disposalDelay?: Duration; - - /** - * Called when a consumer is added to a resource for the first time. This - * happens when the consumer's reference count goes from 0 to 1 for this - * resource. - */ - readonly onConsumerAdded?: ( - consumer: TConsumer, - resource: TResource, - resourceKey: TResourceKey, - ) => void; - - /** - * Called when a consumer is completely removed from a resource. This happens - * when the consumer's reference count goes from 1 to 0 for this resource. - */ - readonly onConsumerRemoved?: ( - consumer: TConsumer, - resource: TResource, - resourceKey: TResourceKey, - ) => void; -} - -/** - * Creates {@link Resources}. - * - * This tracks which consumers are using which resources and maintains reference - * counts to know when it's safe to dispose resources. Resources are created - * on-demand and disposed with a configurable delay to avoid churn. - * - * ### Example Usage - * - * ```ts - * // WebSocket connections - * interface WebSocketConfig { - * readonly url: WebSocketUrl; - * } - * - * type WebSocketUrl = string & Brand<"WebSocketUrl">; - * type UserId = string & Brand<"UserId">; - * - * const webSockets = createResources< - * WebSocket, - * WebSocketUrl, - * WebSocketConfig, - * User, - * UserId - * >({ time: createTime() })({ - * createResource: (config) => new WebSocket(config.url), - * getResourceKey: (config) => config.url, - * getConsumerId: (user) => user.id, - * disposalDelay: "1s", - * }); - * - * // Add users to WebSocket connections - * webSockets.addConsumer(user1, [ - * { url: "ws://server1.com" as WebSocketUrl }, - * { url: "ws://server2.com" as WebSocketUrl }, - * ]); - * webSockets.addConsumer(user2, [ - * { url: "ws://server1.com" as WebSocketUrl }, - * ]); - * - * // Remove users - server1 stays alive (user2 still using it) - * webSockets.removeConsumer(user1, [ - * { url: "ws://server1.com" as WebSocketUrl }, - * { url: "ws://server2.com" as WebSocketUrl }, - * ]); - * - * // server2 gets disposed after delay, server1 stays alive - * ``` - */ -export const createResources = - < - TResource extends Disposable, - TResourceKey extends string, - TResourceConfig, - TConsumer, - TConsumerId extends string, - >( - deps: TimeDep, - ) => - ( - config: ResourcesConfig< - TResource, - TResourceKey, - TResourceConfig, - TConsumer, - TConsumerId - >, - ): Resources< - TResource, - TResourceKey, - TResourceConfig, - TConsumer, - TConsumerId - > => { - let isDisposed = false; +>({ + createResource, + getResourceId, + getConsumerId, +}: { + /** Creates a resource for the provided configuration. */ + createResource: (resourceConfig: TResourceConfig) => Promise; + + /** Maps a resource configuration to its shared resource identifier. */ + getResourceId: (resourceConfig: TResourceConfig) => TResourceId; + + /** Maps a consumer value to its stable consumer identifier. */ + getConsumerId: (consumer: TConsumer) => TConsumerId; +}): Resources< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId +> => { + const resourcesById = new Map(); + const consumerRefCountsByResourceId = new Map< + TResourceId, + RefCount + >(); + const consumerIdsByResourceId = createRelation(); + const mutexByResourceId = createMutexByKey(); + + return { + addConsumer: (consumer, resourceConfigs) => async (run) => { + const consumerId = getConsumerId(consumer); + + for (const resourceConfig of resourceConfigs) { + const resourceId = getResourceId(resourceConfig); + + const result = await run( + unabortable( + mutexByResourceId.withLock(resourceId, async () => { + let resource = resourcesById.get(resourceId); + if (!resource) { + resource = await createResource(resourceConfig); + resourcesById.set(resourceId, resource); + } - const resourcesMap = new Map(); - const consumerCounts = new Map< - TResourceKey, - Map - >(); - const consumers = new Map(); - const disposalTimeouts = new Map(); + let consumerRefCountsByConsumerId = + consumerRefCountsByResourceId.get(resourceId); + if (!consumerRefCountsByConsumerId) { + consumerRefCountsByConsumerId = createRefCount(); + consumerRefCountsByResourceId.set( + resourceId, + consumerRefCountsByConsumerId, + ); + } - const disposalDelay = config.disposalDelay ?? "100ms"; + const nextCount = + consumerRefCountsByConsumerId.increment(consumerId); - const ensureResource = (resourceConfig: TResourceConfig) => { - const key = config.getResourceKey(resourceConfig); - const timeout = disposalTimeouts.get(key); - if (timeout) { - deps.time.clearTimeout(timeout); - disposalTimeouts.delete(key); - } + if (nextCount === 1) { + consumerIdsByResourceId.add(resourceId, consumerId); + } - if (!resourcesMap.has(key)) { - const resource = config.createResource(resourceConfig); - resourcesMap.set(key, resource); + return ok(); + }), + ), + ); + assert(result.ok, "Unabortable addConsumer lock must not abort"); } - }; - - const scheduleDisposal = (key: TResourceKey): void => { - const timeout = deps.time.setTimeout(() => { - const resource = resourcesMap.get(key); - if (resource) { - resource[Symbol.dispose](); - resourcesMap.delete(key); - } - disposalTimeouts.delete(key); - }, disposalDelay); - - disposalTimeouts.set(key, timeout); - }; - - const resources: Resources< - TResource, - TResourceKey, - TResourceConfig, - TConsumer, - TConsumerId - > = { - addConsumer: (consumer, resourceConfigs) => { - if (isDisposed) return; - if (resourceConfigs.length === 0) return; - - const consumerId = config.getConsumerId(consumer); - - // Store consumer (last added consumer for this ID) - consumers.set(consumerId, consumer); - - for (const resourceConfig of resourceConfigs) { - ensureResource(resourceConfig); - const resourceKey = config.getResourceKey(resourceConfig); - let counts = consumerCounts.get(resourceKey); - if (!counts) { - counts = new Map(); - consumerCounts.set(resourceKey, counts); - } - - const currentCount = counts.get(consumerId) ?? 0; - const newCount = currentCount + 1; - counts.set(consumerId, PositiveInt.orThrow(newCount)); - - // Call onConsumerAdded callback only when consumer is added for the first time (0 -> 1) - if (currentCount === 0 && config.onConsumerAdded) { - const resource = resourcesMap.get(resourceKey); - if (resource) { - config.onConsumerAdded(consumer, resource, resourceKey); - } - } - } - }, - - removeConsumer: (consumer, resourceConfigs) => { - if (isDisposed) return ok(); - - const consumerId = config.getConsumerId(consumer); - const removeCountsByResourceKey = new Map(); - - for (const resourceConfig of resourceConfigs) { - const key = config.getResourceKey(resourceConfig); - const removeCount = (removeCountsByResourceKey.get(key) ?? 0) + 1; - removeCountsByResourceKey.set(key, removeCount); - } - - const validatedRemovals = new Map< - TResourceKey, - { - readonly counts: Map; - readonly currentCount: PositiveInt; - readonly removeCount: number; - } - >(); - - for (const [key, removeCount] of removeCountsByResourceKey) { - const counts = consumerCounts.get(key); - if (!counts) { - return err({ type: "ResourceNotFoundError", resourceKey: key }); - } - - const currentCount = counts.get(consumerId); - if (currentCount == null || currentCount < removeCount) { - return err({ - type: "ConsumerNotFoundError", - consumerId: consumerId, - resourceKey: key, - }); - } - validatedRemovals.set(key, { counts, currentCount, removeCount }); - } - - for (const [key, removal] of validatedRemovals) { - const { counts, currentCount, removeCount } = removal; - const nextCount = currentCount - removeCount; - - if (nextCount === 0) { - counts.delete(consumerId); - - // Call onConsumerRemoved callback only when consumer is completely removed (1 -> 0) - if (config.onConsumerRemoved) { - const resource = resourcesMap.get(key); - if (resource) { - config.onConsumerRemoved(consumer, resource, key); + return ok(); + }, + + removeConsumer: (consumer, resourceConfigs) => async (run) => { + const consumerId = getConsumerId(consumer); + + for (const resourceConfig of resourceConfigs) { + const resourceId = getResourceId(resourceConfig); + + const result = await run( + unabortable( + mutexByResourceId.withLock(resourceId, () => { + const consumerRefCountsByConsumerId = + consumerRefCountsByResourceId.get(resourceId); + if (!consumerRefCountsByConsumerId) { + assert( + !consumerIdsByResourceId.hasA(resourceId) && + !resourcesById.has(resourceId), + "Ref counts, relation, and resources must stay symmetric", + ); + return ok(); } - } - - if (counts.size === 0) { - consumerCounts.delete(key); - scheduleDisposal(key); - } - } else { - counts.set(consumerId, PositiveInt.orThrow(nextCount)); - } - } - - if (!resources.hasConsumerAnyResource(consumer)) { - consumers.delete(consumerId); - } - return ok(); - }, + const nextCount = + consumerRefCountsByConsumerId.decrement(consumerId); + if (isNone(nextCount)) return ok(); - getResource: (key) => { - if (isDisposed) return null; - return resourcesMap.get(key) ?? null; - }, + if (nextCount.value === 0) { + consumerIdsByResourceId.remove(resourceId, consumerId); + } - getConsumersForResource: (key) => { - if (isDisposed) return []; - const counts = consumerCounts.get(key); - return counts ? Array.from(counts.keys()) : []; - }, + if (!consumerIdsByResourceId.hasA(resourceId)) { + consumerRefCountsByResourceId.delete(resourceId); + const resource = resourcesById.get(resourceId); + assert( + resource, + "Resource must exist when last consumer reference is removed", + ); + resourcesById.delete(resourceId); + resource[Symbol.dispose](); + } - hasConsumerAnyResource: (consumer) => { - if (isDisposed) return false; - const consumerId = config.getConsumerId(consumer); - // If slow, can be optimized with reverse index - return Array.from(consumerCounts.values()).some((counts) => - counts.has(consumerId), + return ok(); + }), + ), ); - }, - - getConsumer: (consumerId) => { - if (isDisposed) return null; - const consumer = consumers.get(consumerId); - if (!consumer) return null; + assert(result.ok, "Unabortable removeConsumer lock must not abort"); + } - // Only return consumer if it's currently using any resources - if (!resources.hasConsumerAnyResource(consumer)) { - return null; - } + return ok(); + }, - return consumer; - }, + getConsumerIdsForResource: (resourceId) => + new Set(consumerIdsByResourceId.getB(resourceId)), - [Symbol.dispose]: () => { - if (isDisposed) return; - isDisposed = true; + getResourcesForConsumerId: (consumerId) => { + const resources = new Set(); + const resourceIds = consumerIdsByResourceId.getA(consumerId); + if (!resourceIds) return resources; - for (const timeout of disposalTimeouts.values()) { - deps.time.clearTimeout(timeout); - } - disposalTimeouts.clear(); + for (const resourceId of resourceIds) { + resources.add(resourcesById.get(resourceId)!); + } - for (const resource of resourcesMap.values()) { - resource[Symbol.dispose](); - } - resourcesMap.clear(); - consumerCounts.clear(); - consumers.clear(); - }, - }; + return resources; + }, - return resources; + [Symbol.asyncDispose]: () => { + for (const resource of resourcesById.values()) { + resource[Symbol.dispose](); + } + resourcesById.clear(); + consumerRefCountsByResourceId.clear(); + consumerIdsByResourceId.clear(); + mutexByResourceId[Symbol.dispose](); + return Promise.resolve(); + }, }; +}; diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index c1ee1af95..bb02cb425 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -17,7 +17,7 @@ import type { RandomBytes, RandomBytesDep } from "./Crypto.js"; import { createRandomBytes } from "./Crypto.js"; import { eqArrayStrict } from "./Eq.js"; import { lazyTrue, lazyVoid } from "./Function.js"; -import { createInstances } from "./Instances.js"; +import { createInstances, type Instances } from "./Instances.js"; import { decrement, increment } from "./Number.js"; import { createRecord, @@ -30,10 +30,10 @@ import type { Random, RandomDep, RandomNumber } from "./Random.js"; import { createRandom } from "./Random.js"; import { createRef, type Ref } from "./Ref.js"; import type { Done, NextResult, Ok, Result } from "./Result.js"; -import { err, getOrThrow, isErr, ok, tryAsync } from "./Result.js"; +import { err, getOrThrow, ok, tryAsync } from "./Result.js"; import type { Schedule, ScheduleStep } from "./Schedule.js"; import { addToSet, deleteFromSet, emptySet } from "./Set.js"; -import type { testCreateRunner } from "./Test.js"; +import type { testCreateRun } from "./Test.js"; import type { Duration, Time, TimeDep } from "./Time.js"; import { createTime, durationToMillis, Millis } from "./Time.js"; import type { TracerConfigDep, TracerDep } from "./Tracer.js"; @@ -50,35 +50,21 @@ import { PositiveInt, type Typed, typed, + union, Unknown, UnknownResult, - union, } from "./Type.js"; -import type { - Awaitable, - Callback, - CallbackWithCleanup, - Int1To100, - isPromiseLike, - Mutable, - NewKeys, - Predicate, +import type { isPromiseLike } from "./Types.js"; +import { + type Awaitable, + type Callback, + type CallbackWithCleanup, + type Int1To100, + type Mutable, + type NewKeys, + type Predicate, } from "./Types.js"; -declare global { - interface PromiseConstructor { - try( - executor: (...args: Args) => T | PromiseLike, - ...args: Args - ): Promise; - withResolvers(): { - promise: Promise; - resolve: (value: T | PromiseLike) => void; - reject: (reason?: any) => void; - }; - } -} - /** * JavaScript-native structured concurrency. * @@ -93,11 +79,11 @@ declare global { * * Evolu implements structured concurrency with these types: * - * - **{@link Task}** — a function that takes {@link Runner} and returns - * {@link Awaitable} (sync or async) {@link Result} - * - **{@link Runner}** — runs tasks, creates {@link Fiber}s, monitors and aborts - * them - * - **{@link Fiber}** — awaitable, abortable/disposable handle to a running task + * - **{@link Task}** — a function that takes Run and returns {@link Awaitable} + * (sync or async) {@link Result} + * - **{@link Run}** — a callable object that runs Tasks, manages their lifecycle, + * provides dependencies, and creates Fibers + * - **{@link Fiber}** — awaitable, abortable/disposable handle to a running Task * - **{@link AsyncDisposableStack}** — task-aware resource management that * completes even when aborted * @@ -133,8 +119,8 @@ declare global { * fetch: globalThis.fetch.bind(globalThis), * }; * - * // Create runner with dependencies. - * await using run = createRunner(deps); + * // Create run with dependencies. + * await using run = createRun(deps); * * // Running a task returns a fiber that can be awaited. * const result = await run(fetch("/users/123")); @@ -209,7 +195,7 @@ declare global { * Run composed tasks with {@link parallel} and {@link map}: * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * const urls = [ * "https://api.example.com/users", @@ -246,22 +232,22 @@ declare global { * }; * ``` * - * Provide dependencies when creating a runner: + * Provide dependencies when creating a Run: * * ```ts * const deps: FetchDep = { * fetch: globalThis.fetch.bind(globalThis), * }; * - * await using run = createRunner(deps); + * await using run = createRun(deps); * await run(fetchUser(123)); * ``` * - * For runtime-created dependencies, use {@link Runner.addDeps}. + * For runtime-created dependencies, use {@link Run#addDeps}. * * ### Built-in dependencies * - * {@link createRunner} provides default {@link RunnerDeps} available to all tasks + * {@link createRun} provides default {@link RunDeps} available to all tasks * without declaring `D`: * * - {@link Console} — logging with hierarchical context via `child()` @@ -290,7 +276,7 @@ declare global { * }), * }; * - * await using run = createRunner(deps); + * await using run = createRun(deps); * * const console = run.deps.console.child("main"); * @@ -298,8 +284,8 @@ declare global { * // 21:20:25.588 [main] started * ``` * - * For testing, use {@link testCreateRunner} to get deterministic, controllable - * implementations of all RunnerDeps. + * For testing, use {@link testCreateRun} to get deterministic, controllable + * implementations of all RunDeps. * * ## Resource management * @@ -329,11 +315,11 @@ declare global { * ``` * * Even though {@link Task} returns {@link Awaitable} (allowing sync or async - * results), the {@link Runner} itself is always async. This is a deliberate - * design choice: + * results), the {@link Run} itself is always async. This is a deliberate design + * choice: * * - **Sync** → {@link Result}, native `using` / `DisposableStack` - * - **Async** → {@link Task}, {@link Runner}, {@link Fiber}, `await using` / + * - **Async** → {@link Task}, {@link Run}, {@link Fiber}, `await using` / * `AsyncDisposableStack` * * Benefits: @@ -374,20 +360,20 @@ declare global { * @group Core Types */ export type Task = ( - run: Runner, + run: Run, ) => Awaitable>; /** * Shorthand for a {@link Task} with `any` type parameters. * - * @group Type Utilities + * @group Type utilities */ export type AnyTask = Task; /** * Extracts the value type from a {@link Task}. * - * @group Type Utilities + * @group Type utilities */ export type InferTaskOk = R extends Task ? T : never; @@ -395,7 +381,7 @@ export type InferTaskOk = /** * Extracts the error type from a {@link Task}. * - * @group Type Utilities + * @group Type utilities */ export type InferTaskErr = R extends Task ? E : never; @@ -403,7 +389,7 @@ export type InferTaskErr = /** * Extracts the deps type from a {@link Task}. * - * @group Type Utilities + * @group Type utilities */ export type InferTaskDeps = R extends Task ? D : never; @@ -426,7 +412,7 @@ export type NextTask = Task>; /** * Extracts the done value type from a {@link NextTask}. * - * @group Type Utilities + * @group Type utilities */ export type InferTaskDone = InferTaskErr extends infer Errors @@ -436,7 +422,6 @@ export type InferTaskDone = : never; /** - * Error returned when a {@link Task} is aborted via * {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal | AbortSignal}. * @@ -444,6 +429,10 @@ export type InferTaskDone = * logic. If you need to inspect the reason, use type guards like * `RaceLostError.is(reason)`. * + * In most code, treat `AbortError` as control flow rather than business logic. + * Propagate it unchanged and handle domain errors separately. Inspect + * `AbortError.reason` only when you need reason-specific behavior. + * * @group Core Types */ export const AbortError = /*#__PURE__*/ typed("AbortError", { @@ -454,41 +443,51 @@ export interface AbortError extends InferType {} /** * Runs a {@link Task} with * {@link https://en.wikipedia.org/wiki/Structured_concurrency | structured concurrency} - * guarantees. + * semantics. + * + * Each `Run` forms a task tree: child tasks are bound to it, abort propagates + * through that tree, and state is observable via snapshots and events. * - * - **Lifetime** — child tasks are bound to parent scope - * - **Cancellation** — abort propagates to all descendants - * - **Observable state** — inspect running tasks via snapshots and events + * `Run` is a callable object — callable because it's convenient to run tasks as + * `run(task)`, and an object because it holds state. * - * `Runner` is a callable object — callable because it's convenient to run tasks - * as `run(task)`, and an object because it holds state for abortability and - * monitoring. + * Calling `run(task)` creates a child `Run`, passes it to the task, and returns + * a {@link Fiber}. The child is tracked in `getChildren()`/events while running, + * then disposed and removed when settled. * - * Evolu's structured concurrency leverages native JavaScript APIs: + * Before task execution, `run(task)` applies two short-circuit checks: * - * - `PromiseLike` as the async primitive - * - `AbortSignal` for cancellation - * - `await using` for resource management + * - If this run is not `Running`, the child is aborted with + * {@link runClosingError} and the task is replaced with `err(AbortError)`. + * - If this run's signal is already aborted and the child is abortable + * (`abortMask === 0`), the child is aborted with the same reason and the task + * is replaced with `err(AbortError)`. * - * This makes Runner idiomatic to JavaScript, tiny with minimal overhead, and - * easy to debug (native stack traces). + * After execution, the child stores both values: `outcome` (what the task + * returned) and `result` (what callers observe). If the child signal is aborted + * at settlement time, `result` is forced to `err(AbortError)` even when + * `outcome` is `ok(...)`. + * + * That's the whole mechanism: {@link Task} is a function that takes a `Run` and + * returns an {@link Awaitable} {@link Result}. `run(task)` runs it via + * `Promise.try(task, run)` with aforementioned logic. * * @group Core Types - * @see {@link createRunner} + * @see {@link createRun} * @see {@link Task} */ -export interface Runner extends AsyncDisposable { +export interface Run extends AsyncDisposable { /** Runs a {@link Task} and returns a {@link Fiber} handle. */ (task: Task): Fiber; /** Runs a {@link Task} and throws if the returned {@link Result} is an error. */ readonly orThrow: (task: Task) => Promise; - /** Unique {@link Id} for this runner. */ + /** Unique {@link Id} for this Run. */ readonly id: Id; - /** The parent {@link Runner}, if this runner was created as a child. */ - readonly parent: Runner | null; + /** The parent {@link Run}, if this Run was created as a child. */ + readonly parent: Run | null; /** @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal */ readonly signal: AbortSignal; @@ -504,7 +503,7 @@ export interface Runner extends AsyncDisposable { * {@link unabortable} tasks, the callback is never invoked. * * Intentionally synchronous — abort is signal propagation, not cleanup. Use - * {@link Runner.defer} for async cleanup that must run regardless of abort. + * {@link Run.defer} for async cleanup that must run regardless of abort. */ readonly onAbort: (callback: Callback) => void; @@ -515,7 +514,7 @@ export interface Runner extends AsyncDisposable { readonly getChildren: () => ReadonlySet>; /** - * Creates a memoized {@link FiberSnapshot} of this runner. + * Creates a memoized {@link FiberSnapshot} of this Run. * * Use for monitoring, debugging, or building UI that visualizes task trees. * @@ -523,31 +522,31 @@ export interface Runner extends AsyncDisposable { * * ```ts * // React integration with useSyncExternalStore - * const useFiberSnapshot = (runner: Runner) => + * const useFiberSnapshot = (run: Run) => * useSyncExternalStore( * (callback) => { - * runner.onEvent = callback; + * run.onEvent = callback; * return () => { - * runner.onEvent = undefined; + * run.onEvent = undefined; * }; * }, - * () => runner.snapshot(), + * () => run.snapshot(), * ); * ``` */ readonly snapshot: () => FiberSnapshot; /** - * Callback for monitoring runner events. + * Callback for monitoring run events. * - * Called when this runner or any descendant emits a {@link RunnerEvent}. - * Events bubble up through parent runners, enabling centralized monitoring. - * Only emitted when {@link RunnerConfig.eventsEnabled} is `true`. + * Called when this Run or any descendant emits a {@link RunEvent}. Events + * bubble up through parent runs, enabling centralized monitoring. Only + * emitted when {@link RunConfig.eventsEnabled} is `true`. */ - onEvent: ((event: RunnerEvent) => void) | undefined; + onEvent: ((event: RunEvent) => void) | undefined; /** - * Runs a {@link Task} on the root runner instead of the current runner. + * Runs a {@link Task} on the root Run instead of the current Run. * * ### Example * @@ -556,7 +555,7 @@ export interface Runner extends AsyncDisposable { * // Aborted when myTask ends * run(helperTask); * - * // Outlives myTask, aborted when the root runner is disposed + * // Outlives myTask, aborted when the root Run is disposed * run.daemon(backgroundSync); * * return ok(); @@ -566,9 +565,10 @@ export interface Runner extends AsyncDisposable { readonly daemon: Run; /** - * Creates an {@link AsyncDisposable} that runs the task when disposed. + * Creates an {@link AsyncDisposable} that runs a cleanup callback or + * {@link Task} when disposed. * - * Use for one-off task; for multiple, use {@link Runner.stack} instead. + * Use for one-off task; for multiple, use {@link Run.stack} instead. * * ### Example * @@ -594,10 +594,12 @@ export interface Runner extends AsyncDisposable { * // connection[Symbol.asyncDispose] is now defined * ``` */ - readonly defer: (onDisposeAsync: Task) => AsyncDisposable; + readonly defer: ( + onDisposeAsync: Task | (() => Awaitable), + ) => AsyncDisposable; /** - * Creates an {@link AsyncDisposableStack} bound to the root runner. + * Creates an {@link AsyncDisposableStack} bound to the root Run. * * ### Example * @@ -609,8 +611,8 @@ export interface Runner extends AsyncDisposable { */ readonly stack: () => AsyncDisposableStack; - /** Returns the dependencies passed to {@link createRunner}. */ - readonly deps: RunnerDeps & D; + /** Returns the dependencies passed to {@link createRun}. */ + readonly deps: RunDeps & D; /** * @see {@link Concurrency} @@ -619,7 +621,7 @@ export interface Runner extends AsyncDisposable { readonly concurrency: Concurrency; /** - * Adds additional dependencies to this runner and returns it. + * Adds additional dependencies to this Run and returns it. * * Use for runtime-created dependencies — dependencies that cannot be created * in the composition root (e.g., app start). @@ -653,7 +655,7 @@ export interface Runner extends AsyncDisposable { * }; * ``` * - * The `_run` naming convention reserves `run` for the extended runner. + * The `_run` naming convention reserves `run` for the extended run. * * ## FAQ * @@ -662,7 +664,7 @@ export interface Runner extends AsyncDisposable { * This is the whole implementation: * * ```ts - * run.addDeps = >(newDeps: E): Runner => { + * run.addDeps = >(newDeps: E): Run => { * depsRef.modify((currentDeps) => { * const duplicate = Object.keys(newDeps).find( * (k) => k in currentDeps, @@ -670,23 +672,20 @@ export interface Runner extends AsyncDisposable { * assert(!duplicate, `Dependency '${duplicate}' already added.`); * return { ...currentDeps, ...newDeps }; * }); - * return self as unknown as Runner; + * return self as unknown as Run; * }; * ``` * * Dependencies are stored in a shared {@link Ref}, so `addDeps` propagates to - * all runners. The runtime assertion ensures dependencies are created once — + * all runs. The runtime assertion ensures dependencies are created once — * automatic deduplication would mask poor design (dependencies should have a * single, clear point of creation). */ - readonly addDeps: >(extraDeps: E) => Runner; + readonly addDeps: >(extraDeps: E) => Run; } -/** Backward-compatible alias for upstream naming. */ -export type Run = Runner; - /** - * Abort mask depth for a {@link Runner} or {@link Fiber}. + * Abort mask depth for a {@link Run} or {@link Fiber}. * * - `0` — abortable (default) * - `>= 1` — inside {@link unabortable}, abort requests are ignored @@ -704,7 +703,7 @@ export type Run = Runner; * UI/debugging tools can use this to visually distinguish protected tasks * (e.g., different icon or color) and explain why abort requests are ignored. * - * @group Abort Masking + * @group Abort masking */ export const AbortMask = /*#__PURE__*/ brand("AbortMask", NonNegativeInt); export type AbortMask = typeof AbortMask.Type; @@ -715,7 +714,7 @@ export type AbortMask = typeof AbortMask.Type; * Default is 1 (sequential). Use 1-100 as a literal or {@link PositiveInt} for * larger values. * - * @group Concurrency Primitives + * @group Concurrency primitives * @see {@link parallel} * @see {@link createSemaphore} */ @@ -728,7 +727,7 @@ export type Concurrency = Int1To100 | PositiveInt; * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * // Await to get Result * const result = await run(fetchData); @@ -747,7 +746,7 @@ export type Concurrency = Int1To100 | PositiveInt; * // Run child tasks in fiber's scope * fiber.run(childTask); * - * // Monitor via the Runner + * // Monitor via the Run * fiber.run.onEvent = (event) => { * // handle event * }; @@ -756,10 +755,10 @@ export type Concurrency = Int1To100 | PositiveInt; * Because `Fiber` is a {@link PromiseLike} object, fibers can be composed with * `Promise.all`, `Promise.race`, etc. * - * Microtask timing: Runner wraps the task's promise with `.then` and - * `.finally`, which adds microtasks between task completion and fiber - * settlement. Do not write code that relies on a specific number of microtask - * yields between tasks. Use explicit synchronization primitives instead. + * Microtask timing: Run wraps the task's promise with `.then` and `.finally`, + * which adds microtasks between task completion and fiber settlement. Do not + * write code that relies on a specific number of microtask yields between + * tasks. Use explicit synchronization primitives instead. * * @group Core Types */ @@ -769,9 +768,9 @@ export class Fiber readonly then: PromiseLike>["then"]; /** - * A {@link Runner} whose lifetime is tied to this fiber. + * A {@link Run} whose lifetime is tied to this fiber. * - * Tasks run via this runner are aborted when the fiber ends. + * Tasks run via this Run are aborted when the fiber ends. * * ### Example * @@ -781,15 +780,15 @@ export class Fiber * // helperTask is aborted when longRunningTask ends * fiber.run(helperTask); * - * // Monitor this fiber's runner + * // Monitor this fiber's run * fiber.run.onEvent = (event) => { * console.log(event); * }; * ``` */ - readonly run: Runner; + readonly run: Run; - constructor(run: Runner, promise: Promise>) { + constructor(run: Run, promise: Promise>) { this.then = promise.then.bind(promise); this.run = run; } @@ -818,7 +817,7 @@ export class Fiber * beyond the first call. */ abort(reason?: unknown): void { - (this.run as RunnerInternal).requestAbort( + (this.run as RunInternal).requestAbort( createAbortError(reason), ); } @@ -836,7 +835,7 @@ export class Fiber /** * Extracts the value type from a {@link Fiber}. * - * @group Type Utilities + * @group Type utilities */ export type InferFiberOk> = F extends Fiber ? T : never; @@ -844,7 +843,7 @@ export type InferFiberOk> = /** * Extracts the error type from a {@link Fiber}. * - * @group Type Utilities + * @group Type utilities */ export type InferFiberErr> = F extends Fiber ? E : never; @@ -852,7 +851,7 @@ export type InferFiberErr> = /** * Extracts the deps type from a {@link Fiber}. * - * @group Type Utilities + * @group Type utilities */ export type InferFiberDeps> = F extends Fiber ? D : never; @@ -870,8 +869,10 @@ export interface FiberStateRunning extends Typed<"Running"> {} export interface FiberStateCompleting extends Typed<"Completing"> {} -export interface FiberStateCompleted - extends Typed<"Completed"> { +export interface FiberStateCompleted< + T = unknown, + E = unknown, +> extends Typed<"Completed"> { /** * The fiber's completion value. * @@ -907,7 +908,7 @@ export const FiberSnapshotState = /*#__PURE__*/ union( export type FiberSnapshotState = typeof FiberSnapshotState.Type; /** - * A recursive snapshot of a {@link Runner} tree. + * A recursive snapshot of a {@link Run} tree. * * Snapshots use structural sharing — unchanged subtrees return the same object * reference. This is useful for UI libraries like React that leverage @@ -916,10 +917,10 @@ export type FiberSnapshotState = typeof FiberSnapshotState.Type; * O(depth) new snapshot objects per mutation. * * @group Core Types - * @see {@link Runner.snapshot} + * @see {@link Run.snapshot} */ export interface FiberSnapshot { - /** The {@link Runner.id} of the {@link Fiber} this snapshot represents. */ + /** The {@link Run.id} of the {@link Fiber} this snapshot represents. */ readonly id: Id; /** The current lifecycle state. */ @@ -933,39 +934,39 @@ export interface FiberSnapshot { } /** - * The event-specific payload of a {@link RunnerEvent}. + * The event-specific payload of a {@link RunEvent}. * * @group Monitoring */ -export const RunnerEventData = /*#__PURE__*/ union( +export const RunEventData = /*#__PURE__*/ union( typed("ChildAdded", { childId: Id }), typed("ChildRemoved", { childId: Id }), typed("StateChanged", { state: FiberSnapshotState }), ); -export type RunnerEventData = typeof RunnerEventData.Type; +export type RunEventData = typeof RunEventData.Type; /** - * Events emitted by a {@link Runner} for monitoring and debugging. + * Events emitted by a {@link Run} for monitoring and debugging. * - * Events bubble up through parent runners, enabling centralized monitoring at - * the root. Use with {@link Runner.onEvent} to track task lifecycle. + * Events bubble up through parent runs, enabling centralized monitoring at the + * root. Use with {@link Run.onEvent} to track task lifecycle. * * @group Monitoring */ -export const RunnerEvent = /*#__PURE__*/ object({ +export const RunEvent = /*#__PURE__*/ object({ id: Id, timestamp: Millis, - data: RunnerEventData, + data: RunEventData, }); -export interface RunnerEvent extends InferType {} +export interface RunEvent extends InferType {} /** * Task-aware wrapper around native * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack | AsyncDisposableStack}. * * All tasks run via this stack are {@link unabortable} and run with - * {@link Runner.daemon}, ensuring acquisition and cleanup complete even if abort - * is requested. + * {@link Run.daemon}, ensuring acquisition and cleanup complete even if abort is + * requested. * * ### Example * @@ -986,13 +987,13 @@ export interface RunnerEvent extends InferType {} * }; // b released, then a released, then analytics sent * ``` * - * @group Resource Management + * @group Resource management */ export class AsyncDisposableStack implements AsyncDisposable { readonly #stack = new globalThis.AsyncDisposableStack(); - readonly #daemon: Runner["daemon"]; + readonly #daemon: Run["daemon"]; - constructor(run: Runner) { + constructor(run: Run) { this.#daemon = run.daemon; } @@ -1000,12 +1001,15 @@ export class AsyncDisposableStack implements AsyncDisposable { return this.#daemon(unabortable(task)); } - #runVoid(task: Task): PromiseLike { - return this.#run(task).then(lazyVoid); + #runVoid( + task: Task | (() => Awaitable), + ): PromiseLike { + return this.#run(task as Task).then(lazyVoid); } /** - * Registers a {@link Task} to run when the stack is disposed. + * Registers a cleanup callback or {@link Task} to run when the stack is + * disposed. * * Deferred tasks run in LIFO order and are unabortable. * @@ -1028,7 +1032,7 @@ export class AsyncDisposableStack implements AsyncDisposable { * * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack/defer */ - defer(onDisposeAsync: Task): void { + defer(onDisposeAsync: Task | (() => Awaitable)): void { this.#stack.defer(() => this.#runVoid(onDisposeAsync)); } @@ -1065,42 +1069,15 @@ export class AsyncDisposableStack implements AsyncDisposable { use( valueOrAcquire: T | Task, ): T | PromiseLike> { - const register = (value: T): T => { - if (value == null || Symbol.asyncDispose in value) { - this.#stack.use(value as T); - return value; - } - - if (Symbol.dispose in value) { - const disposable = value as Disposable; - const dispose = (disposable as { [Symbol.dispose]?: unknown })[ - Symbol.dispose - ]; - if (typeof dispose !== "function") { - throw new TypeError("Resource does not implement Symbol.dispose."); - } - this.#stack.use({ - [Symbol.asyncDispose]: () => - Promise.resolve().then(() => { - dispose.call(disposable); - }), - }); - return value; - } - - this.#stack.use(value as T); - return value; - }; - if ( valueOrAcquire == null || Symbol.dispose in valueOrAcquire || Symbol.asyncDispose in valueOrAcquire ) { - return register(valueOrAcquire as T); + return this.#stack.use(valueOrAcquire as T); } return this.#run(valueOrAcquire).then((result) => { - if (result.ok) register(result.value); + if (result.ok) this.#stack.use(result.value); return result; }); } @@ -1189,42 +1166,33 @@ export class AsyncDisposableStack implements AsyncDisposable { } /** - * Configuration for {@link Runner} behavior. + * Configuration for {@link Run} behavior. * * @group Monitoring */ -export interface RunnerConfig { +export interface RunConfig { /** - * Whether to emit {@link RunnerEvent}s. + * Whether to emit {@link RunEvent}s. * - * Use a {@link Ref} to enable/disable at runtime without recreating the - * runner. Disabled by default for zero overhead in production. + * Use a {@link Ref} to enable/disable at runtime without recreating the run. + * Disabled by default for zero overhead in production. */ readonly eventsEnabled: Ref; } -export interface RunnerConfigDep { - readonly runnerConfig: RunnerConfig; +export interface RunConfigDep { + readonly runConfig: RunConfig; } -/** Backward-compatible alias. */ -export type RunConfig = RunnerConfig; - -/** Backward-compatible alias. */ -export type RunConfigDep = RunnerConfigDep; - -export type RunnerDeps = ConsoleDep & +export type RunDeps = ConsoleDep & RandomBytesDep & RandomDep & TimeDep & - Partial & + Partial & Partial & // TODO: Partial; // TODO: -/** Backward-compatible alias. */ -export type RunDeps = RunnerDeps; - -const defaultDeps: RunnerDeps = { +const defaultDeps: RunDeps = { console: createConsole(), randomBytes: createRandomBytes(), random: createRandom(), @@ -1232,22 +1200,22 @@ const defaultDeps: RunnerDeps = { }; /** - * Factory type for creating root {@link Runner} instances. + * Factory type for creating root {@link Run} instances. * - * @group Creating Runners + * @group Creating Run */ -export interface CreateRunner { - (): Runner; - (deps: D): Runner; +export interface CreateRun { + (): Run; + (deps: D): Run; } /** - * Creates root {@link Runner}. + * Creates root {@link Run}. * * Call once per entry point (main thread, worker, etc.) and dispose on - * shutdown. All tasks run as descendants of this root runner. + * shutdown. All tasks run as descendants of this root Run. * - * {@link RunnerDeps} provides default dependencies: + * {@link RunDeps} provides default dependencies: * * - {@link Time} * - {@link Console} @@ -1258,7 +1226,7 @@ export interface CreateRunner { * * ```ts * // App entry point - * await using run = createRunner(); + * await using run = createRun(); * * const result = await run(fetchData); * ``` @@ -1284,51 +1252,48 @@ export interface CreateRunner { * // ... * }; * - * // Composition root: create runner with custom deps - * type AppDeps = RunnerDeps & ConfigDep; + * // Composition root: create run with custom deps + * type AppDeps = RunDeps & ConfigDep; * * const appDeps: AppDeps = { * ...testCreateDeps(), // or spread individual deps * config: { apiUrl: "https://api.example.com" }, * }; * - * await using run = createRunner(appDeps); + * await using run = createRun(appDeps); * - * // Runner type is inferred from deps argument + * // Run type is inferred from deps argument * const result = await run(fetchUser("123")); * * // TypeScript catches missing deps at compile time: - * // await using run2 = createRunner(); // Runner + * // await using run2 = createRun(); // Run * // run2(fetchUser("123")); // Error: Property 'config' is missing * ``` * - * @group Creating Runners + * @group Creating Run */ -export const createRunner: CreateRunner = ( +export const createRun: CreateRun = ( deps?: D, -): Runner => { - const mergedDeps = { ...defaultDeps, ...deps } as RunnerDeps & D; - return createRunnerInternal(createRef(mergedDeps))(); +): Run => { + const mergedDeps = { ...defaultDeps, ...deps } as RunDeps & D; + return createRunInternal(createRef(mergedDeps))(); }; -/** Backward-compatible alias. */ -export const createRun: typeof createRunner = createRunner; - -/** Internal Runner properties, hidden from public API via TypeScript types. */ -interface RunnerInternal extends Runner { +/** Internal Run properties, hidden from public API via TypeScript types. */ +interface RunInternal extends Run { readonly requestAbort: (reason: unknown) => void; readonly requestSignal: AbortSignal; readonly complete: (result: UnknownResult, outcome: UnknownResult) => void; } -const createRunnerInternal = - (depsRef: Ref) => +const createRunInternal = + (depsRef: Ref) => ( - parent?: RunnerInternal, - daemon?: RunnerInternal, + parent?: RunInternal, + daemon?: RunInternal, abortBehavior?: AbortBehavior, concurrencyBehavior?: Concurrency, - ): RunnerInternal => { + ): RunInternal => { const parentMask = parent?.abortMask ?? isAbortable; let abortMask: AbortMask; @@ -1369,16 +1334,16 @@ const createRunnerInternal = ); } - const emitEvent = (data: RunnerEventData) => { + const emitEvent = (data: RunEventData) => { const deps = depsRef.get(); - if (!deps.runnerConfig?.eventsEnabled.get()) return; - const e: RunnerEvent = { id: self.id, timestamp: deps.time.now(), data }; - for (let node: Runner | null = self; node; node = node.parent) + if (!deps.runConfig?.eventsEnabled.get()) return; + const e: RunEvent = { id: self.id, timestamp: deps.time.now(), data }; + for (let node: Run | null = self; node; node = node.parent) node.onEvent?.(e); }; const run = (task: Task): Fiber => { - const runner = createRunnerInternal(depsRef)( + const run = createRunInternal(depsRef)( self, daemon ?? self, getAbortBehavior(task), @@ -1386,43 +1351,43 @@ const createRunnerInternal = ); if (state !== running) { - runner.requestAbort(runnerClosingAbortError); - task = () => err(runnerClosingAbortError); + run.requestAbort(runClosingAbortError); + task = () => err(runClosingAbortError); } else if ( signalController.signal.aborted && - runner.abortMask === isAbortable + run.abortMask === isAbortable ) { - runner.requestAbort(signalController.signal.reason); + run.requestAbort(signalController.signal.reason); task = () => err(signalController.signal.reason); } // Evolu polyfills `Promise.try` - const promise = Promise.try(task, runner) + const promise = Promise.try(task, run) .then((taskOutcome) => { - const taskResult = runner.signal.aborted - ? err(runner.signal.reason) + const taskResult = run.signal.aborted + ? err(run.signal.reason) : taskOutcome; - runner.complete(taskResult, taskOutcome); + run.complete(taskResult, taskOutcome); return taskResult; }) - .finally(runner[Symbol.asyncDispose]) + .finally(run[Symbol.asyncDispose]) .finally(() => { children = deleteFromSet(children, fiber); - emitEvent({ type: "ChildRemoved", childId: runner.id }); + emitEvent({ type: "ChildRemoved", childId: run.id }); }); - const fiber = new Fiber(runner, promise); + const fiber = new Fiber(run, promise); children = addToSet(children, fiber); - emitEvent({ type: "ChildAdded", childId: runner.id }); + emitEvent({ type: "ChildAdded", childId: run.id }); return fiber; }; - const self = run as unknown as RunnerInternal; + const self = run as RunInternal; { - const run = self as Mutable>; + const run = self as Mutable>; const id = createId(depsRef.get()); let snapshot: FiberSnapshot | null = null; @@ -1434,7 +1399,7 @@ const createRunnerInternal = run.signal = signalController.signal; run.abortMask = abortMask; - run.onAbort = (callback: Callback) => { + run.onAbort = (callback) => { if (abortMask !== isAbortable) return; subscribeToAbort( signalController.signal, @@ -1464,9 +1429,9 @@ const createRunnerInternal = }; run.daemon = daemon ?? self; - run.defer = (task: Task) => ({ + run.defer = (task) => ({ [Symbol.asyncDispose]: () => - run.daemon(unabortable(task)).then(lazyVoid), + run.daemon(unabortable(task as Task)).then(lazyVoid), }); run.stack = () => new AsyncDisposableStack(self); @@ -1475,7 +1440,7 @@ const createRunnerInternal = run.concurrency = concurrencyBehavior ?? parent?.concurrency ?? defaultConcurrency; - run.addDeps = >(newDeps: E): Runner => { + run.addDeps = >(newDeps: E): Run => { depsRef.modify((currentDeps) => { const duplicate = Object.keys(newDeps).find((k) => k in currentDeps); assert( @@ -1486,7 +1451,7 @@ const createRunnerInternal = ); return { ...currentDeps, ...newDeps }; }); - return self as unknown as Runner; + return self as unknown as Run; }; run[Symbol.asyncDispose] = () => { @@ -1495,7 +1460,7 @@ const createRunnerInternal = state = { type: "Completing" }; emitEvent({ type: "StateChanged", state }); - requestAbort(runnerClosingAbortError); + requestAbort(runClosingAbortError); disposingPromise = Promise.allSettled(children) .then(lazyVoid) @@ -1511,10 +1476,7 @@ const createRunnerInternal = // Internal run.requestAbort = requestAbort; run.requestSignal = requestController.signal; - run.complete = ( - taskResult: UnknownResult, - taskOutcome: UnknownResult, - ) => { + run.complete = (taskResult, taskOutcome) => { result = taskResult; outcome = taskOutcome; }; @@ -1526,24 +1488,23 @@ const createRunnerInternal = const running: FiberState = { type: "Running" }; /** - * Error used as {@link AbortError} reason when a {@link Runner} is disposed. + * Error used as {@link AbortError} reason when a {@link Run} is disposed. * - * @group Creating Runners + * @group Creating Run */ -export const RunnerClosingError = /*#__PURE__*/ typed("RunnerClosingError"); -export interface RunnerClosingError - extends InferType {} +export const RunClosingError = /*#__PURE__*/ typed("RunClosingError"); +export interface RunClosingError extends InferType {} /** - * The {@link RunnerClosingError} used when a {@link Runner} is disposed. + * The {@link RunClosingError} used when a {@link Run} is disposed. * - * Tasks run on a disposing or disposed runner receive this error as + * Tasks run on a disposing or disposed run receive this error as * {@link AbortError} reason. * - * @group Creating Runners + * @group Creating Run */ -export const runnerClosingError: RunnerClosingError = { - type: "RunnerClosingError", +export const runClosingError: RunClosingError = { + type: "RunClosingError", }; const createAbortError = (reason: unknown): AbortError => ({ @@ -1560,8 +1521,7 @@ const subscribeToAbort = ( else signal.addEventListener("abort", handler, options); }; -const runnerClosingAbortError: AbortError = - createAbortError(runnerClosingError); +const runClosingAbortError: AbortError = createAbortError(runClosingError); const isAbortable = AbortMask.orThrow(0); type AbortBehavior = "unabortable" | AbortMask; @@ -1573,7 +1533,7 @@ const getAbortBehavior = (task: AnyTask): AbortBehavior | undefined => const abortBehavior = (behavior: AbortBehavior) => (task: Task): Task => - Object.assign((run: Runner) => run(task), { + Object.assign((run: Run) => run(task), { [abortBehaviorSymbol]: behavior, }); @@ -1583,10 +1543,15 @@ const abortBehavior = * Once started, an unabortable task always completes — abort requests are * ignored and `signal.aborted` remains `false`. * + * Unabortable affects in-flight cancellation only. It does not guarantee the + * task starts. If the parent {@link Run} is already closing or disposed, + * `run(task)` short-circuits before task execution and returns + * `err(AbortError)` (typically with {@link runClosingError} as reason). + * * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * const events: Array = []; * const canComplete = Promise.withResolvers(); @@ -1621,8 +1586,9 @@ const abortBehavior = * expect(result).toEqual(ok()); * ``` * - * @group Abort Masking + * @group Abort masking */ +// TODO: Clear AbortError from unabortable task results. export const unabortable = /*#__PURE__*/ abortBehavior("unabortable"); /** @@ -1634,7 +1600,7 @@ export const unabortable = /*#__PURE__*/ abortBehavior("unabortable"); * - Tasks run inside `unabortableMask` are unabortable by default * - Tasks wrapped with `restore()` restore the previous abortability * - * @group Abort Masking + * @group Abort masking */ export const unabortableMask = ( fn: ( @@ -1703,9 +1669,8 @@ export function parallel( taskOrFallback?: Task, ): Task { const isTask = isFunction(concurrencyOrTask); - // biome-ignore lint/style/noNonNullAssertion: Context const task = isTask ? concurrencyOrTask : taskOrFallback!; - return Object.assign((run: Runner) => run(task), { + return Object.assign((run: Run) => run(task), { [concurrencyBehaviorSymbol]: isTask ? maxPositiveInt : concurrencyOrTask, }); } @@ -1773,26 +1738,18 @@ export const yieldNow: Task = () => (reason): AbortError => createAbortError(reason), ); -type SchedulerLike = { - yield?: () => Promise; -}; - -type SetImmediateLike = (callback: () => void) => unknown; - -const globalScheduler = (globalThis as { scheduler?: SchedulerLike }).scheduler; -const globalSetImmediate = (globalThis as { setImmediate?: SetImmediateLike }) - .setImmediate; -let schedulerYield: (() => Promise) | undefined; - -if (globalScheduler && typeof globalScheduler.yield === "function") { - schedulerYield = globalScheduler.yield.bind(globalScheduler); -} +const scheduler = ( + globalThis as unknown as { + readonly scheduler?: { readonly yield?: unknown }; + } +).scheduler; const yieldImpl: () => Promise = - schedulerYield ?? - (typeof globalSetImmediate !== "undefined" - ? () => new Promise((resolve) => globalSetImmediate(resolve)) - : () => new Promise((r) => setTimeout(r, 0))); // Safari + typeof scheduler?.yield === "function" + ? () => (scheduler.yield as () => Promise)() + : typeof setImmediate !== "undefined" + ? () => new Promise((resolve) => setImmediate(resolve)) + : () => new Promise((r) => setTimeout(r, 0)); // Safari /** * Creates a {@link Task} from a callback-based API. @@ -1836,7 +1793,7 @@ export const callback = ok: Callback; err: Callback; signal: AbortSignal; - deps: RunnerDeps; + deps: RunDeps; }>, ): Task => (run) => @@ -2136,12 +2093,12 @@ export const retry = }); if (delay > 0) { const sleepResult = await run(sleep(delay)); - if (isErr(sleepResult)) return sleepResult; + if (!sleepResult.ok) return sleepResult; } } const result = await run(task); - if (!isErr(result)) return result; + if (result.ok) return result; if (AbortError.is(result.error)) return err(result.error); @@ -2268,14 +2225,14 @@ export const repeat = * * Similar to * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers | Promise.withResolvers}, - * but integrated with {@link Task} and {@link Runner} for cancellation support. + * but integrated with {@link Task} and {@link Run} for cancellation support. * * Use for bridging callback-based APIs or coordinating between tasks. * * Disposing aborts all waiting tasks with an {@link AbortError} with * {@link deferredDisposedError} reason. * - * @group Concurrency Primitives + * @group Concurrency primitives * @see {@link createDeferred} */ export interface Deferred extends Disposable { @@ -2305,7 +2262,7 @@ export interface Deferred extends Disposable { * const result = await fiber; // ok("value") * ``` * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const createDeferred = (): Deferred => { let resolved: Result | null = null; @@ -2435,18 +2392,19 @@ export const createDeferreds = ( /** * Abort reason used when a {@link Deferred} is disposed. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const DeferredDisposedError = /*#__PURE__*/ typed( "DeferredDisposedError", ); -export interface DeferredDisposedError - extends InferType {} +export interface DeferredDisposedError extends InferType< + typeof DeferredDisposedError +> {} /** * {@link DeferredDisposedError} used as abort reason in {@link createDeferred}. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const deferredDisposedError: DeferredDisposedError = { type: "DeferredDisposedError", @@ -2463,7 +2421,7 @@ export const deferredDisposedError: DeferredDisposedError = { * * Disposing aborts all waiting tasks with {@link deferredDisposedError}. * - * @group Concurrency Primitives + * @group Concurrency primitives * @see {@link createGate} */ export interface Gate extends Disposable { @@ -2499,7 +2457,7 @@ export interface Gate extends Disposable { * }; * ``` * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const createGate = (): Gate => { let isOpen = false; @@ -2541,7 +2499,7 @@ export const createGate = (): Gate => { * For mutual exclusion (limiting to exactly one {@link Task}), use {@link Mutex} * instead. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export interface Semaphore extends Disposable { /** @@ -2552,6 +2510,48 @@ export interface Semaphore extends Disposable { * whose reason is {@link semaphoreDisposedError}. */ readonly withPermit: (task: Task) => Task; + + /** + * Executes a {@link Task} while holding a specified number of permits. + * + * If insufficient permits are available, waits in FIFO order until permits + * become available. If disposed while waiting or running, task is aborted + * with {@link semaphoreDisposedError}. + * + * Use this for weighted concurrency where a task represents a resource + * demand, not just "one more task". One permit is one resource unit. + * + * Example: with capacity `10`, a lightweight operation can reserve `1` permit + * while a heavy operation reserves `4` permits. This models shared budgets + * such as DB connections, API credits, memory/CPU buckets, or batch + * processing slots. + * + * {@link Semaphore.withPermit} is equivalent to `withPermits(1)`. + */ + readonly withPermits: ( + permits: Concurrency, + ) => (task: Task) => Task; + + /** Returns the current semaphore state for monitoring/debugging. */ + readonly snapshot: () => SemaphoreSnapshot; +} + +/** Snapshot returned by {@link Semaphore.snapshot}. */ +export interface SemaphoreSnapshot { + /** Total permits configured at creation. */ + readonly permits: Concurrency; + + /** Currently held permits. */ + readonly taken: NonNegativeInt; + + /** Number of currently waiting tasks. */ + readonly waiting: NonNegativeInt; + + /** Currently available permits. */ + readonly available: NonNegativeInt; + + /** Whether the semaphore has been disposed. */ + readonly disposed: boolean; } /** @@ -2560,7 +2560,7 @@ export interface Semaphore extends Disposable { * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * const semaphore = createSemaphore(PositiveInt.orThrow(2)); * @@ -2592,75 +2592,102 @@ export interface Semaphore extends Disposable { * // [demo] end 3 * ``` * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const createSemaphore = (permits: Concurrency): Semaphore => { - const fibers = new Set(); - const queue = new Set>>(); + interface Waiter { + readonly permits: PositiveInt; + readonly resolve: Callback>; + } - let availablePermits: number = permits; + const fibers = new Set(); + const waiters: Array = []; + let taken = NonNegativeInt.orThrow(0); let disposed = false; - return { - withPermit: - (task: Task): Task => - async (run) => { - assert( - availablePermits === 0 || queue.size === 0, - "Semaphore invariant violated: queue must be empty when permits are available.", - ); - if (disposed) return err(semaphoreDisposedAbortError); - - if (availablePermits === 0) { - const acquired = await new Promise>( - (resolve) => { - queue.add(resolve); - run.onAbort((reason) => { - queue.delete(resolve); - resolve(err(createAbortError(reason))); - }); - }, - ); - if (!acquired.ok) return acquired; - } else { - availablePermits -= 1; - } + const withPermits = + (requestedPermits: Concurrency) => + (task: Task): Task => + async (run) => { + const requested = PositiveInt.orThrow(requestedPermits); + + assert( + requested <= permits, + "Requested permits must not exceed semaphore capacity.", + ); + + if (disposed) return err(semaphoreDisposedAbortError); - let fiber: Fiber | null = null; - try { - fiber = run(task); - fibers.add(fiber); - return await fiber; - } finally { + if (waiters.length > 0 || taken + requested > permits) { + const waiter = Promise.withResolvers>(); + const waiting: Waiter = { + permits: requested, + resolve: waiter.resolve, + }; + waiters.push(waiting); + run.onAbort((reason) => { + const i = waiters.indexOf(waiting); + if (i >= 0) waiters.splice(i, 1); + waiter.resolve(err(createAbortError(reason))); + }); + + const permit = await waiter.promise; + if (!permit.ok) return permit; + } else { + taken = NonNegativeInt.orThrow(taken + requested); + } + + let fiber: Fiber | null = null; + using _ = { + [Symbol.dispose]: () => { if (fiber) fibers.delete(fiber); - const next = queue.values().next(); - if (!next.done) { - queue.delete(next.value); - next.value(ok()); - } else { - availablePermits += 1; + taken = NonNegativeInt.orThrow(taken - requested); + + while (waiters.length > 0) { + const waiter = waiters[0]; + if (taken + waiter.permits > permits) break; + waiters.shift(); + taken = NonNegativeInt.orThrow(taken + waiter.permits); + waiter.resolve(ok()); } + }, + }; - assert( - availablePermits === 0 || queue.size === 0, - "Queue must be empty when permits are available.", - ); - } - }, + fiber = run(task); + fibers.add(fiber); + return await fiber; + }; + + return { + withPermits, + + withPermit: (task: Task): Task => + withPermits(1)(task), + + snapshot: () => ({ + permits, + taken, + waiting: NonNegativeInt.orThrow(waiters.length), + available: NonNegativeInt.orThrow(permits - taken), + disposed, + }), [Symbol.dispose]: () => { if (disposed) return; disposed = true; + using stack = new DisposableStack(); for (const fiber of fibers) { - fiber.abort(semaphoreDisposedError); + stack.adopt(fiber, (fiber) => { + fiber.abort(semaphoreDisposedError); + }); } - for (const resolve of queue) { - resolve(err(semaphoreDisposedAbortError)); + for (const waiter of waiters) { + waiter.resolve(err(semaphoreDisposedAbortError)); } - queue.clear(); + waiters.length = 0; }, }; }; @@ -2668,18 +2695,19 @@ export const createSemaphore = (permits: Concurrency): Semaphore => { /** * Abort reason used when a {@link Semaphore} is disposed. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const SemaphoreDisposedError = /*#__PURE__*/ typed( "SemaphoreDisposedError", ); -export interface SemaphoreDisposedError - extends InferType {} +export interface SemaphoreDisposedError extends InferType< + typeof SemaphoreDisposedError +> {} /** * {@link SemaphoreDisposedError} used as abort reason in {@link createSemaphore}. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const semaphoreDisposedError: SemaphoreDisposedError = { type: "SemaphoreDisposedError", @@ -2689,6 +2717,95 @@ const semaphoreDisposedAbortError: AbortError = createAbortError( semaphoreDisposedError, ); +/** + * A keyed {@link Semaphore} registry. + * + * Provides semaphore operations per key while preserving the same API shape as + * {@link Semaphore}. + * + * @group Concurrency primitives + */ +export interface SemaphoreByKey extends Disposable { + /** + * Executes a {@link Task} while holding one permit for a specific key. + * + * Behaves like {@link Semaphore.withPermit}, scoped to `key`. + */ + readonly withPermit: (key: K, task: Task) => Task; + + /** + * Executes a {@link Task} while holding permits for a specific key. + * + * Behaves like {@link Semaphore.withPermits}, scoped to `key`. + */ + readonly withPermits: ( + key: K, + permits: Concurrency, + ) => (task: Task) => Task; + + /** Returns current semaphore state for a key, or `null` when no state exists. */ + readonly snapshot: (key: K) => SemaphoreSnapshot | null; +} + +/** + * Creates a {@link SemaphoreByKey}. + * + * Each key gets its own semaphore with the same permit capacity. + * + * @group Concurrency primitives + */ +export const createSemaphoreByKey = ( + permits: Concurrency, +): SemaphoreByKey => { + const semaphoresByKey = new Map(); + let disposed = false; + + const withPermits = + (key: K, requestedPermits: Concurrency) => + (task: Task): Task => + async (run: Run) => { + if (disposed) return err(semaphoreDisposedAbortError); + + let semaphore = semaphoresByKey.get(key); + if (!semaphore) { + semaphore = createSemaphore(permits); + semaphoresByKey.set(key, semaphore); + } + + using _ = { + [Symbol.dispose]: () => { + const snapshot = semaphore.snapshot(); + if (snapshot.taken === 0 && snapshot.waiting === 0) { + semaphoresByKey.delete(key); + semaphore[Symbol.dispose](); + } + }, + }; + + return await run(semaphore.withPermits(requestedPermits)(task)); + }; + + return { + withPermit: (key: K, task: Task): Task => + withPermits(key, 1)(task), + + withPermits, + + snapshot: (key) => semaphoresByKey.get(key)?.snapshot() ?? null, + + [Symbol.dispose]: () => { + if (disposed) return; + disposed = true; + + using stack = new DisposableStack(); + for (const semaphore of semaphoresByKey.values()) { + stack.use(semaphore); + } + semaphoresByKey.clear(); + }, + }; +}; + /** * A mutex (mutual exclusion) that ensures only one {@link Task} runs at a time. * @@ -2697,7 +2814,7 @@ const semaphoreDisposedAbortError: AbortError = createAbortError( * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * const mutex = createMutex(); * @@ -2722,7 +2839,7 @@ const semaphoreDisposedAbortError: AbortError = createAbortError( * // end 2 * ``` * - * @group Concurrency Primitives + * @group Concurrency primitives */ export interface Mutex extends Disposable { /** @@ -2734,10 +2851,43 @@ export interface Mutex extends Disposable { readonly withLock: (task: Task) => Task; } +/** + * A keyed {@link Mutex} registry. + * + * Provides mutex operations per key. + * + * @group Concurrency primitives + */ +export interface MutexByKey extends Disposable { + /** + * Executes a {@link Task} while holding the mutex lock for a specific key. + * + * Behaves like {@link Mutex.withLock}, scoped to `key`. + */ + readonly withLock: (key: K, task: Task) => Task; +} + +/** + * Creates a {@link MutexByKey}. + * + * @group Concurrency primitives + */ +export const createMutexByKey = < + K extends string = string, +>(): MutexByKey => { + const semaphoreByKey = createSemaphoreByKey(minPositiveInt); + + return { + withLock: (key: K, task: Task): Task => + semaphoreByKey.withPermit(key, task), + [Symbol.dispose]: semaphoreByKey[Symbol.dispose], + }; +}; + /** * Creates a {@link Mutex}. * - * @group Concurrency Primitives + * @group Concurrency primitives */ export const createMutex = (): Mutex => { const semaphore = createSemaphore(minPositiveInt); @@ -2748,6 +2898,120 @@ export const createMutex = (): Mutex => { }; }; +/** + * Task-based variant of {@link Instances} for async disposable instances. + * + * Uses {@link Task} for create and cache-hit refresh. Read operations (`get` and + * `has`) are synchronous. + * + * @group Concurrency primitives + */ +export interface TaskInstances< + K extends string, + T extends AsyncDisposable, + D = unknown, +> extends AsyncDisposable { + /** + * Ensures an instance exists for the given key. + * + * If missing, `create` is executed and stored. If present, `onCacheHit` runs + * with the existing instance. Errors from either callback are propagated. + */ + readonly ensure: ( + key: K, + create: Task, + onCacheHit?: (instance: T) => Task, + ) => Task; + + /** Gets an instance by key, or `null` when missing. */ + readonly get: (key: K) => T | null; + + /** Checks if an instance exists for the given key. */ + readonly has: (key: K) => boolean; + + /** + * Deletes and disposes an instance by key. + * + * Returns `true` if an instance existed, otherwise `false`. + */ + readonly delete: (key: K) => Task; +} + +/** + * Creates a {@link TaskInstances}. + * + * Disposing clears and disposes current instances. The registry remains usable + * after disposal. + * + * @group Concurrency primitives + */ +export const createTaskInstances = < + K extends string, + T extends AsyncDisposable, + D = unknown, +>(): TaskInstances => { + const instances = new Map(); + const mutexByKey = createInstances(); + + return { + ensure: + ( + key: K, + create: Task, + onCacheHit?: (instance: T) => Task, + ): Task => + async (run) => { + const mutex = mutexByKey.ensure(key, createMutex); + return await run( + mutex.withLock(async (run) => { + let instance = instances.get(key); + + if (instance == null) { + const created = await run(create); + if (!created.ok) return created; + + instance = created.value; + instances.set(key, instance); + } else if (onCacheHit) { + const cacheHitResult = await run(onCacheHit(instance)); + if (!cacheHitResult.ok) return cacheHitResult; + } + + return ok(instance); + }), + ); + }, + + get: (key) => instances.get(key) ?? null, + + has: (key) => instances.has(key), + + delete: (key: K) => async (run) => { + const mutex = mutexByKey.get(key); + if (mutex == null) return ok(false); + + return await run( + mutex.withLock(async () => { + await using instance = instances.get(key); + if (instance) instances.delete(key); + return ok(instance != null); + }), + ); + }, + + [Symbol.asyncDispose]: async () => { + await using stack = new globalThis.AsyncDisposableStack(); + stack.use(mutexByKey); + + for (const instance of instances.values()) { + stack.use(instance); + } + + instances.clear(); + }, + }; +}; + /** * Cross-platform leader lock abstraction. * @@ -2776,7 +3040,7 @@ export interface LeaderLockDep { * @group Concurrency primitives */ export const createInMemoryLeaderLock = (): LeaderLock => { - const mutexes = createInstances(); + const mutexByName = createMutexByKey(); return { acquire: (name) => async (run) => { @@ -2784,40 +3048,16 @@ export const createInMemoryLeaderLock = (): LeaderLock => { // keep the lock held until lease disposal. const onAcquired = Promise.withResolvers(); const onRelease = Promise.withResolvers(); - const onAborted = Promise.withResolvers(); - let isAcquired = false; - - run.onAbort((reason) => { - if (isAcquired) return; - onRelease.resolve(); - onAborted.resolve(createAbortError(reason)); - }); void run.daemon( - mutexes.ensure(name, createMutex).withLock(async () => { - isAcquired = true; + mutexByName.withLock(name, async () => { onAcquired.resolve(); await onRelease.promise; return ok(); }), ); - const acquiredOrAbort = await Promise.race([ - onAcquired.promise.then(() => ({ type: "acquired" as const })), - onAborted.promise.then((error) => ({ - type: "aborted" as const, - error, - })), - ]); - - if (acquiredOrAbort.type === "aborted") { - return err(acquiredOrAbort.error); - } - - if (run.signal.aborted) { - onRelease.resolve(); - return err(run.signal.reason as AbortError); - } + await onAcquired.promise; return ok({ [Symbol.dispose]: () => { @@ -3088,8 +3328,9 @@ export function allSettled( * @group Composition */ export const AllSettledAbortError = /*#__PURE__*/ typed("AllSettledAbortError"); -export interface AllSettledAbortError - extends InferType {} +export interface AllSettledAbortError extends InferType< + typeof AllSettledAbortError +> {} /** * {@link AllSettledAbortError} used as abort reason in {@link allSettled}. @@ -3171,7 +3412,7 @@ export function map( items: MapInput, fn: (a: A) => Task, { abortReason = mapAbortError, ...options }: CollectOptions = {}, -): Task { +): Task | Record | void, E, D> { const mapped = mapInput(items, fn); return all( mapped as Iterable>, @@ -3280,7 +3521,13 @@ export function mapSettled( items: MapInput, task: (a: A) => Task, options?: CollectOptions, -): Task { +): Task< + | ReadonlyArray> + | Record> + | void, + never, + D +> { const mapped = mapInput(items, task); return allSettled( mapped as Iterable>, @@ -3351,7 +3598,7 @@ export function any( * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * const result = await run( * parallel(any([a, b, c], { allFailed: "completion" })), * ); @@ -3439,14 +3686,14 @@ const mapInput = ( isIterable(input) ? mapArray(arrayFrom(input), fn) : mapObject(input, fn); /** - * Worker pool respecting {@link Runner.concurrency}. + * Worker pool respecting {@link Run.concurrency}. * * Spawns only as many workers as allowed, avoiding idle fibers waiting for * permits. * * Workers run as daemons so callers don't block on unabortable tasks. When * abort is requested, pool returns immediately. Structured concurrency is - * preserved because the root {@link Runner} still waits for all daemons. + * preserved because the root {@link Run} still waits for all daemons. * * The `stopOn` option determines when to stop: * @@ -3515,7 +3762,7 @@ function pool( abortReason: unknown; allFailed?: AnyAllFailed; }, -): Task { +): Task | T | void, E> { const tasks = arrayFrom(tasksIterable); const { length } = tasks; if (length === 0) return () => ok(emptyArray); @@ -3556,7 +3803,7 @@ function pool( if (!stopped) { stopped = result; abortWorkers( - isErr(result) && AbortError.is(result.error) + !result.ok && AbortError.is(result.error) ? result.error.reason : abortReason, ); @@ -3602,7 +3849,6 @@ function pool( // For all/allSettled/map/mapSettled with collect: false (no allFailed handler) if (!allFailed) return ok(); - // biome-ignore lint/style/noNonNullAssertion: Context return allFailed === "completion" ? lastResult! : lastIndexResult!; }; } @@ -3626,7 +3872,7 @@ export interface FetchError extends InferType {} * ### Example * * ```ts - * await using run = createRunner(); + * await using run = createRun(); * * const result = await run(fetch("https://api.example.com/users")); * @@ -3676,3 +3922,5 @@ export const fetch = // Safari doesn't support it yet, Node.js probably never will (use setImmediate). // For Safari, scheduler-polyfill can be used. // https://www.npmjs.com/package/scheduler-polyfill + +// TODO: Do we really need specialized aborts? diff --git a/packages/common/src/local-first/Relay.ts b/packages/common/src/local-first/Relay.ts index dd1ea6001..9839f51ce 100644 --- a/packages/common/src/local-first/Relay.ts +++ b/packages/common/src/local-first/Relay.ts @@ -10,23 +10,20 @@ import { isNonEmptyArray, mapArray, } from "../Array.js"; -import { assert } from "../Assert.js"; import type { TimingSafeEqualDep } from "../Crypto.js"; -import { createInstances } from "../Instances.js"; -import { createRefCount } from "../RefCount.js"; +import { assert } from "../Assert.js"; import type { Result } from "../Result.js"; import { err, ok } from "../Result.js"; import type { SqliteDep } from "../Sqlite.js"; import { sql } from "../Sqlite.js"; -import type { Mutex } from "../Task.js"; -import { createMutex } from "../Task.js"; -import { PositiveInt, type SimpleName } from "../Type.js"; -import { type Awaitable, isPromiseLike } from "../Types.js"; +import { createMutexByKey } from "../Task.js"; +import { PositiveInt, Name } from "../Type.js"; +import { isPromiseLike, type Awaitable } from "../Types.js"; import { - type OwnerId, - // OwnerTransport, - type OwnerWriteKey, + OwnerId, ownerIdBytesToOwnerId, + // OwnerTransport, + OwnerWriteKey, } from "./Owner.js"; import type { EncryptedDbChange, @@ -37,7 +34,6 @@ import type { } from "./Storage.js"; import { createBaseSqliteStorage, - getNextStoredBytes, getOwnerUsage, getTimestampInsertStrategy, updateOwnerUsage, @@ -51,7 +47,7 @@ export interface RelayConfig extends StorageConfig { * Implementations can use this for identification purposes (e.g., database * file name, logging). */ - readonly name?: SimpleName; + readonly name?: Name; /** * Optional callback to check if an {@link OwnerId} is allowed to access the @@ -115,9 +111,8 @@ export const createRelaySqliteStorage = (config: StorageConfig): Storage => { const sqliteStorageBase = createBaseSqliteStorage(deps); - /** Mutex instances cached per OwnerId to prevent concurrent writes. */ - const ownerMutexes = createInstances(); - const ownerMutexRefs = createRefCount(); + /** Mutex keyed by OwnerId to prevent concurrent writes. */ + const mutexByOwnerId = createMutexByKey(); return { ...sqliteStorageBase, @@ -168,115 +163,103 @@ export const createRelaySqliteStorage = timestamp: timestampToTimestampBytes(m.timestamp), change: m.change, })); - const ownerMutex = ownerMutexes.ensure(ownerId, createMutex); - ownerMutexRefs.increment(ownerId); - - const result = await (async () => { - try { - return await run( - ownerMutex.withLock( - async (): Promise> => { - const existingTimestampsResult = - sqliteStorageBase.getExistingTimestamps( - ownerIdBytes, - mapArray(messagesWithTimestampBytes, (m) => m.timestamp), - ); - const existingTimestampsSet = new Set( - existingTimestampsResult.map((t) => t.toString()), - ); - const newMessages = filterArray( - messagesWithTimestampBytes, - (m) => !existingTimestampsSet.has(m.timestamp.toString()), - ); - - // Nothing to write - if (!isNonEmptyArray(newMessages)) { - return ok(); - } + const result = await run( + mutexByOwnerId.withLock( + ownerId, + async (): Promise> => { + const existingTimestampsResult = + sqliteStorageBase.getExistingTimestamps( + ownerIdBytes, + mapArray(messagesWithTimestampBytes, (m) => m.timestamp), + ); + + const existingTimestampsSet = new Set( + existingTimestampsResult.map((t) => t.toString()), + ); + const newMessages = filterArray( + messagesWithTimestampBytes, + (m) => !existingTimestampsSet.has(m.timestamp.toString()), + ); + + // Nothing to write + if (!isNonEmptyArray(newMessages)) { + return ok(); + } + + const usage = getOwnerUsage(deps)( + ownerIdBytes, + firstInArray(newMessages).timestamp, + ); + if (!usage.ok) return usage; + + const { storedBytes } = usage.value; + + const incomingBytes = newMessages.reduce( + (sum, m) => sum + m.change.length, + 0, + ); + const newStoredBytes = PositiveInt.orThrow( + (storedBytes ?? 0) + incomingBytes, + ); + + const quotaResult = config.isOwnerWithinQuota( + ownerId, + newStoredBytes, + ); + const isWithinQuota = isPromiseLike(quotaResult) + ? await quotaResult + : quotaResult; + if (!isWithinQuota) { + return err({ type: "StorageQuotaError", ownerId }); + } + + let { firstTimestamp, lastTimestamp } = usage.value; + + return deps.sqlite.transaction(() => { + for (const { timestamp, change } of newMessages) { + let strategy; + [strategy, firstTimestamp, lastTimestamp] = + getTimestampInsertStrategy( + timestamp, + firstTimestamp, + lastTimestamp, + ); - const usage = getOwnerUsage(deps)( - ownerIdBytes, - firstInArray(newMessages).timestamp, - ); - if (!usage.ok) return usage; - - const { storedBytes } = usage.value; - - const incomingBytesSum = newMessages.reduce( - (sum, m) => sum + m.change.length, - 0, - ); - if (incomingBytesSum <= 0) return ok(); - const incomingBytesResult = - PositiveInt.from(incomingBytesSum); - if (!incomingBytesResult.ok) { - return err({ type: "StorageQuotaError", ownerId }); - } - const incomingBytes = incomingBytesResult.value; - const newStoredBytes = getNextStoredBytes( - storedBytes, - incomingBytes, - ); - - const quotaResult = config.isOwnerWithinQuota( - ownerId, - newStoredBytes, - ); - const isWithinQuota = isPromiseLike(quotaResult) - ? await quotaResult - : quotaResult; - if (!isWithinQuota) { - return err({ type: "StorageQuotaError", ownerId }); + { + sqliteStorageBase.insertTimestamp( + ownerIdBytes, + timestamp, + strategy, + ); } - let { firstTimestamp, lastTimestamp } = usage.value; - - return deps.sqlite.transaction(() => { - for (const { timestamp, change } of newMessages) { - let strategy; - [strategy, firstTimestamp, lastTimestamp] = - getTimestampInsertStrategy( - timestamp, - firstTimestamp, - lastTimestamp, - ); - sqliteStorageBase.insertTimestamp( - ownerIdBytes, - timestamp, - strategy, - ); - deps.sqlite.exec(sql` + { + deps.sqlite.exec(sql` insert into evolu_message ("ownerId", "timestamp", "change") values (${ownerIdBytes}, ${timestamp}, ${change}) on conflict do nothing; `); - } - - updateOwnerUsage(deps)( - ownerIdBytes, - newStoredBytes, - firstTimestamp, - lastTimestamp, - ); - - return ok(); - }); - }, - ), - ); - } finally { - ownerMutexRefs.decrement(ownerId); - if (!ownerMutexRefs.has(ownerId)) { - ownerMutexes.delete(ownerId); - } - } - })(); + } + } + + updateOwnerUsage(deps)( + ownerIdBytes, + newStoredBytes, + firstTimestamp, + lastTimestamp, + ); + + return ok(); + }); + }, + ), + ); if (!result.ok) { if (result.error.type === "AbortError") return ok(); - return err(result.error); + return err({ type: "StorageQuotaError", ownerId }); } return ok(); @@ -311,6 +294,8 @@ export const createRelaySqliteStorage = `); sqliteStorageBase.deleteOwner(ownerId); + + return ok(); }); }, }; @@ -319,7 +304,7 @@ export const createRelaySqliteStorage = export const createRelayStorageTables = (deps: SqliteDep): void => { for (const query of [ sql` - create table if not exists evolu_writeKey ( + create table evolu_writeKey ( "ownerId" blob not null, "writeKey" blob not null, primary key ("ownerId") @@ -328,7 +313,7 @@ export const createRelayStorageTables = (deps: SqliteDep): void => { `, sql` - create table if not exists evolu_message ( + create table evolu_message ( "ownerId" blob not null, "timestamp" blob not null, "change" blob not null, diff --git a/packages/common/src/local-first/Shared.ts b/packages/common/src/local-first/Shared.ts index 101c2b6c0..5e2864013 100644 --- a/packages/common/src/local-first/Shared.ts +++ b/packages/common/src/local-first/Shared.ts @@ -8,21 +8,20 @@ import { emptyArray, firstInArray, isNonEmptyArray, - type NonEmptyReadonlyArray, shiftFromArray, + type NonEmptyReadonlyArray, } from "../Array.js"; import { assert } from "../Assert.js"; import { createCallbacks } from "../Callbacks.js"; import type { Console, ConsoleEntry, ConsoleLevel } from "../Console.js"; -import { createInstances } from "../Instances.js"; +import { createResources, type Resources } from "../Resources.js"; import { ok } from "../Result.js"; import { spaced } from "../Schedule.js"; import type { NonEmptyReadonlySet } from "../Set.js"; -import type { SqliteExportFile } from "../Sqlite.js"; -import { type Fiber, type Run, repeat, type Task } from "../Task.js"; -import type { Millis, TimeDep } from "../Time.js"; +import { createTaskInstances, repeat, type Fiber, type Task } from "../Task.js"; import { createId, type Id, type Name } from "../Type.js"; import type { Callback, ExtractType } from "../Types.js"; +import type { CreateWebSocketDep, WebSocket } from "../WebSocket.js"; import type { SharedWorker as CommonSharedWorker, MessagePort, @@ -31,7 +30,7 @@ import type { WorkerDeps, } from "../Worker.js"; import type { EvoluError } from "./Error.js"; -import type { OwnerId } from "./Owner.js"; +import type { OwnerId, OwnerTransport, SyncOwner } from "./Owner.js"; import { makePatches, type Patch, @@ -47,6 +46,12 @@ export interface SharedWorkerDep { readonly sharedWorker: SharedWorker; } +interface TransportsDep { + readonly transports: SharedTransportResources; +} + +export type SharedWorkerDeps = WorkerDeps & CreateWebSocketDep; + export type SharedWorkerInput = | { readonly type: "InitTab"; @@ -56,6 +61,7 @@ export type SharedWorkerInput = | { readonly type: "CreateEvolu"; readonly name: Name; + readonly appOwner: SyncOwner; readonly evoluPort: NativeMessagePort; readonly dbWorkerPort: NativeMessagePort; }; @@ -99,17 +105,19 @@ export type EvoluOutput = } | { readonly type: "OnExport"; - readonly file: SqliteExportFile; + readonly file: Uint8Array; }; export const initSharedWorker = ( self: SharedWorkerSelf, - ): Task => + ): Task => async (run) => { - const { createMessagePort, consoleStoreOutputEntry } = run.deps; + const { createMessagePort, consoleStoreOutputEntry, createWebSocket } = + run.deps; const console = run.deps.console.child("SharedWorker"); + // TODO: Use heartbeat to detect and prune dead ports. const tabPorts = new Set>(); const queuedTabOutputs: Array = []; @@ -118,22 +126,43 @@ export const initSharedWorker = else for (const port of tabPorts) port.postMessage(output); }; + const createTransportId = (transport: OwnerTransport): string => + `${transport.type}:${transport.url}`; + await using stack = run.stack(); - // Shared worker instance lifecycle is managed by per-evolu heartbeats. - const sharedEvolus = stack.use(createInstances()); + const transports = stack.use( + createResources({ + createResource: async (transport) => { + const transportId = createTransportId(transport); + console.info("createTransportResource", { transportId }); + return await run.daemon.orThrow( + createWebSocket(transport.url, { + binaryType: "arraybuffer", + onOpen: () => { + console.debug("transportOpen", { transportId }); + }, + onClose: () => { + console.debug("transportClose", { transportId }); + }, + }), + ); + }, + getResourceId: createTransportId, + getConsumerId: (owner) => owner.id, + }), + ); - const unsubscribeConsoleStoreOutputEntry = - consoleStoreOutputEntry.subscribe(() => { - const entry = consoleStoreOutputEntry.get(); - if (entry) postTabOutput({ type: "OnConsoleEntry", entry }); - }); - stack.defer(() => { - unsubscribeConsoleStoreOutputEntry(); - return ok(); - }); + const runWithSharedEvoluDeps = run.addDeps({ transports }); - console.info("initSharedWorker"); + // TODO: Use heartbeat to detect and prune dead instances. + const sharedEvolus = stack.use( + createTaskInstances< + Name, + SharedEvolu, + SharedWorkerDeps & TransportsDep + >(), + ); self.onConnect = (port) => { console.debug("onConnect"); @@ -155,19 +184,27 @@ export const initSharedWorker = } case "CreateEvolu": { - sharedEvolus - .ensure(message.name, () => - createSharedEvolu({ - run, - console, - name: message.name, - postTabOutput, - onDispose: () => { - sharedEvolus.delete(message.name); - }, - }), + void runWithSharedEvoluDeps + .daemon( + sharedEvolus.ensure( + message.name, + createSharedEvolu({ + console, + name: message.name, + appOwner: message.appOwner, + postTabOutput, + onDispose: () => { + void runWithSharedEvoluDeps.daemon( + sharedEvolus.delete(message.name), + ); + }, + }), + ), ) - .addPorts(message.evoluPort, message.dbWorkerPort); + .then((result) => { + if (!result.ok) return; + result.value.addPorts(message.evoluPort, message.dbWorkerPort); + }); break; } default: @@ -176,10 +213,19 @@ export const initSharedWorker = }; }; + stack.defer( + consoleStoreOutputEntry.subscribe(() => { + const entry = consoleStoreOutputEntry.get(); + if (entry) postTabOutput({ type: "OnConsoleEntry", entry }); + }), + ); + + console.info("initSharedWorker"); + return ok(stack.move()); }; -interface SharedEvolu extends Disposable { +interface SharedEvolu extends AsyncDisposable { readonly addPorts: ( evoluPort: NativeMessagePort, dbWorkerPort: NativeMessagePort, @@ -200,10 +246,6 @@ export type DbWorkerOutput = readonly type: "LeaderAcquired"; readonly name: Name; } - | { - readonly type: "LeaderHeartbeat"; - readonly name: Name; - } | { readonly type: "OnQueuedResponse"; readonly callbackId: Id; @@ -227,7 +269,10 @@ export type QueuedResponse = } | { readonly type: "Export"; - readonly file: SqliteExportFile; + readonly file: Uint8Array; + } + | { + readonly type: "CreateSyncMessages"; }; export interface QueuedResult { @@ -235,380 +280,225 @@ export interface QueuedResult { readonly response: QueuedResponse; } -export const dbWorkerHeartbeatIntervalMs = 5_000; -export const dbWorkerHeartbeatTimeoutMs = 30_000; - -// createSharedEvolu could be Task, but Instances doesn't support it yet. -const createSharedEvolu = ({ - run, - console, - name, - postTabOutput, - onDispose, -}: { - run: Run; - console: Console; - name: Name; - postTabOutput: Callback; - onDispose: () => void; -}): SharedEvolu => { - const { createMessagePort } = run.deps; - - const evoluPorts = new Map>(); - const dbWorkerPorts = new Set>(); - const dbWorkerPortByEvoluPortId = new Map< - Id, - MessagePort - >(); - const rowsByQueryByEvoluPortId = new Map(); - const queue: Array = []; - const callbacks = createCallbacks(run.deps); - - let activeDbWorkerPort = null as MessagePort< - DbWorkerInput, - DbWorkerOutput - > | null; - let activeDbWorkerLastHeartbeatAt = 0 as Millis; - const lastHeartbeatByDbWorkerPort = new Map< - MessagePort, - Millis - >(); - - let queueProcessingFiber: Fiber | null = - null; - let activeQueueCallback: { - readonly callbackId: Id; - readonly evoluPortId: Id; - } | null = null; - - const dropQueuedRequestsForEvoluPort = (evoluPortId: Id): void => { - for (let i = queue.length - 1; i >= 0; i -= 1) { - if (queue[i]?.evoluPortId === evoluPortId) queue.splice(i, 1); - } - }; - - const cancelActiveQueueForEvoluPort = (evoluPortId: Id): void => { - if (activeQueueCallback?.evoluPortId !== evoluPortId) return; - - callbacks.cancel(activeQueueCallback.callbackId); - activeQueueCallback = null; - queueProcessingFiber?.abort(); - queueProcessingFiber = null; - - if (queue[0]?.evoluPortId === evoluPortId) queue.shift(); - }; - - const cleanupEvoluPort = ( - evoluPortId: Id, - disposeDbWorkerPort: boolean, - ): void => { - dropQueuedRequestsForEvoluPort(evoluPortId); - cancelActiveQueueForEvoluPort(evoluPortId); - - const dbWorkerPortForEvolu = dbWorkerPortByEvoluPortId.get(evoluPortId); - if (dbWorkerPortForEvolu) { - dbWorkerPortByEvoluPortId.delete(evoluPortId); - - if (disposeDbWorkerPort) { - dbWorkerPorts.delete(dbWorkerPortForEvolu); - - if (activeDbWorkerPort === dbWorkerPortForEvolu) { - cancelActiveQueue(); - activeDbWorkerPort = null; - } - - lastHeartbeatByDbWorkerPort.delete(dbWorkerPortForEvolu); - dbWorkerPortForEvolu[Symbol.dispose](); - } - } - - evoluPorts.delete(evoluPortId); - rowsByQueryByEvoluPortId.delete(evoluPortId); - }; - - const cancelActiveQueue = (): void => { - if (activeQueueCallback) { - callbacks.cancel(activeQueueCallback.callbackId); - activeQueueCallback = null; - } - queueProcessingFiber?.abort(); - queueProcessingFiber = null; - }; - - const markDbWorkerHeartbeat = ( - dbWorkerPort: MessagePort, - ): void => { - const now = run.deps.time.now(); - lastHeartbeatByDbWorkerPort.set(dbWorkerPort, now); - if (activeDbWorkerPort === dbWorkerPort) - activeDbWorkerLastHeartbeatAt = now; - }; - - const setActiveDbWorkerPort = ( - dbWorkerPort: MessagePort, - ): void => { - activeDbWorkerPort = dbWorkerPort; - const now = run.deps.time.now(); - activeDbWorkerLastHeartbeatAt = now; - lastHeartbeatByDbWorkerPort.set(dbWorkerPort, now); - }; - - const clearActiveDbWorkerIfStale = (): void => { - if (!activeDbWorkerPort) return; - const elapsed = run.deps.time.now() - activeDbWorkerLastHeartbeatAt; - if (elapsed <= dbWorkerHeartbeatTimeoutMs) return; - - console.warn("leaderHeartbeatTimeout", { - name, - timeoutMs: dbWorkerHeartbeatTimeoutMs, - elapsedMs: elapsed, - }); - activeDbWorkerPort = null; - cancelActiveQueue(); - }; +type SharedTransportResources = Resources< + WebSocket, + string, + OwnerTransport, + SyncOwner, + OwnerId +>; + +export type SyncState = 123; + +const createSharedEvolu = + ({ + console, + name, + appOwner, + postTabOutput, + onDispose, + }: { + console: Console; + name: Name; + appOwner: SyncOwner; + postTabOutput: Callback; + onDispose: () => void; + }): Task => + async (run) => { + const { createMessagePort, transports } = run.deps; - const pruneStaleDbWorkerPorts = (): void => { - const now = run.deps.time.now(); + const evoluPorts = new Map>(); + const dbWorkerPorts = new Set>(); + const rowsByQueryByEvoluPortId = new Map(); + const queue: Array = []; + const callbacks = createCallbacks(run.deps); - for (const [dbWorkerPort, lastHeartbeatAt] of lastHeartbeatByDbWorkerPort) { - const elapsed = now - lastHeartbeatAt; - if (elapsed <= dbWorkerHeartbeatTimeoutMs) continue; + let activeDbWorkerPort = null as MessagePort< + DbWorkerInput, + DbWorkerOutput + > | null; - const wasActive = dbWorkerPort === activeDbWorkerPort; - if (wasActive) { - activeDbWorkerPort = null; - cancelActiveQueue(); - } - - const staleEvoluPortIds: Array = []; - for (const [ - evoluPortId, - mappedDbWorkerPort, - ] of dbWorkerPortByEvoluPortId) { - if (mappedDbWorkerPort === dbWorkerPort) { - staleEvoluPortIds.push(evoluPortId); - } - } - for (const evoluPortId of staleEvoluPortIds) { - cleanupEvoluPort(evoluPortId, false); - } + let queueProcessingFiber: Fiber | null = null; - lastHeartbeatByDbWorkerPort.delete(dbWorkerPort); - dbWorkerPorts.delete(dbWorkerPort); - dbWorkerPort[Symbol.dispose](); + const ownerTransports = appOwner.transports ?? emptyArray; - console.warn("prunedStaleDbWorkerPort", { - name, - timeoutMs: dbWorkerHeartbeatTimeoutMs, - elapsedMs: elapsed, - }); + await run(transports.addConsumer(appOwner, ownerTransports)); - if (evoluPorts.size === 0) { - onDispose(); + const ensureQueueProcessing = (): void => { + if ( + queueProcessingFiber || + !isNonEmptyArray(queue) || + !activeDbWorkerPort + ) { return; } - } - }; - const heartbeatFiber = run.daemon( - repeat(() => { - pruneStaleDbWorkerPorts(); - clearActiveDbWorkerIfStale(); - return ok(); - }, spaced("1s")), - ); - - const ensureQueueProcessing = (): void => { - if ( - queueProcessingFiber || - !isNonEmptyArray(queue) || - !activeDbWorkerPort - ) { - return; - } - - const first = firstInArray(queue); + const first = firstInArray(queue); - const callbackId = callbacks.register(({ evoluPortId, response }) => { - activeQueueCallback = null; - queueProcessingFiber?.abort(); - queueProcessingFiber = null; + const callbackId = callbacks.register(({ evoluPortId, response }) => { + queueProcessingFiber?.abort(); + queueProcessingFiber = null; - const evoluPort = evoluPorts.get(evoluPortId); + const evoluPort = evoluPorts.get(evoluPortId); - switch (response.type) { - case "Mutate": - case "Query": { - if (evoluPort) - evoluPort.postMessage({ - type: "OnPatchesByQuery", - patchesByQuery: createPatchesByQuery( - evoluPortId, - response.rowsByQuery, - ), - onCompleteIds: - first.request.type === "Mutate" - ? first.request.onCompleteIds - : emptyArray, - }); - - if (response.type === "Mutate") { - for (const [otherEvoluPortId, otherEvoluPort] of evoluPorts) { - if (otherEvoluPortId === evoluPortId) continue; - otherEvoluPort.postMessage({ type: "RefreshQueries" }); + switch (response.type) { + case "Mutate": + case "Query": { + if (evoluPort) + evoluPort.postMessage({ + type: "OnPatchesByQuery", + patchesByQuery: createPatchesByQuery( + evoluPortId, + response.rowsByQuery, + ), + onCompleteIds: + first.request.type === "Mutate" + ? first.request.onCompleteIds + : emptyArray, + }); + + if (response.type === "Mutate") { + for (const [otherEvoluPortId, otherEvoluPort] of evoluPorts) { + if (otherEvoluPortId === evoluPortId) continue; + otherEvoluPort.postMessage({ type: "RefreshQueries" }); + } } + break; } - break; - } - case "Export": - if (evoluPort) - evoluPort.postMessage( - { - type: "OnExport", - file: response.file, - }, - [response.file.buffer], - ); - - break; - default: - console.error("Unknown queued response", response); - } + case "Export": + if (evoluPort) + evoluPort.postMessage( + { + type: "OnExport", + file: response.file, + }, + [response.file.buffer], + ); - // Complete the current queue item and continue with the next one. - shiftFromArray(queue); - ensureQueueProcessing(); - }); - activeQueueCallback = { callbackId, evoluPortId: first.evoluPortId }; - - queueProcessingFiber = run.daemon( - repeat(() => { - assert(activeDbWorkerPort, "Expected an active DbWorker"); - activeDbWorkerPort.postMessage({ callbackId, ...first }); - return ok(); - }, spaced("5s")), // 5s seems to be a good balance - ); - }; - - const createPatchesByQuery = ( - evoluPortId: Id, - rowsByQuery: RowsByQueryMap, - ): ReadonlyMap> => { - const previousRowsByQuery = rowsByQueryByEvoluPortId.get(evoluPortId); - const nextRowsByQuery = new Map(previousRowsByQuery ?? emptyArray); - const patchesByQuery = new Map>(); - - for (const [query, rows] of rowsByQuery) { - nextRowsByQuery.set(query, rows); - patchesByQuery.set( - query, - makePatches(previousRowsByQuery?.get(query), rows), - ); - } + break; + case "CreateSyncMessages": + break; + default: + console.error("Unknown queued response", response); + } - rowsByQueryByEvoluPortId.set(evoluPortId, nextRowsByQuery); - return patchesByQuery; - }; + // Complete the current queue item and continue with the next one. + shiftFromArray(queue); + ensureQueueProcessing(); + }); - return { - addPorts: (nativeEvoluPort, nativeDbWorkerPort) => { - const evoluPort = createMessagePort( - nativeEvoluPort, - ); - const dbWorkerPort = createMessagePort( - nativeDbWorkerPort, + queueProcessingFiber = run.daemon( + repeat(() => { + assert(activeDbWorkerPort, "Expected an active DbWorker"); + activeDbWorkerPort.postMessage({ callbackId, ...first }); + return ok(); + }, spaced("5s")), // 5s seems to be a good balance ); + }; - const evoluPortId = createId(run.deps); + const createPatchesByQuery = ( + evoluPortId: Id, + rowsByQuery: RowsByQueryMap, + ): ReadonlyMap> => { + const previousRowsByQuery = rowsByQueryByEvoluPortId.get(evoluPortId); + const nextRowsByQuery = new Map(previousRowsByQuery ?? emptyArray); + const patchesByQuery = new Map>(); + + for (const [query, rows] of rowsByQuery) { + nextRowsByQuery.set(query, rows); + patchesByQuery.set( + query, + makePatches(previousRowsByQuery?.get(query), rows), + ); + } - evoluPorts.set(evoluPortId, evoluPort); - dbWorkerPorts.add(dbWorkerPort); - dbWorkerPortByEvoluPortId.set(evoluPortId, dbWorkerPort); + rowsByQueryByEvoluPortId.set(evoluPortId, nextRowsByQuery); + return patchesByQuery; + }; - dbWorkerPort.onMessage = (message) => { - switch (message.type) { - case "LeaderAcquired": { - console.info("leaderAcquired"); - setActiveDbWorkerPort(dbWorkerPort); - ensureQueueProcessing(); - break; - } - case "LeaderHeartbeat": { - markDbWorkerHeartbeat(dbWorkerPort); - if (!activeDbWorkerPort) { - console.info("leaderHeartbeat adopted"); - setActiveDbWorkerPort(dbWorkerPort); + return ok({ + addPorts: (nativeEvoluPort, nativeDbWorkerPort) => { + const evoluPort = createMessagePort( + nativeEvoluPort, + ); + const dbWorkerPort = createMessagePort( + nativeDbWorkerPort, + ); + + const evoluPortId = createId(run.deps); + + evoluPorts.set(evoluPortId, evoluPort); + dbWorkerPorts.add(dbWorkerPort); + + dbWorkerPort.onMessage = (message) => { + switch (message.type) { + case "LeaderAcquired": { + activeDbWorkerPort = dbWorkerPort; + console.info("leaderAcquired"); ensureQueueProcessing(); + break; } - break; - } - case "OnQueuedResponse": { - if (dbWorkerPort !== activeDbWorkerPort) { - console.debug("ignoredQueuedResponseFromInactiveDbWorker"); + case "OnQueuedResponse": { + callbacks.execute(message.callbackId, { + evoluPortId: message.evoluPortId, + response: message.response, + }); break; } - callbacks.execute(message.callbackId, { - evoluPortId: message.evoluPortId, - response: message.response, - }); - break; - } - case "OnConsoleEntry": - case "OnError": { - postTabOutput(message); - break; + case "OnConsoleEntry": + case "OnError": { + postTabOutput(message); + break; + } + default: + console.error("Unknown db worker output", message); } - default: - console.error("Unknown db worker output", message); - } - }; + }; - evoluPort.onMessage = (evoluMessage) => { - switch (evoluMessage.type) { - case "Dispose": { - console.info("evoluDispose", { - name, - evoluPortId, - hadLastPort: evoluPorts.size === 1, - }); - - cleanupEvoluPort(evoluPortId, true); - - if (activeDbWorkerPort) ensureQueueProcessing(); - if (evoluPorts.size === 0) onDispose(); + evoluPort.onMessage = (evoluMessage) => { + switch (evoluMessage.type) { + case "Dispose": { + console.info("evoluDispose", { + name, + evoluPortId, + hadLastPort: evoluPorts.size === 1, + }); + evoluPorts.delete(evoluPortId); + rowsByQueryByEvoluPortId.delete(evoluPortId); + if (evoluPorts.size === 0) onDispose(); + + // TODO: Decided what to do with DbWorker but probably dispose it, but + // https://bugs.webkit.org/show_bug.cgi?id=301520 + break; + } - break; + case "Mutate": + case "Query": + case "Export": { + queue.push({ evoluPortId, request: evoluMessage }); + ensureQueueProcessing(); + break; + } + default: + console.error("Unknown evolu input", evoluMessage); } + }; + }, - case "Mutate": - case "Query": - case "Export": { - queue.push({ evoluPortId, request: evoluMessage }); - ensureQueueProcessing(); - break; - } - default: - console.error("Unknown evolu input", evoluMessage); - } - }; - }, - - [Symbol.dispose]: () => { - heartbeatFiber.abort(); - queueProcessingFiber?.abort(); - queueProcessingFiber = null; - callbacks[Symbol.dispose](); - activeQueueCallback = null; - activeDbWorkerPort = null; - lastHeartbeatByDbWorkerPort.clear(); - queue.length = 0; - evoluPorts.clear(); - rowsByQueryByEvoluPortId.clear(); - dbWorkerPortByEvoluPortId.clear(); - dbWorkerPorts.clear(); - }, + [Symbol.asyncDispose]: async () => { + await run(transports.removeConsumer(appOwner, ownerTransports)); + + queueProcessingFiber?.abort(); + queueProcessingFiber = null; + callbacks[Symbol.dispose](); + activeDbWorkerPort = null; + queue.length = 0; + evoluPorts.clear(); + rowsByQueryByEvoluPortId.clear(); + dbWorkerPorts.clear(); + }, + }); }; -}; // | (Typed<"reset"> & { // readonly onCompleteId: CallbackId; diff --git a/packages/common/test/Instances.test.ts b/packages/common/test/Instances.test.ts index 2bd3badfb..4e98975df 100644 --- a/packages/common/test/Instances.test.ts +++ b/packages/common/test/Instances.test.ts @@ -1,4 +1,4 @@ -import { expect, test } from "vitest"; +import { describe, expect, test } from "vitest"; import { lazyVoid } from "../src/Function.js"; import { createInstances } from "../src/Instances.js"; @@ -6,232 +6,339 @@ interface TestInstance extends Disposable { readonly id: string; } -test("creates and returns new instance on first call", () => { - const instances = createInstances(); - let createCount = 0; +describe("Instances", () => { + test("returns existing instance on second call with same key", () => { + const instances = createInstances(); + let createCount = 0; + + const instance1 = instances.ensure("test", () => { + createCount++; + return { + id: "test-1", + [Symbol.dispose]: lazyVoid, + }; + }); + + const instance2 = instances.ensure("test", () => { + createCount++; + return { + id: "test-2", + [Symbol.dispose]: lazyVoid, + }; + }); + + expect(instance1).toBe(instance2); + expect(instance1.id).toBe("test-1"); + expect(createCount).toBe(1); + }); - const instance = instances.ensure("test", () => { - createCount++; - return { - id: "test-1", - [Symbol.dispose]: lazyVoid, + test("calls onCacheHit when returning existing instance", () => { + interface TestInstance extends Disposable { + readonly value: string; + readonly update: (newValue: string) => void; + } + + const instances = createInstances(); + let hitCount = 0; + + const createInstance = (initialValue: string): TestInstance => { + let value = initialValue; + return { + get value() { + return value; + }, + update: (newValue: string) => { + value = newValue; + }, + [Symbol.dispose]: lazyVoid, + }; }; + + const instance1 = instances.ensure("test", () => createInstance("initial")); + expect(instance1.value).toBe("initial"); + + const instance2 = instances.ensure( + "test", + () => createInstance("new"), + (existing) => { + hitCount++; + existing.update("updated"); + }, + ); + + expect(instance2.value).toBe("updated"); + expect(hitCount).toBe(1); + expect(instance1).toBe(instance2); }); - expect(instance.id).toBe("test-1"); - expect(createCount).toBe(1); -}); + test("maintains separate instances for different keys", () => { + const instances = createInstances(); + + const instance1 = instances.ensure("key1", () => ({ + id: "instance-1", + [Symbol.dispose]: lazyVoid, + })); + + const instance2 = instances.ensure("key2", () => ({ + id: "instance-2", + [Symbol.dispose]: lazyVoid, + })); + + expect(instance1).not.toBe(instance2); + expect(instance1.id).toBe("instance-1"); + expect(instance2.id).toBe("instance-2"); + }); -test("returns existing instance on second call with same key", () => { - const instances = createInstances(); - let createCount = 0; + test.each([ + ["test", "test-1"], + ["nonexistent", null], + ] as const)("get returns expected value for key %s", (key, expectedId) => { + const instances = createInstances(); - const instance1 = instances.ensure("test", () => { - createCount++; - return { + instances.ensure("test", () => ({ id: "test-1", [Symbol.dispose]: lazyVoid, - }; + })); + + const retrieved = instances.get(key); + expect(retrieved?.id ?? null).toBe(expectedId); }); - const instance2 = instances.ensure("test", () => { - createCount++; - return { - id: "test-2", + test.each([ + ["test", true], + ["nonexistent", false], + ] as const)("has returns expected value for key %s", (key, expected) => { + const instances = createInstances(); + + instances.ensure("test", () => ({ + id: "test-1", [Symbol.dispose]: lazyVoid, - }; + })); + + expect(instances.has(key)).toBe(expected); }); - expect(instance1).toBe(instance2); - expect(createCount).toBe(1); -}); + test("delete deletes and disposes the instance", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } + + const instances = createInstances(); + + const instance = instances.ensure("test", () => ({ + id: "test-1", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + }, + })); + + expect(instances.has("test")).toBe(true); + expect(instance.disposed).toBe(false); + + const result = instances.delete("test"); + + expect(result).toBe(true); + expect(instances.has("test")).toBe(false); + expect(instance.disposed).toBe(true); + }); + + test("delete returns false if instance does not exist", () => { + interface TestInstance extends Disposable { + readonly id: string; + } + + const instances = createInstances(); + const result = instances.delete("nonexistent"); + expect(result).toBe(false); + }); -test("calls onCacheHit when returning existing instance", () => { - interface TestInstance extends Disposable { - readonly value: string; - readonly update: (newValue: string) => void; - } + test("Symbol.dispose disposes all instances", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } - const instances = createInstances(); - let hitCount = 0; + const instances = createInstances(); - const createInstance = (initialValue: string): TestInstance => { - let value = initialValue; - return { - get value() { - return value; + const instance1 = instances.ensure("test1", () => ({ + id: "test-1", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; }, - update: (newValue: string) => { - value = newValue; + })); + + const instance2 = instances.ensure("test2", () => ({ + id: "test-2", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; }, - [Symbol.dispose]: lazyVoid, - }; - }; - - const instance1 = instances.ensure("test", () => createInstance("initial")); - expect(instance1.value).toBe("initial"); - - const instance2 = instances.ensure( - "test", - () => createInstance("new"), - (existing) => { - hitCount++; - existing.update("updated"); - }, - ); - - expect(instance2.value).toBe("updated"); - expect(hitCount).toBe(1); - expect(instance1).toBe(instance2); -}); + })); -test("maintains separate instances for different keys", () => { - const instances = createInstances(); + expect(instances.has("test1")).toBe(true); + expect(instances.has("test2")).toBe(true); + expect(instance1.disposed).toBe(false); + expect(instance2.disposed).toBe(false); - const instance1 = instances.ensure("key1", () => ({ - id: "instance-1", - [Symbol.dispose]: lazyVoid, - })); + instances[Symbol.dispose](); - const instance2 = instances.ensure("key2", () => ({ - id: "instance-2", - [Symbol.dispose]: lazyVoid, - })); + expect(instances.has("test1")).toBe(false); + expect(instances.has("test2")).toBe(false); + expect(instance1.disposed).toBe(true); + expect(instance2.disposed).toBe(true); + }); - expect(instance1).not.toBe(instance2); - expect(instance1.id).toBe("instance-1"); - expect(instance2.id).toBe("instance-2"); -}); + test("Symbol.dispose disposes instances in LIFO order", () => { + interface TestInstance extends Disposable { + readonly id: string; + } -test("get returns instance if it exists", () => { - const instances = createInstances(); + const instances = createInstances(); + const events: Array = []; - instances.ensure("test", () => ({ - id: "test-1", - [Symbol.dispose]: lazyVoid, - })); + instances.ensure("a", () => ({ + id: "a", + [Symbol.dispose]: () => { + events.push("dispose a"); + }, + })); - const retrieved = instances.get("test"); - expect(retrieved).not.toBeNull(); - expect(retrieved?.id).toBe("test-1"); -}); + instances.ensure("b", () => ({ + id: "b", + [Symbol.dispose]: () => { + events.push("dispose b"); + }, + })); -test("get returns null if instance does not exist", () => { - const instances = createInstances(); - const retrieved = instances.get("nonexistent"); - expect(retrieved).toBeNull(); -}); + instances.ensure("c", () => ({ + id: "c", + [Symbol.dispose]: () => { + events.push("dispose c"); + }, + })); -test("has returns true if instance exists", () => { - const instances = createInstances(); + instances[Symbol.dispose](); - instances.ensure("test", () => ({ - id: "test-1", - [Symbol.dispose]: lazyVoid, - })); + expect(events).toEqual(["dispose c", "dispose b", "dispose a"]); + }); - expect(instances.has("test")).toBe(true); -}); + test("using block syntax disposes all instances", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } -test("has returns false if instance does not exist", () => { - const instances = createInstances(); - expect(instances.has("nonexistent")).toBe(false); -}); + let instance1: TestInstance; + let instance2: TestInstance; + + { + using instances = createInstances(); + + instance1 = instances.ensure("test1", () => ({ + id: "test-1", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + }, + })); + + instance2 = instances.ensure("test2", () => ({ + id: "test-2", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + }, + })); + + expect(instance1.disposed).toBe(false); + expect(instance2.disposed).toBe(false); + } -test("delete deletes and disposes the instance", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } + // After the block, instances should be disposed + expect(instance1.disposed).toBe(true); + expect(instance2.disposed).toBe(true); + }); - const instances = createInstances(); + test("dispose clears entries and registry remains reusable", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } - const instance = instances.ensure("test", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); + const instances = createInstances(); - expect(instances.has("test")).toBe(true); - expect(instance.disposed).toBe(false); + const first = instances.ensure("k", () => ({ + id: "first", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + }, + })); - const result = instances.delete("test"); + instances[Symbol.dispose](); - expect(result).toBe(true); - expect(instances.has("test")).toBe(false); - expect(instance.disposed).toBe(true); -}); + expect(first.disposed).toBe(true); + expect(instances.has("k")).toBe(false); + expect(instances.get("k")).toBeNull(); + expect(instances.delete("k")).toBe(false); -test("delete returns false if instance does not exist", () => { - interface TestInstance extends Disposable { - readonly id: string; - } + const second = instances.ensure("k", () => ({ + id: "second", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + }, + })); - const instances = createInstances(); - const result = instances.delete("nonexistent"); - expect(result).toBe(false); -}); + expect(second.id).toBe("second"); + expect(second).not.toBe(first); + expect(instances.has("k")).toBe(true); + }); -test("Symbol.dispose disposes all instances", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance1 = instances.ensure("test1", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - const instance2 = instances.ensure("test2", () => ({ - id: "test-2", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - expect(instances.has("test1")).toBe(true); - expect(instances.has("test2")).toBe(true); - expect(instance1.disposed).toBe(false); - expect(instance2.disposed).toBe(false); - - instances[Symbol.dispose](); - - expect(instances.has("test1")).toBe(false); - expect(instances.has("test2")).toBe(false); - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); -}); + test("delete still deletes instance from map even if dispose throws", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } + + const instances = createInstances(); + + const instance = instances.ensure("test", () => ({ + id: "test-1", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + throw new Error("Disposal failed"); + }, + })); -test("using block syntax disposes all instances", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } + expect(instances.has("test")).toBe(true); + expect(() => instances.delete("test")).toThrow("Disposal failed"); + expect(instances.has("test")).toBe(false); + expect(instance.disposed).toBe(true); + }); - let instance1: TestInstance | null = null; - let instance2: TestInstance | null = null; + test("Symbol.dispose attempts to dispose all instances even if some throw", () => { + interface TestInstance extends Disposable { + readonly id: string; + disposed: boolean; + } - { - using instances = createInstances(); + const instances = createInstances(); - instance1 = instances.ensure("test1", () => ({ + const instance1 = instances.ensure("test1", () => ({ id: "test-1", disposed: false, [Symbol.dispose]: function () { this.disposed = true; + throw new Error("Disposal 1 failed"); }, })); - instance2 = instances.ensure("test2", () => ({ + const instance2 = instances.ensure("test2", () => ({ id: "test-2", disposed: false, [Symbol.dispose]: function () { @@ -239,140 +346,98 @@ test("using block syntax disposes all instances", () => { }, })); - expect(instance1.disposed).toBe(false); - expect(instance2.disposed).toBe(false); - } - - // After the block, instances should be disposed - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); -}); + const instance3 = instances.ensure("test3", () => ({ + id: "test-3", + disposed: false, + [Symbol.dispose]: function () { + this.disposed = true; + throw new Error("Disposal 3 failed"); + }, + })); -test("delete still deletes instance from map even if dispose throws", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance = instances.ensure("test", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal failed"); - }, - })); - - expect(instances.has("test")).toBe(true); - expect(() => instances.delete("test")).toThrow("Disposal failed"); - expect(instances.has("test")).toBe(false); - expect(instance.disposed).toBe(true); -}); + expect(() => { + instances[Symbol.dispose](); + }).toThrow(); -test("Symbol.dispose attempts to dispose all instances even if some throw", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance1 = instances.ensure("test1", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal 1 failed"); - }, - })); - - const instance2 = instances.ensure("test2", () => ({ - id: "test-2", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - const instance3 = instances.ensure("test3", () => ({ - id: "test-3", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal 3 failed"); - }, - })); - - expect(() => { - instances[Symbol.dispose](); - }).toThrow(); - - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); - expect(instance3.disposed).toBe(true); - expect(instances.has("test1")).toBe(false); - expect(instances.has("test2")).toBe(false); - expect(instances.has("test3")).toBe(false); -}); + expect(instance1.disposed).toBe(true); + expect(instance2.disposed).toBe(true); + expect(instance3.disposed).toBe(true); + expect(instances.has("test1")).toBe(false); + expect(instances.has("test2")).toBe(false); + expect(instances.has("test3")).toBe(false); + }); -test("Symbol.dispose throws single error if only one disposal fails", () => { - interface TestInstance extends Disposable { - readonly id: string; - } + test("Symbol.dispose throws single error if only one disposal fails", () => { + interface TestInstance extends Disposable { + readonly id: string; + } - const instances = createInstances(); + const instances = createInstances(); - instances.ensure("test1", () => ({ - id: "test-1", - [Symbol.dispose]: () => { - throw new Error("Single disposal error"); - }, - })); + instances.ensure("test1", () => ({ + id: "test-1", + [Symbol.dispose]: () => { + throw new Error("Single disposal error"); + }, + })); - instances.ensure("test2", () => ({ - id: "test-2", - [Symbol.dispose]: lazyVoid, - })); + instances.ensure("test2", () => ({ + id: "test-2", + [Symbol.dispose]: lazyVoid, + })); - expect(() => { - instances[Symbol.dispose](); - }).toThrow("Single disposal error"); -}); + expect(() => { + instances[Symbol.dispose](); + }).toThrow("Single disposal error"); + }); -test("Symbol.dispose throws AggregateError if multiple disposals fail", () => { - interface TestInstance extends Disposable { - readonly id: string; - } + test("Symbol.dispose throws SuppressedError if multiple disposals fail", () => { + interface TestInstance extends Disposable { + readonly id: string; + } - const instances = createInstances(); + const instances = createInstances(); - instances.ensure("test1", () => ({ - id: "test-1", - [Symbol.dispose]: () => { - throw new Error("Error 1"); - }, - })); + instances.ensure("test1", () => ({ + id: "test-1", + [Symbol.dispose]: () => { + throw new Error("Error 1"); + }, + })); - instances.ensure("test2", () => ({ - id: "test-2", - [Symbol.dispose]: () => { - throw new Error("Error 2"); - }, - })); + instances.ensure("test2", () => ({ + id: "test-2", + [Symbol.dispose]: () => { + throw new Error("Error 2"); + }, + })); - try { - instances[Symbol.dispose](); - expect.fail("Should have thrown"); - } catch (error) { - expect(error).toBeInstanceOf(AggregateError); - if (error instanceof AggregateError) { - expect(error.errors).toHaveLength(2); - expect(error.errors[0]).toBeInstanceOf(Error); - expect(error.errors[1]).toBeInstanceOf(Error); - expect((error.errors[0] as Error).message).toBe("Error 1"); - expect((error.errors[1] as Error).message).toBe("Error 2"); + const SuppressedErrorCtor = ( + globalThis as { + readonly SuppressedError?: new ( + error: unknown, + suppressed: unknown, + message?: string, + ) => Error; + } + ).SuppressedError; + expect(SuppressedErrorCtor).toBeDefined(); + + try { + instances[Symbol.dispose](); + expect.fail("Should have thrown"); + } catch (error) { + expect(error).toBeInstanceOf(SuppressedErrorCtor); + + const suppressedError = error as { + readonly error: unknown; + readonly suppressed: unknown; + }; + + expect(suppressedError.error).toBeInstanceOf(Error); + expect(suppressedError.suppressed).toBeInstanceOf(Error); + expect((suppressedError.error as Error).message).toBe("Error 1"); + expect((suppressedError.suppressed as Error).message).toBe("Error 2"); } - } + }); }); diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index 07627bdb5..fd982cd33 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, expectTypeOf, test } from "vitest"; +import { assert, describe, expect, expectTypeOf, test, vi } from "vitest"; import { emptyArray, isNonEmptyArray, @@ -28,56 +28,64 @@ import type { InferTaskOk, NextTask, RetryError, - Runner, - RunnerConfigDep, - RunnerDeps, + Run, + RunConfigDep, + RunDeps, Task, } from "../src/Task.js"; import { AbortError, - AllAbortError, - AllSettledAbortError, - AnyAbortError, - type AsyncDisposableStack, all, + AllAbortError, allSettled, + AllSettledAbortError, any, + AnyAbortError, + AsyncDisposableStack, callback, createDeferred, createDeferreds, createGate, createInMemoryLeaderLock, createMutex, + createMutexByKey, createRun, - createRunner, createSemaphore, - type DeferredDisposedError, + createSemaphoreByKey, + createTaskInstances, deferredDisposedError, + DeferredDisposedError, fetch, - MapAbortError, map, + MapAbortError, mapSettled, parallel, - RaceLostError, - type RunnerEvent, race, + RaceLostError, repeat, retry, - runnerClosingError, + runClosingError, + RunEvent, sleep, - TimeoutError, timeout, + TimeoutError, unabortable, unabortableMask, yieldNow, } from "../src/Task.js"; -import { testCreateDeps, testCreateRunner, testName } from "../src/Test.js"; +import { testCreateDeps, testCreateRun } from "../src/Test.js"; import { createTime, Millis, msLongTask, testCreateTime } from "../src/Time.js"; import type { Typed } from "../src/Type.js"; -import { type Id, minPositiveInt, Name, PositiveInt } from "../src/Type.js"; - -const eventsEnabled: RunnerConfigDep = { - runnerConfig: { eventsEnabled: createRef(true) }, +import { + Id, + minPositiveInt, + Name, + PositiveInt, + testName, +} from "../src/Type.js"; + +const eventsEnabled: RunConfigDep = { + runConfig: { eventsEnabled: createRef(true) }, }; interface MyError extends Typed<"MyError"> {} @@ -112,7 +120,7 @@ describe("NextTask", () => { }); test("models three outcomes: value, done, error", async () => { - await using run = createRunner(); + await using run = createRun(); const valueTask: NextTask = () => ok(42); const doneTask: NextTask = () => err(done()); @@ -129,7 +137,7 @@ describe("NextTask", () => { }); test("type narrows correctly in pattern matching", async () => { - await using run = createRunner(); + await using run = createRun(); const task: NextTask = () => err({ type: "Done", done: "summary" }); @@ -158,7 +166,7 @@ describe("NextTask", () => { }); test("simulates iterator pattern with pull-based protocol", async () => { - await using run = createRunner(); + await using run = createRun(); const items = [1, 2, 3]; let index = 0; @@ -184,10 +192,10 @@ describe("NextTask", () => { }); }); -describe("Runner", () => { +describe("Run", () => { describe("run", () => { test("executes task and returns result", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = () => ok("hello"); @@ -225,7 +233,7 @@ describe("Runner", () => { describe("error handling", () => { test("synchronous throw does not leak fiber", async () => { - await using run = createRunner(); + await using run = createRun(); const syncThrowingTask = () => { throw new Error("sync throw"); @@ -243,7 +251,7 @@ describe("Runner", () => { }); test("rejected promise does not leak fiber", async () => { - await using run = createRunner(); + await using run = createRun(); const rejectingTask = () => Promise.reject(new Error("rejected")); @@ -262,28 +270,28 @@ describe("Runner", () => { describe("deps", () => { test("exposes injected time", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); expect(run.deps.time).toBe(time); }); test("exposes injected console", async () => { const console = testCreateConsole(); - await using run = testCreateRunner({ console }); + await using run = testCreateRun({ console }); expect(run.deps.console).toBe(console); }); test("exposes injected random", async () => { const random = testCreateRandom(); - await using run = testCreateRunner({ random }); + await using run = testCreateRun({ random }); expect(run.deps.random).toBe(random); }); test("exposes injected randomBytes", async () => { const deps = testCreateDeps(); - await using run = testCreateRunner(deps); + await using run = testCreateRun(deps); expect(run.deps.randomBytes).toBe(deps.randomBytes); }); @@ -300,8 +308,8 @@ describe("Runner", () => { const createDb = (): Db => ({ query: (sql) => `result:${sql}` }); - test("extends runner with additional deps for one-shot usage", async () => { - await using run = createRunner(); + test("extends run with additional deps for one-shot usage", async () => { + await using run = createRun(); const db = createDb(); @@ -313,11 +321,11 @@ describe("Runner", () => { expect(result).toEqual(ok("result:SELECT 1")); }); - test("extends runner with additional deps for reusable usage", async () => { - await using _run = createRunner(); + test("extends run with additional deps for reusable usage", async () => { + await using _run = createRun(); const db = createDb(); - const run: Runner = _run.addDeps({ db }); + const run: Run = _run.addDeps({ db }); const task1: Task = (run) => ok(run.deps.db.query("SELECT 1")); @@ -333,7 +341,7 @@ describe("Runner", () => { }); test("child tasks inherit extended deps", async () => { - await using run = createRunner(); + await using run = createRun(); const db = createDb(); @@ -352,7 +360,7 @@ describe("Runner", () => { }); test("supports multiple deps at once", async () => { - await using run = createRunner(); + await using run = createRun(); interface CacheDep { readonly cache: { get: (key: string) => string }; @@ -371,8 +379,8 @@ describe("Runner", () => { expect(result).toEqual(ok("result:db-cache")); }); - test("returns same runner instance", async () => { - await using run = createRunner(); + test("returns same run instance", async () => { + await using run = createRun(); const db = createDb(); const runWithDb = run.addDeps({ db }); @@ -381,7 +389,7 @@ describe("Runner", () => { }); test("type error when overriding existing dep", async () => { - await using run = createRunner(); + await using run = createRun(); const db = createDb(); const runWithDb = run.addDeps({ db }); @@ -392,8 +400,8 @@ describe("Runner", () => { ); }); - test("type error when overriding RunnerDeps", async () => { - await using run = createRunner(); + test("type error when overriding RunDeps", async () => { + await using run = createRun(); // @ts-expect-error - cannot override built-in time dep expect(() => run.addDeps({ time: { now: () => 0 } })).toThrow( @@ -401,15 +409,15 @@ describe("Runner", () => { ); }); - test("runner with more deps is assignable to runner with fewer deps", async () => { - await using run = createRunner(); + test("run with more deps is assignable to run with fewer deps", async () => { + await using run = createRun(); const runWithBoth = run.addDeps({ createDb, db: createDb(), }); - const runWithDb: Runner = runWithBoth; + const runWithDb: Run = runWithBoth; const task: Task = (run) => ok(run.deps.db.query("SELECT 1")); @@ -423,9 +431,9 @@ describe("Runner", () => { describe("onEvent", () => { test("emits childAdded when child is added", async () => { const deps = testCreateDeps(); - await using run = testCreateRunner({ ...deps, ...eventsEnabled }); + await using run = testCreateRun({ ...deps, ...eventsEnabled }); - const events: Array = []; + const events: Array = []; const taskComplete = Promise.withResolvers>(); run.onEvent = (event) => { @@ -447,9 +455,9 @@ describe("Runner", () => { }); test("emits completing, completed, childRemoved when child completes", async () => { - await using run = testCreateRunner(eventsEnabled); + await using run = testCreateRun(eventsEnabled); - const events: Array = []; + const events: Array = []; const taskComplete = Promise.withResolvers>(); const fiber = run(() => taskComplete.promise); @@ -483,9 +491,9 @@ describe("Runner", () => { }); test("bubbles up through parent chain", async () => { - await using run = testCreateRunner(eventsEnabled); + await using run = testCreateRun(eventsEnabled); - const events: Array<{ level: string; event: RunnerEvent }> = []; + const events: Array<{ level: string; event: RunEvent }> = []; run.onEvent = (event) => { events.push({ level: "root", event }); @@ -533,9 +541,9 @@ describe("Runner", () => { }); test("not emitted when eventsEnabled is false", async () => { - await using run = createRunner(); // Events disabled by default + await using run = createRun(); // Events disabled by default - const events: Array = []; + const events: Array = []; run.onEvent = (event) => { events.push(event); @@ -550,7 +558,7 @@ describe("Runner", () => { describe("snapshot", () => { test("returns same reference when nothing changes", async () => { - await using run = createRunner(); + await using run = createRun(); const snapshot1 = run.snapshot(); const snapshot2 = run.snapshot(); @@ -559,7 +567,7 @@ describe("Runner", () => { }); test("returns new reference when children change", async () => { - await using run = createRunner(); + await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -583,7 +591,7 @@ describe("Runner", () => { }); test("preserves child snapshot references when sibling changes", async () => { - await using run = createRunner(); + await using run = createRun(); const task1Complete = Promise.withResolvers>(); const task2Complete = Promise.withResolvers>(); @@ -613,13 +621,9 @@ describe("Runner", () => { }); test("structural sharing during rapid concurrent completions", async () => { - await using run = createRunner(); + await using run = createRun(); - const taskCompletes: Array<{ - promise: Promise>; - resolve: (value: Result) => void; - reject: (reason?: any) => void; - }> = []; + const taskCompletes: Array>> = []; // Start 5 concurrent fibers const fibers = Array.from({ length: 5 }, () => { @@ -662,7 +666,7 @@ describe("Runner", () => { describe("defer", () => { test("runs task when disposed", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -684,8 +688,28 @@ describe("Runner", () => { expect(events).toEqual(["work", "cleanup"]); }); + test("accepts cleanup callback returning void", async () => { + await using run = createRun(); + + const events: Array = []; + + const task: Task = async (run) => { + await using _ = run.defer(() => { + events.push("cleanup"); + }); + + events.push("work"); + return ok(); + }; + + const result = await run(task); + + expect(result).toEqual(ok()); + expect(events).toEqual(["work", "cleanup"]); + }); + test("is unabortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const taskStarted = Promise.withResolvers(); @@ -724,32 +748,25 @@ describe("Runner", () => { const results: Array = []; { - await using run = createRunner(); + await using run = createRun(); const makeTask = (id: string): Task => async ({ signal }) => { const taskComplete = Promise.withResolvers>(); - let settled = false; const timeout = setTimeout(() => { - if (!settled) { - settled = true; - results.push(`${id} completed`); - taskComplete.resolve(ok(id)); - } + results.push(`${id} completed`); + taskComplete.resolve(ok(id)); }, 1000); signal.addEventListener( "abort", () => { - if (!settled) { - settled = true; - clearTimeout(timeout); - results.push(`${id} aborted`); - taskComplete.resolve(err(signal.reason)); - } + clearTimeout(timeout); + results.push(`${id} aborted`); + taskComplete.resolve(err(signal.reason)); }, { once: true }, ); @@ -760,13 +777,13 @@ describe("Runner", () => { run(makeTask("task1")); run(makeTask("task2")); } - // runner disposed here + // run disposed here expect(results).toEqual(["task1 aborted", "task2 aborted"]); }); test("transitions running → completing → completed", async () => { - const run = createRunner(); + const run = createRun(); expectTypeOf(run.getState()).toEqualTypeOf(); expect(run.getState().type).toBe("Running"); @@ -779,11 +796,11 @@ describe("Runner", () => { const task: Task = async (run) => { run.signal.addEventListener("abort", () => { - stateInAbortHandler = run.parent?.getState(); + stateInAbortHandler = run.parent!.getState(); }); taskStarted.resolve(); await taskCanFinish.promise; - stateAfterAwait = run.parent?.getState(); + stateAfterAwait = run.parent!.getState(); return ok(); }; @@ -796,13 +813,13 @@ describe("Runner", () => { taskCanFinish.resolve(); await disposePromise; - expect(stateInAbortHandler?.type).toBe("Completing"); - expect(stateAfterAwait?.type).toBe("Completing"); + expect(stateInAbortHandler!.type).toBe("Completing"); + expect(stateAfterAwait!.type).toBe("Completing"); expect(run.getState().type).toBe("Completed"); }); test("defaults completed result and outcome to ok", async () => { - const run = createRunner(); + const run = createRun(); await run[Symbol.asyncDispose](); @@ -815,7 +832,7 @@ describe("Runner", () => { }); test("is idempotent", async () => { - await using run = createRunner(); + await using run = createRun(); const promise1 = run[Symbol.asyncDispose](); const promise2 = run[Symbol.asyncDispose](); @@ -824,7 +841,7 @@ describe("Runner", () => { }); test("does not run new tasks when completing", async () => { - const run = createRunner(); + const run = createRun(); run[Symbol.asyncDispose](); expect(run.getState().type).toBe("Completing"); @@ -862,14 +879,14 @@ describe("Runner", () => { expect(unabortableFiber.run.getState().type).toBe("Completed"); expect(unabortableMaskFiber.run.getState().type).toBe("Completed"); - const expected = err({ type: "AbortError", reason: runnerClosingError }); + const expected = err({ type: "AbortError", reason: runClosingError }); expect(regularResult).toEqual(expected); expect(unabortableResult).toEqual(expected); expect(unabortableMaskResult).toEqual(expected); }); test("does not run new tasks when completed", async () => { - const run = createRunner(); + const run = createRun(); await run[Symbol.asyncDispose](); expect(run.getState().type).toBe("Completed"); @@ -907,7 +924,7 @@ describe("Runner", () => { expect(unabortableFiber.run.getState().type).toBe("Completed"); expect(unabortableMaskFiber.run.getState().type).toBe("Completed"); - const expected = err({ type: "AbortError", reason: runnerClosingError }); + const expected = err({ type: "AbortError", reason: runClosingError }); expect(regularResult).toEqual(expected); expect(unabortableResult).toEqual(expected); expect(unabortableMaskResult).toEqual(expected); @@ -916,7 +933,7 @@ describe("Runner", () => { describe("onAbort", () => { test("passes the abort reason directly, not wrapped in AbortError", async () => { - await using run = createRunner(); + await using run = createRun(); const receivedReason = Promise.withResolvers(); const taskStarted = Promise.withResolvers(); @@ -941,7 +958,7 @@ describe("Runner", () => { }); test("receives undefined when aborted without reason", async () => { - await using run = createRunner(); + await using run = createRun(); const receivedReason = Promise.withResolvers(); const taskStarted = Promise.withResolvers(); @@ -966,7 +983,7 @@ describe("Runner", () => { }); test("invokes callback immediately when already aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const receivedReason = Promise.withResolvers(); const allowRegister = Promise.withResolvers(); @@ -986,114 +1003,122 @@ describe("Runner", () => { expect(reason).toBe("late-reason"); }); - test.sequential("removes listener via signal option for cleanup", async () => { - // This test verifies that onAbort uses `signal: requestController.signal` - // for listener cleanup. Per spec, when the cleanup signal aborts, the - // listener is removed. We capture the cleanup signal and verify it's - // aborted after disposal. + test.sequential( + "removes listener via signal option for cleanup", + async () => { + // This test verifies that onAbort uses `signal: requestController.signal` + // for listener cleanup. Per spec, when the cleanup signal aborts, the + // listener is removed. We capture the cleanup signal and verify it's + // aborted after disposal. - await using run = createRunner(); + await using run = createRun(); - let cleanupSignal: AbortSignal | null = null; - const originalAddEventListener = AbortSignal.prototype.addEventListener; + let cleanupSignal: AbortSignal | null = null; + // eslint-disable-next-line @typescript-eslint/unbound-method + const originalAddEventListener = AbortSignal.prototype.addEventListener; - let childSignal: AbortSignal | null = null; + let childSignal: AbortSignal | null = null; - AbortSignal.prototype.addEventListener = function ( - ...args: Parameters - ) { - const [type, , options] = args; - if ( - type === "abort" && - this === childSignal && - options && - typeof options === "object" && - options.signal + AbortSignal.prototype.addEventListener = function ( + ...args: Parameters ) { - cleanupSignal = options.signal; - } - originalAddEventListener.apply(this, args); - }; + const [type, , options] = args; + if ( + type === "abort" && + this === childSignal && + options && + typeof options === "object" && + options.signal + ) { + cleanupSignal = options.signal; + } + originalAddEventListener.apply(this, args); + }; - try { - await run((childRun) => { - childSignal = childRun.signal; - childRun.onAbort(lazyVoid); - return ok(); - }); + try { + await run((childRun) => { + childSignal = childRun.signal; + childRun.onAbort(lazyVoid); + return ok(); + }); - // Cleanup signal should exist and be aborted after disposal - expect(cleanupSignal).not.toBeNull(); - expect((cleanupSignal as any)?.aborted).toBe(true); - } finally { - AbortSignal.prototype.addEventListener = originalAddEventListener; - } - }); + // Cleanup signal should exist and be aborted after disposal + expect(cleanupSignal).not.toBeNull(); + expect(cleanupSignal!.aborted).toBe(true); + } finally { + AbortSignal.prototype.addEventListener = originalAddEventListener; + } + }, + ); - test.sequential("removes parent abort listener via signal option for cleanup", async () => { - // This test verifies that child runners use `signal: requestController.signal` - // for parent abort listener cleanup. When a child completes, the listener - // on parent.requestSignal should be removed automatically. + test.sequential( + "removes parent abort listener via signal option for cleanup", + async () => { + // This test verifies that child runs use `signal: requestController.signal` + // for parent abort listener cleanup. When a child completes, the listener + // on parent.requestSignal should be removed automatically. - await using run = createRunner(); + await using run = createRun(); - let cleanupSignal: AbortSignal | null = null; - const originalAddEventListener = AbortSignal.prototype.addEventListener; + let cleanupSignal: AbortSignal | null = null; + // eslint-disable-next-line @typescript-eslint/unbound-method + const originalAddEventListener = AbortSignal.prototype.addEventListener; - // We need to capture the parent's requestSignal to identify the right listener - let parentRequestSignal: AbortSignal | null = null; + // We need to capture the parent's requestSignal to identify the right listener + let parentRequestSignal: AbortSignal | null = null; - AbortSignal.prototype.addEventListener = function ( - ...args: Parameters - ) { - const [type, , options] = args; - // The parent abort listener is registered on parent.requestSignal - if ( - type === "abort" && - this === parentRequestSignal && - options && - typeof options === "object" && - options.signal + AbortSignal.prototype.addEventListener = function ( + ...args: Parameters ) { - cleanupSignal = options.signal; - } - originalAddEventListener.apply(this, args); - }; + const [type, , options] = args; + // The parent abort listener is registered on parent.requestSignal + if ( + type === "abort" && + this === parentRequestSignal && + options && + typeof options === "object" && + options.signal + ) { + cleanupSignal = options.signal; + } + originalAddEventListener.apply(this, args); + }; - try { - // First, we need to get access to the parent's internal requestSignal - // We do this by spawning a child that captures it - await run((childRun) => { - // The child registers a listener on parent.requestSignal - // We can identify it by checking what signal addEventListener is called on - // The parent's requestSignal is internal, but we can use a trick: - // spawn another child and that child will register on childRun's requestSignal - parentRequestSignal = ( - childRun as never as { requestSignal: AbortSignal } - ).requestSignal; - - const childFiber = childRun(() => ok(42)); - return childFiber; - }); + try { + // First, we need to get access to the parent's internal requestSignal + // We do this by spawning a child that captures it + await run((childRun) => { + // The child registers a listener on parent.requestSignal + // We can identify it by checking what signal addEventListener is called on + // The parent's requestSignal is internal, but we can use a trick: + // spawn another child and that child will register on childRun's requestSignal + parentRequestSignal = ( + childRun as never as { requestSignal: AbortSignal } + ).requestSignal; + + const childFiber = childRun(() => ok(42)); + return childFiber; + }); - // Cleanup signal should exist and be aborted after child disposal - expect(cleanupSignal).not.toBeNull(); - expect((cleanupSignal as any)?.aborted).toBe(true); - } finally { - AbortSignal.prototype.addEventListener = originalAddEventListener; - } - }); + // Cleanup signal should exist and be aborted after child disposal + expect(cleanupSignal).not.toBeNull(); + expect(cleanupSignal!.aborted).toBe(true); + } finally { + AbortSignal.prototype.addEventListener = originalAddEventListener; + } + }, + ); }); }); describe("Fiber", () => { test("is awaitable", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = () => Promise.resolve(ok(42)); const fiber = run(task); - expectTypeOf(fiber).toEqualTypeOf>(); + expectTypeOf(fiber).toEqualTypeOf>(); const result = await fiber; @@ -1103,7 +1128,7 @@ describe("Fiber", () => { describe("abort", () => { test("before run short-circuits child task", async () => { - await using run = createRunner(); + await using run = createRun(); let taskRan = false; let signalAbortedBeforeInnerRun = false; @@ -1138,7 +1163,7 @@ describe("Fiber", () => { }); test("during run signals abort via AbortSignal", async () => { - await using run = createRunner(); + await using run = createRun(); let signalAbortedInHandler = false; @@ -1179,7 +1204,7 @@ describe("Fiber", () => { describe("dispose", () => { test("aborts task via using", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async ({ signal }) => { const taskComplete = Promise.withResolvers>(); @@ -1216,7 +1241,7 @@ describe("Fiber", () => { }); test("getState returns running while running, completed with result after completion", async () => { - await using run = createRunner(); + await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1234,7 +1259,7 @@ describe("Fiber", () => { }); test("completed state outcome equals result when not aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1251,7 +1276,7 @@ describe("Fiber", () => { }); test("completed state outcome preserves original result when aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const fiber = run(() => ok("data")); fiber.abort("stop"); @@ -1267,7 +1292,7 @@ describe("Fiber", () => { describe("run", () => { test("id matches run.id inside task", async () => { - await using run = createRunner(); + await using run = createRun(); let parentFiberId: Id | null = null; let childFiber: Fiber | null = null; @@ -1287,13 +1312,13 @@ describe("Fiber", () => { await parentFiber; - expect(parentFiberId).toBe((parentFiber as any).run.id); - expect(childFiberId).toBe((childFiber as any)?.run.id); + expect(parentFiberId).toBe(parentFiber.run.id); + expect(childFiberId).toBe(childFiber!.run.id); expect(parentFiberId).not.toBe(childFiberId); }); test("snapshot returns running state while running, completed with result after completion", async () => { - await using run = createRunner(); + await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1309,11 +1334,11 @@ describe("Fiber", () => { }); describe("daemon", () => { - test("called directly on root runner", async () => { + test("called directly on root Run", async () => { const events: Array = []; const daemonCanComplete = Promise.withResolvers(); - await using run = createRunner(); + await using run = createRun(); const daemonTask: Task = async () => { events.push("daemon started"); @@ -1322,7 +1347,7 @@ describe("Fiber", () => { return ok(); }; - // Call daemon directly on root runner (not from inside a task) + // Call daemon directly on root Run (not from inside a task) const fiber = run.daemon(daemonTask); expect(events).toEqual(["daemon started"]); @@ -1338,7 +1363,7 @@ describe("Fiber", () => { const daemonCanComplete = Promise.withResolvers(); let daemonFiber: Fiber; - await using run = createRunner(); + await using run = createRun(); const daemonTask: Task = async () => { events.push("daemon started"); @@ -1365,7 +1390,6 @@ describe("Fiber", () => { // Let daemon complete and wait for it daemonCanComplete.resolve(); - // biome-ignore lint/style/noNonNullAssertion: Test utility await daemonFiber!; expect(events).toEqual([ @@ -1376,9 +1400,9 @@ describe("Fiber", () => { ]); }); - test("aborted when root runner disposes", async () => { + test("aborted when root Run disposes", async () => { const events: Array = []; - const run = createRunner(); + const run = createRun(); const daemonTask: Task = async ({ signal }) => { events.push("daemon started"); @@ -1410,18 +1434,18 @@ describe("Fiber", () => { await run(parentTask); expect(events).toEqual(["daemon started"]); - // Dispose root runner + // Dispose root Run await run[Symbol.asyncDispose](); expect(events).toEqual(["daemon started", "daemon aborted"]); }); - test("from nested task runs on root runner", async () => { + test("from nested task runs on root Run", async () => { const events: Array = []; const daemonCanComplete = Promise.withResolvers(); let daemonFiber: Fiber; - await using run = createRunner(); + await using run = createRun(); const daemonTask: Task = async () => { events.push("daemon started"); @@ -1457,7 +1481,6 @@ describe("Fiber", () => { ]); daemonCanComplete.resolve(); - // biome-ignore lint/style/noNonNullAssertion: Test utility await daemonFiber!; expect(events).toEqual([ @@ -1475,7 +1498,7 @@ describe("Fiber", () => { readonly custom: { readonly value: string }; } - await using run = createRunner(); + await using run = createRun(); let receivedValue: string | undefined; @@ -1513,7 +1536,7 @@ describe("Fiber", () => { describe("unabortable", () => { test("without abort completes", async () => { - await using run = createRunner(); + await using run = createRun(); const okResult = await run(unabortable(() => ok(42))); const errResult = await run(unabortable(() => err({ type: "MyError" }))); @@ -1523,7 +1546,7 @@ describe("unabortable", () => { }); test("with abort before run masks signal and completes", async () => { - await using run = createRunner(); + await using run = createRun(); let taskRan = false; let innerResult: Result | null = null; @@ -1560,7 +1583,7 @@ describe("unabortable", () => { }); test("with abort during run masks signal and completes", async () => { - await using run = createRunner(); + await using run = createRun(); const canComplete = Promise.withResolvers(); let signalAbortedAtStart = true; @@ -1591,7 +1614,7 @@ describe("unabortable", () => { describe("unabortableMask", () => { test("without abort completes", async () => { - await using run = createRunner(); + await using run = createRun(); let abortableRan = false; @@ -1612,7 +1635,7 @@ describe("unabortableMask", () => { }); test("with abort before run still runs unabortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; let signalAbortedBeforeMask = false; @@ -1651,7 +1674,7 @@ describe("unabortableMask", () => { }); test("with abort during run masks signal, skips abortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const acquireStarted = Promise.withResolvers(); @@ -1702,7 +1725,7 @@ describe("unabortableMask", () => { }); test("nested unabortableMask: outer abortable restores to fully abortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const innerStarted = Promise.withResolvers(); @@ -1759,7 +1782,7 @@ describe("unabortableMask", () => { }); test("restore throws when used outside its unabortableMask", async () => { - await using run = createRunner(); + await using run = createRun(); let restoreFromInner: ((task: Task) => Task) | undefined; @@ -1781,7 +1804,7 @@ describe("unabortableMask", () => { // Using restore2 outside its intended scope would increase abort mask // (root mask=0, override=1). This must crash. - expect(() => run((restoreFromInner as any)?.(() => ok()))).toThrow( + expect(() => run(restoreFromInner!(() => ok()))).toThrow( "restore used outside its unabortableMask", ); }); @@ -1798,15 +1821,16 @@ describe("AsyncDisposableStack", () => { events.push(`${id} acquired`); return ok({ id, + // eslint-disable-next-line @typescript-eslint/require-await [Symbol.asyncDispose]: async () => { events.push(`${id} released`); }, }); }; - describe("stack via Runner", () => { + describe("stack via Run", () => { test("run.stack() creates AsyncDisposableStack", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -1833,7 +1857,7 @@ describe("AsyncDisposableStack", () => { describe("defer", () => { test("runs task on dispose", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -1855,8 +1879,29 @@ describe("AsyncDisposableStack", () => { expect(events).toEqual(["work", "cleanup"]); }); + test("accepts async cleanup callback returning Promise", async () => { + await using run = createRun(); + + const events: Array = []; + + const task: Task = async (run) => { + await using stack = run.stack(); + stack.defer(async () => { + await Promise.resolve(); + events.push("cleanup"); + }); + events.push("work"); + return ok(); + }; + + const result = await run(task); + + expect(result).toEqual(ok()); + expect(events).toEqual(["work", "cleanup"]); + }); + test("requires cleanup task without domain errors", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async (run) => { await using stack = run.stack(); @@ -1876,7 +1921,7 @@ describe("AsyncDisposableStack", () => { }); test("runs multiple deferred tasks in LIFO order", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -1901,7 +1946,7 @@ describe("AsyncDisposableStack", () => { }); test("is unabortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const taskStarted = Promise.withResolvers(); @@ -1936,7 +1981,7 @@ describe("AsyncDisposableStack", () => { describe("disposeAsync", () => { test("disposes the stack", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -1963,7 +2008,7 @@ describe("AsyncDisposableStack", () => { describe("disposed", () => { test("returns false before dispose, true after", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async (run) => { const stack = run.stack(); @@ -1981,7 +2026,7 @@ describe("AsyncDisposableStack", () => { describe("use", () => { test("acquires and disposes resource", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2000,7 +2045,7 @@ describe("AsyncDisposableStack", () => { }); test("acquires multiple resources in LIFO disposal order", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2035,7 +2080,7 @@ describe("AsyncDisposableStack", () => { }); test("propagates acquire error and releases acquired resources", async () => { - await using run = createRunner(); + await using run = createRun(); interface AcquireError extends Typed<"AcquireError"> {} @@ -2069,7 +2114,7 @@ describe("AsyncDisposableStack", () => { }); test("releases acquired resources when acquire throws", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2099,7 +2144,7 @@ describe("AsyncDisposableStack", () => { }); test("acquisition is unabortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canComplete = Promise.withResolvers(); @@ -2110,6 +2155,7 @@ describe("AsyncDisposableStack", () => { events.push(`acquire completed, aborted: ${signal.aborted}`); return ok({ id: "slow", + // eslint-disable-next-line @typescript-eslint/require-await [Symbol.asyncDispose]: async () => { events.push("slow released"); }, @@ -2142,7 +2188,7 @@ describe("AsyncDisposableStack", () => { }); test("accepts sync Disposable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2177,7 +2223,7 @@ describe("AsyncDisposableStack", () => { }); test("accepts null without registering disposal", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async (run) => { await using stack = run.stack(); @@ -2189,7 +2235,7 @@ describe("AsyncDisposableStack", () => { }); test("accepts undefined without registering disposal", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async (run) => { await using stack = run.stack(); @@ -2201,7 +2247,7 @@ describe("AsyncDisposableStack", () => { }); test("accepts direct value (sync)", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2209,6 +2255,7 @@ describe("AsyncDisposableStack", () => { await using stack = run.stack(); const resource: AsyncDisposable = { + // eslint-disable-next-line @typescript-eslint/require-await [Symbol.asyncDispose]: async () => { events.push("released"); }, @@ -2229,32 +2276,32 @@ describe("AsyncDisposableStack", () => { }); test("accepts disposable callable (not mistaken for Task)", async () => { - await using run = createRunner(); + await using run = createRun(); - let childRunner: Runner | null = null; + let childRun: Run | null = null; let stateWhileWorking: FiberState | null = null; const task: Task = async (run) => { await using stack = run.stack(); - // Runner is a callable with Symbol.asyncDispose + // Run is a callable with Symbol.asyncDispose // use must detect the symbol, not use typeof === "function" - childRunner = createRunner(); - stack.use(childRunner); + childRun = createRun(); + stack.use(childRun); - stateWhileWorking = childRunner.getState(); + stateWhileWorking = childRun.getState(); return ok(); }; const result = await run(task); expect(result).toEqual(ok()); - expect((stateWhileWorking as any)?.type).toBe("Running"); - expect((childRunner as any)?.getState().type).toBe("Completed"); + expect(stateWhileWorking!.type).toBe("Running"); + expect(childRun!.getState().type).toBe("Completed"); }); test("accepts moved native stack", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2285,7 +2332,7 @@ describe("AsyncDisposableStack", () => { describe("adopt", () => { test("acquires value via task and registers task-based disposal", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2320,7 +2367,7 @@ describe("AsyncDisposableStack", () => { }); test("requires release task without domain errors", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = async (run) => { await using stack = run.stack(); @@ -2349,7 +2396,7 @@ describe("AsyncDisposableStack", () => { }); test("disposal is unabortable", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const taskStarted = Promise.withResolvers(); @@ -2388,7 +2435,7 @@ describe("AsyncDisposableStack", () => { }); test("does not register disposal if acquire fails", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2423,7 +2470,7 @@ describe("AsyncDisposableStack", () => { describe("move", () => { test("transfers ownership to returned AsyncDisposableStack", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2468,7 +2515,7 @@ describe("AsyncDisposableStack", () => { }); test("cleans up on early return after move is possible", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canContinue = Promise.withResolvers(); @@ -2517,7 +2564,7 @@ describe("AsyncDisposableStack", () => { describe("cleanup runs on root scope", () => { test("defer cleanup survives factory task scope", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2553,7 +2600,7 @@ describe("AsyncDisposableStack", () => { }); test("adopt disposal survives factory task scope", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2628,7 +2675,7 @@ describe("AsyncDisposableStack", () => { }; test("disposal runs when stack disposes", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2647,7 +2694,7 @@ describe("AsyncDisposableStack", () => { }); test("disposal completes even when parent task is aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const workStarted = Promise.withResolvers(); @@ -2665,7 +2712,7 @@ describe("AsyncDisposableStack", () => { createResourceFactory(events, async (run) => { events.push("disposal started"); await canComplete.promise; - // Verify runner works inside disposal task + // Verify run works inside disposal task await run(cleanupHelper); events.push("disposal completed"); return ok(); @@ -2701,7 +2748,7 @@ describe("AsyncDisposableStack", () => { }); test("disposal survives factory task scope ending", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2723,7 +2770,7 @@ describe("AsyncDisposableStack", () => { describe("yieldNow", () => { test("is polyfilled properly", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -2754,15 +2801,91 @@ describe("yieldNow", () => { "yield-resolved", ]); }); + + test("uses scheduler.yield when available", async () => { + const globals = globalThis as unknown as { + scheduler: { yield?: () => Promise } | undefined; + setImmediate: ((...args: Array) => unknown) | undefined; + }; + const originalScheduler = globals.scheduler; + const originalSetImmediate = globals.setImmediate; + + const schedulerYield = vi.fn(() => Promise.resolve()); + + try { + globals.scheduler = { yield: schedulerYield }; + globals.setImmediate = undefined; + vi.resetModules(); + + const taskModule = await import("../src/Task.js"); + + await using run = taskModule.createRun(); + expect(await run(taskModule.yieldNow)).toEqual(ok()); + } finally { + globals.scheduler = originalScheduler; + globals.setImmediate = originalSetImmediate; + vi.resetModules(); + } + }); + + test("maps setImmediate failures to AbortError", async () => { + await using run = createRun(); + + const globals = globalThis as unknown as { + setImmediate?: (...args: Array) => unknown; + }; + const originalSetImmediate = globals.setImmediate; + const setImmediateError = new Error("setImmediate failed"); + + if (originalSetImmediate == null) return; + + try { + globals.setImmediate = () => { + throw setImmediateError; + }; + + expect(await run(yieldNow)).toEqual( + err({ + type: "AbortError", + reason: setImmediateError, + }), + ); + } finally { + globals.setImmediate = originalSetImmediate; + } + }); + + test("uses setTimeout fallback when scheduler and setImmediate are unavailable", async () => { + const globals = globalThis as unknown as { + scheduler: unknown; + setImmediate: ((...args: Array) => unknown) | undefined; + }; + const originalScheduler = globals.scheduler; + const originalSetImmediate = globals.setImmediate; + + try { + globals.scheduler = undefined; + globals.setImmediate = undefined; + vi.resetModules(); + + const taskModule = await import("../src/Task.js"); + + await using run = taskModule.createRun(); + expect(await run(taskModule.yieldNow)).toEqual(ok()); + } finally { + globals.scheduler = originalScheduler; + globals.setImmediate = originalSetImmediate; + vi.resetModules(); + } + }); }); describe("callback", () => { test("resolves with ok value", async () => { - await using run = createRunner(); + await using run = createRun(); const task = callback(({ ok }) => { ok("hello"); - return undefined; }); const result = await run(task); @@ -2772,11 +2895,10 @@ describe("callback", () => { test("resolves with err value", async () => { interface MyError extends Typed<"MyError"> {} - await using run = createRunner(); + await using run = createRun(); const task = callback(({ err }) => { err({ type: "MyError" }); - return undefined; }); const result = await run(task); @@ -2784,7 +2906,7 @@ describe("callback", () => { }); test("runs cleanup on abort", async () => { - await using run = createRunner(); + await using run = createRun(); let cleanedUp = false; @@ -2805,23 +2927,22 @@ describe("callback", () => { }); test("provides signal for abort-aware APIs", async () => { - await using run = createRunner(); + await using run = createRun(); let signalAbortedDuringTask = true; const task = callback(({ ok, signal }) => { signalAbortedDuringTask = signal.aborted; ok(); - return undefined; }); await run(task); expect(signalAbortedDuringTask).toBe(false); }); - test("provides RunnerDeps for testable time", async () => { + test("provides RunDeps for testable time", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); const task = callback(({ ok, deps: { time } }) => { const id = time.setTimeout(ok, "100ms"); @@ -2836,13 +2957,12 @@ describe("callback", () => { }); test("abort resolves immediately without waiting", async () => { - await using run = createRunner(); + await using run = createRun(); const start = Date.now(); const task = callback(() => { // Never resolves - return undefined; }); const fiber = run(task); @@ -2859,7 +2979,7 @@ describe("callback", () => { describe("sleep", () => { test("completes after duration", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); const fiber = run(sleep("100ms")); @@ -2870,7 +2990,7 @@ describe("sleep", () => { }); test("returns AbortError and clears timeout when aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const start = Date.now(); const fiber = run(sleep("1h")); @@ -2891,7 +3011,7 @@ describe("sleep", () => { describe("race", () => { test("returns first task to succeed and aborts others", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -2913,7 +3033,7 @@ describe("race", () => { }); test("returns first task to fail and aborts others", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -2939,7 +3059,7 @@ describe("race", () => { }); test("aborts others when one throws", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -2960,7 +3080,7 @@ describe("race", () => { }); test("infers union of Ok and Err types from heterogeneous tasks", async () => { - await using run = createRunner(); + await using run = createRun(); interface ErrorA extends Typed<"ErrorA"> {} interface ErrorB extends Typed<"ErrorB"> {} @@ -2978,7 +3098,7 @@ describe("race", () => { }); test("works with Iterable via isNonEmptyArray", async () => { - await using run = createRunner(); + await using run = createRun(); // Simulate tasks from an Iterable (e.g., Set, Map.values(), generator) const taskSet = new Set>([ @@ -3001,7 +3121,7 @@ describe("race", () => { // Not using `await using` because disposal waits for all fibers to complete, // including the unabortable loser (10s). We want to verify race() returns // promptly without blocking on unabortable tasks. - const run = createRunner(); + const run = createRun(); let loserCompleted = false; @@ -3023,7 +3143,7 @@ describe("race", () => { }); test("propagates external abort to all raced tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const task1ObservedAbort = Promise.withResolvers(); const task2ObservedAbort = Promise.withResolvers(); @@ -3062,7 +3182,7 @@ describe("race", () => { }); test("uses custom abortReason for losing tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -3086,7 +3206,7 @@ describe("race", () => { describe("timeout", () => { test("completes when task finishes before timeout", async () => { - await using run = createRunner(); + await using run = createRun(); const fast = () => ok(); @@ -3100,7 +3220,7 @@ describe("timeout", () => { test("returns TimeoutError when task exceeds duration", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); const slow = sleep("100ms"); @@ -3114,7 +3234,7 @@ describe("timeout", () => { test("aborts task when timeout fires", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); const abortReasonCapture = Promise.withResolvers(); @@ -3139,7 +3259,7 @@ describe("timeout", () => { test("uses custom abortReason when provided", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); const customReason = { type: "CustomTimeout" }; const abortReasonCapture = Promise.withResolvers(); @@ -3164,7 +3284,7 @@ describe("timeout", () => { test("returns TimeoutError immediately when unabortable task exceeds duration", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); let taskCompleted = false; const completionCapture = Promise.withResolvers(); @@ -3196,7 +3316,7 @@ describe("timeout", () => { describe("retry", () => { test("succeeds on first attempt", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task = () => { @@ -3211,7 +3331,7 @@ describe("retry", () => { }); test("succeeds after retries", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task = () => { @@ -3227,7 +3347,7 @@ describe("retry", () => { }); test("returns RetryError when all attempts exhausted", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task = () => { @@ -3249,7 +3369,7 @@ describe("retry", () => { }); test("returns RetryError not raw error (type test)", async () => { - await using run = createRunner(); + await using run = createRun(); const task: Task = () => err({ type: "MyError" }); const retried = retry(task, take(1)(spaced("1ms"))); @@ -3268,7 +3388,7 @@ describe("retry", () => { }); test("calls onRetry before each retry", async () => { - await using run = createRunner(); + await using run = createRun(); const retryLog: Array<{ error: MyError; @@ -3312,7 +3432,7 @@ describe("retry", () => { }); test("respects retryable predicate", async () => { - await using run = createRunner(); + await using run = createRun(); interface RetryableError extends Typed<"RetryableError"> {} interface NonRetryableError extends Typed<"NonRetryableError"> {} @@ -3343,7 +3463,7 @@ describe("retry", () => { }); test("never retries AbortError", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task = () => { @@ -3361,7 +3481,7 @@ describe("retry", () => { }); test("propagates abort to running task", async () => { - await using run = createRunner(); + await using run = createRun(); const taskStarted = Promise.withResolvers(); @@ -3384,7 +3504,7 @@ describe("retry", () => { }); test("uses exponential backoff schedule", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task = () => { @@ -3400,7 +3520,7 @@ describe("retry", () => { }); test("schedule can filter by error type", async () => { - await using run = createRunner(); + await using run = createRun(); interface RetryableError extends Typed<"RetryableError"> {} interface FatalError extends Typed<"FatalError"> {} @@ -3435,7 +3555,7 @@ describe("retry", () => { }); test("abort during retry delay returns AbortError", async () => { - await using run = createRunner(); + await using run = createRun(); let attempts = 0; const task: Task = () => { @@ -3462,7 +3582,7 @@ describe("retry", () => { describe("repeat", () => { test("runs task n+1 times with take(n)", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const task = () => { @@ -3478,7 +3598,7 @@ describe("repeat", () => { }); test("returns last successful value when schedule exhausted", async () => { - await using run = createRunner(); + await using run = createRun(); const values = ["first", "second", "third", "fourth"]; let index = 0; @@ -3491,7 +3611,7 @@ describe("repeat", () => { }); test("stops and returns error when task fails", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const task = () => { @@ -3507,7 +3627,7 @@ describe("repeat", () => { }); test("respects repeatable predicate", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const task = () => { @@ -3526,7 +3646,7 @@ describe("repeat", () => { }); test("calls onRepeat before each repeat", async () => { - await using run = createRunner(); + await using run = createRun(); const repeatLog: Array<{ value: number; @@ -3569,7 +3689,7 @@ describe("repeat", () => { }); test("can be aborted", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const task: Task = async () => { @@ -3592,7 +3712,7 @@ describe("repeat", () => { }); test("uses forever schedule when unlimited", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const task: Task = async () => { @@ -3623,7 +3743,7 @@ describe("repeat", () => { test("does not sleep when delay is zero", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); let count = 0; const task = () => { @@ -3639,7 +3759,7 @@ describe("repeat", () => { test("aborts while waiting between repeats", async () => { const time = testCreateTime(); - await using run = testCreateRunner({ time }); + await using run = testCreateRun({ time }); let count = 0; const task = () => { @@ -3658,7 +3778,7 @@ describe("repeat", () => { }); test("stops on Done from NextTask", async () => { - await using run = createRunner(); + await using run = createRun(); let count = 0; const next: NextTask = () => { @@ -3674,7 +3794,7 @@ describe("repeat", () => { }); test("processes queue until empty (NextTask pattern)", async () => { - await using run = createRunner(); + await using run = createRun(); const queue = [1, 2, 3]; const processed: Array = []; @@ -3729,8 +3849,8 @@ describe("DI", () => { }; }; - // Custom deps must extend RunnerDeps - type AppDeps = RunnerDeps & HttpDep & DbDep; + // Custom deps must extend RunDeps + type AppDeps = RunDeps & HttpDep & DbDep; // Tasks declare deps in type parameter D, access via run.deps const fetchUser = @@ -3747,7 +3867,7 @@ describe("DI", () => { return run(db.save(data)); }; - // Composition - deps flow through Runner automatically + // Composition - deps flow through Run automatically const syncUser = (id: string): Task => async (run) => { @@ -3760,14 +3880,14 @@ describe("DI", () => { const deps = testCreateDeps(); const http = createTestHttp({ "/users/1": "Alice" }); - await using run = createRunner({ ...deps, http }); + await using run = createRun({ ...deps, http }); const result = await run(fetchUser("1")); expect(result).toEqual(ok("Alice")); }); - test("createRunner with custom deps infers type from argument", async () => { + test("createRun with custom deps infers type from argument", async () => { interface Config { readonly apiUrl: string; } @@ -3780,10 +3900,10 @@ describe("DI", () => { const config: Config = { apiUrl: "https://api.example.com" }; const customDeps = { ...deps, config }; - await using run = createRunner(customDeps); + await using run = createRun(customDeps); // Type is inferred from argument - expectTypeOf(run).toEqualTypeOf>(); + expectTypeOf(run).toEqualTypeOf>(); const task: Task = (run) => ok(run.deps.config.apiUrl); @@ -3793,17 +3913,17 @@ describe("DI", () => { expect(result).toEqual(ok("https://api.example.com")); }); - test("createRunner without args returns Runner", async () => { - await using run = createRunner(); + test("createRun without args returns Run", async () => { + await using run = createRun(); - expectTypeOf(run).toEqualTypeOf>(); + expectTypeOf(run).toEqualTypeOf>(); }); - test("runner rejects task with missing deps", async () => { + test("run rejects task with missing deps", async () => { const task: Task = () => ok(); - await using run = createRunner(); + await using run = createRun(); - // @ts-expect-error Property 'http' is missing in type 'RunnerDeps'... + // @ts-expect-error Property 'http' is missing in type 'RunDeps'... run(task); }); @@ -3811,14 +3931,14 @@ describe("DI", () => { const deps = testCreateDeps(); const http = createTestHttp({ "/users/1": "Alice" }); - await using run = createRunner({ ...deps, http }); + await using run = createRun({ ...deps, http }); const fiber = run(fetchUser("1")); expectTypeOf(fiber).toEqualTypeOf< - Fiber + Fiber >(); - expectTypeOf(fiber.run).toEqualTypeOf>(); + expectTypeOf(fiber.run).toEqualTypeOf>(); const result = await fiber.run(fetchUser("1")); expect(result).toEqual(ok("Alice")); @@ -3829,7 +3949,7 @@ describe("DI", () => { const http = createTestHttp({ "/users/1": "Alice" }); const db = createTestDb(); - await using run = createRunner({ ...deps, http, db }); + await using run = createRun({ ...deps, http, db }); const result = await run(syncUser("1")); @@ -3885,9 +4005,9 @@ describe("DI", () => { const syncAllWithLogging: Task = withLogging("syncAll", syncUsers(["1", "2"])); - type AllDeps = RunnerDeps & HttpDep & DbDep & LoggerDep; + type AllDeps = RunDeps & HttpDep & DbDep & LoggerDep; - await using run = createRunner({ ...deps, http, db, logger }); + await using run = createRun({ ...deps, http, db, logger }); const result = await run(syncAllWithLogging); @@ -3900,7 +4020,7 @@ describe("DI", () => { const deps = testCreateDeps(); const http = createTestHttp({ "/users/1": "Alice" }); - await using run = createRunner({ ...deps, http }); + await using run = createRun({ ...deps, http }); // timeout should preserve D from wrapped task const fetchWithTimeout = timeout(fetchUser("1"), "5s"); @@ -3915,7 +4035,7 @@ describe("DI", () => { "/users/1": "Alice", "/users/2": "Bob", }); - await using run = createRunner({ ...deps, http }); + await using run = createRun({ ...deps, http }); // race should preserve D from all tasks const result = await run(race([fetchUser("1"), fetchUser("2")])); @@ -3947,12 +4067,11 @@ describe("DI", () => { () => { attempts++; if (attempts < 3) return err({ type: "NetworkError" }); - // biome-ignore lint/style/noNonNullAssertion: Test utility return ok(url.split("/").pop()!); }, }; - await using run = createRunner({ + await using run = createRun({ ...deps, http, time: createTime(), @@ -3977,7 +4096,7 @@ describe("DI", () => { describe("concurrency", () => { describe("parallel", () => { test("defaults to max concurrency when passed only a task", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -3995,7 +4114,6 @@ describe("concurrency", () => { parallel(all([createTask(1), createTask(2), createTask(3)])), ); - await Promise.resolve(); expect(events).toEqual(["start 1", "start 2", "start 3"]); canFinish.resolve(); @@ -4005,7 +4123,7 @@ describe("concurrency", () => { }); test("inherits concurrency", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -4038,7 +4156,7 @@ describe("concurrency", () => { }); test("nested parallel overrides parent", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -4074,7 +4192,7 @@ describe("concurrency", () => { }); test("default concurrency is sequential", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -4104,7 +4222,7 @@ describe("concurrency", () => { }); test("abort propagates to all tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -4143,7 +4261,7 @@ describe("concurrency", () => { // Not using `await using` because disposal waits for all fibers to complete, // including the unabortable task (10s). We want to verify all() returns // promptly on error without blocking on unabortable tasks. - const run = createRunner(); + const run = createRun(); let unabortableCompleted = false; @@ -4169,7 +4287,7 @@ describe("concurrency", () => { describe("Deferred", () => { test("resolves with ok", async () => { - await using run = createRunner(); + await using run = createRun(); const { task, resolve } = createDeferred(); @@ -4181,7 +4299,7 @@ describe("concurrency", () => { }); test("resolves with error", async () => { - await using run = createRunner(); + await using run = createRun(); const { task, resolve } = createDeferred(); @@ -4193,7 +4311,7 @@ describe("concurrency", () => { }); test("resolves with AbortError when fiber aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const { task } = createDeferred(); @@ -4212,7 +4330,7 @@ describe("concurrency", () => { }); test("resolve still works after fiber abort", async () => { - await using run = createRunner(); + await using run = createRun(); const { task, resolve } = createDeferred(); @@ -4227,7 +4345,7 @@ describe("concurrency", () => { }); test("aborting one does not affect other", async () => { - await using run = createRunner(); + await using run = createRun(); const { task, resolve } = createDeferred(); @@ -4255,7 +4373,7 @@ describe("concurrency", () => { }); test("dispose aborts waiting fibers", async () => { - await using run = createRunner(); + await using run = createRun(); const deferred = createDeferred(); @@ -4272,7 +4390,7 @@ describe("concurrency", () => { }); test("task returns immediately when already resolved", async () => { - await using run = createRunner(); + await using run = createRun(); const { task, resolve } = createDeferred(); @@ -4356,7 +4474,7 @@ describe("concurrency", () => { describe("Gate", () => { test("wait blocks until gate is opened", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); const events: Array = []; @@ -4381,7 +4499,7 @@ describe("concurrency", () => { }); test("wait returns immediately when gate is already open", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); gate.open(); @@ -4392,7 +4510,7 @@ describe("concurrency", () => { }); test("multiple tasks proceed when gate opens", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); const events: Array = []; @@ -4428,7 +4546,7 @@ describe("concurrency", () => { }); test("close makes future tasks wait", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); const events: Array = []; @@ -4458,7 +4576,7 @@ describe("concurrency", () => { }); test("abort while waiting returns AbortError", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); @@ -4482,7 +4600,7 @@ describe("concurrency", () => { }); test("dispose aborts waiting tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); @@ -4545,7 +4663,7 @@ describe("concurrency", () => { }); test("wait returns DeferredDisposedError after dispose", async () => { - await using run = createRunner(); + await using run = createRun(); const gate = createGate(); gate[Symbol.dispose](); @@ -4557,8 +4675,20 @@ describe("concurrency", () => { }); describe("Semaphore", () => { + test("snapshot exposes initial state", () => { + const semaphore = createSemaphore(2); + + expect(semaphore.snapshot()).toEqual({ + permits: 2, + taken: 0, + waiting: 0, + available: 2, + disposed: false, + }); + }); + test("runs a task", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); @@ -4567,82 +4697,230 @@ describe("concurrency", () => { expect(result).toEqual(ok("ran")); }); - test("limits concurrent tasks to permit count", async () => { - await using run = createRunner(); - - const semaphore = createSemaphore(2); - const events: Array = []; + test("withPermits acquires multiple permits", async () => { + await using run = createRun(); - const task1Started = Promise.withResolvers(); - const task2Started = Promise.withResolvers(); + const semaphore = createSemaphore(3); + const started = Promise.withResolvers(); const canFinish = Promise.withResolvers(); - const createTask = - (id: number, started: () => void): Task => - async () => { - events.push(`start ${id}`); - started(); + const fiber = run( + semaphore.withPermits(2)(async () => { + started.resolve(); await canFinish.promise; - events.push(`end ${id}`); return ok(); - }; - - // Start 3 tasks with 2 permits - const fiber1 = run( - semaphore.withPermit(createTask(1, task1Started.resolve)), - ); - const fiber2 = run( - semaphore.withPermit(createTask(2, task2Started.resolve)), + }), ); - await task1Started.promise; - await task2Started.promise; + await started.promise; + expect(semaphore.snapshot()).toEqual({ + permits: 3, + taken: 2, + waiting: 0, + available: 1, + disposed: false, + }); - // Third task should be queued - const task3Started = Promise.withResolvers(); - const fiber3 = run( - semaphore.withPermit(createTask(3, task3Started.resolve)), - ); + canFinish.resolve(); + await fiber; - await Promise.resolve(); - expect(events).toEqual(["start 1", "start 2"]); + expect(semaphore.snapshot()).toEqual({ + permits: 3, + taken: 0, + waiting: 0, + available: 3, + disposed: false, + }); + }); - // Let task 1 finish - canFinish.resolve(); - await fiber1; + test("withPermits rejects requests larger than capacity", async () => { + await using run = createRun(); - // Now task 3 should start - await task3Started.promise; - expect(events).toContain("start 3"); + const semaphore = createSemaphore(1); - await Promise.all([fiber2, fiber3]); + await expect( + run(semaphore.withPermits(PositiveInt.orThrow(2))(() => ok())), + ).rejects.toThrow("Requested permits must not exceed semaphore capacity"); }); - test("queues tasks when permits exhausted", async () => { - await using run = createRunner(); + test("strict FIFO blocks smaller waiter behind larger head waiter", async () => { + await using run = createRun(); - const semaphore = createSemaphore(1); + const semaphore = createSemaphore(3); + const holderCanFinish = Promise.withResolvers(); + const holderStarted = Promise.withResolvers(); const events: Array = []; - const task1Started = Promise.withResolvers(); - const task1CanFinish = Promise.withResolvers(); - - const fiber1 = run( - semaphore.withPermit(async () => { - events.push("start 1"); - task1Started.resolve(); - await task1CanFinish.promise; - events.push("end 1"); + const holder = run( + semaphore.withPermits(PositiveInt.orThrow(2))(async () => { + holderStarted.resolve(); + await holderCanFinish.promise; + events.push("holder done"); return ok(); }), ); - await task1Started.promise; + await holderStarted.promise; - // Second task should wait - const fiber2 = run( - semaphore.withPermit(() => { - events.push("task 2 ran"); + const largeWaiter = run( + semaphore.withPermits(PositiveInt.orThrow(2))(() => { + events.push("large waiter ran"); + return ok(); + }), + ); + + const smallWaiter = run( + semaphore.withPermits(PositiveInt.orThrow(1))(() => { + events.push("small waiter ran"); + return ok(); + }), + ); + + await Promise.resolve(); + + // No waiter can run yet: only 1 permit free, head waiter needs 2. + expect(events).toEqual([]); + expect(semaphore.snapshot()).toEqual({ + permits: 3, + taken: 2, + waiting: 2, + available: 1, + disposed: false, + }); + + holderCanFinish.resolve(); + + await Promise.all([holder, largeWaiter, smallWaiter]); + expect(events).toEqual([ + "holder done", + "large waiter ran", + "small waiter ran", + ]); + }); + + test("snapshot reflects taken and waiting counts", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + const canFinish = Promise.withResolvers(); + const started = Promise.withResolvers(); + + const fiber1 = run( + semaphore.withPermit(async () => { + started.resolve(); + await canFinish.promise; + return ok(); + }), + ); + + await started.promise; + expect(semaphore.snapshot()).toEqual({ + permits: 1, + taken: 1, + waiting: 0, + available: 0, + disposed: false, + }); + + const fiber2 = run(semaphore.withPermit(() => ok())); + await Promise.resolve(); + + expect(semaphore.snapshot()).toEqual({ + permits: 1, + taken: 1, + waiting: 1, + available: 0, + disposed: false, + }); + + canFinish.resolve(); + await Promise.all([fiber1, fiber2]); + + expect(semaphore.snapshot()).toEqual({ + permits: 1, + taken: 0, + waiting: 0, + available: 1, + disposed: false, + }); + }); + + test("limits concurrent tasks to permit count", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(2); + const events: Array = []; + + const task1Started = Promise.withResolvers(); + const task2Started = Promise.withResolvers(); + const canFinish = Promise.withResolvers(); + + const createTask = + (id: number, started: () => void): Task => + async () => { + events.push(`start ${id}`); + started(); + await canFinish.promise; + events.push(`end ${id}`); + return ok(); + }; + + // Start 3 tasks with 2 permits + const fiber1 = run( + semaphore.withPermit(createTask(1, task1Started.resolve)), + ); + const fiber2 = run( + semaphore.withPermit(createTask(2, task2Started.resolve)), + ); + + await task1Started.promise; + await task2Started.promise; + + // Third task should be queued + const task3Started = Promise.withResolvers(); + const fiber3 = run( + semaphore.withPermit(createTask(3, task3Started.resolve)), + ); + + await Promise.resolve(); + expect(events).toEqual(["start 1", "start 2"]); + + // Let task 1 finish + canFinish.resolve(); + await fiber1; + + // Now task 3 should start + await task3Started.promise; + expect(events).toContain("start 3"); + + await Promise.all([fiber2, fiber3]); + }); + + test("queues tasks when permits exhausted", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + const events: Array = []; + + const task1Started = Promise.withResolvers(); + const task1CanFinish = Promise.withResolvers(); + + const fiber1 = run( + semaphore.withPermit(async () => { + events.push("start 1"); + task1Started.resolve(); + await task1CanFinish.promise; + events.push("end 1"); + return ok(); + }), + ); + + await task1Started.promise; + + // Second task should wait + const fiber2 = run( + semaphore.withPermit(() => { + events.push("task 2 ran"); return ok(); }), ); @@ -4659,7 +4937,7 @@ describe("concurrency", () => { }); test("returns task result", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); @@ -4673,7 +4951,7 @@ describe("concurrency", () => { }); test("releases permit when task succeeds", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); @@ -4693,7 +4971,7 @@ describe("concurrency", () => { }); test("releases permit when task fails", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); @@ -4712,8 +4990,71 @@ describe("concurrency", () => { expect(secondRan).toBe(true); }); + test("releases permit when task throws", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + + await expect( + run( + semaphore.withPermit(() => { + throw new Error("boom"); + }), + ), + ).rejects.toThrow("boom"); + + const afterThrow = await run(semaphore.withPermit(() => ok("after"))); + expect(afterThrow).toEqual(ok("after")); + }); + + test("releases permit when task rejects", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + + await expect( + run(semaphore.withPermit(() => Promise.reject(new Error("rejected")))), + ).rejects.toThrow("rejected"); + + const afterReject = await run(semaphore.withPermit(() => ok("after"))); + expect(afterReject).toEqual(ok("after")); + }); + + test("releases permit when task start throws before fiber exists", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + + let restoreFromInner: + | ((task: Task) => Task) + | undefined; + + const setup = unabortableMask( + (_restore1) => async (run) => + await run( + unabortableMask((restore2) => () => { + restoreFromInner = restore2; + return ok(); + }), + ), + ); + + expect(await run(setup)).toEqual(ok()); + expect(restoreFromInner).toBeDefined(); + + await expect( + run(semaphore.withPermit(restoreFromInner!(() => ok()))), + ).rejects.toThrow("restore used outside its unabortableMask"); + + expect(await run(semaphore.withPermit(() => ok("after-throw")))).toEqual( + ok("after-throw"), + ); + + semaphore[Symbol.dispose](); + }); + test("abort while waiting removes from queue", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); const events: Array = []; @@ -4763,7 +5104,7 @@ describe("concurrency", () => { }); test("abort while running aborts task", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); let abortReceived = false; @@ -4787,8 +5128,32 @@ describe("concurrency", () => { expect(result).toEqual(err({ type: "AbortError", reason: "stop" })); }); + test("releases permit when running task is aborted", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(1); + + const fiber = run( + semaphore.withPermit( + callback(({ ok, signal }) => { + signal.addEventListener("abort", () => ok(undefined), { + once: true, + }); + }), + ), + ); + + await Promise.resolve(); + fiber.abort("stop"); + + expect(await fiber).toEqual(err({ type: "AbortError", reason: "stop" })); + + const afterAbort = await run(semaphore.withPermit(() => ok("after"))); + expect(afterAbort).toEqual(ok("after")); + }); + test("dispose aborts running tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); const events: Array = []; @@ -4823,7 +5188,7 @@ describe("concurrency", () => { }); test("dispose aborts waiting tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); @@ -4867,8 +5232,68 @@ describe("concurrency", () => { ); }); + test("dispose still aborts other tasks when one abort path throws", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(2); + let secondTaskAborted = false; + + const started1 = Promise.withResolvers(); + const started2 = Promise.withResolvers(); + + const fiber1 = run( + semaphore.withPermit(({ signal }) => { + started1.resolve(); + return new Promise>((resolve) => { + signal.addEventListener("abort", () => { + resolve(err({ type: "AbortError", reason: signal.reason })); + }); + }); + }), + ); + + const fiber2 = run( + semaphore.withPermit(({ signal }) => { + started2.resolve(); + return new Promise>((resolve) => { + signal.addEventListener("abort", () => { + secondTaskAborted = true; + resolve(err({ type: "AbortError", reason: signal.reason })); + }); + }); + }), + ); + + await Promise.all([started1.promise, started2.promise]); + + const originalAbort = fiber1.abort.bind(fiber1); + (fiber1 as { abort: (reason?: unknown) => void }).abort = (reason) => { + originalAbort(reason); + throw new Error("abort failed"); + }; + + expect(() => { + semaphore[Symbol.dispose](); + }).not.toThrow(); + + const [result1, result2] = await Promise.all([fiber1, fiber2]); + expect(secondTaskAborted).toBe(true); + expect(result1).toEqual( + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ); + expect(result2).toEqual( + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ); + }); + test("acquire after dispose returns SemaphoreDisposedError", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); semaphore[Symbol.dispose](); @@ -4896,7 +5321,7 @@ describe("concurrency", () => { }); test("preserves FIFO order for queued tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const semaphore = createSemaphore(1); const events: Array = []; @@ -4942,42 +5367,526 @@ describe("concurrency", () => { expect(events).toEqual(["task 1", "task 2", "task 3", "task 4"]); }); - test("multiple permits allow concurrent execution", async () => { - await using run = createRunner(); + test("multiple permits allow concurrent execution", async () => { + await using run = createRun(); + + const semaphore = createSemaphore(3); + let concurrent = 0; + let maxConcurrent = 0; + + const taskFinished = Promise.withResolvers(); + let finishedCount = 0; + + const createTask = (): Task => async () => { + concurrent += 1; + maxConcurrent = Math.max(maxConcurrent, concurrent); + await Promise.resolve(); + concurrent -= 1; + finishedCount += 1; + if (finishedCount === 5) taskFinished.resolve(); + return ok(); + }; + + // Run 5 tasks with 3 permits + run(semaphore.withPermit(createTask())); + run(semaphore.withPermit(createTask())); + run(semaphore.withPermit(createTask())); + run(semaphore.withPermit(createTask())); + run(semaphore.withPermit(createTask())); + + await taskFinished.promise; + + expect(maxConcurrent).toBe(3); + }); + }); + + describe("SemaphoreByKey", () => { + test("runs tasks independently for different keys", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a" | "b">(1); + const started: Array = []; + const canFinishA = Promise.withResolvers(); + const canFinishB = Promise.withResolvers(); + + const fiberA = run( + semaphoreByKey.withPermit("a", async () => { + started.push("a"); + await canFinishA.promise; + return ok(); + }), + ); + + const fiberB = run( + semaphoreByKey.withPermit("b", async () => { + started.push("b"); + await canFinishB.promise; + return ok(); + }), + ); + + await Promise.resolve(); + expect(started.sort()).toEqual(["a", "b"]); + + canFinishA.resolve(); + canFinishB.resolve(); + await Promise.all([fiberA, fiberB]); + }); + + test("serializes tasks for the same key", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + const events: Array = []; + const firstCanFinish = Promise.withResolvers(); + const firstStarted = Promise.withResolvers(); + + const fiber1 = run( + semaphoreByKey.withPermit("a", async () => { + events.push("start 1"); + firstStarted.resolve(); + await firstCanFinish.promise; + events.push("end 1"); + return ok(); + }), + ); + + await firstStarted.promise; + + const fiber2 = run( + semaphoreByKey.withPermit("a", () => { + events.push("task 2"); + return ok(); + }), + ); + + await Promise.resolve(); + expect(events).toEqual(["start 1"]); + + firstCanFinish.resolve(); + await Promise.all([fiber1, fiber2]); + + expect(events).toEqual(["start 1", "end 1", "task 2"]); + }); + + test("snapshot is removed when key becomes idle", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(2); + + expect(semaphoreByKey.snapshot("a")).toBeNull(); + + const result = await run(semaphoreByKey.withPermit("a", () => ok())); + expect(result).toEqual(ok()); + + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("snapshot returns state while key is active", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + const release = Promise.withResolvers(); + const started = Promise.withResolvers(); + + const fiber = run( + semaphoreByKey.withPermit("a", async () => { + started.resolve(); + await release.promise; + return ok(); + }), + ); + + await started.promise; + + expect(semaphoreByKey.snapshot("a")).toEqual({ + permits: 1, + taken: 1, + waiting: 0, + available: 0, + disposed: false, + }); + + release.resolve(); + await fiber; + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("keeps key alive when next waiter acquires permit", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + const firstCanFinish = Promise.withResolvers(); + const secondCanFinish = Promise.withResolvers(); + const firstStarted = Promise.withResolvers(); + const secondStarted = Promise.withResolvers(); + + const first = run( + semaphoreByKey.withPermit("a", async () => { + firstStarted.resolve(); + await firstCanFinish.promise; + return ok(); + }), + ); + + await firstStarted.promise; + + const second = run( + semaphoreByKey.withPermit("a", async () => { + secondStarted.resolve(); + await secondCanFinish.promise; + return ok(); + }), + ); + + await Promise.resolve(); + firstCanFinish.resolve(); + + await secondStarted.promise; + await first; + + expect(semaphoreByKey.snapshot("a")).toEqual({ + permits: 1, + taken: 1, + waiting: 0, + available: 0, + disposed: false, + }); + + secondCanFinish.resolve(); + await second; + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("removes key when task throws", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + + await expect( + run( + semaphoreByKey.withPermit("a", () => { + throw new Error("boom"); + }), + ), + ).rejects.toThrow("boom"); + + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("removes key when task rejects", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + + await expect( + run( + semaphoreByKey.withPermit("a", () => + Promise.reject(new Error("rejected")), + ), + ), + ).rejects.toThrow("rejected"); + + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("removes key when running task is aborted", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + + const fiber = run( + semaphoreByKey.withPermit( + "a", + callback(({ ok, signal }) => { + signal.addEventListener("abort", () => ok(undefined), { + once: true, + }); + }), + ), + ); + + await Promise.resolve(); + expect(semaphoreByKey.snapshot("a")).not.toBeNull(); + + fiber.abort("stop"); + const result = await fiber; + + expect(result).toEqual(err({ type: "AbortError", reason: "stop" })); + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("removes key after waiting task is aborted", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + const firstCanFinish = Promise.withResolvers(); + const firstStarted = Promise.withResolvers(); + + const first = run( + semaphoreByKey.withPermit("a", async () => { + firstStarted.resolve(); + await firstCanFinish.promise; + return ok(); + }), + ); + + await firstStarted.promise; + + const waiting = run(semaphoreByKey.withPermit("a", () => ok())); + await Promise.resolve(); + + expect(semaphoreByKey.snapshot("a")).toEqual({ + permits: 1, + taken: 1, + waiting: 1, + available: 0, + disposed: false, + }); + + waiting.abort("cancel waiting"); + const waitingResult = await waiting; + expect(waitingResult).toEqual( + err({ type: "AbortError", reason: "cancel waiting" }), + ); + + expect(semaphoreByKey.snapshot("a")).toEqual({ + permits: 1, + taken: 1, + waiting: 0, + available: 0, + disposed: false, + }); + + firstCanFinish.resolve(); + await first; + + expect(semaphoreByKey.snapshot("a")).toBeNull(); + }); + + test("dispose aborts keyed semaphores and future acquire fails", async () => { + await using run = createRun(); + + const semaphoreByKey = createSemaphoreByKey<"a">(1); + + const runningFiber = run( + semaphoreByKey.withPermit( + "a", + callback(({ ok, signal }) => { + signal.addEventListener("abort", () => ok(undefined), { + once: true, + }); + }), + ), + ); + + const waitingFiber = run(semaphoreByKey.withPermit("a", () => ok())); + + await Promise.resolve(); + + semaphoreByKey[Symbol.dispose](); + semaphoreByKey[Symbol.dispose](); + + await expect(Promise.all([runningFiber, waitingFiber])).resolves.toEqual([ + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ]); + + const afterDispose = await run( + semaphoreByKey.withPermit("a", () => ok()), + ); + + expect(afterDispose).toEqual( + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ); + }); + }); + + describe("MutexByKey", () => { + test("runs tasks independently for different keys", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a" | "b">(); + const started: Array = []; + const canFinishA = Promise.withResolvers(); + const canFinishB = Promise.withResolvers(); + + const fiberA = run( + mutexByKey.withLock("a", async () => { + started.push("a"); + await canFinishA.promise; + return ok(); + }), + ); + + const fiberB = run( + mutexByKey.withLock("b", async () => { + started.push("b"); + await canFinishB.promise; + return ok(); + }), + ); + + await Promise.resolve(); + expect(started.sort()).toEqual(["a", "b"]); + + canFinishA.resolve(); + canFinishB.resolve(); + await Promise.all([fiberA, fiberB]); + }); + + test("serializes tasks for the same key", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a">(); + const events: Array = []; + const firstCanFinish = Promise.withResolvers(); + const firstStarted = Promise.withResolvers(); + + const fiber1 = run( + mutexByKey.withLock("a", async () => { + events.push("start 1"); + firstStarted.resolve(); + await firstCanFinish.promise; + events.push("end 1"); + return ok(); + }), + ); + + await firstStarted.promise; + + const fiber2 = run( + mutexByKey.withLock("a", () => { + events.push("task 2"); + return ok(); + }), + ); + + await Promise.resolve(); + expect(events).toEqual(["start 1"]); + + firstCanFinish.resolve(); + await Promise.all([fiber1, fiber2]); + + expect(events).toEqual(["start 1", "end 1", "task 2"]); + }); + + test("releases lock when task throws", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a">(); + + await expect( + run( + mutexByKey.withLock("a", () => { + throw new Error("boom"); + }), + ), + ).rejects.toThrow("boom"); + + const afterThrow = await run(mutexByKey.withLock("a", () => ok("after"))); + expect(afterThrow).toEqual(ok("after")); + }); + + test("releases lock when task rejects", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a">(); + + await expect( + run( + mutexByKey.withLock("a", () => Promise.reject(new Error("rejected"))), + ), + ).rejects.toThrow("rejected"); + + const afterReject = await run( + mutexByKey.withLock("a", () => ok("after")), + ); + expect(afterReject).toEqual(ok("after")); + }); + + test("releases lock when running task is aborted", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a">(); + + const fiber = run( + mutexByKey.withLock( + "a", + callback(({ ok, signal }) => { + signal.addEventListener("abort", () => ok(undefined), { + once: true, + }); + }), + ), + ); + + await Promise.resolve(); + fiber.abort("stop"); + + expect(await fiber).toEqual(err({ type: "AbortError", reason: "stop" })); + + const afterAbort = await run(mutexByKey.withLock("a", () => ok("after"))); + expect(afterAbort).toEqual(ok("after")); + }); + + test("dispose aborts keyed locks and future acquire fails", async () => { + await using run = createRun(); + + const mutexByKey = createMutexByKey<"a">(); + + const runningFiber = run( + mutexByKey.withLock( + "a", + callback(({ ok, signal }) => { + signal.addEventListener("abort", () => ok(undefined), { + once: true, + }); + }), + ), + ); - const semaphore = createSemaphore(3); - let concurrent = 0; - let maxConcurrent = 0; + const waitingFiber = run(mutexByKey.withLock("a", () => ok())); - const taskFinished = Promise.withResolvers(); - let finishedCount = 0; + await Promise.resolve(); - const createTask = (): Task => async () => { - concurrent += 1; - maxConcurrent = Math.max(maxConcurrent, concurrent); - await Promise.resolve(); - concurrent -= 1; - finishedCount += 1; - if (finishedCount === 5) taskFinished.resolve(); - return ok(); - }; + mutexByKey[Symbol.dispose](); + mutexByKey[Symbol.dispose](); - // Run 5 tasks with 3 permits - run(semaphore.withPermit(createTask())); - run(semaphore.withPermit(createTask())); - run(semaphore.withPermit(createTask())); - run(semaphore.withPermit(createTask())); - run(semaphore.withPermit(createTask())); + await expect(Promise.all([runningFiber, waitingFiber])).resolves.toEqual([ + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ]); - await taskFinished.promise; + const afterDispose = await run(mutexByKey.withLock("a", () => ok())); - expect(maxConcurrent).toBe(3); + expect(afterDispose).toEqual( + err({ + type: "AbortError", + reason: { type: "SemaphoreDisposedError" }, + }), + ); }); }); describe("Mutex", () => { test("runs tasks sequentially", async () => { - await using run = createRunner(); + await using run = createRun(); const mutex = createMutex(); const events: Array = []; @@ -5020,6 +5929,399 @@ describe("concurrency", () => { }); }); + interface PrefixDep { + readonly prefix: string; + } + + interface TaskTestInstance extends AsyncDisposable { + id: string; + disposed: boolean; + } + + const testCreateTaskInstance = ( + id: string, + onDispose?: () => void | Promise, + ): TaskTestInstance => ({ + id, + disposed: false, + [Symbol.asyncDispose]: async function () { + this.disposed = true; + await Promise.resolve(); + if (onDispose) await onDispose(); + }, + }); + + describe("TaskInstances", () => { + test("ensures instance from task create and reuses it with cache-hit task", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const instance1 = await run.orThrow( + instances.ensure("k", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + let cacheHitCount = 0; + const instance2 = await run.orThrow( + instances.ensure( + "k", + () => ok(testCreateTaskInstance("should-not-create")), + (instance) => + ({ deps }) => { + cacheHitCount++; + instance.id = `${deps.prefix}-updated`; + return ok(); + }, + ), + ); + + expect(instance1).toBe(instance2); + expect(instance2.id).toBe("dep-updated"); + expect(cacheHitCount).toBe(1); + }); + + test("ensure returns create error and does not register instance", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const result = await run( + instances.ensure("k", () => err({ type: "MyError" })), + ); + + expect(result).toEqual(err({ type: "MyError" })); + expect(instances.has("k")).toBe(false); + expect(instances.get("k")).toBeNull(); + }); + + test("ensure returns cache-hit error and keeps existing instance", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const created = await run.orThrow( + instances.ensure("k", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + const result = await run( + instances.ensure( + "k", + () => ok(testCreateTaskInstance("should-not-create")), + () => () => err({ type: "MyError" }), + ), + ); + + expect(result).toEqual(err({ type: "MyError" })); + expect(instances.get("k")).toBe(created); + expect(instances.has("k")).toBe(true); + }); + + test("get and has reflect registry state", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + expect(instances.has("missing")).toBe(false); + expect(instances.get("missing")).toBeNull(); + + await run.orThrow( + instances.ensure("k", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + expect(instances.has("k")).toBe(true); + const existing = instances.get("k"); + expect(existing?.id).toBe("dep-1"); + }); + + test("serializes concurrent ensure for same key with mutex", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const canFinishFirstCreate = Promise.withResolvers(); + const events: Array = []; + + const firstEnsure = run( + instances.ensure("k", async ({ deps }) => { + events.push("create-1-start"); + await canFinishFirstCreate.promise; + events.push("create-1-end"); + + return ok(testCreateTaskInstance(`${deps.prefix}-1`)); + }), + ); + + const secondEnsure = run( + instances.ensure( + "k", + () => { + events.push("create-2"); + return ok(testCreateTaskInstance("should-not-create")); + }, + () => () => { + events.push("cache-hit"); + return ok(); + }, + ), + ); + + await Promise.resolve(); + expect(events).toEqual(["create-1-start"]); + + canFinishFirstCreate.resolve(); + + const [firstResult, secondResult] = await Promise.all([ + firstEnsure, + secondEnsure, + ]); + + expect(firstResult.ok).toBe(true); + expect(secondResult.ok).toBe(true); + expect(events).toEqual(["create-1-start", "create-1-end", "cache-hit"]); + }); + + test("delete disposes instance and returns false on repeated delete", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const instance = await run.orThrow( + instances.ensure("k", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + const deleted = await run.orThrow(instances.delete("k")); + + expect(deleted).toBe(true); + expect(instance.disposed).toBe(true); + expect(instances.has("k")).toBe(false); + + expect(await run.orThrow(instances.delete("k"))).toBe(false); + }); + + test("delete returns false when key has never been ensured", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + expect(await run.orThrow(instances.delete("missing"))).toBe(false); + }); + + test("reuses existing instance without onCacheHit and deletes", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const created = await run.orThrow( + instances.ensure("k", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + const reused = await run.orThrow( + instances.ensure("k", () => + ok(testCreateTaskInstance("should-not-create")), + ), + ); + + expect(reused).toBe(created); + + expect(await run.orThrow(instances.delete("k"))).toBe(true); + expect(created.disposed).toBe(true); + }); + + test("Symbol.asyncDispose disposes all instances", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const instance1 = await run.orThrow( + instances.ensure("k1", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-1`)), + ), + ); + + const instance2 = await run.orThrow( + instances.ensure("k2", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-2`)), + ), + ); + + await instances[Symbol.asyncDispose](); + + expect(instance1.disposed).toBe(true); + expect(instance2.disposed).toBe(true); + expect(instances.has("k1")).toBe(false); + expect(instances.has("k2")).toBe(false); + }); + + test("Symbol.asyncDispose disposes instances in LIFO order", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + const events: Array = []; + + await run.orThrow( + instances.ensure("k1", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-1`, () => { + events.push("dispose 1"); + }), + ), + ), + ); + + await run.orThrow( + instances.ensure("k2", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-2`, () => { + events.push("dispose 2"); + }), + ), + ), + ); + + await run.orThrow( + instances.ensure("k3", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-3`, () => { + events.push("dispose 3"); + }), + ), + ), + ); + + await instances[Symbol.asyncDispose](); + + expect(events).toEqual(["dispose 3", "dispose 2", "dispose 1"]); + }); + + test("Symbol.asyncDispose throws single error when one disposal fails", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + await run.orThrow( + instances.ensure("k1", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-1`, () => { + throw new Error("single async dispose error"); + }), + ), + ), + ); + + await run.orThrow( + instances.ensure("k2", ({ deps }) => + ok(testCreateTaskInstance(`${deps.prefix}-2`)), + ), + ); + + await expect(instances[Symbol.asyncDispose]()).rejects.toThrow( + "single async dispose error", + ); + }); + + test("Symbol.asyncDispose throws SuppressedError when multiple disposals fail", async () => { + await using run = testCreateRun({ prefix: "dep" }); + const instances = createTaskInstances< + string, + TaskTestInstance, + PrefixDep + >(); + + await run.orThrow( + instances.ensure("k1", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-1`, () => { + throw new Error("error 1"); + }), + ), + ), + ); + + await run.orThrow( + instances.ensure("k2", ({ deps }) => + ok( + testCreateTaskInstance(`${deps.prefix}-2`, () => { + throw new Error("error 2"); + }), + ), + ), + ); + + const SuppressedErrorCtor = ( + globalThis as { + readonly SuppressedError?: new ( + error: unknown, + suppressed: unknown, + message?: string, + ) => Error; + } + ).SuppressedError; + expect(SuppressedErrorCtor).toBeDefined(); + if (SuppressedErrorCtor == null) return; + + try { + await instances[Symbol.asyncDispose](); + expect.fail("Should have thrown"); + } catch (error) { + expect(error).toBeInstanceOf(SuppressedErrorCtor); + + const suppressedError = error as { + readonly error: unknown; + readonly suppressed: unknown; + }; + + expect(suppressedError.error).toBeInstanceOf(Error); + expect(suppressedError.suppressed).toBeInstanceOf(Error); + expect((suppressedError.error as Error).message).toBe("error 1"); + expect((suppressedError.suppressed as Error).message).toBe("error 2"); + } + }); + }); + describe("createInMemoryLeaderLock", () => { test("acquire waits until previous lease is disposed", async () => { await using run = createRun(); @@ -5065,35 +6367,12 @@ describe("concurrency", () => { if (a.ok) a.value[Symbol.dispose](); if (b.ok) b.value[Symbol.dispose](); }); - - test("aborted waiter does not keep lock held", async () => { - await using run = createRun(); - const leaderLock = createInMemoryLeaderLock(); - - const first = await run(leaderLock.acquire(testName)); - expect(first.ok).toBe(true); - if (!first.ok) return; - - const waiting = run(leaderLock.acquire(testName)); - await run(yieldNow); - - waiting.abort("cancelled"); - await expect(waiting).resolves.toEqual( - err({ type: "AbortError", reason: "cancelled" }), - ); - - first.value[Symbol.dispose](); - - const next = await run(timeout(leaderLock.acquire(testName), "100ms")); - expect(next.ok).toBe(true); - if (next.ok) next.value[Symbol.dispose](); - }); }); }); describe("all", () => { test("runs tasks sequentially by default", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5122,7 +6401,7 @@ describe("all", () => { }); test("returns emptyArray for empty array", async () => { - await using run = createRunner(); + await using run = createRun(); const emptyTasks: Array> = []; const result = await run(all(emptyTasks)); @@ -5131,7 +6410,7 @@ describe("all", () => { }); test("returns emptyRecord for empty record", async () => { - await using run = createRunner(); + await using run = createRun(); const emptyTasks: Record> = {}; const result = await run(all(emptyTasks)); @@ -5140,7 +6419,7 @@ describe("all", () => { }); test("fails fast on first error", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFail = Promise.withResolvers(); @@ -5170,7 +6449,6 @@ describe("all", () => { const fiber = run(parallel(all([slowTask, failingTask]))); - await Promise.resolve(); expect(events).toEqual(["slow start", "fail start"]); // Let failing task fail @@ -5184,7 +6462,7 @@ describe("all", () => { }); test("aborts others when a task throws", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -5210,7 +6488,7 @@ describe("all", () => { }); test("propagates abort cause to other tasks", async () => { - await using run = createRunner(); + await using run = createRun(); const abortCause = { type: "TestAbort" }; const causes: Array = []; @@ -5237,7 +6515,7 @@ describe("all", () => { }); test("limits concurrency with explicit number", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -5259,7 +6537,6 @@ describe("all", () => { ); // Only 2 tasks should start - await Promise.resolve(); expect(events).toEqual(["start 1", "start 2"]); canFinish.resolve(); @@ -5271,7 +6548,7 @@ describe("all", () => { }); test("supports struct input and returns object with same keys", async () => { - await using run = createRunner(); + await using run = createRun(); const taskA: Task = () => ok(42); const taskB: Task = () => ok("hello"); @@ -5283,7 +6560,7 @@ describe("all", () => { }); test("struct preserves types", async () => { - await using run = createRunner(); + await using run = createRun(); const struct = { num: (() => ok(42)) as Task, @@ -5298,7 +6575,7 @@ describe("all", () => { }); test("struct fails fast on first error", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFail = Promise.withResolvers(); @@ -5323,7 +6600,6 @@ describe("all", () => { const fiber = run(parallel(all({ good: goodTask, bad: badTask }))); - await Promise.resolve(); expect(events).toEqual(["good start", "bad start"]); canFail.resolve(); @@ -5333,7 +6609,7 @@ describe("all", () => { }); test("struct returns empty object for empty input", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run(all({})); @@ -5341,7 +6617,7 @@ describe("all", () => { }); test("struct respects parallel", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -5363,7 +6639,6 @@ describe("all", () => { ); // Sequential: only one at a time - await Promise.resolve(); expect(events).toEqual(["start a"]); canFinish.resolve(); @@ -5373,7 +6648,7 @@ describe("all", () => { }); test("tuple preserves types", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( all([() => ok(42), () => ok("hello"), () => ok(true)]), @@ -5387,7 +6662,7 @@ describe("all", () => { }); test("struct preserves readonly properties", async () => { - await using run = createRunner(); + await using run = createRun(); const readonlyStruct = { num: (() => ok(42)) as Task, @@ -5405,7 +6680,7 @@ describe("all", () => { }); test("non-empty arrays preserve types", async () => { - await using run = createRunner(); + await using run = createRun(); const tasks: NonEmptyReadonlyArray> = [() => ok(1)]; const result = await run(all(tasks)); @@ -5418,7 +6693,7 @@ describe("all", () => { test("returns promptly on external abort even when blocked", async () => { // Not using `await using` because disposal waits for all fibers to complete, // including the unabortable task (10s). - const run = createRunner(); + const run = createRun(); let unabortableCompleted = false; @@ -5459,7 +6734,7 @@ describe("all", () => { }); test("collect: false discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5480,7 +6755,7 @@ describe("all", () => { }); test("collect: false struct discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5503,7 +6778,7 @@ describe("all", () => { describe("allSettled", () => { test("returns emptyArray for empty array", async () => { - await using run = createRunner(); + await using run = createRun(); const emptyTasks: Array> = []; const result = await run(allSettled(emptyTasks)); @@ -5512,7 +6787,7 @@ describe("allSettled", () => { }); test("returns emptyRecord for empty record", async () => { - await using run = createRunner(); + await using run = createRun(); const emptyTasks: Record> = {}; const result = await run(allSettled(emptyTasks)); @@ -5521,7 +6796,7 @@ describe("allSettled", () => { }); test("runs tasks sequentially by default", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5550,7 +6825,7 @@ describe("allSettled", () => { }); test("runs all tasks even when some fail", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5577,7 +6852,7 @@ describe("allSettled", () => { }); test("non-empty arrays preserve types", async () => { - await using run = createRunner(); + await using run = createRun(); const tasks: NonEmptyReadonlyArray> = [() => ok(1)]; const result = await run(allSettled(tasks)); @@ -5590,7 +6865,7 @@ describe("allSettled", () => { }); test("supports struct input", async () => { - await using run = createRunner(); + await using run = createRun(); const taskA: Task = () => ok(42); const taskB: Task = () => err({ type: "MyError" }); @@ -5608,7 +6883,7 @@ describe("allSettled", () => { }); test("struct returns empty object for empty input", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run(allSettled({})); @@ -5616,7 +6891,7 @@ describe("allSettled", () => { }); test("struct preserves types", async () => { - await using run = createRunner(); + await using run = createRun(); const struct = { num: (() => ok(42)) as Task, @@ -5635,7 +6910,7 @@ describe("allSettled", () => { }); test("struct preserves readonly properties", async () => { - await using run = createRunner(); + await using run = createRun(); const readonlyStruct = { num: (() => ok(42)) as Task, @@ -5653,7 +6928,7 @@ describe("allSettled", () => { }); test("struct respects parallel", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -5679,7 +6954,6 @@ describe("allSettled", () => { ); // Sequential: only one at a time - await Promise.resolve(); expect(events).toEqual(["start a"]); canFinish.resolve(); @@ -5695,7 +6969,7 @@ describe("allSettled", () => { }); test("respects parallel", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -5714,7 +6988,6 @@ describe("allSettled", () => { ); // Only 2 tasks should start - await Promise.resolve(); expect(events).toEqual(["start 1", "start 2"]); canFinish.resolve(); @@ -5724,7 +6997,7 @@ describe("allSettled", () => { }); test("tuple preserves types", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( allSettled([ @@ -5746,7 +7019,7 @@ describe("allSettled", () => { }); test("aborts others when a task throws", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -5772,7 +7045,7 @@ describe("allSettled", () => { }); test("collect: false discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5793,7 +7066,7 @@ describe("allSettled", () => { }); test("collect: false struct discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5816,7 +7089,7 @@ describe("allSettled", () => { describe("map", () => { test("returns emptyArray for empty array", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( map( @@ -5831,7 +7104,7 @@ describe("map", () => { }); test("returns emptyRecord for empty record", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( map( @@ -5846,7 +7119,7 @@ describe("map", () => { }); test("maps items to tasks and collects results", async () => { - await using run = createRunner(); + await using run = createRun(); const items = [1, 2, 3]; const double = @@ -5860,7 +7133,7 @@ describe("map", () => { }); test("runs sequentially by default", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5886,7 +7159,7 @@ describe("map", () => { }); test("respects parallel", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5907,7 +7180,7 @@ describe("map", () => { }); test("fails fast on first error", async () => { - await using run = createRunner(); + await using run = createRun(); const mayFail = (n: number): Task => @@ -5920,7 +7193,7 @@ describe("map", () => { }); test("aborts others when a task fails", async () => { - await using run = createRunner(); + await using run = createRun(); const slowObservedAbort = Promise.withResolvers(); @@ -5951,7 +7224,7 @@ describe("map", () => { }); test("supports struct input and returns object with same keys", async () => { - await using run = createRunner(); + await using run = createRun(); const double = (n: number): Task => @@ -5964,7 +7237,7 @@ describe("map", () => { }); test("collect: false discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -5983,7 +7256,7 @@ describe("map", () => { }); test("collect: false struct discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6004,7 +7277,7 @@ describe("map", () => { describe("mapSettled", () => { test("returns emptyArray for empty array", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( mapSettled( @@ -6019,7 +7292,7 @@ describe("mapSettled", () => { }); test("returns emptyRecord for empty record", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run( mapSettled( @@ -6034,7 +7307,7 @@ describe("mapSettled", () => { }); test("maps items and collects all results even if some fail", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const items = [1, 2, 3]; @@ -6052,7 +7325,7 @@ describe("mapSettled", () => { }); test("supports struct input and returns object with same keys", async () => { - await using run = createRunner(); + await using run = createRun(); const mayFail = (n: number): Task => @@ -6067,7 +7340,7 @@ describe("mapSettled", () => { }); test("runs sequentially by default", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6093,7 +7366,7 @@ describe("mapSettled", () => { }); test("respects parallel", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6114,7 +7387,7 @@ describe("mapSettled", () => { }); test("collect: false discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6133,7 +7406,7 @@ describe("mapSettled", () => { }); test("collect: false struct discards results", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6156,15 +7429,25 @@ describe("mapSettled", () => { describe("any", () => { test("returns first success", async () => { - await using run = createRunner(); + await using run = createRun(); const result = await run(any([() => ok(1), () => ok(2), () => ok(3)])); expect(result).toEqual(ok(1)); }); + test("returns empty array for empty runtime input", async () => { + await using run = createRun(); + + const emptyTasks = [] as unknown as NonEmptyReadonlyArray< + Task + >; + + expect(await run(any(emptyTasks))).toEqual(ok(emptyArray)); + }); + test("returns first success with concurrent execution", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canFinish = Promise.withResolvers(); @@ -6190,7 +7473,7 @@ describe("any", () => { }); test("returns last error when all fail", async () => { - await using run = createRunner(); + await using run = createRun(); interface MyError { readonly type: "MyError"; @@ -6209,7 +7492,7 @@ describe("any", () => { }); test("returns last error when all fail with concurrent execution", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6238,7 +7521,7 @@ describe("any", () => { }); test("returns last error by input order, not completion order", async () => { - await using run = createRunner(); + await using run = createRun(); interface MyError { readonly type: "MyError"; @@ -6264,7 +7547,7 @@ describe("any", () => { }); test("can return last error by completion order", async () => { - await using run = createRunner(); + await using run = createRun(); interface MyError { readonly type: "MyError"; @@ -6290,7 +7573,7 @@ describe("any", () => { }); test("aborts others when first succeeds", async () => { - await using run = createRunner(); + await using run = createRun(); const slowAbortReason = Promise.withResolvers(); @@ -6314,7 +7597,7 @@ describe("any", () => { }); test("skips failures until success", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; @@ -6351,7 +7634,7 @@ describe("any", () => { describe("fetch", () => { test("returns AbortError when aborted", async () => { - await using run = createRunner(); + await using run = createRun(); const fiber = run(fetch("https://example.com")); fiber.abort("cancelled"); @@ -6363,10 +7646,50 @@ describe("fetch", () => { }), ); }); + + test("maps non-abort failures to FetchError", async () => { + await using run = createRun(); + + const originalFetch = globalThis.fetch; + const failure = new Error("network failure"); + + try { + globalThis.fetch = (() => + Promise.reject(failure)) as typeof globalThis.fetch; + + expect(await run(fetch("https://example.com"))).toEqual( + err({ type: "FetchError", error: failure }), + ); + } finally { + globalThis.fetch = originalFetch; + } + }); + + test("normalizes WebKit abort message to AbortError", async () => { + await using run = createRun(); + + const originalFetch = globalThis.fetch; + + try { + globalThis.fetch = (() => + new Promise((_resolve, reject) => { + queueMicrotask(() => reject(new Error("Fetch is aborted"))); + })) as typeof globalThis.fetch; + + const fiber = run(fetch("https://example.com")); + fiber.abort("cancelled-by-user"); + + expect(await fiber).toEqual( + err({ type: "AbortError", reason: "cancelled-by-user" }), + ); + } finally { + globalThis.fetch = originalFetch; + } + }); }); describe("examples TODO", () => { - describe("composition types from JSDoc", () => { + describe.skip("composition types from JSDoc", () => { // These tests verify the types shown in Task.ts JSDoc examples are accurate. // No runtime behavior - just type-level assertions. @@ -6395,7 +7718,7 @@ describe("examples TODO", () => { >(); }); - test("retry wraps errors in RetryError", () => { + test("retry wraps errors in RetryError", async () => { const fetchWithTimeout = (url: string) => timeout(fetch(url), "30s"); const fetchWithRetry = (url: string) => @@ -6410,6 +7733,22 @@ describe("examples TODO", () => { NativeFetchDep > >(); + + const deps: RunDeps & NativeFetchDep = { + ...testCreateDeps(), + fetch: globalThis.fetch, + }; + + await using run = createRun(deps); + + const urls = [ + "https://api.example.com/users", + "https://api.example.com/posts", + "https://api.example.com/comments", + ]; + + // At most 2 concurrent requests + const _result = await run(parallel(2, map(urls, fetchWithRetry))); }); test("all with NonEmptyReadonlyArray returns NonEmptyReadonlyArray", () => { @@ -6432,7 +7771,7 @@ describe("examples TODO", () => { describe("createSemaphore", () => { test("limits concurrency with sleep helper", async () => { - await using run = createRunner({ + await using run = createRun({ console: testCreateConsole({ level: "silent" }), }); @@ -6462,7 +7801,7 @@ describe("examples TODO", () => { describe("yieldNow", () => { test("keeps UI responsive when processing large arrays", async () => { - await using run = createRunner(); + await using run = createRun(); const largeArray = Array.from({ length: 50_000 }, (_, i) => i); let processedCount = 0; @@ -6493,7 +7832,7 @@ describe("examples TODO", () => { }); test("enables stack-safe recursion", async () => { - await using run = createRunner(); + await using run = createRun(); // When processing a large amount of work recursively (via `run(childTask)`), // yield periodically so the recursion stays stack-safe. @@ -6522,7 +7861,7 @@ describe("examples TODO", () => { describe("Fiber.abort", () => { test("abort wins, outcome preserves original result", async () => { - await using run = createRunner(); + await using run = createRun(); const fiber = run(() => ok("data")); fiber.abort("stop"); @@ -6535,7 +7874,7 @@ describe("examples TODO", () => { }); test("unabortable preserves result and outcome", async () => { - await using run = createRunner(); + await using run = createRun(); const fiber = run(unabortable(() => ok("data"))); fiber.abort("stop"); @@ -6550,7 +7889,7 @@ describe("examples TODO", () => { describe("unabortable", () => { test("analytics tracking completes despite abort", async () => { - await using run = createRunner(); + await using run = createRun(); const events: Array = []; const canComplete = Promise.withResolvers(); diff --git a/packages/common/test/local-first/Evolu.test.ts b/packages/common/test/local-first/Evolu.test.ts index 02420202d..0800ad2c8 100644 --- a/packages/common/test/local-first/Evolu.test.ts +++ b/packages/common/test/local-first/Evolu.test.ts @@ -22,10 +22,10 @@ import { import { testQuery, testQuery2 } from "../../src/local-first/Query.js"; import { createQueryBuilder } from "../../src/local-first/Schema.js"; import { + initSharedWorker, type EvoluInput, type EvoluOutput, type EvoluTabOutput, - initSharedWorker, type SharedWorker, type SharedWorkerInput, } from "../../src/local-first/Shared.js"; @@ -36,12 +36,13 @@ import { SqliteBoolean, } from "../../src/Sqlite.js"; import { createInMemoryLeaderLock } from "../../src/Task.js"; -import { testCreateRun, testName } from "../../src/Test.js"; +import { testCreateRun } from "../../src/Test.js"; import { createIdFromString, id, NonEmptyString100, nullOr, + testName, } from "../../src/Type.js"; import type { ExtractType } from "../../src/Types.js"; import { @@ -49,16 +50,18 @@ import { createMessagePort, createSharedWorker, createWorker, + testWaitForWorkerMessage, testCreateMessageChannel, testCreateMessagePort, testCreateSharedWorker, testCreateWorker, - testWaitForWorkerMessage, } from "../../src/Worker.js"; +import { testCreateWebSocket } from "../../src/WebSocket.js"; import { testCreateSqliteDeps } from "../_deps.js"; import { testAppOwner } from "./_fixtures.js"; const TodoId = id("Todo"); +type TodoId = typeof TodoId.Type; const Schema = { todo: { @@ -439,14 +442,14 @@ describe("unit tests", () => { ); expect(evolu.appOwner).toMatchInlineSnapshot(` - { - "encryptionKey": uint8:[51,231,177,91,230,145,176,109,130,148,152,121,45,182,111,94,53,215,154,110,96,244,72,84,84,159,250,76,118,95,103,5], - "id": "SUVItd3dEQ8CLSsCqwJahA", - "mnemonic": "duck still purse lock purpose orchard silver differ clean night measure jewel accident visual knee spring extra winner inner fade estate cushion flock live", - "type": "AppOwner", - "writeKey": uint8:[107,116,39,189,145,48,68,79,11,181,104,47,132,89,107,220], - } - `); + { + "encryptionKey": uint8:[50,42,177,193,76,197,92,240,100,30,92,209,205,42,108,45,195,37,118,158,238,206,161,144,11,241,190,167,14,254,186,53], + "id": "t_xEbmXuICrgDm3Ob0_afw", + "mnemonic": "old jungle over boy ankle suggest service source civil insane end silver polar swap flight diagram keep fix gauge social wink subway bronze leader", + "type": "AppOwner", + "writeKey": uint8:[129,228,239,103,127,237,0,59,174,241,77,12,26,180,213,14], + } + `); }); }); @@ -479,9 +482,7 @@ describe("unit tests", () => { }); await testWaitForWorkerMessage(); - expect( - run.deps.evoluInputs.filter((input) => input.type === "Export"), - ).toEqual([{ type: "Export" }]); + expect(run.deps.evoluInputs).toEqual([{ type: "Export" }]); }); test("posts Dispose with pending mutation microtask batch", async () => { @@ -963,20 +964,12 @@ describe("unit tests", () => { await testWaitForWorkerMessage(); - const firstMutate = run.deps.evoluInputs[0]; - assert( - firstMutate?.type === "Mutate", - "Expected first input to be Mutate", - ); - expect(firstMutate.changes[0]?.ownerId).toBe(evolu.appOwner.id); - expect(run.deps.evoluInputs).toMatchInlineSnapshot( [ { changes: [ { id: expect.any(String), - ownerId: expect.any(String), }, ], }, @@ -989,7 +982,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "Todo 1", @@ -1027,25 +1020,15 @@ describe("unit tests", () => { await testWaitForWorkerMessage(); - const firstMutate = run.deps.evoluInputs[0]; - assert( - firstMutate?.type === "Mutate", - "Expected first input to be Mutate", - ); - expect(firstMutate.changes[0]?.ownerId).toBe(evolu.appOwner.id); - expect(firstMutate.changes[1]?.ownerId).toBe(evolu.appOwner.id); - expect(run.deps.evoluInputs).toMatchInlineSnapshot( [ { changes: [ { id: updateId, - ownerId: expect.any(String), }, { id: upsertId, - ownerId: expect.any(String), }, ], }, @@ -1058,7 +1041,7 @@ describe("unit tests", () => { "id": "VPIPiOGb2m2OlsM-pg18CA", "isDelete": true, "isInsert": false, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "Updated", @@ -1068,7 +1051,7 @@ describe("unit tests", () => { "id": "j4rh6UkYDIqXKLCOX4ru2A", "isDelete": null, "isInsert": true, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "Upserted", @@ -1105,30 +1088,18 @@ describe("unit tests", () => { await testWaitForWorkerMessage(); - const firstMutate = run.deps.evoluInputs[0]; - assert( - firstMutate?.type === "Mutate", - "Expected first input to be Mutate", - ); - expect(firstMutate.changes[0]?.ownerId).toBe(evolu.appOwner.id); - expect(firstMutate.changes[1]?.ownerId).toBe(evolu.appOwner.id); - expect(firstMutate.changes[2]?.ownerId).toBe(evolu.appOwner.id); - expect(run.deps.evoluInputs).toMatchInlineSnapshot( [ { changes: [ { id: expect.any(String), - ownerId: expect.any(String), }, { id: updateId, - ownerId: expect.any(String), }, { id: upsertId, - ownerId: expect.any(String), }, ], }, @@ -1141,7 +1112,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "A", @@ -1151,7 +1122,7 @@ describe("unit tests", () => { "id": "fOTG65tQ_ZYHpSBp3GbogA", "isDelete": null, "isInsert": false, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "B", @@ -1161,7 +1132,7 @@ describe("unit tests", () => { "id": "3I1Sfwp5IxdacWcpAna5qg", "isDelete": null, "isInsert": true, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "C", @@ -1191,20 +1162,12 @@ describe("unit tests", () => { await testWaitForWorkerMessage(); - const firstMutate = run.deps.evoluInputs[0]; - assert( - firstMutate?.type === "Mutate", - "Expected first input to be Mutate", - ); - expect(firstMutate.changes[0]?.ownerId).toBe(testAppOwner.id); - expect(run.deps.evoluInputs).toMatchInlineSnapshot( [ { changes: [ { id: expect.any(String), - ownerId: expect.any(String), }, ], onCompleteIds: [expect.any(String)], @@ -1218,7 +1181,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": Any, + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "table": "todo", "values": { "title": "With callback", @@ -1238,7 +1201,7 @@ describe("unit tests", () => { }); describe("exportDatabase", () => { - test("ignores OnExport when there is no pending export", async () => { + test("throws when OnExport arrives without pending export", async () => { const channels: Array<{ readonly port1: { onMessage: ((message: EvoluOutput) => void) | null; @@ -1263,9 +1226,7 @@ describe("unit tests", () => { type: "OnExport", file: new Uint8Array(), }); - }).not.toThrow(); - - expect(run.deps.evoluInputs).toEqual([]); + }).toThrow("OnExport received without pending export."); }); test("exports database for one caller", async () => { @@ -1380,6 +1341,7 @@ describe("integration tests", () => { consoleStoreOutputEntry: consoleStoreOutput.entry, createMessageChannel, createMessagePort, + createWebSocket: testCreateWebSocket({ throwOnCreate: true }), }); const driver = await run.orThrow( @@ -1543,7 +1505,7 @@ describe("integration tests", () => { "name": "evolu_config", "rows": [ { - "clock": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], + "clock": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], }, ], }, @@ -1552,18 +1514,18 @@ describe("integration tests", () => { "rows": [ { "column": "title", - "id": uint8:[70,31,136,134,35,155,236,16,187,58,231,146,197,162,133,46], - "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], + "id": uint8:[37,188,91,250,231,27,86,22,93,22,62,94,220,186,83,245], + "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], "table": "todo", - "timestamp": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], + "timestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], "value": "Integration todo", }, { "column": "createdAt", - "id": uint8:[70,31,136,134,35,155,236,16,187,58,231,146,197,162,133,46], - "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], + "id": uint8:[37,188,91,250,231,27,86,22,93,22,62,94,220,186,83,245], + "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], "table": "todo", - "timestamp": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], + "timestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], "value": "1970-01-01T00:00:00.000Z", }, ], @@ -1577,11 +1539,11 @@ describe("integration tests", () => { "rows": [ { "c": 1, - "h1": 221168146061724, - "h2": 120619144524474, - "l": 1, - "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], - "t": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], + "h1": 181602913099403, + "h2": 262418046898630, + "l": 2, + "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], + "t": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], }, ], }, @@ -1589,10 +1551,10 @@ describe("integration tests", () => { "name": "evolu_usage", "rows": [ { - "firstTimestamp": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], - "lastTimestamp": uint8:[0,0,0,0,0,0,0,1,68,242,158,172,29,147,215,38], - "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], - "storedBytes": 105, + "firstTimestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "lastTimestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], + "storedBytes": 1, }, ], }, @@ -1601,10 +1563,10 @@ describe("integration tests", () => { "rows": [ { "createdAt": "1970-01-01T00:00:00.000Z", - "id": "Rh-IhiOb7BC7OueSxaKFLg", + "id": "Jbxb-ucbVhZdFj5e3LpT9Q", "isCompleted": null, "isDeleted": null, - "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", + "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", "title": "Integration todo", "updatedAt": null, }, diff --git a/packages/web/src/Task.ts b/packages/web/src/Task.ts index d72061721..babd5c2b5 100644 --- a/packages/web/src/Task.ts +++ b/packages/web/src/Task.ts @@ -1,5 +1,5 @@ /** - * Browser-specific Task utilities. + * Web platform-specific Task utilities. * * @module */ From 202c5c74be4bd74ca3e38f25826c08f8e265b519 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:44:20 +0100 Subject: [PATCH 02/24] sync(common-v8): port c96e27a Update deps Source upstream commit: c96e27a02a65e20fd47fcab940470a14889c17b3 Port scope: adapted (resolved bun.lock conflict with upstream dependency updates). --- biome.json | 2 +- bun.lock | 1917 +++++++++++++++++++++++++--------------------------- 2 files changed, 930 insertions(+), 989 deletions(-) diff --git a/biome.json b/biome.json index 61cb06a40..88b0acb36 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.5/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.6/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/bun.lock b/bun.lock index 7f9f78070..2814b9f8c 100644 --- a/bun.lock +++ b/bun.lock @@ -7,14 +7,25 @@ "devDependencies": { "@biomejs/biome": "^2.4.5", "@changesets/cli": "^2.29.8", + "@eslint/js": "^10.0.1", + "@types/inquirer": "^9.0.9", + "@typescript-eslint/parser": "^8.56.1", "@vitest/browser": "^4.0.18", "@vitest/browser-playwright": "^4.0.18", - "@vitest/coverage-istanbul": "^4.0.18", "@vitest/coverage-v8": "^4.0.18", - "turbo": "^2.8.13", + "eslint": "^10.0.2", + "eslint-plugin-jsdoc": "^62.7.1", + "eslint-plugin-react-hooks": "^7.0.1", + "prettier": "^3.8.1", + "prettier-plugin-embed": "^0.5.1", + "prettier-plugin-jsdoc": "^1.8.0", + "prettier-plugin-sql-cst": "^0.18.0", + "prettier-plugin-tailwindcss": "^0.7.2", + "turbo": "^2.8.12", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "^5.9.3", + "typescript-eslint": "^8.56.1", "vitest": "^4.0.18", }, }, @@ -22,67 +33,109 @@ "name": "@evolu/relay", "version": "2.0.8", "dependencies": { - "@evolu/common": "workspace:*", - "@evolu/nodejs": "workspace:*", + "@evolu/common": "*", + "@evolu/nodejs": "*", }, "devDependencies": { - "@evolu/tsconfig": "workspace:*", - "@types/node": "^25.3.3", + "@evolu/typescript-config": "*", + "@types/node": "^24.10.9", "typescript": "^5.9.3", }, }, - "examples/angular-vite-pwa": { - "name": "@example/angular-vite-pwa", - "version": "0.0.0", + "apps/web": { + "name": "web", + "version": "2.0.0", "dependencies": { - "@angular/core": "^21.2.1", - "@angular/platform-browser": "^21.2.1", - "@evolu/common": "workspace:*", - "@evolu/web": "workspace:*", + "@algolia/autocomplete-core": "^1.19.4", + "@emotion/is-prop-valid": "^1.4.0", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/react-web": "*", + "@evolu/sqlite-wasm": "2.2.4", + "@evolu/web": "*", + "@headlessui/react": "^2.2.9", + "@headlessui/tailwindcss": "^0.2.2", + "@mdx-js/loader": "^3.1.1", + "@mdx-js/mdx": "^3.1.1", + "@mdx-js/react": "^3.1.1", + "@next/mdx": "^16.1.3", + "@sindresorhus/slugify": "^3.0.0", + "@tabler/icons-react": "^3.36.1", + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/typography": "^0.5.19", + "acorn": "^8.15.0", + "clsx": "^2.1.1", + "fast-glob": "^3.3.3", + "flexsearch": "^0.8.212", + "mdast-util-to-string": "^4.0.0", + "mdx-annotations": "^0.1.4", + "motion": "^12.27.0", + "next": "^16.1.3", + "next-themes": "^0.4.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-highlight-words": "^0.21.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-mdx": "^3.1.1", + "rss": "^1.2.2", + "shiki": "^4.0.0", + "simple-functional-loader": "^1.2.1", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3", + "unist-util-filter": "^5.0.1", + "unist-util-visit": "^5.0.0", + "zustand": "^5.0.10", }, "devDependencies": { - "@analogjs/vite-plugin-angular": "^2.3.1", - "@angular/build": "^21.2.1", - "@angular/compiler-cli": "^21.2.1", - "@tailwindcss/vite": "^4.2.1", - "@vite-pwa/assets-generator": "^1.0.2", - "tailwindcss": "^4.2.1", - "typescript": "^5.9.3", - "vite": "^7.3.1", - "vite-plugin-pwa": "^1.2.0", + "@evolu/typescript-config": "*", + "@types/mdx": "^2.0.13", + "@types/node": "^24.10.9", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@types/react-highlight-words": "^0.20.1", + "@types/rss": "^0.0.32", + "cross-env": "^10.1.0", + "sharp": "^0.34.5", }, }, - "examples/astro": { - "name": "@example/astro", + "examples/angular-vite-pwa": { + "name": "@example/angular-vite-pwa", "version": "0.0.0", "dependencies": { - "@astrojs/react": "^4.4.2", - "@evolu/astro": "workspace:*", - "astro": "^5.14.5", - "react": "19.2.4", - "react-dom": "19.2.4", + "@angular/core": "^21.1.0", + "@angular/platform-browser": "^21.1.0", + "@evolu/common": "*", + "@evolu/web": "*", }, "devDependencies": { - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", + "@analogjs/vite-plugin-angular": "^2.2.2", + "@angular/build": "^21.1.0", + "@angular/compiler-cli": "^21.1.0", + "@tailwindcss/vite": "^4.1.18", + "@vite-pwa/assets-generator": "^1.0.2", + "tailwindcss": "^4.1.18", "typescript": "^5.9.3", + "vite": "^7.3.1", + "vite-plugin-pwa": "^1.2.0", }, }, "examples/react-electron": { "name": "@example/react-electron", "version": "0.0.0", "dependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "react": "19.2.4", - "react-dom": "19.2.4", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/react-web": "*", + "react": "^19.2.4", + "react-dom": "^19.2.4", }, "devDependencies": { - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "@vitejs/plugin-react": "^5.1.4", - "electron": "40.7.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.2", + "electron": "^40.6.1", "electron-builder": "^26.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", @@ -95,45 +148,34 @@ "version": "1.0.0", "dependencies": { "@blazejkustra/react-native-alert": "^1.0.0", - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-native": "workspace:*", - "@expo/metro-runtime": "^55.0.6", - "@expo/vector-icons": "^15.1.1", - "abort-signal-polyfill": "^1.0.0", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/react-native": "*", + "@expo/metro-runtime": "~55.0.6", + "@expo/vector-icons": "^15.0.3", "babel-plugin-module-resolver": "^5.0.2", - "expo": "^55.0.5", - "expo-constants": "^55.0.7", - "expo-font": "^55.0.4", - "expo-linking": "^55.0.7", - "expo-router": "^55.0.4", + "babel-preset-expo": "~55.0.8", + "expo": "^55.0.4", + "expo-constants": "~55.0.7", + "expo-font": "~55.0.4", + "expo-linking": "~55.0.7", + "expo-router": "~55.0.3", "expo-secure-store": "~55.0.8", "expo-splash-screen": "~55.0.10", "expo-sqlite": "~55.0.10", - "react": "19.2.4", - "react-dom": "19.2.4", - "react-native": "0.84.1", + "react": "19.2.0", + "react-native": "0.83.2", "react-native-nitro-modules": "0.34.1", - "react-native-quick-crypto": "^1.0.16", - "react-native-safe-area-context": "^5.6.2", - "react-native-screens": "^4.24.0", + "react-native-quick-crypto": "^1.0.15", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", "react-native-svg": "15.15.3", - "react-native-web": "^0.21.0", - "set.prototype.difference": "^1.1.7", - "set.prototype.intersection": "^1.1.8", - "set.prototype.isdisjointfrom": "^1.1.5", - "set.prototype.issubsetof": "^1.1.4", - "set.prototype.issupersetof": "^1.1.3", - "set.prototype.symmetricdifference": "^1.1.3", - "set.prototype.union": "^1.1.3", }, "devDependencies": { - "@babel/core": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.6", "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@types/react": "~19.2.14", - "babel-preset-expo": "^55.0.10", + "@types/react": "^19.2.14", "typescript": "^5.9.3", }, }, @@ -141,23 +183,23 @@ "name": "@example/react-nextjs", "version": "0.1.0", "dependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "@tabler/icons-react": "^3.37.1", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/react-web": "*", + "@tabler/icons-react": "^3.36.1", "clsx": "^2.1.1", "next": "^16.1.3", - "react": "19.2.4", - "react-dom": "19.2.4", + "react": "^19.2.4", + "react-dom": "^19.2.4", }, "devDependencies": { "@tailwindcss/forms": "^0.5.11", - "@tailwindcss/postcss": "^4.2.1", - "@types/node": "^25.3.3", - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^24.10.9", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", "typescript": "^5.9.3", }, }, @@ -165,22 +207,23 @@ "name": "@example/react-vite-pwa", "version": "0.0.0", "dependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "@tabler/icons-react": "^3.37.1", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/react-web": "*", + "@tabler/icons-react": "^3.36.1", "clsx": "^2.1.1", - "react": "19.2.4", - "react-dom": "19.2.4", - "tailwindcss": "^4.2.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwindcss": "^4.1.18", }, "devDependencies": { "@tailwindcss/forms": "^0.5.11", - "@tailwindcss/vite": "^4.2.1", - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", + "@tailwindcss/vite": "^4.1.18", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", "@vite-pwa/assets-generator": "^1.0.2", - "@vitejs/plugin-react": "^5.1.4", + "@vitejs/plugin-react": "^5.1.2", + "globals": "^17.3.0", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", @@ -192,97 +235,37 @@ "name": "@example/svelte-vite-pwa", "version": "0.0.0", "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/svelte": "workspace:*", - "@evolu/web": "workspace:*", + "@evolu/common": "*", + "@evolu/svelte": "*", + "@evolu/web": "*", "@sveltejs/vite-plugin-svelte": "^6.2.4", - "@tsconfig/svelte": "^5.0.8", - "svelte": "^5.53.7", - "svelte-check": "^4.4.3", + "@tsconfig/svelte": "^5.0.6", + "svelte": "^5.48.2", + "svelte-check": "^4.3.6", "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", }, }, - "examples/tanstack-start": { - "name": "@example/tanstack-start", - "version": "0.0.0", - "dependencies": { - "@evolu/tanstack-start": "workspace:*", - "@tanstack/react-router": "^1.166.2", - "react": "19.2.4", - "react-dom": "19.2.4", - }, - "devDependencies": { - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "@vitejs/plugin-react": "^5.1.4", - "typescript": "^5.9.3", - "vite": "^7.3.1", - }, - }, - "examples/tauri": { - "name": "@example/tauri", - "version": "0.0.0", - "dependencies": { - "@evolu/tauri": "workspace:*", - "@tauri-apps/api": "^2.8.0", - "react": "19.2.4", - "react-dom": "19.2.4", - }, - "devDependencies": { - "@tauri-apps/cli": "^2.10.1", - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "@vitejs/plugin-react": "^5.1.4", - "typescript": "^5.9.3", - "vite": "^7.3.1", - }, - }, "examples/vue-vite-pwa": { "name": "@example/vue-vite-pwa", "version": "0.0.0", "dependencies": { - "@evolu/common": "workspace:*", - "@evolu/vue": "workspace:*", - "@evolu/web": "workspace:*", - "vue": "^3.5.29", + "@evolu/common": "*", + "@evolu/vue": "*", + "@evolu/web": "*", + "vue": "^3.5.26", "workbox-window": "^7.4.0", }, "devDependencies": { "@vite-pwa/assets-generator": "^1.0.2", - "@vitejs/plugin-vue": "^6.0.4", - "@vue/tsconfig": "^0.9.0", + "@vitejs/plugin-vue": "^6.0.3", + "@vue/tsconfig": "^0.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", - "vue-tsc": "^3.2.5", - }, - }, - "packages/astro": { - "name": "@evolu/astro", - "version": "0.1.0", - "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "typescript": "^5.9.3", - "vitest": "^4.0.18", - }, - }, - "packages/bun": { - "name": "@evolu/bun", - "version": "0.1.0", - "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "bun-types": "^1.3.9", - "typescript": "^5.9.3", - }, - "peerDependencies": { - "@evolu/common": "^7.4.1", + "vue-tsc": "^3.2.2", }, }, "packages/common": { @@ -292,19 +275,22 @@ "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "@scure/bip39": "^2.0.1", - "kysely": "^0.28.11", + "kysely": "^0.28.10", "msgpackr": "^1.11.8", - "zod": "^4.3.6", + "random": "^5.4.1", }, "devDependencies": { - "@bokuweb/zstd-wasm": "^0.0.27", + "@bokuweb/zstd-wasm": "0.0.27", + "@evolu/typescript-config": "*", "@types/better-sqlite3": "^7.6.13", "@types/ws": "^8.18.1", "better-sqlite3": "^12.6.2", "fast-check": "^4.5.3", - "playwright": "^1.58.2", + "playwright": "^1.58.1", "typescript": "^5.9.3", + "webpack": "^5.98.0", "ws": "^8.19.0", + "zod": "^4.3.6", }, }, "packages/nodejs": { @@ -315,10 +301,10 @@ "ws": "^8.19.0", }, "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", + "@evolu/common": "*", + "@evolu/typescript-config": "*", "@types/better-sqlite3": "^7.6.13", - "@types/node": "^25.3.3", + "@types/node": "^24.10.9", "@types/ws": "^8.18.1", "typescript": "^5.9.3", }, @@ -330,11 +316,11 @@ "name": "@evolu/react", "version": "10.4.0", "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "react": "19.2.4", + "@evolu/common": "*", + "@evolu/typescript-config": "*", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "react": "^19.2.4", "typescript": "^5.9.3", }, "peerDependencies": { @@ -346,6 +332,10 @@ "name": "@evolu/react-native", "version": "14.3.0", "dependencies": { + "array-from-async": "^3.0.0", + "array.prototype.tosorted": "^1.1.4", + "promise.try": "^2.0.1", + "promise.withresolvers": "^1.0.4", "set.prototype.difference": "^1.1.7", "set.prototype.intersection": "^1.1.8", "set.prototype.isdisjointfrom": "^1.1.5", @@ -355,18 +345,18 @@ "set.prototype.union": "^1.1.3", }, "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/tsconfig": "workspace:*", + "@evolu/common": "*", + "@evolu/react": "*", + "@evolu/typescript-config": "*", "@op-engineering/op-sqlite": "^15.2.2", - "@types/react": "~19.2.14", - "expo": "^55.0.5", + "@types/react": "^19.2.14", + "expo": "^55.0.4", "expo-secure-store": "~55.0.8", "expo-sqlite": "~55.0.10", - "react": "19.2.4", - "react-native": "0.84.1", + "react": "^19.2.4", + "react-native": "0.83.2", "react-native-nitro-modules": "0.34.1", - "react-native-sensitive-info": "6.0.0-rc.12", + "react-native-sensitive-info": "6.0.0-rc.11", "react-native-svg": "15.15.3", "typescript": "^5.9.3", }, @@ -378,10 +368,10 @@ "expo-secure-store": ">=55", "expo-sqlite": ">=55", "react": ">=19", - "react-native": ">=0.84", - "react-native-nitro-modules": ">=0.34.1", + "react-native": ">=0.83", + "react-native-nitro-modules": ">=0.34", "react-native-sensitive-info": ">=6", - "react-native-svg": ">=15", + "react-native-svg": ">=15.15", }, "optionalPeers": [ "@op-engineering/op-sqlite", @@ -397,13 +387,13 @@ "name": "@evolu/react-web", "version": "2.4.0", "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "@evolu/web": "workspace:*", - "@types/react": "~19.2.14", - "@types/react-dom": "~19.2.3", - "react": "19.2.4", - "react-dom": "19.2.4", + "@evolu/common": "*", + "@evolu/typescript-config": "*", + "@evolu/web": "*", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "react": "^19.2.4", + "react-dom": "^19.2.4", "typescript": "^5.9.3", "user-agent-data-types": "^0.4.2", }, @@ -418,60 +408,36 @@ "name": "@evolu/svelte", "version": "2.4.0", "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "@evolu/web": "workspace:*", + "@evolu/common": "*", + "@evolu/typescript-config": "*", + "@evolu/web": "*", "@sveltejs/package": "^2.5.7", - "@tsconfig/svelte": "^5.0.8", - "svelte": "^5.53.7", - "svelte-check": "^4.4.3", + "@tsconfig/svelte": "^5.0.6", + "svelte": "^5.48.2", + "svelte-check": "^4.3.6", "typescript": "^5.9.3", }, "peerDependencies": { "@evolu/common": "^7.4.1", "@evolu/web": "^2.4.0", - "svelte": ">=5.53.7", - }, - }, - "packages/tanstack-start": { - "name": "@evolu/tanstack-start", - "version": "0.1.0", - "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "typescript": "^5.9.3", - "vitest": "^4.0.18", - }, - }, - "packages/tauri": { - "name": "@evolu/tauri", - "version": "0.1.0", - "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/react": "workspace:*", - "@evolu/react-web": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "typescript": "^5.9.3", - "vitest": "^4.0.18", + "svelte": ">=5", }, }, - "packages/tsconfig": { - "name": "@evolu/tsconfig", + "packages/typescript-config": { + "name": "@evolu/typescript-config", "version": "0.0.2", }, "packages/vue": { "name": "@evolu/vue", "version": "1.4.0", "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", + "@evolu/common": "*", + "@evolu/typescript-config": "*", "typescript": "^5.9.3", }, "peerDependencies": { "@evolu/common": "^7.4.1", - "vue": ">=3.5.29", + "vue": ">=3.5.24", }, }, "packages/web": { @@ -482,9 +448,9 @@ "idb-keyval": "^6.2.2", }, "devDependencies": { - "@evolu/common": "workspace:*", - "@evolu/tsconfig": "workspace:*", - "@types/sharedworker": "^0.0.222", + "@evolu/common": "*", + "@evolu/typescript-config": "*", + "@types/sharedworker": "^0.0.221", "@types/web-locks-api": "^0.0.5", "typescript": "^5.9.3", "user-agent-data-types": "^0.4.2", @@ -494,27 +460,46 @@ }, }, }, - "trustedDependencies": [ - "lmdb", - "esbuild", - "@tailwindcss/oxide", - "@biomejs/biome", - "sharp", - "@parcel/watcher", - "electron-winstaller", - "electron", - "better-sqlite3", - "msgpackr-extract", - "react-native-nitro-modules", - ], - "overrides": { - "serialize-javascript": "^7.0.3", - "svgo": "^4.0.1", - "tar": "^7.5.10", + "patchedDependencies": { + "@changesets/assemble-release-plan@6.0.9": "patches/@changesets__assemble-release-plan.patch", }, "packages": { "7zip-bin": ["7zip-bin@5.2.0", "", {}, "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A=="], + "@algolia/abtesting": ["@algolia/abtesting@1.15.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw=="], + + "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.19.6", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.6", "@algolia/autocomplete-shared": "1.19.6" } }, "sha512-6EoD7PeM2WBq5GY1jm0gGonDW2JVU4BaHT9tAwDcaPkc6gYIRZeY7X7aFuwdRvk9R/jwsh8sz4flDao0+Kua6g=="], + + "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.19.6", "", { "dependencies": { "@algolia/autocomplete-shared": "1.19.6" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-VD53DBixhEwDvOB00D03DtBVhh5crgb1N0oH3QTscfYk4TpBH+CKrwmN/XrN/VdJAdP+4K6SgwLii/3OwM9dHw=="], + + "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.19.6", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-DG1n2B6XQw6DWB5veO4RuzQ/N2oGNpG+sSzGT7gUbi7WhF+jN57abcv2QhB5flXZ0NgddE1i6h7dZuQmYBEorQ=="], + + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw=="], + + "@algolia/client-analytics": ["@algolia/client-analytics@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g=="], + + "@algolia/client-common": ["@algolia/client-common@5.49.1", "", {}, "sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg=="], + + "@algolia/client-insights": ["@algolia/client-insights@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g=="], + + "@algolia/client-personalization": ["@algolia/client-personalization@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w=="], + + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg=="], + + "@algolia/client-search": ["@algolia/client-search@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA=="], + + "@algolia/ingestion": ["@algolia/ingestion@1.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ=="], + + "@algolia/monitoring": ["@algolia/monitoring@1.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw=="], + + "@algolia/recommend": ["@algolia/recommend@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw=="], + + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA=="], + + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw=="], + + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA=="], + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], @@ -527,9 +512,9 @@ "@angular/build": ["@angular/build@21.2.1", "", { "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.2102.1", "@babel/core": "7.29.0", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", "@inquirer/confirm": "5.1.21", "@vitejs/plugin-basic-ssl": "2.1.4", "beasties": "0.4.1", "browserslist": "^4.26.0", "esbuild": "0.27.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "listr2": "9.0.5", "magic-string": "0.30.21", "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.0", "picomatch": "4.0.3", "piscina": "5.1.4", "rolldown": "1.0.0-rc.4", "sass": "1.97.3", "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", "undici": "7.22.0", "vite": "7.3.1", "watchpack": "2.5.1" }, "optionalDependencies": { "lmdb": "3.5.1" }, "peerDependencies": { "@angular/compiler": "^21.0.0", "@angular/compiler-cli": "^21.0.0", "@angular/core": "^21.0.0", "@angular/localize": "^21.0.0", "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", "@angular/ssr": "^21.2.1", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", "typescript": ">=5.9 <6.0", "vitest": "^4.0.8" }, "optionalPeers": ["@angular/core", "@angular/localize", "@angular/platform-browser", "@angular/platform-server", "@angular/service-worker", "@angular/ssr", "karma", "less", "ng-packagr", "postcss", "tailwindcss", "vitest"] }, "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ=="], - "@angular/common": ["@angular/common@21.2.0", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "21.2.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw=="], + "@angular/common": ["@angular/common@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "21.2.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-xhv2i1Q9s1kpGbGsfj+o36+XUC/TQLcZyRuRxn3GwaN7Rv34FabC88ycpvoE+sW/txj4JRx9yPA0dRSZjwZ+Gg=="], - "@angular/compiler": ["@angular/compiler@21.2.0", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg=="], + "@angular/compiler": ["@angular/compiler@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-FxWaSaii1vfHIFA+JksqQ8NGB2frfqCrs7Ju50a44kbwR4fmanfn/VsiS/CbwBp9vcyT/Br9X/jAG4RuK/U2nw=="], "@angular/compiler-cli": ["@angular/compiler-cli@21.2.1", "", { "dependencies": { "@babel/core": "7.29.0", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^18.0.0" }, "peerDependencies": { "@angular/compiler": "21.2.1", "typescript": ">=5.9 <6.1" }, "optionalPeers": ["typescript"], "bin": { "ngc": "bundles/src/bin/ngc.js", "ng-xi18n": "bundles/src/bin/ng_xi18n.js" } }, "sha512-qYCWLGtEju4cDtYLi4ZzbwKoF0lcGs+Lc31kuESvAzYvWNgk2EUOtwWo8kbgpAzAwSYodtxW6Q90iWEwfU6elw=="], @@ -539,18 +524,6 @@ "@apideck/better-ajv-errors": ["@apideck/better-ajv-errors@0.3.6", "", { "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "peerDependencies": { "ajv": ">=8" } }, "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA=="], - "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], - - "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="], - - "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="], - - "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], - - "@astrojs/react": ["@astrojs/react@4.4.2", "", { "dependencies": { "@vitejs/plugin-react": "^4.7.0", "ultrahtml": "^1.6.0", "vite": "^6.4.1" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ=="], - - "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="], - "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], @@ -567,7 +540,7 @@ "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], - "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.6", "", { "dependencies": { "@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.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA=="], + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.7", "", { "dependencies": { "@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.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], @@ -803,23 +776,23 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@biomejs/biome": ["@biomejs/biome@2.4.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.5", "@biomejs/cli-darwin-x64": "2.4.5", "@biomejs/cli-linux-arm64": "2.4.5", "@biomejs/cli-linux-arm64-musl": "2.4.5", "@biomejs/cli-linux-x64": "2.4.5", "@biomejs/cli-linux-x64-musl": "2.4.5", "@biomejs/cli-win32-arm64": "2.4.5", "@biomejs/cli-win32-x64": "2.4.5" }, "bin": { "biome": "bin/biome" } }, "sha512-OWNCyMS0Q011R6YifXNOg6qsOg64IVc7XX6SqGsrGszPbkVCoaO7Sr/lISFnXZ9hjQhDewwZ40789QmrG0GYgQ=="], + "@biomejs/biome": ["@biomejs/biome@2.4.6", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.6", "@biomejs/cli-darwin-x64": "2.4.6", "@biomejs/cli-linux-arm64": "2.4.6", "@biomejs/cli-linux-arm64-musl": "2.4.6", "@biomejs/cli-linux-x64": "2.4.6", "@biomejs/cli-linux-x64-musl": "2.4.6", "@biomejs/cli-win32-arm64": "2.4.6", "@biomejs/cli-win32-x64": "2.4.6" }, "bin": { "biome": "bin/biome" } }, "sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lGS4Nd5O3KQJ6TeWv10mElnx1phERhBxqGP/IKq0SvZl78kcWDFMaTtVK+w3v3lusRFxJY78n07PbKplirsU5g=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-6MoH4tyISIBNkZ2Q5T1R7dLd5BsITb2yhhhrU9jHZxnNSNMWl+s2Mxu7NBF8Y3a7JJcqq9nsk8i637z4gqkJxQ=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-U1GAG6FTjhAO04MyH4xn23wRNBkT6H7NentHh+8UxD6ShXKBm5SY4RedKJzkUThANxb9rUKIPc7B8ew9Xo/cWg=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-iqLDgpzobG7gpBF0fwEVS/LT8kmN7+S0E2YKFDtqliJfzNLnAiV2Nnyb+ehCDCJgAZBASkYHR2o60VQWikpqIg=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-NdODlSugMzTlENPTa4z0xB82dTUlCpsrOxc43///aNkTLblIYH4XpYflBbf5ySlQuP8AA4AZd1qXhV07IdrHdQ=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.6", "", { "os": "linux", "cpu": "x64" }, "sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-NlKa7GpbQmNhZf9kakQeddqZyT7itN7jjWdakELeXyTU3pg/83fTysRRDPJD0akTfKDl6vZYNT9Zqn4MYZVBOA=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.6", "", { "os": "linux", "cpu": "x64" }, "sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-EBfrTqRIWOFSd7CQb/0ttjHMR88zm3hGravnDwUA9wHAaCAYsULKDebWcN5RmrEo1KBtl/gDVJMrFjNR0pdGUw=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.5", "", { "os": "win32", "cpu": "x64" }, "sha512-Pmhv9zT95YzECfjEHNl3mN9Vhusw9VA5KHY0ZvlGsxsjwS5cb7vpRnHzJIv0vG7jB0JI7xEaMH9ddfZm/RozBw=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.6", "", { "os": "win32", "cpu": "x64" }, "sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg=="], "@blazejkustra/react-native-alert": ["@blazejkustra/react-native-alert@1.0.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-bgvKlnhfS39vz38BSBdHk1smVME0Nf5tJEzgoQOIPpci8KuTBcOORa93B2PV3/S5a0QkR1d8nW2yw76HDj6zqQ=="], @@ -827,8 +800,6 @@ "@canvas/image-data": ["@canvas/image-data@1.1.0", "", {}, "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA=="], - "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="], - "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="], "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], @@ -889,6 +860,16 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.4.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw=="], + + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], + + "@epic-web/invariant": ["@epic-web/invariant@1.0.0", "", {}, "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA=="], + + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.84.0", "", { "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.54.0", "comment-parser": "1.4.5", "esquery": "^1.7.0", "jsdoc-type-pratt-parser": "~7.1.1" } }, "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w=="], + + "@es-joy/resolve.exports": ["@es-joy/resolve.exports@1.2.0", "", {}, "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -941,9 +922,21 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "@evolu/astro": ["@evolu/astro@workspace:packages/astro"], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.23.3", "", { "dependencies": { "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.5.3", "", { "dependencies": { "@eslint/core": "^1.1.1" } }, "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw=="], - "@evolu/bun": ["@evolu/bun@workspace:packages/bun"], + "@eslint/core": ["@eslint/core@1.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ=="], + + "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], + + "@eslint/object-schema": ["@eslint/object-schema@3.0.3", "", {}, "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.1", "", { "dependencies": { "@eslint/core": "^1.1.1", "levn": "^0.4.1" } }, "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ=="], "@evolu/common": ["@evolu/common@workspace:packages/common"], @@ -961,11 +954,7 @@ "@evolu/svelte": ["@evolu/svelte@workspace:packages/svelte"], - "@evolu/tanstack-start": ["@evolu/tanstack-start@workspace:packages/tanstack-start"], - - "@evolu/tauri": ["@evolu/tauri@workspace:packages/tauri"], - - "@evolu/tsconfig": ["@evolu/tsconfig@workspace:packages/tsconfig"], + "@evolu/typescript-config": ["@evolu/typescript-config@workspace:packages/typescript-config"], "@evolu/vue": ["@evolu/vue@workspace:packages/vue"], @@ -973,8 +962,6 @@ "@example/angular-vite-pwa": ["@example/angular-vite-pwa@workspace:examples/angular-vite-pwa"], - "@example/astro": ["@example/astro@workspace:examples/astro"], - "@example/react-electron": ["@example/react-electron@workspace:examples/react-electron"], "@example/react-expo": ["@example/react-expo@workspace:examples/react-expo"], @@ -985,13 +972,9 @@ "@example/svelte-vite-pwa": ["@example/svelte-vite-pwa@workspace:examples/svelte-vite-pwa"], - "@example/tanstack-start": ["@example/tanstack-start@workspace:examples/tanstack-start"], - - "@example/tauri": ["@example/tauri@workspace:examples/tauri"], - "@example/vue-vite-pwa": ["@example/vue-vite-pwa@workspace:examples/vue-vite-pwa"], - "@expo-google-fonts/material-symbols": ["@expo-google-fonts/material-symbols@0.4.24", "", {}, "sha512-1bJ63Yv2Bn8SN2MjrlbwLwUhnC8COOeejd15H88WjCtw5iNErqEPaBnpvmYyqciVYwudGo5drUIdY9C/5yPGbg=="], + "@expo-google-fonts/material-symbols": ["@expo-google-fonts/material-symbols@0.4.25", "", {}, "sha512-MlwOpcYPLYu2+aDAwqv29l3sknNNxA36Jcu07Tg9+MTEvXk2SPcO8eQmwwDeVBbv5Wb6ToD1LmE+e0lLv/9WvA=="], "@expo/cli": ["@expo/cli@55.0.15", "", { "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.9", "@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" }, "peerDependencies": { "expo": "*", "expo-router": "*", "react-native": "*" }, "optionalPeers": ["expo-router", "react-native"], "bin": { "expo-internal": "build/bin/cli" } }, "sha512-Qd4aF2+wT9LtdV7G/gULbx/t8FJ/OVtwuNkLcZt1XlosQ5XX/C/3ywZXYl+/bYcHUmuO1TBD3Fg05bNlmL6vrw=="], @@ -1053,59 +1036,81 @@ "@expo/xcpretty": ["@expo/xcpretty@4.4.1", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg=="], + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], + + "@floating-ui/react": ["@floating-ui/react@0.26.28", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], + "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.23.0", "", { "dependencies": { "@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" } }, "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg=="], "@harperfast/extended-iterable": ["@harperfast/extended-iterable@1.0.3", "", {}, "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw=="], + "@headlessui/react": ["@headlessui/react@2.2.9", "", { "dependencies": { "@floating-ui/react": "^0.26.16", "@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" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ=="], + + "@headlessui/tailwindcss": ["@headlessui/tailwindcss@0.2.2", "", { "peerDependencies": { "tailwindcss": "^3.0 || ^4.0" } }, "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], @@ -1175,6 +1180,12 @@ "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], + "@mdx-js/loader": ["@mdx-js/loader@3.1.1", "", { "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" }, "peerDependencies": { "webpack": ">=5" }, "optionalPeers": ["webpack"] }, "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@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" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], @@ -1227,6 +1238,8 @@ "@next/env": ["@next/env@16.1.6", "", {}, "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ=="], + "@next/mdx": ["@next/mdx@16.1.6", "", { "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "optionalPeers": ["@mdx-js/loader", "@mdx-js/react"] }, "sha512-PT5JR4WPPYOls7WD6xEqUVVI9HDY8kY7XLQsNYB2lSZk5eJSXWu3ECtIYmfR0hZpx8Sg7BKZYKi2+u5OTSEx0w=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw=="], "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ=="], @@ -1259,8 +1272,6 @@ "@op-engineering/op-sqlite": ["@op-engineering/op-sqlite@15.2.5", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-Vmgwt0AzY7qoge3X6EONhsb5NlM2yoQUF0/lseUWBelfc9BUili7/DFsFsS73cvtYWlwPpqeTGOoce5mzHozBw=="], - "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@oxc-project/types": ["@oxc-project/types@0.113.0", "", {}, "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA=="], "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], @@ -1339,15 +1350,23 @@ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@react-native/assets-registry": ["@react-native/assets-registry@0.84.1", "", {}, "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg=="], + "@react-aria/focus": ["@react-aria/focus@3.21.5", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q=="], + + "@react-aria/interactions": ["@react-aria/interactions@3.27.1", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw=="], + + "@react-aria/ssr": ["@react-aria/ssr@3.9.10", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ=="], + + "@react-aria/utils": ["@react-aria/utils@3.33.1", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w=="], + + "@react-native/assets-registry": ["@react-native/assets-registry@0.83.2", "", {}, "sha512-9I5l3pGAKnlpQ15uVkeB9Mgjvt3cZEaEc8EDtdexvdtZvLSjtwBzgourrOW4yZUijbjJr8h3YO2Y0q+THwUHTA=="], "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.83.2", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.83.2" } }, "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg=="], "@react-native/babel-preset": ["@react-native/babel-preset@0.83.2", "", { "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" } }, "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA=="], - "@react-native/codegen": ["@react-native/codegen@0.84.1", "", { "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" } }, "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA=="], + "@react-native/codegen": ["@react-native/codegen@0.83.2", "", { "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" } }, "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA=="], - "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.84.1", "", { "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" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ=="], + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.83.2", "", { "dependencies": { "@react-native/dev-middleware": "0.83.2", "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" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-sTEF0eiUKtmImEP07Qo5c3Khvm1LIVX1Qyb6zWUqPL6W3MqFiXutZvKBjqLz6p49Szx8cplQLoXfLHT0bcDXKg=="], "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.83.2", "", {}, "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ=="], @@ -1355,13 +1374,13 @@ "@react-native/dev-middleware": ["@react-native/dev-middleware@0.83.2", "", { "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" } }, "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg=="], - "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.84.1", "", {}, "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg=="], + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.83.2", "", {}, "sha512-PqN11fXRAU+uJ0inZY1HWYlwJOXHOhF4SPyeHBBxjajKpm2PGunmvFWwkmBjmmUkP/CNO0ezTUudV0oj+2wiHQ=="], - "@react-native/js-polyfills": ["@react-native/js-polyfills@0.84.1", "", {}, "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ=="], + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.83.2", "", {}, "sha512-dk6fIY2OrKW/2Nk2HydfYNrQau8g6LOtd7NVBrgaqa+lvuRyIML5iimShP5qPqQnx2ofHuzjFw+Ya0b5Q7nDbA=="], - "@react-native/normalize-colors": ["@react-native/normalize-colors@0.84.1", "", {}, "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA=="], + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.83.2", "", {}, "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q=="], - "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.84.1", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA=="], + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.83.2", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-N7mRjHLW/+KWxMp9IHRWyE3VIkeG1m3PnZJAGEFLCN8VFb7e4VfI567o7tE/HYcdcXCylw+Eqhlciz8gDeQ71g=="], "@react-navigation/bottom-tabs": ["@react-navigation/bottom-tabs@7.15.5", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-wQHredlCrRmShWQ1vF4HUcLdaiJ8fUgnbaeQH7BJ7MQVQh4mdzab0IOY/4QSmUyNRB350oyu1biTycyQ5FKWMQ=="], @@ -1375,6 +1394,12 @@ "@react-navigation/routers": ["@react-navigation/routers@7.5.3", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg=="], + "@react-stately/flags": ["@react-stately/flags@3.1.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg=="], + + "@react-stately/utils": ["@react-stately/utils@3.11.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw=="], + + "@react-types/shared": ["@react-types/shared@3.33.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.4", "", { "os": "android", "cpu": "arm64" }, "sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w=="], "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q=="], @@ -1411,7 +1436,7 @@ "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + "@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], @@ -1467,24 +1492,32 @@ "@scure/bip39": ["@scure/bip39@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1", "@scure/base": "2.0.0" } }, "sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg=="], - "@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], + "@shikijs/core": ["@shikijs/core@4.0.1", "", { "dependencies": { "@shikijs/primitive": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg=="], - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-oCWdCTDch3J8Kc0OZJ98KuUPC02O1VqIE3W/e2uvrHqTxYRR21RGEJMtchrgrxhsoJJCzmIciKsqG+q/yD+Cxg=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], + "@shikijs/langs": ["@shikijs/langs@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1" } }, "sha512-v/mluaybWdnGJR4GqAR6zh8qAZohW9k+cGYT28Y7M8+jLbC0l4yG085O1A+WkseHTn+awd+P3UBymb2+MXFc8w=="], - "@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], + "@shikijs/primitive": ["@shikijs/primitive@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ns0hHZc5eWZuvuIEJz2pTx3Qecz0aRVYumVQJ8JgWY2tq/dH8WxdcVM49Fc2NsHEILNIT6vfdW9MF26RANWiTA=="], - "@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], + "@shikijs/themes": ["@shikijs/themes@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1" } }, "sha512-FW41C/D6j/yKQkzVdjrRPiJCtgeDaYRJFEyCKFCINuRJRj9WcmubhP4KQHPZ4+9eT87jruSrYPyoblNRyDFzvA=="], - "@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], + "@shikijs/types": ["@shikijs/types@4.0.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-EaygPEn57+jJ76mw+nTLvIpJMAcMPokFbrF8lufsZP7Ukk+ToJYEcswN1G0e49nUZAq7aCQtoeW219A8HK1ZOw=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], "@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="], + "@sindresorhus/base62": ["@sindresorhus/base62@1.0.0", "", {}, "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA=="], + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + "@sindresorhus/slugify": ["@sindresorhus/slugify@3.0.0", "", { "dependencies": { "@sindresorhus/transliterate": "^2.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-SCrKh1zS96q+CuH5GumHcyQEVPsM4Ve8oE0E6tw7AAhGq50K8ojbTUOQnX/j9Mhcv/AXiIsbCfquovyGOo5fGw=="], + + "@sindresorhus/transliterate": ["@sindresorhus/transliterate@2.3.1", "", {}, "sha512-gVaaGtKYMYAMmI8buULVH3A2TXVJ98QiwGwI7ddrWGuGidGC2uRt4FHs22+8iROJ0QTzju9CuMjlVsrvpqsdhA=="], + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], @@ -1505,9 +1538,9 @@ "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], - "@tabler/icons": ["@tabler/icons@3.38.0", "", {}, "sha512-FdETQSpQ3lN7BEjEUzjKhsfTDCamrvMDops4HEMphTm3DmkIFpThoODn8XXZ8Q9MhjshIvphIYVHHB7zpq167w=="], + "@tabler/icons": ["@tabler/icons@3.40.0", "", {}, "sha512-V/Q4VgNPKubRTiLdmWjV/zscYcj5IIk+euicUtaVVqF6luSC9rDngYWgST5/yh3Mrg/mYUwRv1YVTk71Jp0twQ=="], - "@tabler/icons-react": ["@tabler/icons-react@3.38.0", "", { "dependencies": { "@tabler/icons": "3.38.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-kR5wv+m4+GgmnSszg3rQd6SrTFAQ/XnQC/yTwIfuRJSfqB12KoIC7fPbIijFgOHTFlBN5DARnN0IVrR7KYG6/A=="], + "@tabler/icons-react": ["@tabler/icons-react@3.40.0", "", { "dependencies": { "@tabler/icons": "3.40.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-oO5+6QCnna4a//mYubx4euZfECtzQZFDGsDMIdzZUhbdyBCT+3bRVFBPueGIcemWld4Vb/0UQ39C/cmGfGylAg=="], "@tailwindcss/forms": ["@tailwindcss/forms@0.5.11", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA=="], @@ -1541,43 +1574,13 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], - - "@tanstack/history": ["@tanstack/history@1.161.4", "", {}, "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww=="], - - "@tanstack/react-router": ["@tanstack/react-router@1.166.2", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.166.2", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-pKhUtrvVLlhjWhsHkJSuIzh1J4LcP+8ErbIqRLORX9Js8dUFMKoT0+8oFpi+P8QRpuhm/7rzjYiWfcyTsqQZtA=="], - - "@tanstack/react-store": ["@tanstack/react-store@0.9.1", "", { "dependencies": { "@tanstack/store": "0.9.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-YzJLnRvy5lIEFTLWBAZmcOjK3+2AepnBv/sr6NZmiqJvq7zTQggyK99Gw8fqYdMdHPQWXjz0epFKJXC+9V2xDA=="], - - "@tanstack/router-core": ["@tanstack/router-core@1.166.2", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-zn3NhENOAX9ToQiX077UV2OH3aJKOvV2ZMNZZxZ3gDG3i3WqL8NfWfEgetEAfMN37/Mnt90PpotYgf7IyuoKqQ=="], - - "@tanstack/store": ["@tanstack/store@0.9.1", "", {}, "sha512-+qcNkOy0N1qSGsP7omVCW0SDrXtaDcycPqBDE726yryiA5eTDFpjBReaYjghVJwNf1pcPMyzIwTGlYjCSQR0Fg=="], - - "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="], - - "@tauri-apps/cli": ["@tauri-apps/cli@2.10.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.10.1", "@tauri-apps/cli-darwin-x64": "2.10.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", "@tauri-apps/cli-linux-arm64-musl": "2.10.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-musl": "2.10.1", "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", "@tauri-apps/cli-win32-x64-msvc": "2.10.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g=="], - - "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.10.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ=="], + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], - "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.10.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw=="], - - "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.10.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w=="], - - "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA=="], - - "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg=="], - - "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.10.1", "", { "os": "linux", "cpu": "none" }, "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw=="], - - "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw=="], - - "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ=="], - - "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.10.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], - "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.10.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw=="], + "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.21", "", { "dependencies": { "@tanstack/virtual-core": "3.13.21" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-SYXFrmrbPgXBvf+HsOsKhFgqSe4M6B29VHOsX9Jih9TlNkNkDWx0hWMiMLUghMEzyUz772ndzdEeCEBx+3GIZw=="], - "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.10.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg=="], + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.21", "", {}, "sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw=="], "@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], @@ -1603,8 +1606,16 @@ "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], + + "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], + + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + "@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], @@ -1613,21 +1624,25 @@ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="], + "@types/inquirer": ["@types/inquirer@9.0.9", "", { "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw=="], + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], - "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@25.3.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ=="], + "@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], "@types/plist": ["@types/plist@3.0.5", "", { "dependencies": { "@types/node": "*", "xmlbuilder": ">=11.0.1" } }, "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA=="], @@ -1635,14 +1650,20 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "@types/react-highlight-words": ["@types/react-highlight-words@0.20.1", "", { "dependencies": { "@types/react": "*" } }, "sha512-EgF6RaoibBurIhxk3X3d5xL0uMqjD7KtShvZ8S+d7/o6xZ+mQ4rct1a2E49vWA9r63OzrHCIyghqvQHASb/ERw=="], + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], - "@types/sharedworker": ["@types/sharedworker@0.0.222", "", {}, "sha512-lljdQbVNIuPDIWPrgRcIcTR1tbfzU9iB07xyG6XS5oOWLufdCY5w7iReGgrVWYsUIBr0rwlAvicUbZtdISf5Cg=="], + "@types/rss": ["@types/rss@0.0.32", "", {}, "sha512-2oKNqKyUY4RSdvl5eZR1n2Q9yvw3XTe3mQHsFPn9alaNBxfPnbXBtGP8R0SV8pK1PrVnLul0zx7izbm5/gF5Qw=="], + + "@types/sharedworker": ["@types/sharedworker@0.0.221", "", {}, "sha512-SZabQSTltxflklf3aJrFZrZf5h099r5IENsvv3a5pi+NKPyv8osnWsPLjrQsbiMrVlhv80MOCzY8sOsfEZwN1A=="], "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + "@types/through": ["@types/through@0.0.33", "", { "dependencies": { "@types/node": "*" } }, "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -1659,6 +1680,26 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.56.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/type-utils": "8.56.1", "@typescript-eslint/utils": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.56.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.56.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.56.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.1", "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1" } }, "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.56.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/utils": "8.56.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.56.1", "", {}, "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.56.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.56.1", "@typescript-eslint/tsconfig-utils": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.56.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], "@vite-pwa/assets-generator": ["@vite-pwa/assets-generator@1.0.2", "", { "dependencies": { "cac": "^6.7.14", "colorette": "^2.0.20", "consola": "^3.4.2", "sharp": "^0.33.5", "sharp-ico": "^0.1.5", "unconfig": "^7.3.1" }, "bin": { "pwa-assets-generator": "bin/pwa-assets-generator.mjs" } }, "sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg=="], @@ -1673,8 +1714,6 @@ "@vitest/browser-playwright": ["@vitest/browser-playwright@4.0.18", "", { "dependencies": { "@vitest/browser": "4.0.18", "@vitest/mocker": "4.0.18", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "playwright": "*", "vitest": "4.0.18" } }, "sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g=="], - "@vitest/coverage-istanbul": ["@vitest/coverage-istanbul@4.0.18", "", { "dependencies": { "@istanbuljs/schema": "^0.1.3", "@jridgewell/gen-mapping": "^0.3.13", "@jridgewell/trace-mapping": "0.3.31", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "vitest": "4.0.18" } }, "sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ=="], - "@vitest/coverage-v8": ["@vitest/coverage-v8@4.0.18", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.0.18", "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", "std-env": "^3.10.0", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "@vitest/browser": "4.0.18", "vitest": "4.0.18" }, "optionalPeers": ["@vitest/browser"] }, "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg=="], "@vitest/expect": ["@vitest/expect@4.0.18", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ=="], @@ -1717,34 +1756,70 @@ "@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], - "@vue/tsconfig": ["@vue/tsconfig@0.9.0", "", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-RP+v9Cpbsk1ZVXltCHHkYBr7+624x6gcijJXVjIcsYk7JXqvIpRtMwU2ARLvWDhmy9ffdFYxhsfJnPztADBohQ=="], + "@vue/tsconfig": ["@vue/tsconfig@0.8.1", "", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g=="], + + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + + "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], + + "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], + + "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], + + "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], + + "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], + + "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], + + "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], + + "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], + + "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], + + "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@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" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], + + "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@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" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], + + "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], + + "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@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" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], + + "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], + "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], + + "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - "abort-signal-polyfill": ["abort-signal-polyfill@1.0.0", "", { "peerDependencies": { "@types/node": ">=18.18.0" }, "optionalPeers": ["@types/node"] }, "sha512-89GbKgHHfY4TKluDySuVdB1Qm2zZ6E9UrlRur5TxTHXzeLsXdbdiEXvDADhvBJnA9a6vCVZH/+Q0sJj2gbV5vA=="], - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], - "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], - "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "algoliasearch": ["algoliasearch@5.49.1", "", { "dependencies": { "@algolia/abtesting": "1.15.1", "@algolia/client-abtesting": "5.49.1", "@algolia/client-analytics": "5.49.1", "@algolia/client-common": "5.49.1", "@algolia/client-insights": "5.49.1", "@algolia/client-personalization": "5.49.1", "@algolia/client-query-suggestions": "5.49.1", "@algolia/client-search": "5.49.1", "@algolia/ingestion": "1.49.1", "@algolia/monitoring": "1.49.1", "@algolia/recommend": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ=="], "alien-signals": ["alien-signals@3.1.2", "", {}, "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw=="], "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], - "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], - "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], @@ -1759,6 +1834,8 @@ "app-builder-lib": ["app-builder-lib@26.8.1", "", { "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "^4.0.3", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.0.3", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.8.1", "electron-builder-squirrel-windows": "26.8.1" } }, "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw=="], + "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -1769,10 +1846,12 @@ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], + "array-from-async": ["array-from-async@3.0.0", "", {}, "sha512-gV8/L4y2QB5JTXL9DMdtspGyed2M3V6nMnSN+nNg8ejyUlAAbKAjRS6pfWWINjU/MuFJFMGWPazHPor7hThXQw=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], @@ -1785,7 +1864,7 @@ "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], - "astro": ["astro@5.18.0", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-CHiohwJIS4L0G6/IzE1Fx3dgWqXBCXus/od0eGUfxrZJD2um2pE7ehclMmgL/fXqbU7NfE1Ze2pq34h2QaA6iQ=="], + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], @@ -1811,11 +1890,11 @@ "babel-plugin-module-resolver": ["babel-plugin-module-resolver@5.0.2", "", { "dependencies": { "find-babel-config": "^2.1.1", "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", "resolve": "^1.22.8" } }, "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg=="], - "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.15", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw=="], + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.16", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.7", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw=="], "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], - "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.6", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.6" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A=="], + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.7", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.7" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA=="], "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], @@ -1833,9 +1912,7 @@ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], @@ -1851,6 +1928,10 @@ "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "binary-searching": ["binary-searching@2.0.5", "", {}, "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA=="], + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], @@ -1859,13 +1940,11 @@ "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], - "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], - "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], - "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -1883,8 +1962,6 @@ "builder-util-runtime": ["builder-util-runtime@9.5.1", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="], - "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -1901,9 +1978,9 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001776", "", {}, "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -1917,6 +1994,8 @@ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], @@ -1925,14 +2004,14 @@ "chrome-launcher": ["chrome-launcher@0.15.2", "", { "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" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="], "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], - "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], - "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], @@ -1953,6 +2032,8 @@ "code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -1969,7 +2050,7 @@ "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], + "comment-parser": ["comment-parser@1.4.5", "", {}, "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw=="], "common-tags": ["common-tags@1.8.2", "", {}, "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="], @@ -1987,10 +2068,6 @@ "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - - "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], - "core-js-compat": ["core-js-compat@3.48.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q=="], "core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], @@ -1999,16 +2076,12 @@ "cross-dirname": ["cross-dirname@0.1.0", "", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="], - "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + "cross-env": ["cross-env@10.1.0", "", { "dependencies": { "@epic-web/invariant": "^1.0.0", "cross-spawn": "^7.0.6" }, "bin": { "cross-env": "dist/bin/cross-env.js", "cross-env-shell": "dist/bin/cross-env-shell.js" } }, "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], - "css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], - "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], "css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], @@ -2017,8 +2090,6 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], @@ -2039,10 +2110,14 @@ "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], + "dedent-js": ["dedent-js@1.0.1", "", {}, "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="], "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], @@ -2063,8 +2138,6 @@ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], - "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], - "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], @@ -2075,20 +2148,14 @@ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], - "devalue": ["devalue@5.6.3", "", {}, "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg=="], "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], - "dir-compare": ["dir-compare@4.2.0", "", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="], "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], - "dmg-builder": ["dmg-builder@26.8.1", "", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { "dmg-license": "^1.0.11" } }, "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg=="], "dmg-license": ["dmg-license@1.0.11", "", { "dependencies": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", "crc": "^3.8.0", "iconv-corefoundation": "^1.1.7", "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, "os": "darwin", "bin": { "dmg-license": "bin/dmg-license.js" } }, "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q=="], @@ -2107,8 +2174,6 @@ "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], - "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], @@ -2117,7 +2182,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron": ["electron@40.7.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-oQe76S/3V1rcb0+i45hAxnCH8udkRZSaHUNwglzNAEKbB94LSJ1qwbFo8+uRc2UsYZgCqSIMRcyX40GyOkD+Xw=="], + "electron": ["electron@40.8.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-WoPq0Nr9Yx3g7T6VnJXdwa/rr2+VRyH3a+K+ezfMKBlf6WjxE/LmhMQabKbb6yjm9RbZhJBRcYyoLph421O2mQ=="], "electron-builder": ["electron-builder@26.8.1", "", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", "install-app-deps": "install-app-deps.js" } }, "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw=="], @@ -2131,6 +2196,8 @@ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], @@ -2169,10 +2236,16 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -2181,12 +2254,42 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "eslint": ["eslint@10.0.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.3", "@eslint/config-helpers": "^0.5.2", "@eslint/core": "^1.1.1", "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.1.1", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ=="], + + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@62.7.1", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.84.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.5", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^11.1.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], + + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + "esrap": ["esrap@2.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ=="], + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-visit": ["estree-util-visit@1.2.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^2.0.0" } }, "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], @@ -2251,10 +2354,16 @@ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-equals": ["fast-equals@5.4.0", "", {}, "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-stringify": ["fast-stringify@4.0.0", "", {}, "sha512-lE2DIivBaLysf6hK5WH/VfMgqRbvBVHcpGVVTmA5Zi8oWIjq9YxIt6lYGdUgP1HNSXxTIat7HEIDnrSvXSeKQw=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -2263,15 +2372,13 @@ "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], - - "fbjs-css-vars": ["fbjs-css-vars@1.0.2", "", {}, "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fetch-nodeshim": ["fetch-nodeshim@0.4.8", "", {}, "sha512-YW5vG33rabBq6JpYosLNoXoaMN69/WH26MeeX2hkDVjN6UlvRGq3Wkazl9H0kisH95aMu/HtHL64JUvv/+Nv/g=="], + "fetch-nodeshim": ["fetch-nodeshim@0.4.9", "", {}, "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], @@ -2285,17 +2392,19 @@ "find-babel-config": ["find-babel-config@2.1.2", "", { "dependencies": { "json5": "^2.2.3" } }, "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg=="], - "find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], - "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], + "flatted": ["flatted@3.3.4", "", {}, "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA=="], - "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], + "flexsearch": ["flexsearch@0.8.212", "", {}, "sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw=="], + + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], - "fontkitten": ["fontkitten@1.0.2", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q=="], + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], @@ -2303,6 +2412,8 @@ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + "framer-motion": ["framer-motion@12.35.1", "", { "dependencies": { "motion-dom": "^12.35.1", "motion-utils": "^12.29.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rL8cLrjYZNShZqKV3U0Qj6Y5WDiZXYEM5giiTLfEqsIZxtspzMDCkKmrO5po76jWfvOg04+Vk+sfBvTD0iMmLw=="], + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], @@ -2347,16 +2458,16 @@ "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], - "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + "glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], - - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], + "globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -2367,8 +2478,6 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "h3": ["h3@1.15.5", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg=="], - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2383,35 +2492,27 @@ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@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" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], - "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.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" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@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": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], - "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@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" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + "hermes-compiler": ["hermes-compiler@0.14.1", "", {}, "sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA=="], - "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], - "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], - "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], - - "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - - "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - - "hermes-compiler": ["hermes-compiler@250829098.0.9", "", {}, "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ=="], - - "hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], - - "hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "highlight-words-core": ["highlight-words-core@1.2.3", "", {}, "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ=="], "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], @@ -2429,8 +2530,6 @@ "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="], - "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], - "ico-endec": ["ico-endec@0.1.6", "", {}, "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ=="], "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="], @@ -2449,8 +2548,6 @@ "immutable": ["immutable@5.1.5", "", {}, "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -2459,7 +2556,7 @@ "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], @@ -2467,7 +2564,9 @@ "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], - "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], @@ -2489,7 +2588,9 @@ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -2501,7 +2602,7 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], @@ -2549,15 +2650,13 @@ "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], - "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "isbinaryfile": ["isbinaryfile@5.0.7", "", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="], - "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="], - - "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], @@ -2591,7 +2690,7 @@ "jest-validate": ["jest-validate@29.7.0", "", { "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" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], - "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], @@ -2603,13 +2702,19 @@ "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@7.1.1", "", {}, "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA=="], + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], @@ -2633,6 +2738,8 @@ "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], @@ -2665,9 +2772,13 @@ "lmdb": ["lmdb@3.5.1", "", { "dependencies": { "@harperfast/extended-iterable": "^1.0.3", "msgpackr": "^1.11.2", "node-addon-api": "^6.1.0", "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.5.3", "weak-lru-cache": "^1.2.2" }, "optionalDependencies": { "@lmdb/lmdb-darwin-arm64": "3.5.1", "@lmdb/lmdb-darwin-x64": "3.5.1", "@lmdb/lmdb-linux-arm": "3.5.1", "@lmdb/lmdb-linux-arm64": "3.5.1", "@lmdb/lmdb-linux-x64": "3.5.1", "@lmdb/lmdb-win32-arm64": "3.5.1", "@lmdb/lmdb-win32-x64": "3.5.1" }, "bin": { "download-lmdb-prebuilds": "bin/download-prebuilds.js" } }, "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg=="], + "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], + + "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], - "locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], @@ -2689,7 +2800,7 @@ "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], @@ -2703,6 +2814,8 @@ "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + "markdown-it": ["markdown-it@14.1.1", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], @@ -2713,8 +2826,6 @@ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], - "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@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" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], @@ -2731,6 +2842,14 @@ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "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" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@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" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@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" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@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" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@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" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], @@ -2743,6 +2862,8 @@ "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], + "mdx-annotations": ["mdx-annotations@0.1.4", "", { "dependencies": { "acorn": "^8.8.1", "estree-util-visit": "^1.2.0", "unist-util-visit": "^4.1.1" } }, "sha512-SUYBUXP1qbgr0nRFFnUBg4HxxTbYyl5rE38fLTaIm0naPK+EhmKa0wRlUdgTMlMBj5gdCMwP1n7+L47JIHHWUQ=="], + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], @@ -2777,6 +2898,8 @@ "metro-transform-worker": ["metro-transform-worker@0.83.3", "", { "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" } }, "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA=="], + "micro-memoize": ["micro-memoize@5.1.1", "", { "dependencies": { "fast-equals": "^5.3.3", "fast-stringify": "^4.0.0" } }, "sha512-QDwluos8YeMijiKxZGwaV4f4tzj0soS6+xcsJhJ3+4wdEIHMyKbIKVUziebOgWX3e6yiijdoaHo+9tyhbnaWXA=="], + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@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" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "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" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], @@ -2795,10 +2918,22 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "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" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "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" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "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" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "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" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "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" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@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" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "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" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], @@ -2819,6 +2954,8 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "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" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], @@ -2849,7 +2986,7 @@ "mini-svg-data-uri": ["mini-svg-data-uri@1.4.4", "", { "bin": { "mini-svg-data-uri": "cli.js" } }, "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="], - "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -2871,6 +3008,12 @@ "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + "motion": ["motion@12.35.1", "", { "dependencies": { "framer-motion": "^12.35.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-yEt/49kWC0VU/IEduDfeZw82eDemlPwa1cyo/gcEEUCN4WgpSJpUcxz6BUwakGabvJiTzLQ58J73515I5tfykQ=="], + + "motion-dom": ["motion-dom@12.35.1", "", { "dependencies": { "motion-utils": "^12.29.2" } }, "sha512-7n6r7TtNOsH2UFSAXzTkfzOeO5616v9B178qBIjmu/WgEyJK0uqwytCEhwKBTuM/HJA40ptAw7hLFpxtPAMRZQ=="], + + "motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="], + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], @@ -2891,13 +3034,15 @@ "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], - "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], "node-abi": ["node-abi@3.87.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ=="], @@ -2905,10 +3050,6 @@ "node-api-version": ["node-api-version@0.2.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - - "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], "node-gyp": ["node-gyp@11.5.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ=="], @@ -2917,8 +3058,6 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], - "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], @@ -2935,7 +3074,7 @@ "ob1": ["ob1@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "object-deep-merge": ["object-deep-merge@2.0.0", "", {}, "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -2947,10 +3086,6 @@ "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], @@ -2965,6 +3100,8 @@ "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "ora": ["ora@3.4.0", "", { "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" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], "ordered-binary": ["ordered-binary@1.6.1", "", {}, "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w=="], @@ -2977,26 +3114,28 @@ "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], - "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], - "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], - - "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], - "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], + "package-up": ["package-up@5.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0" } }, "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "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" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-imports-exports": ["parse-imports-exports@0.2.4", "", { "dependencies": { "parse-statements": "1.0.11" } }, "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ=="], "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], + "parse-statements": ["parse-statements@1.0.11", "", {}, "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA=="], + "parse5": ["parse5@8.0.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA=="], "parse5-html-rewriting-stream": ["parse5-html-rewriting-stream@8.0.0", "", { "dependencies": { "entities": "^6.0.0", "parse5": "^8.0.0", "parse5-sax-parser": "^8.0.0" } }, "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw=="], @@ -3025,8 +3164,6 @@ "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -3057,20 +3194,28 @@ "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], "prebuild-install": ["prebuild-install@7.1.3", "", { "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": "^2.0.0", "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" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], - "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + + "prettier-plugin-embed": ["prettier-plugin-embed@0.5.1", "", { "dependencies": { "@types/estree": "^1.0.8", "dedent": "^1.7.1", "micro-memoize": "^5.1.1", "package-up": "^5.0.0", "tiny-jsonc": "^1.0.2", "type-fest": "^5.3.1" } }, "sha512-2Ege8gIlLNTvHElUeU5XcFsD7/dbDXkQA6H9TczHSJAGxB58nNjjifk/dlRMS5E29eqQx/z+ToA4ZVMWzjME/A=="], + + "prettier-plugin-jsdoc": ["prettier-plugin-jsdoc@1.8.0", "", { "dependencies": { "binary-searching": "^2.0.5", "comment-parser": "^1.4.0", "mdast-util-from-markdown": "^2.0.0" }, "peerDependencies": { "prettier": "^3.0.0" } }, "sha512-byW8EBZ1DSA3CPdDGBXfcdqqhh2eq0+HlIOPTGZ6rf9O2p/AwBmtS0e49ot5ZeOdcszj81FyzbyHr/VS0eYpCg=="], + + "prettier-plugin-sql-cst": ["prettier-plugin-sql-cst@0.18.0", "", { "dependencies": { "prettier": "^3.0.3", "sql-parser-cst": "^0.38.2" } }, "sha512-IEbKtlZ+H94uWFHQt4iKWMiJJRIuzWYw8jeLz+RCzy4bDtsM3/07GIF1+EFCbT9d0gWibTPotZWx8o3hz+ITeA=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.7.2", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA=="], "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], - "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -3081,6 +3226,10 @@ "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + "promise.try": ["promise.try@2.0.1", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "set-function-name": "^2.0.2" } }, "sha512-7Lvq1rrywExCch6Uyw8P5G0HrgYs1u2rxY+0HFBMoA5IqndrJrSGc+ybRnPY1N78F8x+j9BaOWNbg7bzTMG9NA=="], + + "promise.withresolvers": ["promise.withresolvers@1.0.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0" } }, "sha512-T75mGtyQ+r0CeIWk4rYVP0YN0GsO8r8RfF2SLHKVOhg6Hi0BVNWzMybbeqnXYTRoVZcUt8rKoVl0taxKffhpbA=="], + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], @@ -3105,7 +3254,9 @@ "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], - "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + "random": ["random@5.4.1", "", {}, "sha512-HtccRkYkAXCbj9bqsyGKGlicyeZ5AsQgs49fEuUO/BvrJ7WOQqXPjdg1CZrFjBkoT75ozrWlQXJ7TcXXLv2ISQ=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], @@ -3121,9 +3272,11 @@ "react-freeze": ["react-freeze@1.0.4", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA=="], + "react-highlight-words": ["react-highlight-words@0.21.0", "", { "dependencies": { "highlight-words-core": "^1.2.0", "memoize-one": "^4.0.0" }, "peerDependencies": { "react": "^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-SdWEeU9fIINArEPO1rO5OxPyuhdEKZQhHzZZP1ie6UeXQf+CjycT1kWaB+9bwGcVbR0NowuHK3RqgqNg6bgBDQ=="], + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - "react-native": ["react-native@0.84.1", "", { "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" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.3" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg=="], + "react-native": ["react-native@0.83.2", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.83.2", "@react-native/codegen": "0.83.2", "@react-native/community-cli-plugin": "0.83.2", "@react-native/gradle-plugin": "0.83.2", "@react-native/js-polyfills": "0.83.2", "@react-native/normalize-colors": "0.83.2", "@react-native/virtualized-lists": "0.83.2", "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.1", "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" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-ZDma3SLkRN2U2dg0/EZqxNBAx4of/oTnPjXAQi299VLq2gdnbZowGy9hzqv+O7sTA62g+lM1v+2FM5DUnJ/6hg=="], "react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.3.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA=="], @@ -3133,16 +3286,14 @@ "react-native-quick-crypto": ["react-native-quick-crypto@1.0.16", "", { "dependencies": { "@craftzdog/react-native-buffer": "6.1.0", "events": "3.3.0", "readable-stream": "4.5.2", "safe-buffer": "^5.2.1", "string_decoder": "^1.3.0", "util": "0.12.5" }, "peerDependencies": { "expo": ">=48.0.0", "expo-build-properties": "*", "react": "*", "react-native": "*", "react-native-nitro-modules": ">=0.29.1", "react-native-quick-base64": ">=2.1.0" }, "optionalPeers": ["expo", "expo-build-properties"] }, "sha512-UsKd6EgEl9et5FrTeYy82NHDigVSoJSLTyccWAhmO1Iri8rjgve93uzXuFP3EZPB7rwxoEmG/pCRsgESKxrw2A=="], - "react-native-safe-area-context": ["react-native-safe-area-context@5.7.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ=="], + "react-native-safe-area-context": ["react-native-safe-area-context@5.6.2", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg=="], - "react-native-screens": ["react-native-screens@4.24.0", "", { "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-SyoiGaDofiyGPFrUkn1oGsAzkRuX1JUvTD9YQQK3G1JGQ5VWkvHgYSsc1K9OrLsDQxN7NmV71O0sHCAh8cBetA=="], + "react-native-screens": ["react-native-screens@4.23.0", "", { "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw=="], - "react-native-sensitive-info": ["react-native-sensitive-info@6.0.0-rc.12", "", { "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }, "sha512-3G0W+AZEt79tfN1SAJsIZHB6wSe5o5fKfvbSqsPSutcHB3lV3ebgNvNu6PK44YmSmSdYU5hL3J3ceTXOgkOjXA=="], + "react-native-sensitive-info": ["react-native-sensitive-info@6.0.0-rc.11", "", { "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }, "sha512-nBVUcjXK4T2KjdH+nIZaCgS0HbX8AtiOWSvAdkZEoOvnUxpo+l+r9dvSWcIPbhj/EHLiZmTM4WbEATLokwe5tQ=="], "react-native-svg": ["react-native-svg@15.15.3", "", { "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", "warn-once": "0.1.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-/k4KYwPBLGcx2f5d4FjE+vCScK7QOX14cl2lIASJ28u4slHHtIhL0SZKU7u9qmRBHxTCKPoPBtN6haT1NENJNA=="], - "react-native-web": ["react-native-web@0.21.2", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^7.0.1", "memoize-one": "^6.0.0", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg=="], - "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], @@ -3159,6 +3310,14 @@ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "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" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], @@ -3183,22 +3342,18 @@ "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], - "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], - - "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], - - "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], - "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@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" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@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" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], - "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], - "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], @@ -3209,6 +3364,8 @@ "reselect": ["reselect@4.1.8", "", {}, "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="], + "reserved-identifiers": ["reserved-identifiers@1.2.0", "", {}, "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], @@ -3221,14 +3378,6 @@ "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], - "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], - - "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], - - "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], - - "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -3243,6 +3392,8 @@ "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "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" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], + "rss": ["rss@1.2.2", "", { "dependencies": { "mime-types": "2.1.13", "xml": "1.0.1" } }, "sha512-xUhRTgslHeCBeHAqaWSbOYTydN2f0tAzNXvzh3stjz7QDhQMzdgHf3pfgNIngeytQflrFPfy6axHilTETr6gDg=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], @@ -3267,8 +3418,12 @@ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], @@ -3277,11 +3432,7 @@ "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], - "serialize-javascript": ["serialize-javascript@7.0.4", "", {}, "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg=="], - - "seroval": ["seroval@1.5.0", "", {}, "sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw=="], - - "seroval-plugins": ["seroval-plugins@1.5.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA=="], + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], @@ -3307,15 +3458,13 @@ "set.prototype.union": ["set.prototype.union@1.1.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set": "^1.1.1", "get-intrinsic": "^1.2.4", "is-set": "^2.0.3", "stop-iteration-iterator": "^1.0.0" } }, "sha512-FbjDcc80Ph43roJELrwXuFnQhf2kImcHr7elcegrXYB/B1++HMFk/qKpCjvR1qKiU4Z79bPgOhJyteg769fudg=="], - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "sf-symbols-typescript": ["sf-symbols-typescript@2.2.0", "", {}, "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw=="], "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], - "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], "sharp-ico": ["sharp-ico@0.1.5", "", { "dependencies": { "decode-ico": "*", "ico-endec": "*", "sharp": "*" } }, "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q=="], @@ -3325,7 +3474,7 @@ "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], - "shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.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", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], + "shiki": ["shiki@4.0.1", "", { "dependencies": { "@shikijs/core": "4.0.1", "@shikijs/engine-javascript": "4.0.1", "@shikijs/engine-oniguruma": "4.0.1", "@shikijs/langs": "4.0.1", "@shikijs/themes": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-EkAEhDTN5WhpoQFXFw79OHIrSAfHhlImeCdSyg4u4XvrpxKEmdo/9x/HWSowujAnUrFsGOwWiE58a6GVentMnQ=="], "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], @@ -3341,6 +3490,8 @@ "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + "simple-functional-loader": ["simple-functional-loader@1.2.1", "", { "dependencies": { "loader-utils": "^2.0.0" } }, "sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ=="], + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], @@ -3363,13 +3514,11 @@ "smob": ["smob@1.6.1", "", {}, "sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g=="], - "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], - "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -3381,10 +3530,18 @@ "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], + "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + "sql-parser-cst": ["sql-parser-cst@0.38.2", "", {}, "sha512-4SR3cZYMxG4gsmvZQSQYYzzfk20OnbpsnwOVbU6Fw39ORLPpIHCMqoX5li0dz+ZWyF5HeR+mSgbgayKhN4JR9w=="], + "ssri": ["ssri@12.0.0", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ=="], "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], @@ -3437,9 +3594,11 @@ "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], - "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], - "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], @@ -3451,11 +3610,13 @@ "svelte": ["svelte@5.53.7", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-uxck1KI7JWtlfP3H6HOWi/94soAl23jsGJkBzN2BAWcQng0+lTrRNhxActFqORgnO9BHVd1hKJhG+ljRuIUWfQ=="], - "svelte-check": ["svelte-check@4.4.4", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ=="], + "svelte-check": ["svelte-check@4.4.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw=="], - "svelte2tsx": ["svelte2tsx@0.7.51", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0" } }, "sha512-YbVMQi5LtQkVGOMdATTY8v3SMtkNjzYtrVDGaN3Bv+0LQ47tGXu/Oc8ryTkcYuEJWTZFJ8G2+2I8ORcQVGt9Ag=="], + "svelte2tsx": ["svelte2tsx@0.7.52", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0" } }, "sha512-svdT1FTrCLpvlU62evO5YdJt/kQ7nxgQxII/9BpQUvKr+GJRVdAXNVw8UWOt0fhoe5uWKyU0WsUTMRVAtRbMQg=="], - "svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], + "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], + + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], @@ -3481,17 +3642,15 @@ "terser": ["terser@5.46.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg=="], + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.17", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw=="], + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], "tiny-async-pool": ["tiny-async-pool@1.3.0", "", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="], - "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], - - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - - "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + "tiny-jsonc": ["tiny-jsonc@1.0.2", "", {}, "sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], @@ -3511,6 +3670,8 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="], + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], "toqr": ["toqr@0.1.1", "", {}, "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA=="], @@ -3525,31 +3686,33 @@ "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], - "ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], - "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + "ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - "turbo": ["turbo@2.8.13", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.13", "turbo-darwin-arm64": "2.8.13", "turbo-linux-64": "2.8.13", "turbo-linux-arm64": "2.8.13", "turbo-windows-64": "2.8.13", "turbo-windows-arm64": "2.8.13" }, "bin": { "turbo": "bin/turbo" } }, "sha512-nyM99hwFB9/DHaFyKEqatdayGjsMNYsQ/XBNO6MITc7roncZetKb97MpHxWf3uiU+LB9c9HUlU3Jp2Ixei2k1A=="], + "turbo": ["turbo@2.8.14", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.14", "turbo-darwin-arm64": "2.8.14", "turbo-linux-64": "2.8.14", "turbo-linux-arm64": "2.8.14", "turbo-windows-64": "2.8.14", "turbo-windows-arm64": "2.8.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.8.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-9sFi7n2lLfEsGWi5OEoA/eTtQU2BPKtzSYKqufMtDeRmqMT9vKjbv9gJCRkllSVE9BOXA0qXC3diyX8V8rKIKw=="], - "turbo-darwin-64": ["turbo-darwin-64@2.8.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-PmOvodQNiOj77+Zwoqku70vwVjKzL34RTNxxoARjp5RU5FOj/CGiC6vcDQhNtFPUOWSAaogHF5qIka9TBhX4XA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aS4yJuy6A1PCLws+PJpZP0qCURG8Y5iVx13z/WAbKyeDTY6W6PiGgcEllSaeLGxyn++382ztN/EZH85n2zZ6VQ=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kI+anKcLIM4L8h+NsM7mtAUpElkCOxv5LgiQVQR8BASyDFfc8Efj5kCk3cqxuxOvIqx0sLfCX7atrHQ2kwuNJQ=="], + "turbo-linux-64": ["turbo-linux-64@2.8.14", "", { "os": "linux", "cpu": "x64" }, "sha512-XC6wPUDJkakjhNLaS0NrHDMiujRVjH+naEAwvKLArgqRaFkNxjmyNDRM4eu3soMMFmjym6NTxYaF74rvET+Orw=="], - "turbo-linux-64": ["turbo-linux-64@2.8.13", "", { "os": "linux", "cpu": "x64" }, "sha512-j29KnQhHyzdzgCykBFeBqUPS4Wj7lWMnZ8CHqytlYDap4Jy70l4RNG46pOL9+lGu6DepK2s1rE86zQfo0IOdPw=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-ChfE7isyVNjZrVSPDwcfqcHLG/FuIBbOFxnt1FM8vSuBGzHAs8AlTdwFNIxlEMJfZ8Ad9mdMxdmsCUPIWiQ6cg=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.8.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-OEl1YocXGZDRDh28doOUn49QwNe82kXljO1HXApjU0LapkDiGpfl3jkAlPKxEkGDSYWc8MH5Ll8S16Rf5tEBYg=="], + "turbo-windows-64": ["turbo-windows-64@2.8.14", "", { "os": "win32", "cpu": "x64" }, "sha512-FTbIeQL1ycLFW2t9uQNMy+bRSzi3Xhwun/e7ZhFBdM+U0VZxxrtfYEBM9CHOejlfqomk6Jh7aRz0sJoqYn39Hg=="], - "turbo-windows-64": ["turbo-windows-64@2.8.13", "", { "os": "win32", "cpu": "x64" }, "sha512-717bVk1+Pn2Jody7OmWludhEirEe0okoj1NpRbSm5kVZz/yNN/jfjbxWC6ilimXMz7xoMT3IDfQFJsFR3PMANA=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-KgZX12cTyhY030qS7ieT8zRkhZZE2VWJasDFVUSVVn17nR7IShpv68/7j5UqJNeRLIGF1XPK0phsP5V5yw3how=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.8.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-R819HShLIT0Wj6zWVnIsYvSNtRNj1q9VIyaUz0P24SMcLCbQZIm1sV09F4SDbg+KCCumqD2lcaR2UViQ8SnUJA=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], - "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + "type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -3565,25 +3728,19 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], + "typescript-eslint": ["typescript-eslint@8.56.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.56.1", "@typescript-eslint/parser": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/utils": "8.56.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ=="], "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], - "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], - - "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], "unconfig": ["unconfig@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "defu": "^6.1.4", "jiti": "^2.6.1", "quansync": "^1.0.0", "unconfig-core": "7.5.0" } }, "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA=="], "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="], - "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - "undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], @@ -3595,38 +3752,30 @@ "unified": ["unified@11.0.5", "", { "dependencies": { "@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" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], - "unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], - "unique-filename": ["unique-filename@4.0.0", "", { "dependencies": { "unique-slug": "^5.0.0" } }, "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ=="], "unique-slug": ["unique-slug@5.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg=="], "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], - "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + "unist-util-filter": ["unist-util-filter@5.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], - "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], - "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], - "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], - "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="], - "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], @@ -3663,8 +3812,6 @@ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], - "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], - "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], @@ -3697,17 +3844,21 @@ "weak-lru-cache": ["weak-lru-cache@1.2.2", "", {}, "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw=="], - "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + "web": ["web@workspace:apps/web"], "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], + "webpack": ["webpack@5.105.4", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@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.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "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.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "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" } }, "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw=="], + + "webpack-sources": ["webpack-sources@3.3.4", "", {}, "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q=="], + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], "whatwg-url-minimum": ["whatwg-url-minimum@0.1.1", "", {}, "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA=="], - "which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -3715,13 +3866,11 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], - "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "workbox-background-sync": ["workbox-background-sync@7.4.0", "", { "dependencies": { "idb": "^7.0.1", "workbox-core": "7.4.0" } }, "sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w=="], @@ -3767,12 +3916,12 @@ "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], + "xml": ["xml@1.0.1", "", {}, "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw=="], + "xml2js": ["xml2js@0.6.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w=="], "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], @@ -3785,11 +3934,7 @@ "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], - - "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], - - "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], @@ -3797,21 +3942,19 @@ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], - "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], + "zustand": ["zustand@5.0.11", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@angular-devkit/core/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "@angular-devkit/core/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "@angular/common/@angular/core": ["@angular/core@21.2.0", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/compiler": "21.2.0", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, "optionalPeers": ["@angular/compiler", "zone.js"] }, "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA=="], + "@angular-devkit/core/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], "@angular/compiler-cli/yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], - - "@astrojs/react/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + "@apideck/better-ajv-errors/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -3819,8 +3962,6 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -3829,15 +3970,17 @@ "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/preset-env/babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.14.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.6", "core-js-compat": "^3.48.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ=="], + "@babel/preset-env/babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.14.1", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.7", "core-js-compat": "^3.48.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw=="], "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@develar/schema-utils/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], - "@electron/asar/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@develar/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - "@electron/asar/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "@electron/asar/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], "@electron/asar/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -3859,8 +4002,14 @@ "@electron/universal/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], + "@electron/universal/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "@electron/windows-sign/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@example/react-expo/react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], + "@expo/cli/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], "@expo/cli/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], @@ -3875,17 +4024,23 @@ "@expo/fingerprint/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "@expo/fingerprint/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "@expo/metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], "@expo/metro/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], "@expo/metro-config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + "@expo/metro-config/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "@expo/metro-config/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], - "@expo/prebuild-config/@react-native/normalize-colors": ["@react-native/normalize-colors@0.83.2", "", {}, "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q=="], + "@gerrit0/mini-shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], + + "@gerrit0/mini-shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], + + "@gerrit0/mini-shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], + + "@gerrit0/mini-shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -3923,9 +4078,7 @@ "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - "@react-native/babel-plugin-codegen/@react-native/codegen": ["@react-native/codegen@0.83.2", "", { "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" } }, "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA=="], - - "@react-native/community-cli-plugin/@react-native/dev-middleware": ["@react-native/dev-middleware@0.84.1", "", { "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" } }, "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ=="], + "@react-native/codegen/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], "@react-native/community-cli-plugin/metro": ["metro@0.83.5", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "accepts": "^2.0.0", "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.33.3", "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.5", "metro-cache": "0.83.5", "metro-cache-key": "0.83.5", "metro-config": "0.83.5", "metro-core": "0.83.5", "metro-file-map": "0.83.5", "metro-resolver": "0.83.5", "metro-runtime": "0.83.5", "metro-source-map": "0.83.5", "metro-symbolicate": "0.83.5", "metro-transform-plugins": "0.83.5", "metro-transform-worker": "0.83.5", "mime-types": "^3.0.1", "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" } }, "sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ=="], @@ -3937,17 +4090,23 @@ "@react-navigation/core/react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="], - "@rollup/plugin-babel/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], - "@rollup/plugin-babel/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], - "@rollup/plugin-replace/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + "@rollup/plugin-node-resolve/@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], "@rollup/plugin-replace/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], "@rollup/plugin-replace/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], - "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "@rollup/pluginutils/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], + + "@sindresorhus/slugify/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], @@ -3963,6 +4122,12 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@ts-morph/common/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@vite-pwa/assets-generator/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "@vitejs/plugin-react/react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], "@vitejs/plugin-vue/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="], @@ -3973,7 +4138,9 @@ "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "ajv-keywords/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + "ajv-formats/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "ajv-keywords/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -3985,22 +4152,16 @@ "app-builder-lib/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "app-builder-lib/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - - "astro/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - - "astro/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], - - "astro/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], - - "astro/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], - - "astro/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "app-builder-lib/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "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" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + "babel-plugin-module-resolver/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "babel-plugin-syntax-hermes-parser/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "beasties/css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], "beasties/css-what": ["css-what@7.0.0", "", {}, "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ=="], @@ -4011,14 +4172,6 @@ "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - - "boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - - "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - - "boxen/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "builder-util/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "cacache/glob": ["glob@10.5.0", "", { "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" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], @@ -4031,10 +4184,6 @@ "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - - "chromium-edge-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "chromium-edge-launcher/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], "cli-truncate/string-width": ["string-width@8.2.0", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw=="], @@ -4051,24 +4200,14 @@ "crc/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], - "dir-compare/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "dir-compare/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "dmg-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "dmg-builder/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - "dmg-license/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], - - "electron/@types/node": ["@types/node@24.11.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw=="], - "electron-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "electron-publish/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], @@ -4077,11 +4216,15 @@ "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "esast-util-from-estree/estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], "expo-router/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "fbjs/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], @@ -4095,16 +4238,10 @@ "fs-minipass/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], + "glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "global-agent/serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], - "h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], - - "hast-util-from-html/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - - "hast-util-raw/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], "htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], @@ -4113,24 +4250,20 @@ "iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], - "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "jest-haste-map/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "jest-validate/camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "listr2/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "log-update/ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], @@ -4145,6 +4278,8 @@ "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "make-fetch-happen/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "make-fetch-happen/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], @@ -4153,22 +4288,40 @@ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "mdx-annotations/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], + "metro/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + "metro/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + + "metro/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], "metro/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], + "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "metro-babel-transformer/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "metro-config/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], + "metro-file-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "metro-source-map/metro-symbolicate": ["metro-symbolicate@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA=="], + "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "metro-symbolicate/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], + "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "metro-transform-worker/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], + "micromark-util-events-to-acorn/estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "minipass-collect/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], @@ -4185,23 +4338,17 @@ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "next/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], - - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "node-gyp/proc-log": ["proc-log@5.0.0", "", {}, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="], - "npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], - - "open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "node-gyp/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], - "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], - "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse-png/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], @@ -4213,6 +4360,8 @@ "path-scurry/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + "pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], @@ -4221,30 +4370,28 @@ "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "react-native/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - - "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], + "react-highlight-words/memoize-one": ["memoize-one@4.1.0", "", {}, "sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA=="], - "react-native-web/memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], + "react-native/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.4", "", {}, "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ=="], "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "rss/mime-types": ["mime-types@2.1.13", "", { "dependencies": { "mime-db": "~1.25.0" } }, "sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ=="], + "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "schema-utils/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "set.prototype.intersection/es-set": ["es-set@2.0.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-map": "^1.0.6", "es-set-tostringtag": "^2.0.3", "for-each": "^0.3.3", "functions-have-names": "^1.2.3", "get-intrinsic": "^1.2.5", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-symbols": "^1.1.0", "internal-slot": "^1.0.7", "iterate-value": "^1.0.2", "object.entries": "^1.1.8", "stop-iteration-iterator": "^1.0.0" } }, "sha512-w2EDjbgK6Xl23Bxob5Jgrcd+x7e51HxGssmP9GYZ0NbNLhtg9mHiVY9RxO7UsHHn0v10nt5cq2iFJ4GzibAP1Q=="], - "sharp-ico/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], - "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -4257,11 +4404,9 @@ "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - "svelte-check/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - - "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], - "svgo/css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], + "svelte-check/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], @@ -4279,21 +4424,23 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "test-exclude/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + "typedoc/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "unconfig/quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], "unconfig-core/quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], - "unifont/css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], - "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "webpack/es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], + + "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "workbox-build/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "workbox-build/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], @@ -4313,7 +4460,7 @@ "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], - "zod-to-ts/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@angular/compiler-cli/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -4321,17 +4468,7 @@ "@angular/compiler-cli/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], - - "@astrojs/react/@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], - - "@astrojs/react/vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - - "@astrojs/react/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "@develar/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "@apideck/better-ajv-errors/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -4355,24 +4492,20 @@ "@electron/universal/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/windows-sign/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "@expo/cli/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "@expo/cli/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/cli/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "@expo/config-plugins/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "@expo/config-plugins/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/config-plugins/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "@expo/config/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "@expo/config/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], @@ -4381,16 +4514,16 @@ "@expo/fingerprint/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], - - "@expo/metro-config/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "@expo/metro-config/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/metro-config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + "@expo/metro-config/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + "@expo/metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "@expo/metro/metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "@inquirer/core/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], @@ -4403,13 +4536,7 @@ "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "@react-native/babel-plugin-codegen/@react-native/codegen/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.84.1", "", {}, "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw=="], - - "@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-shell": ["@react-native/debugger-shell@0.84.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", "fb-dotslash": "0.5.8" } }, "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ=="], - - "@react-native/community-cli-plugin/@react-native/dev-middleware/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "@react-native/codegen/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], "@react-native/community-cli-plugin/metro/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], @@ -4417,6 +4544,8 @@ "@react-native/community-cli-plugin/metro/hermes-parser": ["hermes-parser@0.33.3", "", { "dependencies": { "hermes-estree": "0.33.3" } }, "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA=="], + "@react-native/community-cli-plugin/metro/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "@react-native/community-cli-plugin/metro/metro-babel-transformer": ["metro-babel-transformer@0.83.5", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.33.3", "nullthrows": "^1.1.1" } }, "sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA=="], "@react-native/community-cli-plugin/metro/metro-cache": ["metro-cache@0.83.5", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.5" } }, "sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng=="], @@ -4435,95 +4564,81 @@ "@react-native/community-cli-plugin/metro/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "@react-native/community-cli-plugin/metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "@react-native/community-cli-plugin/metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "@react-native/community-cli-plugin/metro-config/metro-cache": ["metro-cache@0.83.5", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.5" } }, "sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng=="], "@react-native/community-cli-plugin/metro-core/metro-resolver": ["metro-resolver@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A=="], - "@rollup/plugin-babel/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], - - "@rollup/plugin-babel/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], - - "@rollup/plugin-babel/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "@rollup/plugin-babel/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@rollup/plugin-replace/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], - - "@rollup/plugin-replace/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], - - "@rollup/plugin-replace/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@rollup/plugin-node-resolve/@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@rollup/plugin-replace/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "@rollup/pluginutils/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - "app-builder-lib/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - "app-builder-lib/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - "app-builder-lib/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - "astro/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - "astro/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], - "astro/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - "astro/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - "astro/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - "astro/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - "astro/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - "astro/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], - "astro/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - "astro/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - "astro/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - "astro/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - "astro/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], - "astro/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - "astro/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "@vite-pwa/assets-generator/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "astro/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "astro/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "astro/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], - - "astro/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - - "astro/vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - - "astro/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "better-opn/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "app-builder-lib/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - "better-opn/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "app-builder-lib/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "boxen/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "app-builder-lib/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], - "boxen/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], - "boxen/wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + "babel-plugin-syntax-hermes-parser/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], "builder-util/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], @@ -4531,9 +4646,7 @@ "cacache/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - "chrome-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - - "chromium-edge-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "cacache/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], @@ -4541,20 +4654,12 @@ "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], - "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "dir-compare/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "dmg-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "dmg-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "electron-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "electron-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -4563,20 +4668,20 @@ "electron-publish/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "electron/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "global-agent/serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], - - "hast-util-from-html/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "hast-util-raw/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "global-agent/serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], "hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "iconv-corefoundation/cli-truncate/slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], + "jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "listr2/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -4603,59 +4708,35 @@ "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "metro-symbolicate/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "mdx-annotations/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "metro-transform-worker/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "mdx-annotations/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], - "metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "mdx-annotations/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], - "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "metro-babel-transformer/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], - "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "next/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - - "next/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - - "next/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - - "next/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - - "next/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - - "next/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - - "next/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - - "next/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "metro-file-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "next/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], - - "next/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], - - "next/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], - - "next/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "metro-symbolicate/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "next/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "metro-transform-worker/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "next/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "metro-transform-worker/metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "next/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "metro/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], - "next/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "metro/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "next/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + "metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "next/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "next/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "node-gyp/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -4667,76 +4748,36 @@ "ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], + "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "rss/mime-types/mime-db": ["mime-db@1.25.0", "", {}, "sha512-5k547tI4Cy+Lddr/hdjNbBEWBwSl8EBc5aSdKvedav8DReADgWJzcYiktaRIw3GtGC1jjwldXtTzvqJZmtvC7w=="], "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "sharp-ico/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - - "sharp-ico/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - - "sharp-ico/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - - "sharp-ico/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - - "sharp-ico/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - - "sharp-ico/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - - "sharp-ico/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - - "sharp-ico/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], - - "sharp-ico/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], - - "sharp-ico/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "sharp-ico/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], - - "sharp-ico/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], - - "sharp-ico/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], - - "sharp-ico/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], - - "sharp-ico/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], - - "sharp-ico/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], - - "sharp-ico/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], - - "sharp-ico/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], - - "sharp-ico/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "svelte-check/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "svgo/css-tree/mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], - "temp-file/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "temp-file/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "temp/rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "test-exclude/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "unifont/css-tree/mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], + "typedoc/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "widest-line/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "widest-line/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + "workbox-build/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "workbox-build/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "workbox-build/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "workbox-build/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "workbox-build/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "workbox-build/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], @@ -4751,69 +4792,21 @@ "@angular/compiler-cli/yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "@astrojs/react/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "@astrojs/react/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "@astrojs/react/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "@astrojs/react/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "@astrojs/react/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - - "@astrojs/react/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - - "@astrojs/react/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - - "@astrojs/react/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - - "@astrojs/react/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "@astrojs/react/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - - "@astrojs/react/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "@astrojs/react/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - - "@astrojs/react/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "@astrojs/react/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - - "@astrojs/react/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - - "@astrojs/react/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - - "@astrojs/react/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - - "@astrojs/react/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "@electron/asar/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "@electron/rebuild/ora/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], - "@expo/cli/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@electron/universal/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "@expo/cli/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], - "@expo/config-plugins/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@expo/config-plugins/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], - "@expo/config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@expo/config/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], - "@expo/fingerprint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@expo/fingerprint/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], - "@expo/metro-config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@expo/metro-config/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], @@ -4821,77 +4814,31 @@ "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "@react-native/babel-plugin-codegen/@react-native/codegen/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "@react-native/community-cli-plugin/metro/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "@react-native/community-cli-plugin/metro/hermes-parser/hermes-estree": ["hermes-estree@0.33.3", "", {}, "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg=="], + "@react-native/community-cli-plugin/metro/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "@react-native/community-cli-plugin/metro/metro-transform-worker/metro-minify-terser": ["metro-minify-terser@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q=="], "@react-native/community-cli-plugin/metro/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "app-builder-lib/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "astro/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "astro/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "astro/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "astro/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "astro/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - - "astro/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - - "astro/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - - "astro/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - - "astro/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "astro/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "astro/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "astro/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "astro/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "astro/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "astro/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "astro/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "astro/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "astro/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - - "astro/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "astro/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - - "astro/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "astro/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - - "astro/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + "cacache/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "astro/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "astro/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "astro/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "dir-compare/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "cacache/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "iconv-corefoundation/cli-truncate/slice-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -4911,15 +4858,17 @@ "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "temp/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "test-exclude/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "workbox-build/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "typedoc/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "workbox-build/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], "@angular/compiler-cli/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], @@ -4931,19 +4880,11 @@ "@electron/rebuild/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "@expo/cli/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "@expo/config-plugins/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "@expo/config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "@expo/metro-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - "@react-native/babel-plugin-codegen/@react-native/codegen/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "babel-plugin-module-resolver/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "cacache/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -4951,13 +4892,13 @@ "cacache/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "workbox-build/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "@electron/rebuild/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], From 0aaab74e023a28379eda36e2922380ec747dcdec Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:44:32 +0100 Subject: [PATCH 03/24] sync(common-v8): port 485ea45 Improve require-pure-annotation rule and add tests Source upstream commit: 485ea456f0a1a210c70ce017dd42819f4b0ff4e5 Port scope: not-applicable (fork has no eslint.config.mjs and no scripts/eslint-plugin-evolu.* files). From 5ab9ccc343d1dd5f568240cfa73dfd737215864d Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:45:23 +0100 Subject: [PATCH 04/24] sync(common-v8): port 9803147 Reduced bundle size with pure annotations Source upstream commit: 98031475f92f9da0b7748bee3959522a6dde5f31 Port scope: selective (ported common/vue PURE annotation updates and tree-shaking snapshot changes; skipped missing apps/web path). --- packages/common/src/Number.ts | 2 +- packages/common/src/Set.ts | 2 +- packages/common/src/Sqlite.ts | 4 ++-- packages/common/src/Test.ts | 2 +- packages/common/src/Time.ts | 2 +- packages/common/src/Type.ts | 7 +++++-- packages/common/src/local-first/Protocol.ts | 22 ++++++++++---------- packages/common/src/local-first/Query.ts | 2 +- packages/common/src/local-first/Schema.ts | 6 +++--- packages/common/src/local-first/Storage.ts | 6 ++++-- packages/common/src/local-first/Timestamp.ts | 4 ++-- packages/common/test/TreeShaking.test.ts | 8 +++---- packages/vue/src/provideEvolu.ts | 1 + 13 files changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/common/src/Number.ts b/packages/common/src/Number.ts index aeb97eeef..4f16d0871 100644 --- a/packages/common/src/Number.ts +++ b/packages/common/src/Number.ts @@ -105,7 +105,7 @@ export const computeBalancedBuckets = ( */ export const FibonacciIndex = /*#__PURE__*/ brand( "FibonacciIndex", - lessThanOrEqualTo(78)(PositiveInt), + /*#__PURE__*/ lessThanOrEqualTo(78)(PositiveInt), ); export type FibonacciIndex = typeof FibonacciIndex.Type; diff --git a/packages/common/src/Set.ts b/packages/common/src/Set.ts index 0a0074d5a..a9fed7b91 100644 --- a/packages/common/src/Set.ts +++ b/packages/common/src/Set.ts @@ -43,7 +43,7 @@ import type { PredicateWithIndex, RefinementWithIndex } from "./Types.js"; * * @group Constants */ -export const emptySet: ReadonlySet = new Set(); +export const emptySet: ReadonlySet = /*#__PURE__*/ new Set(); /** * Creates a readonly set from an array. diff --git a/packages/common/src/Sqlite.ts b/packages/common/src/Sqlite.ts index e2ccf80c6..617227bb7 100644 --- a/packages/common/src/Sqlite.ts +++ b/packages/common/src/Sqlite.ts @@ -490,8 +490,8 @@ export const eqSqliteIndex: Eq = /*#__PURE__*/ createEqObject({ * Includes table-column mappings and user-visible indexes. */ export const SqliteSchema = /*#__PURE__*/ object({ - tables: record(String, set(String)), - indexes: array(SqliteIndex), + tables: /*#__PURE__*/ record(String, /*#__PURE__*/ set(String)), + indexes: /*#__PURE__*/ array(SqliteIndex), }); export interface SqliteSchema extends InferType {} diff --git a/packages/common/src/Test.ts b/packages/common/src/Test.ts index cf765ce88..b7e3752c9 100644 --- a/packages/common/src/Test.ts +++ b/packages/common/src/Test.ts @@ -106,7 +106,7 @@ export const testCreateRun: typeof testCreateRunner = testCreateRunner; // Functions are ok. export const testEntropy32 = /*#__PURE__*/ Entropy32.orThrow( - new globalThis.Uint8Array([ + /*#__PURE__*/ new globalThis.Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ]), diff --git a/packages/common/src/Time.ts b/packages/common/src/Time.ts index a8a739266..113b2668e 100644 --- a/packages/common/src/Time.ts +++ b/packages/common/src/Time.ts @@ -143,7 +143,7 @@ const maxMillisWithInfinity = 281474976710655; */ export const Millis = /*#__PURE__*/ brand( "Millis", - lessThan(maxMillisWithInfinity)(NonNegativeInt), + /*#__PURE__*/ lessThan(maxMillisWithInfinity)(NonNegativeInt), ); export type Millis = typeof Millis.Type; diff --git a/packages/common/src/Type.ts b/packages/common/src/Type.ts index a0022948c..dac1bec1d 100644 --- a/packages/common/src/Type.ts +++ b/packages/common/src/Type.ts @@ -1706,7 +1706,7 @@ export type NameError = SimpleNameError; */ export const SimplePassword = /*#__PURE__*/ brand( "SimplePassword", - minLength(8)(maxLength(64)(TrimmedString)), + /*#__PURE__*/ minLength(8)(/*#__PURE__*/ maxLength(64)(TrimmedString)), ); export type SimplePassword = typeof SimplePassword.Type; @@ -1917,7 +1917,10 @@ export const formatTableIdError = ); /** Binary representation of an {@link Id}. */ -export const IdBytes = /*#__PURE__*/ brand("IdBytes", length(16)(Uint8Array)); +export const IdBytes = /*#__PURE__*/ brand( + "IdBytes", + /*#__PURE__*/ length(16)(Uint8Array), +); export type IdBytes = typeof IdBytes.Type; export const idBytesTypeValueLength = 16 as NonNegativeInt; diff --git a/packages/common/src/local-first/Protocol.ts b/packages/common/src/local-first/Protocol.ts index f571f2b37..31d60f17a 100644 --- a/packages/common/src/local-first/Protocol.ts +++ b/packages/common/src/local-first/Protocol.ts @@ -2031,26 +2031,26 @@ export const ProtocolValueType = { // 0-19 small ints // SQLite types - String: NonNegativeInt.orThrow(20), - Number: NonNegativeInt.orThrow(21), - Null: NonNegativeInt.orThrow(22), - Bytes: NonNegativeInt.orThrow(23), + String: /*#__PURE__*/ NonNegativeInt.orThrow(20), + Number: /*#__PURE__*/ NonNegativeInt.orThrow(21), + Null: /*#__PURE__*/ NonNegativeInt.orThrow(22), + Bytes: /*#__PURE__*/ NonNegativeInt.orThrow(23), // We can add more types for other DBs or anything else later. // Optimized types - NonNegativeInt: NonNegativeInt.orThrow(30), + NonNegativeInt: /*#__PURE__*/ NonNegativeInt.orThrow(30), // String optimizations - EmptyString: NonNegativeInt.orThrow(31), // 1 byte vs 2 bytes (50% reduction) - Base64Url: NonNegativeInt.orThrow(32), - Id: NonNegativeInt.orThrow(33), - Json: NonNegativeInt.orThrow(34), + EmptyString: /*#__PURE__*/ NonNegativeInt.orThrow(31), // 1 byte vs 2 bytes (50% reduction) + Base64Url: /*#__PURE__*/ NonNegativeInt.orThrow(32), + Id: /*#__PURE__*/ NonNegativeInt.orThrow(33), + Json: /*#__PURE__*/ NonNegativeInt.orThrow(34), // new Date().toISOString() - 24 bytes // encoded with fixed length - 8 bytes // encode as NonNegativeInt - 6 bytes (additional 25% reduction) - DateIsoWithNonNegativeTime: NonNegativeInt.orThrow(35), - DateIsoWithNegativeTime: NonNegativeInt.orThrow(36), // 9 bytes + DateIsoWithNonNegativeTime: /*#__PURE__*/ NonNegativeInt.orThrow(35), + DateIsoWithNegativeTime: /*#__PURE__*/ NonNegativeInt.orThrow(36), // 9 bytes // TODO: Operations (from 40) // Increment, Decrement, Patch, whatever. diff --git a/packages/common/src/local-first/Query.ts b/packages/common/src/local-first/Query.ts index 0393b4fe0..f13a82c44 100644 --- a/packages/common/src/local-first/Query.ts +++ b/packages/common/src/local-first/Query.ts @@ -215,7 +215,7 @@ export const applyPatches = ( * See: https://github.com/kysely-org/kysely/issues/1372#issuecomment-2702773948 */ export const kyselyJsonIdentifier = /*#__PURE__*/ createId({ - randomBytes: createRandomBytes(), + randomBytes: /*#__PURE__*/ createRandomBytes(), }); export const parseSqliteJsonArray = ( diff --git a/packages/common/src/local-first/Schema.ts b/packages/common/src/local-first/Schema.ts index 3c4ed63dc..3aeef115d 100644 --- a/packages/common/src/local-first/Schema.ts +++ b/packages/common/src/local-first/Schema.ts @@ -161,7 +161,7 @@ export type CreateQuery = ( export const SystemColumns = /*#__PURE__*/ object({ createdAt: DateIso, updatedAt: DateIso, - isDeleted: nullOr(SqliteBoolean), + isDeleted: /*#__PURE__*/ nullOr(SqliteBoolean), ownerId: OwnerId, }); export interface SystemColumns extends InferType {} @@ -359,7 +359,7 @@ export type OptionalColumnKeys = { }[keyof T]; export const systemColumns = /*#__PURE__*/ readonly( - new Set(Object.keys(SystemColumns.props)), + /*#__PURE__*/ new Set(/*#__PURE__*/ Object.keys(SystemColumns.props)), ); export const systemColumnsWithId = /*#__PURE__*/ readonly([ @@ -486,7 +486,7 @@ export const getEvoluSqliteSchema = (deps: SqliteDep) => (): SqliteSchema => getSqliteSchema(deps)({ excludeIndexNamePrefix: "evolu_" }); // https://kysely.dev/docs/recipes/splitting-query-building-and-execution -export const kysely = new Kysely.Kysely({ +export const kysely = /*#__PURE__*/ new Kysely.Kysely({ dialect: { createAdapter: () => new Kysely.SqliteAdapter(), createDriver: () => new Kysely.DummyDriver(), diff --git a/packages/common/src/local-first/Storage.ts b/packages/common/src/local-first/Storage.ts index a811668d6..205f0cf34 100644 --- a/packages/common/src/local-first/Storage.ts +++ b/packages/common/src/local-first/Storage.ts @@ -193,7 +193,9 @@ export type Fingerprint = Uint8Array & Brand<"Fingerprint">; export const fingerprintSize = /*#__PURE__*/ NonNegativeInt.orThrow(12); /** A fingerprint of an empty range. */ -export const zeroFingerprint = new Uint8Array(fingerprintSize) as Fingerprint; +export const zeroFingerprint = /*#__PURE__*/ new Uint8Array( + fingerprintSize, +) as Fingerprint; export interface BaseRange { readonly upperBound: RangeUpperBound; @@ -308,7 +310,7 @@ export const DbChange = /*#__PURE__*/ object({ id: Id, values: ValidDbChangeValues, isInsert: Boolean, - isDelete: nullOr(Boolean), + isDelete: /*#__PURE__*/ nullOr(Boolean), }); export interface DbChange extends InferType {} diff --git a/packages/common/src/local-first/Timestamp.ts b/packages/common/src/local-first/Timestamp.ts index c79173371..9de38f746 100644 --- a/packages/common/src/local-first/Timestamp.ts +++ b/packages/common/src/local-first/Timestamp.ts @@ -60,7 +60,7 @@ export interface TimestampTimeOutOfRangeError export const Counter = /*#__PURE__*/ brand( "Counter", - lessThanOrEqualTo(65535)(NonNegativeInt), + /*#__PURE__*/ lessThanOrEqualTo(65535)(NonNegativeInt), ); export type Counter = typeof Counter.Type; @@ -271,7 +271,7 @@ export const receiveTimestamp = /** Sortable bytes representation of {@link Timestamp}. */ export const TimestampBytes = /*#__PURE__*/ brand( "TimestampBytes", - length(16)(Uint8Array), + /*#__PURE__*/ length(16)(Uint8Array), ); export type TimestampBytes = typeof TimestampBytes.Type; diff --git a/packages/common/test/TreeShaking.test.ts b/packages/common/test/TreeShaking.test.ts index 417d896a1..608fb12cc 100644 --- a/packages/common/test/TreeShaking.test.ts +++ b/packages/common/test/TreeShaking.test.ts @@ -215,12 +215,12 @@ describe("tree-shaking", () => { "raw": 1602, }, "task-example": { - "gzip": 5692, - "raw": 15511, + "gzip": 5239, + "raw": 13750, }, "type-object": { - "gzip": 2006, - "raw": 6082, + "gzip": 1423, + "raw": 4393, }, } `); diff --git a/packages/vue/src/provideEvolu.ts b/packages/vue/src/provideEvolu.ts index 4cac1f50e..6d7268bf7 100644 --- a/packages/vue/src/provideEvolu.ts +++ b/packages/vue/src/provideEvolu.ts @@ -10,6 +10,7 @@ import { * Stores the Evolu instance for a Vue component. This is most useful at the * root component where provide/inject doesn't work. */ +// eslint-disable-next-line evolu/require-pure-annotation export const evoluInstanceMap = new WeakMap< ComponentInternalInstance, Evolu From d7b50cfdf4fa336505a8972cf3dcb5243a1b54f3 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:45:35 +0100 Subject: [PATCH 05/24] sync(common-v8): port dfc84a4 Expanded Ref and Store operations Source upstream commit: dfc84a42e0d1d245ce26fcc5fa2fed2a33d0d836 Port scope: adapted. --- packages/common/src/Ref.ts | 98 ++++++---- packages/common/src/Store.ts | 75 ++++++-- packages/common/test/Ref.test.ts | 182 +++++++++++------ packages/common/test/Store.test.ts | 300 ++++++++++++++++++++--------- 4 files changed, 449 insertions(+), 206 deletions(-) diff --git a/packages/common/src/Ref.ts b/packages/common/src/Ref.ts index 9cb94859e..58a0f31ad 100644 --- a/packages/common/src/Ref.ts +++ b/packages/common/src/Ref.ts @@ -1,30 +1,26 @@ /** - * Mutable reference container for state management. + * Mutable reference. * * @module */ -import type { Eq } from "./Eq.js"; import type { Store } from "./Store.js"; /** - * `Ref` provides a simple API to hold and update a value, similar to a "ref" in - * functional programming or React. It exposes methods to get, set, and modify - * the current state. + * Mutable reference. * - * Use a Ref instead of a variable when you want to pass state around as an - * object. If you need subscriptions, see {@link Store}. + * `Ref` holds a mutable value and exposes explicit `get`, `set`, `update`, and + * `modify` operations. Use it when mutable state needs to be passed around as a + * value. * - * Ref is a valid dependency in Evolu's [Dependency - * Injection](https://evolu.dev/docs/dependency-injection) pattern—use it when - * functions need shared mutable state. + * For reactive state with subscriptions, see {@link Store}. * * ### Example * * ```ts * const count = createRef(0); * count.set(1); - * count.modify((n) => n + 1); + * count.update((n) => n + 1); * console.log(count.get()); // 2 * ``` * @@ -40,37 +36,71 @@ export interface Ref { /** Returns the current state. */ readonly get: () => T; - /** Sets the state. Returns `true` if the state was updated. */ - readonly set: (state: T) => boolean; + /** Sets the state. */ + readonly set: (state: T) => void; - /** - * Modifies the state using an updater function. Returns `true` if the state - * was updated. - */ - readonly modify: (updater: (current: T) => T) => boolean; + /** Sets the state and returns the previous state. */ + readonly getAndSet: (state: T) => T; + + /** Sets the state and returns the current state after the update. */ + readonly setAndGet: (state: T) => T; + + /** Updates the state. */ + readonly update: (updater: (current: T) => T) => void; + + /** Updates the state and returns the previous state. */ + readonly getAndUpdate: (updater: (current: T) => T) => T; + + /** Updates the state and returns the current state after the update. */ + readonly updateAndGet: (updater: (current: T) => T) => T; + + /** Modifies the state and returns a computed result from the transition. */ + readonly modify: ( + updater: (current: T) => readonly [result: R, nextState: T], + ) => R; } -/** - * Creates a {@link Ref} with the given initial state. - * - * By default, state is always updated. We can provide an optional {@link Eq} - * function as the second argument to skip updates when the new state equals the - * current state. - */ -export const createRef = (initialState: T, eq?: Eq): Ref => { +/** Creates a {@link Ref} with the given initial state. */ +export const createRef = (initialState: T): Ref => { let currentState = initialState; - const updateState = (newState: T): boolean => { - if (eq?.(newState, currentState)) return false; - currentState = newState; - return true; - }; - return { get: () => currentState, - set: (state) => updateState(state), + set: (state) => { + currentState = state; + }, + + getAndSet: (state) => { + const previousState = currentState; + currentState = state; + return previousState; + }, + + setAndGet: (state) => { + currentState = state; + return currentState; + }, + + update: (updater) => { + currentState = updater(currentState); + }, + + getAndUpdate: (updater) => { + const previousState = currentState; + currentState = updater(currentState); + return previousState; + }, + + updateAndGet: (updater) => { + currentState = updater(currentState); + return currentState; + }, - modify: (updater) => updateState(updater(currentState)), + modify: (updater) => { + const [result, nextState] = updater(currentState); + currentState = nextState; + return result; + }, }; }; diff --git a/packages/common/src/Store.ts b/packages/common/src/Store.ts index 6561a4655..1b1b75d99 100644 --- a/packages/common/src/Store.ts +++ b/packages/common/src/Store.ts @@ -19,14 +19,14 @@ import { createRef } from "./Ref.js"; * but not modify it directly. */ export interface ReadonlyStore extends Disposable { + /** Returns the current state of the store. */ + readonly get: () => T; + /** * Registers a listener to be called on state changes and returns a function * to unsubscribe. */ readonly subscribe: (listener: Listener) => Unsubscribe; - - /** Returns the current state of the store. */ - readonly get: () => T; } /** @@ -41,33 +41,70 @@ export interface Store extends ReadonlyStore, Ref {} /** * Creates a store with the given initial state. The store encapsulates its - * state, which can be read with `get` and updated with `set` or `modify`. All + * state, which can be read with `get` and updated with `set` or `update`. All * changes are broadcast to subscribers. * - * By default, state changes are detected using `===` (shallow equality). You - * can provide a custom equality function as the second argument. + * By default, state changes are detected using strict equality (`===`). You can + * provide a custom equality function as the second argument. */ -export const createStore = ( - initialState: T, - eq: Eq = eqStrict, -): Store => { +export const createStore = (initialState: T, eq?: Eq): Store => { const listeners = createListeners(); - const ref = createRef(initialState, eq); + const equality = eq ?? eqStrict; + const ref = createRef(initialState); + + const notifyIfChanged = (previousState: T): void => { + if (!equality(previousState, ref.get())) listeners.notify(); + }; return { - subscribe: listeners.subscribe, get: ref.get, + subscribe: listeners.subscribe, set: (state) => { - const updated = ref.set(state); - if (updated) listeners.notify(); - return updated; + const previousState = ref.get(); + ref.set(state); + notifyIfChanged(previousState); + }, + + getAndSet: (state) => { + const previousState = ref.getAndSet(state); + notifyIfChanged(previousState); + return previousState; + }, + + setAndGet: (state) => { + const previousState = ref.get(); + ref.set(state); + notifyIfChanged(previousState); + return ref.get(); + }, + + update: (updater) => { + const previousState = ref.get(); + ref.update(updater); + notifyIfChanged(previousState); + }, + + getAndUpdate: (updater) => { + const previousState = ref.getAndUpdate(updater); + notifyIfChanged(previousState); + return previousState; + }, + + updateAndGet: (updater) => { + const previousState = ref.get(); + ref.updateAndGet(updater); + notifyIfChanged(previousState); + return ref.get(); }, - modify: (updater) => { - const updated = ref.modify(updater); - if (updated) listeners.notify(); - return updated; + modify: ( + updater: (current: T) => readonly [result: R, nextState: T], + ): R => { + const previousState = ref.get(); + const result = ref.modify(updater); + notifyIfChanged(previousState); + return result; }, [Symbol.dispose]: listeners[Symbol.dispose], diff --git a/packages/common/test/Ref.test.ts b/packages/common/test/Ref.test.ts index 05b4d1fe4..76a476762 100644 --- a/packages/common/test/Ref.test.ts +++ b/packages/common/test/Ref.test.ts @@ -1,75 +1,133 @@ import { describe, expect, test } from "vitest"; -import { eqStrict } from "../src/Eq.js"; import { createRef } from "../src/Ref.js"; -describe("createRef", () => { +describe("get", () => { test("get returns initial state", () => { const ref = createRef(42); expect(ref.get()).toBe(42); }); +}); + +describe("set", () => { + test("updates state", () => { + const ref = createRef(0); + ref.set(1); + expect(ref.get()).toBe(1); + }); + + test("always assigns the provided state", () => { + const ref = createRef(1); + ref.set(1); + expect(ref.get()).toBe(1); + }); +}); + +describe("getAndSet", () => { + test("returns previous state and updates state", () => { + const ref = createRef(1); + + expect(ref.getAndSet(2)).toBe(1); + expect(ref.get()).toBe(2); + }); + + test("returns current state without updating when next state is equal", () => { + const ref = createRef(1); + + expect(ref.getAndSet(1)).toBe(1); + expect(ref.get()).toBe(1); + }); +}); - describe("set", () => { - test("updates state", () => { - const ref = createRef(0); - ref.set(1); - expect(ref.get()).toBe(1); - }); - - test("returns true when state changes", () => { - const ref = createRef(0); - expect(ref.set(1)).toBe(true); - }); - - test("returns true even for same value without eq", () => { - const ref = createRef(1); - expect(ref.set(1)).toBe(true); - }); - - test("with eq returns false for equal values", () => { - const ref = createRef(1, eqStrict); - expect(ref.set(1)).toBe(false); - expect(ref.get()).toBe(1); - }); - - test("with eq returns true for different values", () => { - const ref = createRef(1, eqStrict); - expect(ref.set(2)).toBe(true); - expect(ref.get()).toBe(2); - }); - }); - - describe("modify", () => { - test("updates state", () => { - const ref = createRef(0); - ref.modify((n) => n + 1); - expect(ref.get()).toBe(1); - }); - - test("returns true when state changes", () => { - const ref = createRef(0); - expect(ref.modify((n) => n + 1)).toBe(true); - }); - - test("with eq returns false for equal values", () => { - const ref = createRef(1, eqStrict); - expect(ref.modify((n) => n)).toBe(false); - }); - - test("with eq returns true for different values", () => { - const ref = createRef(1, eqStrict); - expect(ref.modify((n) => n + 1)).toBe(true); - expect(ref.get()).toBe(2); - }); - }); - - test("with custom eq", () => { - const eqModulo10 = (a: number, b: number) => a % 10 === b % 10; - const ref = createRef(5 as number, eqModulo10); - - expect(ref.set(15)).toBe(false); // 5 % 10 === 15 % 10 +describe("setAndGet", () => { + test("returns updated state", () => { + const ref = createRef(1); + + expect(ref.setAndGet(2)).toBe(2); + expect(ref.get()).toBe(2); + }); + + test("returns current state when next state is equal", () => { + const ref = createRef(1); + + expect(ref.setAndGet(1)).toBe(1); + expect(ref.get()).toBe(1); + }); + + test("assigns the provided state", () => { + const ref = createRef(5); + + expect(ref.setAndGet(5)).toBe(5); expect(ref.get()).toBe(5); - expect(ref.set(16)).toBe(true); // 5 % 10 !== 16 % 10 + expect(ref.setAndGet(16)).toBe(16); expect(ref.get()).toBe(16); }); }); + +describe("update", () => { + test("updates state", () => { + const ref = createRef(1); + + ref.update((n) => n + 1); + + expect(ref.get()).toBe(2); + }); + + test("can keep the same state", () => { + const ref = createRef(1); + + ref.update((n) => n); + + expect(ref.get()).toBe(1); + }); +}); + +describe("getAndUpdate", () => { + test("returns previous state and updates state", () => { + const ref = createRef(1); + + expect(ref.getAndUpdate((n) => n + 1)).toBe(1); + expect(ref.get()).toBe(2); + }); + + test("returns current state without updating when next state is equal", () => { + const ref = createRef(1); + + expect(ref.getAndUpdate((n) => n)).toBe(1); + expect(ref.get()).toBe(1); + }); +}); + +describe("updateAndGet", () => { + test("returns updated state", () => { + const ref = createRef(1); + + expect(ref.updateAndGet((n) => n + 1)).toBe(2); + expect(ref.get()).toBe(2); + }); + + test("returns current state when next state is equal", () => { + const ref = createRef(1); + + expect(ref.updateAndGet((n) => n)).toBe(1); + expect(ref.get()).toBe(1); + }); +}); + +describe("modify", () => { + test("returns a computed result and updates state", () => { + const ref = createRef(0); + const result = ref.modify((current) => [current, current + 1]); + + expect(result).toBe(0); + expect(ref.get()).toBe(1); + }); + + test("can keep the same state while returning a result", () => { + const ref = createRef(1); + const result = ref.modify((current) => [`current:${current}`, current]); + + expect(result).toBe("current:1"); + expect(ref.get()).toBe(1); + }); +}); diff --git a/packages/common/test/Store.test.ts b/packages/common/test/Store.test.ts index 499597139..685f61b25 100644 --- a/packages/common/test/Store.test.ts +++ b/packages/common/test/Store.test.ts @@ -1,141 +1,259 @@ import { describe, expect, test, vi } from "vitest"; import { createStore } from "../src/Store.js"; -describe("createStore", () => { +describe("get", () => { test("get returns initial state", () => { const store = createStore(42); expect(store.get()).toBe(42); }); +}); + +describe("set", () => { + test("updates state", () => { + const store = createStore(0); + store.set(1); + expect(store.get()).toBe(1); + }); + + test("notifies listeners when state changes", () => { + const store = createStore(0); + const listener = vi.fn(); + store.subscribe(listener); + + store.set(1); + + expect(listener).toHaveBeenCalledTimes(1); + }); + + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + store.set(1); + + expect(listener).not.toHaveBeenCalled(); + }); +}); + +describe("getAndSet", () => { + test("returns previous state and updates state", () => { + const store = createStore(1); + + expect(store.getAndSet(2)).toBe(1); + expect(store.get()).toBe(2); + }); + + test("notifies listeners when state changes", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + expect(store.getAndSet(2)).toBe(1); + expect(listener).toHaveBeenCalledTimes(1); + }); + + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + expect(store.getAndSet(1)).toBe(1); + expect(listener).not.toHaveBeenCalled(); + }); +}); + +describe("setAndGet", () => { + test("returns updated state", () => { + const store = createStore(1); + + expect(store.setAndGet(2)).toBe(2); + expect(store.get()).toBe(2); + }); + + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + expect(store.setAndGet(1)).toBe(1); + expect(listener).not.toHaveBeenCalled(); + }); +}); + +describe("update", () => { + test("updates state", () => { + const store = createStore(1); + + store.update((n) => n + 1); + + expect(store.get()).toBe(2); + }); + + test("notifies listeners when state changes", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + store.update((n) => n + 1); - describe("set", () => { - test("updates state", () => { - const store = createStore(0); - store.set(1); - expect(store.get()).toBe(1); - }); + expect(listener).toHaveBeenCalledTimes(1); + }); + + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); - test("returns true when state changes", () => { - const store = createStore(0); - expect(store.set(1)).toBe(true); - }); + store.update((n) => n); - test("returns false for equal values", () => { - const store = createStore(1); - expect(store.set(1)).toBe(false); - }); + expect(listener).not.toHaveBeenCalled(); + }); +}); + +describe("getAndUpdate", () => { + test("returns previous state and updates state", () => { + const store = createStore(1); + + expect(store.getAndUpdate((n: number) => n + 1)).toBe(1); + expect(store.get()).toBe(2); + }); + + test("notifies listeners when state changes", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + expect(store.getAndUpdate((n: number) => n + 1)).toBe(1); + expect(listener).toHaveBeenCalledTimes(1); + }); + + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); + + expect(store.getAndUpdate((n) => n)).toBe(1); + expect(listener).not.toHaveBeenCalled(); + }); +}); - test("notifies listeners when state changes", () => { - const store = createStore(0); - const listener = vi.fn(); - store.subscribe(listener); +describe("updateAndGet", () => { + test("returns updated state", () => { + const store = createStore(1); - store.set(1); + expect(store.updateAndGet((n: number) => n + 1)).toBe(2); + expect(store.get()).toBe(2); + }); - expect(listener).toHaveBeenCalledTimes(1); - }); + test("does not notify listeners when state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); - test("does not notify listeners when state is equal", () => { - const store = createStore(1); - const listener = vi.fn(); - store.subscribe(listener); + expect(store.updateAndGet((n) => n)).toBe(1); + expect(listener).not.toHaveBeenCalled(); + }); +}); - store.set(1); +describe("modify", () => { + test("returns a computed result and updates state", () => { + const store = createStore(0); + const result = store.modify((current) => [current, current + 1]); - expect(listener).not.toHaveBeenCalled(); - }); + expect(result).toBe(0); + expect(store.get()).toBe(1); }); - describe("modify", () => { - test("updates state", () => { - const store = createStore(0); - store.modify((n) => n + 1); - expect(store.get()).toBe(1); - }); + test("returns computed result and updates state", () => { + const store = createStore(1); - test("returns true when state changes", () => { - const store = createStore(0); - expect(store.modify((n) => n + 1)).toBe(true); - }); + const result = store.modify((current: number) => [ + `previous:${current}`, + current + 1, + ]); - test("returns false for equal values", () => { - const store = createStore(1); - expect(store.modify((n) => n)).toBe(false); - }); + expect(result).toBe("previous:1"); + expect(store.get()).toBe(2); + }); - test("notifies listeners when state changes", () => { - const store = createStore(0); - const listener = vi.fn(); - store.subscribe(listener); + test("notifies listeners when state changes", () => { + const store = createStore(0); + const listener = vi.fn(); + store.subscribe(listener); - store.modify((n) => n + 1); + const result = store.modify((current: number) => [current, current + 1]); - expect(listener).toHaveBeenCalledTimes(1); - }); + expect(result).toBe(0); + expect(listener).toHaveBeenCalledTimes(1); + }); - test("does not notify listeners when state is equal", () => { - const store = createStore(1); - const listener = vi.fn(); - store.subscribe(listener); + test("does not notify listeners when next state is equal", () => { + const store = createStore(1); + const listener = vi.fn(); + store.subscribe(listener); - store.modify((n) => n); + const result = store.modify((current) => [current, current]); - expect(listener).not.toHaveBeenCalled(); - }); + expect(result).toBe(1); + expect(listener).not.toHaveBeenCalled(); }); +}); - describe("subscribe", () => { - test("returns unsubscribe function", () => { - const store = createStore(0); - const listener = vi.fn(); - const unsubscribe = store.subscribe(listener); +describe("subscribe", () => { + test("returns unsubscribe function", () => { + const store = createStore(0); + const listener = vi.fn(); + const unsubscribe = store.subscribe(listener); - store.set(1); - expect(listener).toHaveBeenCalledTimes(1); + store.set(1); + expect(listener).toHaveBeenCalledTimes(1); - unsubscribe(); - store.set(2); - expect(listener).toHaveBeenCalledTimes(1); - }); + unsubscribe(); + store.set(2); + expect(listener).toHaveBeenCalledTimes(1); + }); - test("supports multiple listeners", () => { - const store = createStore(0); - const listener1 = vi.fn(); - const listener2 = vi.fn(); + test("supports multiple listeners", () => { + const store = createStore(0); + const listener1 = vi.fn(); + const listener2 = vi.fn(); - store.subscribe(listener1); - store.subscribe(listener2); + store.subscribe(listener1); + store.subscribe(listener2); - store.set(1); + store.set(1); - expect(listener1).toHaveBeenCalledTimes(1); - expect(listener2).toHaveBeenCalledTimes(1); - }); + expect(listener1).toHaveBeenCalledTimes(1); + expect(listener2).toHaveBeenCalledTimes(1); }); +}); - describe("dispose", () => { - test("clears all listeners", () => { - const store = createStore(0); - const listener = vi.fn(); - store.subscribe(listener); +describe("dispose", () => { + test("clears all listeners", () => { + const store = createStore(0); + const listener = vi.fn(); + store.subscribe(listener); - store[Symbol.dispose](); - store.set(1); + store[Symbol.dispose](); + store.set(1); - expect(listener).not.toHaveBeenCalled(); - }); + expect(listener).not.toHaveBeenCalled(); }); +}); - test("with custom eq", () => { +describe("custom eq", () => { + test("suppresses notifications for equal states under the provided equality", () => { const eqModulo10 = (a: number, b: number) => a % 10 === b % 10; const store = createStore(5 as number, eqModulo10); const listener = vi.fn(); store.subscribe(listener); - expect(store.set(15)).toBe(false); // 5 % 10 === 15 % 10 - expect(store.get()).toBe(5); + store.set(15); + expect(store.get()).toBe(15); expect(listener).not.toHaveBeenCalled(); - expect(store.set(16)).toBe(true); // 5 % 10 !== 16 % 10 + store.set(16); expect(store.get()).toBe(16); expect(listener).toHaveBeenCalledTimes(1); }); From f0689a7bf6858d0177c0ba3b06db07a23d56a008 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:45:41 +0100 Subject: [PATCH 06/24] sync(common-v8): port ce057ed Add PURE annotations to retryStrategyAws Source upstream commit: ce057eda7f537b4263c5e52c3d5083bf3a0a13b2 Port scope: adapted. --- packages/common/src/Schedule.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/common/src/Schedule.ts b/packages/common/src/Schedule.ts index 2a73b06d7..7f84224f8 100644 --- a/packages/common/src/Schedule.ts +++ b/packages/common/src/Schedule.ts @@ -1465,5 +1465,7 @@ export const tapScheduleInput = * @see https://github.com/aws/aws-sdk-java-v2/blob/master/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java */ export const retryStrategyAws: Schedule = /*#__PURE__*/ jitter(1)( - maxDelay("20s")(take(2)(exponential("100ms"))), + /*#__PURE__*/ maxDelay("20s")( + /*#__PURE__*/ take(2)(/*#__PURE__*/ exponential("100ms")), + ), ); From 80fc73c309ec91ec2053d36cb4f89795ee3ca520 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:45:55 +0100 Subject: [PATCH 07/24] sync(common-v8): port 4b2d924 Remove Instances registry and tests Source upstream commit: 4b2d9243072b31753a5729f873a6f8e05a421035 Port scope: adapted. --- packages/common/src/Instances.ts | 102 ------ packages/common/src/index.ts | 1 - packages/common/test/Instances.test.ts | 443 ------------------------- 3 files changed, 546 deletions(-) delete mode 100644 packages/common/src/Instances.ts delete mode 100644 packages/common/test/Instances.test.ts diff --git a/packages/common/src/Instances.ts b/packages/common/src/Instances.ts deleted file mode 100644 index bd3900ad0..000000000 --- a/packages/common/src/Instances.ts +++ /dev/null @@ -1,102 +0,0 @@ -/** - * A keyed instance registry for disposable instances. - * - * @module - */ - -/** - * A keyed instance registry for disposable instances. - * - * Guarantees exactly one live instance per key. Also known as a multiton (a - * keyed singleton). - * - * ### Example - * - * Real usage from `local-first/Relay.ts`: one mutex per owner to serialize - * writes for the same owner. - * - * ```ts - * const ownerMutexes = createInstances(); - * - * const result = await run( - * ownerMutexes.ensure(ownerId, createMutex).withLock(async () => { - * // Write messages for ownerId. - * return ok(); - * }), - * ); - * ``` - */ -export interface Instances< - K extends string, - T extends Disposable, -> extends Disposable { - /** - * Ensures an instance exists for the given key, creating it if necessary. If - * the instance already exists, the optional `onCacheHit` callback is invoked - * to update the existing instance. - */ - readonly ensure: ( - key: K, - create: () => T, - onCacheHit?: (instance: T) => void, - ) => T; - - /** Gets an instance by key, or returns `null` if it doesn't exist. */ - readonly get: (key: K) => T | null; - - /** Checks if an instance exists for the given key. */ - readonly has: (key: K) => boolean; - - /** - * Deletes and disposes an instance by key. Returns `true` if the instance - * existed and was deleted, `false` otherwise. - */ - readonly delete: (key: K) => boolean; -} - -/** Creates an {@link Instances}. */ -export const createInstances = < - K extends string, - T extends Disposable, ->(): Instances => { - const instances = new Map(); - - return { - ensure: (key, create, onCacheHit) => { - let instance = instances.get(key); - - if (instance == null) { - instance = create(); - instances.set(key, instance); - } else if (onCacheHit) { - onCacheHit(instance); - } - - return instance; - }, - - get: (key) => instances.get(key) ?? null, - - has: (key) => instances.has(key), - - delete: (key) => { - const instance = instances.get(key); - if (instance == null) return false; - - instances.delete(key); - instance[Symbol.dispose](); - - return true; - }, - - [Symbol.dispose]: () => { - using stack = new globalThis.DisposableStack(); - - for (const instance of instances.values()) { - stack.use(instance); - } - - instances.clear(); - }, - }; -}; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 7122d9217..de9f7e17f 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -17,7 +17,6 @@ export * from "./Eq.js"; export * from "./Error.js"; export * from "./Function.js"; export * from "./Identicon.js"; -export * from "./Instances.js"; export * from "./Listeners.js"; // Local-first essentials. export type { EvoluError } from "./local-first/Error.js"; diff --git a/packages/common/test/Instances.test.ts b/packages/common/test/Instances.test.ts deleted file mode 100644 index 4e98975df..000000000 --- a/packages/common/test/Instances.test.ts +++ /dev/null @@ -1,443 +0,0 @@ -import { describe, expect, test } from "vitest"; -import { lazyVoid } from "../src/Function.js"; -import { createInstances } from "../src/Instances.js"; - -interface TestInstance extends Disposable { - readonly id: string; -} - -describe("Instances", () => { - test("returns existing instance on second call with same key", () => { - const instances = createInstances(); - let createCount = 0; - - const instance1 = instances.ensure("test", () => { - createCount++; - return { - id: "test-1", - [Symbol.dispose]: lazyVoid, - }; - }); - - const instance2 = instances.ensure("test", () => { - createCount++; - return { - id: "test-2", - [Symbol.dispose]: lazyVoid, - }; - }); - - expect(instance1).toBe(instance2); - expect(instance1.id).toBe("test-1"); - expect(createCount).toBe(1); - }); - - test("calls onCacheHit when returning existing instance", () => { - interface TestInstance extends Disposable { - readonly value: string; - readonly update: (newValue: string) => void; - } - - const instances = createInstances(); - let hitCount = 0; - - const createInstance = (initialValue: string): TestInstance => { - let value = initialValue; - return { - get value() { - return value; - }, - update: (newValue: string) => { - value = newValue; - }, - [Symbol.dispose]: lazyVoid, - }; - }; - - const instance1 = instances.ensure("test", () => createInstance("initial")); - expect(instance1.value).toBe("initial"); - - const instance2 = instances.ensure( - "test", - () => createInstance("new"), - (existing) => { - hitCount++; - existing.update("updated"); - }, - ); - - expect(instance2.value).toBe("updated"); - expect(hitCount).toBe(1); - expect(instance1).toBe(instance2); - }); - - test("maintains separate instances for different keys", () => { - const instances = createInstances(); - - const instance1 = instances.ensure("key1", () => ({ - id: "instance-1", - [Symbol.dispose]: lazyVoid, - })); - - const instance2 = instances.ensure("key2", () => ({ - id: "instance-2", - [Symbol.dispose]: lazyVoid, - })); - - expect(instance1).not.toBe(instance2); - expect(instance1.id).toBe("instance-1"); - expect(instance2.id).toBe("instance-2"); - }); - - test.each([ - ["test", "test-1"], - ["nonexistent", null], - ] as const)("get returns expected value for key %s", (key, expectedId) => { - const instances = createInstances(); - - instances.ensure("test", () => ({ - id: "test-1", - [Symbol.dispose]: lazyVoid, - })); - - const retrieved = instances.get(key); - expect(retrieved?.id ?? null).toBe(expectedId); - }); - - test.each([ - ["test", true], - ["nonexistent", false], - ] as const)("has returns expected value for key %s", (key, expected) => { - const instances = createInstances(); - - instances.ensure("test", () => ({ - id: "test-1", - [Symbol.dispose]: lazyVoid, - })); - - expect(instances.has(key)).toBe(expected); - }); - - test("delete deletes and disposes the instance", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance = instances.ensure("test", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - expect(instances.has("test")).toBe(true); - expect(instance.disposed).toBe(false); - - const result = instances.delete("test"); - - expect(result).toBe(true); - expect(instances.has("test")).toBe(false); - expect(instance.disposed).toBe(true); - }); - - test("delete returns false if instance does not exist", () => { - interface TestInstance extends Disposable { - readonly id: string; - } - - const instances = createInstances(); - const result = instances.delete("nonexistent"); - expect(result).toBe(false); - }); - - test("Symbol.dispose disposes all instances", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance1 = instances.ensure("test1", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - const instance2 = instances.ensure("test2", () => ({ - id: "test-2", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - expect(instances.has("test1")).toBe(true); - expect(instances.has("test2")).toBe(true); - expect(instance1.disposed).toBe(false); - expect(instance2.disposed).toBe(false); - - instances[Symbol.dispose](); - - expect(instances.has("test1")).toBe(false); - expect(instances.has("test2")).toBe(false); - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); - }); - - test("Symbol.dispose disposes instances in LIFO order", () => { - interface TestInstance extends Disposable { - readonly id: string; - } - - const instances = createInstances(); - const events: Array = []; - - instances.ensure("a", () => ({ - id: "a", - [Symbol.dispose]: () => { - events.push("dispose a"); - }, - })); - - instances.ensure("b", () => ({ - id: "b", - [Symbol.dispose]: () => { - events.push("dispose b"); - }, - })); - - instances.ensure("c", () => ({ - id: "c", - [Symbol.dispose]: () => { - events.push("dispose c"); - }, - })); - - instances[Symbol.dispose](); - - expect(events).toEqual(["dispose c", "dispose b", "dispose a"]); - }); - - test("using block syntax disposes all instances", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - let instance1: TestInstance; - let instance2: TestInstance; - - { - using instances = createInstances(); - - instance1 = instances.ensure("test1", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - instance2 = instances.ensure("test2", () => ({ - id: "test-2", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - expect(instance1.disposed).toBe(false); - expect(instance2.disposed).toBe(false); - } - - // After the block, instances should be disposed - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); - }); - - test("dispose clears entries and registry remains reusable", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const first = instances.ensure("k", () => ({ - id: "first", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - instances[Symbol.dispose](); - - expect(first.disposed).toBe(true); - expect(instances.has("k")).toBe(false); - expect(instances.get("k")).toBeNull(); - expect(instances.delete("k")).toBe(false); - - const second = instances.ensure("k", () => ({ - id: "second", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - expect(second.id).toBe("second"); - expect(second).not.toBe(first); - expect(instances.has("k")).toBe(true); - }); - - test("delete still deletes instance from map even if dispose throws", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance = instances.ensure("test", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal failed"); - }, - })); - - expect(instances.has("test")).toBe(true); - expect(() => instances.delete("test")).toThrow("Disposal failed"); - expect(instances.has("test")).toBe(false); - expect(instance.disposed).toBe(true); - }); - - test("Symbol.dispose attempts to dispose all instances even if some throw", () => { - interface TestInstance extends Disposable { - readonly id: string; - disposed: boolean; - } - - const instances = createInstances(); - - const instance1 = instances.ensure("test1", () => ({ - id: "test-1", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal 1 failed"); - }, - })); - - const instance2 = instances.ensure("test2", () => ({ - id: "test-2", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - }, - })); - - const instance3 = instances.ensure("test3", () => ({ - id: "test-3", - disposed: false, - [Symbol.dispose]: function () { - this.disposed = true; - throw new Error("Disposal 3 failed"); - }, - })); - - expect(() => { - instances[Symbol.dispose](); - }).toThrow(); - - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); - expect(instance3.disposed).toBe(true); - expect(instances.has("test1")).toBe(false); - expect(instances.has("test2")).toBe(false); - expect(instances.has("test3")).toBe(false); - }); - - test("Symbol.dispose throws single error if only one disposal fails", () => { - interface TestInstance extends Disposable { - readonly id: string; - } - - const instances = createInstances(); - - instances.ensure("test1", () => ({ - id: "test-1", - [Symbol.dispose]: () => { - throw new Error("Single disposal error"); - }, - })); - - instances.ensure("test2", () => ({ - id: "test-2", - [Symbol.dispose]: lazyVoid, - })); - - expect(() => { - instances[Symbol.dispose](); - }).toThrow("Single disposal error"); - }); - - test("Symbol.dispose throws SuppressedError if multiple disposals fail", () => { - interface TestInstance extends Disposable { - readonly id: string; - } - - const instances = createInstances(); - - instances.ensure("test1", () => ({ - id: "test-1", - [Symbol.dispose]: () => { - throw new Error("Error 1"); - }, - })); - - instances.ensure("test2", () => ({ - id: "test-2", - [Symbol.dispose]: () => { - throw new Error("Error 2"); - }, - })); - - const SuppressedErrorCtor = ( - globalThis as { - readonly SuppressedError?: new ( - error: unknown, - suppressed: unknown, - message?: string, - ) => Error; - } - ).SuppressedError; - expect(SuppressedErrorCtor).toBeDefined(); - - try { - instances[Symbol.dispose](); - expect.fail("Should have thrown"); - } catch (error) { - expect(error).toBeInstanceOf(SuppressedErrorCtor); - - const suppressedError = error as { - readonly error: unknown; - readonly suppressed: unknown; - }; - - expect(suppressedError.error).toBeInstanceOf(Error); - expect(suppressedError.suppressed).toBeInstanceOf(Error); - expect((suppressedError.error as Error).message).toBe("Error 1"); - expect((suppressedError.suppressed as Error).message).toBe("Error 2"); - } - }); -}); From b84fbde85ce7d454f99237b899504e8e6fd1e95d Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:46:04 +0100 Subject: [PATCH 08/24] sync(common-v8): port 864bb43 Refactor Run/Fiber APIs Source upstream commit: 864bb43eb4cf7543e74af05f73ca4f5204772a3c Port scope: adapted. --- packages/common/src/Task.ts | 777 ++++++++++----------- packages/common/test/Task.test.ts | 1059 ++++++++++++++--------------- 2 files changed, 884 insertions(+), 952 deletions(-) diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index bb02cb425..1f43479e7 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -17,7 +17,6 @@ import type { RandomBytes, RandomBytesDep } from "./Crypto.js"; import { createRandomBytes } from "./Crypto.js"; import { eqArrayStrict } from "./Eq.js"; import { lazyTrue, lazyVoid } from "./Function.js"; -import { createInstances, type Instances } from "./Instances.js"; import { decrement, increment } from "./Number.js"; import { createRecord, @@ -84,10 +83,10 @@ import { * - **{@link Run}** — a callable object that runs Tasks, manages their lifecycle, * provides dependencies, and creates Fibers * - **{@link Fiber}** — awaitable, abortable/disposable handle to a running Task - * - **{@link AsyncDisposableStack}** — task-aware resource management that + * - **{@link AsyncDisposableStack}** — Task-aware resource management that * completes even when aborted * - * Evolu's structured concurrency core is minimal — one function with a few + * Evolu's structured concurrency core is minimal — one function with a several * flags and helper methods using native APIs. * * ### Example @@ -119,20 +118,20 @@ import { * fetch: globalThis.fetch.bind(globalThis), * }; * - * // Create run with dependencies. + * // Create a Run with dependencies. * await using run = createRun(deps); * - * // Running a task returns a fiber that can be awaited. + * // Running a Task returns a Fiber that can be awaited. * const result = await run(fetch("/users/123")); * expectTypeOf(result).toEqualTypeOf< * Result * >(); * - * // A fiber can also be aborted (or disposed with `using`). + * // A Fiber can also be aborted (or disposed with `using`). * const fiber = run(fetch("/users/456")); * fiber.abort(); * - * // When this block ends, `await using` disposes run — aborting all fibers. + * // When this block ends, `await using` disposes the Run — aborting all Fibers. * ``` * * ## Composition @@ -141,8 +140,8 @@ import { * | ---------- | ------------------ | ----------------------------------- | * | Collection | {@link all} | fail-fast on first error | * | | {@link allSettled} | complete all regardless of failures | - * | | {@link map} | values to tasks, fail-fast | - * | | {@link mapSettled} | values to tasks, complete all | + * | | {@link map} | values to Tasks, fail-fast | + * | | {@link mapSettled} | values to Tasks, complete all | * | Timing | {@link sleep} | pause execution | * | | {@link timeout} | time-bounded execution | * | | {@link repeat} | repeat with schedule | @@ -153,9 +152,9 @@ import { * | Interop | {@link callback} | wrap callback APIs | * | | {@link fetch} | HTTP requests with abort handling | * - * Collection helpers run sequentially by default. Use {@link parallel} to run - * tasks in parallel. Note helpers like {@link race} always run in parallel; - * sequential execution wouldn't make sense for their semantics. + * Collection helpers run sequentially by default. Use {@link concurrently} to + * run Tasks concurrently. Note helpers like {@link race} always run + * concurrently; sequential execution wouldn't make sense for their semantics. * * ### Building a better fetch * @@ -192,7 +191,7 @@ import { * >(); * ``` * - * Run composed tasks with {@link parallel} and {@link map}: + * Run composed tasks with {@link concurrently} and {@link map}: * * ```ts * await using run = createRun(); @@ -204,7 +203,7 @@ import { * ]; * * // At most 2 concurrent requests - * const result = await run(parallel(2, map(urls, fetchWithRetry))); + * const result = await run(concurrently(2, map(urls, fetchWithRetry))); * * expectTypeOf(result).toEqualTypeOf< * Result< @@ -247,7 +246,7 @@ import { * * ### Built-in dependencies * - * {@link createRun} provides default {@link RunDeps} available to all tasks + * {@link createRun} provides default {@link RunDeps} available to all Tasks * without declaring `D`: * * - {@link Console} — logging with hierarchical context via `child()` @@ -292,7 +291,7 @@ import { * Evolu uses standard JavaScript * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Resource_management | resource management}. * - * For task-based disposal, Evolu provides {@link AsyncDisposableStack} — a + * For Task-based disposal, Evolu provides {@link AsyncDisposableStack} — a * wrapper around the native * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack | AsyncDisposableStack} * where methods accept {@link Task} for acquisition. All operations run @@ -397,7 +396,7 @@ export type InferTaskDeps = /** * A {@link Task} that can complete with a value, signal done, or fail. * - * Forms a parallel with {@link NextResult}: + * Forms a pair with {@link NextResult}: * * - `Result` → `NextResult` * - `Task` → `NextTask` @@ -445,31 +444,31 @@ export interface AbortError extends InferType {} * {@link https://en.wikipedia.org/wiki/Structured_concurrency | structured concurrency} * semantics. * - * Each `Run` forms a task tree: child tasks are bound to it, abort propagates + * Each `Run` forms a Task tree: child Tasks are bound to it, abort propagates * through that tree, and state is observable via snapshots and events. * - * `Run` is a callable object — callable because it's convenient to run tasks as + * `Run` is a callable object — callable because it's convenient to run Tasks as * `run(task)`, and an object because it holds state. * - * Calling `run(task)` creates a child `Run`, passes it to the task, and returns + * Calling `run(task)` creates a child `Run`, passes it to the Task, and returns * a {@link Fiber}. The child is tracked in `getChildren()`/events while running, * then disposed and removed when settled. * - * Before task execution, `run(task)` applies two short-circuit checks: + * Before Task execution, `run(task)` applies two short-circuit checks: * - * - If this run is not `Running`, the child is aborted with - * {@link runClosingError} and the task is replaced with `err(AbortError)`. - * - If this run's signal is already aborted and the child is abortable - * (`abortMask === 0`), the child is aborted with the same reason and the task + * - If this Run is not `Running`, the child is aborted with + * {@link runStoppedError} and the Task is replaced with `err(AbortError)`. + * - If this Run's signal is already aborted and the child is abortable + * (`abortMask === 0`), the child is aborted with the same reason and the Task * is replaced with `err(AbortError)`. * - * After execution, the child stores both values: `outcome` (what the task + * After execution, the child stores both values: `outcome` (what the Task * returned) and `result` (what callers observe). If the child signal is aborted * at settlement time, `result` is forced to `err(AbortError)` even when * `outcome` is `ok(...)`. * * That's the whole mechanism: {@link Task} is a function that takes a `Run` and - * returns an {@link Awaitable} {@link Result}. `run(task)` runs it via + * returns an {@link Awaitable} {@link Result}. `run(task)` runs the Task via * `Promise.try(task, run)` with aforementioned logic. * * @group Core Types @@ -500,29 +499,29 @@ export interface Run extends AsyncDisposable { * * The callback receives the abort reason (extracted from {@link AbortError}). * If already aborted, the callback is invoked immediately. For - * {@link unabortable} tasks, the callback is never invoked. + * {@link unabortable} Tasks, the callback is never invoked. * * Intentionally synchronous — abort is signal propagation, not cleanup. Use * {@link Run.defer} for async cleanup that must run regardless of abort. */ readonly onAbort: (callback: Callback) => void; - /** Returns the current {@link FiberState}. */ - readonly getState: () => FiberState; + /** Returns the current {@link RunState}. */ + readonly getState: () => RunState; /** Returns the current child {@link Fiber}s. */ readonly getChildren: () => ReadonlySet>; /** - * Creates a memoized {@link FiberSnapshot} of this Run. + * Creates a memoized {@link RunSnapshot} of this Run. * - * Use for monitoring, debugging, or building UI that visualizes task trees. + * Use for monitoring, debugging, or building UI that visualizes Task trees. * * ### Example * * ```ts * // React integration with useSyncExternalStore - * const useFiberSnapshot = (run: Run) => + * const useRunSnapshot = (run: Run) => * useSyncExternalStore( * (callback) => { * run.onEvent = callback; @@ -534,10 +533,10 @@ export interface Run extends AsyncDisposable { * ); * ``` */ - readonly snapshot: () => FiberSnapshot; + readonly snapshot: () => RunSnapshot; /** - * Callback for monitoring run events. + * Callback for monitoring Run events. * * Called when this Run or any descendant emits a {@link RunEvent}. Events * bubble up through parent runs, enabling centralized monitoring. Only @@ -546,7 +545,12 @@ export interface Run extends AsyncDisposable { onEvent: ((event: RunEvent) => void) | undefined; /** - * Runs a {@link Task} on the root Run instead of the current Run. + * The root daemon {@link Run}. + * + * The daemon is the root Run of the Task tree. Tasks started with + * `run.daemon(task)` are attached to that root Run instead of the current + * Run, so they can outlive the current Task and keep running until the root + * Run is disposed. * * ### Example * @@ -564,19 +568,33 @@ export interface Run extends AsyncDisposable { */ readonly daemon: Run; + /** + * Creates a {@link Run} from this Run. + * + * Like {@link createRun}, the returned Run is daemon: it stays running until + * disposed. Unlike {@link createRun}, it shares the same Deps as this Run. + * + * Useful for running Tasks with one reusable Run that can be disposed + * manually. Disposing it aborts all running child Tasks and causes later + * calls through it to be aborted as well. + * + * To run a single Task as daemon, use {@link Run.daemon}. + */ + readonly create: () => Run; + /** * Creates an {@link AsyncDisposable} that runs a cleanup callback or * {@link Task} when disposed. * - * Use for one-off task; for multiple, use {@link Run.stack} instead. + * Use for a one-off Task; for multiple, use {@link Run.stack} instead. * * ### Example * * ```ts - * // One-off task with defer + * // One-off Task with defer * await using _ = run.defer(task); * - * // For more tasks, a stack is more practical + * // For more Tasks, a stack is more practical * await using stack = run.stack(); * stack.defer(taskA); * stack.defer(taskB); @@ -599,7 +617,7 @@ export interface Run extends AsyncDisposable { ) => AsyncDisposable; /** - * Creates an {@link AsyncDisposableStack} bound to the root Run. + * Creates an {@link AsyncDisposableStack}. * * ### Example * @@ -616,7 +634,7 @@ export interface Run extends AsyncDisposable { /** * @see {@link Concurrency} - * @see {@link parallel} + * @see {@link concurrently} */ readonly concurrency: Concurrency; @@ -655,7 +673,7 @@ export interface Run extends AsyncDisposable { * }; * ``` * - * The `_run` naming convention reserves `run` for the extended run. + * The `_run` naming convention reserves `run` for the extended Run. * * ## FAQ * @@ -670,7 +688,7 @@ export interface Run extends AsyncDisposable { * (k) => k in currentDeps, * ); * assert(!duplicate, `Dependency '${duplicate}' already added.`); - * return { ...currentDeps, ...newDeps }; + * return [undefined, { ...currentDeps, ...newDeps }]; * }); * return self as unknown as Run; * }; @@ -684,42 +702,6 @@ export interface Run extends AsyncDisposable { readonly addDeps: >(extraDeps: E) => Run; } -/** - * Abort mask depth for a {@link Run} or {@link Fiber}. - * - * - `0` — abortable (default) - * - `>= 1` — inside {@link unabortable}, abort requests are ignored - * - * The mask tracks nested unabortable regions. When abort is requested, the - * signal only propagates if `mask === 0`. - * - * - {@link unabortable} increments the mask — task becomes protected - * - {@link unabortableMask} provides `restore` to restore the previous mask - * - Tasks inherit their parent's mask by default - * - * This enables nested acquire/use/release patterns where each level can have - * its own abortable section while outer acquisitions remain protected. - * - * UI/debugging tools can use this to visually distinguish protected tasks - * (e.g., different icon or color) and explain why abort requests are ignored. - * - * @group Abort masking - */ -export const AbortMask = /*#__PURE__*/ brand("AbortMask", NonNegativeInt); -export type AbortMask = typeof AbortMask.Type; - -/** - * Maximum number of concurrent tasks. - * - * Default is 1 (sequential). Use 1-100 as a literal or {@link PositiveInt} for - * larger values. - * - * @group Concurrency primitives - * @see {@link parallel} - * @see {@link createSemaphore} - */ -export type Concurrency = Int1To100 | PositiveInt; - /** * `Fiber` is a handle to a running {@link Task} that can be awaited, aborted, or * disposed. @@ -752,13 +734,13 @@ export type Concurrency = Int1To100 | PositiveInt; * }; * ``` * - * Because `Fiber` is a {@link PromiseLike} object, fibers can be composed with + * Because `Fiber` is a {@link PromiseLike} object, Fibers can be composed with * `Promise.all`, `Promise.race`, etc. * - * Microtask timing: Run wraps the task's promise with `.then` and `.finally`, - * which adds microtasks between task completion and fiber settlement. Do not + * Microtask timing: Run wraps the Task's promise with `.then` and `.finally`, + * which adds microtasks between Task completion and Fiber settlement. Do not * write code that relies on a specific number of microtask yields between - * tasks. Use explicit synchronization primitives instead. + * Tasks. Use explicit synchronization primitives instead. * * @group Core Types */ @@ -768,9 +750,9 @@ export class Fiber readonly then: PromiseLike>["then"]; /** - * A {@link Run} whose lifetime is tied to this fiber. + * A {@link Run} of this Fiber. * - * Tasks run via this Run are aborted when the fiber ends. + * Tasks run via this Run are aborted when the Fiber ends. * * ### Example * @@ -780,7 +762,7 @@ export class Fiber * // helperTask is aborted when longRunningTask ends * fiber.run(helperTask); * - * // Monitor this fiber's run + * // Monitor this Fiber's Run * fiber.run.onEvent = (event) => { * console.log(event); * }; @@ -794,7 +776,7 @@ export class Fiber } /** - * Requests abort for this fiber (and any child it started). + * Requests abort for this Fiber (and any child it started). * * ### Example * @@ -804,8 +786,8 @@ export class Fiber * const result = await fiber; // err(AbortError) * ``` * - * When abort is requested, the fiber's result becomes {@link AbortError} even - * if the task completed successfully. This keeps behavior predictable — + * When abort is requested, the Fiber's result becomes {@link AbortError} even + * if the Task completed successfully. This keeps behavior predictable — * calling `abort()` always yields `AbortError`. * * The optional reason is stored in `AbortError.reason`. Since any value can @@ -822,9 +804,9 @@ export class Fiber ); } - /** Returns the current {@link FiberState}. */ - getState(): FiberState { - return this.run.getState() as FiberState; + /** Returns the current {@link RunState} of this Fiber's {@link Run}. */ + getState(): RunState { + return this.run.getState() as RunState; } [Symbol.dispose](): void { @@ -857,55 +839,94 @@ export type InferFiberDeps> = F extends Fiber ? D : never; /** - * The lifecycle state of a {@link Fiber}. + * Abort mask depth for a {@link Run} or {@link Fiber}. * - * - `running` — task running, no result yet - * - `completing` — waiting for children to complete - * - `completed` — completed with result and outcome + * - `0` — abortable (default) + * - `>= 1` — inside {@link unabortable}, abort requests are ignored + * + * The mask tracks nested unabortable regions. When abort is requested, the + * signal only propagates if `mask === 0`. + * + * - {@link unabortable} increments the mask — Task becomes protected + * - {@link unabortableMask} provides `restore` to restore the previous mask + * - Tasks inherit their parent's mask by default + * + * This enables nested acquire/use/release patterns where each level can have + * its own abortable section while outer acquisitions remain protected. + * + * UI/debugging tools can use this to visually distinguish protected Tasks + * (e.g., different icon or color) and explain why abort requests are ignored. + * + * @group Abort masking + */ +export const AbortMask = /*#__PURE__*/ brand("AbortMask", NonNegativeInt); +export type AbortMask = typeof AbortMask.Type; + +/** + * Maximum number of concurrent Tasks. + * + * Default is 1 (sequential). Use 1-100 as a literal or {@link PositiveInt} for + * larger values. + * + * @group Concurrency primitives + * @see {@link concurrently} + * @see {@link createSemaphore} + */ +export type Concurrency = Int1To100 | PositiveInt; + +/** + * The lifecycle state of a {@link Run}. + * + * - `Running` — Task running, no result yet + * - `Disposing` — abort requested, waiting for children to settle + * - `Settled` — settled with result and outcome * * @group Core Types */ -export interface FiberStateRunning extends Typed<"Running"> {} +export type RunState = + | RunStateRunning + | RunStateDisposing + | RunStateSettled; + +export interface RunStateRunning extends Typed<"Running"> {} -export interface FiberStateCompleting extends Typed<"Completing"> {} +export interface RunStateDisposing extends Typed<"Disposing"> {} -export interface FiberStateCompleted< +export interface RunStateSettled< T = unknown, E = unknown, -> extends Typed<"Completed"> { +> extends Typed<"Settled"> { /** - * The fiber's completion value. + * The Run's completion value. * - * If abort was requested, this is {@link AbortError} even if the task - * completed successfully — see `outcome` for what the task actually + * If abort was requested, this is {@link AbortError} even if the Task + * completed successfully — see `outcome` for what the Task actually * returned. */ readonly result: Result; /** - * What the task actually returned. + * What the Task actually returned. * * Unlike `result`, not overridden by abort. */ readonly outcome: Result; } -export type FiberState = - | FiberStateRunning - | FiberStateCompleting - | FiberStateCompleted; - /** - * {@link FiberState} Type. + * {@link RunSnapshot} state Type. * * @group Monitoring */ -export const FiberSnapshotState = /*#__PURE__*/ union( - typed("Running"), - typed("Completing"), - typed("Completed", { result: UnknownResult, outcome: UnknownResult }), +export const RunSnapshotState = /*#__PURE__*/ union( + /*#__PURE__*/ typed("Running"), + /*#__PURE__*/ typed("Disposing"), + /*#__PURE__*/ typed("Settled", { + result: UnknownResult, + outcome: UnknownResult, + }), ); -export type FiberSnapshotState = typeof FiberSnapshotState.Type; +export type RunSnapshotState = typeof RunSnapshotState.Type; /** * A recursive snapshot of a {@link Run} tree. @@ -919,15 +940,15 @@ export type FiberSnapshotState = typeof FiberSnapshotState.Type; * @group Core Types * @see {@link Run.snapshot} */ -export interface FiberSnapshot { - /** The {@link Run.id} of the {@link Fiber} this snapshot represents. */ +export interface RunSnapshot { + /** The {@link Run.id} this snapshot represents. */ readonly id: Id; /** The current lifecycle state. */ - readonly state: FiberSnapshotState; + readonly state: RunSnapshotState; /** Child snapshots in run order. */ - readonly children: ReadonlyArray; + readonly children: ReadonlyArray; /** The abort mask depth. `0` means abortable, `>= 1` means unabortable. */ readonly abortMask: AbortMask; @@ -939,9 +960,9 @@ export interface FiberSnapshot { * @group Monitoring */ export const RunEventData = /*#__PURE__*/ union( - typed("ChildAdded", { childId: Id }), - typed("ChildRemoved", { childId: Id }), - typed("StateChanged", { state: FiberSnapshotState }), + /*#__PURE__*/ typed("ChildAdded", { childId: Id }), + /*#__PURE__*/ typed("ChildRemoved", { childId: Id }), + /*#__PURE__*/ typed("StateChanged", { state: RunSnapshotState }), ); export type RunEventData = typeof RunEventData.Type; @@ -949,7 +970,7 @@ export type RunEventData = typeof RunEventData.Type; * Events emitted by a {@link Run} for monitoring and debugging. * * Events bubble up through parent runs, enabling centralized monitoring at the - * root. Use with {@link Run.onEvent} to track task lifecycle. + * root. Use with {@link Run.onEvent} to track Run lifecycle. * * @group Monitoring */ @@ -964,7 +985,7 @@ export interface RunEvent extends InferType {} * Task-aware wrapper around native * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncDisposableStack | AsyncDisposableStack}. * - * All tasks run via this stack are {@link unabortable} and run with + * All Tasks run via this stack are {@link unabortable} and run with * {@link Run.daemon}, ensuring acquisition and cleanup complete even if abort is * requested. * @@ -1011,7 +1032,7 @@ export class AsyncDisposableStack implements AsyncDisposable { * Registers a cleanup callback or {@link Task} to run when the stack is * disposed. * - * Deferred tasks run in LIFO order and are unabortable. + * Deferred Tasks run in LIFO order and are unabortable. * * ### Example * @@ -1174,7 +1195,7 @@ export interface RunConfig { /** * Whether to emit {@link RunEvent}s. * - * Use a {@link Ref} to enable/disable at runtime without recreating the run. + * Use a {@link Ref} to enable/disable at runtime without recreating the Run. * Disabled by default for zero overhead in production. */ readonly eventsEnabled: Ref; @@ -1212,8 +1233,11 @@ export interface CreateRun { /** * Creates root {@link Run}. * + * The root Run is also the daemon Run: it stays running until disposed. Child + * Runs created by `run(task)` are disposed by their parent once they settle. + * * Call once per entry point (main thread, worker, etc.) and dispose on - * shutdown. All tasks run as descendants of this root Run. + * shutdown. All Tasks run as descendants of this root Run. * * {@link RunDeps} provides default dependencies: * @@ -1252,7 +1276,7 @@ export interface CreateRun { * // ... * }; * - * // Composition root: create run with custom deps + * // Composition root: create a Run with custom deps * type AppDeps = RunDeps & ConfigDep; * * const appDeps: AppDeps = { @@ -1262,7 +1286,7 @@ export interface CreateRun { * * await using run = createRun(appDeps); * - * // Run type is inferred from deps argument + * // Run type is inferred from the deps argument * const result = await run(fetchUser("123")); * * // TypeScript catches missing deps at compile time: @@ -1315,7 +1339,7 @@ const createRunInternal = const requestController = new AbortController(); const signalController = new AbortController(); - let state: FiberState = running; + let state: RunState = running; let result: UnknownResult | undefined; let outcome: UnknownResult | undefined; let children: ReadonlySet> = emptySet; @@ -1338,8 +1362,9 @@ const createRunInternal = const deps = depsRef.get(); if (!deps.runConfig?.eventsEnabled.get()) return; const e: RunEvent = { id: self.id, timestamp: deps.time.now(), data }; - for (let node: Run | null = self; node; node = node.parent) + for (let node: Run | null = self; node; node = node.parent) { node.onEvent?.(e); + } }; const run = (task: Task): Fiber => { @@ -1351,8 +1376,8 @@ const createRunInternal = ); if (state !== running) { - run.requestAbort(runClosingAbortError); - task = () => err(runClosingAbortError); + run.requestAbort(runStoppedAbortError); + task = () => err(runStoppedAbortError); } else if ( signalController.signal.aborted && run.abortMask === isAbortable @@ -1390,7 +1415,7 @@ const createRunInternal = const run = self as Mutable>; const id = createId(depsRef.get()); - let snapshot: FiberSnapshot | null = null; + let snapshot: RunSnapshot | null = null; let disposingPromise: Promise | null = null; run.orThrow = async (task) => getOrThrow(await self(task)); @@ -1420,7 +1445,7 @@ const createRunInternal = ) { snapshot = { id, - state: state as FiberSnapshotState, + state: state as RunSnapshotState, children: childSnapshots, abortMask, }; @@ -1429,9 +1454,10 @@ const createRunInternal = }; run.daemon = daemon ?? self; + run.create = () => run.daemon(createDeferred().task).run; run.defer = (task) => ({ [Symbol.asyncDispose]: () => - run.daemon(unabortable(task as Task)).then(lazyVoid), + self.daemon(unabortable(task as Task)).then(lazyVoid), }); run.stack = () => new AsyncDisposableStack(self); @@ -1449,7 +1475,7 @@ const createRunInternal = `This assert ensures dependencies are created once. ` + `Automatic deduplication would mask bugs.`, ); - return { ...currentDeps, ...newDeps }; + return [undefined, { ...currentDeps, ...newDeps }]; }); return self as unknown as Run; }; @@ -1457,16 +1483,15 @@ const createRunInternal = run[Symbol.asyncDispose] = () => { if (disposingPromise) return disposingPromise; - state = { type: "Completing" }; + state = { type: "Disposing" }; emitEvent({ type: "StateChanged", state }); - - requestAbort(runClosingAbortError); + requestAbort(runStoppedAbortError); disposingPromise = Promise.allSettled(children) .then(lazyVoid) .finally(() => { [result, outcome] = [result ?? ok(), outcome ?? ok()]; - state = { type: "Completed", result, outcome }; + state = { type: "Settled", result, outcome }; emitEvent({ type: "StateChanged", state }); }); @@ -1485,26 +1510,26 @@ const createRunInternal = return self; }; -const running: FiberState = { type: "Running" }; +const running: RunState = { type: "Running" }; /** - * Error used as {@link AbortError} reason when a {@link Run} is disposed. + * Abort reason indicating a {@link Run} can no longer start new Tasks. + * + * Covers both disposing and settled Runs. * * @group Creating Run */ -export const RunClosingError = /*#__PURE__*/ typed("RunClosingError"); -export interface RunClosingError extends InferType {} +export const RunStoppedError = /*#__PURE__*/ typed("RunStoppedError"); +export interface RunStoppedError extends InferType {} /** - * The {@link RunClosingError} used when a {@link Run} is disposed. - * - * Tasks run on a disposing or disposed run receive this error as - * {@link AbortError} reason. + * Shared {@link RunStoppedError} instance used as the default + * {@link AbortError.reason} when a Task is started on a non-running {@link Run}. * * @group Creating Run */ -export const runClosingError: RunClosingError = { - type: "RunClosingError", +export const runStoppedError: RunStoppedError = { + type: "RunStoppedError", }; const createAbortError = (reason: unknown): AbortError => ({ @@ -1521,7 +1546,7 @@ const subscribeToAbort = ( else signal.addEventListener("abort", handler, options); }; -const runClosingAbortError: AbortError = createAbortError(runClosingError); +const runStoppedAbortError: AbortError = createAbortError(runStoppedError); const isAbortable = AbortMask.orThrow(0); type AbortBehavior = "unabortable" | AbortMask; @@ -1540,13 +1565,12 @@ const abortBehavior = /** * Makes a {@link Task} unabortable. * - * Once started, an unabortable task always completes — abort requests are + * Once started, an unabortable Task always completes — abort requests are * ignored and `signal.aborted` remains `false`. * - * Unabortable affects in-flight cancellation only. It does not guarantee the - * task starts. If the parent {@link Run} is already closing or disposed, - * `run(task)` short-circuits before task execution and returns - * `err(AbortError)` (typically with {@link runClosingError} as reason). + * If the parent {@link Run} is already disposing or settled, `run(task)` + * short-circuits before task execution and returns `err(AbortError)` with + * {@link runStoppedError} as reason. * * ### Example * @@ -1571,7 +1595,7 @@ const abortBehavior = * const trackImportantEvent = (event: number) => * unabortable(sendToAnalytics(event)); * - * // User clicks, we start tracking (task runs until first await) + * // User clicks, we start tracking (Task runs until first await) * const fiber = run(trackImportantEvent(123)); * * // User navigates away (abort requested while task is running) @@ -1619,14 +1643,13 @@ const getConcurrencyBehavior = (task: AnyTask): Concurrency | undefined => (task as never)[concurrencyBehaviorSymbol]; /** - * Runs tasks in parallel instead of sequentially. + * Runs tasks concurrently instead of sequentially. * * Sets the {@link Concurrency} level for a {@link Task}, which helpers like * {@link all}, {@link map}, etc. use to control how many tasks run at once. * * By default, tasks run sequentially (one at a time) to encourage thinking - * about concurrency explicitly — unlike `Promise.all` which runs everything in - * parallel. + * about concurrency explicitly. * * For tuple-based calls like `all([taskA, taskB, taskC])` with a known small * number of tasks, omit the limit (runs unlimited). For arrays of unknown @@ -1636,20 +1659,20 @@ const getConcurrencyBehavior = (task: AnyTask): Concurrency | undefined => * Composition helpers should respect inherited concurrency — they should not * override it with a fixed number unless semantically required (like * {@link race}). Helpers with a recommended concurrency should export it for use - * with `parallel`. + * with `concurrently`. * * ### Example * * ```ts * // Unlimited (omit the limit) - * run(parallel(all([fetchA, fetchB, fetchC]))); + * run(concurrently(all([fetchA, fetchB, fetchC]))); * * // Limited — at most 5 tasks run at a time - * run(parallel(5, all(tasks))); - * run(parallel(5, map(userIds, fetchUser))); + * run(concurrently(5, all(tasks))); + * run(concurrently(5, map(userIds, fetchUser))); * * // Inherited — inner all() uses parent's limit - * const pipeline = parallel(5, async (run) => { + * const pipeline = concurrently(5, async (run) => { * const users = await run(map(userIds, fetchUser)); // uses 5 * if (!users.ok) return users; * return run(map(users.value, enrichUser)); // also uses 5 @@ -1658,13 +1681,15 @@ const getConcurrencyBehavior = (task: AnyTask): Concurrency | undefined => * * @group Composition */ -export function parallel( +export function concurrently( concurrency: Concurrency, task: Task, ): Task; /** Unlimited. */ -export function parallel(task: Task): Task; -export function parallel( +export function concurrently( + task: Task, +): Task; +export function concurrently( concurrencyOrTask: Concurrency | Task, taskOrFallback?: Task, ): Task { @@ -1838,10 +1863,10 @@ export const sleep = (duration: Duration): Task => * * Like * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race | Promise.race}, - * the first task to complete (whether success or failure) wins. All other tasks - * are aborted. Use {@link any} if you need the first task to succeed instead. + * the first Task to complete (whether success or failure) wins. All other Tasks + * are aborted. Use {@link any} if you need the first Task to succeed instead. * - * Requires a non-empty array — racing zero tasks has no meaningful result + * Requires a non-empty array — racing zero Tasks has no meaningful result * (there's no "first to complete" without participants). This is enforced at * compile time for non-empty tuple types. For other arrays, guard with * {@link isNonEmptyArray}: @@ -1866,7 +1891,7 @@ export const sleep = (duration: Duration): Task => * ``` * * Always runs with unlimited concurrency — a sequential race makes no sense - * since the first task would always "win". + * since the first Task would always "win". * * @group Composition */ @@ -1882,7 +1907,8 @@ export const race = ]>( InferTaskOk, InferTaskErr, InferTaskDeps -> => parallel(pool(tasks, { stopOn: "first", collect: false, abortReason })); +> => + concurrently(pool(tasks, { stopOn: "first", collect: false, abortReason })); /** * Abort reason for tasks that lose a {@link race}. * @@ -1901,8 +1927,8 @@ export const raceLostError: RaceLostError = { type: "RaceLostError" }; /** * Wraps a {@link Task} with a time limit. * - * Returns {@link TimeoutError} if the task doesn't complete within the specified - * duration. The original task is aborted when the timeout fires. + * Returns {@link TimeoutError} if the Task doesn't complete within the specified + * duration. The original Task is aborted when the timeout fires. * * ### Example * @@ -1997,9 +2023,8 @@ export interface RetryError extends Typed<"RetryError"> { /** * Wraps a {@link Task} with retry logic. * - * Retries the task according to the {@link Schedule}'s timing and termination - * rules. Use {@link RetryOptions.retryable} to filter which errors should - * trigger retries. + * Retries the Task according to the {@link Schedule}'s rules. Use + * {@link RetryOptions.retryable} to filter which errors should trigger retries. * * All non-abort errors are wrapped in {@link RetryError}: * @@ -2142,13 +2167,13 @@ export interface RepeatAttempt extends ScheduleStep { /** * Repeats a {@link Task} according to a {@link Schedule}. * - * Runs the task, then checks the schedule to determine if it should repeat. The + * Runs the Task, then checks the schedule to determine if it should repeat. The * schedule controls how many repetitions occur and the delay between them. - * Continues until the schedule returns `Err(Done)` or the task fails. + * Continues until the schedule returns `Err(Done)` or the Task fails. * * With `take(n)`, the task runs n+1 times (initial run plus n repetitions). * - * Also works with {@link NextTask} — when the task returns `Err(Done)`, + * Also works with {@link NextTask} — when the Task returns `Err(Done)`, * repeat stops and propagates the done signal. * * ### Example @@ -2227,11 +2252,25 @@ export const repeat = * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers | Promise.withResolvers}, * but integrated with {@link Task} and {@link Run} for cancellation support. * - * Use for bridging callback-based APIs or coordinating between tasks. + * Use for bridging callback-based APIs or coordinating between Tasks. * - * Disposing aborts all waiting tasks with an {@link AbortError} with + * Disposing aborts all waiting Tasks with an {@link AbortError} with * {@link deferredDisposedError} reason. * + * ### Example + * + * ```ts + * const deferred = createDeferred(); + * + * // Start waiting for the value + * const fiber = run(deferred.task); + * + * // Resolve from elsewhere (callback, another task, etc.) + * deferred.resolve(ok("value")); + * + * const result = await fiber; // ok("value") + * ``` + * * @group Concurrency primitives * @see {@link createDeferred} */ @@ -2248,20 +2287,6 @@ export interface Deferred extends Disposable { /** * Creates a {@link Deferred}. * - * ### Example - * - * ```ts - * const deferred = createDeferred(); - * - * // Start waiting for the value - * const fiber = run(deferred.task); - * - * // Resolve from elsewhere (callback, another task, etc.) - * deferred.resolve(ok("value")); - * - * const result = await fiber; // ok("value") - * ``` - * * @group Concurrency primitives */ export const createDeferred = (): Deferred => { @@ -2308,87 +2333,6 @@ export const createDeferred = (): Deferred => { }; }; -/** - * Registry of {@link Deferred} tasks addressed by IDs. - * - * Useful for request-response protocols where requests carry an ID and - * responses arrive later with the same ID. - * - * @group Concurrency primitives - * @see {@link createDeferreds} - */ -export interface Deferreds extends Disposable { - /** Registers a new deferred task and returns its ID with the task. */ - readonly register: () => { - readonly id: Id; - readonly task: Task; - }; - - /** Resolves and removes deferred by ID. Returns false when ID is unknown. */ - readonly resolve: ( - id: Id, - result: Result, - ) => boolean; - - /** Resolves and removes all pending deferreds with the same result. */ - readonly resolveAll: ( - result: Result, - ) => void; -} - -/** - * Creates a {@link Deferreds} registry. - * - * ### Example - * - * ```ts - * const deferreds = createDeferreds(deps); - * const { id, task } = deferreds.register(); - * - * // Later, when response for id arrives: - * deferreds.resolve(id, ok("value")); - * - * const result = await run(task); // ok("value") - * ``` - * - * @group Concurrency primitives - */ -export const createDeferreds = ( - deps: RandomBytesDep, -): Deferreds => { - const deferredMap = new Map>(); - - return { - register: () => { - const id = createId<"Deferred">(deps); - const deferred = createDeferred(); - deferredMap.set(id, deferred); - return { id, task: deferred.task }; - }, - - resolve: (id, result) => { - const deferred = deferredMap.get(id); - if (!deferred) return false; - deferredMap.delete(id); - return deferred.resolve(result); - }, - - resolveAll: (result) => { - for (const deferred of deferredMap.values()) { - deferred.resolve(result); - } - deferredMap.clear(); - }, - - [Symbol.dispose]: () => { - for (const deferred of deferredMap.values()) { - deferred[Symbol.dispose](); - } - deferredMap.clear(); - }, - }; -}; - /** * Abort reason used when a {@link Deferred} is disposed. * @@ -2419,7 +2363,7 @@ export const deferredDisposedError: DeferredDisposedError = { * Use it to pause execution based on a condition. Unlike a {@link Deferred} * (which triggers once), a {@link Gate} can be opened and closed repeatedly. * - * Disposing aborts all waiting tasks with {@link deferredDisposedError}. + * Disposing aborts all waiting Tasks with {@link deferredDisposedError}. * * @group Concurrency primitives * @see {@link createGate} @@ -2434,7 +2378,7 @@ export interface Gate extends Disposable { /** * Creates a {@link Gate} that starts closed. * - * Useful for "stop/go" logic where multiple tasks need to wait for a state + * Useful for "stop/go" logic where multiple Tasks need to wait for a state * change. * * ### Example @@ -2505,8 +2449,8 @@ export interface Semaphore extends Disposable { /** * Executes a {@link Task} while holding a semaphore permit. * - * The task waits until a permit is available. If the semaphore is disposed - * while waiting or running, the task is aborted with an {@link AbortError} + * The Task waits until a permit is available. If the semaphore is disposed + * while waiting or running, the Task is aborted with an {@link AbortError} * whose reason is {@link semaphoreDisposedError}. */ readonly withPermit: (task: Task) => Task; @@ -2515,11 +2459,11 @@ export interface Semaphore extends Disposable { * Executes a {@link Task} while holding a specified number of permits. * * If insufficient permits are available, waits in FIFO order until permits - * become available. If disposed while waiting or running, task is aborted + * become available. If disposed while waiting or running, the Task is aborted * with {@link semaphoreDisposedError}. * - * Use this for weighted concurrency where a task represents a resource - * demand, not just "one more task". One permit is one resource unit. + * Use this for weighted concurrency where a Task represents a resource + * demand, not just "one more Task". One permit is one resource unit. * * Example: with capacity `10`, a lightweight operation can reserve `1` permit * while a heavy operation reserves `4` permits. This models shared budgets @@ -2544,7 +2488,7 @@ export interface SemaphoreSnapshot { /** Currently held permits. */ readonly taken: NonNegativeInt; - /** Number of currently waiting tasks. */ + /** Number of currently waiting Tasks. */ readonly waiting: NonNegativeInt; /** Currently available permits. */ @@ -2743,7 +2687,7 @@ export interface SemaphoreByKey extends Disposable { permits: Concurrency, ) => (task: Task) => Task; - /** Returns current semaphore state for a key, or `null` when no state exists. */ + /** Returns current semaphore state for a key, or `null` if absent. */ readonly snapshot: (key: K) => SemaphoreSnapshot | null; } @@ -2845,12 +2789,30 @@ export interface Mutex extends Disposable { /** * Executes a {@link Task} while holding the mutex lock. * - * Only one task can hold the lock at a time. Other tasks wait until the lock + * Only one Task can hold the lock at a time. Other Tasks wait until the lock * is released. */ readonly withLock: (task: Task) => Task; + + /** Returns the current mutex state for monitoring/debugging. */ + readonly snapshot: () => SemaphoreSnapshot; } +/** + * Creates a {@link Mutex}. + * + * @group Concurrency primitives + */ +export const createMutex = (): Mutex => { + const semaphore = createSemaphore(minPositiveInt); + + return { + withLock: semaphore.withPermit, + snapshot: semaphore.snapshot, + [Symbol.dispose]: semaphore[Symbol.dispose], + }; +}; + /** * A keyed {@link Mutex} registry. * @@ -2865,6 +2827,9 @@ export interface MutexByKey extends Disposable { * Behaves like {@link Mutex.withLock}, scoped to `key`. */ readonly withLock: (key: K, task: Task) => Task; + + /** Returns the current mutex state for `key`, or `null` if absent. */ + readonly snapshot: (key: K) => SemaphoreSnapshot | null; } /** @@ -2880,135 +2845,125 @@ export const createMutexByKey = < return { withLock: (key: K, task: Task): Task => semaphoreByKey.withPermit(key, task), + snapshot: semaphoreByKey.snapshot, [Symbol.dispose]: semaphoreByKey[Symbol.dispose], }; }; /** - * Creates a {@link Mutex}. + * {@link Ref} protected by a {@link Mutex}. * - * @group Concurrency primitives - */ -export const createMutex = (): Mutex => { - const semaphore = createSemaphore(minPositiveInt); - - return { - withLock: semaphore.withPermit, - [Symbol.dispose]: semaphore[Symbol.dispose], - }; -}; - -/** - * Task-based variant of {@link Instances} for async disposable instances. + * `MutexRef` stores mutable state and serializes all operations through an + * internal {@link Mutex}. Reads, writes, and updates observe one consistent + * state transition at a time. If the update fails or is aborted, the previous + * state is preserved. * - * Uses {@link Task} for create and cache-hit refresh. Read operations (`get` and - * `has`) are synchronous. + * Typical use cases are small stateful coordinators such as caches, session + * state, in-memory registries, and counters whose transitions need to run + * {@link Task}s atomically. * * @group Concurrency primitives */ -export interface TaskInstances< - K extends string, - T extends AsyncDisposable, - D = unknown, -> extends AsyncDisposable { - /** - * Ensures an instance exists for the given key. - * - * If missing, `create` is executed and stored. If present, `onCacheHit` runs - * with the existing instance. Errors from either callback are propagated. - */ - readonly ensure: ( - key: K, - create: Task, - onCacheHit?: (instance: T) => Task, - ) => Task; +export interface MutexRef extends Disposable { + /** Returns the current state. */ + readonly get: Task; - /** Gets an instance by key, or `null` when missing. */ - readonly get: (key: K) => T | null; + /** Sets the state. */ + readonly set: (state: T) => Task; - /** Checks if an instance exists for the given key. */ - readonly has: (key: K) => boolean; + /** Sets the state and returns the previous state. */ + readonly getAndSet: (state: T) => Task; - /** - * Deletes and disposes an instance by key. - * - * Returns `true` if an instance existed, otherwise `false`. - */ - readonly delete: (key: K) => Task; + /** Sets the state and returns the current state after the update. */ + readonly setAndGet: (state: T) => Task; + + /** Updates the state. */ + readonly update: ( + updater: (current: T) => Task, + ) => Task; + + /** Updates the state and returns the previous state. */ + readonly getAndUpdate: ( + updater: (current: T) => Task, + ) => Task; + + /** Updates the state and returns the current state after the update. */ + readonly updateAndGet: ( + updater: (current: T) => Task, + ) => Task; + + /** Modifies the state and returns a computed result from the transition. */ + readonly modify: ( + updater: (current: T) => Task, + ) => Task; } /** - * Creates a {@link TaskInstances}. - * - * Disposing clears and disposes current instances. The registry remains usable - * after disposal. + * Creates a {@link MutexRef} with the given initial state. * * @group Concurrency primitives */ -export const createTaskInstances = < - K extends string, - T extends AsyncDisposable, - D = unknown, ->(): TaskInstances => { - const instances = new Map(); - const mutexByKey = createInstances(); +export const createMutexRef = (initialState: T): MutexRef => { + let currentState = initialState; + const mutex = createMutex(); return { - ensure: - ( - key: K, - create: Task, - onCacheHit?: (instance: T) => Task, - ): Task => - async (run) => { - const mutex = mutexByKey.ensure(key, createMutex); - return await run( - mutex.withLock(async (run) => { - let instance = instances.get(key); - - if (instance == null) { - const created = await run(create); - if (!created.ok) return created; - - instance = created.value; - instances.set(key, instance); - } else if (onCacheHit) { - const cacheHitResult = await run(onCacheHit(instance)); - if (!cacheHitResult.ok) return cacheHitResult; - } - - return ok(instance); - }), - ); - }, - - get: (key) => instances.get(key) ?? null, - - has: (key) => instances.has(key), - - delete: (key: K) => async (run) => { - const mutex = mutexByKey.get(key); - if (mutex == null) return ok(false); - - return await run( - mutex.withLock(async () => { - await using instance = instances.get(key); - if (instance) instances.delete(key); - return ok(instance != null); - }), - ); - }, - - [Symbol.asyncDispose]: async () => { - await using stack = new globalThis.AsyncDisposableStack(); - stack.use(mutexByKey); - - for (const instance of instances.values()) { - stack.use(instance); - } - - instances.clear(); - }, + get: mutex.withLock(() => ok(currentState)), + + set: (state) => + mutex.withLock(() => { + currentState = state; + return ok(); + }), + + getAndSet: (state) => + mutex.withLock(() => { + const previousState = currentState; + currentState = state; + return ok(previousState); + }), + + setAndGet: (state) => + mutex.withLock(() => { + currentState = state; + return ok(currentState); + }), + + update: (updater) => + mutex.withLock(async (run) => { + const nextState = await run(updater(currentState)); + if (!nextState.ok) return nextState; + currentState = nextState.value; + return ok(); + }), + + getAndUpdate: (updater) => + mutex.withLock(async (run) => { + const previousState = currentState; + const nextState = await run(updater(currentState)); + if (!nextState.ok) return nextState; + currentState = nextState.value; + return ok(previousState); + }), + + updateAndGet: (updater) => + mutex.withLock(async (run) => { + const nextState = await run(updater(currentState)); + if (!nextState.ok) return nextState; + currentState = nextState.value; + return ok(currentState); + }), + + modify: (updater) => + mutex.withLock(async (run) => { + const nextState = await run(updater(currentState)); + if (!nextState.ok) return nextState; + const [result, updatedState] = nextState.value; + currentState = updatedState; + return ok(result); + }), + + [Symbol.dispose]: mutex[Symbol.dispose], }; }; @@ -3092,7 +3047,7 @@ export interface CollectOptions { /** * Fails fast on first error across multiple {@link Task}s. * - * Sequential by default — use {@link parallel} to run concurrently. + * Sequential by default — use {@link concurrently} to run concurrently. * * ### Example * @@ -3190,7 +3145,7 @@ export function all( /** * Abort reason used by {@link all} when aborting remaining tasks. * - * Used when a task fails and other tasks need to be aborted. + * Used when a Task fails and other Tasks need to be aborted. * * @group Composition */ @@ -3209,10 +3164,10 @@ export const allAbortError: AllAbortError = { type: "AllAbortError" }; * * Like * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled | Promise.allSettled}, - * all tasks run to completion regardless of individual failures. Returns an + * all Tasks run to completion regardless of individual failures. Returns an * array of {@link Result}s preserving the original order. * - * Sequential by default. Use {@link parallel} for parallel execution. + * Sequential by default. Use {@link concurrently} for concurrent execution. * * ### Example * @@ -3344,7 +3299,7 @@ export const allSettledAbortError: AllSettledAbortError = { /** * Maps values to {@link Task}s, failing fast on first error. * - * Sequential by default — use {@link parallel} for parallel execution. + * Sequential by default — use {@link concurrently} for concurrent execution. * * ### Example * @@ -3444,7 +3399,7 @@ export const mapAbortError: MapAbortError = { * Maps values to {@link Task}s, completing all regardless of failures. * * Returns an array of {@link Result}s preserving the original order. Sequential - * by default — use {@link parallel} for parallel execution. + * by default — use {@link concurrently} for concurrent execution. * * ### Example * @@ -3540,10 +3495,10 @@ export function mapSettled( * * Like * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any | Promise.any}, - * the first task to succeed wins. All other tasks are aborted. If all tasks + * the first Task to succeed wins. All other Tasks are aborted. If all Tasks * fail, returns the last error (by input order). * - * Sequential by default. Use {@link parallel} for parallel execution. + * Sequential by default. Use {@link concurrently} for concurrent execution. * * Think of it like `Array.prototype.some()` — it stops on the first success. * This is in contrast to {@link race}, which returns the first task to complete @@ -3554,7 +3509,7 @@ export function mapSettled( * ```ts * // Try multiple endpoints concurrently, first success wins * const result = await run( - * parallel( + * concurrently( * any([fetchFromPrimary, fetchFromSecondary, fetchFromTertiary]), * ), * ); @@ -3592,7 +3547,7 @@ export function any( * * - `"input"` returns the error from the last task in the input array. This is * stable under concurrency and generally produces deterministic tests. - * - `"completion"` returns the error from the task that finished last. This + * - `"completion"` returns the error from the Task that finished last. This * reflects timing but can vary across runs when task timing varies. * * ### Example @@ -3600,7 +3555,7 @@ export function any( * ```ts * await using run = createRun(); * const result = await run( - * parallel(any([a, b, c], { allFailed: "completion" })), + * concurrently(any([a, b, c], { allFailed: "completion" })), * ); * ``` */ @@ -3668,7 +3623,7 @@ const collect = ( }; /** - * When to stop processing tasks in {@link pool}. + * When to stop processing Tasks in {@link pool}. * * - `"first"` — stop on first result (success or error), used by {@link race} * - `"error"` — stop on first error, used by {@link all} and {@link map} @@ -3688,10 +3643,10 @@ const mapInput = ( /** * Worker pool respecting {@link Run.concurrency}. * - * Spawns only as many workers as allowed, avoiding idle fibers waiting for + * Spawns only as many workers as allowed, avoiding idle Fibers waiting for * permits. * - * Workers run as daemons so callers don't block on unabortable tasks. When + * Workers run as daemons so callers don't block on unabortable Tasks. When * abort is requested, pool returns immediately. Structured concurrency is * preserved because the root {@link Run} still waits for all daemons. * diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index fd982cd33..1613e0743 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -20,7 +20,6 @@ import { } from "../src/Schedule.js"; import type { Fiber, - FiberState, InferFiberErr, InferFiberOk, InferTaskDone, @@ -31,6 +30,7 @@ import type { Run, RunConfigDep, RunDeps, + RunState, Task, } from "../src/Task.js"; import { @@ -43,29 +43,29 @@ import { AnyAbortError, AsyncDisposableStack, callback, + concurrently, createDeferred, - createDeferreds, createGate, createInMemoryLeaderLock, createMutex, + createMutexRef, createMutexByKey, createRun, createSemaphore, createSemaphoreByKey, - createTaskInstances, deferredDisposedError, DeferredDisposedError, fetch, map, MapAbortError, mapSettled, - parallel, race, RaceLostError, repeat, retry, - runClosingError, + runStoppedError, RunEvent, + semaphoreDisposedError, sleep, timeout, TimeoutError, @@ -73,7 +73,11 @@ import { unabortableMask, yieldNow, } from "../src/Task.js"; -import { testCreateDeps, testCreateRun } from "../src/Test.js"; +import { + testCreateDeps, + testCreateRun, + testWaitForMacrotask, +} from "../src/Test.js"; import { createTime, Millis, msLongTask, testCreateTime } from "../src/Time.js"; import type { Typed } from "../src/Type.js"; import { @@ -454,7 +458,7 @@ describe("Run", () => { await fiber; }); - test("emits completing, completed, childRemoved when child completes", async () => { + test("emits disposing, settled, childRemoved when child completes", async () => { await using run = testCreateRun(eventsEnabled); const events: Array = []; @@ -475,16 +479,16 @@ describe("Run", () => { "ChildRemoved", ]); - const [completing, completed, childRemoved] = events; + const [disposing, settled, childRemoved] = events; - assert(completing.data.type === "StateChanged"); - expect(completing.data.state.type).toBe("Completing"); + assert(disposing.data.type === "StateChanged"); + expect(disposing.data.state.type).toBe("Disposing"); - assert(completed.data.type === "StateChanged"); - expect(completed.data.state.type).toBe("Completed"); - assert(completed.data.state.type === "Completed"); - expect(completed.data.state.result).toEqual(ok()); - expect(completed.data.state.outcome).toEqual(ok()); + assert(settled.data.type === "StateChanged"); + expect(settled.data.state.type).toBe("Settled"); + assert(settled.data.state.type === "Settled"); + expect(settled.data.state.result).toEqual(ok()); + expect(settled.data.state.outcome).toEqual(ok()); assert(childRemoved.data.type === "ChildRemoved"); expect(childRemoved.data.childId).toBe(fiber.run.id); @@ -782,17 +786,17 @@ describe("Run", () => { expect(results).toEqual(["task1 aborted", "task2 aborted"]); }); - test("transitions running → completing → completed", async () => { + test("transitions running → disposing → settled", async () => { const run = createRun(); - expectTypeOf(run.getState()).toEqualTypeOf(); + expectTypeOf(run.getState()).toEqualTypeOf(); expect(run.getState().type).toBe("Running"); const taskStarted = Promise.withResolvers(); const taskCanFinish = Promise.withResolvers(); - let stateInAbortHandler: FiberState | undefined; - let stateAfterAwait: FiberState | undefined; + let stateInAbortHandler: RunState | undefined; + let stateAfterAwait: RunState | undefined; const task: Task = async (run) => { run.signal.addEventListener("abort", () => { @@ -808,24 +812,24 @@ describe("Run", () => { await taskStarted.promise; const disposePromise = run[Symbol.asyncDispose](); - expect(run.getState().type).toBe("Completing"); + expect(run.getState().type).toBe("Disposing"); taskCanFinish.resolve(); await disposePromise; - expect(stateInAbortHandler!.type).toBe("Completing"); - expect(stateAfterAwait!.type).toBe("Completing"); - expect(run.getState().type).toBe("Completed"); + expect(stateInAbortHandler!.type).toBe("Disposing"); + expect(stateAfterAwait!.type).toBe("Disposing"); + expect(run.getState().type).toBe("Settled"); }); - test("defaults completed result and outcome to ok", async () => { + test("defaults settled result and outcome to ok", async () => { const run = createRun(); await run[Symbol.asyncDispose](); const state = run.getState(); expect(state).toEqual({ - type: "Completed", + type: "Settled", result: ok(), outcome: ok(), }); @@ -840,11 +844,11 @@ describe("Run", () => { expect(promise1).toBe(promise2); }); - test("does not run new tasks when completing", async () => { + test("does not run new tasks when disposing", async () => { const run = createRun(); run[Symbol.asyncDispose](); - expect(run.getState().type).toBe("Completing"); + expect(run.getState().type).toBe("Disposing"); let regularRan = false; let unabortableRan = false; @@ -875,21 +879,21 @@ describe("Run", () => { expect(unabortableRan).toBe(false); expect(unabortableMaskRan).toBe(false); - expect(regularFiber.run.getState().type).toBe("Completed"); - expect(unabortableFiber.run.getState().type).toBe("Completed"); - expect(unabortableMaskFiber.run.getState().type).toBe("Completed"); + expect(regularFiber.run.getState().type).toBe("Settled"); + expect(unabortableFiber.run.getState().type).toBe("Settled"); + expect(unabortableMaskFiber.run.getState().type).toBe("Settled"); - const expected = err({ type: "AbortError", reason: runClosingError }); + const expected = err({ type: "AbortError", reason: runStoppedError }); expect(regularResult).toEqual(expected); expect(unabortableResult).toEqual(expected); expect(unabortableMaskResult).toEqual(expected); }); - test("does not run new tasks when completed", async () => { + test("does not run new tasks when settled", async () => { const run = createRun(); await run[Symbol.asyncDispose](); - expect(run.getState().type).toBe("Completed"); + expect(run.getState().type).toBe("Settled"); let regularRan = false; let unabortableRan = false; @@ -920,11 +924,11 @@ describe("Run", () => { expect(unabortableRan).toBe(false); expect(unabortableMaskRan).toBe(false); - expect(regularFiber.run.getState().type).toBe("Completed"); - expect(unabortableFiber.run.getState().type).toBe("Completed"); - expect(unabortableMaskFiber.run.getState().type).toBe("Completed"); + expect(regularFiber.run.getState().type).toBe("Settled"); + expect(unabortableFiber.run.getState().type).toBe("Settled"); + expect(unabortableMaskFiber.run.getState().type).toBe("Settled"); - const expected = err({ type: "AbortError", reason: runClosingError }); + const expected = err({ type: "AbortError", reason: runStoppedError }); expect(regularResult).toEqual(expected); expect(unabortableResult).toEqual(expected); expect(unabortableMaskResult).toEqual(expected); @@ -1109,6 +1113,161 @@ describe("Run", () => { }, ); }); + + describe("create", () => { + test("created run outlives parent task", async () => { + const time = testCreateTime(); + await using run = testCreateRun({ time }); + + const events: Array = []; + let childFiber: Fiber | undefined; + + const childTask: Task = async (run) => { + events.push("child started"); + const result = await run(sleep("5s")); + if (!result.ok) return result; + events.push("child completed"); + return ok(); + }; + + const parentTask: Task = async (run) => { + events.push("parent started"); + childFiber = run.create()(childTask); + + const result = await run(sleep("3s")); + if (!result.ok) return result; + + events.push("parent completed"); + return ok(); + }; + + const parentFiber = run(parentTask); + + expect(events).toEqual(["parent started", "child started"]); + + time.advance("3s"); + + expect(await parentFiber).toEqual(ok()); + expect(events).toEqual([ + "parent started", + "child started", + "parent completed", + ]); + expect(childFiber!.run.getState().type).toBe("Running"); + + time.advance("2s"); + + expect(await childFiber!).toEqual(ok()); + expect(events).toEqual([ + "parent started", + "child started", + "parent completed", + "child completed", + ]); + }); + + test("shares deps with the creating run", async () => { + interface CustomDep { + readonly custom: { readonly value: string }; + } + + await using run = createRun(); + + let receivedValue: string | undefined; + const childTask: Task = (run) => + ok(run.deps.custom.value); + + const parentTask: Task = async (_run) => { + const run = _run.addDeps({ custom: { value: "from-create" } }); + const createdRun = run.create(); + + const result = await createdRun(childTask); + if (!result.ok) return result; + + receivedValue = result.value; + return ok(); + }; + + expect(await run(parentTask)).toEqual(ok()); + expect(receivedValue).toBe("from-create"); + }); + + test("disposing created run aborts running tasks and later calls", async () => { + await using run = testCreateRun(); + + const events: Array = []; + let createdRun: Run | undefined; + + expect( + await run((_run) => { + createdRun = _run.create(); + return ok(); + }), + ).toEqual(ok()); + + const childFiber = createdRun!(async (run) => { + events.push("child started"); + const result = await run(sleep("10s")); + if (!result.ok) { + events.push("child aborted"); + return result; + } + + events.push("child completed"); + return ok(); + }); + + expect(events).toEqual(["child started"]); + + await createdRun![Symbol.asyncDispose](); + + expect(await childFiber).toEqual( + err({ type: "AbortError", reason: runStoppedError }), + ); + expect(events).toEqual(["child started", "child aborted"]); + + const lateResult = await createdRun!(() => ok("late")); + expect(lateResult).toEqual( + err({ type: "AbortError", reason: runStoppedError }), + ); + }); + + test("created run is aborted when root Run disposes", async () => { + const time = testCreateTime(); + const run = testCreateRun({ time }); + + const events: Array = []; + let createdRun: Run | undefined; + + expect( + await run((_run) => { + createdRun = _run.create(); + return ok(); + }), + ).toEqual(ok()); + + const childFiber = createdRun!(async (run) => { + events.push("child started"); + const result = await run(sleep("10s")); + if (!result.ok) { + events.push("child aborted"); + return result; + } + + events.push("child completed"); + return ok(); + }); + + expect(events).toEqual(["child started"]); + + await run[Symbol.asyncDispose](); + + expect(await childFiber).toEqual( + err({ type: "AbortError", reason: runStoppedError }), + ); + expect(events).toEqual(["child started", "child aborted"]); + }); + }); }); describe("Fiber", () => { @@ -1132,7 +1291,7 @@ describe("Fiber", () => { let taskRan = false; let signalAbortedBeforeInnerRun = false; - let innerFiberState: FiberState | undefined; + let innerFiberState: RunState | undefined; const fiber = run(async (run) => { await Promise.resolve(); @@ -1155,7 +1314,7 @@ describe("Fiber", () => { expect(signalAbortedBeforeInnerRun).toBe(true); expect(taskRan).toBe(false); - assert(innerFiberState?.type === "Completed"); + assert(innerFiberState?.type === "Settled"); expect(innerFiberState.result).toEqual( err({ type: "AbortError", reason: "stop" }), ); @@ -1240,7 +1399,7 @@ describe("Fiber", () => { }); }); - test("getState returns running while running, completed with result after completion", async () => { + test("getState returns running while running, settled with result after completion", async () => { await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1253,12 +1412,12 @@ describe("Fiber", () => { await fiber; const state = fiber.getState(); - expectTypeOf(state).toEqualTypeOf>(); - assert(state.type === "Completed"); + expectTypeOf(state).toEqualTypeOf>(); + assert(state.type === "Settled"); expect(state.result).toEqual(ok(42)); }); - test("completed state outcome equals result when not aborted", async () => { + test("settled state outcome equals result when not aborted", async () => { await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1271,11 +1430,11 @@ describe("Fiber", () => { await fiber; const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); expect(state.outcome).toEqual(state.result); }); - test("completed state outcome preserves original result when aborted", async () => { + test("settled state outcome preserves original result when aborted", async () => { await using run = createRun(); const fiber = run(() => ok("data")); @@ -1283,7 +1442,7 @@ describe("Fiber", () => { await fiber; const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); // result returns AbortError expect(state.result).toEqual(err({ type: "AbortError", reason: "stop" })); // outcome preserves what the task actually returned @@ -1317,7 +1476,7 @@ describe("Fiber", () => { expect(parentFiberId).not.toBe(childFiberId); }); - test("snapshot returns running state while running, completed with result after completion", async () => { + test("snapshot returns running state while running, settled with result after completion", async () => { await using run = createRun(); const taskComplete = Promise.withResolvers>(); @@ -1328,7 +1487,7 @@ describe("Fiber", () => { taskComplete.resolve(ok(42)); await fiber; const snapshotState = fiber.run.snapshot().state; - assert(snapshotState.type === "Completed"); + assert(snapshotState.type === "Settled"); expect(snapshotState.result).toEqual(ok(42)); }); }); @@ -1578,7 +1737,7 @@ describe("unabortable", () => { expect(result).toEqual(err({ type: "AbortError", reason: "stop" })); // Outcome preserves what the task actually returned const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); expect(state.outcome).toEqual(innerResult); }); @@ -2279,7 +2438,7 @@ describe("AsyncDisposableStack", () => { await using run = createRun(); let childRun: Run | null = null; - let stateWhileWorking: FiberState | null = null; + let stateWhileWorking: RunState | null = null; const task: Task = async (run) => { await using stack = run.stack(); @@ -2297,7 +2456,7 @@ describe("AsyncDisposableStack", () => { expect(result).toEqual(ok()); expect(stateWhileWorking!.type).toBe("Running"); - expect(childRun!.getState().type).toBe("Completed"); + expect(childRun!.getState().type).toBe("Settled"); }); test("accepts moved native stack", async () => { @@ -3001,7 +3160,7 @@ describe("sleep", () => { expect(result).toEqual(err({ type: "AbortError", reason: "cancelled" })); const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); expect(state.outcome).toEqual( err({ type: "AbortError", reason: "cancelled" }), ); @@ -4094,7 +4253,7 @@ describe("DI", () => { }); describe("concurrency", () => { - describe("parallel", () => { + describe("concurrently", () => { test("defaults to max concurrency when passed only a task", async () => { await using run = createRun(); @@ -4111,7 +4270,7 @@ describe("concurrency", () => { }; const fiber = run( - parallel(all([createTask(1), createTask(2), createTask(3)])), + concurrently(all([createTask(1), createTask(2), createTask(3)])), ); expect(events).toEqual(["start 1", "start 2", "start 3"]); @@ -4138,7 +4297,7 @@ describe("concurrency", () => { }; const fiber = run( - parallel(2, (run) => + concurrently(2, (run) => run( all([createTask(1), createTask(2), createTask(3), createTask(4)]), ), @@ -4155,7 +4314,7 @@ describe("concurrency", () => { expect(result).toEqual(ok([1, 2, 3, 4])); }); - test("nested parallel overrides parent", async () => { + test("nested concurrently overrides parent concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -4171,9 +4330,9 @@ describe("concurrency", () => { }; const fiber = run( - parallel(5, (run) => + concurrently(5, (run) => run( - parallel(1, (run) => + concurrently(1, (run) => run(all([createTask(1), createTask(2), createTask(3)])), ), ), @@ -4238,7 +4397,7 @@ describe("concurrency", () => { }; const fiber = run( - parallel(all([createTask(1), createTask(2), createTask(3)])), + concurrently(all([createTask(1), createTask(2), createTask(3)])), ); await Promise.resolve(); @@ -4275,7 +4434,9 @@ describe("concurrency", () => { }); const start = Date.now(); - const result = await run(parallel(all([unabortableTask, failingTask]))); + const result = await run( + concurrently(all([unabortableTask, failingTask])), + ); const elapsed = Date.now() - start; // all returns promptly with error, doesn't wait for unabortable task @@ -4402,76 +4563,6 @@ describe("concurrency", () => { }); }); - describe("Deferreds", () => { - test("register and resolve by id", async () => { - await using run = createRun(); - - const deferreds = createDeferreds(run.deps); - const { id, task } = deferreds.register(); - - const fiber = run(task); - expect(deferreds.resolve(id, ok("value"))).toBe(true); - - const result = await fiber; - expect(result).toEqual(ok("value")); - }); - - test("resolve returns false when id is already resolved", () => { - const deferreds = createDeferreds(testCreateDeps()); - const { id } = deferreds.register(); - - expect(deferreds.resolve(id, ok("value"))).toBe(true); - expect(deferreds.resolve(id, ok("again"))).toBe(false); - }); - - test("register returns unique ids", () => { - const deferreds = createDeferreds(testCreateDeps()); - - const first = deferreds.register(); - const second = deferreds.register(); - - expect(first.id).not.toBe(second.id); - }); - - test("resolveAll completes all pending tasks", async () => { - await using run = createRun(); - - const deferreds = createDeferreds(run.deps); - const first = deferreds.register(); - const second = deferreds.register(); - - const fiber1 = run(first.task); - const fiber2 = run(second.task); - - deferreds.resolveAll(ok("all")); - - const result1 = await fiber1; - const result2 = await fiber2; - - expect(result1).toEqual(ok("all")); - expect(result2).toEqual(ok("all")); - }); - - test("dispose aborts pending tasks with DeferredDisposedError", async () => { - await using run = createRun(); - - const deferreds = createDeferreds(run.deps); - const first = deferreds.register(); - const second = deferreds.register(); - - const fiber1 = run(first.task); - const fiber2 = run(second.task); - - deferreds[Symbol.dispose](); - - const result1 = await fiber1; - const result2 = await fiber2; - - expect(result1).toEqual(err(deferredDisposedError)); - expect(result2).toEqual(err(deferredDisposedError)); - }); - }); - describe("Gate", () => { test("wait blocks until gate is opened", async () => { await using run = createRun(); @@ -5711,6 +5802,108 @@ describe("concurrency", () => { }); }); + describe("Mutex", () => { + test("runs tasks sequentially", async () => { + await using run = createRun(); + + const mutex = createMutex(); + const events: Array = []; + + const firstStarted = Promise.withResolvers(); + const firstFinish = Promise.withResolvers(); + const secondStarted = Promise.withResolvers(); + + const firstTask: Task = async () => { + events.push("start 1"); + firstStarted.resolve(); + await firstFinish.promise; + events.push("end 1"); + return ok(); + }; + + const secondTask: Task = () => { + events.push("start 2"); + secondStarted.resolve(); + events.push("end 2"); + return ok(); + }; + + const firstFiber = run(mutex.withLock(firstTask)); + await firstStarted.promise; + + const secondFiber = run(mutex.withLock(secondTask)); + + await Promise.resolve(); + expect(events).toEqual(["start 1"]); + + firstFinish.resolve(); + await firstFiber; + await secondStarted.promise; + await secondFiber; + + expect(events).toEqual(["start 1", "end 1", "start 2", "end 2"]); + + mutex[Symbol.dispose](); + }); + + test("snapshot reflects lock, waiters, and disposal", async () => { + await using run = createRun(); + + const mutex = createMutex(); + const canFinish = Promise.withResolvers(); + const started = Promise.withResolvers(); + + const fiber1 = run( + mutex.withLock(async () => { + started.resolve(); + await canFinish.promise; + return ok(); + }), + ); + + await started.promise; + expect(mutex.snapshot()).toEqual({ + permits: 1, + taken: 1, + waiting: 0, + available: 0, + disposed: false, + }); + + const fiber2 = run(mutex.withLock(() => ok())); + await Promise.resolve(); + + expect(mutex.snapshot()).toEqual({ + permits: 1, + taken: 1, + waiting: 1, + available: 0, + disposed: false, + }); + + canFinish.resolve(); + await Promise.all([fiber1, fiber2]); + + expect(mutex.snapshot()).toEqual({ + permits: 1, + taken: 0, + waiting: 0, + available: 1, + disposed: false, + }); + + mutex[Symbol.dispose](); + + expect(mutex.snapshot()).toEqual({ + permits: 1, + taken: 0, + waiting: 0, + available: 1, + disposed: true, + }); + }); + }); + describe("MutexByKey", () => { test("runs tasks independently for different keys", async () => { await using run = createRun(); @@ -5884,445 +6077,222 @@ describe("concurrency", () => { }); }); - describe("Mutex", () => { - test("runs tasks sequentially", async () => { - await using run = createRun(); - - const mutex = createMutex(); - const events: Array = []; - - const firstStarted = Promise.withResolvers(); - const firstFinish = Promise.withResolvers(); - const secondStarted = Promise.withResolvers(); - - const firstTask: Task = async () => { - events.push("start 1"); - firstStarted.resolve(); - await firstFinish.promise; - events.push("end 1"); - return ok(); - }; - - const secondTask: Task = () => { - events.push("start 2"); - secondStarted.resolve(); - events.push("end 2"); - return ok(); - }; - - const firstFiber = run(mutex.withLock(firstTask)); - await firstStarted.promise; - - const secondFiber = run(mutex.withLock(secondTask)); - - await Promise.resolve(); - expect(events).toEqual(["start 1"]); - - firstFinish.resolve(); - await firstFiber; - await secondStarted.promise; - await secondFiber; - - expect(events).toEqual(["start 1", "end 1", "start 2", "end 2"]); - - mutex[Symbol.dispose](); - }); - }); - - interface PrefixDep { - readonly prefix: string; - } - - interface TaskTestInstance extends AsyncDisposable { - id: string; - disposed: boolean; - } - - const testCreateTaskInstance = ( - id: string, - onDispose?: () => void | Promise, - ): TaskTestInstance => ({ - id, - disposed: false, - [Symbol.asyncDispose]: async function () { - this.disposed = true; - await Promise.resolve(); - if (onDispose) await onDispose(); - }, - }); - - describe("TaskInstances", () => { - test("ensures instance from task create and reuses it with cache-hit task", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + describe("MutexRef", () => { + interface PrefixDep { + readonly prefix: string; + } - const instance1 = await run.orThrow( - instances.ensure("k", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); + describe("get", () => { + test("returns initial state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(42); - let cacheHitCount = 0; - const instance2 = await run.orThrow( - instances.ensure( - "k", - () => ok(testCreateTaskInstance("should-not-create")), - (instance) => - ({ deps }) => { - cacheHitCount++; - instance.id = `${deps.prefix}-updated`; - return ok(); - }, - ), - ); - - expect(instance1).toBe(instance2); - expect(instance2.id).toBe("dep-updated"); - expect(cacheHitCount).toBe(1); + expect(await run(ref.get)).toEqual(ok(42)); + }); }); - test("ensure returns create error and does not register instance", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); - - const result = await run( - instances.ensure("k", () => err({ type: "MyError" })), - ); + describe("set", () => { + test("updates state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(0); - expect(result).toEqual(err({ type: "MyError" })); - expect(instances.has("k")).toBe(false); - expect(instances.get("k")).toBeNull(); + expect(await run(ref.set(1))).toEqual(ok()); + expect(await run(ref.get)).toEqual(ok(1)); + }); }); - test("ensure returns cache-hit error and keeps existing instance", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); - - const created = await run.orThrow( - instances.ensure("k", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); - - const result = await run( - instances.ensure( - "k", - () => ok(testCreateTaskInstance("should-not-create")), - () => () => err({ type: "MyError" }), - ), - ); + describe("getAndSet", () => { + test("returns previous state and updates state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - expect(result).toEqual(err({ type: "MyError" })); - expect(instances.get("k")).toBe(created); - expect(instances.has("k")).toBe(true); + expect(await run(ref.getAndSet(2))).toEqual(ok(1)); + expect(await run(ref.get)).toEqual(ok(2)); + }); }); - test("get and has reflect registry state", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + describe("setAndGet", () => { + test("returns updated state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - expect(instances.has("missing")).toBe(false); - expect(instances.get("missing")).toBeNull(); - - await run.orThrow( - instances.ensure("k", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); - - expect(instances.has("k")).toBe(true); - const existing = instances.get("k"); - expect(existing?.id).toBe("dep-1"); + expect(await run(ref.setAndGet(2))).toEqual(ok(2)); + expect(await run(ref.get)).toEqual(ok(2)); + }); }); - test("serializes concurrent ensure for same key with mutex", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + describe("update", () => { + test("updates state with a taskful updater", async () => { + await using run = testCreateRun({ prefix: "dep" }); + using ref = createMutexRef("value"); - const canFinishFirstCreate = Promise.withResolvers(); - const events: Array = []; - - const firstEnsure = run( - instances.ensure("k", async ({ deps }) => { - events.push("create-1-start"); - await canFinishFirstCreate.promise; - events.push("create-1-end"); - - return ok(testCreateTaskInstance(`${deps.prefix}-1`)); - }), - ); + expect( + await run( + ref.update( + (current) => + ({ deps }) => + ok(`${deps.prefix}-${current}`), + ), + ), + ).toEqual(ok()); - const secondEnsure = run( - instances.ensure( - "k", - () => { - events.push("create-2"); - return ok(testCreateTaskInstance("should-not-create")); - }, - () => () => { - events.push("cache-hit"); - return ok(); - }, - ), - ); + expect(await run(ref.get)).toEqual(ok("dep-value")); + }); - await Promise.resolve(); - expect(events).toEqual(["create-1-start"]); + test("keeps state unchanged when updater fails", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - canFinishFirstCreate.resolve(); + expect( + await run(ref.update(() => () => err({ type: "MyError" }))), + ).toEqual(err({ type: "MyError" })); - const [firstResult, secondResult] = await Promise.all([ - firstEnsure, - secondEnsure, - ]); + expect(await run(ref.get)).toEqual(ok(1)); + }); - expect(firstResult.ok).toBe(true); - expect(secondResult.ok).toBe(true); - expect(events).toEqual(["create-1-start", "create-1-end", "cache-hit"]); - }); + test("serializes access through the mutex", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - test("delete disposes instance and returns false on repeated delete", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + let releaseUpdate: () => void = () => { + throw new Error("releaseUpdate must be assigned before use"); + }; + const updateStarted = Promise.withResolvers(); - const instance = await run.orThrow( - instances.ensure("k", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); + const updateFiber = run( + ref.update((current) => async () => { + updateStarted.resolve(); + await new Promise((resolve) => { + releaseUpdate = resolve; + }); + return ok(current + 1); + }), + ); - const deleted = await run.orThrow(instances.delete("k")); + await updateStarted.promise; - expect(deleted).toBe(true); - expect(instance.disposed).toBe(true); - expect(instances.has("k")).toBe(false); + let getSettled = false; + const getFiber = run(ref.get).then((result) => { + getSettled = true; + return result; + }); - expect(await run.orThrow(instances.delete("k"))).toBe(false); - }); + await testWaitForMacrotask(); + expect(getSettled).toBe(false); - test("delete returns false when key has never been ensured", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + releaseUpdate(); - expect(await run.orThrow(instances.delete("missing"))).toBe(false); + expect(await updateFiber).toEqual(ok()); + expect(await getFiber).toEqual(ok(2)); + }); }); - test("reuses existing instance without onCacheHit and deletes", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + describe("getAndUpdate", () => { + test("returns previous state and updates state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - const created = await run.orThrow( - instances.ensure("k", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); + expect(await run(ref.getAndUpdate((n) => () => ok(n + 1)))).toEqual( + ok(1), + ); + expect(await run(ref.get)).toEqual(ok(2)); + }); - const reused = await run.orThrow( - instances.ensure("k", () => - ok(testCreateTaskInstance("should-not-create")), - ), - ); + test("returns error and keeps state unchanged", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - expect(reused).toBe(created); + expect( + await run(ref.getAndUpdate(() => () => err({ type: "MyError" }))), + ).toEqual(err({ type: "MyError" })); - expect(await run.orThrow(instances.delete("k"))).toBe(true); - expect(created.disposed).toBe(true); + expect(await run(ref.get)).toEqual(ok(1)); + }); }); - test("Symbol.asyncDispose disposes all instances", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + describe("updateAndGet", () => { + test("returns updated state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - const instance1 = await run.orThrow( - instances.ensure("k1", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-1`)), - ), - ); + expect(await run(ref.updateAndGet((n) => () => ok(n + 1)))).toEqual( + ok(2), + ); + expect(await run(ref.get)).toEqual(ok(2)); + }); - const instance2 = await run.orThrow( - instances.ensure("k2", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-2`)), - ), - ); + test("returns error and keeps state unchanged", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - await instances[Symbol.asyncDispose](); + expect( + await run(ref.updateAndGet(() => () => err({ type: "MyError" }))), + ).toEqual(err({ type: "MyError" })); - expect(instance1.disposed).toBe(true); - expect(instance2.disposed).toBe(true); - expect(instances.has("k1")).toBe(false); - expect(instances.has("k2")).toBe(false); + expect(await run(ref.get)).toEqual(ok(1)); + }); }); - test("Symbol.asyncDispose disposes instances in LIFO order", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); - - const events: Array = []; + describe("modify", () => { + test("returns a computed result and updates state", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - await run.orThrow( - instances.ensure("k1", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-1`, () => { - events.push("dispose 1"); - }), - ), - ), - ); - - await run.orThrow( - instances.ensure("k2", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-2`, () => { - events.push("dispose 2"); - }), - ), - ), - ); - - await run.orThrow( - instances.ensure("k3", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-3`, () => { - events.push("dispose 3"); - }), + expect( + await run( + ref.modify( + (current) => () => ok([`current:${current}`, current + 1]), + ), ), - ), - ); + ).toEqual(ok("current:1")); - await instances[Symbol.asyncDispose](); + expect(await run(ref.get)).toEqual(ok(2)); + }); - expect(events).toEqual(["dispose 3", "dispose 2", "dispose 1"]); - }); + test("returns error and keeps state unchanged", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - test("Symbol.asyncDispose throws single error when one disposal fails", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); + expect( + await run(ref.modify(() => () => err({ type: "MyError" }))), + ).toEqual(err({ type: "MyError" })); - await run.orThrow( - instances.ensure("k1", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-1`, () => { - throw new Error("single async dispose error"); - }), - ), - ), - ); + expect(await run(ref.get)).toEqual(ok(1)); + }); - await run.orThrow( - instances.ensure("k2", ({ deps }) => - ok(testCreateTaskInstance(`${deps.prefix}-2`)), - ), - ); + test("infers updater error and deps types", () => { + const ref = createMutexRef(1); + const modifyTask = ref.modify( + (current): Task => + (run) => + ok([run.deps.prefix, current] as const), + ); + const updateTask = ref.update( + (): Task => () => err({ type: "MyError" }), + ); - await expect(instances[Symbol.asyncDispose]()).rejects.toThrow( - "single async dispose error", - ); + expectTypeOf(modifyTask).toEqualTypeOf< + Task + >(); + expectTypeOf(updateTask).toEqualTypeOf>(); + }); }); - test("Symbol.asyncDispose throws SuppressedError when multiple disposals fail", async () => { - await using run = testCreateRun({ prefix: "dep" }); - const instances = createTaskInstances< - string, - TaskTestInstance, - PrefixDep - >(); - - await run.orThrow( - instances.ensure("k1", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-1`, () => { - throw new Error("error 1"); - }), - ), - ), - ); - - await run.orThrow( - instances.ensure("k2", ({ deps }) => - ok( - testCreateTaskInstance(`${deps.prefix}-2`, () => { - throw new Error("error 2"); - }), - ), - ), - ); - - const SuppressedErrorCtor = ( - globalThis as { - readonly SuppressedError?: new ( - error: unknown, - suppressed: unknown, - message?: string, - ) => Error; - } - ).SuppressedError; - expect(SuppressedErrorCtor).toBeDefined(); - if (SuppressedErrorCtor == null) return; + describe("dispose", () => { + test("aborts operations with semaphoreDisposedError", async () => { + await using run = testCreateRun(); + using ref = createMutexRef(1); - try { - await instances[Symbol.asyncDispose](); - expect.fail("Should have thrown"); - } catch (error) { - expect(error).toBeInstanceOf(SuppressedErrorCtor); - - const suppressedError = error as { - readonly error: unknown; - readonly suppressed: unknown; - }; + ref[Symbol.dispose](); - expect(suppressedError.error).toBeInstanceOf(Error); - expect(suppressedError.suppressed).toBeInstanceOf(Error); - expect((suppressedError.error as Error).message).toBe("error 1"); - expect((suppressedError.suppressed as Error).message).toBe("error 2"); - } + expect(await run(ref.get)).toEqual( + err({ type: "AbortError", reason: semaphoreDisposedError }), + ); + }); }); }); - describe("createInMemoryLeaderLock", () => { + describe("InMemoryLeaderLock", () => { test("acquire waits until previous lease is disposed", async () => { await using run = createRun(); const leaderLock = createInMemoryLeaderLock(); @@ -6447,7 +6417,7 @@ describe("all", () => { return err({ type: "MyError" }); }; - const fiber = run(parallel(all([slowTask, failingTask]))); + const fiber = run(concurrently(all([slowTask, failingTask]))); expect(events).toEqual(["slow start", "fail start"]); @@ -6478,9 +6448,9 @@ describe("all", () => { throw new Error("boom"); }; - await expect(run(parallel(all([slowTask, throwingTask])))).rejects.toThrow( - "boom", - ); + await expect( + run(concurrently(all([slowTask, throwingTask]))), + ).rejects.toThrow("boom"); const slowAbortReason = await slowObservedAbort.promise; assert(AbortError.is(slowAbortReason)); @@ -6505,7 +6475,7 @@ describe("all", () => { err({ type: "AbortError", reason: abortCause }); const fiber = run( - parallel(3, all([waitForAbort, abortingTask, waitForAbort])), + concurrently(3, all([waitForAbort, abortingTask, waitForAbort])), ); const result = await fiber; @@ -6530,7 +6500,7 @@ describe("all", () => { }; const fiber = run( - parallel( + concurrently( 2, all([createTask(1), createTask(2), createTask(3), createTask(4)]), ), @@ -6598,7 +6568,7 @@ describe("all", () => { return err({ type: "MyError" }); }; - const fiber = run(parallel(all({ good: goodTask, bad: badTask }))); + const fiber = run(concurrently(all({ good: goodTask, bad: badTask }))); expect(events).toEqual(["good start", "bad start"]); @@ -6616,7 +6586,7 @@ describe("all", () => { expect(result).toEqual(ok({})); }); - test("struct respects parallel", async () => { + test("struct respects configured concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -6632,7 +6602,7 @@ describe("all", () => { }; const fiber = run( - parallel( + concurrently( minPositiveInt, all({ a: createTask("a"), b: createTask("b"), c: createTask("c") }), ), @@ -6927,7 +6897,7 @@ describe("allSettled", () => { } }); - test("struct respects parallel", async () => { + test("struct respects configured concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -6943,7 +6913,7 @@ describe("allSettled", () => { }; const fiber = run( - parallel( + concurrently( minPositiveInt, allSettled({ a: createTask("a"), @@ -6968,7 +6938,7 @@ describe("allSettled", () => { ); }); - test("respects parallel", async () => { + test("respects configured concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -6984,7 +6954,10 @@ describe("allSettled", () => { }; const fiber = run( - parallel(2, allSettled([createTask(1), createTask(2), createTask(3)])), + concurrently( + 2, + allSettled([createTask(1), createTask(2), createTask(3)]), + ), ); // Only 2 tasks should start @@ -7036,7 +7009,7 @@ describe("allSettled", () => { }; await expect( - run(parallel(allSettled([slowTask, throwingTask]))), + run(concurrently(allSettled([slowTask, throwingTask]))), ).rejects.toThrow("boom"); const slowAbortReason = await slowObservedAbort.promise; @@ -7158,7 +7131,7 @@ describe("map", () => { ]); }); - test("respects parallel", async () => { + test("respects configured concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -7172,7 +7145,7 @@ describe("map", () => { return ok(id); }; - await run(parallel(2, map([1, 2, 3], trackingTask))); + await run(concurrently(2, map([1, 2, 3], trackingTask))); // With concurrency 2, tasks 1 and 2 start together expect(events[0]).toBe("start 1"); @@ -7213,7 +7186,9 @@ describe("map", () => { n === 2 ? err({ type: "MyError" }) : ok(n); const result = await run( - parallel(map([1, 2], (n) => (n === 1 ? slowTask(n) : failingTask(n)))), + concurrently( + map([1, 2], (n) => (n === 1 ? slowTask(n) : failingTask(n))), + ), ); expect(result).toEqual(err({ type: "MyError" })); @@ -7365,7 +7340,7 @@ describe("mapSettled", () => { ]); }); - test("respects parallel", async () => { + test("respects configured concurrency", async () => { await using run = createRun(); const events: Array = []; @@ -7379,7 +7354,7 @@ describe("mapSettled", () => { return ok(id); }; - await run(parallel(2, mapSettled([1, 2, 3], trackingTask))); + await run(concurrently(2, mapSettled([1, 2, 3], trackingTask))); // With concurrency 2, tasks 1 and 2 start together expect(events[0]).toBe("start 1"); @@ -7464,7 +7439,7 @@ describe("any", () => { return ok("fast"); }; - const fiber = run(parallel(any([slow, fast]))); + const fiber = run(concurrently(any([slow, fast]))); await Promise.resolve(); canFinish.resolve(); @@ -7509,7 +7484,7 @@ describe("any", () => { }; const result = await run( - parallel( + concurrently( any([createFailingTask(1), createFailingTask(2), createFailingTask(3)]), ), ); @@ -7538,7 +7513,7 @@ describe("any", () => { const fast: Task = () => err({ type: "MyError", id: "fast" }); - const fiber = run(parallel(any([slow, fast]))); + const fiber = run(concurrently(any([slow, fast]))); await Promise.resolve(); canFinish.resolve(); @@ -7564,7 +7539,9 @@ describe("any", () => { const fast: Task = () => err({ type: "MyError", id: "fast" }); - const fiber = run(parallel(any([slow, fast], { allFailed: "completion" }))); + const fiber = run( + concurrently(any([slow, fast], { allFailed: "completion" })), + ); await Promise.resolve(); canFinish.resolve(); @@ -7589,7 +7566,7 @@ describe("any", () => { const fast: Task = () => ok("fast"); - const result = await run(parallel(any([slow, fast]))); + const result = await run(concurrently(any([slow, fast]))); expect(result).toEqual(ok("fast")); const cause = await slowAbortReason.promise; @@ -7748,7 +7725,7 @@ describe("examples TODO", () => { ]; // At most 2 concurrent requests - const _result = await run(parallel(2, map(urls, fetchWithRetry))); + const _result = await run(concurrently(2, map(urls, fetchWithRetry))); }); test("all with NonEmptyReadonlyArray returns NonEmptyReadonlyArray", () => { @@ -7869,7 +7846,7 @@ describe("examples TODO", () => { expect(result).toEqual(err({ type: "AbortError", reason: "stop" })); const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); expect(state.outcome).toEqual(ok("data")); }); @@ -7882,7 +7859,7 @@ describe("examples TODO", () => { expect(result).toEqual(ok("data")); const state = fiber.getState(); - assert(state.type === "Completed"); + assert(state.type === "Settled"); expect(state.outcome).toEqual(ok("data")); }); }); From 24ef20cce600d640a6c8a567526b1168dbb3a322 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:46:10 +0100 Subject: [PATCH 09/24] sync(common-v8): port d30c2ac Use per-name mutex and map for SharedEvolu Source upstream commit: d30c2ac03b236ee841b41fdbcc0503e8c84e71e4 Port scope: adapted. --- packages/common/src/local-first/Shared.ts | 197 +++++++++++----------- 1 file changed, 102 insertions(+), 95 deletions(-) diff --git a/packages/common/src/local-first/Shared.ts b/packages/common/src/local-first/Shared.ts index 5e2864013..0fb5ece89 100644 --- a/packages/common/src/local-first/Shared.ts +++ b/packages/common/src/local-first/Shared.ts @@ -13,12 +13,13 @@ import { } from "../Array.js"; import { assert } from "../Assert.js"; import { createCallbacks } from "../Callbacks.js"; -import type { Console, ConsoleEntry, ConsoleLevel } from "../Console.js"; +import type { ConsoleEntry, ConsoleLevel } from "../Console.js"; +import { exhaustiveCheck } from "../Function.js"; import { createResources, type Resources } from "../Resources.js"; import { ok } from "../Result.js"; import { spaced } from "../Schedule.js"; import type { NonEmptyReadonlySet } from "../Set.js"; -import { createTaskInstances, repeat, type Fiber, type Task } from "../Task.js"; +import { createMutexByKey, repeat, type Fiber, type Task } from "../Task.js"; import { createId, type Id, type Name } from "../Type.js"; import type { Callback, ExtractType } from "../Types.js"; import type { CreateWebSocketDep, WebSocket } from "../WebSocket.js"; @@ -154,15 +155,8 @@ export const initSharedWorker = ); const runWithSharedEvoluDeps = run.addDeps({ transports }); - - // TODO: Use heartbeat to detect and prune dead instances. - const sharedEvolus = stack.use( - createTaskInstances< - Name, - SharedEvolu, - SharedWorkerDeps & TransportsDep - >(), - ); + const sharedEvolusByName = new Map(); + const sharedEvolusMutexByName = stack.use(createMutexByKey()); self.onConnect = (port) => { console.debug("onConnect"); @@ -184,27 +178,36 @@ export const initSharedWorker = } case "CreateEvolu": { - void runWithSharedEvoluDeps - .daemon( - sharedEvolus.ensure( - message.name, - createSharedEvolu({ - console, - name: message.name, - appOwner: message.appOwner, - postTabOutput, - onDispose: () => { - void runWithSharedEvoluDeps.daemon( - sharedEvolus.delete(message.name), - ); - }, - }), - ), - ) - .then((result) => { - if (!result.ok) return; - result.value.addPorts(message.evoluPort, message.dbWorkerPort); - }); + void runWithSharedEvoluDeps.daemon( + sharedEvolusMutexByName.withLock(message.name, async () => { + let sharedEvolu = sharedEvolusByName.get(message.name); + + if (sharedEvolu == null) { + const result = await runWithSharedEvoluDeps.daemon( + createSharedEvolu({ + name: message.name, + appOwner: message.appOwner, + postTabOutput, + onDispose: () => { + void runWithSharedEvoluDeps.daemon( + sharedEvolusMutexByName.withLock(message.name, () => { + sharedEvolusByName.delete(message.name); + return ok(); + }), + ); + }, + }), + ); + if (!result.ok) return result; + + sharedEvolu = result.value; + sharedEvolusByName.set(message.name, sharedEvolu); + } + + sharedEvolu.addPorts(message.evoluPort, message.dbWorkerPort); + return ok(); + }), + ); break; } default: @@ -292,19 +295,18 @@ export type SyncState = 123; const createSharedEvolu = ({ - console, name, appOwner, postTabOutput, onDispose, }: { - console: Console; name: Name; appOwner: SyncOwner; postTabOutput: Callback; onDispose: () => void; }): Task => async (run) => { + const console = run.deps.console.child(name).child("SharedWorker"); const { createMessagePort, transports } = run.deps; const evoluPorts = new Map>(); @@ -416,74 +418,79 @@ const createSharedEvolu = return patchesByQuery; }; - return ok({ - addPorts: (nativeEvoluPort, nativeDbWorkerPort) => { - const evoluPort = createMessagePort( - nativeEvoluPort, - ); - const dbWorkerPort = createMessagePort( - nativeDbWorkerPort, - ); + const addPorts = ( + nativeEvoluPort: NativeMessagePort, + nativeDbWorkerPort: NativeMessagePort, + ): void => { + const evoluPort = createMessagePort( + nativeEvoluPort, + ); + const dbWorkerPort = createMessagePort( + nativeDbWorkerPort, + ); - const evoluPortId = createId(run.deps); + const evoluPortId = createId(run.deps); - evoluPorts.set(evoluPortId, evoluPort); - dbWorkerPorts.add(dbWorkerPort); + evoluPorts.set(evoluPortId, evoluPort); + dbWorkerPorts.add(dbWorkerPort); - dbWorkerPort.onMessage = (message) => { - switch (message.type) { - case "LeaderAcquired": { - activeDbWorkerPort = dbWorkerPort; - console.info("leaderAcquired"); - ensureQueueProcessing(); - break; - } - case "OnQueuedResponse": { - callbacks.execute(message.callbackId, { - evoluPortId: message.evoluPortId, - response: message.response, - }); - break; - } - case "OnConsoleEntry": - case "OnError": { - postTabOutput(message); - break; - } - default: - console.error("Unknown db worker output", message); + dbWorkerPort.onMessage = (message) => { + switch (message.type) { + case "LeaderAcquired": { + activeDbWorkerPort = dbWorkerPort; + console.info("leaderAcquired"); + ensureQueueProcessing(); + break; } - }; - - evoluPort.onMessage = (evoluMessage) => { - switch (evoluMessage.type) { - case "Dispose": { - console.info("evoluDispose", { - name, - evoluPortId, - hadLastPort: evoluPorts.size === 1, - }); - evoluPorts.delete(evoluPortId); - rowsByQueryByEvoluPortId.delete(evoluPortId); - if (evoluPorts.size === 0) onDispose(); + case "OnQueuedResponse": { + callbacks.execute(message.callbackId, { + evoluPortId: message.evoluPortId, + response: message.response, + }); + break; + } + case "OnConsoleEntry": + case "OnError": { + postTabOutput(message); + break; + } + default: + exhaustiveCheck(message); + } + }; - // TODO: Decided what to do with DbWorker but probably dispose it, but - // https://bugs.webkit.org/show_bug.cgi?id=301520 - break; - } + evoluPort.onMessage = (evoluMessage) => { + switch (evoluMessage.type) { + case "Dispose": { + console.info("evoluDispose", { + name, + evoluPortId, + hadLastPort: evoluPorts.size === 1, + }); + evoluPorts.delete(evoluPortId); + rowsByQueryByEvoluPortId.delete(evoluPortId); + if (evoluPorts.size === 0) onDispose(); + + // TODO: Decided what to do with DbWorker but probably dispose it, but + // https://bugs.webkit.org/show_bug.cgi?id=301520 + break; + } - case "Mutate": - case "Query": - case "Export": { - queue.push({ evoluPortId, request: evoluMessage }); - ensureQueueProcessing(); - break; - } - default: - console.error("Unknown evolu input", evoluMessage); + case "Mutate": + case "Query": + case "Export": { + queue.push({ evoluPortId, request: evoluMessage }); + ensureQueueProcessing(); + break; } - }; - }, + default: + exhaustiveCheck(evoluMessage); + } + }; + }; + + return ok({ + addPorts, [Symbol.asyncDispose]: async () => { await run(transports.removeConsumer(appOwner, ownerTransports)); From d6320ca275ed3ac04f356a2e6f6bb5f10386eaeb Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:24 +0100 Subject: [PATCH 10/24] sync(common-v8): port cd6b74d Rename Evolu Kysely helpers Source upstream commit: cd6b74d2361c6ca34b1c6634e5430f8029d8fe5b Port scope: selective (ported Query/Kysely API rename into existing fork structure and examples; skipped missing .changeset and apps/web docs/playgrounds paths). --- .../components/EvoluMinimalExample.tsx | 2 +- examples/react-expo/app/index.tsx | 2 +- .../components/EvoluMinimalExample.tsx | 2 +- .../src/components/EvoluMinimalExample.tsx | 2 +- packages/common/src/index.ts | 11 +- packages/common/src/local-first/Kysely.ts | 244 ------------------ packages/common/src/local-first/Query.ts | 205 ++++++++++++++- packages/common/src/local-first/Schema.ts | 10 +- .../common/test/local-first/Query.test.ts | 205 ++++++++++++++- 9 files changed, 426 insertions(+), 257 deletions(-) delete mode 100644 packages/common/src/local-first/Kysely.ts diff --git a/examples/react-electron/components/EvoluMinimalExample.tsx b/examples/react-electron/components/EvoluMinimalExample.tsx index 4845ea3a4..53e2ff495 100644 --- a/examples/react-electron/components/EvoluMinimalExample.tsx +++ b/examples/react-electron/components/EvoluMinimalExample.tsx @@ -88,7 +88,7 @@ const todosQuery = createQuery((db) => // (even if defined without nullOr in the schema) to allow schema // evolution without migrations. Filter nulls with where + $narrowType. .where("title", "is not", null) - .$narrowType<{ title: Evolu.kysely.NotNull }>() + .$narrowType<{ title: Evolu.KyselyNotNull }>() // Columns createdAt, updatedAt, isDeleted are auto-added to all tables. .orderBy("createdAt"), ); diff --git a/examples/react-expo/app/index.tsx b/examples/react-expo/app/index.tsx index 18b0df930..4118971bd 100644 --- a/examples/react-expo/app/index.tsx +++ b/examples/react-expo/app/index.tsx @@ -54,7 +54,7 @@ const todosQuery = createQuery((db) => // (even if defined without nullOr in the schema) to allow schema // evolution without migrations. Filter nulls with where + $narrowType. .where("title", "is not", null) - .$narrowType<{ title: Evolu.kysely.NotNull }>() + .$narrowType<{ title: Evolu.KyselyNotNull }>() // Columns createdAt, updatedAt, isDeleted are auto-added to all tables. .orderBy("createdAt"), ); diff --git a/examples/react-nextjs/components/EvoluMinimalExample.tsx b/examples/react-nextjs/components/EvoluMinimalExample.tsx index a64a93564..1898c17d1 100644 --- a/examples/react-nextjs/components/EvoluMinimalExample.tsx +++ b/examples/react-nextjs/components/EvoluMinimalExample.tsx @@ -90,7 +90,7 @@ const todosQuery = createQuery((db) => // (even if defined without nullOr in the schema) to allow schema // evolution without migrations. Filter nulls with where + $narrowType. .where("title", "is not", null) - .$narrowType<{ title: Evolu.kysely.NotNull }>() + .$narrowType<{ title: Evolu.KyselyNotNull }>() // Columns createdAt, updatedAt, isDeleted are auto-added to all tables. .orderBy("createdAt"), ); diff --git a/examples/react-vite-pwa/src/components/EvoluMinimalExample.tsx b/examples/react-vite-pwa/src/components/EvoluMinimalExample.tsx index 64673da28..0d03202a4 100644 --- a/examples/react-vite-pwa/src/components/EvoluMinimalExample.tsx +++ b/examples/react-vite-pwa/src/components/EvoluMinimalExample.tsx @@ -100,7 +100,7 @@ const todosQuery = createQuery((db) => // (even if defined without nullOr in the schema) to allow schema // evolution without migrations. Filter nulls with where + $narrowType. .where("title", "is not", null) - .$narrowType<{ title: Evolu.kysely.NotNull }>() + .$narrowType<{ title: Evolu.KyselyNotNull }>() // Columns createdAt, updatedAt, isDeleted are auto-added to all tables. .orderBy("createdAt"), ); diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index de9f7e17f..ba36fce82 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -20,6 +20,7 @@ export * from "./Identicon.js"; export * from "./Listeners.js"; // Local-first essentials. export type { EvoluError } from "./local-first/Error.js"; +export { AppName, createEvolu } from "./local-first/Evolu.js"; export type { AppNameError, Evolu, @@ -27,16 +28,22 @@ export type { EvoluDeps, UnuseOwner, } from "./local-first/Evolu.js"; -export { AppName, createEvolu } from "./local-first/Evolu.js"; -export * as kysely from "./local-first/Kysely.js"; export * from "./local-first/LocalAuth.js"; export * from "./local-first/Owner.js"; export type { InferRow, + KyselyNotNull, Query, QueryRows, Row, } from "./local-first/Query.js"; +export { + evoluJsonArrayFrom, + evoluJsonBuildObject, + evoluJsonObjectFrom, + getJsonObjectArgs, + kyselySql, +} from "./local-first/Query.js"; export type { AnyStandardSchemaV1, EvoluSchema, diff --git a/packages/common/src/local-first/Kysely.ts b/packages/common/src/local-first/Kysely.ts deleted file mode 100644 index f6be22cee..000000000 --- a/packages/common/src/local-first/Kysely.ts +++ /dev/null @@ -1,244 +0,0 @@ -/** - * Kysely query builder extensions for Evolu. - * - * @module - */ - -import type { - AliasableExpression, - Expression, - RawBuilder, - SelectQueryNode, - Simplify, -} from "kysely"; -import { - AliasNode, - ColumnNode, - ExpressionWrapper, - IdentifierNode, - ReferenceNode, - sql, - TableNode, - ValueNode, -} from "kysely"; -import { kyselyJsonIdentifier } from "./Query.js"; - -export type { NotNull } from "kysely"; -export { sql } from "kysely"; - -/** - * A SQLite helper for aggregating a subquery into a JSON array. - * - * ### Example - * - * ```ts - * import { kysely } from "@evolu/common"; - * - * // TODO: Update for Evolu - * const result = await db - * .selectFrom("person") - * .select((eb) => [ - * "id", - * kysely - * .jsonArrayFrom( - * eb - * .selectFrom("pet") - * .select(["pet.id as pet_id", "pet.name"]) - * .whereRef("pet.owner_id", "=", "person.id") - * .orderBy("pet.name"), - * ) - * .as("pets"), - * ]) - * .execute(); - * - * result[0]?.id; - * result[0]?.pets[0].pet_id; - * result[0]?.pets[0].name; - * ``` - * - * The generated SQL (SQLite): - * - * ```sql - * select "id", ( - * select coalesce(json_group_array(json_object( - * 'pet_id', "agg"."pet_id", - * 'name', "agg"."name" - * )), '[]') from ( - * select "pet"."id" as "pet_id", "pet"."name" - * from "pet" - * where "pet"."owner_id" = "person"."id" - * order by "pet"."name" - * ) as "agg" - * ) as "pets" - * from "person" - * ``` - */ -// Kysely expects strict AST. -export function jsonArrayFrom( - expr: SelectQueryBuilderExpression, -): RawBuilder>> { - return sql`(select ${sql.lit(kyselyJsonIdentifier)} || coalesce(json_group_array(json_object(${sql.join( - getSqliteJsonObjectArgs(expr.toOperationNode(), "agg"), - )})), '[]') from ${expr} as agg)`; -} - -/** - * A SQLite helper for turning a subquery into a JSON object. - * - * The subquery must only return one row. - * - * ### Example - * - * ```ts - * import { kysely } from "@evolu/common"; - * - * // TODO: Update for Evolu - * const result = await db - * .selectFrom("person") - * .select((eb) => [ - * "id", - * jsonObjectFrom( - * eb - * .selectFrom("pet") - * .select(["pet.id as pet_id", "pet.name"]) - * .whereRef("pet.owner_id", "=", "person.id") - * .where("pet.is_favorite", "=", true), - * ).as("favorite_pet"), - * ]) - * .execute(); - * - * result[0]?.id; - * result[0]?.favorite_pet?.pet_id; - * result[0]?.favorite_pet?.name; - * ``` - * - * The generated SQL (SQLite): - * - * ```sql - * select "id", ( - * select json_object( - * 'pet_id', "obj"."pet_id", - * 'name', "obj"."name" - * ) from ( - * select "pet"."id" as "pet_id", "pet"."name" - * from "pet" - * where "pet"."owner_id" = "person"."id" - * and "pet"."is_favorite" = ? - * ) as obj - * ) as "favorite_pet" - * from "person"; - * ``` - */ -// Kysely expects strict AST. -export function jsonObjectFrom( - expr: SelectQueryBuilderExpression, -): RawBuilder | null> { - return sql`(select ${sql.lit(kyselyJsonIdentifier)} || json_object(${sql.join( - getSqliteJsonObjectArgs(expr.toOperationNode(), "obj"), - )}) from ${expr} as obj)`; -} - -/** - * The SQLite `json_object` function. - * - * ### Example - * - * ```ts - * import { kysely } from "@evolu/common"; - * - * // TODO: Update for Evolu - * const result = await db - * .selectFrom("person") - * .select((eb) => [ - * "id", - * kysely - * .jsonBuildObject({ - * first: eb.ref("first_name"), - * last: eb.ref("last_name"), - * full: kysely.sql`first_name || ' ' || last_name`, - * }) - * .as("name"), - * ]) - * .execute(); - * - * result[0]?.id; - * result[0]?.name.first; - * result[0]?.name.last; - * result[0]?.name.full; - * ``` - * - * The generated SQL (SQLite): - * - * ```sql - * select "id", json_object( - * 'first', first_name, - * 'last', last_name, - * 'full', "first_name" || ' ' || "last_name" - * ) as "name" - * from "person" - * ``` - */ -// Kysely expects strict AST. -export function jsonBuildObject>>( - obj: O, -): RawBuilder< - Simplify<{ - [K in keyof O]: O[K] extends Expression ? V : never; - }> -> { - return sql`${sql.lit(kyselyJsonIdentifier)} || json_object(${sql.join( - Object.keys(obj).flatMap((k) => [sql.lit(k), obj[k]]), - )})`; -} - -interface SelectQueryBuilderExpression extends AliasableExpression { - get isSelectQueryBuilder(): true; - toOperationNode(): SelectQueryNode; -} - -function getSqliteJsonObjectArgs( - node: SelectQueryNode, - table: string, -): Array | string> { - try { - return getJsonObjectArgs(node, table); - } catch { - throw new Error( - "SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.", - ); - } -} - -export function getJsonObjectArgs( - node: SelectQueryNode, - table: string, -): Array | string> { - const args: Array | string> = []; - - for (const { selection: s } of node.selections ?? []) { - if (ReferenceNode.is(s) && ColumnNode.is(s.column)) { - args.push( - colName(s.column.column.name), - colRef(table, s.column.column.name), - ); - } else if (ColumnNode.is(s)) { - args.push(colName(s.column.name), colRef(table, s.column.name)); - } else if (AliasNode.is(s) && IdentifierNode.is(s.alias)) { - args.push(colName(s.alias.name), colRef(table, s.alias.name)); - } else { - throw new Error(`can't extract column names from the select query node`); - } - } - - return args; -} - -function colName(col: string): Expression { - return new ExpressionWrapper(ValueNode.createImmediate(col)); -} - -function colRef(table: string, col: string): Expression { - return new ExpressionWrapper( - ReferenceNode.create(ColumnNode.create(col), TableNode.create(table)), - ); -} diff --git a/packages/common/src/local-first/Query.ts b/packages/common/src/local-first/Query.ts index f13a82c44..2d566a346 100644 --- a/packages/common/src/local-first/Query.ts +++ b/packages/common/src/local-first/Query.ts @@ -1,9 +1,26 @@ /** - * Query execution and caching. + * Query helpers, execution, and caching. * * @module */ +import type { + AliasableExpression, + Expression, + RawBuilder, + SelectQueryNode, + Simplify as KyselySimplify, +} from "kysely"; +import { + AliasNode, + ColumnNode, + ExpressionWrapper, + IdentifierNode, + ReferenceNode, + sql as kyselySqlBuilder, + TableNode, + ValueNode, +} from "kysely"; import type { Brand } from "../Brand.js"; import { bytesToHex, hexToBytes } from "../Buffer.js"; import { createRandomBytes } from "../Crypto.js"; @@ -14,6 +31,9 @@ import { eqSqliteValue, type SqliteValue, sql } from "../Sqlite.js"; import { createId, String } from "../Type.js"; import type { Simplify } from "../Types.js"; +export { sql as kyselySql } from "kysely"; +export type { NotNull as KyselyNotNull } from "kysely"; + /** * A type-safe SQL query. * @@ -103,10 +123,161 @@ export type InferRow = T extends Query ? R : never; export interface Row { readonly [key: string]: | SqliteValue - | Row // for jsonObjectFrom from kysely/helpers/sqlite - | ReadonlyArray; // for jsonArrayFrom from kysely/helpers/sqlite + | Row // for evoluJsonObjectFrom + | ReadonlyArray; // for evoluJsonArrayFrom } +/** + * An improved Evolu version of Kysely's SQLite `jsonArrayFrom` helper. + * + * Kysely's `ParseJSONResultsPlugin` heuristically parses any result string that + * looks like JSON. Evolu instead prefixes JSON produced by these helpers with a + * per-runtime identifier and only parses values carrying that prefix, avoiding + * accidental parsing of ordinary string columns that merely happen to start + * with `{` or `[`. + * + * ### Example + * + * ```ts + * import { evoluJsonArrayFrom } from "@evolu/common"; + * + * const result = await db + * .selectFrom("person") + * .select((eb) => [ + * "id", + * evoluJsonArrayFrom( + * eb + * .selectFrom("pet") + * .select(["pet.id as pet_id", "pet.name"]) + * .whereRef("pet.owner_id", "=", "person.id") + * .orderBy("pet.name"), + * ).as("pets"), + * ]) + * .execute(); + * + * result[0]?.id; + * result[0]?.pets[0].pet_id; + * result[0]?.pets[0].name; + * ``` + */ +export const evoluJsonArrayFrom = ( + expr: SelectQueryBuilderExpression, +): RawBuilder>> => + kyselySqlBuilder`(select ${kyselySqlBuilder.lit(kyselyJsonIdentifier)} || coalesce(json_group_array(json_object(${kyselySqlBuilder.join( + getSqliteJsonObjectArgs(expr.toOperationNode(), "agg"), + )})), '[]') from ${expr} as agg)`; + +/** + * An improved Evolu version of Kysely's SQLite `jsonObjectFrom` helper. + * + * Kysely's `ParseJSONResultsPlugin` heuristically parses any result string that + * looks like JSON. Evolu instead prefixes JSON produced by these helpers with a + * per-runtime identifier and only parses values carrying that prefix, avoiding + * accidental parsing of ordinary string columns that merely happen to start + * with `{` or `[`. + * + * The subquery must only return one row. + * + * ### Example + * + * ```ts + * import { evoluJsonObjectFrom } from "@evolu/common"; + * + * const result = await db + * .selectFrom("person") + * .select((eb) => [ + * "id", + * evoluJsonObjectFrom( + * eb + * .selectFrom("pet") + * .select(["pet.id as pet_id", "pet.name"]) + * .whereRef("pet.owner_id", "=", "person.id") + * .where("pet.is_favorite", "=", true), + * ).as("favorite_pet"), + * ]) + * .execute(); + * + * result[0]?.id; + * result[0]?.favorite_pet?.pet_id; + * result[0]?.favorite_pet?.name; + * ``` + */ +export const evoluJsonObjectFrom = ( + expr: SelectQueryBuilderExpression, +): RawBuilder | null> => + kyselySqlBuilder`(select ${kyselySqlBuilder.lit(kyselyJsonIdentifier)} || json_object(${kyselySqlBuilder.join( + getSqliteJsonObjectArgs(expr.toOperationNode(), "obj"), + )}) from ${expr} as obj)`; + +/** + * An improved Evolu version of Kysely's SQLite `jsonBuildObject` helper. + * + * Kysely's `ParseJSONResultsPlugin` heuristically parses any result string that + * looks like JSON. Evolu instead prefixes JSON produced by these helpers with a + * per-runtime identifier and only parses values carrying that prefix, avoiding + * accidental parsing of ordinary string columns that merely happen to start + * with `{` or `[`. + * + * ### Example + * + * ```ts + * import { evoluJsonBuildObject, kyselySql } from "@evolu/common"; + * + * const result = await db + * .selectFrom("person") + * .select((eb) => [ + * "id", + * evoluJsonBuildObject({ + * first: eb.ref("first_name"), + * last: eb.ref("last_name"), + * full: kyselySql`first_name || ' ' || last_name`, + * }).as("name"), + * ]) + * .execute(); + * + * result[0]?.id; + * result[0]?.name.first; + * result[0]?.name.last; + * result[0]?.name.full; + * ``` + */ +export const evoluJsonBuildObject = < + O extends Record>, +>( + obj: O, +): RawBuilder< + KyselySimplify<{ + [K in keyof O]: O[K] extends Expression ? V : never; + }> +> => + kyselySqlBuilder`${kyselySqlBuilder.lit(kyselyJsonIdentifier)} || json_object(${kyselySqlBuilder.join( + Object.keys(obj).flatMap((k) => [kyselySqlBuilder.lit(k), obj[k]]), + )})`; + +export const getJsonObjectArgs = ( + node: SelectQueryNode, + table: string, +): Array | string> => { + const args: Array | string> = []; + + for (const { selection: s } of node.selections ?? []) { + if (ReferenceNode.is(s) && ColumnNode.is(s.column)) { + args.push( + colName(s.column.column.name), + colRef(table, s.column.column.name), + ); + } else if (ColumnNode.is(s)) { + args.push(colName(s.column.name), colRef(table, s.column.name)); + } else if (AliasNode.is(s) && IdentifierNode.is(s.alias)) { + args.push(colName(s.alias.name), colRef(table, s.alias.name)); + } else { + throw new Error(`can't extract column names from the select query node`); + } + } + + return args; +}; + /** Rows returned by a query. */ export type QueryRows = ReadonlyArray< Readonly> @@ -218,6 +389,24 @@ export const kyselyJsonIdentifier = /*#__PURE__*/ createId({ randomBytes: /*#__PURE__*/ createRandomBytes(), }); +interface SelectQueryBuilderExpression extends AliasableExpression { + get isSelectQueryBuilder(): true; + toOperationNode(): SelectQueryNode; +} + +const getSqliteJsonObjectArgs = ( + node: SelectQueryNode, + table: string, +): Array | string> => { + try { + return getJsonObjectArgs(node, table); + } catch { + throw new Error( + "SQLite evoluJsonArrayFrom and evoluJsonObjectFrom can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.", + ); + } +}; + export const parseSqliteJsonArray = ( arr: ReadonlyArray, ): ReadonlyArray => { @@ -230,7 +419,7 @@ export const parseSqliteJsonArray = ( const parse = (obj: unknown): unknown => { if (String.is(obj) && obj.startsWith(kyselyJsonIdentifier)) { - return JSON.parse(obj.slice(kyselyJsonIdentifier.length)); + return parse(JSON.parse(obj.slice(kyselyJsonIdentifier.length))); } if (Array.isArray(obj)) { @@ -253,3 +442,11 @@ const parseObject = ( } return result as ReadonlyRecord; }; + +const colName = (col: string): Expression => + new ExpressionWrapper(ValueNode.createImmediate(col)); + +const colRef = (table: string, col: string): Expression => + new ExpressionWrapper( + ReferenceNode.create(ColumnNode.create(col), TableNode.create(table)), + ); diff --git a/packages/common/src/local-first/Schema.ts b/packages/common/src/local-first/Schema.ts index 3aeef115d..a6cb06140 100644 --- a/packages/common/src/local-first/Schema.ts +++ b/packages/common/src/local-first/Schema.ts @@ -33,7 +33,12 @@ import type { Simplify } from "../Types.js"; import type { jsonArrayFrom, jsonObjectFrom } from "./Kysely.js"; import type { AppOwner } from "./Owner.js"; import { OwnerId } from "./Owner.js"; -import type { Query, Row } from "./Query.js"; +import type { + evoluJsonArrayFrom, + evoluJsonObjectFrom, + Query, + Row, +} from "./Query.js"; import { serializeQuery } from "./Query.js"; import type { CrdtMessage, DbChange } from "./Storage.js"; import type { TimestampBytes } from "./Timestamp.js"; @@ -394,7 +399,8 @@ export const evoluSchemaToSqliteSchema = ( * Creates a query builder from a {@link EvoluSchema}. * * Supports Kysely relation-style query composition (nested objects/arrays via - * JSON subqueries), such as {@link jsonObjectFrom} and {@link jsonArrayFrom} from + * JSON subqueries), such as {@link evoluJsonObjectFrom} and + * {@link evoluJsonArrayFrom}. These helpers are Evolu's safer SQLite variants of * the * {@link https://kysely.dev/docs/recipes/relations | Kysely relations recipe}. * diff --git a/packages/common/test/local-first/Query.test.ts b/packages/common/test/local-first/Query.test.ts index ac25fcb07..f36b654ed 100644 --- a/packages/common/test/local-first/Query.test.ts +++ b/packages/common/test/local-first/Query.test.ts @@ -1,15 +1,40 @@ +import { ColumnNode, type SelectQueryNode } from "kysely"; import { expect, test } from "vitest"; +import { createQueryBuilder } from "../../src/local-first/Schema.js"; import type { Row } from "../../src/local-first/Query.js"; import { applyPatches, deserializeQuery, + evoluJsonArrayFrom, + evoluJsonBuildObject, + evoluJsonObjectFrom, + getJsonObjectArgs, kyselyJsonIdentifier, + kyselySql, makePatches, serializeQuery, testQuery, testQuery2, } from "../../src/local-first/Query.js"; -import { type SafeSql, type SqliteQuery, sql } from "../../src/Sqlite.js"; +import { sql, type SafeSql, type SqliteQuery } from "../../src/Sqlite.js"; +import { id, NonEmptyString100 } from "../../src/Type.js"; + +const PersonId = id("Person"); +const PetId = id("Pet"); + +const QuerySchema = { + person: { + id: PersonId, + name: NonEmptyString100, + }, + pet: { + id: PetId, + name: NonEmptyString100, + ownerId: PersonId, + }, +}; + +const createQuery = createQueryBuilder(QuerySchema); test("Query", () => { const query1 = serializeQuery<{ a: 1 }>(sql`select "a" as "kind";`); @@ -69,6 +94,147 @@ test("serializeQuery sorts options and deserializeQuery restores them", () => { expect(deserializeQuery(serialized)).toStrictEqual(sqlQuery); }); +test("evoluJsonArrayFrom compiles a prefixed SQLite JSON array query", () => { + const query = createQuery((db) => + db + .selectFrom("person") + .select(["person.id"]) + .select((eb) => [ + evoluJsonArrayFrom( + eb + .selectFrom("pet") + .select(["pet.id as petId", "pet.name", "ownerId"]) + .whereRef("pet.ownerId", "=", "person.id"), + ).as("pets"), + ]), + ); + + const sqlQuery = deserializeQuery(query); + + expect(sqlQuery.sql).toContain("json_group_array(json_object("); + expect(sqlQuery.sql).toContain(kyselyJsonIdentifier); + expect(sqlQuery.sql).toContain('"agg"."petId"'); + expect(sqlQuery.sql).toContain('"agg"."name"'); + expect(sqlQuery.sql).toContain('"agg"."ownerId"'); +}); + +test("evoluJsonObjectFrom compiles a prefixed SQLite JSON object query", () => { + const query = createQuery((db) => + db + .selectFrom("person") + .select(["person.id"]) + .select((eb) => [ + evoluJsonObjectFrom( + eb + .selectFrom("pet") + .select(["id as petId", "name"]) + .whereRef("pet.ownerId", "=", "person.id"), + ).as("favoritePet"), + ]), + ); + + const sqlQuery = deserializeQuery(query); + + expect(sqlQuery.sql).toContain("json_object("); + expect(sqlQuery.sql).toContain(kyselyJsonIdentifier); + expect(sqlQuery.sql).toContain('"obj"."petId"'); + expect(sqlQuery.sql).toContain('"obj"."name"'); +}); + +test("evoluJsonBuildObject compiles a prefixed SQLite json_object expression", () => { + const query = createQuery((db) => + db.selectFrom("person").select((eb) => [ + evoluJsonBuildObject({ + first: eb.ref("name"), + full: kyselySql`name || '!'`, + }).as("profile"), + ]), + ); + + const sqlQuery = deserializeQuery(query); + + expect(sqlQuery.sql).toContain("json_object("); + expect(sqlQuery.sql).toContain(kyselyJsonIdentifier); + expect(sqlQuery.sql).toContain("'first'"); + expect(sqlQuery.sql).toContain("'full'"); +}); + +test("getJsonObjectArgs handles alias, column, and reference selections", () => { + let operationNode: SelectQueryNode | undefined; + + createQuery((db) => { + const subquery = db + .selectFrom("pet") + .select((eb) => [eb.ref("id").as("petId"), "name", "pet.ownerId"]); + + operationNode = subquery.toOperationNode(); + return db.selectFrom("pet").select(["pet.id"]); + }); + + expect(operationNode).toBeDefined(); + if (!operationNode) throw new Error("Expected operation node"); + + const args = getJsonObjectArgs(operationNode, "agg"); + + expect(args).toHaveLength(6); +}); + +test("getJsonObjectArgs handles unqualified column selections", () => { + const operationNode = { + selections: [{ selection: ColumnNode.create("name") }], + } as unknown as SelectQueryNode; + + const args = getJsonObjectArgs(operationNode, "agg"); + + expect(args).toHaveLength(2); +}); + +test("getJsonObjectArgs rejects selections it cannot map to json_object", () => { + let operationNode: SelectQueryNode | undefined; + + createQuery((db) => { + const subquery = db.selectFrom("pet").selectAll(); + operationNode = subquery.toOperationNode(); + return db.selectFrom("pet").select(["pet.id"]); + }); + + expect(operationNode).toBeDefined(); + if (!operationNode) throw new Error("Expected operation node"); + const node = operationNode; + + expect(() => getJsonObjectArgs(node, "agg")).toThrow( + "can't extract column names from the select query node", + ); +}); + +test("getJsonObjectArgs returns empty array for nodes without selections", () => { + let operationNode: SelectQueryNode | undefined; + + createQuery((db) => { + operationNode = db.selectFrom("pet").toOperationNode(); + return db.selectFrom("pet").select(["pet.id"]); + }); + + expect(operationNode).toBeDefined(); + if (!operationNode) throw new Error("Expected operation node"); + + expect(getJsonObjectArgs(operationNode, "agg")).toEqual([]); +}); + +test("evoluJsonArrayFrom rejects selectAll subqueries", () => { + expect(() => + createQuery((db) => + db + .selectFrom("person") + .select((eb) => [ + evoluJsonArrayFrom(eb.selectFrom("pet").selectAll()).as("pets"), + ]), + ), + ).toThrow( + "SQLite evoluJsonArrayFrom and evoluJsonObjectFrom can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.", + ); +}); + test("makePatches", () => { const row: Row = { a: 1 }; const rows: ReadonlyArray = [row]; @@ -156,3 +322,40 @@ test("applyPatches parses prefixed JSON in strings, arrays, and objects", () => }, ]); }); + +test("applyPatches recursively parses prefixed JSON inside decoded JSON", () => { + const encodeJson = (value: unknown): string => + `${kyselyJsonIdentifier}${JSON.stringify(value)}`; + + const result = applyPatches( + [ + { + op: "replaceAll", + value: [ + { + nestedObject: encodeJson({ + items: [ + { + detail: encodeJson({ status: "ok" }), + }, + ], + }), + }, + ], + }, + ], + [], + ); + + expect(result).toEqual([ + { + nestedObject: { + items: [ + { + detail: { status: "ok" }, + }, + ], + }, + }, + ]); +}); From 999c0fcb88d5f9d09560b20dac782d880f2929b8 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:29 +0100 Subject: [PATCH 11/24] sync(common-v8): port 69a55fb Use run.orThrow for sqlite driver Source upstream commit: 69a55fb5daa33799aa16bcb2e09c8b790d1c4ac0 Port scope: adapted. --- packages/common/src/Sqlite.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/common/src/Sqlite.ts b/packages/common/src/Sqlite.ts index 617227bb7..a5ff3f5ba 100644 --- a/packages/common/src/Sqlite.ts +++ b/packages/common/src/Sqlite.ts @@ -196,9 +196,7 @@ export const createSqlite = const console = run.deps.console.child("sql"); console.debug("createSqliteDriver"); - const result = await run(createSqliteDriver(name, options)); - if (!result.ok) return result; - const driver = result.value; + const driver = await run.orThrow(createSqliteDriver(name, options)); let isDisposed = false; From 0370bca1c72ae9c56bb719c01f4601575bfa271a Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:34 +0100 Subject: [PATCH 12/24] sync(common-v8): port a0b7371 Clarify startTransition test comment Source upstream commit: a0b73710a6d243927173f7c8a8438d0d757ce439 Port scope: not-applicable (upstream change touches missing apps/web playground path in this fork). From 1738d322e92060cfacaa9028ee21fe81b0aa7c47 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:42 +0100 Subject: [PATCH 13/24] sync(common-v8): port ef36be2 Clarify error-handling docs and platform guidance Source upstream commit: ef36be2e1d324997b88811d8f35550330bc33b48 Port scope: adapted. --- packages/common/src/Result.ts | 76 ++++++++++++----------------------- packages/common/src/Task.ts | 11 ++++- 2 files changed, 35 insertions(+), 52 deletions(-) diff --git a/packages/common/src/Result.ts b/packages/common/src/Result.ts index e454eb9e8..1570a4520 100644 --- a/packages/common/src/Result.ts +++ b/packages/common/src/Result.ts @@ -11,7 +11,6 @@ import { type NonEmptyReadonlyArray, } from "./Array.js"; import { assert } from "./Assert.js"; -import type { UnknownError } from "./Error.js"; import type { Lazy } from "./Function.js"; import { exhaustiveCheck } from "./Function.js"; import { createRecord, emptyRecord, isIterable } from "./Object.js"; @@ -94,6 +93,10 @@ import type { Typed } from "./Type.js"; * The caller doesn't need `try/catch`, just `if (!json.ok)`, and the error is * `ParseJsonError`, not `unknown`. * + * Use this pattern when the caller can recover or choose a different flow. + * Parsing unknown JSON is a good fit because invalid input is expected and + * actionable. + * * To avoid `try/catch` inside `parseJson` too, use {@link trySync}: * * ```ts @@ -104,8 +107,12 @@ import type { Typed } from "./Type.js"; * ); * ``` * - * `trySync` makes synchronous code that can throw safe. For asynchronous code, - * use {@link tryAsync}. + * `trySync` and {@link tryAsync} are for intentionally converting thrown errors + * into typed, recoverable {@link Result} values. + * + * Do not wrap every throwing API in {@link Result}. If an error is unrecoverable + * and the caller has no meaningful fallback, let it throw and handle it at the + * app boundary. * * Since `Result` is a plain object, imperative code works naturally: * @@ -180,56 +187,15 @@ import type { Typed } from "./Type.js"; * * Some errors can't be handled locally — they must propagate to the top level. * These are unrecoverable errors: expected (you know they can happen) but only - * handleable at the app level. Group them in a union type like `AppError`: - * - * ```ts - * type AppError = TimestampError | SyncError | UnknownError; - * - * interface TimestampError extends Typed<"TimestampError"> { - * readonly error: UnknownError; - * } - * ``` + * handleable at the app level. * - * {@link UnknownError} wraps `unknown` so it can be part of a union (`unknown` - * absorbs all other types). + * Do not force these errors into {@link Result} just because the underlying API + * throws. If the local caller cannot recover, let the error propagate to a + * global handler or other app boundary. * - * Handle unrecoverable errors at the top level: - * - * ```ts - * const handleAppError = (error: AppError): void => { - * switch (error.type) { - * case "TimestampError": - * console.error(error.error.stack); // Log preserved stack trace - * showToast( - * "Timestamp error. Your computer clock appears to be incorrect.", - * ); - * break; - * case "SyncError": - * showToast("Sync failed. Retrying..."); - * break; - * case "UnknownError": - * console.error(error.stack); - * showToast("An unexpected error occurred."); - * break; - * default: - * exhaustiveCheck(error); - * } - * }; - * ``` - * - * ## Unexpected errors - * - * Wrapping all unsafe code with {@link trySync} or {@link tryAsync} doesn't - * prevent all errors — bugs can still throw. Catch them with global handlers: - * - * ```ts - * // Worker - * scope.onError = (error) => { - * errorPort.postMessage(error); - * }; - * ``` - * - * TODO: Window and Node.js + * In Evolu apps, that boundary is typically a platform `createRun` adapter such + * as `@evolu/web`, `@evolu/nodejs`, or `@evolu/react-native`, which add + * platform-specific global error handling. * * ## FAQ * @@ -397,6 +363,10 @@ export const getOk = (result: Result): T => { /** * Wraps a synchronous function that may throw, returning a {@link Result}. * + * Use this when the thrown value should become a typed, recoverable error for + * the caller. Do not use it for failures that should terminate the current flow + * and propagate to a global handler. + * * ### Example * * ```ts @@ -421,6 +391,10 @@ export const trySync = ( /** * Wraps an async function that may throw, returning a {@link Result}. * + * Use this when the rejection should become a typed, recoverable error for the + * caller. Do not use it for failures that should terminate the current flow and + * propagate to a global handler. + * * ### Example * * ```ts diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index 1f43479e7..b9e1b78d3 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -134,6 +134,10 @@ import { * // When this block ends, `await using` disposes the Run — aborting all Fibers. * ``` * + * In composition roots, prefer Evolu platform `createRun` adapters when one + * exists. `@evolu/web`, `@evolu/nodejs`, and `@evolu/react-native` build on the + * common {@link createRun} and add platform-specific global error handling. + * * ## Composition * * | Category | Helper | Description | @@ -1239,6 +1243,12 @@ export interface CreateRun { * Call once per entry point (main thread, worker, etc.) and dispose on * shutdown. All Tasks run as descendants of this root Run. * + * This common {@link createRun} is platform-agnostic. At application entry + * points, prefer the platform adapter when one exists. `@evolu/web` adds + * browser `error` and `unhandledrejection` handlers, `@evolu/nodejs` adds + * Node.js `uncaughtException`, `unhandledRejection`, and graceful shutdown + * handling, and `@evolu/react-native` adds React Native global error handling. + * * {@link RunDeps} provides default dependencies: * * - {@link Time} @@ -1386,7 +1396,6 @@ const createRunInternal = task = () => err(signalController.signal.reason); } - // Evolu polyfills `Promise.try` const promise = Promise.try(task, run) .then((taskOutcome) => { const taskResult = run.signal.aborted From 489b56f8ba43ee83146215a4bda6d90b975cedb7 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:46 +0100 Subject: [PATCH 14/24] sync(common-v8): port c803aef Rollback Source upstream commit: c803aef7b647bb1d2d32b16a9b56535284048596 Port scope: adapted. --- packages/common/src/Sqlite.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/common/src/Sqlite.ts b/packages/common/src/Sqlite.ts index a5ff3f5ba..617227bb7 100644 --- a/packages/common/src/Sqlite.ts +++ b/packages/common/src/Sqlite.ts @@ -196,7 +196,9 @@ export const createSqlite = const console = run.deps.console.child("sql"); console.debug("createSqliteDriver"); - const driver = await run.orThrow(createSqliteDriver(name, options)); + const result = await run(createSqliteDriver(name, options)); + if (!result.ok) return result; + const driver = result.value; let isDisposed = false; From caf8503e289280eb740335e364c4a1dd1231603f Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:47:56 +0100 Subject: [PATCH 15/24] sync(common-v8): port 617ee37 Add Task style note and fix a bug Source upstream commit: 617ee3793cc7745d0ddaaaaabbf3034248de8afb Port scope: adapted. --- packages/common/src/Task.ts | 26 +++++++++++++++++++++++++- packages/common/test/Task.test.ts | 2 ++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index b9e1b78d3..485edbd03 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -160,6 +160,30 @@ import { * run Tasks concurrently. Note helpers like {@link race} always run * concurrently; sequential execution wouldn't make sense for their semantics. * + * ## Style + * + * Imperative code is the preferred way to compose sequential {@link Task} + * operations inside another Task. + * + * ```ts + * const user = await run(fetchUser(id)); + * if (!user.ok) return user; + * + * const profile = await run(fetchProfile(user.value.id)); + * if (!profile.ok) return profile; + * + * return ok({ user: user.value, profile: profile.value }); + * ``` + * + * This is an intentional style choice. Evolu keeps helpers for operations with + * distinct semantics that plain control flow does not express well, such as + * concurrency, racing, retries, timeouts, and collection processing. It + * intentionally does not provide generic chain, flatMap, or pipe-style helpers + * for ordinary sequential Task composition, because that would duplicate plain + * control flow and create API ambiguity. While this can look verbose, it is + * explicit, transparent, debuggable, and avoids pipes and nested helper + * chains. + * * ### Building a better fetch * * Use {@link timeout} to prevent hanging: @@ -1090,7 +1114,7 @@ export class AsyncDisposableStack implements AsyncDisposable { use(value: T): T; use( acquire: Task, - ): PromiseLike>; + ): PromiseLike>; use( valueOrAcquire: T | Task, ): T | PromiseLike> { diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index 1613e0743..dd4e05786 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -2192,6 +2192,8 @@ describe("AsyncDisposableStack", () => { const task: Task = async (run) => { await using stack = run.stack(); const a = await stack.use(createResource("a", events)); + + expectTypeOf(a).toEqualTypeOf>(); if (!a.ok) return a; events.push(`using ${a.value.id}`); return ok(); From e4aa0715f317c10eb1c3f2ade0475e957076b5d3 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:48:00 +0100 Subject: [PATCH 16/24] sync(common-v8): port 768356c Document imperative Result composition style Source upstream commit: 768356c02a4b314691ffa0df41b4023b7a36d5a5 Port scope: adapted. --- packages/common/src/Result.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/common/src/Result.ts b/packages/common/src/Result.ts index 1570a4520..f672d4e5a 100644 --- a/packages/common/src/Result.ts +++ b/packages/common/src/Result.ts @@ -133,6 +133,28 @@ import type { Typed } from "./Type.js"; * } * ``` * + * ## Style + * + * Imperative code is the preferred way to compose sequential {@link Result} + * operations. + * + * ```ts + * const user = getUser(); + * if (!user.ok) return user; + * + * const profile = getProfile(user.value.id); + * if (!profile.ok) return profile; + * + * return ok({ user: user.value, profile: profile.value }); + * ``` + * + * This is an intentional style choice. Evolu does not provide helper + * combinators for every sequential pattern because that would duplicate plain + * control flow and create API ambiguity. Use helpers when they add semantics + * over ordinary control flow, such as operating on collections of results. + * While this can look verbose, it is explicit, transparent, debuggable, and + * avoids pipes and nested helper chains. + * * ## Composition * * Some patterns are common enough that deserve helpers. The previous example From 41f545ea60a8123f27a045a0dbf9c7051d0eafb3 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 05:49:43 +0100 Subject: [PATCH 17/24] sync(common-v8): port a726b7b Standardize run variable names Source upstream commit: a726b7bb57811d9f2ce49c5179aebe48bf805bf1 Port scope: adapted (standardized runner variable naming while preserving fork relay/db runtime wiring). --- packages/common/src/Sqlite.ts | 8 +++---- packages/common/src/Task.ts | 14 +++++------ packages/common/src/local-first/Db.ts | 2 +- packages/common/test/Task.test.ts | 30 ++++++++++++------------ packages/nodejs/src/local-first/Relay.ts | 17 +++++++------- 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/packages/common/src/Sqlite.ts b/packages/common/src/Sqlite.ts index 617227bb7..082c9da07 100644 --- a/packages/common/src/Sqlite.ts +++ b/packages/common/src/Sqlite.ts @@ -195,10 +195,10 @@ export const createSqlite = const { createSqliteDriver } = run.deps; const console = run.deps.console.child("sql"); - console.debug("createSqliteDriver"); - const result = await run(createSqliteDriver(name, options)); - if (!result.ok) return result; - const driver = result.value; + const driverResult = await run(createSqliteDriver(name, options)); + if (!driverResult.ok) return driverResult; + const driver = driverResult.value; + console.debug("SQLite driver created"); let isDisposed = false; diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index 485edbd03..368a17cd6 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -686,23 +686,21 @@ export interface Run extends AsyncDisposable { * * const init = * (config: Config): Task => - * async (_run) => { - * const { createDb } = _run.deps; - * await using stack = _run.stack(); + * async (run) => { + * const { createDb } = run.deps; + * await using stack = run.stack(); * * const db = await stack.use(createDb(config.connectionString)); * if (!db.ok) return db; * - * const run = _run.addDeps({ db: db.value }); + * const runWithDb = run.addDeps({ db: db.value }); * - * await run(getUser(123)); - * await run(insertUser(user)); + * await runWithDb(getUser(123)); + * await runWithDb(insertUser(user)); * return ok(); * }; * ``` * - * The `_run` naming convention reserves `run` for the extended Run. - * * ## FAQ * * ### How does it work? diff --git a/packages/common/src/local-first/Db.ts b/packages/common/src/local-first/Db.ts index 88b8dbcbf..b4c253376 100644 --- a/packages/common/src/local-first/Db.ts +++ b/packages/common/src/local-first/Db.ts @@ -19,7 +19,7 @@ import type { } from "../Crypto.js"; import { getProperty, objectToEntries } from "../Object.js"; import type { RandomDep } from "../Random.js"; -import { getOk, ok, type Result } from "../Result.js"; +import { ok, type Result } from "../Result.js"; import { spaced } from "../Schedule.js"; import type { CreateSqliteDriverDep, diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index dd4e05786..58c0f993c 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -326,10 +326,10 @@ describe("Run", () => { }); test("extends run with additional deps for reusable usage", async () => { - await using _run = createRun(); + await using run = createRun(); const db = createDb(); - const run: Run = _run.addDeps({ db }); + const runWithDb: Run = run.addDeps({ db }); const task1: Task = (run) => ok(run.deps.db.query("SELECT 1")); @@ -337,8 +337,8 @@ describe("Run", () => { const task2: Task = (run) => ok(run.deps.db.query("SELECT 2")); - const result1 = await run(task1); - const result2 = await run(task2); + const result1 = await runWithDb(task1); + const result2 = await runWithDb(task2); expect(result1).toEqual(ok("result:SELECT 1")); expect(result2).toEqual(ok("result:SELECT 2")); @@ -1177,9 +1177,9 @@ describe("Run", () => { const childTask: Task = (run) => ok(run.deps.custom.value); - const parentTask: Task = async (_run) => { - const run = _run.addDeps({ custom: { value: "from-create" } }); - const createdRun = run.create(); + const parentTask: Task = async (run) => { + const runWithDep = run.addDeps({ custom: { value: "from-create" } }); + const createdRun = runWithDep.create(); const result = await createdRun(childTask); if (!result.ok) return result; @@ -1199,8 +1199,8 @@ describe("Run", () => { let createdRun: Run | undefined; expect( - await run((_run) => { - createdRun = _run.create(); + await run((run) => { + createdRun = run.create(); return ok(); }), ).toEqual(ok()); @@ -1240,8 +1240,8 @@ describe("Run", () => { let createdRun: Run | undefined; expect( - await run((_run) => { - createdRun = _run.create(); + await run((run) => { + createdRun = run.create(); return ok(); }), ).toEqual(ok()); @@ -1667,9 +1667,9 @@ describe("Fiber", () => { }; // Parent task adds deps and spawns daemon - const parentTask: Task = async (_run) => { - const run = _run.addDeps({ custom: { value: "from-addDeps" } }); - await run.daemon(daemonTask); + const parentTask: Task = async (run) => { + const runWithDep = run.addDeps({ custom: { value: "from-addDeps" } }); + await runWithDep.daemon(daemonTask); return ok(); }; @@ -1948,7 +1948,7 @@ describe("unabortableMask", () => { const task = unabortableMask( (_restore1) => async (run) => await run( - unabortableMask((restore2) => (_run) => { + unabortableMask((restore2) => () => { // restore2 restores to mask=1 restoreFromInner = restore2; diff --git a/packages/nodejs/src/local-first/Relay.ts b/packages/nodejs/src/local-first/Relay.ts index 7f82081e9..a349198f9 100644 --- a/packages/nodejs/src/local-first/Relay.ts +++ b/packages/nodejs/src/local-first/Relay.ts @@ -6,7 +6,6 @@ import { createRandom, createRelation, createSqlite, - getOk, isPromiseLike, type OwnerId, ok, @@ -71,14 +70,16 @@ export const startRelay = isOwnerAllowed, isOwnerWithinQuota, }: NodeJsRelayConfig): Task => - async (_run) => { - await using stack = _run.stack(); - const console = _run.deps.console.child("relay"); + async (run) => { + await using stack = run.stack(); + const console = run.deps.console.child("relay"); const dbFileExists = existsSync(`${name}.db`); - const sqlite = getOk(await stack.use(createSqlite(name))); - const deps = { ..._run.deps, sqlite }; + const sqliteResult = await stack.use(createSqlite(name)); + if (!sqliteResult.ok) return sqliteResult; + + const deps = { ...run.deps, sqlite: sqliteResult.value }; if (!dbFileExists) { createBaseSqliteStorageTables(deps); @@ -92,7 +93,7 @@ export const startRelay = // Use root daemon runner for WS callbacks; task-scoped runner closes // after startRelay returns and would reject message handling with // RunnerClosingError. - const run = _run.daemon.addDeps({ storage }); + const daemonRun = run.daemon.addDeps({ storage }); const server = createServer(); const wss = new WebSocketServer({ @@ -198,7 +199,7 @@ export const startRelay = if (!Uint8Array.is(message)) return; void (async () => { - const response = await run( + const response = await daemonRun( applyProtocolMessageAsRelay(message, options), ); if (!response.ok) { From 07026bbfce71e267d09ce3c21804a9cb4e6a42f5 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 06:12:01 +0100 Subject: [PATCH 18/24] fix: stabilize compatibility after common-v8 sync Restore cross-package build compatibility after the sync wave by adding Task API aliases, adapting Sync/Shared wiring to updated Resources semantics, and aligning relay/react-native helpers with updated Result/Promise typings. --- apps/relay/src/startBunRelay.ts | 4 +- packages/common/src/Task.ts | 29 ++++- packages/common/src/local-first/Db.ts | 39 +++--- packages/common/src/local-first/Evolu.ts | 1 + packages/common/src/local-first/Schema.ts | 1 - packages/common/src/local-first/Shared.ts | 23 ++-- packages/common/src/local-first/Sync.ts | 149 ++++++++++++++-------- packages/react-native/src/Polyfills.ts | 20 +-- 8 files changed, 164 insertions(+), 102 deletions(-) diff --git a/apps/relay/src/startBunRelay.ts b/apps/relay/src/startBunRelay.ts index d0f245bb1..1b4e1ce8f 100644 --- a/apps/relay/src/startBunRelay.ts +++ b/apps/relay/src/startBunRelay.ts @@ -2,7 +2,7 @@ import { type CreateSqliteDriverDep, callback, createSqlite, - getOk, + getOrThrow, isPromiseLike, type OwnerId, ok, @@ -99,7 +99,7 @@ export const startBunRelay = const console = _run.deps.console.child("relay"); const relayName = name ?? SimpleName.orThrow("evolu-relay"); - const sqlite = getOk(await stack.use(createSqlite(relayName))); + const sqlite = getOrThrow(await stack.use(createSqlite(relayName))); const deps = { ..._run.deps, sqlite }; createBaseSqliteStorageTables(deps); diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index 368a17cd6..e4e790012 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -1335,6 +1335,22 @@ export const createRun: CreateRun = ( return createRunInternal(createRef(mergedDeps))(); }; +/** + * Backward-compatible alias for older API naming. + * + * Prefer {@link Run} and {@link createRun} in new code. + */ +export type Runner = Run; +export type RunnerDeps = RunDeps; +export type CreateRunner = CreateRun; + +/** + * Backward-compatible alias for older API naming. + * + * Prefer {@link createRun} in new code. + */ +export const createRunner = createRun; + /** Internal Run properties, hidden from public API via TypeScript types. */ interface RunInternal extends Run { readonly requestAbort: (reason: unknown) => void; @@ -1803,8 +1819,17 @@ const scheduler = ( const yieldImpl: () => Promise = typeof scheduler?.yield === "function" ? () => (scheduler.yield as () => Promise)() - : typeof setImmediate !== "undefined" - ? () => new Promise((resolve) => setImmediate(resolve)) + : "setImmediate" in globalThis + ? () => + new Promise((resolve) => { + const setImmediateFn = ( + globalThis as unknown as { + readonly setImmediate?: (callback: () => void) => unknown; + } + ).setImmediate; + if (typeof setImmediateFn === "function") setImmediateFn(resolve); + else setTimeout(resolve, 0); + }) : () => new Promise((r) => setTimeout(r, 0)); // Safari /** diff --git a/packages/common/src/local-first/Db.ts b/packages/common/src/local-first/Db.ts index b4c253376..8f091f925 100644 --- a/packages/common/src/local-first/Db.ts +++ b/packages/common/src/local-first/Db.ts @@ -20,7 +20,6 @@ import type { import { getProperty, objectToEntries } from "../Object.js"; import type { RandomDep } from "../Random.js"; import { ok, type Result } from "../Result.js"; -import { spaced } from "../Schedule.js"; import type { CreateSqliteDriverDep, SqliteDep, @@ -34,7 +33,7 @@ import { sql, } from "../Sqlite.js"; import type { LeaderLockDep } from "../Task.js"; -import { type AsyncDisposableStack, repeat, type Task } from "../Task.js"; +import { type AsyncDisposableStack, type Task } from "../Task.js"; import { type Millis, millisToDateIso, type TimeDep } from "../Time.js"; import type { Name } from "../Type.js"; import { @@ -165,20 +164,10 @@ export const initDbWorker = console.info("leaderLock acquired"); port.postMessage({ type: "LeaderAcquired", name }); - const heartbeatFiber = run.daemon( - repeat(() => { - port.postMessage({ type: "LeaderHeartbeat", name }); - return ok(); - }, spaced("5s")), - ); - try { - return await run.addDeps({ - port, - timestampConfig: { maxDrift: defaultTimestampMaxDrift }, - })(startDbWorker(name, sqliteSchema, encryptionKey)); - } finally { - heartbeatFiber.abort(); - } + return await run.addDeps({ + port, + timestampConfig: { maxDrift: defaultTimestampMaxDrift }, + })(startDbWorker(name, sqliteSchema, encryptionKey)); }); }; @@ -201,9 +190,11 @@ const startDbWorker = const console = run.deps.console.child(name).child("DbWorker"); console.info("startDbWorker"); - const sqlite = getOk( - await stack.use(createSqlite(name, { mode: "encrypted", encryptionKey })), + const sqliteResult = await stack.use( + createSqlite(name, { mode: "encrypted", encryptionKey }), ); + if (!sqliteResult.ok) return sqliteResult; + const sqlite = sqliteResult.value; console.info("SQLite created"); const baseSqliteStorage = createBaseSqliteStorage({ sqlite, ...run.deps }); @@ -281,10 +272,14 @@ const startDbWorker = }); break; case "Export": - result = ok({ - type: "Export", - file: deps.sqlite.export(), - }); + { + const exported = deps.sqlite.export(); + const file = new Uint8Array(exported); + result = ok({ + type: "Export", + file, + }); + } break; } diff --git a/packages/common/src/local-first/Evolu.ts b/packages/common/src/local-first/Evolu.ts index 9d2239569..cf512c16b 100644 --- a/packages/common/src/local-first/Evolu.ts +++ b/packages/common/src/local-first/Evolu.ts @@ -664,6 +664,7 @@ export const createEvolu = { type: "CreateEvolu", name, + appOwner, evoluPort: evoluChannel.port2.native, dbWorkerPort: dbWorkerChannel.port2.native, }, diff --git a/packages/common/src/local-first/Schema.ts b/packages/common/src/local-first/Schema.ts index a6cb06140..cebe8fe15 100644 --- a/packages/common/src/local-first/Schema.ts +++ b/packages/common/src/local-first/Schema.ts @@ -30,7 +30,6 @@ import { type StandardSchemaV1, } from "../Type.js"; import type { Simplify } from "../Types.js"; -import type { jsonArrayFrom, jsonObjectFrom } from "./Kysely.js"; import type { AppOwner } from "./Owner.js"; import { OwnerId } from "./Owner.js"; import type { diff --git a/packages/common/src/local-first/Shared.ts b/packages/common/src/local-first/Shared.ts index 0fb5ece89..3872d540b 100644 --- a/packages/common/src/local-first/Shared.ts +++ b/packages/common/src/local-first/Shared.ts @@ -31,7 +31,7 @@ import type { WorkerDeps, } from "../Worker.js"; import type { EvoluError } from "./Error.js"; -import type { OwnerId, OwnerTransport, SyncOwner } from "./Owner.js"; +import type { OwnerId, OwnerTransport } from "./Owner.js"; import { makePatches, type Patch, @@ -40,6 +40,7 @@ import { } from "./Query.js"; import type { MutationChange } from "./Schema.js"; import type { CrdtMessage } from "./Storage.js"; +import type { SyncOwner } from "./Sync.js"; export type SharedWorker = CommonSharedWorker; @@ -62,7 +63,7 @@ export type SharedWorkerInput = | { readonly type: "CreateEvolu"; readonly name: Name; - readonly appOwner: SyncOwner; + readonly appOwner?: SyncOwner; readonly evoluPort: NativeMessagePort; readonly dbWorkerPort: NativeMessagePort; }; @@ -186,7 +187,9 @@ export const initSharedWorker = const result = await runWithSharedEvoluDeps.daemon( createSharedEvolu({ name: message.name, - appOwner: message.appOwner, + ...(message.appOwner + ? { appOwner: message.appOwner } + : {}), postTabOutput, onDispose: () => { void runWithSharedEvoluDeps.daemon( @@ -291,8 +294,6 @@ type SharedTransportResources = Resources< OwnerId >; -export type SyncState = 123; - const createSharedEvolu = ({ name, @@ -301,7 +302,7 @@ const createSharedEvolu = onDispose, }: { name: Name; - appOwner: SyncOwner; + appOwner?: SyncOwner; postTabOutput: Callback; onDispose: () => void; }): Task => @@ -322,9 +323,11 @@ const createSharedEvolu = let queueProcessingFiber: Fiber | null = null; - const ownerTransports = appOwner.transports ?? emptyArray; + const ownerTransports = appOwner?.transports ?? emptyArray; - await run(transports.addConsumer(appOwner, ownerTransports)); + if (appOwner) { + await run(transports.addConsumer(appOwner, ownerTransports)); + } const ensureQueueProcessing = (): void => { if ( @@ -493,7 +496,9 @@ const createSharedEvolu = addPorts, [Symbol.asyncDispose]: async () => { - await run(transports.removeConsumer(appOwner, ownerTransports)); + if (appOwner) { + await run(transports.removeConsumer(appOwner, ownerTransports)); + } queueProcessingFiber?.abort(); queueProcessingFiber = null; diff --git a/packages/common/src/local-first/Sync.ts b/packages/common/src/local-first/Sync.ts index 0d859487e..d6e374594 100644 --- a/packages/common/src/local-first/Sync.ts +++ b/packages/common/src/local-first/Sync.ts @@ -20,7 +20,6 @@ import type { } from "../Crypto.js"; import type { UnknownError } from "../Error.js"; import { createUnknownError } from "../Error.js"; -import { createInstances } from "../Instances.js"; import { createRecord, getProperty, objectToEntries } from "../Object.js"; import type { RandomDep } from "../Random.js"; import { createRefCount } from "../RefCount.js"; @@ -187,21 +186,15 @@ export const createSync = ) => (config: SyncConfig): Sync => { let isDisposed = false; - const disposalDelayResult = - config.disposalDelayMs == null - ? ok(Millis.orThrow(100)) - : Millis.from(config.disposalDelayMs); - - assert( - disposalDelayResult.ok, - "Invalid SyncConfig.disposalDelayMs: expected a non-negative integer.", - ); - const disposalDelay = disposalDelayResult.value; + const syncRun = createRun(deps); + const syncOwnersById = new Map(); + const syncOwnerRefs = createRefCount(); + const webSocketsByTransportKey = new Map(); /** Returns owner data only if actively assigned to at least one transport. */ const getSyncOwner = (ownerId: OwnerId): SyncOwner | null => { if (isDisposed) return null; - return resources.getConsumer(ownerId); + return syncOwnersById.get(ownerId) ?? null; }; const storage = createClientStorage({ @@ -260,6 +253,7 @@ export const createSync = if (isDisposed) return; isDisposed = true; pendingSends.length = 0; + webSocketsByTransportKey.delete(transportKey); socket?.[Symbol.dispose](); void run[Symbol.asyncDispose](); }, @@ -272,10 +266,10 @@ export const createSync = onOpen: () => { if (isDisposed) return; - const currentWebSocket = resources.getResource(transportKey); + const currentWebSocket = webSocketsByTransportKey.get(transportKey); if (!currentWebSocket) return; - const ownerIds = resources.getConsumersForResource(transportKey); + const ownerIds = resources.getConsumerIdsForResource(transportKey); deps.console.log("[sync]", "onOpen", { transportKey, ownerIds }); for (const ownerId of ownerIds) { @@ -306,7 +300,7 @@ export const createSync = // Only handle ArrayBuffer data for sync messages. if (isDisposed || !(data instanceof ArrayBuffer)) return; - const currentWebSocket = resources.getResource(transportKey); + const currentWebSocket = webSocketsByTransportKey.get(transportKey); if (!currentWebSocket) return; const input = new Uint8Array(data); @@ -344,6 +338,7 @@ export const createSync = }, ); + webSocketsByTransportKey.set(transportKey, webSocket); return webSocket; }; @@ -353,37 +348,50 @@ export const createSync = OwnerTransport, SyncOwner, OwnerId - >(deps)({ - createResource, - getResourceKey: createTransportKey, + >({ + createResource: async (transport) => createResource(transport), + getResourceId: createTransportKey, getConsumerId: (owner) => owner.id, - disposalDelay, + }); - onConsumerAdded: (owner, webSocket) => { - deps.console.log("[sync]", "onConsumerAdded", { - ownerId: owner.id, - isOpen: webSocket.isOpen(), - }); + const sendSubscribeForOwner = (owner: SyncOwner): void => { + if (isDisposed || !syncOwnerRefs.has(owner.id)) return; - // The onOpen handler will sync it. - if (!webSocket.isOpen()) return; - const message = createProtocolMessageForSync({ + let message: Uint8Array | null = null; + try { + message = createProtocolMessageForSync({ storage, console: deps.console, })(owner.id, SubscriptionFlags.Subscribe); - if (message) webSocket.send(message); - }, - - onConsumerRemoved: (owner, webSocket) => { - deps.console.log("[sync]", "onConsumerRemoved", { + } catch (error) { + deps.console.warn("[sync]", "sendSubscribeForOwner failed", { ownerId: owner.id, - isOpen: webSocket.isOpen(), + error: createUnknownError(error), }); + return; + } + if (!message) return; - const message = createProtocolMessageForUnsubscribe(owner.id); - webSocket.send(message); - }, - }); + const transports = owner.transports ?? config.transports; + for (const transport of transports) { + const webSocket = webSocketsByTransportKey.get( + createTransportKey(transport), + ); + if (webSocket?.isOpen()) webSocket.send(message); + } + }; + + const sendUnsubscribeForOwner = (owner: SyncOwner): void => { + if (isDisposed) return; + const message = createProtocolMessageForUnsubscribe(owner.id); + const transports = owner.transports ?? config.transports; + for (const transport of transports) { + const webSocket = webSocketsByTransportKey.get( + createTransportKey(transport), + ); + if (webSocket?.isOpen()) webSocket.send(message); + } + }; const sync: Sync = { useOwner: (use, owner) => { @@ -400,16 +408,38 @@ export const createSync = const transports = owner.transports ?? config.transports; if (use) { - resources.addConsumer(owner, transports); + syncOwnerRefs.increment(owner.id); + syncOwnersById.set(owner.id, owner); + void syncRun(resources.addConsumer(owner, transports)).then( + (result) => { + if (!result.ok) { + if ((result.error as { type?: string }).type !== "AbortError") { + config.onError(createUnknownError(result.error)); + } + return; + } + if (!syncOwnerRefs.has(owner.id)) return; + sendSubscribeForOwner(owner); + }, + (error: unknown) => { + config.onError(createUnknownError(error)); + }, + ); } else { - const result = resources.removeConsumer(owner, transports); - if (!result.ok) { - deps.console.warn("[sync]", "Failed to remove consumer", { - transports, - ownerId: owner.id, - error: result.error, - }); - } + sendUnsubscribeForOwner(owner); + syncOwnerRefs.decrement(owner.id); + if (!syncOwnerRefs.has(owner.id)) syncOwnersById.delete(owner.id); + void syncRun(resources.removeConsumer(owner, transports)).then( + (result) => { + if (result.ok) return; + if ((result.error as { type?: string }).type !== "AbortError") { + config.onError(createUnknownError(result.error)); + } + }, + (error: unknown) => { + config.onError(createUnknownError(error)); + }, + ); } }, @@ -467,7 +497,7 @@ export const createSync = for (const transport of transports) { const transportKey = createTransportKey(transport); - const webSocket = resources.getResource(transportKey); + const webSocket = webSocketsByTransportKey.get(transportKey); if (!webSocket) continue; if (webSocket.isOpen()) { @@ -484,7 +514,9 @@ export const createSync = [Symbol.dispose]: () => { if (isDisposed) return; isDisposed = true; - resources[Symbol.dispose](); + syncOwnersById.clear(); + void resources[Symbol.asyncDispose](); + void syncRun[Symbol.asyncDispose](); }, }; @@ -552,10 +584,7 @@ const createClientStorage = strict; `); - const ownerMutexes = createInstances< - OwnerId, - ReturnType - >(); + const ownerMutexes = new Map>(); const ownerMutexRefs = createRefCount(); const storage: ClientStorage = { @@ -592,7 +621,13 @@ const createClientStorage = writeMessages: (ownerIdBytes, encryptedMessages) => async (run) => { const ownerId = ownerIdBytesToOwnerId(ownerIdBytes); - const ownerMutex = ownerMutexes.ensure(ownerId, createMutex); + const ownerMutex = + ownerMutexes.get(ownerId) ?? + (() => { + const mutex = createMutex(); + ownerMutexes.set(ownerId, mutex); + return mutex; + })(); ownerMutexRefs.increment(ownerId); const result = await (async () => { @@ -761,9 +796,11 @@ const createClientStorage = })(); if (!result.ok) { - if (result.error.type !== "AbortError") { - config.onError(result.error); - throw new Error(result.error.type, { cause: result.error }); + const error = result.error as { type?: string }; + if (error.type !== "AbortError") { + const unknownError = createUnknownError(result.error); + config.onError(unknownError); + throw new Error(unknownError.type, { cause: unknownError }); } return ok(); } diff --git a/packages/react-native/src/Polyfills.ts b/packages/react-native/src/Polyfills.ts index ea58f63ba..fdd74a41c 100644 --- a/packages/react-native/src/Polyfills.ts +++ b/packages/react-native/src/Polyfills.ts @@ -34,10 +34,10 @@ export const installPolyfills = (): void => { const installPromisePolyfills = () => { const PromiseStatic = Promise as PromiseConstructor & { withResolvers?: () => PromiseWithResolvers; - try?: ( - func: (...args: ReadonlyArray) => unknown, - ...args: ReadonlyArray - ) => Promise; + try?: >( + func: (...args: U) => T | PromiseLike, + ...args: U + ) => Promise>; }; // @see https://github.com/facebook/hermes/pull/1452 @@ -55,13 +55,13 @@ const installPromisePolyfills = () => { // @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/try if (typeof PromiseStatic.try !== "function") { - PromiseStatic.try = ( - func: (...args: ReadonlyArray) => unknown, - ...args: ReadonlyArray - ): Promise => - new Promise((resolve, reject) => { + PromiseStatic.try = >( + func: (...args: U) => T | PromiseLike, + ...args: U + ): Promise> => + new Promise>((resolve, reject) => { try { - resolve(func(...args)); + resolve(func(...args) as Awaited); } catch (error) { reject(error); } From ed55473ba804caf1410bdbc0e7c25a13fca9d5b3 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 07:19:22 +0100 Subject: [PATCH 19/24] chore: Update `@angular/build` to `21.2.1` and related Angular devkit dependencies. --- packages/common/src/Task.ts | 21 ++-- packages/common/test/Task.test.ts | 182 +++++++++++++++--------------- 2 files changed, 96 insertions(+), 107 deletions(-) diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index e4e790012..b8d30ceb4 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -918,10 +918,8 @@ export interface RunStateRunning extends Typed<"Running"> {} export interface RunStateDisposing extends Typed<"Disposing"> {} -export interface RunStateSettled< - T = unknown, - E = unknown, -> extends Typed<"Settled"> { +export interface RunStateSettled + extends Typed<"Settled"> { /** * The Run's completion value. * @@ -2397,9 +2395,8 @@ export const createDeferred = (): Deferred => { export const DeferredDisposedError = /*#__PURE__*/ typed( "DeferredDisposedError", ); -export interface DeferredDisposedError extends InferType< - typeof DeferredDisposedError -> {} +export interface DeferredDisposedError + extends InferType {} /** * {@link DeferredDisposedError} used as abort reason in {@link createDeferred}. @@ -2700,9 +2697,8 @@ export const createSemaphore = (permits: Concurrency): Semaphore => { export const SemaphoreDisposedError = /*#__PURE__*/ typed( "SemaphoreDisposedError", ); -export interface SemaphoreDisposedError extends InferType< - typeof SemaphoreDisposedError -> {} +export interface SemaphoreDisposedError + extends InferType {} /** * {@link SemaphoreDisposedError} used as abort reason in {@link createSemaphore}. @@ -3339,9 +3335,8 @@ export function allSettled( * @group Composition */ export const AllSettledAbortError = /*#__PURE__*/ typed("AllSettledAbortError"); -export interface AllSettledAbortError extends InferType< - typeof AllSettledAbortError -> {} +export interface AllSettledAbortError + extends InferType {} /** * {@link AllSettledAbortError} used as abort reason in {@link allSettled}. diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index 58c0f993c..3e1f6927b 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -1007,111 +1007,105 @@ describe("Run", () => { expect(reason).toBe("late-reason"); }); - test.sequential( - "removes listener via signal option for cleanup", - async () => { - // This test verifies that onAbort uses `signal: requestController.signal` - // for listener cleanup. Per spec, when the cleanup signal aborts, the - // listener is removed. We capture the cleanup signal and verify it's - // aborted after disposal. - - await using run = createRun(); - - let cleanupSignal: AbortSignal | null = null; - // eslint-disable-next-line @typescript-eslint/unbound-method - const originalAddEventListener = AbortSignal.prototype.addEventListener; - - let childSignal: AbortSignal | null = null; - - AbortSignal.prototype.addEventListener = function ( - ...args: Parameters + test.sequential("removes listener via signal option for cleanup", async () => { + // This test verifies that onAbort uses `signal: requestController.signal` + // for listener cleanup. Per spec, when the cleanup signal aborts, the + // listener is removed. We capture the cleanup signal and verify it's + // aborted after disposal. + + await using run = createRun(); + + let cleanupSignal: AbortSignal | null = null; + // eslint-disable-next-line @typescript-eslint/unbound-method + const originalAddEventListener = AbortSignal.prototype.addEventListener; + + let childSignal: AbortSignal | null = null; + + AbortSignal.prototype.addEventListener = function ( + ...args: Parameters + ) { + const [type, , options] = args; + if ( + type === "abort" && + this === childSignal && + options && + typeof options === "object" && + options.signal ) { - const [type, , options] = args; - if ( - type === "abort" && - this === childSignal && - options && - typeof options === "object" && - options.signal - ) { - cleanupSignal = options.signal; - } - originalAddEventListener.apply(this, args); - }; + cleanupSignal = options.signal; + } + originalAddEventListener.apply(this, args); + }; - try { - await run((childRun) => { - childSignal = childRun.signal; - childRun.onAbort(lazyVoid); - return ok(); - }); + try { + await run((childRun) => { + childSignal = childRun.signal; + childRun.onAbort(lazyVoid); + return ok(); + }); - // Cleanup signal should exist and be aborted after disposal - expect(cleanupSignal).not.toBeNull(); - expect(cleanupSignal!.aborted).toBe(true); - } finally { - AbortSignal.prototype.addEventListener = originalAddEventListener; - } - }, - ); + // Cleanup signal should exist and be aborted after disposal + expect(cleanupSignal).not.toBeNull(); + expect(cleanupSignal!.aborted).toBe(true); + } finally { + AbortSignal.prototype.addEventListener = originalAddEventListener; + } + }); - test.sequential( - "removes parent abort listener via signal option for cleanup", - async () => { - // This test verifies that child runs use `signal: requestController.signal` - // for parent abort listener cleanup. When a child completes, the listener - // on parent.requestSignal should be removed automatically. + test.sequential("removes parent abort listener via signal option for cleanup", async () => { + // This test verifies that child runs use `signal: requestController.signal` + // for parent abort listener cleanup. When a child completes, the listener + // on parent.requestSignal should be removed automatically. - await using run = createRun(); + await using run = createRun(); - let cleanupSignal: AbortSignal | null = null; - // eslint-disable-next-line @typescript-eslint/unbound-method - const originalAddEventListener = AbortSignal.prototype.addEventListener; + let cleanupSignal: AbortSignal | null = null; + // eslint-disable-next-line @typescript-eslint/unbound-method + const originalAddEventListener = AbortSignal.prototype.addEventListener; - // We need to capture the parent's requestSignal to identify the right listener - let parentRequestSignal: AbortSignal | null = null; + // We need to capture the parent's requestSignal to identify the right listener + let parentRequestSignal: AbortSignal | null = null; - AbortSignal.prototype.addEventListener = function ( - ...args: Parameters + AbortSignal.prototype.addEventListener = function ( + ...args: Parameters + ) { + const [type, , options] = args; + // The parent abort listener is registered on parent.requestSignal + if ( + type === "abort" && + this === parentRequestSignal && + options && + typeof options === "object" && + options.signal ) { - const [type, , options] = args; - // The parent abort listener is registered on parent.requestSignal - if ( - type === "abort" && - this === parentRequestSignal && - options && - typeof options === "object" && - options.signal - ) { - cleanupSignal = options.signal; - } - originalAddEventListener.apply(this, args); - }; + cleanupSignal = options.signal; + } + originalAddEventListener.apply(this, args); + }; - try { - // First, we need to get access to the parent's internal requestSignal - // We do this by spawning a child that captures it - await run((childRun) => { - // The child registers a listener on parent.requestSignal - // We can identify it by checking what signal addEventListener is called on - // The parent's requestSignal is internal, but we can use a trick: - // spawn another child and that child will register on childRun's requestSignal - parentRequestSignal = ( - childRun as never as { requestSignal: AbortSignal } - ).requestSignal; - - const childFiber = childRun(() => ok(42)); - return childFiber; - }); + try { + // First, we need to get access to the parent's internal requestSignal + // We do this by spawning a child that captures it + await run((childRun) => { + // The child registers a listener on parent.requestSignal + // We can identify it by checking what signal addEventListener is called on + // The parent's requestSignal is internal, but we can use a trick: + // spawn another child and that child will register on childRun's requestSignal + parentRequestSignal = ( + childRun as never as { requestSignal: AbortSignal } + ).requestSignal; + + const childFiber = childRun(() => ok(42)); + return childFiber; + }); - // Cleanup signal should exist and be aborted after child disposal - expect(cleanupSignal).not.toBeNull(); - expect(cleanupSignal!.aborted).toBe(true); - } finally { - AbortSignal.prototype.addEventListener = originalAddEventListener; - } - }, - ); + // Cleanup signal should exist and be aborted after child disposal + expect(cleanupSignal).not.toBeNull(); + expect(cleanupSignal!.aborted).toBe(true); + } finally { + AbortSignal.prototype.addEventListener = originalAddEventListener; + } + }); }); describe("create", () => { From beb0aa70434adaba67ed60a0731c90ac3278bafd Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 07:36:18 +0100 Subject: [PATCH 20/24] feat: Update dependencies across packages and examples, add the Astro example, and improve resource handling in common resources. --- bun.lock | 1985 ++++++++++++----------- examples/angular-vite-pwa/package.json | 6 +- examples/react-expo/package.json | 2 +- examples/svelte-vite-pwa/package.json | 2 +- examples/vue-vite-pwa/package.json | 2 +- package.json | 2 +- packages/common/package.json | 4 +- packages/common/src/Resources.ts | 3 +- packages/common/src/local-first/Sync.ts | 21 +- packages/svelte/package.json | 4 +- packages/vue/package.json | 2 +- 11 files changed, 1092 insertions(+), 941 deletions(-) diff --git a/bun.lock b/bun.lock index 2814b9f8c..a271cd95a 100644 --- a/bun.lock +++ b/bun.lock @@ -7,25 +7,14 @@ "devDependencies": { "@biomejs/biome": "^2.4.5", "@changesets/cli": "^2.29.8", - "@eslint/js": "^10.0.1", - "@types/inquirer": "^9.0.9", - "@typescript-eslint/parser": "^8.56.1", "@vitest/browser": "^4.0.18", "@vitest/browser-playwright": "^4.0.18", + "@vitest/coverage-istanbul": "^4.0.18", "@vitest/coverage-v8": "^4.0.18", - "eslint": "^10.0.2", - "eslint-plugin-jsdoc": "^62.7.1", - "eslint-plugin-react-hooks": "^7.0.1", - "prettier": "^3.8.1", - "prettier-plugin-embed": "^0.5.1", - "prettier-plugin-jsdoc": "^1.8.0", - "prettier-plugin-sql-cst": "^0.18.0", - "prettier-plugin-tailwindcss": "^0.7.2", - "turbo": "^2.8.12", + "turbo": "^2.8.16", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.56.1", "vitest": "^4.0.18", }, }, @@ -33,109 +22,67 @@ "name": "@evolu/relay", "version": "2.0.8", "dependencies": { - "@evolu/common": "*", - "@evolu/nodejs": "*", + "@evolu/common": "workspace:*", + "@evolu/nodejs": "workspace:*", }, "devDependencies": { - "@evolu/typescript-config": "*", - "@types/node": "^24.10.9", + "@evolu/tsconfig": "workspace:*", + "@types/node": "^25.3.3", "typescript": "^5.9.3", }, }, - "apps/web": { - "name": "web", - "version": "2.0.0", - "dependencies": { - "@algolia/autocomplete-core": "^1.19.4", - "@emotion/is-prop-valid": "^1.4.0", - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/react-web": "*", - "@evolu/sqlite-wasm": "2.2.4", - "@evolu/web": "*", - "@headlessui/react": "^2.2.9", - "@headlessui/tailwindcss": "^0.2.2", - "@mdx-js/loader": "^3.1.1", - "@mdx-js/mdx": "^3.1.1", - "@mdx-js/react": "^3.1.1", - "@next/mdx": "^16.1.3", - "@sindresorhus/slugify": "^3.0.0", - "@tabler/icons-react": "^3.36.1", - "@tailwindcss/forms": "^0.5.11", - "@tailwindcss/postcss": "^4.1.18", - "@tailwindcss/typography": "^0.5.19", - "acorn": "^8.15.0", - "clsx": "^2.1.1", - "fast-glob": "^3.3.3", - "flexsearch": "^0.8.212", - "mdast-util-to-string": "^4.0.0", - "mdx-annotations": "^0.1.4", - "motion": "^12.27.0", - "next": "^16.1.3", - "next-themes": "^0.4.6", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-highlight-words": "^0.21.0", - "remark": "^15.0.1", - "remark-gfm": "^4.0.1", - "remark-mdx": "^3.1.1", - "rss": "^1.2.2", - "shiki": "^4.0.0", - "simple-functional-loader": "^1.2.1", - "tailwindcss": "^4.1.18", - "typescript": "^5.9.3", - "unist-util-filter": "^5.0.1", - "unist-util-visit": "^5.0.0", - "zustand": "^5.0.10", - }, - "devDependencies": { - "@evolu/typescript-config": "*", - "@types/mdx": "^2.0.13", - "@types/node": "^24.10.9", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@types/react-highlight-words": "^0.20.1", - "@types/rss": "^0.0.32", - "cross-env": "^10.1.0", - "sharp": "^0.34.5", - }, - }, "examples/angular-vite-pwa": { "name": "@example/angular-vite-pwa", "version": "0.0.0", "dependencies": { - "@angular/core": "^21.1.0", - "@angular/platform-browser": "^21.1.0", - "@evolu/common": "*", - "@evolu/web": "*", + "@angular/core": "^21.2.2", + "@angular/platform-browser": "^21.2.2", + "@evolu/common": "workspace:*", + "@evolu/web": "workspace:*", }, "devDependencies": { - "@analogjs/vite-plugin-angular": "^2.2.2", - "@angular/build": "^21.1.0", - "@angular/compiler-cli": "^21.1.0", - "@tailwindcss/vite": "^4.1.18", + "@analogjs/vite-plugin-angular": "^2.3.1", + "@angular/build": "^21.2.1", + "@angular/compiler-cli": "^21.2.2", + "@tailwindcss/vite": "^4.2.1", "@vite-pwa/assets-generator": "^1.0.2", - "tailwindcss": "^4.1.18", + "tailwindcss": "^4.2.1", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", }, }, + "examples/astro": { + "name": "@example/astro", + "version": "0.0.0", + "dependencies": { + "@astrojs/react": "^4.4.2", + "@evolu/astro": "workspace:*", + "astro": "^5.14.5", + "react": "19.2.4", + "react-dom": "19.2.4", + }, + "devDependencies": { + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "typescript": "^5.9.3", + }, + }, "examples/react-electron": { "name": "@example/react-electron", "version": "0.0.0", "dependencies": { - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/react-web": "*", - "react": "^19.2.4", - "react-dom": "^19.2.4", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "react": "19.2.4", + "react-dom": "19.2.4", }, "devDependencies": { - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.1.2", - "electron": "^40.6.1", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "@vitejs/plugin-react": "^5.1.4", + "electron": "40.7.0", "electron-builder": "^26.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", @@ -148,34 +95,45 @@ "version": "1.0.0", "dependencies": { "@blazejkustra/react-native-alert": "^1.0.0", - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/react-native": "*", - "@expo/metro-runtime": "~55.0.6", - "@expo/vector-icons": "^15.0.3", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-native": "workspace:*", + "@expo/metro-runtime": "^55.0.6", + "@expo/vector-icons": "^15.1.1", + "abort-signal-polyfill": "^1.0.0", "babel-plugin-module-resolver": "^5.0.2", - "babel-preset-expo": "~55.0.8", - "expo": "^55.0.4", - "expo-constants": "~55.0.7", - "expo-font": "~55.0.4", - "expo-linking": "~55.0.7", - "expo-router": "~55.0.3", + "expo": "^55.0.5", + "expo-constants": "^55.0.7", + "expo-font": "^55.0.4", + "expo-linking": "^55.0.7", + "expo-router": "^55.0.4", "expo-secure-store": "~55.0.8", "expo-splash-screen": "~55.0.10", "expo-sqlite": "~55.0.10", - "react": "19.2.0", - "react-native": "0.83.2", + "react": "19.2.4", + "react-dom": "19.2.4", + "react-native": "0.84.1", "react-native-nitro-modules": "0.34.1", - "react-native-quick-crypto": "^1.0.15", - "react-native-safe-area-context": "~5.6.2", - "react-native-screens": "~4.23.0", + "react-native-quick-crypto": "^1.0.16", + "react-native-safe-area-context": "^5.7.0", + "react-native-screens": "^4.24.0", "react-native-svg": "15.15.3", + "react-native-web": "^0.21.0", + "set.prototype.difference": "^1.1.7", + "set.prototype.intersection": "^1.1.8", + "set.prototype.isdisjointfrom": "^1.1.5", + "set.prototype.issubsetof": "^1.1.4", + "set.prototype.issupersetof": "^1.1.3", + "set.prototype.symmetricdifference": "^1.1.3", + "set.prototype.union": "^1.1.3", }, "devDependencies": { + "@babel/core": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.6", "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@types/react": "^19.2.14", + "@types/react": "~19.2.14", + "babel-preset-expo": "^55.0.10", "typescript": "^5.9.3", }, }, @@ -183,23 +141,23 @@ "name": "@example/react-nextjs", "version": "0.1.0", "dependencies": { - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/react-web": "*", - "@tabler/icons-react": "^3.36.1", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "@tabler/icons-react": "^3.37.1", "clsx": "^2.1.1", "next": "^16.1.3", - "react": "^19.2.4", - "react-dom": "^19.2.4", + "react": "19.2.4", + "react-dom": "19.2.4", }, "devDependencies": { "@tailwindcss/forms": "^0.5.11", - "@tailwindcss/postcss": "^4.1.18", - "@types/node": "^24.10.9", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "postcss": "^8.5.6", - "tailwindcss": "^4.1.18", + "@tailwindcss/postcss": "^4.2.1", + "@types/node": "^25.3.3", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", "typescript": "^5.9.3", }, }, @@ -207,23 +165,22 @@ "name": "@example/react-vite-pwa", "version": "0.0.0", "dependencies": { - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/react-web": "*", - "@tabler/icons-react": "^3.36.1", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "@tabler/icons-react": "^3.37.1", "clsx": "^2.1.1", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "tailwindcss": "^4.1.18", + "react": "19.2.4", + "react-dom": "19.2.4", + "tailwindcss": "^4.2.1", }, "devDependencies": { "@tailwindcss/forms": "^0.5.11", - "@tailwindcss/vite": "^4.1.18", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", + "@tailwindcss/vite": "^4.2.1", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", "@vite-pwa/assets-generator": "^1.0.2", - "@vitejs/plugin-react": "^5.1.2", - "globals": "^17.3.0", + "@vitejs/plugin-react": "^5.1.4", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", @@ -235,37 +192,97 @@ "name": "@example/svelte-vite-pwa", "version": "0.0.0", "devDependencies": { - "@evolu/common": "*", - "@evolu/svelte": "*", - "@evolu/web": "*", + "@evolu/common": "workspace:*", + "@evolu/svelte": "workspace:*", + "@evolu/web": "workspace:*", "@sveltejs/vite-plugin-svelte": "^6.2.4", - "@tsconfig/svelte": "^5.0.6", - "svelte": "^5.48.2", - "svelte-check": "^4.3.6", + "@tsconfig/svelte": "^5.0.8", + "svelte": "^5.53.10", + "svelte-check": "^4.4.3", "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", }, }, + "examples/tanstack-start": { + "name": "@example/tanstack-start", + "version": "0.0.0", + "dependencies": { + "@evolu/tanstack-start": "workspace:*", + "@tanstack/react-router": "^1.166.2", + "react": "19.2.4", + "react-dom": "19.2.4", + }, + "devDependencies": { + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "@vitejs/plugin-react": "^5.1.4", + "typescript": "^5.9.3", + "vite": "^7.3.1", + }, + }, + "examples/tauri": { + "name": "@example/tauri", + "version": "0.0.0", + "dependencies": { + "@evolu/tauri": "workspace:*", + "@tauri-apps/api": "^2.8.0", + "react": "19.2.4", + "react-dom": "19.2.4", + }, + "devDependencies": { + "@tauri-apps/cli": "^2.10.1", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "@vitejs/plugin-react": "^5.1.4", + "typescript": "^5.9.3", + "vite": "^7.3.1", + }, + }, "examples/vue-vite-pwa": { "name": "@example/vue-vite-pwa", "version": "0.0.0", "dependencies": { - "@evolu/common": "*", - "@evolu/vue": "*", - "@evolu/web": "*", - "vue": "^3.5.26", + "@evolu/common": "workspace:*", + "@evolu/vue": "workspace:*", + "@evolu/web": "workspace:*", + "vue": "^3.5.30", "workbox-window": "^7.4.0", }, "devDependencies": { "@vite-pwa/assets-generator": "^1.0.2", - "@vitejs/plugin-vue": "^6.0.3", - "@vue/tsconfig": "^0.8.1", + "@vitejs/plugin-vue": "^6.0.4", + "@vue/tsconfig": "^0.9.0", "typescript": "^5.9.3", "vite": "^7.3.1", "vite-plugin-pwa": "^1.2.0", - "vue-tsc": "^3.2.2", + "vue-tsc": "^3.2.5", + }, + }, + "packages/astro": { + "name": "@evolu/astro", + "version": "0.1.0", + "devDependencies": { + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "typescript": "^5.9.3", + "vitest": "^4.0.18", + }, + }, + "packages/bun": { + "name": "@evolu/bun", + "version": "0.1.0", + "devDependencies": { + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "bun-types": "^1.3.9", + "typescript": "^5.9.3", + }, + "peerDependencies": { + "@evolu/common": "^7.4.1", }, }, "packages/common": { @@ -275,22 +292,19 @@ "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "@scure/bip39": "^2.0.1", - "kysely": "^0.28.10", - "msgpackr": "^1.11.8", - "random": "^5.4.1", + "kysely": "^0.28.11", + "msgpackr": "^1.11.9", + "zod": "^4.3.6", }, "devDependencies": { - "@bokuweb/zstd-wasm": "0.0.27", - "@evolu/typescript-config": "*", + "@bokuweb/zstd-wasm": "^0.0.27", "@types/better-sqlite3": "^7.6.13", "@types/ws": "^8.18.1", "better-sqlite3": "^12.6.2", - "fast-check": "^4.5.3", - "playwright": "^1.58.1", + "fast-check": "^4.6.0", + "playwright": "^1.58.2", "typescript": "^5.9.3", - "webpack": "^5.98.0", "ws": "^8.19.0", - "zod": "^4.3.6", }, }, "packages/nodejs": { @@ -301,10 +315,10 @@ "ws": "^8.19.0", }, "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", "@types/better-sqlite3": "^7.6.13", - "@types/node": "^24.10.9", + "@types/node": "^25.3.3", "@types/ws": "^8.18.1", "typescript": "^5.9.3", }, @@ -316,11 +330,11 @@ "name": "@evolu/react", "version": "10.4.0", "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "react": "^19.2.4", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "react": "19.2.4", "typescript": "^5.9.3", }, "peerDependencies": { @@ -332,10 +346,6 @@ "name": "@evolu/react-native", "version": "14.3.0", "dependencies": { - "array-from-async": "^3.0.0", - "array.prototype.tosorted": "^1.1.4", - "promise.try": "^2.0.1", - "promise.withresolvers": "^1.0.4", "set.prototype.difference": "^1.1.7", "set.prototype.intersection": "^1.1.8", "set.prototype.isdisjointfrom": "^1.1.5", @@ -345,18 +355,18 @@ "set.prototype.union": "^1.1.3", }, "devDependencies": { - "@evolu/common": "*", - "@evolu/react": "*", - "@evolu/typescript-config": "*", + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/tsconfig": "workspace:*", "@op-engineering/op-sqlite": "^15.2.2", - "@types/react": "^19.2.14", - "expo": "^55.0.4", + "@types/react": "~19.2.14", + "expo": "^55.0.5", "expo-secure-store": "~55.0.8", "expo-sqlite": "~55.0.10", - "react": "^19.2.4", - "react-native": "0.83.2", + "react": "19.2.4", + "react-native": "0.84.1", "react-native-nitro-modules": "0.34.1", - "react-native-sensitive-info": "6.0.0-rc.11", + "react-native-sensitive-info": "6.0.0-rc.12", "react-native-svg": "15.15.3", "typescript": "^5.9.3", }, @@ -368,10 +378,10 @@ "expo-secure-store": ">=55", "expo-sqlite": ">=55", "react": ">=19", - "react-native": ">=0.83", - "react-native-nitro-modules": ">=0.34", + "react-native": ">=0.84", + "react-native-nitro-modules": ">=0.34.1", "react-native-sensitive-info": ">=6", - "react-native-svg": ">=15.15", + "react-native-svg": ">=15", }, "optionalPeers": [ "@op-engineering/op-sqlite", @@ -387,13 +397,13 @@ "name": "@evolu/react-web", "version": "2.4.0", "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", - "@evolu/web": "*", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "react": "^19.2.4", - "react-dom": "^19.2.4", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "@evolu/web": "workspace:*", + "@types/react": "~19.2.14", + "@types/react-dom": "~19.2.3", + "react": "19.2.4", + "react-dom": "19.2.4", "typescript": "^5.9.3", "user-agent-data-types": "^0.4.2", }, @@ -408,36 +418,60 @@ "name": "@evolu/svelte", "version": "2.4.0", "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", - "@evolu/web": "*", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "@evolu/web": "workspace:*", "@sveltejs/package": "^2.5.7", - "@tsconfig/svelte": "^5.0.6", - "svelte": "^5.48.2", - "svelte-check": "^4.3.6", + "@tsconfig/svelte": "^5.0.8", + "svelte": "^5.53.10", + "svelte-check": "^4.4.3", "typescript": "^5.9.3", }, "peerDependencies": { "@evolu/common": "^7.4.1", "@evolu/web": "^2.4.0", - "svelte": ">=5", + "svelte": ">=5.53.10", + }, + }, + "packages/tanstack-start": { + "name": "@evolu/tanstack-start", + "version": "0.1.0", + "devDependencies": { + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "typescript": "^5.9.3", + "vitest": "^4.0.18", + }, + }, + "packages/tauri": { + "name": "@evolu/tauri", + "version": "0.1.0", + "devDependencies": { + "@evolu/common": "workspace:*", + "@evolu/react": "workspace:*", + "@evolu/react-web": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "typescript": "^5.9.3", + "vitest": "^4.0.18", }, }, - "packages/typescript-config": { - "name": "@evolu/typescript-config", + "packages/tsconfig": { + "name": "@evolu/tsconfig", "version": "0.0.2", }, "packages/vue": { "name": "@evolu/vue", "version": "1.4.0", "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", "typescript": "^5.9.3", }, "peerDependencies": { "@evolu/common": "^7.4.1", - "vue": ">=3.5.24", + "vue": ">=3.5.30", }, }, "packages/web": { @@ -448,9 +482,9 @@ "idb-keyval": "^6.2.2", }, "devDependencies": { - "@evolu/common": "*", - "@evolu/typescript-config": "*", - "@types/sharedworker": "^0.0.221", + "@evolu/common": "workspace:*", + "@evolu/tsconfig": "workspace:*", + "@types/sharedworker": "^0.0.222", "@types/web-locks-api": "^0.0.5", "typescript": "^5.9.3", "user-agent-data-types": "^0.4.2", @@ -460,46 +494,27 @@ }, }, }, - "patchedDependencies": { - "@changesets/assemble-release-plan@6.0.9": "patches/@changesets__assemble-release-plan.patch", + "trustedDependencies": [ + "lmdb", + "esbuild", + "@tailwindcss/oxide", + "@biomejs/biome", + "sharp", + "@parcel/watcher", + "electron-winstaller", + "electron", + "better-sqlite3", + "msgpackr-extract", + "react-native-nitro-modules", + ], + "overrides": { + "serialize-javascript": "^7.0.3", + "svgo": "^4.0.1", + "tar": "^7.5.10", }, "packages": { "7zip-bin": ["7zip-bin@5.2.0", "", {}, "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A=="], - "@algolia/abtesting": ["@algolia/abtesting@1.15.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw=="], - - "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.19.6", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.6", "@algolia/autocomplete-shared": "1.19.6" } }, "sha512-6EoD7PeM2WBq5GY1jm0gGonDW2JVU4BaHT9tAwDcaPkc6gYIRZeY7X7aFuwdRvk9R/jwsh8sz4flDao0+Kua6g=="], - - "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.19.6", "", { "dependencies": { "@algolia/autocomplete-shared": "1.19.6" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-VD53DBixhEwDvOB00D03DtBVhh5crgb1N0oH3QTscfYk4TpBH+CKrwmN/XrN/VdJAdP+4K6SgwLii/3OwM9dHw=="], - - "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.19.6", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-DG1n2B6XQw6DWB5veO4RuzQ/N2oGNpG+sSzGT7gUbi7WhF+jN57abcv2QhB5flXZ0NgddE1i6h7dZuQmYBEorQ=="], - - "@algolia/client-abtesting": ["@algolia/client-abtesting@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw=="], - - "@algolia/client-analytics": ["@algolia/client-analytics@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g=="], - - "@algolia/client-common": ["@algolia/client-common@5.49.1", "", {}, "sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg=="], - - "@algolia/client-insights": ["@algolia/client-insights@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g=="], - - "@algolia/client-personalization": ["@algolia/client-personalization@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w=="], - - "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg=="], - - "@algolia/client-search": ["@algolia/client-search@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA=="], - - "@algolia/ingestion": ["@algolia/ingestion@1.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ=="], - - "@algolia/monitoring": ["@algolia/monitoring@1.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw=="], - - "@algolia/recommend": ["@algolia/recommend@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw=="], - - "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA=="], - - "@algolia/requester-fetch": ["@algolia/requester-fetch@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw=="], - - "@algolia/requester-node-http": ["@algolia/requester-node-http@5.49.1", "", { "dependencies": { "@algolia/client-common": "5.49.1" } }, "sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA=="], - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], @@ -516,14 +531,26 @@ "@angular/compiler": ["@angular/compiler@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-FxWaSaii1vfHIFA+JksqQ8NGB2frfqCrs7Ju50a44kbwR4fmanfn/VsiS/CbwBp9vcyT/Br9X/jAG4RuK/U2nw=="], - "@angular/compiler-cli": ["@angular/compiler-cli@21.2.1", "", { "dependencies": { "@babel/core": "7.29.0", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^18.0.0" }, "peerDependencies": { "@angular/compiler": "21.2.1", "typescript": ">=5.9 <6.1" }, "optionalPeers": ["typescript"], "bin": { "ngc": "bundles/src/bin/ngc.js", "ng-xi18n": "bundles/src/bin/ng_xi18n.js" } }, "sha512-qYCWLGtEju4cDtYLi4ZzbwKoF0lcGs+Lc31kuESvAzYvWNgk2EUOtwWo8kbgpAzAwSYodtxW6Q90iWEwfU6elw=="], + "@angular/compiler-cli": ["@angular/compiler-cli@21.2.2", "", { "dependencies": { "@babel/core": "7.29.0", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^18.0.0" }, "peerDependencies": { "@angular/compiler": "21.2.2", "typescript": ">=5.9 <6.1" }, "optionalPeers": ["typescript"], "bin": { "ngc": "bundles/src/bin/ngc.js", "ng-xi18n": "bundles/src/bin/ng_xi18n.js" } }, "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ=="], - "@angular/core": ["@angular/core@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/compiler": "21.2.1", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, "optionalPeers": ["@angular/compiler", "zone.js"] }, "sha512-pFTbg03s2ZI5cHNT+eWsGjwIIKiYkeAnodFbCAHjwFi9KCEYlTykFLjr9lcpGrBddfmAH7GE08Q73vgmsdcNHw=="], + "@angular/core": ["@angular/core@21.2.2", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/compiler": "21.2.2", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, "optionalPeers": ["@angular/compiler", "zone.js"] }, "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg=="], - "@angular/platform-browser": ["@angular/platform-browser@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "21.2.1", "@angular/common": "21.2.1", "@angular/core": "21.2.1" }, "optionalPeers": ["@angular/animations"] }, "sha512-k4SJLxIaLT26vLjLuFL+ho0BiG5PrdxEsjsXFC7w5iUhomeouzkHVTZ4t7gaLNKrdRD7QNtU4Faw0nL0yx0ZPQ=="], + "@angular/platform-browser": ["@angular/platform-browser@21.2.2", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "21.2.2", "@angular/common": "21.2.2", "@angular/core": "21.2.2" }, "optionalPeers": ["@angular/animations"] }, "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g=="], "@apideck/better-ajv-errors": ["@apideck/better-ajv-errors@0.3.6", "", { "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "peerDependencies": { "ajv": ">=8" } }, "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA=="], + "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], + + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="], + + "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="], + + "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], + + "@astrojs/react": ["@astrojs/react@4.4.2", "", { "dependencies": { "@vitejs/plugin-react": "^4.7.0", "ultrahtml": "^1.6.0", "vite": "^6.4.1" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ=="], + + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="], + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], @@ -800,6 +827,8 @@ "@canvas/image-data": ["@canvas/image-data@1.1.0", "", {}, "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA=="], + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="], + "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="], "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], @@ -860,16 +889,6 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.4.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw=="], - - "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], - - "@epic-web/invariant": ["@epic-web/invariant@1.0.0", "", {}, "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA=="], - - "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.84.0", "", { "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.54.0", "comment-parser": "1.4.5", "esquery": "^1.7.0", "jsdoc-type-pratt-parser": "~7.1.1" } }, "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w=="], - - "@es-joy/resolve.exports": ["@es-joy/resolve.exports@1.2.0", "", {}, "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -922,21 +941,9 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - - "@eslint/config-array": ["@eslint/config-array@0.23.3", "", { "dependencies": { "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw=="], - - "@eslint/config-helpers": ["@eslint/config-helpers@0.5.3", "", { "dependencies": { "@eslint/core": "^1.1.1" } }, "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw=="], + "@evolu/astro": ["@evolu/astro@workspace:packages/astro"], - "@eslint/core": ["@eslint/core@1.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ=="], - - "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], - - "@eslint/object-schema": ["@eslint/object-schema@3.0.3", "", {}, "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.1", "", { "dependencies": { "@eslint/core": "^1.1.1", "levn": "^0.4.1" } }, "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ=="], + "@evolu/bun": ["@evolu/bun@workspace:packages/bun"], "@evolu/common": ["@evolu/common@workspace:packages/common"], @@ -954,7 +961,11 @@ "@evolu/svelte": ["@evolu/svelte@workspace:packages/svelte"], - "@evolu/typescript-config": ["@evolu/typescript-config@workspace:packages/typescript-config"], + "@evolu/tanstack-start": ["@evolu/tanstack-start@workspace:packages/tanstack-start"], + + "@evolu/tauri": ["@evolu/tauri@workspace:packages/tauri"], + + "@evolu/tsconfig": ["@evolu/tsconfig@workspace:packages/tsconfig"], "@evolu/vue": ["@evolu/vue@workspace:packages/vue"], @@ -962,6 +973,8 @@ "@example/angular-vite-pwa": ["@example/angular-vite-pwa@workspace:examples/angular-vite-pwa"], + "@example/astro": ["@example/astro@workspace:examples/astro"], + "@example/react-electron": ["@example/react-electron@workspace:examples/react-electron"], "@example/react-expo": ["@example/react-expo@workspace:examples/react-expo"], @@ -972,6 +985,10 @@ "@example/svelte-vite-pwa": ["@example/svelte-vite-pwa@workspace:examples/svelte-vite-pwa"], + "@example/tanstack-start": ["@example/tanstack-start@workspace:examples/tanstack-start"], + + "@example/tauri": ["@example/tauri@workspace:examples/tauri"], + "@example/vue-vite-pwa": ["@example/vue-vite-pwa@workspace:examples/vue-vite-pwa"], "@expo-google-fonts/material-symbols": ["@expo-google-fonts/material-symbols@0.4.25", "", {}, "sha512-MlwOpcYPLYu2+aDAwqv29l3sknNNxA36Jcu07Tg9+MTEvXk2SPcO8eQmwwDeVBbv5Wb6ToD1LmE+e0lLv/9WvA=="], @@ -1036,81 +1053,59 @@ "@expo/xcpretty": ["@expo/xcpretty@4.4.1", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg=="], - "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], - - "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], - - "@floating-ui/react": ["@floating-ui/react@0.26.28", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw=="], - - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], - - "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], - "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.23.0", "", { "dependencies": { "@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" } }, "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg=="], "@harperfast/extended-iterable": ["@harperfast/extended-iterable@1.0.3", "", {}, "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw=="], - "@headlessui/react": ["@headlessui/react@2.2.9", "", { "dependencies": { "@floating-ui/react": "^0.26.16", "@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" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ=="], - - "@headlessui/tailwindcss": ["@headlessui/tailwindcss@0.2.2", "", { "peerDependencies": { "tailwindcss": "^3.0 || ^4.0" } }, "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw=="], - - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], @@ -1180,12 +1175,6 @@ "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], - "@mdx-js/loader": ["@mdx-js/loader@3.1.1", "", { "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" }, "peerDependencies": { "webpack": ">=5" }, "optionalPeers": ["webpack"] }, "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ=="], - - "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@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" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - - "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], - "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], @@ -1238,8 +1227,6 @@ "@next/env": ["@next/env@16.1.6", "", {}, "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ=="], - "@next/mdx": ["@next/mdx@16.1.6", "", { "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "optionalPeers": ["@mdx-js/loader", "@mdx-js/react"] }, "sha512-PT5JR4WPPYOls7WD6xEqUVVI9HDY8kY7XLQsNYB2lSZk5eJSXWu3ECtIYmfR0hZpx8Sg7BKZYKi2+u5OTSEx0w=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw=="], "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ=="], @@ -1272,6 +1259,8 @@ "@op-engineering/op-sqlite": ["@op-engineering/op-sqlite@15.2.5", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-Vmgwt0AzY7qoge3X6EONhsb5NlM2yoQUF0/lseUWBelfc9BUili7/DFsFsS73cvtYWlwPpqeTGOoce5mzHozBw=="], + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], + "@oxc-project/types": ["@oxc-project/types@0.113.0", "", {}, "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA=="], "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], @@ -1350,23 +1339,15 @@ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@react-aria/focus": ["@react-aria/focus@3.21.5", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q=="], - - "@react-aria/interactions": ["@react-aria/interactions@3.27.1", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw=="], - - "@react-aria/ssr": ["@react-aria/ssr@3.9.10", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ=="], - - "@react-aria/utils": ["@react-aria/utils@3.33.1", "", { "dependencies": { "@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-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w=="], - - "@react-native/assets-registry": ["@react-native/assets-registry@0.83.2", "", {}, "sha512-9I5l3pGAKnlpQ15uVkeB9Mgjvt3cZEaEc8EDtdexvdtZvLSjtwBzgourrOW4yZUijbjJr8h3YO2Y0q+THwUHTA=="], + "@react-native/assets-registry": ["@react-native/assets-registry@0.84.1", "", {}, "sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg=="], "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.83.2", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.83.2" } }, "sha512-XbcN/BEa64pVlb0Hb/E/Ph2SepjVN/FcNKrJcQvtaKZA6mBSO8pW8Eircdlr61/KBH94LihHbQoQDzkQFpeaTg=="], "@react-native/babel-preset": ["@react-native/babel-preset@0.83.2", "", { "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" } }, "sha512-X/RAXDfe6W+om/Fw1i6htTxQXFhBJ2jgNOWx3WpI3KbjeIWbq7ib6vrpTeIAW2NUMg+K3mML1NzgD4dpZeqdjA=="], - "@react-native/codegen": ["@react-native/codegen@0.83.2", "", { "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" } }, "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA=="], + "@react-native/codegen": ["@react-native/codegen@0.84.1", "", { "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" } }, "sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA=="], - "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.83.2", "", { "dependencies": { "@react-native/dev-middleware": "0.83.2", "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" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-sTEF0eiUKtmImEP07Qo5c3Khvm1LIVX1Qyb6zWUqPL6W3MqFiXutZvKBjqLz6p49Szx8cplQLoXfLHT0bcDXKg=="], + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.84.1", "", { "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" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ=="], "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.83.2", "", {}, "sha512-t4fYfa7xopbUF5S4+ihNEwgaq4wLZLKLY0Ms8z72lkMteVd3bOX2Foxa8E2wTfRvdhPOkSpOsTeNDmD8ON4DoQ=="], @@ -1374,13 +1355,13 @@ "@react-native/dev-middleware": ["@react-native/dev-middleware@0.83.2", "", { "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" } }, "sha512-Zi4EVaAm28+icD19NN07Gh8Pqg/84QQu+jn4patfWKNkcToRFP5vPEbbp0eLOGWS+BVB1d1Fn5lvMrJsBbFcOg=="], - "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.83.2", "", {}, "sha512-PqN11fXRAU+uJ0inZY1HWYlwJOXHOhF4SPyeHBBxjajKpm2PGunmvFWwkmBjmmUkP/CNO0ezTUudV0oj+2wiHQ=="], + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.84.1", "", {}, "sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg=="], - "@react-native/js-polyfills": ["@react-native/js-polyfills@0.83.2", "", {}, "sha512-dk6fIY2OrKW/2Nk2HydfYNrQau8g6LOtd7NVBrgaqa+lvuRyIML5iimShP5qPqQnx2ofHuzjFw+Ya0b5Q7nDbA=="], + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.84.1", "", {}, "sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ=="], - "@react-native/normalize-colors": ["@react-native/normalize-colors@0.83.2", "", {}, "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q=="], + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.84.1", "", {}, "sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA=="], - "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.83.2", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-N7mRjHLW/+KWxMp9IHRWyE3VIkeG1m3PnZJAGEFLCN8VFb7e4VfI567o7tE/HYcdcXCylw+Eqhlciz8gDeQ71g=="], + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.84.1", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA=="], "@react-navigation/bottom-tabs": ["@react-navigation/bottom-tabs@7.15.5", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-wQHredlCrRmShWQ1vF4HUcLdaiJ8fUgnbaeQH7BJ7MQVQh4mdzab0IOY/4QSmUyNRB350oyu1biTycyQ5FKWMQ=="], @@ -1394,12 +1375,6 @@ "@react-navigation/routers": ["@react-navigation/routers@7.5.3", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg=="], - "@react-stately/flags": ["@react-stately/flags@3.1.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg=="], - - "@react-stately/utils": ["@react-stately/utils@3.11.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw=="], - - "@react-types/shared": ["@react-types/shared@3.33.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.4", "", { "os": "android", "cpu": "arm64" }, "sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w=="], "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q=="], @@ -1436,7 +1411,7 @@ "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], - "@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], @@ -1492,32 +1467,24 @@ "@scure/bip39": ["@scure/bip39@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1", "@scure/base": "2.0.0" } }, "sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg=="], - "@shikijs/core": ["@shikijs/core@4.0.1", "", { "dependencies": { "@shikijs/primitive": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg=="], - - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg=="], + "@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-oCWdCTDch3J8Kc0OZJ98KuUPC02O1VqIE3W/e2uvrHqTxYRR21RGEJMtchrgrxhsoJJCzmIciKsqG+q/yD+Cxg=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="], - "@shikijs/langs": ["@shikijs/langs@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1" } }, "sha512-v/mluaybWdnGJR4GqAR6zh8qAZohW9k+cGYT28Y7M8+jLbC0l4yG085O1A+WkseHTn+awd+P3UBymb2+MXFc8w=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], - "@shikijs/primitive": ["@shikijs/primitive@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ns0hHZc5eWZuvuIEJz2pTx3Qecz0aRVYumVQJ8JgWY2tq/dH8WxdcVM49Fc2NsHEILNIT6vfdW9MF26RANWiTA=="], + "@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], - "@shikijs/themes": ["@shikijs/themes@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1" } }, "sha512-FW41C/D6j/yKQkzVdjrRPiJCtgeDaYRJFEyCKFCINuRJRj9WcmubhP4KQHPZ4+9eT87jruSrYPyoblNRyDFzvA=="], + "@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], - "@shikijs/types": ["@shikijs/types@4.0.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-EaygPEn57+jJ76mw+nTLvIpJMAcMPokFbrF8lufsZP7Ukk+ToJYEcswN1G0e49nUZAq7aCQtoeW219A8HK1ZOw=="], + "@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], "@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="], - "@sindresorhus/base62": ["@sindresorhus/base62@1.0.0", "", {}, "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA=="], - "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], - "@sindresorhus/slugify": ["@sindresorhus/slugify@3.0.0", "", { "dependencies": { "@sindresorhus/transliterate": "^2.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-SCrKh1zS96q+CuH5GumHcyQEVPsM4Ve8oE0E6tw7AAhGq50K8ojbTUOQnX/j9Mhcv/AXiIsbCfquovyGOo5fGw=="], - - "@sindresorhus/transliterate": ["@sindresorhus/transliterate@2.3.1", "", {}, "sha512-gVaaGtKYMYAMmI8buULVH3A2TXVJ98QiwGwI7ddrWGuGidGC2uRt4FHs22+8iROJ0QTzju9CuMjlVsrvpqsdhA=="], - "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], @@ -1574,13 +1541,43 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], - "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], - "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.21", "", { "dependencies": { "@tanstack/virtual-core": "3.13.21" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-SYXFrmrbPgXBvf+HsOsKhFgqSe4M6B29VHOsX9Jih9TlNkNkDWx0hWMiMLUghMEzyUz772ndzdEeCEBx+3GIZw=="], + "@tanstack/history": ["@tanstack/history@1.161.4", "", {}, "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.166.7", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.166.7", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-LLcXu2nrCn2WL+w0YAbg3CRZIIO2cYVSC3y+ZYlFBxBs4hh8eoNP1EWFvRLZGCFYpqON7x6qUf1u0W7tH0cJJw=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.9.2", "", { "dependencies": { "@tanstack/store": "0.9.2", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.166.7", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-MCc8wYIIcxmbeidM8PL2QeaAjUIHyhEDIZPW6NGfn/uwvyi+K2ucn3AGCxxcXl4JGGm0Mx9+7buYl1v3HdcFrg=="], + + "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], + + "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="], + + "@tauri-apps/cli": ["@tauri-apps/cli@2.10.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.10.1", "@tauri-apps/cli-darwin-x64": "2.10.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", "@tauri-apps/cli-linux-arm64-musl": "2.10.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-musl": "2.10.1", "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", "@tauri-apps/cli-win32-x64-msvc": "2.10.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g=="], + + "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.10.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ=="], + + "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.10.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw=="], - "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.21", "", {}, "sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw=="], + "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.10.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w=="], + + "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA=="], + + "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg=="], + + "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.10.1", "", { "os": "linux", "cpu": "none" }, "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw=="], + + "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw=="], + + "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ=="], + + "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.10.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg=="], + + "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.10.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw=="], + + "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.10.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg=="], "@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], @@ -1606,16 +1603,8 @@ "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], - - "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], - - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], - "@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], @@ -1624,25 +1613,21 @@ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="], - "@types/inquirer": ["@types/inquirer@9.0.9", "", { "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw=="], - "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], + + "@types/node": ["@types/node@25.4.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw=="], "@types/plist": ["@types/plist@3.0.5", "", { "dependencies": { "@types/node": "*", "xmlbuilder": ">=11.0.1" } }, "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA=="], @@ -1650,20 +1635,14 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], - "@types/react-highlight-words": ["@types/react-highlight-words@0.20.1", "", { "dependencies": { "@types/react": "*" } }, "sha512-EgF6RaoibBurIhxk3X3d5xL0uMqjD7KtShvZ8S+d7/o6xZ+mQ4rct1a2E49vWA9r63OzrHCIyghqvQHASb/ERw=="], - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], - "@types/rss": ["@types/rss@0.0.32", "", {}, "sha512-2oKNqKyUY4RSdvl5eZR1n2Q9yvw3XTe3mQHsFPn9alaNBxfPnbXBtGP8R0SV8pK1PrVnLul0zx7izbm5/gF5Qw=="], - - "@types/sharedworker": ["@types/sharedworker@0.0.221", "", {}, "sha512-SZabQSTltxflklf3aJrFZrZf5h099r5IENsvv3a5pi+NKPyv8osnWsPLjrQsbiMrVlhv80MOCzY8sOsfEZwN1A=="], + "@types/sharedworker": ["@types/sharedworker@0.0.222", "", {}, "sha512-lljdQbVNIuPDIWPrgRcIcTR1tbfzU9iB07xyG6XS5oOWLufdCY5w7iReGgrVWYsUIBr0rwlAvicUbZtdISf5Cg=="], "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], - "@types/through": ["@types/through@0.0.33", "", { "dependencies": { "@types/node": "*" } }, "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ=="], - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -1680,26 +1659,6 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.56.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/type-utils": "8.56.1", "@typescript-eslint/utils": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.56.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.56.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg=="], - - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.56.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.1", "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1" } }, "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w=="], - - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.56.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/utils": "8.56.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@8.56.1", "", {}, "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.56.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.56.1", "@typescript-eslint/tsconfig-utils": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.56.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.1", "", { "dependencies": { "@typescript-eslint/types": "8.56.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw=="], - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], "@vite-pwa/assets-generator": ["@vite-pwa/assets-generator@1.0.2", "", { "dependencies": { "cac": "^6.7.14", "colorette": "^2.0.20", "consola": "^3.4.2", "sharp": "^0.33.5", "sharp-ico": "^0.1.5", "unconfig": "^7.3.1" }, "bin": { "pwa-assets-generator": "bin/pwa-assets-generator.mjs" } }, "sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg=="], @@ -1714,6 +1673,8 @@ "@vitest/browser-playwright": ["@vitest/browser-playwright@4.0.18", "", { "dependencies": { "@vitest/browser": "4.0.18", "@vitest/mocker": "4.0.18", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "playwright": "*", "vitest": "4.0.18" } }, "sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g=="], + "@vitest/coverage-istanbul": ["@vitest/coverage-istanbul@4.0.18", "", { "dependencies": { "@istanbuljs/schema": "^0.1.3", "@jridgewell/gen-mapping": "^0.3.13", "@jridgewell/trace-mapping": "0.3.31", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "vitest": "4.0.18" } }, "sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ=="], + "@vitest/coverage-v8": ["@vitest/coverage-v8@4.0.18", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.0.18", "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", "std-env": "^3.10.0", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "@vitest/browser": "4.0.18", "vitest": "4.0.18" }, "optionalPeers": ["@vitest/browser"] }, "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg=="], "@vitest/expect": ["@vitest/expect@4.0.18", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ=="], @@ -1736,90 +1697,54 @@ "@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="], - "@vue/compiler-core": ["@vue/compiler-core@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw=="], + "@vue/compiler-core": ["@vue/compiler-core@3.5.30", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.30", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw=="], - "@vue/compiler-dom": ["@vue/compiler-dom@3.5.29", "", { "dependencies": { "@vue/compiler-core": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg=="], + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.30", "", { "dependencies": { "@vue/compiler-core": "3.5.30", "@vue/shared": "3.5.30" } }, "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g=="], - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/compiler-core": "3.5.29", "@vue/compiler-dom": "3.5.29", "@vue/compiler-ssr": "3.5.29", "@vue/shared": "3.5.29", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA=="], + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.30", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/compiler-core": "3.5.30", "@vue/compiler-dom": "3.5.30", "@vue/compiler-ssr": "3.5.30", "@vue/shared": "3.5.30", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.8", "source-map-js": "^1.2.1" } }, "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A=="], - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.29", "", { "dependencies": { "@vue/compiler-dom": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw=="], + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.30", "", { "dependencies": { "@vue/compiler-dom": "3.5.30", "@vue/shared": "3.5.30" } }, "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA=="], "@vue/language-core": ["@vue/language-core@3.2.5", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.0.0", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" } }, "sha512-d3OIxN/+KRedeM5wQ6H6NIpwS3P5gC9nmyaHgBk+rO6dIsjY+tOh4UlPpiZbAh3YtLdCGEX4M16RmsBqPmJV+g=="], - "@vue/reactivity": ["@vue/reactivity@3.5.29", "", { "dependencies": { "@vue/shared": "3.5.29" } }, "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA=="], - - "@vue/runtime-core": ["@vue/runtime-core@3.5.29", "", { "dependencies": { "@vue/reactivity": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg=="], - - "@vue/runtime-dom": ["@vue/runtime-dom@3.5.29", "", { "dependencies": { "@vue/reactivity": "3.5.29", "@vue/runtime-core": "3.5.29", "@vue/shared": "3.5.29", "csstype": "^3.2.3" } }, "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg=="], + "@vue/reactivity": ["@vue/reactivity@3.5.30", "", { "dependencies": { "@vue/shared": "3.5.30" } }, "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q=="], - "@vue/server-renderer": ["@vue/server-renderer@3.5.29", "", { "dependencies": { "@vue/compiler-ssr": "3.5.29", "@vue/shared": "3.5.29" }, "peerDependencies": { "vue": "3.5.29" } }, "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g=="], + "@vue/runtime-core": ["@vue/runtime-core@3.5.30", "", { "dependencies": { "@vue/reactivity": "3.5.30", "@vue/shared": "3.5.30" } }, "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg=="], - "@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.30", "", { "dependencies": { "@vue/reactivity": "3.5.30", "@vue/runtime-core": "3.5.30", "@vue/shared": "3.5.30", "csstype": "^3.2.3" } }, "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw=="], - "@vue/tsconfig": ["@vue/tsconfig@0.8.1", "", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g=="], + "@vue/server-renderer": ["@vue/server-renderer@3.5.30", "", { "dependencies": { "@vue/compiler-ssr": "3.5.30", "@vue/shared": "3.5.30" }, "peerDependencies": { "vue": "3.5.30" } }, "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ=="], - "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + "@vue/shared": ["@vue/shared@3.5.30", "", {}, "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ=="], - "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], - - "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], - - "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], - - "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], - - "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], - - "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], - - "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], - - "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], - - "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], - - "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@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" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], - - "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@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" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], - - "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], - - "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@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" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], - - "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], + "@vue/tsconfig": ["@vue/tsconfig@0.9.0", "", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-RP+v9Cpbsk1ZVXltCHHkYBr7+624x6gcijJXVjIcsYk7JXqvIpRtMwU2ARLvWDhmy9ffdFYxhsfJnPztADBohQ=="], "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], - "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], - - "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], - "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + "abort-signal-polyfill": ["abort-signal-polyfill@1.0.0", "", { "peerDependencies": { "@types/node": ">=18.18.0" }, "optionalPeers": ["@types/node"] }, "sha512-89GbKgHHfY4TKluDySuVdB1Qm2zZ6E9UrlRur5TxTHXzeLsXdbdiEXvDADhvBJnA9a6vCVZH/+Q0sJj2gbV5vA=="], + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], - "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "algoliasearch": ["algoliasearch@5.49.1", "", { "dependencies": { "@algolia/abtesting": "1.15.1", "@algolia/client-abtesting": "5.49.1", "@algolia/client-analytics": "5.49.1", "@algolia/client-common": "5.49.1", "@algolia/client-insights": "5.49.1", "@algolia/client-personalization": "5.49.1", "@algolia/client-query-suggestions": "5.49.1", "@algolia/client-search": "5.49.1", "@algolia/ingestion": "1.49.1", "@algolia/monitoring": "1.49.1", "@algolia/recommend": "5.49.1", "@algolia/requester-browser-xhr": "5.49.1", "@algolia/requester-fetch": "5.49.1", "@algolia/requester-node-http": "5.49.1" } }, "sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ=="], + "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], "alien-signals": ["alien-signals@3.1.2", "", {}, "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw=="], "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], @@ -1834,8 +1759,6 @@ "app-builder-lib": ["app-builder-lib@26.8.1", "", { "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "^4.0.3", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.0.3", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.8.1", "electron-builder-squirrel-windows": "26.8.1" } }, "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw=="], - "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -1846,12 +1769,10 @@ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - "array-from-async": ["array-from-async@3.0.0", "", {}, "sha512-gV8/L4y2QB5JTXL9DMdtspGyed2M3V6nMnSN+nNg8ejyUlAAbKAjRS6pfWWINjU/MuFJFMGWPazHPor7hThXQw=="], + "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], @@ -1864,7 +1785,7 @@ "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], - "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + "astro": ["astro@5.18.1", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.6", "@astrojs/markdown-remark": "6.3.11", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], @@ -1912,7 +1833,9 @@ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], @@ -1928,10 +1851,6 @@ "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], - "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], - - "binary-searching": ["binary-searching@2.0.5", "", {}, "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA=="], - "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], @@ -1940,11 +1859,13 @@ "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], + "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], - "brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -1962,6 +1883,8 @@ "builder-util-runtime": ["builder-util-runtime@9.5.1", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="], + "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -1978,7 +1901,7 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="], @@ -1994,8 +1917,6 @@ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], @@ -2004,14 +1925,14 @@ "chrome-launcher": ["chrome-launcher@0.15.2", "", { "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" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], - "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], - "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="], "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], @@ -2032,8 +1953,6 @@ "code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], - "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], - "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -2050,7 +1969,7 @@ "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "comment-parser": ["comment-parser@1.4.5", "", {}, "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw=="], + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], "common-tags": ["common-tags@1.8.2", "", {}, "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="], @@ -2068,6 +1987,10 @@ "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], + "core-js-compat": ["core-js-compat@3.48.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q=="], "core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], @@ -2076,12 +1999,16 @@ "cross-dirname": ["cross-dirname@0.1.0", "", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="], - "cross-env": ["cross-env@10.1.0", "", { "dependencies": { "@epic-web/invariant": "^1.0.0", "cross-spawn": "^7.0.6" }, "bin": { "cross-env": "dist/bin/cross-env.js", "cross-env-shell": "dist/bin/cross-env-shell.js" } }, "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw=="], + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], + "css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], "css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], @@ -2090,6 +2017,8 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], @@ -2110,14 +2039,10 @@ "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], - "dedent-js": ["dedent-js@1.0.1", "", {}, "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="], "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], @@ -2138,6 +2063,8 @@ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], @@ -2148,14 +2075,20 @@ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], + "devalue": ["devalue@5.6.3", "", {}, "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg=="], "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], + "dir-compare": ["dir-compare@4.2.0", "", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="], "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + "dmg-builder": ["dmg-builder@26.8.1", "", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { "dmg-license": "^1.0.11" } }, "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg=="], "dmg-license": ["dmg-license@1.0.11", "", { "dependencies": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", "crc": "^3.8.0", "iconv-corefoundation": "^1.1.7", "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, "os": "darwin", "bin": { "dmg-license": "bin/dmg-license.js" } }, "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q=="], @@ -2174,6 +2107,8 @@ "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], @@ -2182,7 +2117,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron": ["electron@40.8.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-WoPq0Nr9Yx3g7T6VnJXdwa/rr2+VRyH3a+K+ezfMKBlf6WjxE/LmhMQabKbb6yjm9RbZhJBRcYyoLph421O2mQ=="], + "electron": ["electron@40.7.0", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-oQe76S/3V1rcb0+i45hAxnCH8udkRZSaHUNwglzNAEKbB94LSJ1qwbFo8+uRc2UsYZgCqSIMRcyX40GyOkD+Xw=="], "electron-builder": ["electron-builder@26.8.1", "", { "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", "install-app-deps": "install-app-deps.js" } }, "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw=="], @@ -2196,8 +2131,6 @@ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], @@ -2236,16 +2169,10 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], - - "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], - "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -2254,42 +2181,12 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.0.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.3", "@eslint/config-helpers": "^0.5.2", "@eslint/core": "^1.1.1", "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.1.1", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ=="], - - "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@62.7.1", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.84.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.5", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^11.1.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ=="], - - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], - - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - "esrap": ["esrap@2.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ=="], - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], - - "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], - - "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], - - "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], - - "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], - - "estree-util-visit": ["estree-util-visit@1.2.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^2.0.0" } }, "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw=="], - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], @@ -2350,20 +2247,14 @@ "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], - "fast-check": ["fast-check@4.5.3", "", { "dependencies": { "pure-rand": "^7.0.0" } }, "sha512-IE9csY7lnhxBnA8g/WI5eg/hygA6MGWJMSNfFRrBlXUciADEhS1EDB0SIsMSvzubzIlOBbVITSsypCsW717poA=="], + "fast-check": ["fast-check@4.6.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-h7H6Dm0Fy+H4ciQYFxFjXnXkzR2kr9Fb22c0UBpHnm59K2zpr2t13aPTHlltFiNT6zuxp6HMPAVVvgur4BLdpA=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-equals": ["fast-equals@5.4.0", "", {}, "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw=="], - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fast-stringify": ["fast-stringify@4.0.0", "", {}, "sha512-lE2DIivBaLysf6hK5WH/VfMgqRbvBVHcpGVVTmA5Zi8oWIjq9YxIt6lYGdUgP1HNSXxTIat7HEIDnrSvXSeKQw=="], - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -2372,14 +2263,16 @@ "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], + + "fbjs-css-vars": ["fbjs-css-vars@1.0.2", "", {}, "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="], + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fetch-nodeshim": ["fetch-nodeshim@0.4.9", "", {}, "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], @@ -2392,28 +2285,24 @@ "find-babel-config": ["find-babel-config@2.1.2", "", { "dependencies": { "json5": "^2.2.3" } }, "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg=="], - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + "find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], - - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - - "flatted": ["flatted@3.3.4", "", {}, "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA=="], - - "flexsearch": ["flexsearch@0.8.212", "", {}, "sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw=="], + "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], + "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], + "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - "framer-motion": ["framer-motion@12.35.1", "", { "dependencies": { "motion-dom": "^12.35.1", "motion-utils": "^12.29.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rL8cLrjYZNShZqKV3U0Qj6Y5WDiZXYEM5giiTLfEqsIZxtspzMDCkKmrO5po76jWfvOg04+Vk+sfBvTD0iMmLw=="], - "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], @@ -2458,16 +2347,16 @@ "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], - "glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], - "globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -2478,6 +2367,8 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "h3": ["h3@1.15.6", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ=="], + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2492,27 +2383,35 @@ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@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" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], - "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.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" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], - "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@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": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], - "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], - "hermes-compiler": ["hermes-compiler@0.14.1", "", {}, "sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA=="], + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@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" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], - "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], - "highlight-words-core": ["highlight-words-core@1.2.3", "", {}, "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ=="], + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], - "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hermes-compiler": ["hermes-compiler@250829098.0.9", "", {}, "sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ=="], + + "hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + + "hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], - "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], @@ -2530,6 +2429,8 @@ "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="], + "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], + "ico-endec": ["ico-endec@0.1.6", "", {}, "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ=="], "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="], @@ -2548,6 +2449,8 @@ "immutable": ["immutable@5.1.5", "", {}, "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A=="], + "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -2556,7 +2459,7 @@ "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], @@ -2564,9 +2467,7 @@ "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], - "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], - - "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], @@ -2588,9 +2489,7 @@ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], - - "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -2602,7 +2501,7 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], @@ -2650,13 +2549,15 @@ "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "isbinaryfile": ["isbinaryfile@5.0.7", "", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isbot": ["isbot@5.1.36", "", {}, "sha512-C/ZtXyJqDPZ7G7JPr06ApWyYoHjYexQbS6hPYD4WYCzpv2Qes6Z+CCEfTX4Owzf+1EJ933PoI2p+B9v7wpGZBQ=="], + + "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], @@ -2690,7 +2591,7 @@ "jest-validate": ["jest-validate@29.7.0", "", { "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" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], - "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], @@ -2702,19 +2603,13 @@ "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], - "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@7.1.1", "", {}, "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], @@ -2738,8 +2633,6 @@ "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], @@ -2772,13 +2665,9 @@ "lmdb": ["lmdb@3.5.1", "", { "dependencies": { "@harperfast/extended-iterable": "^1.0.3", "msgpackr": "^1.11.2", "node-addon-api": "^6.1.0", "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.5.3", "weak-lru-cache": "^1.2.2" }, "optionalDependencies": { "@lmdb/lmdb-darwin-arm64": "3.5.1", "@lmdb/lmdb-darwin-x64": "3.5.1", "@lmdb/lmdb-linux-arm": "3.5.1", "@lmdb/lmdb-linux-arm64": "3.5.1", "@lmdb/lmdb-linux-x64": "3.5.1", "@lmdb/lmdb-win32-arm64": "3.5.1", "@lmdb/lmdb-win32-x64": "3.5.1" }, "bin": { "download-lmdb-prebuilds": "bin/download-prebuilds.js" } }, "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg=="], - "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], - - "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], - "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], @@ -2800,7 +2689,7 @@ "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], @@ -2814,8 +2703,6 @@ "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], - "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], - "markdown-it": ["markdown-it@14.1.1", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], @@ -2826,6 +2713,8 @@ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@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" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], @@ -2842,14 +2731,6 @@ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], - "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "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" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], - - "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@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" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], - - "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@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" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], - - "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@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" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], - "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@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" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], @@ -2862,8 +2743,6 @@ "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], - "mdx-annotations": ["mdx-annotations@0.1.4", "", { "dependencies": { "acorn": "^8.8.1", "estree-util-visit": "^1.2.0", "unist-util-visit": "^4.1.1" } }, "sha512-SUYBUXP1qbgr0nRFFnUBg4HxxTbYyl5rE38fLTaIm0naPK+EhmKa0wRlUdgTMlMBj5gdCMwP1n7+L47JIHHWUQ=="], - "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], @@ -2898,8 +2777,6 @@ "metro-transform-worker": ["metro-transform-worker@0.83.3", "", { "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" } }, "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA=="], - "micro-memoize": ["micro-memoize@5.1.1", "", { "dependencies": { "fast-equals": "^5.3.3", "fast-stringify": "^4.0.0" } }, "sha512-QDwluos8YeMijiKxZGwaV4f4tzj0soS6+xcsJhJ3+4wdEIHMyKbIKVUziebOgWX3e6yiijdoaHo+9tyhbnaWXA=="], - "micromark": ["micromark@4.0.2", "", { "dependencies": { "@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" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "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" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], @@ -2918,22 +2795,10 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "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" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], - "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "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" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], - - "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "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" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], - - "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], - - "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "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" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], - - "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "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" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], - "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], - "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@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" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], - "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "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" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], @@ -2954,8 +2819,6 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], - "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "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" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], - "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], @@ -2986,7 +2849,7 @@ "mini-svg-data-uri": ["mini-svg-data-uri@1.4.4", "", { "bin": { "mini-svg-data-uri": "cli.js" } }, "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="], - "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -3008,19 +2871,13 @@ "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], - "motion": ["motion@12.35.1", "", { "dependencies": { "framer-motion": "^12.35.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-yEt/49kWC0VU/IEduDfeZw82eDemlPwa1cyo/gcEEUCN4WgpSJpUcxz6BUwakGabvJiTzLQ58J73515I5tfykQ=="], - - "motion-dom": ["motion-dom@12.35.1", "", { "dependencies": { "motion-utils": "^12.29.2" } }, "sha512-7n6r7TtNOsH2UFSAXzTkfzOeO5616v9B178qBIjmu/WgEyJK0uqwytCEhwKBTuM/HJA40ptAw7hLFpxtPAMRZQ=="], - - "motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="], - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "msgpackr": ["msgpackr@1.11.8", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA=="], + "msgpackr": ["msgpackr@1.11.9", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw=="], "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], @@ -3034,15 +2891,13 @@ "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], - "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], "node-abi": ["node-abi@3.87.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ=="], @@ -3050,6 +2905,10 @@ "node-api-version": ["node-api-version@0.2.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], "node-gyp": ["node-gyp@11.5.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ=="], @@ -3058,6 +2917,8 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], @@ -3074,7 +2935,7 @@ "ob1": ["ob1@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg=="], - "object-deep-merge": ["object-deep-merge@2.0.0", "", {}, "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -3086,6 +2947,10 @@ "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], @@ -3100,8 +2965,6 @@ "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ora": ["ora@3.4.0", "", { "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" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], "ordered-binary": ["ordered-binary@1.6.1", "", {}, "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w=="], @@ -3114,28 +2977,26 @@ "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], + + "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], - "package-up": ["package-up@5.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0" } }, "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA=="], - - "parse-entities": ["parse-entities@4.0.2", "", { "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" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - - "parse-imports-exports": ["parse-imports-exports@0.2.4", "", { "dependencies": { "parse-statements": "1.0.11" } }, "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ=="], + "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], - "parse-statements": ["parse-statements@1.0.11", "", {}, "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA=="], - "parse5": ["parse5@8.0.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA=="], "parse5-html-rewriting-stream": ["parse5-html-rewriting-stream@8.0.0", "", { "dependencies": { "entities": "^6.0.0", "parse5": "^8.0.0", "parse5-sax-parser": "^8.0.0" } }, "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw=="], @@ -3164,6 +3025,8 @@ "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -3194,28 +3057,20 @@ "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], - "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], "prebuild-install": ["prebuild-install@7.1.3", "", { "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": "^2.0.0", "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" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], - - "prettier-plugin-embed": ["prettier-plugin-embed@0.5.1", "", { "dependencies": { "@types/estree": "^1.0.8", "dedent": "^1.7.1", "micro-memoize": "^5.1.1", "package-up": "^5.0.0", "tiny-jsonc": "^1.0.2", "type-fest": "^5.3.1" } }, "sha512-2Ege8gIlLNTvHElUeU5XcFsD7/dbDXkQA6H9TczHSJAGxB58nNjjifk/dlRMS5E29eqQx/z+ToA4ZVMWzjME/A=="], - - "prettier-plugin-jsdoc": ["prettier-plugin-jsdoc@1.8.0", "", { "dependencies": { "binary-searching": "^2.0.5", "comment-parser": "^1.4.0", "mdast-util-from-markdown": "^2.0.0" }, "peerDependencies": { "prettier": "^3.0.0" } }, "sha512-byW8EBZ1DSA3CPdDGBXfcdqqhh2eq0+HlIOPTGZ6rf9O2p/AwBmtS0e49ot5ZeOdcszj81FyzbyHr/VS0eYpCg=="], - - "prettier-plugin-sql-cst": ["prettier-plugin-sql-cst@0.18.0", "", { "dependencies": { "prettier": "^3.0.3", "sql-parser-cst": "^0.38.2" } }, "sha512-IEbKtlZ+H94uWFHQt4iKWMiJJRIuzWYw8jeLz+RCzy4bDtsM3/07GIF1+EFCbT9d0gWibTPotZWx8o3hz+ITeA=="], - - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.7.2", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA=="], + "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -3226,10 +3081,6 @@ "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], - "promise.try": ["promise.try@2.0.1", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "set-function-name": "^2.0.2" } }, "sha512-7Lvq1rrywExCch6Uyw8P5G0HrgYs1u2rxY+0HFBMoA5IqndrJrSGc+ybRnPY1N78F8x+j9BaOWNbg7bzTMG9NA=="], - - "promise.withresolvers": ["promise.withresolvers@1.0.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0" } }, "sha512-T75mGtyQ+r0CeIWk4rYVP0YN0GsO8r8RfF2SLHKVOhg6Hi0BVNWzMybbeqnXYTRoVZcUt8rKoVl0taxKffhpbA=="], - "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], @@ -3242,7 +3093,7 @@ "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], - "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="], + "pure-rand": ["pure-rand@8.0.0", "", {}, "sha512-7rgWlxG2gAvFPIQfUreo1XYlNvrQ9VnQPFWdncPkdl3icucLK0InOxsaafbvxGTnI6Bk/Rxmslg0lQlRCuzOXw=="], "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], @@ -3254,9 +3105,7 @@ "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], - "random": ["random@5.4.1", "", {}, "sha512-HtccRkYkAXCbj9bqsyGKGlicyeZ5AsQgs49fEuUO/BvrJ7WOQqXPjdg1CZrFjBkoT75ozrWlQXJ7TcXXLv2ISQ=="], - - "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], @@ -3272,11 +3121,9 @@ "react-freeze": ["react-freeze@1.0.4", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA=="], - "react-highlight-words": ["react-highlight-words@0.21.0", "", { "dependencies": { "highlight-words-core": "^1.2.0", "memoize-one": "^4.0.0" }, "peerDependencies": { "react": "^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-SdWEeU9fIINArEPO1rO5OxPyuhdEKZQhHzZZP1ie6UeXQf+CjycT1kWaB+9bwGcVbR0NowuHK3RqgqNg6bgBDQ=="], - "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - "react-native": ["react-native@0.83.2", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.83.2", "@react-native/codegen": "0.83.2", "@react-native/community-cli-plugin": "0.83.2", "@react-native/gradle-plugin": "0.83.2", "@react-native/js-polyfills": "0.83.2", "@react-native/normalize-colors": "0.83.2", "@react-native/virtualized-lists": "0.83.2", "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.1", "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" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-ZDma3SLkRN2U2dg0/EZqxNBAx4of/oTnPjXAQi299VLq2gdnbZowGy9hzqv+O7sTA62g+lM1v+2FM5DUnJ/6hg=="], + "react-native": ["react-native@0.84.1", "", { "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" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.3" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg=="], "react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.3.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA=="], @@ -3286,14 +3133,16 @@ "react-native-quick-crypto": ["react-native-quick-crypto@1.0.16", "", { "dependencies": { "@craftzdog/react-native-buffer": "6.1.0", "events": "3.3.0", "readable-stream": "4.5.2", "safe-buffer": "^5.2.1", "string_decoder": "^1.3.0", "util": "0.12.5" }, "peerDependencies": { "expo": ">=48.0.0", "expo-build-properties": "*", "react": "*", "react-native": "*", "react-native-nitro-modules": ">=0.29.1", "react-native-quick-base64": ">=2.1.0" }, "optionalPeers": ["expo", "expo-build-properties"] }, "sha512-UsKd6EgEl9et5FrTeYy82NHDigVSoJSLTyccWAhmO1Iri8rjgve93uzXuFP3EZPB7rwxoEmG/pCRsgESKxrw2A=="], - "react-native-safe-area-context": ["react-native-safe-area-context@5.6.2", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg=="], + "react-native-safe-area-context": ["react-native-safe-area-context@5.7.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ=="], - "react-native-screens": ["react-native-screens@4.23.0", "", { "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw=="], + "react-native-screens": ["react-native-screens@4.24.0", "", { "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-SyoiGaDofiyGPFrUkn1oGsAzkRuX1JUvTD9YQQK3G1JGQ5VWkvHgYSsc1K9OrLsDQxN7NmV71O0sHCAh8cBetA=="], - "react-native-sensitive-info": ["react-native-sensitive-info@6.0.0-rc.11", "", { "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }, "sha512-nBVUcjXK4T2KjdH+nIZaCgS0HbX8AtiOWSvAdkZEoOvnUxpo+l+r9dvSWcIPbhj/EHLiZmTM4WbEATLokwe5tQ=="], + "react-native-sensitive-info": ["react-native-sensitive-info@6.0.0-rc.12", "", { "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }, "sha512-3G0W+AZEt79tfN1SAJsIZHB6wSe5o5fKfvbSqsPSutcHB3lV3ebgNvNu6PK44YmSmSdYU5hL3J3ceTXOgkOjXA=="], "react-native-svg": ["react-native-svg@15.15.3", "", { "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", "warn-once": "0.1.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-/k4KYwPBLGcx2f5d4FjE+vCScK7QOX14cl2lIASJ28u4slHHtIhL0SZKU7u9qmRBHxTCKPoPBtN6haT1NENJNA=="], + "react-native-web": ["react-native-web@0.21.2", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^7.0.1", "memoize-one": "^6.0.0", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg=="], + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], @@ -3310,14 +3159,6 @@ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], - - "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "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" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], - - "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], - - "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], - "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], @@ -3342,18 +3183,22 @@ "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], - "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], - "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], - "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@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" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], - "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@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" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@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" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], @@ -3364,8 +3209,6 @@ "reselect": ["reselect@4.1.8", "", {}, "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="], - "reserved-identifiers": ["reserved-identifiers@1.2.0", "", {}, "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw=="], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], @@ -3378,6 +3221,14 @@ "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], + + "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], + + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], + + "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -3392,8 +3243,6 @@ "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "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" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], - "rss": ["rss@1.2.2", "", { "dependencies": { "mime-types": "2.1.13", "xml": "1.0.1" } }, "sha512-xUhRTgslHeCBeHAqaWSbOYTydN2f0tAzNXvzh3stjz7QDhQMzdgHf3pfgNIngeytQflrFPfy6axHilTETr6gDg=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], @@ -3418,12 +3267,8 @@ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], - "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], - "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], @@ -3432,7 +3277,11 @@ "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], - "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + "serialize-javascript": ["serialize-javascript@7.0.4", "", {}, "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg=="], + + "seroval": ["seroval@1.5.1", "", {}, "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA=="], + + "seroval-plugins": ["seroval-plugins@1.5.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw=="], "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], @@ -3458,13 +3307,15 @@ "set.prototype.union": ["set.prototype.union@1.1.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set": "^1.1.1", "get-intrinsic": "^1.2.4", "is-set": "^2.0.3", "stop-iteration-iterator": "^1.0.0" } }, "sha512-FbjDcc80Ph43roJELrwXuFnQhf2kImcHr7elcegrXYB/B1++HMFk/qKpCjvR1qKiU4Z79bPgOhJyteg769fudg=="], + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "sf-symbols-typescript": ["sf-symbols-typescript@2.2.0", "", {}, "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw=="], "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], - "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], "sharp-ico": ["sharp-ico@0.1.5", "", { "dependencies": { "decode-ico": "*", "ico-endec": "*", "sharp": "*" } }, "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q=="], @@ -3474,7 +3325,7 @@ "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], - "shiki": ["shiki@4.0.1", "", { "dependencies": { "@shikijs/core": "4.0.1", "@shikijs/engine-javascript": "4.0.1", "@shikijs/engine-oniguruma": "4.0.1", "@shikijs/langs": "4.0.1", "@shikijs/themes": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-EkAEhDTN5WhpoQFXFw79OHIrSAfHhlImeCdSyg4u4XvrpxKEmdo/9x/HWSowujAnUrFsGOwWiE58a6GVentMnQ=="], + "shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.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", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], @@ -3490,8 +3341,6 @@ "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], - "simple-functional-loader": ["simple-functional-loader@1.2.1", "", { "dependencies": { "loader-utils": "^2.0.0" } }, "sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ=="], - "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], @@ -3514,11 +3363,13 @@ "smob": ["smob@1.6.1", "", {}, "sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g=="], + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -3530,18 +3381,10 @@ "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], - - "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], - - "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], - "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - "sql-parser-cst": ["sql-parser-cst@0.38.2", "", {}, "sha512-4SR3cZYMxG4gsmvZQSQYYzzfk20OnbpsnwOVbU6Fw39ORLPpIHCMqoX5li0dz+ZWyF5HeR+mSgbgayKhN4JR9w=="], - "ssri": ["ssri@12.0.0", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ=="], "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], @@ -3594,12 +3437,10 @@ "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], - "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], - - "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], - "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], + "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3608,15 +3449,13 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "svelte": ["svelte@5.53.7", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-uxck1KI7JWtlfP3H6HOWi/94soAl23jsGJkBzN2BAWcQng0+lTrRNhxActFqORgnO9BHVd1hKJhG+ljRuIUWfQ=="], + "svelte": ["svelte@5.53.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-UcNfWzbrjvYXYSk+U2hME25kpb87oq6/WVLeBF4khyQrb3Ob/URVlN23khal+RbdCUTMfg4qWjI9KZjCNFtYMQ=="], "svelte-check": ["svelte-check@4.4.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw=="], "svelte2tsx": ["svelte2tsx@0.7.52", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0" } }, "sha512-svdT1FTrCLpvlU62evO5YdJt/kQ7nxgQxII/9BpQUvKr+GJRVdAXNVw8UWOt0fhoe5uWKyU0WsUTMRVAtRbMQg=="], - "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], - - "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + "svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], @@ -3642,15 +3481,17 @@ "terser": ["terser@5.46.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg=="], - "terser-webpack-plugin": ["terser-webpack-plugin@5.3.17", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw=="], - "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], "tiny-async-pool": ["tiny-async-pool@1.3.0", "", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="], - "tiny-jsonc": ["tiny-jsonc@1.0.2", "", {}, "sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw=="], + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], @@ -3670,8 +3511,6 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="], - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], "toqr": ["toqr@0.1.1", "", {}, "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA=="], @@ -3686,33 +3525,31 @@ "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], - "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], - "ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - "turbo": ["turbo@2.8.14", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.14", "turbo-darwin-arm64": "2.8.14", "turbo-linux-64": "2.8.14", "turbo-linux-arm64": "2.8.14", "turbo-windows-64": "2.8.14", "turbo-windows-arm64": "2.8.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA=="], + "turbo": ["turbo@2.8.16", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.16", "turbo-darwin-arm64": "2.8.16", "turbo-linux-64": "2.8.16", "turbo-linux-arm64": "2.8.16", "turbo-windows-64": "2.8.16", "turbo-windows-arm64": "2.8.16" }, "bin": { "turbo": "bin/turbo" } }, "sha512-u6e9e3cTTpE2adQ1DYm3A3r8y3LAONEx1jYvJx6eIgSY4bMLxIxs0riWzI0Z/IK903ikiUzRPZ2c1Ph5lVLkhA=="], - "turbo-darwin-64": ["turbo-darwin-64@2.8.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-9sFi7n2lLfEsGWi5OEoA/eTtQU2BPKtzSYKqufMtDeRmqMT9vKjbv9gJCRkllSVE9BOXA0qXC3diyX8V8rKIKw=="], + "turbo-darwin-64": ["turbo-darwin-64@2.8.16", "", { "os": "darwin", "cpu": "x64" }, "sha512-KWa4hUMWrpADC6Q/wIHRkBLw6X6MV9nx6X7hSXbTrrMz0KdaKhmfudUZ3sS76bJFmgArBU25cSc0AUyyrswYxg=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aS4yJuy6A1PCLws+PJpZP0qCURG8Y5iVx13z/WAbKyeDTY6W6PiGgcEllSaeLGxyn++382ztN/EZH85n2zZ6VQ=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.16", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NBgaqBDLQSZlJR4D5XCkQq6noaO0RvIgwm5eYFJYL3bH5dNu8o0UBpq7C5DYnQI8+ybyoHFjT5/icN4LeUYLow=="], - "turbo-linux-64": ["turbo-linux-64@2.8.14", "", { "os": "linux", "cpu": "x64" }, "sha512-XC6wPUDJkakjhNLaS0NrHDMiujRVjH+naEAwvKLArgqRaFkNxjmyNDRM4eu3soMMFmjym6NTxYaF74rvET+Orw=="], + "turbo-linux-64": ["turbo-linux-64@2.8.16", "", { "os": "linux", "cpu": "x64" }, "sha512-VYPdcCRevI9kR/hr1H1xwXy7QQt/jNKiim1e1mjANBXD2E9VZWMkIL74J1Huad5MbU3/jw7voHOqDPLJPC2p6w=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.8.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-ChfE7isyVNjZrVSPDwcfqcHLG/FuIBbOFxnt1FM8vSuBGzHAs8AlTdwFNIxlEMJfZ8Ad9mdMxdmsCUPIWiQ6cg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-beq8tgUVI3uwkQkXJMiOr/hfxQRw54M3elpBwqgYFfemiK5LhCjjcwO0DkE8GZZfElBIlk+saMAQOZy3885wNQ=="], - "turbo-windows-64": ["turbo-windows-64@2.8.14", "", { "os": "win32", "cpu": "x64" }, "sha512-FTbIeQL1ycLFW2t9uQNMy+bRSzi3Xhwun/e7ZhFBdM+U0VZxxrtfYEBM9CHOejlfqomk6Jh7aRz0sJoqYn39Hg=="], + "turbo-windows-64": ["turbo-windows-64@2.8.16", "", { "os": "win32", "cpu": "x64" }, "sha512-Ig7b46iUgiOIkea/D3Z7H+zNzvzSnIJcLYFpZLA0RxbUTrbLhv9qIPwv3pT9p/abmu0LXVKHxaOo+p26SuDhzw=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.8.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-KgZX12cTyhY030qS7ieT8zRkhZZE2VWJasDFVUSVVn17nR7IShpv68/7j5UqJNeRLIGF1XPK0phsP5V5yw3how=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.16", "", { "os": "win32", "cpu": "arm64" }, "sha512-fOWjbEA2PiE2HEnFQrwNZKYEdjewyPc2no9GmrXklZnTCuMsxeCN39aVlKpKpim03Zq/ykIuvApGwq8ZbfS2Yw=="], "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], - "type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], + "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -3728,19 +3565,25 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.56.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.56.1", "@typescript-eslint/parser": "8.56.1", "@typescript-eslint/typescript-estree": "8.56.1", "@typescript-eslint/utils": "8.56.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ=="], + "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], "unconfig": ["unconfig@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "defu": "^6.1.4", "jiti": "^2.6.1", "quansync": "^1.0.0", "unconfig-core": "7.5.0" } }, "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA=="], "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="], + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + "undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="], - "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], @@ -3752,30 +3595,38 @@ "unified": ["unified@11.0.5", "", { "dependencies": { "@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" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + "unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], + "unique-filename": ["unique-filename@4.0.0", "", { "dependencies": { "unique-slug": "^5.0.0" } }, "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ=="], "unique-slug": ["unique-slug@5.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg=="], "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], - "unist-util-filter": ["unist-util-filter@5.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw=="], + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="], + "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], @@ -3812,6 +3663,8 @@ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], @@ -3830,7 +3683,7 @@ "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], - "vue": ["vue@3.5.29", "", { "dependencies": { "@vue/compiler-dom": "3.5.29", "@vue/compiler-sfc": "3.5.29", "@vue/runtime-dom": "3.5.29", "@vue/server-renderer": "3.5.29", "@vue/shared": "3.5.29" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA=="], + "vue": ["vue@3.5.30", "", { "dependencies": { "@vue/compiler-dom": "3.5.30", "@vue/compiler-sfc": "3.5.30", "@vue/runtime-dom": "3.5.30", "@vue/server-renderer": "3.5.30", "@vue/shared": "3.5.30" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg=="], "vue-tsc": ["vue-tsc@3.2.5", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.2.5" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" } }, "sha512-/htfTCMluQ+P2FISGAooul8kO4JMheOTCbCy4M6dYnYYjqLe3BExZudAua6MSIKSFYQtFOYAll7XobYwcpokGA=="], @@ -3844,21 +3697,17 @@ "weak-lru-cache": ["weak-lru-cache@1.2.2", "", {}, "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw=="], - "web": ["web@workspace:apps/web"], + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], - "webpack": ["webpack@5.105.4", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@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.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "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.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "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" } }, "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw=="], - - "webpack-sources": ["webpack-sources@3.3.4", "", {}, "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q=="], - "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], "whatwg-url-minimum": ["whatwg-url-minimum@0.1.1", "", {}, "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -3866,11 +3715,13 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], "workbox-background-sync": ["workbox-background-sync@7.4.0", "", { "dependencies": { "idb": "^7.0.1", "workbox-core": "7.4.0" } }, "sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w=="], @@ -3916,12 +3767,12 @@ "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], - "xml": ["xml@1.0.1", "", {}, "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw=="], - "xml2js": ["xml2js@0.6.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w=="], "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], @@ -3934,7 +3785,11 @@ "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + + "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], + + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], @@ -3942,19 +3797,21 @@ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], + "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], - "zustand": ["zustand@5.0.11", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg=="], + "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@angular-devkit/core/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "@angular-devkit/core/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "@angular-devkit/core/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + "@angular/common/@angular/core": ["@angular/core@21.2.1", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/compiler": "21.2.1", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, "optionalPeers": ["@angular/compiler", "zone.js"] }, "sha512-pFTbg03s2ZI5cHNT+eWsGjwIIKiYkeAnodFbCAHjwFi9KCEYlTykFLjr9lcpGrBddfmAH7GE08Q73vgmsdcNHw=="], "@angular/compiler-cli/yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - "@apideck/better-ajv-errors/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + + "@astrojs/react/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -3962,6 +3819,8 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -3974,14 +3833,12 @@ "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], - - "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], - - "@develar/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + "@develar/schema-utils/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "@electron/asar/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + "@electron/asar/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "@electron/asar/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "@electron/fuses/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], @@ -4002,14 +3859,8 @@ "@electron/universal/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], - "@electron/universal/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - "@electron/windows-sign/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@example/react-expo/react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], - "@expo/cli/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], "@expo/cli/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], @@ -4024,23 +3875,17 @@ "@expo/fingerprint/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + "@expo/fingerprint/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@expo/metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], "@expo/metro/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], "@expo/metro-config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "@expo/metro-config/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], - "@expo/metro-config/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], - "@gerrit0/mini-shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], - - "@gerrit0/mini-shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], - - "@gerrit0/mini-shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], - - "@gerrit0/mini-shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], + "@expo/prebuild-config/@react-native/normalize-colors": ["@react-native/normalize-colors@0.83.2", "", {}, "sha512-gkZAb9LoVVzNuYzzOviH7DiPTXQoZPHuiTH2+O2+VWNtOkiznjgvqpwYAhg58a5zfRq5GXlbBdf5mzRj5+3Y5Q=="], "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -4052,8 +3897,14 @@ "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "@jest/environment/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@jest/fake-timers/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "@jest/types/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], @@ -4078,7 +3929,9 @@ "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - "@react-native/codegen/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "@react-native/babel-plugin-codegen/@react-native/codegen": ["@react-native/codegen@0.83.2", "", { "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" } }, "sha512-9uK6X1miCXqtL4c759l74N/XbQeneWeQVjoV7SD2CGJuW7ZefxaoYenwGPs7rMoCdtS6wuIyR3hXQ+uWEBGYXA=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware": ["@react-native/dev-middleware@0.84.1", "", { "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" } }, "sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ=="], "@react-native/community-cli-plugin/metro": ["metro@0.83.5", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "accepts": "^2.0.0", "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.33.3", "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.5", "metro-cache": "0.83.5", "metro-cache-key": "0.83.5", "metro-config": "0.83.5", "metro-core": "0.83.5", "metro-file-map": "0.83.5", "metro-resolver": "0.83.5", "metro-runtime": "0.83.5", "metro-source-map": "0.83.5", "metro-symbolicate": "0.83.5", "metro-transform-plugins": "0.83.5", "metro-transform-worker": "0.83.5", "mime-types": "^3.0.1", "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" } }, "sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ=="], @@ -4090,23 +3943,17 @@ "@react-navigation/core/react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="], + "@rollup/plugin-babel/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + "@rollup/plugin-babel/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], - "@rollup/plugin-node-resolve/@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + "@rollup/plugin-replace/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], "@rollup/plugin-replace/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], "@rollup/plugin-replace/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], - "@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], - - "@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], - - "@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "@rollup/pluginutils/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="], - - "@sindresorhus/slugify/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], @@ -4122,11 +3969,23 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@ts-morph/common/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "@types/better-sqlite3/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/cacheable-request/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/fs-extra/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/graceful-fs/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/keyv/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@types/plist/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], - "@vite-pwa/assets-generator/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "@types/responselike/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/ws/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/yauzl/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], "@vitejs/plugin-react/react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], @@ -4138,9 +3997,11 @@ "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "ajv-formats/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "@vue/language-core/@vue/compiler-dom": ["@vue/compiler-dom@3.5.29", "", { "dependencies": { "@vue/compiler-core": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg=="], + + "@vue/language-core/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], - "ajv-keywords/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "ajv-keywords/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -4152,15 +4013,21 @@ "app-builder-lib/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "app-builder-lib/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + "app-builder-lib/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "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" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + "astro/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "babel-plugin-module-resolver/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + "astro/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], - "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "astro/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "astro/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], - "babel-plugin-syntax-hermes-parser/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], + "astro/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "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" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "beasties/css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], @@ -4172,6 +4039,14 @@ "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "boxen/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "builder-util/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "cacache/glob": ["glob@10.5.0", "", { "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" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], @@ -4184,6 +4059,14 @@ "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "chrome-launcher/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "chromium-edge-launcher/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "chromium-edge-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "chromium-edge-launcher/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], "cli-truncate/string-width": ["string-width@8.2.0", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw=="], @@ -4200,14 +4083,24 @@ "crc/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + "dir-compare/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "dir-compare/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "dmg-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "dmg-builder/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "dmg-license/ajv": ["ajv@6.14.0", "", { "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" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + + "electron/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "electron-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "electron-publish/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], @@ -4216,15 +4109,11 @@ "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - "esast-util-from-estree/estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], - - "estree-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], "expo-router/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "fbjs/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], @@ -4238,10 +4127,16 @@ "fs-minipass/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], "global-agent/serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + "h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "hast-util-from-html/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "hast-util-raw/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], "htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], @@ -4250,20 +4145,36 @@ "iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], + "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "jest-environment-node/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "jest-haste-map/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "jest-haste-map/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jest-mock/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "jest-util/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "jest-validate/camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "jest-worker/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "listr2/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "lmdb/msgpackr": ["msgpackr@1.11.8", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA=="], + + "locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], + "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "log-update/ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], @@ -4278,8 +4189,6 @@ "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "make-fetch-happen/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "make-fetch-happen/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], @@ -4288,40 +4197,22 @@ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "mdx-annotations/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], - "metro/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], - "metro/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], - - "metro/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "metro/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], "metro/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], - "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "metro-babel-transformer/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="], - "metro-config/metro-runtime": ["metro-runtime@0.83.3", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw=="], - "metro-file-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "metro-source-map/metro-symbolicate": ["metro-symbolicate@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA=="], - "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "metro-symbolicate/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], - "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "metro-transform-worker/metro-source-map": ["metro-source-map@0.83.3", "", { "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" } }, "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg=="], - "micromark-util-events-to-acorn/estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "minipass-collect/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], @@ -4338,17 +4229,23 @@ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "node-gyp/proc-log": ["proc-log@5.0.0", "", {}, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="], + "next/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], - "node-gyp/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "node-gyp/proc-log": ["proc-log@5.0.0", "", {}, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="], "npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + "open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], - "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "parse-png/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], @@ -4360,8 +4257,6 @@ "path-scurry/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], @@ -4370,28 +4265,30 @@ "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "react-highlight-words/memoize-one": ["memoize-one@4.1.0", "", {}, "sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA=="], - "react-native/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], + + "react-native-web/memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], + "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.4", "", {}, "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ=="], "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "rss/mime-types": ["mime-types@2.1.13", "", { "dependencies": { "mime-db": "~1.25.0" } }, "sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ=="], - "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "schema-utils/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "set.prototype.intersection/es-set": ["es-set@2.0.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-map": "^1.0.6", "es-set-tostringtag": "^2.0.3", "for-each": "^0.3.3", "functions-have-names": "^1.2.3", "get-intrinsic": "^1.2.5", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-symbols": "^1.1.0", "internal-slot": "^1.0.7", "iterate-value": "^1.0.2", "object.entries": "^1.1.8", "stop-iteration-iterator": "^1.0.0" } }, "sha512-w2EDjbgK6Xl23Bxob5Jgrcd+x7e51HxGssmP9GYZ0NbNLhtg9mHiVY9RxO7UsHHn0v10nt5cq2iFJ4GzibAP1Q=="], + "sharp-ico/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -4404,10 +4301,12 @@ "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], - "svelte-check/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "svgo/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], + "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "tar/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], @@ -4424,23 +4323,21 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "test-exclude/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], - "typedoc/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - "unconfig/quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], "unconfig-core/quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], - "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "webpack/es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], + "unifont/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "workbox-build/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "workbox-build/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], @@ -4460,7 +4357,7 @@ "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], - "@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "zod-to-ts/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@angular/compiler-cli/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -4468,7 +4365,17 @@ "@angular/compiler-cli/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "@apideck/better-ajv-errors/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@astrojs/react/@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "@astrojs/react/vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "@astrojs/react/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@develar/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -4492,20 +4399,24 @@ "@electron/universal/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/windows-sign/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "@expo/cli/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@expo/cli/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/cli/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + "@expo/config-plugins/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@expo/config-plugins/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/config-plugins/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + "@expo/config/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@expo/config/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], @@ -4514,29 +4425,41 @@ "@expo/fingerprint/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "@expo/metro-config/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@expo/metro-config/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "@expo/metro-config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "@expo/metro-config/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], - "@expo/metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "@expo/metro/metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "@inquirer/core/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "@jest/environment/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "@jest/fake-timers/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "@jest/types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@malept/flatpak-bundler/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "@react-native/codegen/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + "@react-native/babel-plugin-codegen/@react-native/codegen/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.84.1", "", {}, "sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-shell": ["@react-native/debugger-shell@0.84.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", "fb-dotslash": "0.5.8" } }, "sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ=="], + + "@react-native/community-cli-plugin/@react-native/dev-middleware/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "@react-native/community-cli-plugin/metro/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], @@ -4544,8 +4467,6 @@ "@react-native/community-cli-plugin/metro/hermes-parser": ["hermes-parser@0.33.3", "", { "dependencies": { "hermes-estree": "0.33.3" } }, "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA=="], - "@react-native/community-cli-plugin/metro/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "@react-native/community-cli-plugin/metro/metro-babel-transformer": ["metro-babel-transformer@0.83.5", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.33.3", "nullthrows": "^1.1.1" } }, "sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA=="], "@react-native/community-cli-plugin/metro/metro-cache": ["metro-cache@0.83.5", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.5" } }, "sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng=="], @@ -4564,81 +4485,115 @@ "@react-native/community-cli-plugin/metro/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "@react-native/community-cli-plugin/metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "@react-native/community-cli-plugin/metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "@react-native/community-cli-plugin/metro-config/metro-cache": ["metro-cache@0.83.5", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.5" } }, "sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng=="], "@react-native/community-cli-plugin/metro-core/metro-resolver": ["metro-resolver@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A=="], + "@rollup/plugin-babel/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@rollup/plugin-babel/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@rollup/plugin-babel/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@rollup/plugin-babel/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@rollup/plugin-node-resolve/@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@rollup/plugin-replace/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@rollup/plugin-replace/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@rollup/plugin-replace/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "@rollup/plugin-replace/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@rollup/pluginutils/rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "@types/better-sqlite3/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@types/cacheable-request/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + "@types/fs-extra/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + "@types/graceful-fs/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + "@types/keyv/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + "@types/plist/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + "@types/responselike/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + "@types/ws/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + "@types/yauzl/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + "@vue/language-core/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + "app-builder-lib/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + "app-builder-lib/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + "app-builder-lib/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + "astro/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + "astro/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + "astro/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + "astro/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - "@vite-pwa/assets-generator/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "astro/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "astro/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "astro/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "astro/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], - "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "astro/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], - "app-builder-lib/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "astro/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], - "app-builder-lib/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "astro/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], - "app-builder-lib/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + "astro/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "astro/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "astro/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "astro/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "astro/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "astro/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "astro/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "astro/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "astro/vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "astro/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], + "better-opn/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "better-opn/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "boxen/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "boxen/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "babel-plugin-syntax-hermes-parser/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "boxen/wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "builder-util/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], @@ -4646,7 +4601,13 @@ "cacache/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - "cacache/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "chrome-launcher/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "chrome-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "chromium-edge-launcher/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "chromium-edge-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], @@ -4654,12 +4615,20 @@ "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "dir-compare/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "dmg-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "dmg-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "electron-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "electron-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -4668,19 +4637,29 @@ "electron-publish/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "electron/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "global-agent/serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + "hast-util-from-html/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "hast-util-raw/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "iconv-corefoundation/cli-truncate/slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], - "jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "jest-environment-node/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "jest-haste-map/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "jest-mock/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "jest-util/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "jest-worker/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -4708,35 +4687,59 @@ "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "mdx-annotations/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "metro-symbolicate/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "mdx-annotations/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], + "metro-transform-worker/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "mdx-annotations/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + "metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], - "metro-babel-transformer/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "metro-file-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "metro-symbolicate/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "metro-transform-worker/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "next/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - "metro-transform-worker/metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "next/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - "metro/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="], + "next/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - "metro/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "next/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - "metro/metro-source-map/ob1": ["ob1@0.83.3", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA=="], + "next/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "next/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "next/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "next/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "next/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "next/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "next/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "next/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "next/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "next/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "next/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "next/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], - "node-gyp/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + "next/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "next/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "next/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -4748,36 +4751,76 @@ "ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "rss/mime-types/mime-db": ["mime-db@1.25.0", "", {}, "sha512-5k547tI4Cy+Lddr/hdjNbBEWBwSl8EBc5aSdKvedav8DReADgWJzcYiktaRIw3GtGC1jjwldXtTzvqJZmtvC7w=="], + "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "sharp-ico/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "sharp-ico/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "sharp-ico/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "sharp-ico/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "sharp-ico/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "sharp-ico/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "sharp-ico/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "sharp-ico/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "sharp-ico/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "sharp-ico/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "sharp-ico/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "sharp-ico/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "sharp-ico/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "sharp-ico/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "sharp-ico/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "sharp-ico/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "sharp-ico/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "sharp-ico/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "sharp-ico/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "svelte-check/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "svgo/css-tree/mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + "temp-file/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "temp-file/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "temp/rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "test-exclude/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "typedoc/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "unifont/css-tree/mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "widest-line/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "workbox-build/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "widest-line/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "workbox-build/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "workbox-build/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "workbox-build/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "workbox-build/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "workbox-build/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], @@ -4792,21 +4835,69 @@ "@angular/compiler-cli/yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "@electron/asar/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@astrojs/react/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - "@electron/rebuild/ora/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + "@astrojs/react/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@astrojs/react/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@astrojs/react/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@astrojs/react/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@astrojs/react/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@astrojs/react/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@astrojs/react/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@astrojs/react/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@astrojs/react/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@astrojs/react/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@astrojs/react/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - "@electron/universal/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@astrojs/react/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - "@expo/cli/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "@astrojs/react/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - "@expo/config-plugins/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "@astrojs/react/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - "@expo/config/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "@astrojs/react/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - "@expo/fingerprint/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "@astrojs/react/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - "@expo/metro-config/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "@astrojs/react/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@electron/rebuild/ora/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "@expo/cli/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "@expo/config-plugins/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "@expo/config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "@expo/fingerprint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@expo/metro-config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], @@ -4814,31 +4905,81 @@ "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "@react-native/babel-plugin-codegen/@react-native/codegen/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "@react-native/community-cli-plugin/metro/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "@react-native/community-cli-plugin/metro/hermes-parser/hermes-estree": ["hermes-estree@0.33.3", "", {}, "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg=="], - "@react-native/community-cli-plugin/metro/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "@react-native/community-cli-plugin/metro/metro-transform-worker/metro-minify-terser": ["metro-minify-terser@0.83.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q=="], "@react-native/community-cli-plugin/metro/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@vue/language-core/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], - "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@vue/language-core/@vue/compiler-dom/@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "cacache/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "app-builder-lib/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "astro/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "astro/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "astro/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "astro/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "astro/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "astro/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "astro/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "astro/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "astro/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "astro/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "astro/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "astro/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "astro/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "astro/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "astro/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - "dir-compare/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "astro/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "astro/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "astro/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "astro/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "astro/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "astro/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "astro/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "astro/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "astro/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "astro/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "astro/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "cacache/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "iconv-corefoundation/cli-truncate/slice-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -4858,17 +4999,15 @@ "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - - "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "test-exclude/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "temp/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "typedoc/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "workbox-build/glob/path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + "workbox-build/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], "@angular/compiler-cli/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], @@ -4880,11 +5019,19 @@ "@electron/rebuild/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "@expo/cli/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@expo/config-plugins/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@expo/config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@expo/metro-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - "babel-plugin-module-resolver/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@react-native/babel-plugin-codegen/@react-native/codegen/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], "cacache/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -4892,13 +5039,13 @@ "cacache/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "workbox-build/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "@electron/rebuild/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], diff --git a/examples/angular-vite-pwa/package.json b/examples/angular-vite-pwa/package.json index 240007478..afd94224d 100644 --- a/examples/angular-vite-pwa/package.json +++ b/examples/angular-vite-pwa/package.json @@ -9,15 +9,15 @@ "generate-pwa-assets": "pwa-assets-generator" }, "dependencies": { - "@angular/core": "^21.2.1", - "@angular/platform-browser": "^21.2.1", + "@angular/core": "^21.2.2", + "@angular/platform-browser": "^21.2.2", "@evolu/common": "workspace:*", "@evolu/web": "workspace:*" }, "devDependencies": { "@analogjs/vite-plugin-angular": "^2.3.1", "@angular/build": "^21.2.1", - "@angular/compiler-cli": "^21.2.1", + "@angular/compiler-cli": "^21.2.2", "@tailwindcss/vite": "^4.2.1", "@vite-pwa/assets-generator": "^1.0.2", "tailwindcss": "^4.2.1", diff --git a/examples/react-expo/package.json b/examples/react-expo/package.json index a94fa1b03..23bf78211 100644 --- a/examples/react-expo/package.json +++ b/examples/react-expo/package.json @@ -39,7 +39,7 @@ "react-native": "0.84.1", "react-native-nitro-modules": "0.34.1", "react-native-quick-crypto": "^1.0.16", - "react-native-safe-area-context": "^5.6.2", + "react-native-safe-area-context": "^5.7.0", "react-native-screens": "^4.24.0", "react-native-svg": "15.15.3", "react-native-web": "^0.21.0", diff --git a/examples/svelte-vite-pwa/package.json b/examples/svelte-vite-pwa/package.json index 150f98d72..a06b0f12b 100644 --- a/examples/svelte-vite-pwa/package.json +++ b/examples/svelte-vite-pwa/package.json @@ -16,7 +16,7 @@ "@evolu/web": "workspace:*", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@tsconfig/svelte": "^5.0.8", - "svelte": "^5.53.7", + "svelte": "^5.53.10", "svelte-check": "^4.4.3", "tslib": "^2.8.1", "typescript": "^5.9.3", diff --git a/examples/vue-vite-pwa/package.json b/examples/vue-vite-pwa/package.json index 4672380c4..b5ca76219 100644 --- a/examples/vue-vite-pwa/package.json +++ b/examples/vue-vite-pwa/package.json @@ -14,7 +14,7 @@ "@evolu/common": "workspace:*", "@evolu/vue": "workspace:*", "@evolu/web": "workspace:*", - "vue": "^3.5.29", + "vue": "^3.5.30", "workbox-window": "^7.4.0" }, "devDependencies": { diff --git a/package.json b/package.json index 65c6b6167..ccac9d8ce 100755 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@vitest/browser-playwright": "^4.0.18", "@vitest/coverage-istanbul": "^4.0.18", "@vitest/coverage-v8": "^4.0.18", - "turbo": "^2.8.13", + "turbo": "^2.8.16", "typedoc": "^0.28.17", "typedoc-plugin-markdown": "^4.10.0", "typescript": "^5.9.3", diff --git a/packages/common/package.json b/packages/common/package.json index 86c4a0e55..cdfa717f8 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -57,7 +57,7 @@ "@noble/hashes": "^2.0.1", "@scure/bip39": "^2.0.1", "kysely": "^0.28.11", - "msgpackr": "^1.11.8", + "msgpackr": "^1.11.9", "zod": "^4.3.6" }, "publishConfig": { @@ -72,7 +72,7 @@ "@types/better-sqlite3": "^7.6.13", "@types/ws": "^8.18.1", "better-sqlite3": "^12.6.2", - "fast-check": "^4.5.3", + "fast-check": "^4.6.0", "playwright": "^1.58.2", "typescript": "^5.9.3", "ws": "^8.19.0" diff --git a/packages/common/src/Resources.ts b/packages/common/src/Resources.ts index f0bd4d89e..5b0725757 100644 --- a/packages/common/src/Resources.ts +++ b/packages/common/src/Resources.ts @@ -252,7 +252,8 @@ export const createResources = < if (!resourceIds) return resources; for (const resourceId of resourceIds) { - resources.add(resourcesById.get(resourceId)!); + const resource = resourcesById.get(resourceId); + if (resource) resources.add(resource); } return resources; diff --git a/packages/common/src/local-first/Sync.ts b/packages/common/src/local-first/Sync.ts index d6e374594..d8e1e570b 100644 --- a/packages/common/src/local-first/Sync.ts +++ b/packages/common/src/local-first/Sync.ts @@ -28,22 +28,22 @@ import type { Result } from "../Result.js"; import { err, ok } from "../Result.js"; import type { SqliteDep } from "../Sqlite.js"; import { - booleanToSqliteBoolean, SqliteBoolean, - type SqliteValue, + booleanToSqliteBoolean, sql, sqliteBooleanToBoolean, + type SqliteValue, } from "../Sqlite.js"; import { createMutex, createRun } from "../Task.js"; import type { TimeDep } from "../Time.js"; import { Millis, millisToDateIso } from "../Time.js"; import type { Typed } from "../Type.js"; import { - type Id, - type IdBytes, + PositiveInt, idBytesToId, idToIdBytes, - PositiveInt, + type Id, + type IdBytes, } from "../Type.js"; import { isPromiseLike } from "../Types.js"; import type { CreateWebSocketDep, WebSocket } from "../WebSocket.js"; @@ -56,10 +56,10 @@ import type { ReadonlyOwner, } from "./Owner.js"; import { - type OwnerId, - type OwnerIdBytes, ownerIdBytesToOwnerId, ownerIdToOwnerIdBytes, + type OwnerId, + type OwnerIdBytes, } from "./Owner.js"; import type { ProtocolError, @@ -69,12 +69,12 @@ import type { ProtocolTimestampMismatchError, } from "./Protocol.js"; import { + SubscriptionFlags, createProtocolMessageForSync, createProtocolMessageForUnsubscribe, createProtocolMessageFromCrdtMessages, decryptAndDecodeDbChange, encodeAndEncryptDbChange, - SubscriptionFlags, } from "./Protocol.js"; import type { MutationChange, SqliteSchemaDep } from "./Schema.js"; import { systemColumns } from "./Schema.js"; @@ -85,8 +85,8 @@ import type { StorageConfig, } from "./Storage.js"; import { - createBaseSqliteStorage, DbChange, + createBaseSqliteStorage, getNextStoredBytes, getOwnerUsage, getTimestampInsertStrategy, @@ -515,6 +515,9 @@ export const createSync = if (isDisposed) return; isDisposed = true; syncOwnersById.clear(); + // Note: syncOwnerRefs doesn't have a clear method, but entries become + // unreachable once syncOwnersById is cleared and no new useOwner calls + // are accepted due to isDisposed check. void resources[Symbol.asyncDispose](); void syncRun[Symbol.asyncDispose](); }, diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 478bd03ef..5477e1c2e 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -43,14 +43,14 @@ "@evolu/web": "workspace:*", "@sveltejs/package": "^2.5.7", "@tsconfig/svelte": "^5.0.8", - "svelte": "^5.53.7", + "svelte": "^5.53.10", "svelte-check": "^4.4.3", "typescript": "^5.9.3" }, "peerDependencies": { "@evolu/common": "^7.4.1", "@evolu/web": "^2.4.0", - "svelte": ">=5.53.7" + "svelte": ">=5.53.10" }, "publishConfig": { "access": "public" diff --git a/packages/vue/package.json b/packages/vue/package.json index a1ae052f1..b061395d4 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -41,7 +41,7 @@ }, "peerDependencies": { "@evolu/common": "^7.4.1", - "vue": ">=3.5.29" + "vue": ">=3.5.30" }, "publishConfig": { "access": "public" From b73a71dee5d58374473c9fe1f567a4e7e276e500 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 08:00:57 +0100 Subject: [PATCH 21/24] fix: harden resource and keyed semaphore disposal --- packages/common/src/Resources.ts | 63 +++++++++++++++++++++++++++----- packages/common/src/Task.ts | 43 ++++++++++++++++++---- packages/web/src/Task.ts | 4 +- 3 files changed, 92 insertions(+), 18 deletions(-) diff --git a/packages/common/src/Resources.ts b/packages/common/src/Resources.ts index 5b0725757..410a07d7a 100644 --- a/packages/common/src/Resources.ts +++ b/packages/common/src/Resources.ts @@ -9,7 +9,7 @@ import { isNone } from "./Option.js"; import { createRefCount, type RefCount } from "./RefCount.js"; import { createRelation } from "./Relation.js"; import { ok } from "./Result.js"; -import { createMutexByKey, unabortable, type Task } from "./Task.js"; +import { createMutexByKey, createRun, type Task, unabortable } from "./Task.js"; /** * Async reference-counted resource management. @@ -150,17 +150,27 @@ export const createResources = < >(); const consumerIdsByResourceId = createRelation(); const mutexByResourceId = createMutexByKey(); + const resourceIdsWithMutex = new Set(); + let disposing = false; + let disposePromise: Promise | null = null; return { addConsumer: (consumer, resourceConfigs) => async (run) => { + if (disposing) return ok(); + const consumerId = getConsumerId(consumer); for (const resourceConfig of resourceConfigs) { + if (disposing) return ok(); + const resourceId = getResourceId(resourceConfig); + resourceIdsWithMutex.add(resourceId); const result = await run( unabortable( mutexByResourceId.withLock(resourceId, async () => { + if (disposing) return ok(); + let resource = resourcesById.get(resourceId); if (!resource) { resource = await createResource(resourceConfig); @@ -195,14 +205,21 @@ export const createResources = < }, removeConsumer: (consumer, resourceConfigs) => async (run) => { + if (disposing) return ok(); + const consumerId = getConsumerId(consumer); for (const resourceConfig of resourceConfigs) { + if (disposing) return ok(); + const resourceId = getResourceId(resourceConfig); + resourceIdsWithMutex.add(resourceId); const result = await run( unabortable( mutexByResourceId.withLock(resourceId, () => { + if (disposing) return ok(); + const consumerRefCountsByConsumerId = consumerRefCountsByResourceId.get(resourceId); if (!consumerRefCountsByConsumerId) { @@ -260,14 +277,42 @@ export const createResources = < }, [Symbol.asyncDispose]: () => { - for (const resource of resourcesById.values()) { - resource[Symbol.dispose](); - } - resourcesById.clear(); - consumerRefCountsByResourceId.clear(); - consumerIdsByResourceId.clear(); - mutexByResourceId[Symbol.dispose](); - return Promise.resolve(); + if (disposePromise) return disposePromise; + + disposing = true; + + disposePromise = (async () => { + await using run = createRun(); + + const drainIds = new Set(resourceIdsWithMutex); + for (const resourceId of resourcesById.keys()) { + drainIds.add(resourceId); + } + for (const resourceId of consumerRefCountsByResourceId.keys()) { + drainIds.add(resourceId); + } + + for (const resourceId of drainIds) { + const result = await run( + unabortable(mutexByResourceId.withLock(resourceId, () => ok())), + ); + assert( + result.ok, + "Unabortable resources dispose drain must not abort", + ); + } + + for (const resource of resourcesById.values()) { + resource[Symbol.dispose](); + } + resourcesById.clear(); + consumerRefCountsByResourceId.clear(); + consumerIdsByResourceId.clear(); + resourceIdsWithMutex.clear(); + mutexByResourceId[Symbol.dispose](); + })(); + + return disposePromise; }, }; }; diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index b8d30ceb4..e845b5f1b 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -2753,8 +2753,23 @@ export interface SemaphoreByKey extends Disposable { export const createSemaphoreByKey = ( permits: Concurrency, ): SemaphoreByKey => { - const semaphoresByKey = new Map(); + type KeyedSemaphore = Semaphore & { + __disposing: boolean; + }; + + const semaphoresByKey = new Map(); let disposed = false; + const getActiveSemaphore = (key: K): KeyedSemaphore | undefined => { + const semaphore = semaphoresByKey.get(key); + if (!semaphore) return undefined; + if (!semaphore.__disposing) return semaphore; + + if (semaphoresByKey.get(key) === semaphore) { + semaphoresByKey.delete(key); + } + + return undefined; + }; const withPermits = (key: K, requestedPermits: Concurrency) => @@ -2762,19 +2777,33 @@ export const createSemaphoreByKey = ( async (run: Run) => { if (disposed) return err(semaphoreDisposedAbortError); - let semaphore = semaphoresByKey.get(key); + let semaphore = getActiveSemaphore(key); if (!semaphore) { - semaphore = createSemaphore(permits); + semaphore = Object.assign(createSemaphore(permits), { + __disposing: false, + }); semaphoresByKey.set(key, semaphore); } using _ = { [Symbol.dispose]: () => { + if (semaphoresByKey.get(key) !== semaphore) return; + const snapshot = semaphore.snapshot(); - if (snapshot.taken === 0 && snapshot.waiting === 0) { - semaphoresByKey.delete(key); - semaphore[Symbol.dispose](); + if (snapshot.taken !== 0 || snapshot.waiting !== 0) return; + + semaphore.__disposing = true; + + if (semaphoresByKey.get(key) !== semaphore) return; + + const drainedSnapshot = semaphore.snapshot(); + if (drainedSnapshot.taken !== 0 || drainedSnapshot.waiting !== 0) { + semaphore.__disposing = false; + return; } + + semaphoresByKey.delete(key); + semaphore[Symbol.dispose](); }, }; @@ -2787,7 +2816,7 @@ export const createSemaphoreByKey = ( withPermits, - snapshot: (key) => semaphoresByKey.get(key)?.snapshot() ?? null, + snapshot: (key) => getActiveSemaphore(key)?.snapshot() ?? null, [Symbol.dispose]: () => { if (disposed) return; diff --git a/packages/web/src/Task.ts b/packages/web/src/Task.ts index babd5c2b5..ec4abac90 100644 --- a/packages/web/src/Task.ts +++ b/packages/web/src/Task.ts @@ -77,7 +77,7 @@ export const createLeaderLock = (): LeaderLock => ({ }); /** - * Creates {@link Run} for the browser with global error handling. + * Creates {@link Run} for the web platform with global error handling. * * Registers `error` and `unhandledrejection` handlers that log errors to the * console. Handlers are removed when the run is disposed. @@ -97,7 +97,7 @@ export const createLeaderLock = (): LeaderLock => ({ * await stack.use(startApp()); * ``` * - * @group Browser Runner + * @group Web Platform Runner */ export const createRun: CreateRunner = ( deps?: D, From 70d550c7f6b03603ca8940e7f1b1afd5c79677a9 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 08:31:49 +0100 Subject: [PATCH 22/24] fix: restore verify after common-v8 sync --- packages/common/src/Resources.ts | 645 ++++++++++++++---- packages/common/src/Task.ts | 20 +- packages/common/src/WebSocket.ts | 25 + packages/common/src/index.ts | 2 +- packages/common/src/local-first/Db.ts | 3 +- packages/common/src/local-first/Evolu.ts | 11 +- packages/common/src/local-first/Query.ts | 6 +- packages/common/src/local-first/Relay.ts | 45 +- packages/common/src/local-first/Shared.ts | 93 ++- packages/common/src/local-first/Sync.ts | 88 ++- packages/common/test/Task.test.ts | 29 +- packages/common/test/TreeShaking.test.ts | 16 +- .../common/test/local-first/Evolu.test.ts | 72 +- .../common/test/local-first/Kysely.test.ts | 20 +- .../common/test/local-first/Query.test.ts | 4 +- 15 files changed, 813 insertions(+), 266 deletions(-) diff --git a/packages/common/src/Resources.ts b/packages/common/src/Resources.ts index 410a07d7a..e07e58f54 100644 --- a/packages/common/src/Resources.ts +++ b/packages/common/src/Resources.ts @@ -8,85 +8,22 @@ import { assert } from "./Assert.js"; import { isNone } from "./Option.js"; import { createRefCount, type RefCount } from "./RefCount.js"; import { createRelation } from "./Relation.js"; -import { ok } from "./Result.js"; +import type { Result } from "./Result.js"; +import { err, ok } from "./Result.js"; import { createMutexByKey, createRun, type Task, unabortable } from "./Task.js"; +import { + createTime, + type Duration, + type TimeDep, + type TimeoutId, +} from "./Time.js"; +import { PositiveInt, type Typed } from "./Type.js"; /** * Async reference-counted resource management. * * Tracks which consumers use which shared resources and keeps resources alive * while at least one consumer is attached. - * - * ### Example - * - * ```ts - * interface TransportConfig { - * readonly url: UrlString; - * } - * - * interface Owner { - * readonly id: OwnerId; - * } - * - * const resources = createResources< - * WebSocket, - * UrlString, - * TransportConfig, - * Owner, - * OwnerId - * >({ - * createResource: async (transport) => { - * const { createWebSocket } = run.deps; - * return await run.orThrow( - * createWebSocket(transport.url, { - * onOpen: handleWebSocketOpen(transport.url), - * }), - * ); - * }, - * getResourceId: (transportConfig) => transportConfig.url, - * getConsumerId: (owner) => owner.id, - * }); - * - * const handleWebSocketOpen = (transportUrl: UrlString) => (): void => { - * const ownerIds = resources.getConsumerIdsForResource(transportUrl); - * dbWorker.postMessage({ type: "CreateSyncMessages", ownerIds }); - * }; - * - * dbWorker.onMessage = (message) => { - * switch (message.type) { - * case "OnSyncMessage": - * for (const [ownerId, syncMessage] of message.messagesByOwnerId) { - * const webSockets = resources.getResourcesForConsumerId(ownerId); - * for (const webSocket of webSockets) { - * if (webSocket.isOpen()) webSocket.send(syncMessage); - * } - * } - * } - * }; - * - * await run( - * resources.addConsumer({ id: "owner-1" as OwnerId }, [ - * { url: "wss://server1.com" as UrlString }, - * { url: "wss://server2.com" as UrlString }, - * ]), - * ); - * - * await run( - * resources.addConsumer({ id: "owner-2" as OwnerId }, [ - * { url: "wss://server1.com" as UrlString }, - * ]), - * ); - * - * await run( - * resources.removeConsumer({ id: "owner-1" as OwnerId }, [ - * { url: "wss://server1.com" as UrlString }, - * { url: "wss://server2.com" as UrlString }, - * ]), - * ); - * - * // The WebSocket for wss://server2.com is disposed because it has no consumers. - * // The WebSocket for wss://server1.com stays alive because owner-2 still uses it. - * ``` */ export interface Resources< TResource extends Disposable, @@ -105,7 +42,11 @@ export interface Resources< readonly removeConsumer: ( consumer: TConsumer, resourceConfigs: ReadonlyArray, - ) => Task; + ) => Task< + void, + | ResourceNotFoundError + | ConsumerNotFoundError + >; readonly getConsumerIdsForResource: ( resourceId: TResourceId, @@ -116,33 +57,140 @@ export interface Resources< ) => ReadonlySet; } -/** Creates {@link Resources}. */ -export const createResources = < +/** Configuration for async {@link Resources}. */ +export interface AsyncResourcesConfig< TResource extends Disposable, TResourceId extends string, TResourceConfig, TConsumer, TConsumerId extends string, ->({ - createResource, - getResourceId, - getConsumerId, -}: { +> { /** Creates a resource for the provided configuration. */ - createResource: (resourceConfig: TResourceConfig) => Promise; + readonly createResource: ( + resourceConfig: TResourceConfig, + ) => Promise; /** Maps a resource configuration to its shared resource identifier. */ - getResourceId: (resourceConfig: TResourceConfig) => TResourceId; + readonly getResourceId: (resourceConfig: TResourceConfig) => TResourceId; /** Maps a consumer value to its stable consumer identifier. */ - getConsumerId: (consumer: TConsumer) => TConsumerId; -}): Resources< + readonly getConsumerId: (consumer: TConsumer) => TConsumerId; + + /** Delay before disposing unused resources. Defaults to `"100ms"`. */ + readonly disposalDelay?: Duration; + + /** Optional clock for timeout scheduling (useful for deterministic tests). */ + readonly time?: TimeDep["time"]; +} + +/** + * Legacy synchronous resource manager with delayed disposal. + * + * Kept for local-first internals and tests that use synchronous resource + * creation and deterministic timeout behavior. + */ +export interface LegacyResources< + TResource extends Disposable, + TResourceKey extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +> extends Disposable { + readonly addConsumer: ( + consumer: TConsumer, + resourceConfigs: ReadonlyArray, + ) => void; + + readonly removeConsumer: ( + consumer: TConsumer, + resourceConfigs: ReadonlyArray, + ) => Result< + void, + | ResourceNotFoundError + | ConsumerNotFoundError + >; + + readonly getResource: (key: TResourceKey) => TResource | null; + + readonly getConsumersForResource: ( + key: TResourceKey, + ) => ReadonlyArray; + + readonly hasConsumerAnyResource: (consumer: TConsumer) => boolean; + + readonly getConsumer: (consumerId: TConsumerId) => TConsumer | null; +} + +/** Error when trying to remove a consumer from a resource that doesn't exist. */ +export interface ResourceNotFoundError + extends Typed<"ResourceNotFoundError"> { + readonly resourceKey: TResourceKey; +} + +/** Error when trying to remove a consumer that wasn't added to a resource. */ +export interface ConsumerNotFoundError< + TConsumerId extends string = string, + TResourceKey extends string = string, +> extends Typed<"ConsumerNotFoundError"> { + readonly consumerId: TConsumerId; + readonly resourceKey: TResourceKey; +} + +/** Configuration for legacy synchronous {@link LegacyResources}. */ +export interface LegacyResourcesConfig< + TResource extends Disposable, + TResourceKey extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +> { + readonly createResource: (config: TResourceConfig) => TResource; + + readonly getResourceKey: (config: TResourceConfig) => TResourceKey; + + readonly getConsumerId: (consumer: TConsumer) => TConsumerId; + + readonly disposalDelay?: Duration; + + readonly onConsumerAdded?: ( + consumer: TConsumer, + resource: TResource, + resourceKey: TResourceKey, + ) => void; + + readonly onConsumerRemoved?: ( + consumer: TConsumer, + resource: TResource, + resourceKey: TResourceKey, + ) => void; +} + +const createAsyncResources = < + TResource extends Disposable, + TResourceId extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +>({ + createResource, + getResourceId, + getConsumerId, + disposalDelay = "100ms", + time: maybeTime, +}: AsyncResourcesConfig< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId +>): Resources< TResource, TResourceId, TResourceConfig, TConsumer, TConsumerId > => { + const time = maybeTime ?? createTime(); const resourcesById = new Map(); const consumerRefCountsByResourceId = new Map< TResourceId, @@ -150,10 +198,53 @@ export const createResources = < >(); const consumerIdsByResourceId = createRelation(); const mutexByResourceId = createMutexByKey(); + const disposalTimeoutByResourceId = new Map(); const resourceIdsWithMutex = new Set(); let disposing = false; let disposePromise: Promise | null = null; + const clearDisposalTimeout = (resourceId: TResourceId): void => { + const timeout = disposalTimeoutByResourceId.get(resourceId); + if (!timeout) return; + time.clearTimeout(timeout); + disposalTimeoutByResourceId.delete(resourceId); + }; + + const scheduleResourceDisposal = (resourceId: TResourceId): void => { + clearDisposalTimeout(resourceId); + + const timeout = time.setTimeout(() => { + void (async () => { + if (disposing) return; + + await using run = createRun(); + const result = await run( + unabortable( + mutexByResourceId.withLock(resourceId, () => { + disposalTimeoutByResourceId.delete(resourceId); + + if (consumerIdsByResourceId.hasA(resourceId)) return ok(); + + consumerRefCountsByResourceId.delete(resourceId); + const resource = resourcesById.get(resourceId); + if (!resource) return ok(); + + resourcesById.delete(resourceId); + resource[Symbol.dispose](); + return ok(); + }), + ), + ); + assert( + result.ok, + "Unabortable scheduled resource disposal must not abort", + ); + })(); + }, disposalDelay); + + disposalTimeoutByResourceId.set(resourceId, timeout); + }; + return { addConsumer: (consumer, resourceConfigs) => async (run) => { if (disposing) return ok(); @@ -170,6 +261,7 @@ export const createResources = < unabortable( mutexByResourceId.withLock(resourceId, async () => { if (disposing) return ok(); + clearDisposalTimeout(resourceId); let resource = resourcesById.get(resourceId); if (!resource) { @@ -198,7 +290,7 @@ export const createResources = < }), ), ); - assert(result.ok, "Unabortable addConsumer lock must not abort"); + if (!result.ok) return result; } return ok(); @@ -208,6 +300,9 @@ export const createResources = < if (disposing) return ok(); const consumerId = getConsumerId(consumer); + type RemoveConsumerError = + | ResourceNotFoundError + | ConsumerNotFoundError; for (const resourceConfig of resourceConfigs) { if (disposing) return ok(); @@ -217,44 +312,45 @@ export const createResources = < const result = await run( unabortable( - mutexByResourceId.withLock(resourceId, () => { - if (disposing) return ok(); + mutexByResourceId.withLock( + resourceId, + (): Result => { + if (disposing) return ok(); + + const consumerRefCountsByConsumerId = + consumerRefCountsByResourceId.get(resourceId); + if (!consumerRefCountsByConsumerId) { + return err>({ + type: "ResourceNotFoundError", + resourceKey: resourceId, + }); + } + + const nextCount = + consumerRefCountsByConsumerId.decrement(consumerId); + if (isNone(nextCount)) { + return err>({ + type: "ConsumerNotFoundError", + consumerId, + resourceKey: resourceId, + }); + } + + if (nextCount.value === 0) { + consumerIdsByResourceId.remove(resourceId, consumerId); + } + + if (!consumerIdsByResourceId.hasA(resourceId)) { + consumerRefCountsByResourceId.delete(resourceId); + scheduleResourceDisposal(resourceId); + } - const consumerRefCountsByConsumerId = - consumerRefCountsByResourceId.get(resourceId); - if (!consumerRefCountsByConsumerId) { - assert( - !consumerIdsByResourceId.hasA(resourceId) && - !resourcesById.has(resourceId), - "Ref counts, relation, and resources must stay symmetric", - ); return ok(); - } - - const nextCount = - consumerRefCountsByConsumerId.decrement(consumerId); - if (isNone(nextCount)) return ok(); - - if (nextCount.value === 0) { - consumerIdsByResourceId.remove(resourceId, consumerId); - } - - if (!consumerIdsByResourceId.hasA(resourceId)) { - consumerRefCountsByResourceId.delete(resourceId); - const resource = resourcesById.get(resourceId); - assert( - resource, - "Resource must exist when last consumer reference is removed", - ); - resourcesById.delete(resourceId); - resource[Symbol.dispose](); - } - - return ok(); - }), + }, + ), ), ); - assert(result.ok, "Unabortable removeConsumer lock must not abort"); + if (!result.ok) return result; } return ok(); @@ -283,6 +379,10 @@ export const createResources = < disposePromise = (async () => { await using run = createRun(); + for (const timeout of disposalTimeoutByResourceId.values()) { + time.clearTimeout(timeout); + } + disposalTimeoutByResourceId.clear(); const drainIds = new Set(resourceIdsWithMutex); for (const resourceId of resourcesById.keys()) { @@ -308,6 +408,7 @@ export const createResources = < resourcesById.clear(); consumerRefCountsByResourceId.clear(); consumerIdsByResourceId.clear(); + disposalTimeoutByResourceId.clear(); resourceIdsWithMutex.clear(); mutexByResourceId[Symbol.dispose](); })(); @@ -316,3 +417,309 @@ export const createResources = < }, }; }; + +const createLegacyResources = < + TResource extends Disposable, + TResourceKey extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +>( + deps: TimeDep, + config: LegacyResourcesConfig< + TResource, + TResourceKey, + TResourceConfig, + TConsumer, + TConsumerId + >, +): LegacyResources< + TResource, + TResourceKey, + TResourceConfig, + TConsumer, + TConsumerId +> => { + let isDisposed = false; + + const resourcesMap = new Map(); + const consumerCounts = new Map>(); + const consumers = new Map(); + const disposalTimeouts = new Map(); + + const disposalDelay = config.disposalDelay ?? "100ms"; + + const ensureResource = (resourceConfig: TResourceConfig) => { + const key = config.getResourceKey(resourceConfig); + const timeout = disposalTimeouts.get(key); + if (timeout) { + deps.time.clearTimeout(timeout); + disposalTimeouts.delete(key); + } + + if (!resourcesMap.has(key)) { + const resource = config.createResource(resourceConfig); + resourcesMap.set(key, resource); + } + }; + + const scheduleDisposal = (key: TResourceKey): void => { + const timeout = deps.time.setTimeout(() => { + const resource = resourcesMap.get(key); + if (resource) { + resource[Symbol.dispose](); + resourcesMap.delete(key); + } + disposalTimeouts.delete(key); + }, disposalDelay); + + disposalTimeouts.set(key, timeout); + }; + + const resources: LegacyResources< + TResource, + TResourceKey, + TResourceConfig, + TConsumer, + TConsumerId + > = { + addConsumer: (consumer, resourceConfigs) => { + if (isDisposed) return; + if (resourceConfigs.length === 0) return; + + const consumerId = config.getConsumerId(consumer); + consumers.set(consumerId, consumer); + + for (const resourceConfig of resourceConfigs) { + ensureResource(resourceConfig); + const resourceKey = config.getResourceKey(resourceConfig); + + let counts = consumerCounts.get(resourceKey); + if (!counts) { + counts = new Map(); + consumerCounts.set(resourceKey, counts); + } + + const currentCount = counts.get(consumerId) ?? 0; + const newCount = currentCount + 1; + counts.set(consumerId, PositiveInt.orThrow(newCount)); + + if (currentCount === 0 && config.onConsumerAdded) { + const resource = resourcesMap.get(resourceKey); + if (resource) { + config.onConsumerAdded(consumer, resource, resourceKey); + } + } + } + }, + + removeConsumer: (consumer, resourceConfigs) => { + if (isDisposed) return ok(); + + const consumerId = config.getConsumerId(consumer); + const removeCountsByResourceKey = new Map(); + + for (const resourceConfig of resourceConfigs) { + const key = config.getResourceKey(resourceConfig); + const removeCount = (removeCountsByResourceKey.get(key) ?? 0) + 1; + removeCountsByResourceKey.set(key, removeCount); + } + + const validatedRemovals = new Map< + TResourceKey, + { + readonly counts: Map; + readonly currentCount: PositiveInt; + readonly removeCount: number; + } + >(); + + for (const [key, removeCount] of removeCountsByResourceKey) { + const counts = consumerCounts.get(key); + if (!counts) { + return err({ type: "ResourceNotFoundError", resourceKey: key }); + } + + const currentCount = counts.get(consumerId); + if (currentCount == null || currentCount < removeCount) { + return err({ + type: "ConsumerNotFoundError", + consumerId, + resourceKey: key, + }); + } + + validatedRemovals.set(key, { counts, currentCount, removeCount }); + } + + for (const [key, removal] of validatedRemovals) { + const { counts, currentCount, removeCount } = removal; + const nextCount = currentCount - removeCount; + + if (nextCount === 0) { + counts.delete(consumerId); + + if (config.onConsumerRemoved) { + const resource = resourcesMap.get(key); + if (resource) { + config.onConsumerRemoved(consumer, resource, key); + } + } + + if (counts.size === 0) { + consumerCounts.delete(key); + scheduleDisposal(key); + } + } else { + counts.set(consumerId, PositiveInt.orThrow(nextCount)); + } + } + + if (!resources.hasConsumerAnyResource(consumer)) { + consumers.delete(consumerId); + } + + return ok(); + }, + + getResource: (key) => { + if (isDisposed) return null; + return resourcesMap.get(key) ?? null; + }, + + getConsumersForResource: (key) => { + if (isDisposed) return []; + const counts = consumerCounts.get(key); + return counts ? Array.from(counts.keys()) : []; + }, + + hasConsumerAnyResource: (consumer) => { + if (isDisposed) return false; + const consumerId = config.getConsumerId(consumer); + return Array.from(consumerCounts.values()).some((counts) => + counts.has(consumerId), + ); + }, + + getConsumer: (consumerId) => { + if (isDisposed) return null; + const consumer = consumers.get(consumerId); + if (!consumer) return null; + if (!resources.hasConsumerAnyResource(consumer)) return null; + return consumer; + }, + + [Symbol.dispose]: () => { + if (isDisposed) return; + isDisposed = true; + + for (const timeout of disposalTimeouts.values()) { + deps.time.clearTimeout(timeout); + } + disposalTimeouts.clear(); + + for (const resource of resourcesMap.values()) { + resource[Symbol.dispose](); + } + resourcesMap.clear(); + consumerCounts.clear(); + consumers.clear(); + }, + }; + + return resources; +}; + +/** + * Creates {@link Resources}. + * + * Supports two call forms: + * + * - `createResources(config)` for async Task-based resources. + * - `createResources({ time })(config)` for legacy synchronous resources. + */ +export function createResources< + TResource extends Disposable, + TResourceId extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +>( + deps: TimeDep, +): ( + config: LegacyResourcesConfig< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId + >, +) => LegacyResources< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId +>; +export function createResources< + TResource extends Disposable, + TResourceId extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +>( + config: AsyncResourcesConfig< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId + >, +): Resources; +export function createResources< + TResource extends Disposable, + TResourceId extends string, + TResourceConfig, + TConsumer, + TConsumerId extends string, +>( + configOrDeps: + | TimeDep + | AsyncResourcesConfig< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId + >, +): + | Resources + | (( + config: LegacyResourcesConfig< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId + >, + ) => LegacyResources< + TResource, + TResourceId, + TResourceConfig, + TConsumer, + TConsumerId + >) { + if (isTimeDep(configOrDeps)) { + return (config) => createLegacyResources(configOrDeps, config); + } + + return createAsyncResources(configOrDeps); +} + +const isTimeDep = (value: unknown): value is TimeDep => + typeof value === "object" && + value !== null && + "time" in value && + !("createResource" in value) && + !("getResourceId" in value) && + !("getConsumerId" in value); diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index e845b5f1b..d2339c8f7 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -49,19 +49,19 @@ import { PositiveInt, type Typed, typed, - union, Unknown, UnknownResult, + union, } from "./Type.js"; -import type { isPromiseLike } from "./Types.js"; -import { - type Awaitable, - type Callback, - type CallbackWithCleanup, - type Int1To100, - type Mutable, - type NewKeys, - type Predicate, +import type { + Awaitable, + Callback, + CallbackWithCleanup, + Int1To100, + isPromiseLike, + Mutable, + NewKeys, + Predicate, } from "./Types.js"; /** diff --git a/packages/common/src/WebSocket.ts b/packages/common/src/WebSocket.ts index 1007ffb98..50a7a5550 100644 --- a/packages/common/src/WebSocket.ts +++ b/packages/common/src/WebSocket.ts @@ -310,3 +310,28 @@ const nativeToStringState: Record = { [globalThis.WebSocket.CLOSING]: "closing", [globalThis.WebSocket.CLOSED]: "closed", }; + +export interface TestCreateWebSocketOptions { + readonly throwOnCreate?: boolean; +} + +/** + * Test helper that creates a deterministic {@link CreateWebSocket} adapter. + */ +export const testCreateWebSocket = + ({ + throwOnCreate = false, + }: TestCreateWebSocketOptions = {}): CreateWebSocket => + () => + async () => { + if (throwOnCreate) { + throw new Error("testCreateWebSocket: throwOnCreate"); + } + + return ok({ + send: () => ok(), + getReadyState: () => "open", + isOpen: () => true, + [Symbol.dispose]: () => {}, + }); + }; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index ba36fce82..336e92827 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -20,7 +20,6 @@ export * from "./Identicon.js"; export * from "./Listeners.js"; // Local-first essentials. export type { EvoluError } from "./local-first/Error.js"; -export { AppName, createEvolu } from "./local-first/Evolu.js"; export type { AppNameError, Evolu, @@ -28,6 +27,7 @@ export type { EvoluDeps, UnuseOwner, } from "./local-first/Evolu.js"; +export { AppName, createEvolu } from "./local-first/Evolu.js"; export * from "./local-first/LocalAuth.js"; export * from "./local-first/Owner.js"; export type { diff --git a/packages/common/src/local-first/Db.ts b/packages/common/src/local-first/Db.ts index 8f091f925..6c2e2666b 100644 --- a/packages/common/src/local-first/Db.ts +++ b/packages/common/src/local-first/Db.ts @@ -32,8 +32,7 @@ import { type SqliteValue, sql, } from "../Sqlite.js"; -import type { LeaderLockDep } from "../Task.js"; -import { type AsyncDisposableStack, type Task } from "../Task.js"; +import type { AsyncDisposableStack, LeaderLockDep, Task } from "../Task.js"; import { type Millis, millisToDateIso, type TimeDep } from "../Time.js"; import type { Name } from "../Type.js"; import { diff --git a/packages/common/src/local-first/Evolu.ts b/packages/common/src/local-first/Evolu.ts index cf512c16b..49017c1d6 100644 --- a/packages/common/src/local-first/Evolu.ts +++ b/packages/common/src/local-first/Evolu.ts @@ -764,11 +764,12 @@ export const createEvolu = break; } case "OnExport": { - if (exportDatabasePending) { - exportDatabasePending.resolve(message.file); - exportDatabasePending = null; - } - // Silently ignore late OnExport after disposal + assert( + exportDatabasePending, + "OnExport received without pending export.", + ); + exportDatabasePending.resolve(message.file); + exportDatabasePending = null; break; } default: diff --git a/packages/common/src/local-first/Query.ts b/packages/common/src/local-first/Query.ts index 2d566a346..1f7c5468d 100644 --- a/packages/common/src/local-first/Query.ts +++ b/packages/common/src/local-first/Query.ts @@ -7,17 +7,17 @@ import type { AliasableExpression, Expression, + Simplify as KyselySimplify, RawBuilder, SelectQueryNode, - Simplify as KyselySimplify, } from "kysely"; import { AliasNode, ColumnNode, ExpressionWrapper, IdentifierNode, - ReferenceNode, sql as kyselySqlBuilder, + ReferenceNode, TableNode, ValueNode, } from "kysely"; @@ -31,8 +31,8 @@ import { eqSqliteValue, type SqliteValue, sql } from "../Sqlite.js"; import { createId, String } from "../Type.js"; import type { Simplify } from "../Types.js"; -export { sql as kyselySql } from "kysely"; export type { NotNull as KyselyNotNull } from "kysely"; +export { sql as kyselySql } from "kysely"; /** * A type-safe SQL query. diff --git a/packages/common/src/local-first/Relay.ts b/packages/common/src/local-first/Relay.ts index 9839f51ce..a26e1e872 100644 --- a/packages/common/src/local-first/Relay.ts +++ b/packages/common/src/local-first/Relay.ts @@ -10,20 +10,20 @@ import { isNonEmptyArray, mapArray, } from "../Array.js"; -import type { TimingSafeEqualDep } from "../Crypto.js"; import { assert } from "../Assert.js"; +import type { TimingSafeEqualDep } from "../Crypto.js"; import type { Result } from "../Result.js"; import { err, ok } from "../Result.js"; import type { SqliteDep } from "../Sqlite.js"; import { sql } from "../Sqlite.js"; import { createMutexByKey } from "../Task.js"; -import { PositiveInt, Name } from "../Type.js"; -import { isPromiseLike, type Awaitable } from "../Types.js"; +import { type Name, PositiveInt } from "../Type.js"; +import { type Awaitable, isPromiseLike } from "../Types.js"; import { - OwnerId, - ownerIdBytesToOwnerId, + type OwnerId, // OwnerTransport, - OwnerWriteKey, + type OwnerWriteKey, + ownerIdBytesToOwnerId, } from "./Owner.js"; import type { EncryptedDbChange, @@ -159,10 +159,17 @@ export const createRelaySqliteStorage = writeMessages: (ownerIdBytes, messages) => async (run) => { const ownerId = ownerIdBytesToOwnerId(ownerIdBytes); - const messagesWithTimestampBytes = mapArray(messages, (m) => ({ - timestamp: timestampToTimestampBytes(m.timestamp), - change: m.change, - })); + const messagesWithTimestampBytes = filterArray( + mapArray(messages, (m) => ({ + timestamp: timestampToTimestampBytes(m.timestamp), + change: m.change, + })), + (message) => message.change.length > 0, + ); + + if (!isNonEmptyArray(messagesWithTimestampBytes)) { + return ok(); + } const result = await run( mutexByOwnerId.withLock( @@ -225,23 +232,17 @@ export const createRelaySqliteStorage = firstTimestamp, lastTimestamp, ); - - { - sqliteStorageBase.insertTimestamp( - ownerIdBytes, - timestamp, - strategy, - ); - } - - { - deps.sqlite.exec(sql` + sqliteStorageBase.insertTimestamp( + ownerIdBytes, + timestamp, + strategy, + ); + deps.sqlite.exec(sql` insert into evolu_message ("ownerId", "timestamp", "change") values (${ownerIdBytes}, ${timestamp}, ${change}) on conflict do nothing; `); - } } updateOwnerUsage(deps)( diff --git a/packages/common/src/local-first/Shared.ts b/packages/common/src/local-first/Shared.ts index 3872d540b..6f0f44d68 100644 --- a/packages/common/src/local-first/Shared.ts +++ b/packages/common/src/local-first/Shared.ts @@ -8,8 +8,8 @@ import { emptyArray, firstInArray, isNonEmptyArray, - shiftFromArray, type NonEmptyReadonlyArray, + shiftFromArray, } from "../Array.js"; import { assert } from "../Assert.js"; import { createCallbacks } from "../Callbacks.js"; @@ -19,7 +19,8 @@ import { createResources, type Resources } from "../Resources.js"; import { ok } from "../Result.js"; import { spaced } from "../Schedule.js"; import type { NonEmptyReadonlySet } from "../Set.js"; -import { createMutexByKey, repeat, type Fiber, type Task } from "../Task.js"; +import { createMutexByKey, type Fiber, repeat, type Task } from "../Task.js"; +import type { TimeDep, TimeoutId } from "../Time.js"; import { createId, type Id, type Name } from "../Type.js"; import type { Callback, ExtractType } from "../Types.js"; import type { CreateWebSocketDep, WebSocket } from "../WebSocket.js"; @@ -52,7 +53,7 @@ interface TransportsDep { readonly transports: SharedTransportResources; } -export type SharedWorkerDeps = WorkerDeps & CreateWebSocketDep; +export type SharedWorkerDeps = WorkerDeps & CreateWebSocketDep & TimeDep; export type SharedWorkerInput = | { @@ -252,6 +253,10 @@ export type DbWorkerOutput = readonly type: "LeaderAcquired"; readonly name: Name; } + | { + readonly type: "LeaderHeartbeat"; + readonly name: Name; + } | { readonly type: "OnQueuedResponse"; readonly callbackId: Id; @@ -322,6 +327,8 @@ const createSharedEvolu = > | null; let queueProcessingFiber: Fiber | null = null; + let activeQueueCallbackId: Id | null = null; + let activeLeaderTimeout: TimeoutId | null = null; const ownerTransports = appOwner?.transports ?? emptyArray; @@ -329,7 +336,43 @@ const createSharedEvolu = await run(transports.addConsumer(appOwner, ownerTransports)); } + const clearActiveLeaderTimeout = (): void => { + if (!activeLeaderTimeout) return; + run.deps.time.clearTimeout(activeLeaderTimeout); + activeLeaderTimeout = null; + }; + + const touchActiveLeaderTimeout = (): void => { + clearActiveLeaderTimeout(); + if (!queueProcessingFiber) return; + + activeLeaderTimeout = run.deps.time.setTimeout(() => { + clearActiveLeaderTimeout(); + + queueProcessingFiber?.abort(); + queueProcessingFiber = null; + + if (activeQueueCallbackId) { + callbacks.cancel(activeQueueCallbackId); + activeQueueCallbackId = null; + } + + // Wait for a new leader after heartbeat timeout. + activeDbWorkerPort = null; + }, "35s"); + }; + + const removeQueuedItemsForDisposedPorts = (): void => { + for (let i = queue.length - 1; i >= 0; i -= 1) { + if (!evoluPorts.has(queue[i].evoluPortId)) { + queue.splice(i, 1); + } + } + }; + const ensureQueueProcessing = (): void => { + removeQueuedItemsForDisposedPorts(); + if ( queueProcessingFiber || !isNonEmptyArray(queue) || @@ -341,6 +384,8 @@ const createSharedEvolu = const first = firstInArray(queue); const callbackId = callbacks.register(({ evoluPortId, response }) => { + clearActiveLeaderTimeout(); + activeQueueCallbackId = null; queueProcessingFiber?.abort(); queueProcessingFiber = null; @@ -389,8 +434,10 @@ const createSharedEvolu = // Complete the current queue item and continue with the next one. shiftFromArray(queue); + removeQueuedItemsForDisposedPorts(); ensureQueueProcessing(); }); + activeQueueCallbackId = callbackId; queueProcessingFiber = run.daemon( repeat(() => { @@ -399,6 +446,7 @@ const createSharedEvolu = return ok(); }, spaced("5s")), // 5s seems to be a good balance ); + touchActiveLeaderTimeout(); }; const createPatchesByQuery = ( @@ -442,6 +490,14 @@ const createSharedEvolu = case "LeaderAcquired": { activeDbWorkerPort = dbWorkerPort; console.info("leaderAcquired"); + touchActiveLeaderTimeout(); + ensureQueueProcessing(); + break; + } + case "LeaderHeartbeat": { + if (activeDbWorkerPort === dbWorkerPort && queueProcessingFiber) { + touchActiveLeaderTimeout(); + } ensureQueueProcessing(); break; } @@ -470,9 +526,35 @@ const createSharedEvolu = evoluPortId, hadLastPort: evoluPorts.size === 1, }); + + const isActiveQueueItemDisposed = + isNonEmptyArray(queue) && queue[0].evoluPortId === evoluPortId; + evoluPorts.delete(evoluPortId); rowsByQueryByEvoluPortId.delete(evoluPortId); + + for (let i = queue.length - 1; i >= 0; i -= 1) { + if (queue[i].evoluPortId === evoluPortId) { + queue.splice(i, 1); + } + } + + if (isActiveQueueItemDisposed) { + clearActiveLeaderTimeout(); + queueProcessingFiber?.abort(); + queueProcessingFiber = null; + + if (activeQueueCallbackId) { + callbacks.cancel(activeQueueCallbackId); + activeQueueCallbackId = null; + } + + // Require leader reacquire before dispatching remaining queue. + activeDbWorkerPort = null; + } + if (evoluPorts.size === 0) onDispose(); + ensureQueueProcessing(); // TODO: Decided what to do with DbWorker but probably dispose it, but // https://bugs.webkit.org/show_bug.cgi?id=301520 @@ -500,8 +582,13 @@ const createSharedEvolu = await run(transports.removeConsumer(appOwner, ownerTransports)); } + clearActiveLeaderTimeout(); queueProcessingFiber?.abort(); queueProcessingFiber = null; + if (activeQueueCallbackId) { + callbacks.cancel(activeQueueCallbackId); + activeQueueCallbackId = null; + } callbacks[Symbol.dispose](); activeDbWorkerPort = null; queue.length = 0; diff --git a/packages/common/src/local-first/Sync.ts b/packages/common/src/local-first/Sync.ts index d8e1e570b..f74e43e15 100644 --- a/packages/common/src/local-first/Sync.ts +++ b/packages/common/src/local-first/Sync.ts @@ -28,22 +28,22 @@ import type { Result } from "../Result.js"; import { err, ok } from "../Result.js"; import type { SqliteDep } from "../Sqlite.js"; import { - SqliteBoolean, booleanToSqliteBoolean, + SqliteBoolean, + type SqliteValue, sql, sqliteBooleanToBoolean, - type SqliteValue, } from "../Sqlite.js"; import { createMutex, createRun } from "../Task.js"; import type { TimeDep } from "../Time.js"; import { Millis, millisToDateIso } from "../Time.js"; import type { Typed } from "../Type.js"; import { - PositiveInt, - idBytesToId, - idToIdBytes, type Id, type IdBytes, + idBytesToId, + idToIdBytes, + PositiveInt, } from "../Type.js"; import { isPromiseLike } from "../Types.js"; import type { CreateWebSocketDep, WebSocket } from "../WebSocket.js"; @@ -56,10 +56,10 @@ import type { ReadonlyOwner, } from "./Owner.js"; import { - ownerIdBytesToOwnerId, - ownerIdToOwnerIdBytes, type OwnerId, type OwnerIdBytes, + ownerIdBytesToOwnerId, + ownerIdToOwnerIdBytes, } from "./Owner.js"; import type { ProtocolError, @@ -69,12 +69,12 @@ import type { ProtocolTimestampMismatchError, } from "./Protocol.js"; import { - SubscriptionFlags, createProtocolMessageForSync, createProtocolMessageForUnsubscribe, createProtocolMessageFromCrdtMessages, decryptAndDecodeDbChange, encodeAndEncryptDbChange, + SubscriptionFlags, } from "./Protocol.js"; import type { MutationChange, SqliteSchemaDep } from "./Schema.js"; import { systemColumns } from "./Schema.js"; @@ -85,8 +85,8 @@ import type { StorageConfig, } from "./Storage.js"; import { - DbChange, createBaseSqliteStorage, + DbChange, getNextStoredBytes, getOwnerUsage, getTimestampInsertStrategy, @@ -185,6 +185,13 @@ export const createSync = TimestampConfigDep, ) => (config: SyncConfig): Sync => { + const disposalDelayMs = config.disposalDelayMs ?? 100; + assert( + Number.isInteger(disposalDelayMs) && disposalDelayMs >= 0, + "Invalid SyncConfig.disposalDelayMs", + ); + const disposalDelay = Millis.orThrow(disposalDelayMs); + let isDisposed = false; const syncRun = createRun(deps); const syncOwnersById = new Map(); @@ -212,13 +219,13 @@ export const createSync = const run = createRun(deps); let socket: WebSocket | null = null; - let isDisposed = false; + let resourceDisposed = false; const pendingSends: Array< string | ArrayBufferLike | Blob | ArrayBufferView > = []; const flushPendingSends = (): void => { - if (isDisposed || !socket || pendingSends.length === 0) return; + if (resourceDisposed || !socket || pendingSends.length === 0) return; for (const data of pendingSends.splice(0, pendingSends.length)) { const result = socket.send(data); @@ -233,7 +240,7 @@ export const createSync = const webSocket: WebSocket = { send: (data) => { - if (isDisposed) return err({ type: "WebSocketSendError" }); + if (resourceDisposed) return err({ type: "WebSocketSendError" }); if (!socket) { pendingSends.push(data); return ok(); @@ -243,15 +250,15 @@ export const createSync = /* v8 ignore next */ getReadyState: () => { - if (isDisposed) return "closed"; + if (resourceDisposed) return "closed"; return socket?.getReadyState() ?? "connecting"; }, - isOpen: () => !isDisposed && (socket?.isOpen() ?? false), + isOpen: () => !resourceDisposed && (socket?.isOpen() ?? false), [Symbol.dispose]: () => { - if (isDisposed) return; - isDisposed = true; + if (resourceDisposed) return; + resourceDisposed = true; pendingSends.length = 0; webSocketsByTransportKey.delete(transportKey); socket?.[Symbol.dispose](); @@ -264,7 +271,7 @@ export const createSync = binaryType: "arraybuffer", onOpen: () => { - if (isDisposed) return; + if (resourceDisposed) return; const currentWebSocket = webSocketsByTransportKey.get(transportKey); if (!currentWebSocket) return; @@ -298,7 +305,7 @@ export const createSync = onMessage: (data: string | ArrayBuffer | Blob) => { // Only handle ArrayBuffer data for sync messages. - if (isDisposed || !(data instanceof ArrayBuffer)) return; + if (resourceDisposed || !(data instanceof ArrayBuffer)) return; const currentWebSocket = webSocketsByTransportKey.get(transportKey); if (!currentWebSocket) return; @@ -316,6 +323,7 @@ export const createSync = ).then( (result) => { if (!result.ok) { + if (isDisposed || resourceDisposed) return; if (result.error.type !== "AbortError") { config.onError(createUnknownError(result.error)); } @@ -327,7 +335,7 @@ export const createSync = /* v8 ignore start */ // Defensive cleanup for a resolved socket after disposal. - if (isDisposed) { + if (resourceDisposed || isDisposed) { socket[Symbol.dispose](); } /* v8 ignore stop */ @@ -349,9 +357,12 @@ export const createSync = SyncOwner, OwnerId >({ - createResource: async (transport) => createResource(transport), + createResource: async (transport: OwnerTransport) => + createResource(transport), getResourceId: createTransportKey, - getConsumerId: (owner) => owner.id, + getConsumerId: (owner: SyncOwner) => owner.id, + disposalDelay, + time: deps.time, }); const sendSubscribeForOwner = (owner: SyncOwner): void => { @@ -389,7 +400,7 @@ export const createSync = const webSocket = webSocketsByTransportKey.get( createTransportKey(transport), ); - if (webSocket?.isOpen()) webSocket.send(message); + if (webSocket) webSocket.send(message); } }; @@ -408,6 +419,12 @@ export const createSync = const transports = owner.transports ?? config.transports; if (use) { + const hadOpenTransportAtUseTime = transports.some((transport) => + webSocketsByTransportKey + .get(createTransportKey(transport)) + ?.isOpen(), + ); + syncOwnerRefs.increment(owner.id); syncOwnersById.set(owner.id, owner); void syncRun(resources.addConsumer(owner, transports)).then( @@ -419,7 +436,7 @@ export const createSync = return; } if (!syncOwnerRefs.has(owner.id)) return; - sendSubscribeForOwner(owner); + if (hadOpenTransportAtUseTime) sendSubscribeForOwner(owner); }, (error: unknown) => { config.onError(createUnknownError(error)); @@ -427,12 +444,28 @@ export const createSync = ); } else { sendUnsubscribeForOwner(owner); + + const hasMissingTransport = transports.some( + (transport) => + !webSocketsByTransportKey.has(createTransportKey(transport)), + ); + if (hasMissingTransport) { + deps.console.warn("[sync]", "Failed to remove consumer", { + ownerId: owner.id, + error: { type: "ResourceNotFoundError" }, + }); + } + syncOwnerRefs.decrement(owner.id); if (!syncOwnerRefs.has(owner.id)) syncOwnersById.delete(owner.id); void syncRun(resources.removeConsumer(owner, transports)).then( (result) => { if (result.ok) return; if ((result.error as { type?: string }).type !== "AbortError") { + deps.console.warn("[sync]", "Failed to remove consumer", { + ownerId: owner.id, + error: result.error, + }); config.onError(createUnknownError(result.error)); } }, @@ -801,9 +834,12 @@ const createClientStorage = if (!result.ok) { const error = result.error as { type?: string }; if (error.type !== "AbortError") { - const unknownError = createUnknownError(result.error); - config.onError(unknownError); - throw new Error(unknownError.type, { cause: unknownError }); + config.onError( + result.error as Parameters[0], + ); + throw new Error(error.type ?? "UnknownError", { + cause: result.error, + }); } return ok(); } diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index 3e1f6927b..cd4a8a919 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -35,40 +35,40 @@ import type { } from "../src/Task.js"; import { AbortError, - all, AllAbortError, - allSettled, AllSettledAbortError, - any, AnyAbortError, - AsyncDisposableStack, + type AsyncDisposableStack, + all, + allSettled, + any, callback, concurrently, createDeferred, createGate, createInMemoryLeaderLock, createMutex, - createMutexRef, createMutexByKey, + createMutexRef, createRun, createSemaphore, createSemaphoreByKey, + type DeferredDisposedError, deferredDisposedError, - DeferredDisposedError, fetch, - map, MapAbortError, + map, mapSettled, - race, RaceLostError, + type RunEvent, + race, repeat, retry, runStoppedError, - RunEvent, semaphoreDisposedError, sleep, - timeout, TimeoutError, + timeout, unabortable, unabortableMask, yieldNow, @@ -76,17 +76,12 @@ import { import { testCreateDeps, testCreateRun, + testName, testWaitForMacrotask, } from "../src/Test.js"; import { createTime, Millis, msLongTask, testCreateTime } from "../src/Time.js"; import type { Typed } from "../src/Type.js"; -import { - Id, - minPositiveInt, - Name, - PositiveInt, - testName, -} from "../src/Type.js"; +import { type Id, minPositiveInt, Name, PositiveInt } from "../src/Type.js"; const eventsEnabled: RunConfigDep = { runConfig: { eventsEnabled: createRef(true) }, diff --git a/packages/common/test/TreeShaking.test.ts b/packages/common/test/TreeShaking.test.ts index 608fb12cc..2c48b2bb5 100644 --- a/packages/common/test/TreeShaking.test.ts +++ b/packages/common/test/TreeShaking.test.ts @@ -184,13 +184,13 @@ const normalizeBundleSize = ( } if (fixture === "task-example") { - if (gzip >= 5650 && gzip <= 5750) gzip = 5692; - if (raw >= 15250 && raw <= 15650) raw = 15511; + if (gzip >= 5350 && gzip <= 5450) gzip = 5395; + if (raw >= 14250 && raw <= 14500) raw = 14356; } if (fixture === "type-object") { - if (gzip >= 1950 && gzip <= 2100) gzip = 2006; - if (raw >= 6000 && raw <= 6200) raw = 6082; + if (gzip >= 1880 && gzip <= 1980) gzip = 1937; + if (raw >= 5700 && raw <= 5850) raw = 5769; } return { gzip, raw }; @@ -215,12 +215,12 @@ describe("tree-shaking", () => { "raw": 1602, }, "task-example": { - "gzip": 5239, - "raw": 13750, + "gzip": 5395, + "raw": 14356, }, "type-object": { - "gzip": 1423, - "raw": 4393, + "gzip": 1937, + "raw": 5769, }, } `); diff --git a/packages/common/test/local-first/Evolu.test.ts b/packages/common/test/local-first/Evolu.test.ts index 0800ad2c8..415f2af28 100644 --- a/packages/common/test/local-first/Evolu.test.ts +++ b/packages/common/test/local-first/Evolu.test.ts @@ -22,10 +22,10 @@ import { import { testQuery, testQuery2 } from "../../src/local-first/Query.js"; import { createQueryBuilder } from "../../src/local-first/Schema.js"; import { - initSharedWorker, type EvoluInput, type EvoluOutput, type EvoluTabOutput, + initSharedWorker, type SharedWorker, type SharedWorkerInput, } from "../../src/local-first/Shared.js"; @@ -45,18 +45,18 @@ import { testName, } from "../../src/Type.js"; import type { ExtractType } from "../../src/Types.js"; +import { testCreateWebSocket } from "../../src/WebSocket.js"; import { createMessageChannel, createMessagePort, createSharedWorker, createWorker, - testWaitForWorkerMessage, testCreateMessageChannel, testCreateMessagePort, testCreateSharedWorker, testCreateWorker, + testWaitForWorkerMessage, } from "../../src/Worker.js"; -import { testCreateWebSocket } from "../../src/WebSocket.js"; import { testCreateSqliteDeps } from "../_deps.js"; import { testAppOwner } from "./_fixtures.js"; @@ -442,14 +442,14 @@ describe("unit tests", () => { ); expect(evolu.appOwner).toMatchInlineSnapshot(` - { - "encryptionKey": uint8:[50,42,177,193,76,197,92,240,100,30,92,209,205,42,108,45,195,37,118,158,238,206,161,144,11,241,190,167,14,254,186,53], - "id": "t_xEbmXuICrgDm3Ob0_afw", - "mnemonic": "old jungle over boy ankle suggest service source civil insane end silver polar swap flight diagram keep fix gauge social wink subway bronze leader", - "type": "AppOwner", - "writeKey": uint8:[129,228,239,103,127,237,0,59,174,241,77,12,26,180,213,14], - } - `); + { + "encryptionKey": uint8:[51,231,177,91,230,145,176,109,130,148,152,121,45,182,111,94,53,215,154,110,96,244,72,84,84,159,250,76,118,95,103,5], + "id": "SUVItd3dEQ8CLSsCqwJahA", + "mnemonic": "duck still purse lock purpose orchard silver differ clean night measure jewel accident visual knee spring extra winner inner fade estate cushion flock live", + "type": "AppOwner", + "writeKey": uint8:[107,116,39,189,145,48,68,79,11,181,104,47,132,89,107,220], + } + `); }); }); @@ -982,7 +982,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "Todo 1", @@ -1041,7 +1041,7 @@ describe("unit tests", () => { "id": "VPIPiOGb2m2OlsM-pg18CA", "isDelete": true, "isInsert": false, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "Updated", @@ -1051,7 +1051,7 @@ describe("unit tests", () => { "id": "j4rh6UkYDIqXKLCOX4ru2A", "isDelete": null, "isInsert": true, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "Upserted", @@ -1112,7 +1112,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "A", @@ -1122,7 +1122,7 @@ describe("unit tests", () => { "id": "fOTG65tQ_ZYHpSBp3GbogA", "isDelete": null, "isInsert": false, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "B", @@ -1132,7 +1132,7 @@ describe("unit tests", () => { "id": "3I1Sfwp5IxdacWcpAna5qg", "isDelete": null, "isInsert": true, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "C", @@ -1181,7 +1181,7 @@ describe("unit tests", () => { "id": Any, "isDelete": null, "isInsert": true, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "table": "todo", "values": { "title": "With callback", @@ -1505,7 +1505,7 @@ describe("integration tests", () => { "name": "evolu_config", "rows": [ { - "clock": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "clock": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], }, ], }, @@ -1514,18 +1514,18 @@ describe("integration tests", () => { "rows": [ { "column": "title", - "id": uint8:[37,188,91,250,231,27,86,22,93,22,62,94,220,186,83,245], - "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], + "id": uint8:[160,113,55,152,72,115,160,45,137,237,156,223,234,49,112,82], + "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], "table": "todo", - "timestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "timestamp": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], "value": "Integration todo", }, { "column": "createdAt", - "id": uint8:[37,188,91,250,231,27,86,22,93,22,62,94,220,186,83,245], - "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], + "id": uint8:[160,113,55,152,72,115,160,45,137,237,156,223,234,49,112,82], + "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], "table": "todo", - "timestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "timestamp": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], "value": "1970-01-01T00:00:00.000Z", }, ], @@ -1539,11 +1539,11 @@ describe("integration tests", () => { "rows": [ { "c": 1, - "h1": 181602913099403, - "h2": 262418046898630, - "l": 2, - "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], - "t": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], + "h1": 104312911511672, + "h2": 160957934804849, + "l": 1, + "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], + "t": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], }, ], }, @@ -1551,10 +1551,10 @@ describe("integration tests", () => { "name": "evolu_usage", "rows": [ { - "firstTimestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], - "lastTimestamp": uint8:[0,0,0,0,0,0,0,1,37,188,91,250,231,27,86,22], - "ownerId": uint8:[251,208,27,154,71,19,37,213,195,24,203,60,255,39,7,11], - "storedBytes": 1, + "firstTimestamp": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], + "lastTimestamp": uint8:[0,0,0,0,0,0,0,1,160,113,55,152,72,115,160,45], + "ownerId": uint8:[213,187,31,214,138,191,248,80,138,181,64,156,48,57,155,184], + "storedBytes": 105, }, ], }, @@ -1563,10 +1563,10 @@ describe("integration tests", () => { "rows": [ { "createdAt": "1970-01-01T00:00:00.000Z", - "id": "Jbxb-ucbVhZdFj5e3LpT9Q", + "id": "oHE3mEhzoC2J7Zzf6jFwUg", "isCompleted": null, "isDeleted": null, - "ownerId": "-9AbmkcTJdXDGMs8_ycHCw", + "ownerId": "1bsf1oq_-FCKtUCcMDmbuA", "title": "Integration todo", "updatedAt": null, }, diff --git a/packages/common/test/local-first/Kysely.test.ts b/packages/common/test/local-first/Kysely.test.ts index 401de0df1..33838ba9b 100644 --- a/packages/common/test/local-first/Kysely.test.ts +++ b/packages/common/test/local-first/Kysely.test.ts @@ -12,12 +12,12 @@ import { import { describe, expect, test } from "vitest"; import { getJsonObjectArgs, - jsonArrayFrom, - jsonBuildObject, - jsonObjectFrom, - sql, -} from "../../src/local-first/Kysely.js"; -import { kyselyJsonIdentifier } from "../../src/local-first/Query.js"; + evoluJsonArrayFrom as jsonArrayFrom, + evoluJsonBuildObject as jsonBuildObject, + evoluJsonObjectFrom as jsonObjectFrom, + kyselyJsonIdentifier, + kyselySql as sql, +} from "../../src/local-first/Query.js"; const createSelectQueryNode = ( selections: ReadonlyArray< @@ -106,14 +106,10 @@ describe("Kysely helpers", () => { expect(() => jsonArrayFrom(createSelectExpression(invalidNode) as never), - ).toThrow( - "SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections", - ); + ).toThrow(/can only handle explicit selections/); expect(() => jsonObjectFrom(createSelectExpression(invalidNode) as never), - ).toThrow( - "SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections", - ); + ).toThrow(/can only handle explicit selections/); }); test("jsonArrayFrom, jsonObjectFrom, and jsonBuildObject include Evolu JSON prefix", () => { diff --git a/packages/common/test/local-first/Query.test.ts b/packages/common/test/local-first/Query.test.ts index f36b654ed..5350e5130 100644 --- a/packages/common/test/local-first/Query.test.ts +++ b/packages/common/test/local-first/Query.test.ts @@ -1,6 +1,5 @@ import { ColumnNode, type SelectQueryNode } from "kysely"; import { expect, test } from "vitest"; -import { createQueryBuilder } from "../../src/local-first/Schema.js"; import type { Row } from "../../src/local-first/Query.js"; import { applyPatches, @@ -16,7 +15,8 @@ import { testQuery, testQuery2, } from "../../src/local-first/Query.js"; -import { sql, type SafeSql, type SqliteQuery } from "../../src/Sqlite.js"; +import { createQueryBuilder } from "../../src/local-first/Schema.js"; +import { type SafeSql, type SqliteQuery, sql } from "../../src/Sqlite.js"; import { id, NonEmptyString100 } from "../../src/Type.js"; const PersonId = id("Person"); From c32892fd10ac3dee449202fa60a69b684ed5d34a Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 08:55:39 +0100 Subject: [PATCH 23/24] fix: harden resources rollback and stabilize verify --- packages/common/src/Resources.ts | 143 +++++++++++++++--- packages/common/src/Task.ts | 26 +++- packages/common/test/Resources.test.ts | 46 ++++++ packages/common/test/Task.test.ts | 62 ++++---- packages/common/test/WebSocket.test.ts | 6 +- .../common/test/local-first/Evolu.test.ts | 1 - 6 files changed, 229 insertions(+), 55 deletions(-) diff --git a/packages/common/src/Resources.ts b/packages/common/src/Resources.ts index e07e58f54..a96688e43 100644 --- a/packages/common/src/Resources.ts +++ b/packages/common/src/Resources.ts @@ -449,7 +449,13 @@ const createLegacyResources = < const disposalDelay = config.disposalDelay ?? "100ms"; - const ensureResource = (resourceConfig: TResourceConfig) => { + const ensureResource = ( + resourceConfig: TResourceConfig, + ): { + readonly resourceKey: TResourceKey; + readonly resource: TResource; + readonly created: boolean; + } => { const key = config.getResourceKey(resourceConfig); const timeout = disposalTimeouts.get(key); if (timeout) { @@ -457,9 +463,85 @@ const createLegacyResources = < disposalTimeouts.delete(key); } - if (!resourcesMap.has(key)) { - const resource = config.createResource(resourceConfig); - resourcesMap.set(key, resource); + if (resourcesMap.has(key)) { + const existingResource = resourcesMap.get(key) as TResource; + return { resourceKey: key, resource: existingResource, created: false }; + } + + const resource = config.createResource(resourceConfig); + resourcesMap.set(key, resource); + + return { resourceKey: key, resource, created: true }; + }; + + const rollbackAddConsumer = ( + consumer: TConsumer, + consumerId: TConsumerId, + hadConsumerBefore: boolean, + previousConsumer: TConsumer | undefined, + incrementedCountsByResourceKey: ReadonlyMap, + onConsumerAddedResourceKeys: ReadonlySet, + createdResourceKeys: ReadonlySet, + ): void => { + for (const [ + resourceKey, + incrementedCount, + ] of incrementedCountsByResourceKey) { + const counts = consumerCounts.get(resourceKey); + if (!counts) continue; + + const currentCount = counts.get(consumerId); + if (currentCount == null) continue; + + const nextCount = currentCount - incrementedCount; + if (nextCount <= 0) { + counts.delete(consumerId); + } else { + counts.set(consumerId, PositiveInt.orThrow(nextCount)); + } + + if (counts.size === 0) { + consumerCounts.delete(resourceKey); + } + } + + if (config.onConsumerRemoved) { + for (const resourceKey of onConsumerAddedResourceKeys) { + const resource = resourcesMap.get(resourceKey); + if (!resource) continue; + try { + config.onConsumerRemoved(consumer, resource, resourceKey); + } catch { + // Keep rollback best-effort and preserve the original addConsumer error. + } + } + } + + for (const resourceKey of createdResourceKeys) { + const counts = consumerCounts.get(resourceKey); + if (counts && counts.size > 0) continue; + + const resource = resourcesMap.get(resourceKey); + if (!resource) continue; + + const timeout = disposalTimeouts.get(resourceKey); + if (timeout) { + deps.time.clearTimeout(timeout); + disposalTimeouts.delete(resourceKey); + } + + try { + resource[Symbol.dispose](); + } catch { + // Keep rollback best-effort and preserve the original addConsumer error. + } + resourcesMap.delete(resourceKey); + } + + if (hadConsumerBefore) { + consumers.set(consumerId, previousConsumer as TConsumer); + } else { + consumers.delete(consumerId); } }; @@ -488,28 +570,51 @@ const createLegacyResources = < if (resourceConfigs.length === 0) return; const consumerId = config.getConsumerId(consumer); + const hadConsumerBefore = consumers.has(consumerId); + const previousConsumer = consumers.get(consumerId); consumers.set(consumerId, consumer); + const incrementedCountsByResourceKey = new Map(); + const onConsumerAddedResourceKeys = new Set(); + const createdResourceKeys = new Set(); + + try { + for (const resourceConfig of resourceConfigs) { + const { resourceKey, resource, created } = + ensureResource(resourceConfig); + if (created) { + createdResourceKeys.add(resourceKey); + } - for (const resourceConfig of resourceConfigs) { - ensureResource(resourceConfig); - const resourceKey = config.getResourceKey(resourceConfig); - - let counts = consumerCounts.get(resourceKey); - if (!counts) { - counts = new Map(); - consumerCounts.set(resourceKey, counts); - } + let counts = consumerCounts.get(resourceKey); + if (!counts) { + counts = new Map(); + consumerCounts.set(resourceKey, counts); + } - const currentCount = counts.get(consumerId) ?? 0; - const newCount = currentCount + 1; - counts.set(consumerId, PositiveInt.orThrow(newCount)); + const currentCount = counts.get(consumerId) ?? 0; + const newCount = currentCount + 1; + counts.set(consumerId, PositiveInt.orThrow(newCount)); + incrementedCountsByResourceKey.set( + resourceKey, + (incrementedCountsByResourceKey.get(resourceKey) ?? 0) + 1, + ); - if (currentCount === 0 && config.onConsumerAdded) { - const resource = resourcesMap.get(resourceKey); - if (resource) { + if (currentCount === 0 && config.onConsumerAdded && resource) { + onConsumerAddedResourceKeys.add(resourceKey); config.onConsumerAdded(consumer, resource, resourceKey); } } + } catch (error) { + rollbackAddConsumer( + consumer, + consumerId, + hadConsumerBefore, + previousConsumer, + incrementedCountsByResourceKey, + onConsumerAddedResourceKeys, + createdResourceKeys, + ); + throw error; } }, diff --git a/packages/common/src/Task.ts b/packages/common/src/Task.ts index d2339c8f7..d6014d262 100644 --- a/packages/common/src/Task.ts +++ b/packages/common/src/Task.ts @@ -1739,7 +1739,12 @@ export function concurrently( taskOrFallback?: Task, ): Task { const isTask = isFunction(concurrencyOrTask); - const task = isTask ? concurrencyOrTask : taskOrFallback!; + const task = (() => { + if (isTask) return concurrencyOrTask; + assert(taskOrFallback, "Task is required when concurrency is provided."); + return taskOrFallback; + })(); + return Object.assign((run: Run) => run(task), { [concurrencyBehaviorSymbol]: isTask ? maxPositiveInt : concurrencyOrTask, }); @@ -3376,6 +3381,8 @@ export const allSettledAbortError: AllSettledAbortError = { type: "AllSettledAbortError", }; +type NoCollect = ReturnType<() => void>; + /** * Maps values to {@link Task}s, failing fast on first error. * @@ -3447,7 +3454,7 @@ export function map( items: MapInput, fn: (a: A) => Task, { abortReason = mapAbortError, ...options }: CollectOptions = {}, -): Task | Record | void, E, D> { +): Task | Record | NoCollect, E, D> { const mapped = mapInput(items, fn); return all( mapped as Iterable>, @@ -3559,7 +3566,7 @@ export function mapSettled( ): Task< | ReadonlyArray> | Record> - | void, + | NoCollect, never, D > { @@ -3797,7 +3804,7 @@ function pool( abortReason: unknown; allFailed?: AnyAllFailed; }, -): Task | T | void, E> { +): Task | T | NoCollect, E> { const tasks = arrayFrom(tasksIterable); const { length } = tasks; if (length === 0) return () => ok(emptyArray); @@ -3884,7 +3891,16 @@ function pool( // For all/allSettled/map/mapSettled with collect: false (no allFailed handler) if (!allFailed) return ok(); - return allFailed === "completion" ? lastResult! : lastIndexResult!; + if (allFailed === "completion") { + assert( + lastResult, + "Expected completion result for allFailed=completion.", + ); + return lastResult; + } + + assert(lastIndexResult, "Expected last index result for allFailed=index."); + return lastIndexResult; }; } diff --git a/packages/common/test/Resources.test.ts b/packages/common/test/Resources.test.ts index 21e2ab3da..7863752b0 100644 --- a/packages/common/test/Resources.test.ts +++ b/packages/common/test/Resources.test.ts @@ -82,6 +82,52 @@ test("ignores addConsumer calls with empty resource list", () => { expect(resources.getConsumer(consumer1.id)).toBeNull(); }); +test("rolls back addConsumer mutations when createResource throws", () => { + const time = testCreateTime(); + const lifecycleEvents: Array = []; + const createdResources = new Map(); + + const resources = createResources< + Resource, + ResourceKey, + ResourceConfig, + Consumer, + ConsumerId + >({ time })({ + createResource: (config) => { + if (config.key === resourceConfig2.key) { + throw new Error("boom"); + } + + const resource = createResource(config); + createdResources.set(config.key, resource); + return resource; + }, + getResourceKey: (config) => config.key, + getConsumerId: (consumer) => consumer.id, + onConsumerAdded: (consumer, _resource, key) => { + lifecycleEvents.push(`add:${consumer.id}:${key}`); + }, + onConsumerRemoved: (consumer, _resource, key) => { + lifecycleEvents.push(`remove:${consumer.id}:${key}`); + }, + }); + + expect(() => + resources.addConsumer(consumer1, [resourceConfig1, resourceConfig2]), + ).toThrow("boom"); + + expect(resources.getConsumer(consumer1.id)).toBeNull(); + expect(resources.hasConsumerAnyResource(consumer1)).toBe(false); + expect(resources.getConsumersForResource(resourceConfig1.key)).toEqual([]); + expect(resources.getResource(resourceConfig1.key)).toBeNull(); + expect(createdResources.get(resourceConfig1.key)?.disposed).toBe(true); + expect(lifecycleEvents).toEqual([ + `add:${consumer1.id}:${resourceConfig1.key}`, + `remove:${consumer1.id}:${resourceConfig1.key}`, + ]); +}); + test("tracks consumers for each resource", () => { const { resources } = createTestResources(); diff --git a/packages/common/test/Task.test.ts b/packages/common/test/Task.test.ts index cd4a8a919..986757aa7 100644 --- a/packages/common/test/Task.test.ts +++ b/packages/common/test/Task.test.ts @@ -87,6 +87,11 @@ const eventsEnabled: RunConfigDep = { runConfig: { eventsEnabled: createRef(true) }, }; +const must = (value: T | null | undefined): T => { + assert(value != null); + return value; +}; + interface MyError extends Typed<"MyError"> {} describe("Task", () => { @@ -795,11 +800,11 @@ describe("Run", () => { const task: Task = async (run) => { run.signal.addEventListener("abort", () => { - stateInAbortHandler = run.parent!.getState(); + stateInAbortHandler = must(run.parent).getState(); }); taskStarted.resolve(); await taskCanFinish.promise; - stateAfterAwait = run.parent!.getState(); + stateAfterAwait = must(run.parent).getState(); return ok(); }; @@ -812,8 +817,8 @@ describe("Run", () => { taskCanFinish.resolve(); await disposePromise; - expect(stateInAbortHandler!.type).toBe("Disposing"); - expect(stateAfterAwait!.type).toBe("Disposing"); + expect(must(stateInAbortHandler).type).toBe("Disposing"); + expect(must(stateAfterAwait).type).toBe("Disposing"); expect(run.getState().type).toBe("Settled"); }); @@ -1041,7 +1046,7 @@ describe("Run", () => { // Cleanup signal should exist and be aborted after disposal expect(cleanupSignal).not.toBeNull(); - expect(cleanupSignal!.aborted).toBe(true); + expect(must(cleanupSignal).aborted).toBe(true); } finally { AbortSignal.prototype.addEventListener = originalAddEventListener; } @@ -1096,7 +1101,7 @@ describe("Run", () => { // Cleanup signal should exist and be aborted after child disposal expect(cleanupSignal).not.toBeNull(); - expect(cleanupSignal!.aborted).toBe(true); + expect(must(cleanupSignal).aborted).toBe(true); } finally { AbortSignal.prototype.addEventListener = originalAddEventListener; } @@ -1142,11 +1147,11 @@ describe("Run", () => { "child started", "parent completed", ]); - expect(childFiber!.run.getState().type).toBe("Running"); + expect(must(childFiber).run.getState().type).toBe("Running"); time.advance("2s"); - expect(await childFiber!).toEqual(ok()); + expect(await must(childFiber)).toEqual(ok()); expect(events).toEqual([ "parent started", "child started", @@ -1194,7 +1199,7 @@ describe("Run", () => { }), ).toEqual(ok()); - const childFiber = createdRun!(async (run) => { + const childFiber = must(createdRun)(async (run) => { events.push("child started"); const result = await run(sleep("10s")); if (!result.ok) { @@ -1208,14 +1213,14 @@ describe("Run", () => { expect(events).toEqual(["child started"]); - await createdRun![Symbol.asyncDispose](); + await must(createdRun)[Symbol.asyncDispose](); expect(await childFiber).toEqual( err({ type: "AbortError", reason: runStoppedError }), ); expect(events).toEqual(["child started", "child aborted"]); - const lateResult = await createdRun!(() => ok("late")); + const lateResult = await must(createdRun)(() => ok("late")); expect(lateResult).toEqual( err({ type: "AbortError", reason: runStoppedError }), ); @@ -1235,7 +1240,7 @@ describe("Run", () => { }), ).toEqual(ok()); - const childFiber = createdRun!(async (run) => { + const childFiber = must(createdRun)(async (run) => { events.push("child started"); const result = await run(sleep("10s")); if (!result.ok) { @@ -1461,7 +1466,7 @@ describe("Fiber", () => { await parentFiber; expect(parentFiberId).toBe(parentFiber.run.id); - expect(childFiberId).toBe(childFiber!.run.id); + expect(childFiberId).toBe(must(childFiber).run.id); expect(parentFiberId).not.toBe(childFiberId); }); @@ -1538,7 +1543,7 @@ describe("Fiber", () => { // Let daemon complete and wait for it daemonCanComplete.resolve(); - await daemonFiber!; + await must(daemonFiber); expect(events).toEqual([ "parent started", @@ -1629,7 +1634,7 @@ describe("Fiber", () => { ]); daemonCanComplete.resolve(); - await daemonFiber!; + await must(daemonFiber); expect(events).toEqual([ "parent started", @@ -1952,7 +1957,7 @@ describe("unabortableMask", () => { // Using restore2 outside its intended scope would increase abort mask // (root mask=0, override=1). This must crash. - expect(() => run(restoreFromInner!(() => ok()))).toThrow( + expect(() => run(must(restoreFromInner)(() => ok()))).toThrow( "restore used outside its unabortableMask", ); }); @@ -2446,8 +2451,8 @@ describe("AsyncDisposableStack", () => { const result = await run(task); expect(result).toEqual(ok()); - expect(stateWhileWorking!.type).toBe("Running"); - expect(childRun!.getState().type).toBe("Settled"); + expect(must(stateWhileWorking).type).toBe("Running"); + expect(must(childRun).getState().type).toBe("Settled"); }); test("accepts moved native stack", async () => { @@ -4217,7 +4222,7 @@ describe("DI", () => { () => { attempts++; if (attempts < 3) return err({ type: "NetworkError" }); - return ok(url.split("/").pop()!); + return ok(must(url.split("/").pop())); }, }; @@ -5125,7 +5130,7 @@ describe("concurrency", () => { expect(restoreFromInner).toBeDefined(); await expect( - run(semaphore.withPermit(restoreFromInner!(() => ok()))), + run(semaphore.withPermit(must(restoreFromInner)(() => ok()))), ).rejects.toThrow("restore used outside its unabortableMask"); expect(await run(semaphore.withPermit(() => ok("after-throw")))).toEqual( @@ -7657,7 +7662,7 @@ describe("fetch", () => { }); describe("examples TODO", () => { - describe.skip("composition types from JSDoc", () => { + describe("composition types from JSDoc", () => { // These tests verify the types shown in Task.ts JSDoc examples are accurate. // No runtime behavior - just type-level assertions. @@ -7669,12 +7674,14 @@ describe("examples TODO", () => { readonly fetch: typeof globalThis.fetch; } - // Simulated fetch task - typed but never executed - const fetch = ( - _url: string, - ): Task => { - throw new Error("Not implemented - type test only"); - }; + // Simulated fetch task for type checks and controlled runtime behavior. + const fetch = + (_url: string): Task => + () => + err({ + type: "FetchError", + error: new Error("Not implemented - type test only"), + }); test("timeout adds TimeoutError to error union", () => { const fetchWithTimeout = (url: string) => timeout(fetch(url), "30s"); @@ -7705,6 +7712,7 @@ describe("examples TODO", () => { const deps: RunDeps & NativeFetchDep = { ...testCreateDeps(), fetch: globalThis.fetch, + time: createTime(), }; await using run = createRun(deps); diff --git a/packages/common/test/WebSocket.test.ts b/packages/common/test/WebSocket.test.ts index cc9a685d7..d6afb79a9 100644 --- a/packages/common/test/WebSocket.test.ts +++ b/packages/common/test/WebSocket.test.ts @@ -1,4 +1,4 @@ -import { afterEach, assert, beforeEach, expect, test, vi } from "vitest"; +import { afterAll, assert, beforeAll, expect, test, vi } from "vitest"; import { utf8ToBytes } from "../src/Buffer.js"; import { isServer } from "../src/Platform.js"; import { spaced, take } from "../src/Schedule.js"; @@ -18,7 +18,7 @@ const getServerUrl = (path = ""): string => { return `ws://127.0.0.1:${port}${path ? `/${path}` : ""}`; }; -beforeEach(async () => { +beforeAll(async () => { if (isServer) { const { createServer } = await import("./_globalSetup.js"); port = await createServer(); @@ -28,7 +28,7 @@ beforeEach(async () => { } }); -afterEach(async () => { +afterAll(async () => { if (port === undefined) return; const currentPort = port; port = undefined; diff --git a/packages/common/test/local-first/Evolu.test.ts b/packages/common/test/local-first/Evolu.test.ts index 415f2af28..112e2eb04 100644 --- a/packages/common/test/local-first/Evolu.test.ts +++ b/packages/common/test/local-first/Evolu.test.ts @@ -61,7 +61,6 @@ import { testCreateSqliteDeps } from "../_deps.js"; import { testAppOwner } from "./_fixtures.js"; const TodoId = id("Todo"); -type TodoId = typeof TodoId.Type; const Schema = { todo: { From 160769bf67e7c11394d0f55194e4f264612b2739 Mon Sep 17 00:00:00 2001 From: Miccy Date: Wed, 11 Mar 2026 09:14:17 +0100 Subject: [PATCH 24/24] fix: address automated PR review findings --- packages/common/src/local-first/Relay.ts | 4 ++-- packages/common/src/local-first/Shared.ts | 21 +++++++++++++++++---- packages/vue/src/provideEvolu.ts | 3 +-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/common/src/local-first/Relay.ts b/packages/common/src/local-first/Relay.ts index a26e1e872..b63b6dd7b 100644 --- a/packages/common/src/local-first/Relay.ts +++ b/packages/common/src/local-first/Relay.ts @@ -305,7 +305,7 @@ export const createRelaySqliteStorage = export const createRelayStorageTables = (deps: SqliteDep): void => { for (const query of [ sql` - create table evolu_writeKey ( + create table if not exists evolu_writeKey ( "ownerId" blob not null, "writeKey" blob not null, primary key ("ownerId") @@ -314,7 +314,7 @@ export const createRelayStorageTables = (deps: SqliteDep): void => { `, sql` - create table evolu_message ( + create table if not exists evolu_message ( "ownerId" blob not null, "timestamp" blob not null, "change" blob not null, diff --git a/packages/common/src/local-first/Shared.ts b/packages/common/src/local-first/Shared.ts index 6f0f44d68..8605ccee6 100644 --- a/packages/common/src/local-first/Shared.ts +++ b/packages/common/src/local-first/Shared.ts @@ -194,10 +194,23 @@ export const initSharedWorker = postTabOutput, onDispose: () => { void runWithSharedEvoluDeps.daemon( - sharedEvolusMutexByName.withLock(message.name, () => { - sharedEvolusByName.delete(message.name); - return ok(); - }), + sharedEvolusMutexByName.withLock( + message.name, + async () => { + const maybeSharedEvolu = sharedEvolusByName.get( + message.name, + ); + if (!maybeSharedEvolu) return ok(); + + try { + await maybeSharedEvolu[Symbol.asyncDispose](); + } finally { + sharedEvolusByName.delete(message.name); + } + + return ok(); + }, + ), ); }, }), diff --git a/packages/vue/src/provideEvolu.ts b/packages/vue/src/provideEvolu.ts index 6d7268bf7..6d8f7c258 100644 --- a/packages/vue/src/provideEvolu.ts +++ b/packages/vue/src/provideEvolu.ts @@ -10,8 +10,7 @@ import { * Stores the Evolu instance for a Vue component. This is most useful at the * root component where provide/inject doesn't work. */ -// eslint-disable-next-line evolu/require-pure-annotation -export const evoluInstanceMap = new WeakMap< +export const evoluInstanceMap = /*#__PURE__*/ new WeakMap< ComponentInternalInstance, Evolu >();