From 8bcd34bcd6483eb7a81d39e6f539c960bc1cb8e4 Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Sat, 25 Jan 2025 03:11:05 -0600 Subject: [PATCH 1/7] wip --- bun.lockb | Bin 244727 -> 245203 bytes package.json | 1 + socket/events/v2.ts | 325 +++++++++++++++++++++++++++++++++++++++ socket/renderer/index.ts | 6 + src/components/todos.tsx | 119 +++++++++++--- src/lib/counter.ts | 5 +- tmp/count | 2 +- 7 files changed, 431 insertions(+), 27 deletions(-) create mode 100644 socket/events/v2.ts create mode 100644 socket/renderer/index.ts diff --git a/bun.lockb b/bun.lockb index e306713df10e2d8f476523741de3422b820e05e7..df57d58255a70a8117ae43793c0a22456242a199 100755 GIT binary patch delta 37827 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 HhL!j~2tY^j delta 36839 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 => { +// const [onEvent, emitEvent] = createEvent() +// const log = createSubjectStore( +// () => [], +// onEvent((e) => (log) => log.push(e)) +// ); + +// return { log, onEvent, emitEvent }; +// }; + +type LogEvent = { + seq: number; + data: E; +}; + +export const createLog = (props: { onEvent: Handler> }) => { + const [_log, setLog] = createStore<{ events: LogEvent[] }>({ events: [] }); + + props.onEvent((event) => {}); + + const log = createSubjectStore( + () => [], + props.onEvent((e) => (log) => log.push(e)) + ); + + return { log, onEvent: props.onEvent }; +}; + +export const createServerLog = (props: { onEvent: Handler }) => { + const log = createSubjectStore( + () => [], + props.onEvent((e) => (log) => log.push(e)) + ); + + return { log, onEvent: props.onEvent }; +}; + +// export const createLogProjection = ( +// init: () => T, +// ...events: Array<(prev: T) => void>> +// ) => { +// const actualEvents +// return createSubjectStore( +// init, +// ...events.map((onEvent) => +// onEvent((mutation) => { + +// return mutation; +// }) +// ) +// ); +// }; + +// const [onTodoEvent, emitTodoEvent] = createTopic(); + +// const [todoId, setTodoId] = createSignal(); +// onTodoEvent( +// () => `todos.${todoId()}`, +// (todoEvent) => {} +// ); + +const [counter, setCounter] = createSignal(0); + +const [onCounter, emitCounter] = createEvent(); + +onCounter((count) => { + if (count) { + emitCounter(count - 1); + } +}); +onCounter(setCounter); + +onCounter(console.log); + +// onCounter(setCounter); + +emitCounter(1); +flushSync(); +// assert(counter() === 10); +// assert(counter() === 0); + +const [onTodoEvent, emitTodoEvent] = createEvent(); + +const todos1 = createSubjectStore( + () => [] as Todo[], + onTodoEvent((e) => (todos) => { + if (e.type === "todo-added") { + const todo = todos.find((t) => t.id === e.id); + if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); + } + if (e.type === "todo-toggled") { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + } + if (e.type === "todo-deleted") { + const index = todos.findIndex((note) => note.id === e.id); + if (index !== -1) todos.splice(index, 1); + } + if (e.type === "todo-edited") { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + } + }) +); + +const [onTodoAdded, emitTodoAdded] = createEvent(); +const [onTodoToggled, emitTodoToggled] = createEvent(); +const [onTodoDeleted, emitTodoDeleted] = createEvent(); +const [onTodoEdited, emitTodoEdited] = createEvent(); + +const todos2 = createSubjectStore( + () => [] as Todo[], + onTodoAdded((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); + }), + onTodoToggled((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + }), + onTodoDeleted((e) => (todos) => { + const index = todos.findIndex((note) => note.id === e.id); + if (index !== -1) todos.splice(index, 1); + }), + onTodoEdited((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + }) +); + +const [onTodoEvents, emitTodoEvents] = createEvent<{ + Added: [Handler, Emitter]; + Toggled: [Handler, Emitter]; + Deleted: [Handler, Emitter]; + Edited: [Handler, Emitter]; +}>(); + +const Added = createEvent(), + Toggled = createEvent(), + Deleted = createEvent(), + Edited = createEvent(); + +emitTodoEvents({ Added, Toggled, Deleted, Edited }); + +const todos3 = createSubjectStore( + () => [] as Todo[], + onTodoEvents((events) => (todos) => { + events.Added[0]((e) => { + const todo = todos.find((t) => t.id === e.id); + if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); + }); + events.Toggled[0]((e) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + }); + events.Deleted[0]((e) => { + const index = todos.findIndex((note) => note.id === e.id); + if (index !== -1) todos.splice(index, 1); + }); + events.Edited[0]((e) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + }); + }) +); + +const [onTodoTopic, emitTodoTopic] = createTopic<{ + Added: TodoCreated; + Toggled: TodoToggled; + Deleted: TodoDeleted; + Edited: TodoEdited; +}>(); + +const todos4 = createSubjectStore( + () => [] as Todo[], + onTodoTopic((events) => (todos) => { + events.Added((e) => { + const todo = todos.find((t) => t.id === e.id); + if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); + }); + events.Toggled((e) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + }); + events.Deleted((e) => { + const index = todos.findIndex((note) => note.id === e.id); + if (index !== -1) todos.splice(index, 1); + }); + events.Edited((e) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + }); + }) +); + +emitTodoTopic({ Added: {} }); +emitTodoTopic({ Added: {} }); + +const todoId = () => 0; + +const firstTodo1 = createSubject( + null, + onTodoEvent((e) => (todo) => { + if (e.type === "todo-added" && e.id === todoId()) { + return { ...e, completed: false }; + } + if (todo) { + if (e.type === "todo-toggled" && e.id === todoId()) { + return { ...todo, completed: !todo.completed }; + } + if (e.type === "todo-deleted") { + if (e.id === todoId()) return null; + } + if (e.type === "todo-edited") { + if (e.id === todoId()) return { ...todo, title: e.title }; + } + } + return todo; + }) +); + +const firstTodo2 = createMemo(() => { + const id = todoId(); + + return createSubject( + null, + onTodoEvent((e) => (todo) => { + if (e.type === "todo-added" && e.id === id) { + return { ...e, completed: false }; + } + if (todo) { + if (e.type === "todo-toggled" && e.id === id) { + return { ...todo, completed: !todo.completed }; + } + if (e.type === "todo-deleted") { + if (e.id === id) return null; + } + if (e.type === "todo-edited") { + if (e.id === id) return { ...todo, title: e.title }; + } + } + return todo; + }) + ); +}); + +type TodoTopic = { + Added: Record; + Toggled: Record; + Deleted: Record; + Edited: Record; +}; +const [onTodosTopic, emitTodosTopic] = createEvent(); + +const firstTodo3 = createSubject( + null, + onTodosTopic.Added((id: number, e: TodoCreated) => (todo) => { + if (id === todoId()) return { ...e, completed: false }; + return todo; + }), + onTodosTopic.Toggled((id: number, e: TodoToggled) => (todo) => { + if (id === todoId()) return { ...todo, completed: !todo.completed }; + return todo; + }) +); + +const firstTodo5 = createSubject( + null, + onTodosTopic("Added", id, (e: TodoCreated) => (todo) => { + return { ...e, completed: false }; + }), + onTodosTopic("Toggled", id, (e: TodoToggled) => (todo) => { + return { ...todo, completed: !todo.completed }; + }) +); + +const onToggledTodos = onTodosTopic("Toggled"); + +const onToggledMyTodo1 = onToggledTodos(id); +const onToggledMyTodo2 = onTodosTopic("Toggled", id); + +const onToggledTodoIds1 = onToggledTodos((e: Record) => + Object.keys(e) +); +const onToggledTodoIds2 = onTodosTopic( + "Toggled", + (e: Record) => Object.keys(e) +); + +const onToggledMyTodoId1 = onToggledMyTodo1((e) => e.id); +const onToggledMyTodoId2 = onToggledTodos(id, (e) => e.id); +const onToggledMyTodoId3 = onTodosTopic("Toggled", id, (e) => e.id); + +emitTodosTopic("Added", 0, {}); +emitTodosTopic("Toggled", 3, {}); +emitTodosTopic("Added", { 0: {}, 1: {} }); +emitTodosTopic({ Added: { 1: {} }, Deleted: { 0: {} } }); + +const [nextTopic] = createTopic((emit) => { + onTodoAdded((todoAdded) => { + emit("Added", todoAdded.id, todoAdded); + }); +}); + +const [onLocalEvent, emitLocalEvent] = createEvent(onServerEvent); diff --git a/socket/renderer/index.ts b/socket/renderer/index.ts new file mode 100644 index 0000000..d666e0b --- /dev/null +++ b/socket/renderer/index.ts @@ -0,0 +1,6 @@ +export type Node = + | string + | { + type: "div" | "p"; + children: Node[]; + }; diff --git a/src/components/todos.tsx b/src/components/todos.tsx index 8ed3567..9a003a6 100644 --- a/src/components/todos.tsx +++ b/src/components/todos.tsx @@ -1,5 +1,12 @@ import { createSignal, createMemo, Show, For } from "solid-js"; -import { useServerTodos } from "~/lib/todos"; +import { + TodoCreated, + TodoDeleted, + TodoEdited, + TodoEvent, + TodoToggled, + useServerTodos, +} from "~/lib/todos"; import { createClientEventLog, createEventProjection, @@ -7,6 +14,8 @@ import { } from "../../socket/events"; import { createSocketMemo } from "../../socket/lib/shared"; import { CompleteIcon, IncompleteIcon } from "./icons"; +import { createLog } from "../../socket/events/v2"; +import { createEvent, createPartition, createSubjectStore } from "solid-events"; export type TodosFilter = "all" | "active" | "completed" | undefined; @@ -19,6 +28,70 @@ export type Todo = { export function TodoApp(props: { filter: TodosFilter; listId?: string }) { const filter = () => props.filter; + const [onServerTodoEvent, emitServerTodoEvent] = createEvent(); + + const { log: todoEventLog, onEvent: onTodoEvent } = createLog({ + onEvent: onServerTodoEvent, + }); + + const [onTodoAdded] = createPartition( + onTodoEvent, + (e) => e.type === "todo-added" + ); + const [onTodoToggled] = createPartition( + onTodoEvent, + (e) => e.type === "todo-toggled" + ); + const [onTodoDeleted] = createPartition( + onTodoEvent, + (e) => e.type === "todo-deleted" + ); + const [onTodoEdited] = createPartition( + onTodoEvent, + (e) => e.type === "todo-edited" + ); + + const todos = createSubjectStore( + () => [] as Todo[], + onTodoAdded((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); + }), + onTodoToggled((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + }), + onTodoDeleted((e) => (todos) => { + const index = todos.findIndex((note) => note.id === e.id); + if (index !== -1) todos.splice(index, 1); + }), + onTodoEdited((e) => (todos) => { + const todo = todos.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + }) + ); + + // const _todos = createSubjectStore( + // () => [] as Todo[], + // onTodoEvent((e) => (todos) => { + // if (e.type === "todo-added") { + // todos.push({ id: e.id, title: e.title, completed: false }); + // } + // if (e.type === "todo-toggled") { + // const todo = todos.find((t) => t.id === e.id); + // if (todo) todo.completed = !todo.completed; + // } + // if (e.type === "todo-deleted") { + // const index = todos.findIndex((note) => note.id === e.id); + // if (index !== -1) todos.splice(index, 1); + // } + // if (e.type === "todo-edited") { + // const todo = todos.find((t) => t.id === e.id); + // if (todo) todo.title = e.title; + // } + // }) + // ); + const [editingTodoId, setEditingId] = createSignal(); const setEditing = ({ @@ -34,28 +107,28 @@ export function TodoApp(props: { filter: TodosFilter; listId?: string }) { const serverTodos = useServerTodos(createSocketMemo(() => props.listId)); const { events, appendEvent } = createClientEventLog(serverTodos); - const todos = createEventProjection( - events, - (acc, e) => { - if (e.type === "todo-added") { - acc.push({ id: e.id, title: e.title, completed: false }); - } - if (e.type === "todo-toggled") { - const todo = acc.find((t) => t.id === e.id); - if (todo) todo.completed = !todo.completed; - } - if (e.type === "todo-deleted") { - const index = acc.findIndex((note) => note.id === e.id); - if (index !== -1) acc.splice(index, 1); - } - if (e.type === "todo-edited") { - const todo = acc.find((t) => t.id === e.id); - if (todo) todo.title = e.title; - } - return acc; - }, - [] as Todo[] - ); + // const todos = createEventProjection( + // events, + // (acc, e) => { + // if (e.type === "todo-added") { + // acc.push({ id: e.id, title: e.title, completed: false }); + // } + // if (e.type === "todo-toggled") { + // const todo = acc.find((t) => t.id === e.id); + // if (todo) todo.completed = !todo.completed; + // } + // if (e.type === "todo-deleted") { + // const index = acc.findIndex((note) => note.id === e.id); + // if (index !== -1) acc.splice(index, 1); + // } + // if (e.type === "todo-edited") { + // const todo = acc.find((t) => t.id === e.id); + // if (todo) todo.title = e.title; + // } + // return acc; + // }, + // [] as Todo[] + // ); const filteredTodos = createMemo(() => { if (filter() === "active") return todos.filter((t) => !t.completed); diff --git a/src/lib/counter.ts b/src/lib/counter.ts index 3310993..60fea59 100644 --- a/src/lib/counter.ts +++ b/src/lib/counter.ts @@ -1,10 +1,9 @@ "use socket"; +import { createSignal } from "solid-js"; import { createSocketMemo } from "../../socket/lib/shared"; -import { createPersistedSignal } from "../../socket/persisted"; -import { storage } from "./db"; -const [count, setCount] = createPersistedSignal(storage, `count`, 0); +const [count, setCount] = createSignal(0); export const useCounter = () => { const increment = () => setCount(count() + 1); diff --git a/tmp/count b/tmp/count index da2d398..62f9457 100644 --- a/tmp/count +++ b/tmp/count @@ -1 +1 @@ -14 \ No newline at end of file +6 \ No newline at end of file From bcbecc83b5ace2a25a340ec23c984d66043aee93 Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Thu, 30 Jan 2025 00:30:48 -0600 Subject: [PATCH 2/7] with seroval --- bun.lockb | Bin 245203 -> 257935 bytes package.json | 8 +- socket/__tests/serializer.test.ts | 38 +++++ socket/lib/client.tsx | 248 +++++++++++------------------- socket/lib/primitives.tsx | 27 ++++ socket/lib/serializer.tsx | 123 +++++++++++++++ socket/lib/server.tsx | 233 +++++++++++----------------- socket/lib/shared.tsx | 107 +++++-------- src/components/todos.tsx | 108 +++---------- src/lib/counter.ts | 4 +- src/routes/index.tsx | 5 + 11 files changed, 445 insertions(+), 456 deletions(-) create mode 100644 socket/__tests/serializer.test.ts create mode 100644 socket/lib/primitives.tsx create mode 100644 socket/lib/serializer.tsx diff --git a/bun.lockb b/bun.lockb index df57d58255a70a8117ae43793c0a22456242a199..7fefa9a69afb60fa9cf7a2c46fbd6fc9a49a729b 100755 GIT binary patch delta 27437 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 diff --git a/package.json b/package.json index 2c30a5a..6d5eb95 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "vinxi dev", "build": "vinxi build", - "start": "vinxi start" + "start": "vinxi start", + "test": "vitest" }, "author": "Dev Agrawal (http://devagr.me/)", "dependencies": { @@ -16,7 +17,9 @@ "@solid-primitives/websocket": "^1.2.2", "@solidjs/router": "^0.14.10", "@solidjs/start": "^1.0.9", + "immer": "^10.1.1", "rxjs": "^7.8.1", + "seroval": "^1.2.0", "solid-events": "^0.0.5", "solid-icons": "^1.1.0", "solid-js": "^1.9.2", @@ -31,6 +34,7 @@ "@babel/preset-typescript": "^7.26.0", "@vinxi/plugin-directives": "^0.4.3", "babel-plugin-transform-import-paths": "^1.0.3", - "vite-plugin-babel": "^1.2.0" + "vite-plugin-babel": "^1.2.0", + "vitest": "^3.0.4" } } \ No newline at end of file diff --git a/socket/__tests/serializer.test.ts b/socket/__tests/serializer.test.ts new file mode 100644 index 0000000..7f54a6a --- /dev/null +++ b/socket/__tests/serializer.test.ts @@ -0,0 +1,38 @@ +import { createPlugin, serialize } from "seroval"; +import { describe, expect, test } from "vitest"; + +type FunctionNode = { + __type: "ref"; + id: string; +}; +const refPlugin = (map: Map) => + createPlugin({ + tag: "seroval-plugins/socket/ref", + test(value) { + return typeof value === "function"; + }, + parse: { + sync(value, ctx) { + const id = Math.random().toString(); + map.set(id, value); + return { __type: "ref", id }; + }, + }, + deserialize(node, ctx) { + return map.get(node.id)!; + }, + serialize(node, ctx) { + return `node`; + }, + }); + +describe("serializer", () => { + test(`serializes functions`, () => { + const source = { id: 1, greet: () => "Hello" }; + const serialized = serialize(source, { + plugins: [refPlugin], + }); + console.log(serialized); + expect(true).toBe(true); + }); +}); diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index a34bb10..268aaf9 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -1,30 +1,24 @@ -import { from as rxFrom, Observable } from "rxjs"; +import { createLazyMemo } from "@solid-primitives/memo"; +import { createCallback } from "@solid-primitives/rootless"; +import { createWS } from "@solid-primitives/websocket"; +import { createAsync } from "@solidjs/router"; +import { Observable, from as rxFrom } from "rxjs"; +import { fromJSON, SerovalJSON, toJSON } from "seroval"; +import { createEffect, createMemo, createSignal, onCleanup } from "solid-js"; +import { createStore, produce } from "solid-js/store"; +import { + deserializeReactivePayload, + serializeReactivePayload, +} from "./serializer"; import { - createSeriazliedMemo, SerializedMemo, SerializedProjection, SerializedRef, - SerializedStoreAccessor, - SerializedThing, WsMessage, WsMessageDown, WsMessageUp, } from "./shared"; -import { - Accessor, - createComputed, - createEffect, - createMemo, - createSignal, - from, - getListener, - onCleanup, - untrack, -} from "solid-js"; -import { createAsync } from "@solidjs/router"; -import { createLazyMemo } from "@solid-primitives/memo"; -import { createCallback } from "@solid-primitives/rootless"; -import { createWS } from "@solid-primitives/websocket"; +import { applyPatches, Patch } from "immer"; const protocol = window.location.protocol === "https:" ? "wss" : "ws"; const wsUrl = `${protocol}://${window.location.hostname}:${window.location.port}/_ws`; @@ -37,42 +31,47 @@ export type SimpleWs = { send(data: string): void; }; -function wsRpc(message: WsMessageUp) { +function wsRpc(message: WsMessageUp) { const ws = getWs(); const id = crypto.randomUUID() as string; - return new Promise<{ value: T; dispose: () => void }>(async (res, rej) => { - function dispose() { - ws.send( - JSON.stringify({ type: "dispose", id } satisfies WsMessage) - ); - } + return new Promise<{ value: SerovalJSON; dispose: () => void }>( + async (res, rej) => { + function dispose() { + ws.send( + JSON.stringify({ + type: "dispose", + id, + } satisfies WsMessage) + ); + } - function handler(event: { data: string }) { - // console.log(`handler ${id}`, message, { data: event.data }); - const data = JSON.parse(event.data) as WsMessage>; - if (data.id === id && data.type === "value") { - res({ value: data.value, dispose }); - ws.removeEventListener("message", handler); + function handler(event: { data: string }) { + // console.log(`handler ${id}`, message, { data: event.data }); + const data = JSON.parse(event.data) as WsMessage; + if (data.id === id && data.type === "value") { + res({ value: data.value, dispose }); + ws.removeEventListener("message", handler); + } } - } - ws.addEventListener("message", handler); - ws.send( - JSON.stringify({ ...message, id } satisfies WsMessage) - ); - }); + ws.addEventListener("message", handler); + ws.send( + JSON.stringify({ ...message, id } satisfies WsMessage) + ); + } + ); } -function wsSub(message: WsMessageUp) { +function wsSub(message: WsMessageUp) { const ws = getWs(); const id = crypto.randomUUID(); return rxFrom( - new Observable((obs) => { + new Observable((obs) => { // console.log(`attaching sub handler`); function handler(event: { data: string }) { - const data = JSON.parse(event.data) as WsMessage>; + const data = JSON.parse(event.data) as WsMessage; // console.log(`data`, data, id); if (data.id === id && data.type === "value") obs.next(data.value); } @@ -90,147 +89,80 @@ function wsSub(message: WsMessageUp) { ); } -export function createRef(ref: SerializedRef) { - return (...input: any[]) => - wsRpc({ - type: "invoke", - ref, - input, - }).then(({ value }) => value); +function createSocketRefConsumer(ref: SerializedRef) { + return async (...payload: I) => { + const input = toJSON(payload); + const { value } = await wsRpc({ type: "invoke", ref, input }); + return fromJSON(value); + }; } -export function createSocketMemoConsumer(ref: SerializedMemo) { - // console.log({ ref }); - const memo = createLazyMemo( - () => - from( - wsSub({ - type: "subscribe", - ref, - }) - ), - () => ref.initial - ); - - return () => { - const memoValue = memo()(); - // console.log({ memoValue }); - return memoValue; - }; +function createSocketMemoConsumer(ref: SerializedMemo) { + const [signal, setSignal] = createSignal(ref.initial); + const sub = wsSub({ type: "subscribe", ref }).subscribe((value) => { + setSignal(() => fromJSON(value)); + }); + onCleanup(() => sub.unsubscribe()); + return signal; } -export function createSocketProjectionConsumer( - ref: SerializedProjection | SerializedStoreAccessor +function createSocketProjectionConsumer( + ref: SerializedProjection ) { - const nodes = [] as { path: string; accessor: Accessor }[]; - - function getNode(path: string) { - const node = nodes.find((node) => node.path === path); - if (node) return node; - const newNode = { - path, - accessor: from(wsSub({ type: "subscribe", ref, path })), - }; - nodes.push(newNode); - return newNode; - } - - // @ts-expect-error - return new Proxy(ref.initial || {}, { - get(target, path: string) { - return getListener() - ? getNode(path).accessor() - : ((target as any)[path] as O); - }, + const [store, setStore] = createStore(ref.initial); + const sub = wsSub({ type: "subscribe", ref }).subscribe((patches) => { + setStore( + produce((draft) => { + applyPatches(draft, fromJSON(patches)); + }) + ); }); + onCleanup(() => sub.unsubscribe()); + return store as O; } -type SerializedValue = SerializedThing | Record; - -const deserializeValue = (value: SerializedValue) => { - if (value.__type === "ref") { - return createRef(value); - } else if (value.__type === "memo") { - return createSocketMemoConsumer(value); - } else if (value.__type === "projection") { - return createSocketProjectionConsumer(value); - } else { - return Object.entries(value).reduce((res, [name, value]) => { - return { - ...res, - [name]: - value.__type === "ref" - ? createRef(value) - : value.__type === "memo" - ? createSocketMemoConsumer(value) - : value.__type === "projection" - ? createSocketProjectionConsumer(value) - : value.__type === "store-accessor" - ? createSocketProjectionConsumer(value) - : value, - }; - }, {} as any); - } -}; - -export function createEndpoint(name: string, input?: any) { +export function createEndpoint(name: string, rawInput?: any) { const inputScope = crypto.randomUUID(); - const serializedInput = - input?.type === "memo" - ? createSeriazliedMemo({ - name: `input`, - scope: inputScope, - initial: untrack(input), - }) - : input; + const { value: input, refs } = serializeReactivePayload(inputScope, rawInput); // console.log({ serializedInput }); - const scopePromise = wsRpc({ - type: "create", - name, - input: serializedInput, - }); + const scopePromise = wsRpc({ type: "create", name, input }); - if (input?.type === "memo") { - const [inputSignal, setInput] = createSignal(input()); - createComputed(() => setInput(input())); - - const onSubscribe = createCallback( - (ws: SimpleWs, data: WsMessage>) => { - createEffect(() => { - const value = inputSignal(); - // console.log(`sending input update to server`, value, input); - ws.send( - JSON.stringify({ - type: "value", - id: data.id, - value, - } satisfies WsMessage) - ); - }); - } - ); - - const ws = getWs(); - function handler(event: { data: string }) { - const data = JSON.parse(event.data) as WsMessage>; + const onSubscribe = createCallback( + (ws: SimpleWs, id: string, source: () => any) => { + createEffect(() => { + ws.send(JSON.stringify({ type: "value", id, value: source() })); + }); + } + ); - if (data.type === "subscribe" && data.ref.scope === inputScope) { - onSubscribe(ws, data); + const ws = getWs(); + function handler(event: { data: string }) { + const data = JSON.parse(event.data) as WsMessage; + if (data.type === "subscribe" && data.ref.scope === inputScope) { + const source = refs.get(data.ref.id); + if (source) { + onSubscribe(ws, data.ref.id, () => source()); } } - ws.addEventListener("message", handler); - onCleanup(() => ws.removeEventListener("message", handler)); } + ws.addEventListener("message", handler); onCleanup(() => { // console.log(`cleanup endpoint`); + ws.removeEventListener("message", handler); scopePromise.then(({ dispose }) => dispose()); }); const scope = createAsync(() => scopePromise); const deserializedScope = createMemo( - () => scope() && deserializeValue(scope()!.value) + () => + scope() && + deserializeReactivePayload(scope()!.value, { + createSocketMemoConsumer, + createSocketRefConsumer, + createSocketProjectionConsumer, + }) ); return new Proxy((() => {}) as any, { diff --git a/socket/lib/primitives.tsx b/socket/lib/primitives.tsx new file mode 100644 index 0000000..819f470 --- /dev/null +++ b/socket/lib/primitives.tsx @@ -0,0 +1,27 @@ +import { createSignal, createMemo } from "solid-js"; +import { $PROXY, $TRACK, Accessor, createRoot, untrack } from "solid-js"; +import { unwrap } from "solid-js/store"; + +export function createLazyMemo( + calc: (prev: T | undefined) => T, + value?: T +): () => T { + let isReading = false; + let isStale: boolean | undefined = true; + + const [track, trigger] = createSignal(void 0, { equals: false }); + + const memo = createMemo( + (p) => (isReading ? calc(p) : ((isStale = !track()), p)), + value as T, + { equals: false } + ); + + return (): T => { + isReading = true; + if (isStale) isStale = trigger(); + const v = memo(); + isReading = false; + return v; + }; +} diff --git a/socket/lib/serializer.tsx b/socket/lib/serializer.tsx new file mode 100644 index 0000000..b49cd68 --- /dev/null +++ b/socket/lib/serializer.tsx @@ -0,0 +1,123 @@ +import { createPlugin, fromJSON, SerovalJSON, toJSON } from "seroval"; +import { $TRACK, Accessor, createMemo } from "solid-js"; +import { + createSeriazliedMemo, + createSeriazliedProjection, + createSeriazliedRef, + SerializedMemo, + SerializedProjection, + SerializedRef, +} from "./shared"; +import { + produce as immerProduce, + applyPatches, + enablePatches, + Patch, +} from "immer"; +enablePatches(); + +export function serializeReactivePayload(scope: string, input: any) { + const refs = new Map(); + + const value = toJSON(input, { + plugins: [ + createPlugin({ + tag: "seroval-plugins/socket/ref", + test: (value) => typeof value === "function", + parse: { + sync(value) { + const id = crypto.randomUUID(); + refs.set(id, value); + return createSeriazliedRef({ scope, id }); + }, + }, + serialize: () => ``, + deserialize: () => ({} as any), + }), + createPlugin({ + tag: "seroval-plugins/socket/memo", + test: (value: any) => + typeof value === "function" && value.type === "memo", + parse: { + sync(value) { + const id = crypto.randomUUID(); + refs.set(id, value); + return createSeriazliedMemo({ scope, id }); + }, + }, + serialize: () => ``, + deserialize: () => ({} as any), + }), + createPlugin({ + tag: "seroval-plugins/socket/projection", + test: (value: any) => $TRACK in value, + parse: { + sync(state) { + const id = crypto.randomUUID(); + + const mutation = state[$TRACK]; + + const projection = createMemo( + ({ state, changes: _c }) => { + let changes = [] as Patch[]; + const s = immerProduce(state, mutation, (patches) => { + changes.push(...patches); + }); + return { state: s, changes }; + }, + { state, changes: [] as Patch[] } + ); + + refs.set(id, () => projection().changes); + return createSeriazliedProjection({ scope, id, initial: state }); + }, + }, + serialize: () => ``, + deserialize: () => ({} as any), + }), + ], + }); + + return { value, refs }; +} + +export function deserializeReactivePayload( + value: SerovalJSON, + plugins: { + createSocketRefConsumer( + ref: SerializedRef + ): (...payload: I) => Promise; + createSocketMemoConsumer( + ref: SerializedMemo + ): Accessor; + createSocketProjectionConsumer( + ref: SerializedProjection + ): O; + } +) { + return fromJSON(value, { + plugins: [ + createPlugin({ + tag: "seroval-plugins/socket/ref", + test: () => true, + parse: {}, + serialize: () => ``, + deserialize: plugins.createSocketRefConsumer, + }), + createPlugin({ + tag: "seroval-plugins/socket/memo", + test: () => true, + parse: {}, + serialize: () => ``, + deserialize: plugins.createSocketMemoConsumer, + }), + createPlugin({ + tag: "seroval-plugins/socket/projection", + test: () => true, + parse: {}, + serialize: () => ``, + deserialize: plugins.createSocketProjectionConsumer, + }), + ], + }); +} diff --git a/socket/lib/server.tsx b/socket/lib/server.tsx index 31021d5..f8299c8 100644 --- a/socket/lib/server.tsx +++ b/socket/lib/server.tsx @@ -1,28 +1,32 @@ +import { parse as parseCookie } from "cookie-es"; +import type { Peer } from "crossws"; +import { fromJSON, SerovalJSON, toJSON } from "seroval"; import { - createSeriazliedMemo, - createSeriazliedStore, - SerializedMemo, - SerializedReactiveThing, - SerializedRef, - SerializedStream, - SerializedThing, - WsMessage, - WsMessageDown, - WsMessageUp, -} from "./shared"; -import { + batch, createContext, - createMemo, createRoot, createSignal, observable, onCleanup, - untrack, useContext, } from "solid-js"; +import { createStore, produce } from "solid-js/store"; import { getManifest } from "vinxi/manifest"; -import type { Peer } from "crossws"; -import { parse as parseCookie } from "cookie-es"; +import { + deserializeReactivePayload, + serializeReactivePayload, +} from "./serializer"; +import { + SerializedMemo, + SerializedProjection, + SerializedReactiveThing, + SerializedRef, + SerializedStream, + WsMessage, + WsMessageDown, + WsMessageUp, +} from "./shared"; +import { applyPatches, Patch } from "immer"; const peerCtx = createContext(); export const usePeer = () => { @@ -58,12 +62,15 @@ export type Endpoint = ( export type Endpoints = Record>; export class LiveSolidServer { - private closures = new Map void }>(); - observers = new Map(); + private closures = new Map< + string, + { refs?: Map; disposal: () => void } + >(); + observers = new Map void>(); constructor(public peer: Peer) {} - send(message: WsMessage>) { + send(message: WsMessage) { // console.log(`send`, message); this.peer.send(JSON.stringify(message)); } @@ -74,7 +81,7 @@ export class LiveSolidServer { } if (message.type === "subscribe") { - this.subscribe(message.id, message.ref, message.path || ``); + this.subscribe(message.id, message.ref); } if (message.type === "dispose") { @@ -90,7 +97,7 @@ export class LiveSolidServer { } } - async create(id: string, name: string, input?: SerializedThing) { + async create(id: string, name: string, input?: SerovalJSON) { const [filepath, functionName] = name.split("#"); const module = await getManifest(import.meta.env.ROUTER_NAME).chunks[ filepath @@ -101,9 +108,14 @@ export class LiveSolidServer { const { payload, disposal } = createRoot((disposal) => { const deserializedInput = - input?.__type === "memo" - ? createSocketMemoConsumer(input, this) - : input; + input && + deserializeReactivePayload(input, { + createSocketRefConsumer: (ref) => createSocketRefConsumer(ref, this), + createSocketMemoConsumer: (ref) => + createSocketMemoConsumer(ref, this), + createSocketProjectionConsumer: (ref) => + createSocketProjectionConsumer(ref, this), + }); let payload: any; peerCtx.Provider({ @@ -115,67 +127,21 @@ export class LiveSolidServer { return { payload, disposal }; }); - this.closures.set(id, { payload, disposal }); - - if (typeof payload === "function") { - if (payload.type === "memo") { - const value = createSeriazliedMemo({ - name, - scope: id, - initial: untrack(payload), - }); - this.send({ value, id, type: "value" }); - } else { - const value = createSeriazliedRef({ - name, - scope: id, - }); - this.send({ value, id, type: "value" }); - } - } else { - const value = Object.entries(payload).reduce((res, [name, value]) => { - return { - ...res, - [name]: - typeof value === "function" - ? // @ts-expect-error - value.type === "memo" - ? createSeriazliedMemo({ - name, - scope: id, - initial: untrack(() => value()), - }) - : // @ts-expect-error - value.type === "store-accessor" - ? createSeriazliedStore({ - name, - scope: id, - initial: untrack(() => value()), - }) - : createSeriazliedRef({ name, scope: id }) - : value, - }; - }, {} as Record); - this.send({ value, id, type: "value" }); - } + const { refs, value } = serializeReactivePayload(id, payload); + this.closures.set(id, { refs, disposal }); + this.send({ value, id, type: "value" }); } - async invoke(id: string, ref: SerializedRef, input: any[]) { - const closure = this.closures.get(ref.scope); - if (!closure) throw new Error(`Callable ${ref.scope} not found`); - const { payload } = closure; - - if (typeof payload === "function") { - const response = await payload(...input); - this.send({ id, value: response, type: "value" }); - } else { - const response = await payload[ref.name](...input); - this.send({ id, value: response, type: "value" }); - } + async invoke(id: string, ref: SerializedRef, input: SerovalJSON) { + const refFn = this.closures.get(ref.scope)!.refs!.get(ref.id)!; + const fnInput = fromJSON(input); + const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; + const response = await refFn(...arified); + const value = toJSON(response); + this.send({ id: id, value, type: "value" }); } dispose(id: string) { - // console.log(`Disposing ${id}`); const closure = this.closures.get(id); if (closure) { closure.disposal(); @@ -183,29 +149,20 @@ export class LiveSolidServer { } } - subscribe(id: string, ref: SerializedReactiveThing, path: string) { - // console.log(`subscribe`, ref); - - const closure = this.closures.get(ref.scope); - if (!closure) throw new Error(`Callable ${ref.scope} not found`); - const { payload } = closure; + subscribe(id: string, ref: SerializedReactiveThing) { + const source = this.closures.get(ref.scope)!.refs!.get(ref.id)!; - const source = typeof payload === "function" ? payload : payload[ref.name]; + const response$ = observable(() => source()); - const response$ = observable(() => - ref.__type === "projection" - ? source[path] - : ref.__type === "store-accessor" - ? source()[path] - : source() - ); - const sub = response$.subscribe((value) => { + const sub = response$.subscribe((payload) => { + const value = toJSON(payload); this.send({ id, value, type: "value" }); }); - this.closures.set(id, { payload: sub, disposal: () => sub.unsubscribe() }); + + this.closures.set(id, { disposal: () => sub.unsubscribe() }); } - stream(stream: SerializedStream) {} + stream(stream: SerializedStream) {} cleanup() { for (const [key, closure] of this.closures.entries()) { @@ -216,62 +173,54 @@ export class LiveSolidServer { } } -function createSeriazliedRef( - opts: Omit -): SerializedRef { - return { ...opts, __type: "ref" }; -} +function createSocketRefConsumer( + ref: SerializedRef, + server: LiveSolidServer +) { + const inputSubId = crypto.randomUUID(); -export function createSocketFn( - fn: () => (i?: I) => O -): () => (i?: I) => Promise; + return (...payload: I) => { + const input = toJSON(payload); -export function createSocketFn( - fn: () => Record O> -): () => Record Promise>; + server.send({ type: "invoke", id: inputSubId, ref, input }); -export function createSocketFn( - fn: () => ((i: I) => O) | Record O> -): () => ((i: I) => Promise) | Record Promise> { - return fn as any; + return new Promise((res) => { + server.observers.set(inputSubId, (value) => { + res(fromJSON(value)); + server.observers.delete(inputSubId); + }); + }); + }; } -function createLazyMemo( - calc: (prev: T | undefined) => T, - value?: T -): () => T { - let isReading = false, - isStale: boolean | undefined = true; - - const [track, trigger] = createSignal(void 0, { equals: false }), - memo = createMemo( - (p) => (isReading ? calc(p) : ((isStale = !track()), p)), - value as T, - { equals: false } - ); +function createSocketMemoConsumer( + ref: SerializedMemo, + server: LiveSolidServer +) { + const inputSubId = crypto.randomUUID(); - return (): T => { - isReading = true; - if (isStale) isStale = trigger(); - const v = memo(); - isReading = false; - return v; - }; + const [signal, setSignal] = createSignal(ref.initial!); + server.observers.set(inputSubId, (value) => setSignal(() => fromJSON(value))); + server.send({ type: "subscribe", id: inputSubId, ref }); + onCleanup(() => server.observers.delete(inputSubId)); + return signal; } -export function createSocketMemoConsumer( - ref: SerializedMemo, +function createSocketProjectionConsumer( + ref: SerializedProjection, server: LiveSolidServer ) { const inputSubId = crypto.randomUUID(); - const memo = createLazyMemo(() => { - const [get, set] = createSignal(ref.initial!); - server.observers.set(inputSubId, set); - server.send({ type: "subscribe", id: inputSubId, ref }); - onCleanup(() => server.observers.delete(inputSubId)); - return get; + const [store, setStore] = createStore(ref.initial!); + server.observers.set(inputSubId, (patches) => { + setStore( + produce((draft) => { + applyPatches(draft, fromJSON(patches)); + }) + ); }); - - return () => memo()(); + server.send({ type: "subscribe", id: inputSubId, ref }); + onCleanup(() => server.observers.delete(inputSubId)); + return store; } diff --git a/socket/lib/shared.tsx b/socket/lib/shared.tsx index 9a48391..7d1a9ed 100644 --- a/socket/lib/shared.tsx +++ b/socket/lib/shared.tsx @@ -1,95 +1,86 @@ -import { createComputed, $PROXY } from "solid-js"; -import { createStore, produce } from "solid-js/store"; +import { SerovalJSON } from "seroval"; +import { $TRACK } from "solid-js"; +import { enablePatches } from "immer"; +enablePatches(); export type WsMessage = T & { id: string }; -export type WsMessageUp = - | { - type: "create"; - name: string; - input?: I; - } +export type WsMessageUp = | { type: "subscribe"; - ref: SerializedMemo; - path?: undefined; + ref: SerializedReactiveThing; } | { - type: "subscribe"; - ref: SerializedProjection | SerializedStoreAccessor; - path: string; + type: "invoke"; + ref: SerializedRef; + input: SerovalJSON; } | { - type: "dispose"; + type: "value"; + value: SerovalJSON; } | { - type: "invoke"; - ref: SerializedRef; - input?: I; + type: "create"; + name: string; + input: SerovalJSON; } | { - type: "value"; - value: I; + type: "dispose"; }; -export type WsMessageDown = +export type WsMessageDown = | { - type: "value"; - value: T; + type: "subscribe"; + ref: SerializedReactiveThing; } | { - type: "subscribe"; - ref: SerializedMemo; + type: "invoke"; + ref: SerializedRef; + input: SerovalJSON; } | { - type: "subscribe"; - ref: SerializedProjection; - path: string; + type: "value"; + value: SerovalJSON; }; export type SerializedRef = { __type: "ref"; - name: string; + id: string; scope: string; }; export type SerializedMemo = { __type: "memo"; - name: string; + id: string; scope: string; initial?: O; }; export type SerializedProjection = { __type: "projection"; - name: string; - scope: string; - initial?: O; -}; - -export type SerializedStoreAccessor = { - __type: "store-accessor"; - name: string; + id: string; scope: string; initial?: O; }; export type SerializedReactiveThing = | SerializedMemo - | SerializedProjection - | SerializedStoreAccessor; + | SerializedProjection; -export type SerializedThing = - | SerializedRef - | SerializedReactiveThing; +export type SerializedThing = SerializedRef | SerializedReactiveThing; -export type SerializedStream = { +export type SerializedStream = { __type: "stream"; - name: string; + id: string; scope: string; - value: O; }; +export function createSeriazliedRef( + opts: Omit +): SerializedRef { + return { ...opts, __type: "ref" }; +} + export function createSeriazliedMemo( opts: Omit ): SerializedMemo { @@ -102,34 +93,18 @@ export function createSeriazliedProjection( return { ...opts, __type: "projection" }; } -export function createSeriazliedStore( - opts: Omit -): SerializedStoreAccessor { - return { ...opts, __type: "store-accessor" }; -} - export function createSocketMemo(source: () => T): () => T | undefined { // @ts-expect-error source.type = "memo"; return source; } -export function createSocketProjection( - storeOrMutation: (draft: T) => void, +export function createSocketProjection( + mutation: (draft: T) => void, init?: T ): T | undefined { + let state = init; // @ts-expect-error - const [store, setStore] = createStore(init || {}); - createComputed(() => setStore(produce(storeOrMutation))); - // @ts-expect-error - store.type = "projection"; - return store; -} - -export function createSocketStore( - storeAccessor: () => T -): T | undefined { - // @ts-expect-error - storeAccessor.type = "store-accessor"; - return storeAccessor as any; + state[$TRACK] = mutation; + return state; } diff --git a/src/components/todos.tsx b/src/components/todos.tsx index 9a003a6..b3ea1c9 100644 --- a/src/components/todos.tsx +++ b/src/components/todos.tsx @@ -28,70 +28,6 @@ export type Todo = { export function TodoApp(props: { filter: TodosFilter; listId?: string }) { const filter = () => props.filter; - const [onServerTodoEvent, emitServerTodoEvent] = createEvent(); - - const { log: todoEventLog, onEvent: onTodoEvent } = createLog({ - onEvent: onServerTodoEvent, - }); - - const [onTodoAdded] = createPartition( - onTodoEvent, - (e) => e.type === "todo-added" - ); - const [onTodoToggled] = createPartition( - onTodoEvent, - (e) => e.type === "todo-toggled" - ); - const [onTodoDeleted] = createPartition( - onTodoEvent, - (e) => e.type === "todo-deleted" - ); - const [onTodoEdited] = createPartition( - onTodoEvent, - (e) => e.type === "todo-edited" - ); - - const todos = createSubjectStore( - () => [] as Todo[], - onTodoAdded((e) => (todos) => { - const todo = todos.find((t) => t.id === e.id); - if (!todo) todos.push({ id: e.id, title: e.title, completed: false }); - }), - onTodoToggled((e) => (todos) => { - const todo = todos.find((t) => t.id === e.id); - if (todo) todo.completed = !todo.completed; - }), - onTodoDeleted((e) => (todos) => { - const index = todos.findIndex((note) => note.id === e.id); - if (index !== -1) todos.splice(index, 1); - }), - onTodoEdited((e) => (todos) => { - const todo = todos.find((t) => t.id === e.id); - if (todo) todo.title = e.title; - }) - ); - - // const _todos = createSubjectStore( - // () => [] as Todo[], - // onTodoEvent((e) => (todos) => { - // if (e.type === "todo-added") { - // todos.push({ id: e.id, title: e.title, completed: false }); - // } - // if (e.type === "todo-toggled") { - // const todo = todos.find((t) => t.id === e.id); - // if (todo) todo.completed = !todo.completed; - // } - // if (e.type === "todo-deleted") { - // const index = todos.findIndex((note) => note.id === e.id); - // if (index !== -1) todos.splice(index, 1); - // } - // if (e.type === "todo-edited") { - // const todo = todos.find((t) => t.id === e.id); - // if (todo) todo.title = e.title; - // } - // }) - // ); - const [editingTodoId, setEditingId] = createSignal(); const setEditing = ({ @@ -107,28 +43,28 @@ export function TodoApp(props: { filter: TodosFilter; listId?: string }) { const serverTodos = useServerTodos(createSocketMemo(() => props.listId)); const { events, appendEvent } = createClientEventLog(serverTodos); - // const todos = createEventProjection( - // events, - // (acc, e) => { - // if (e.type === "todo-added") { - // acc.push({ id: e.id, title: e.title, completed: false }); - // } - // if (e.type === "todo-toggled") { - // const todo = acc.find((t) => t.id === e.id); - // if (todo) todo.completed = !todo.completed; - // } - // if (e.type === "todo-deleted") { - // const index = acc.findIndex((note) => note.id === e.id); - // if (index !== -1) acc.splice(index, 1); - // } - // if (e.type === "todo-edited") { - // const todo = acc.find((t) => t.id === e.id); - // if (todo) todo.title = e.title; - // } - // return acc; - // }, - // [] as Todo[] - // ); + const todos = createEventProjection( + events, + (acc, e) => { + if (e.type === "todo-added") { + acc.push({ id: e.id, title: e.title, completed: false }); + } + if (e.type === "todo-toggled") { + const todo = acc.find((t) => t.id === e.id); + if (todo) todo.completed = !todo.completed; + } + if (e.type === "todo-deleted") { + const index = acc.findIndex((note) => note.id === e.id); + if (index !== -1) acc.splice(index, 1); + } + if (e.type === "todo-edited") { + const todo = acc.find((t) => t.id === e.id); + if (todo) todo.title = e.title; + } + return acc; + }, + [] as Todo[] + ); const filteredTodos = createMemo(() => { if (filter() === "active") return todos.filter((t) => !t.completed); diff --git a/src/lib/counter.ts b/src/lib/counter.ts index 60fea59..d4c5ba8 100644 --- a/src/lib/counter.ts +++ b/src/lib/counter.ts @@ -3,9 +3,9 @@ import { createSignal } from "solid-js"; import { createSocketMemo } from "../../socket/lib/shared"; -const [count, setCount] = createSignal(0); - export const useCounter = () => { + const [count, setCount] = createSignal(0); + const increment = () => setCount(count() + 1); const decrement = () => setCount(count() - 1); diff --git a/src/routes/index.tsx b/src/routes/index.tsx index a4a99aa..ac51c62 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -5,12 +5,17 @@ import { Invites } from "~/components/invites"; import { PresenceHost } from "~/components/presence"; import { TodoApp, TodosFilter } from "~/components/todos"; import { getUserId } from "~/lib/auth"; +import { useCounter } from "~/lib/counter"; export default function TodoAppPage(props: RouteSectionProps) { const userId = createAsync(() => getUserId()); + const counter = useCounter(); return ( <> + Date: Thu, 30 Jan 2025 03:02:17 -0600 Subject: [PATCH 3/7] eager socket signals --- socket/lib/client.tsx | 132 +++++++++++++++++++++--------------- socket/lib/primitives.tsx | 27 -------- socket/lib/serializer.tsx | 18 ++--- socket/lib/server.tsx | 65 +++++++++--------- socket/lib/shared.tsx | 38 ++++++++--- src/components/presence.tsx | 4 +- src/components/todos.tsx | 4 +- src/lib/counter.ts | 4 +- src/lib/presence.ts | 4 +- src/lib/todos.ts | 8 +-- 10 files changed, 156 insertions(+), 148 deletions(-) delete mode 100644 socket/lib/primitives.tsx diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index 268aaf9..5b8f3b9 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -63,31 +63,31 @@ function wsRpc(message: WsMessageUp) { ); } -function wsSub(message: WsMessageUp) { - const ws = getWs(); - const id = crypto.randomUUID(); - - return rxFrom( - new Observable((obs) => { - // console.log(`attaching sub handler`); - function handler(event: { data: string }) { - const data = JSON.parse(event.data) as WsMessage; - // console.log(`data`, data, id); - if (data.id === id && data.type === "value") obs.next(data.value); - } - - ws.addEventListener("message", handler); - ws.send( - JSON.stringify({ ...message, id } satisfies WsMessage) - ); - - return () => { - // console.log(`detaching sub handler`); - ws.removeEventListener("message", handler); - }; - }) - ); -} +// function wsSub(message: WsMessageUp) { +// const ws = getWs(); +// const id = crypto.randomUUID(); + +// return rxFrom( +// new Observable((obs) => { +// // console.log(`attaching sub handler`); +// function handler(event: { data: string }) { +// const data = JSON.parse(event.data) as WsMessage; +// // console.log(`data`, data, id); +// if (data.id === id && data.type === "value") obs.next(data.value); +// } + +// ws.addEventListener("message", handler); +// ws.send( +// JSON.stringify({ ...message, id } satisfies WsMessage) +// ); + +// return () => { +// // console.log(`detaching sub handler`); +// ws.removeEventListener("message", handler); +// }; +// }) +// ); +// } function createSocketRefConsumer(ref: SerializedRef) { return async (...payload: I) => { @@ -99,58 +99,84 @@ function createSocketRefConsumer(ref: SerializedRef) { function createSocketMemoConsumer(ref: SerializedMemo) { const [signal, setSignal] = createSignal(ref.initial); - const sub = wsSub({ type: "subscribe", ref }).subscribe((value) => { - setSignal(() => fromJSON(value)); + + const ws = getWs(); + function handler(event: { data: string }) { + const data = JSON.parse(event.data) as WsMessage; + if (data.type === "value" && data.id === ref.id) { + setSignal(() => fromJSON(data.value)); + } + } + ws.addEventListener("message", handler); + + onCleanup(() => { + ws.removeEventListener("message", handler); }); - onCleanup(() => sub.unsubscribe()); + return signal; } function createSocketProjectionConsumer( ref: SerializedProjection ) { - const [store, setStore] = createStore(ref.initial); - const sub = wsSub({ type: "subscribe", ref }).subscribe((patches) => { - setStore( - produce((draft) => { - applyPatches(draft, fromJSON(patches)); - }) - ); + const [store, setStore] = createStore(ref.initial!); + + const ws = getWs(); + function handler(event: { data: string }) { + const data = JSON.parse(event.data) as WsMessage; + if (data.type === "value" && data.id === ref.id) { + setStore( + produce((draft) => { + applyPatches(draft, fromJSON(data.value)); + }) + ); + } + } + ws.addEventListener("message", handler); + + onCleanup(() => { + ws.removeEventListener("message", handler); }); - onCleanup(() => sub.unsubscribe()); - return store as O; + + return store; } export function createEndpoint(name: string, rawInput?: any) { const inputScope = crypto.randomUUID(); - const { value: input, refs } = serializeReactivePayload(inputScope, rawInput); + const { + value: input, + refs, + signals, + } = serializeReactivePayload(inputScope, rawInput); // console.log({ serializedInput }); const scopePromise = wsRpc({ type: "create", name, input }); - const onSubscribe = createCallback( - (ws: SimpleWs, id: string, source: () => any) => { - createEffect(() => { - ws.send(JSON.stringify({ type: "value", id, value: source() })); - }); - } - ); - const ws = getWs(); - function handler(event: { data: string }) { + signals.forEach((signal, id) => { + createEffect(() => { + ws.send(JSON.stringify({ type: "value", id, value: signal() })); + }); + }); + + async function refHandler(event: { data: string }) { const data = JSON.parse(event.data) as WsMessage; - if (data.type === "subscribe" && data.ref.scope === inputScope) { - const source = refs.get(data.ref.id); - if (source) { - onSubscribe(ws, data.ref.id, () => source()); + if (data.type === "invoke" && data.ref.scope === inputScope) { + const fn = refs.get(data.ref.id); + if (fn) { + const fnInput = fromJSON(input); + const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; + const res = await fn(...arified); + const value = toJSON(res); + ws.send(JSON.stringify({ type: "value", id: data.id, value })); } } } - ws.addEventListener("message", handler); + ws.addEventListener("message", refHandler); onCleanup(() => { // console.log(`cleanup endpoint`); - ws.removeEventListener("message", handler); + ws.removeEventListener("message", refHandler); scopePromise.then(({ dispose }) => dispose()); }); diff --git a/socket/lib/primitives.tsx b/socket/lib/primitives.tsx deleted file mode 100644 index 819f470..0000000 --- a/socket/lib/primitives.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { createSignal, createMemo } from "solid-js"; -import { $PROXY, $TRACK, Accessor, createRoot, untrack } from "solid-js"; -import { unwrap } from "solid-js/store"; - -export function createLazyMemo( - calc: (prev: T | undefined) => T, - value?: T -): () => T { - let isReading = false; - let isStale: boolean | undefined = true; - - const [track, trigger] = createSignal(void 0, { equals: false }); - - const memo = createMemo( - (p) => (isReading ? calc(p) : ((isStale = !track()), p)), - value as T, - { equals: false } - ); - - return (): T => { - isReading = true; - if (isStale) isStale = trigger(); - const v = memo(); - isReading = false; - return v; - }; -} diff --git a/socket/lib/serializer.tsx b/socket/lib/serializer.tsx index b49cd68..0e14623 100644 --- a/socket/lib/serializer.tsx +++ b/socket/lib/serializer.tsx @@ -1,3 +1,4 @@ +import { enablePatches, produce as immerProduce, Patch } from "immer"; import { createPlugin, fromJSON, SerovalJSON, toJSON } from "seroval"; import { $TRACK, Accessor, createMemo } from "solid-js"; import { @@ -8,16 +9,11 @@ import { SerializedProjection, SerializedRef, } from "./shared"; -import { - produce as immerProduce, - applyPatches, - enablePatches, - Patch, -} from "immer"; enablePatches(); export function serializeReactivePayload(scope: string, input: any) { const refs = new Map(); + const signals = new Map(); const value = toJSON(input, { plugins: [ @@ -35,13 +31,13 @@ export function serializeReactivePayload(scope: string, input: any) { deserialize: () => ({} as any), }), createPlugin({ - tag: "seroval-plugins/socket/memo", + tag: "seroval-plugins/socket/lazy-memo", test: (value: any) => typeof value === "function" && value.type === "memo", parse: { sync(value) { const id = crypto.randomUUID(); - refs.set(id, value); + signals.set(id, value); return createSeriazliedMemo({ scope, id }); }, }, @@ -49,7 +45,7 @@ export function serializeReactivePayload(scope: string, input: any) { deserialize: () => ({} as any), }), createPlugin({ - tag: "seroval-plugins/socket/projection", + tag: "seroval-plugins/socket/lazy-projection", test: (value: any) => $TRACK in value, parse: { sync(state) { @@ -68,7 +64,7 @@ export function serializeReactivePayload(scope: string, input: any) { { state, changes: [] as Patch[] } ); - refs.set(id, () => projection().changes); + signals.set(id, () => projection().changes); return createSeriazliedProjection({ scope, id, initial: state }); }, }, @@ -78,7 +74,7 @@ export function serializeReactivePayload(scope: string, input: any) { ], }); - return { value, refs }; + return { value, refs, signals }; } export function deserializeReactivePayload( diff --git a/socket/lib/server.tsx b/socket/lib/server.tsx index f8299c8..b7f8c49 100644 --- a/socket/lib/server.tsx +++ b/socket/lib/server.tsx @@ -1,12 +1,12 @@ import { parse as parseCookie } from "cookie-es"; import type { Peer } from "crossws"; +import { applyPatches, Patch } from "immer"; import { fromJSON, SerovalJSON, toJSON } from "seroval"; import { - batch, createContext, + createEffect, createRoot, createSignal, - observable, onCleanup, useContext, } from "solid-js"; @@ -19,14 +19,12 @@ import { import { SerializedMemo, SerializedProjection, - SerializedReactiveThing, SerializedRef, SerializedStream, WsMessage, WsMessageDown, WsMessageUp, } from "./shared"; -import { applyPatches, Patch } from "immer"; const peerCtx = createContext(); export const usePeer = () => { @@ -70,7 +68,7 @@ export class LiveSolidServer { constructor(public peer: Peer) {} - send(message: WsMessage) { + send(message: WsMessage) { // console.log(`send`, message); this.peer.send(JSON.stringify(message)); } @@ -80,9 +78,9 @@ export class LiveSolidServer { this.create(message.id, message.name, message.input); } - if (message.type === "subscribe") { - this.subscribe(message.id, message.ref); - } + // if (message.type === "subscribe") { + // this.subscribe(message.id, message.ref); + // } if (message.type === "dispose") { this.dispose(message.id); @@ -106,7 +104,7 @@ export class LiveSolidServer { if (!endpoint) throw new Error(`Endpoint ${name} not found`); - const { payload, disposal } = createRoot((disposal) => { + const { refs, disposal } = createRoot((disposal) => { const deserializedInput = input && deserializeReactivePayload(input, { @@ -124,12 +122,17 @@ export class LiveSolidServer { children: () => (payload = endpoint(deserializedInput)), }); - return { payload, disposal }; - }); + const { refs, signals, value } = serializeReactivePayload(id, payload); + this.send({ value, id, type: "value" }); + signals.forEach((signal, id) => { + createEffect(() => { + this.send({ value: signal(), id, type: "value" }); + }); + }); - const { refs, value } = serializeReactivePayload(id, payload); + return { refs, disposal }; + }); this.closures.set(id, { refs, disposal }); - this.send({ value, id, type: "value" }); } async invoke(id: string, ref: SerializedRef, input: SerovalJSON) { @@ -138,7 +141,7 @@ export class LiveSolidServer { const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; const response = await refFn(...arified); const value = toJSON(response); - this.send({ id: id, value, type: "value" }); + this.send({ id, value, type: "value" }); } dispose(id: string) { @@ -149,18 +152,18 @@ export class LiveSolidServer { } } - subscribe(id: string, ref: SerializedReactiveThing) { - const source = this.closures.get(ref.scope)!.refs!.get(ref.id)!; + // subscribe(id: string, ref: SerializedReactiveThing) { + // const source = this.closures.get(ref.scope)!.refs!.get(ref.id)!; - const response$ = observable(() => source()); + // const response$ = observable(() => source()); - const sub = response$.subscribe((payload) => { - const value = toJSON(payload); - this.send({ id, value, type: "value" }); - }); + // const sub = response$.subscribe((payload) => { + // const value = toJSON(payload); + // this.send({ id, value, type: "value" }); + // }); - this.closures.set(id, { disposal: () => sub.unsubscribe() }); - } + // this.closures.set(id, { disposal: () => sub.unsubscribe() }); + // } stream(stream: SerializedStream) {} @@ -197,12 +200,9 @@ function createSocketMemoConsumer( ref: SerializedMemo, server: LiveSolidServer ) { - const inputSubId = crypto.randomUUID(); - - const [signal, setSignal] = createSignal(ref.initial!); - server.observers.set(inputSubId, (value) => setSignal(() => fromJSON(value))); - server.send({ type: "subscribe", id: inputSubId, ref }); - onCleanup(() => server.observers.delete(inputSubId)); + const [signal, setSignal] = createSignal(ref.initial); + server.observers.set(ref.id, (value) => setSignal(() => fromJSON(value))); + onCleanup(() => server.observers.delete(ref.id)); return signal; } @@ -210,17 +210,14 @@ function createSocketProjectionConsumer( ref: SerializedProjection, server: LiveSolidServer ) { - const inputSubId = crypto.randomUUID(); - const [store, setStore] = createStore(ref.initial!); - server.observers.set(inputSubId, (patches) => { + server.observers.set(ref.id, (patches) => { setStore( produce((draft) => { applyPatches(draft, fromJSON(patches)); }) ); }); - server.send({ type: "subscribe", id: inputSubId, ref }); - onCleanup(() => server.observers.delete(inputSubId)); + onCleanup(() => server.observers.delete(ref.id)); return store; } diff --git a/socket/lib/shared.tsx b/socket/lib/shared.tsx index 7d1a9ed..473bbec 100644 --- a/socket/lib/shared.tsx +++ b/socket/lib/shared.tsx @@ -1,15 +1,15 @@ import { SerovalJSON } from "seroval"; -import { $TRACK } from "solid-js"; +import { $TRACK, $PROXY } from "solid-js"; import { enablePatches } from "immer"; enablePatches(); export type WsMessage = T & { id: string }; export type WsMessageUp = - | { - type: "subscribe"; - ref: SerializedReactiveThing; - } + // | { + // type: "subscribe"; + // ref: SerializedReactiveThing; + // } | { type: "invoke"; ref: SerializedRef; @@ -29,10 +29,10 @@ export type WsMessageUp = }; export type WsMessageDown = - | { - type: "subscribe"; - ref: SerializedReactiveThing; - } + // | { + // type: "subscribe"; + // ref: SerializedReactiveThing; + // } | { type: "invoke"; ref: SerializedRef; @@ -93,13 +93,13 @@ export function createSeriazliedProjection( return { ...opts, __type: "projection" }; } -export function createSocketMemo(source: () => T): () => T | undefined { +export function createSocketLazyMemo(source: () => T): () => T | undefined { // @ts-expect-error source.type = "memo"; return source; } -export function createSocketProjection( +export function createSocketLazyProjection( mutation: (draft: T) => void, init?: T ): T | undefined { @@ -108,3 +108,19 @@ export function createSocketProjection( state[$TRACK] = mutation; return state; } + +export function createSocketMemo(source: () => T): () => T | undefined { + // @ts-expect-error + source.type = "eager-memo"; + return source; +} + +export function createSocketProjection( + mutation: (draft: T) => void, + init?: T +): T | undefined { + let state = init; + // @ts-expect-error + state[$PROXY] = mutation; + return state; +} diff --git a/src/components/presence.tsx b/src/components/presence.tsx index 2cbe397..b093951 100644 --- a/src/components/presence.tsx +++ b/src/components/presence.tsx @@ -12,7 +12,7 @@ import { } from "solid-js"; import { createStore, reconcile } from "solid-js/store"; import { usePresence, PresenceUser } from "~/lib/presence"; -import { createSocketMemo } from "../../socket/lib/shared"; +import { createSocketLazyMemo } from "../../socket/lib/shared"; import { throttle } from "@solid-primitives/scheduled"; import { RiDevelopmentCursorLine } from "solid-icons/ri"; @@ -20,7 +20,7 @@ export function PresenceHost(props: ParentProps<{ docId?: string }>) { let ref: HTMLElement | undefined; const mousePos = createDebouncedMousePos(() => ref); const userPos = () => ({ docId: props.docId, ...mousePos() }); - const users = usePresence(createSocketMemo(userPos)); + const users = usePresence(createSocketLazyMemo(userPos)); const [presenceStore, setPresenceStore] = createStore([]); createComputed(() => diff --git a/src/components/todos.tsx b/src/components/todos.tsx index b3ea1c9..663d529 100644 --- a/src/components/todos.tsx +++ b/src/components/todos.tsx @@ -12,7 +12,7 @@ import { createEventProjection, createEventComputed, } from "../../socket/events"; -import { createSocketMemo } from "../../socket/lib/shared"; +import { createSocketLazyMemo } from "../../socket/lib/shared"; import { CompleteIcon, IncompleteIcon } from "./icons"; import { createLog } from "../../socket/events/v2"; import { createEvent, createPartition, createSubjectStore } from "solid-events"; @@ -41,7 +41,7 @@ export function TodoApp(props: { filter: TodosFilter; listId?: string }) { }; let inputRef!: HTMLInputElement; - const serverTodos = useServerTodos(createSocketMemo(() => props.listId)); + const serverTodos = useServerTodos(createSocketLazyMemo(() => props.listId)); const { events, appendEvent } = createClientEventLog(serverTodos); const todos = createEventProjection( events, diff --git a/src/lib/counter.ts b/src/lib/counter.ts index d4c5ba8..8ed20a5 100644 --- a/src/lib/counter.ts +++ b/src/lib/counter.ts @@ -1,7 +1,7 @@ "use socket"; import { createSignal } from "solid-js"; -import { createSocketMemo } from "../../socket/lib/shared"; +import { createSocketLazyMemo } from "../../socket/lib/shared"; export const useCounter = () => { const [count, setCount] = createSignal(0); @@ -9,5 +9,5 @@ export const useCounter = () => { const increment = () => setCount(count() + 1); const decrement = () => setCount(count() - 1); - return { count: createSocketMemo(count), increment, decrement }; + return { count: createSocketLazyMemo(count), increment, decrement }; }; diff --git a/src/lib/presence.ts b/src/lib/presence.ts index bc490b0..e98a524 100644 --- a/src/lib/presence.ts +++ b/src/lib/presence.ts @@ -1,7 +1,7 @@ "use socket"; import { createEffect, createMemo, createSignal, onCleanup } from "solid-js"; -import { createSocketMemo } from "../../socket/lib/shared"; +import { createSocketLazyMemo } from "../../socket/lib/shared"; import { useCookies } from "../../socket/lib/server"; export type PresenceUser = { @@ -45,5 +45,5 @@ export const usePresence = ( return rest; }); - return createSocketMemo(otherUsers); + return createSocketLazyMemo(otherUsers); }; diff --git a/src/lib/todos.ts b/src/lib/todos.ts index d1fd2ab..1545727 100644 --- a/src/lib/todos.ts +++ b/src/lib/todos.ts @@ -2,7 +2,7 @@ import { createServerEventLog } from "../../socket/events/socket"; import { useCookies } from "../../socket/lib/server"; -import { createSocketMemo } from "../../socket/lib/shared"; +import { createSocketLazyMemo } from "../../socket/lib/shared"; import { EventLog } from "../../socket/events"; import { createPersistedSignal } from "../../socket/persisted"; import { storage } from "./db"; @@ -46,7 +46,7 @@ export const useServerTodos = (_listId?: () => string | undefined) => { ); return { - serverEvents: createSocketMemo(serverEvents), + serverEvents: createSocketLazyMemo(serverEvents), appendEvent, }; }; @@ -74,12 +74,12 @@ export const useInvites = () => { }; return { - inviteds: createSocketMemo(() => + inviteds: createSocketLazyMemo(() => Object.entries(invites()) .filter(([, invites]) => invites.includes(cookies.userId)) .map(([invitee]) => invitee) ), - invites: createSocketMemo(() => invites()[cookies.userId] || []), + invites: createSocketLazyMemo(() => invites()[cookies.userId] || []), addInvite, removeInvite, }; From 9edd82f32238e234e3ded2e9e10feb3d4c46a81f Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Thu, 30 Jan 2025 03:56:20 -0600 Subject: [PATCH 4/7] working serialization with class wrappers --- socket/lib/client.tsx | 2 +- socket/lib/serializer.tsx | 49 ++++++++++++++++++++++--------------- socket/lib/server.tsx | 2 +- socket/lib/shared.tsx | 33 ++++++++++++------------- src/components/presence.tsx | 4 +-- src/components/todos.tsx | 19 ++++---------- src/lib/counter.ts | 8 ++++-- src/lib/presence.ts | 4 +-- src/lib/todos.ts | 8 +++--- 9 files changed, 65 insertions(+), 64 deletions(-) diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index 5b8f3b9..fd78d09 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -164,7 +164,7 @@ export function createEndpoint(name: string, rawInput?: any) { if (data.type === "invoke" && data.ref.scope === inputScope) { const fn = refs.get(data.ref.id); if (fn) { - const fnInput = fromJSON(input); + const fnInput = fromJSON(data.input); const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; const res = await fn(...arified); const value = toJSON(res); diff --git a/socket/lib/serializer.tsx b/socket/lib/serializer.tsx index 0e14623..6e23a13 100644 --- a/socket/lib/serializer.tsx +++ b/socket/lib/serializer.tsx @@ -1,13 +1,16 @@ import { enablePatches, produce as immerProduce, Patch } from "immer"; import { createPlugin, fromJSON, SerovalJSON, toJSON } from "seroval"; -import { $TRACK, Accessor, createMemo } from "solid-js"; +import { Accessor, createMemo } from "solid-js"; import { createSeriazliedMemo, createSeriazliedProjection, createSeriazliedRef, SerializedMemo, + SerializedMemoClass, SerializedProjection, + SerializedProjectionClass, SerializedRef, + SerializedRefClass, } from "./shared"; enablePatches(); @@ -17,55 +20,60 @@ export function serializeReactivePayload(scope: string, input: any) { const value = toJSON(input, { plugins: [ - createPlugin({ + createPlugin({ tag: "seroval-plugins/socket/ref", - test: (value) => typeof value === "function", + test: (value) => value instanceof SerializedRefClass, parse: { sync(value) { const id = crypto.randomUUID(); - refs.set(id, value); + refs.set(id, value.handler); return createSeriazliedRef({ scope, id }); }, }, serialize: () => ``, deserialize: () => ({} as any), }), - createPlugin({ - tag: "seroval-plugins/socket/lazy-memo", - test: (value: any) => - typeof value === "function" && value.type === "memo", + createPlugin({ + tag: "seroval-plugins/socket/memo", + test: (value: any) => value instanceof SerializedMemoClass, parse: { sync(value) { const id = crypto.randomUUID(); - signals.set(id, value); + signals.set(id, value.signal); return createSeriazliedMemo({ scope, id }); }, }, serialize: () => ``, deserialize: () => ({} as any), }), - createPlugin({ - tag: "seroval-plugins/socket/lazy-projection", - test: (value: any) => $TRACK in value, + createPlugin({ + tag: "seroval-plugins/socket/projection", + test: (value: any) => value instanceof SerializedProjectionClass, parse: { - sync(state) { + sync(store) { const id = crypto.randomUUID(); - const mutation = state[$TRACK]; - const projection = createMemo( ({ state, changes: _c }) => { let changes = [] as Patch[]; - const s = immerProduce(state, mutation, (patches) => { - changes.push(...patches); - }); + const s = immerProduce( + state, + store.mutation as any, + (patches) => { + changes.push(...patches); + } + ); return { state: s, changes }; }, - { state, changes: [] as Patch[] } + { state: store.init, changes: [] as Patch[] } ); signals.set(id, () => projection().changes); - return createSeriazliedProjection({ scope, id, initial: state }); + return createSeriazliedProjection({ + scope, + id, + initial: store.init, + }); }, }, serialize: () => ``, @@ -91,6 +99,7 @@ export function deserializeReactivePayload( ): O; } ) { + console.log({ value }); return fromJSON(value, { plugins: [ createPlugin({ diff --git a/socket/lib/server.tsx b/socket/lib/server.tsx index b7f8c49..7cacb61 100644 --- a/socket/lib/server.tsx +++ b/socket/lib/server.tsx @@ -126,7 +126,7 @@ export class LiveSolidServer { this.send({ value, id, type: "value" }); signals.forEach((signal, id) => { createEffect(() => { - this.send({ value: signal(), id, type: "value" }); + this.send({ value: toJSON(signal()), id, type: "value" }); }); }); diff --git a/socket/lib/shared.tsx b/socket/lib/shared.tsx index 473bbec..e128e78 100644 --- a/socket/lib/shared.tsx +++ b/socket/lib/shared.tsx @@ -48,6 +48,9 @@ export type SerializedRef = { id: string; scope: string; }; +export class SerializedRefClass { + constructor(public handler: Function) {} +} export type SerializedMemo = { __type: "memo"; @@ -56,6 +59,10 @@ export type SerializedMemo = { initial?: O; }; +export class SerializedMemoClass { + constructor(public signal: Function) {} +} + export type SerializedProjection = { __type: "projection"; id: string; @@ -63,6 +70,10 @@ export type SerializedProjection = { initial?: O; }; +export class SerializedProjectionClass { + constructor(public init: any, public mutation: Function) {} +} + export type SerializedReactiveThing = | SerializedMemo | SerializedProjection; @@ -93,34 +104,20 @@ export function createSeriazliedProjection( return { ...opts, __type: "projection" }; } -export function createSocketLazyMemo(source: () => T): () => T | undefined { - // @ts-expect-error - source.type = "memo"; - return source; -} - -export function createSocketLazyProjection( - mutation: (draft: T) => void, - init?: T -): T | undefined { - let state = init; +export function createSocketRef(source: F): F { // @ts-expect-error - state[$TRACK] = mutation; - return state; + return new SerializedRefClass(source); } export function createSocketMemo(source: () => T): () => T | undefined { // @ts-expect-error - source.type = "eager-memo"; - return source; + return new SerializedMemoClass(source); } export function createSocketProjection( mutation: (draft: T) => void, init?: T ): T | undefined { - let state = init; // @ts-expect-error - state[$PROXY] = mutation; - return state; + return new SerializedProjectionClass(init, mutation); } diff --git a/src/components/presence.tsx b/src/components/presence.tsx index b093951..2cbe397 100644 --- a/src/components/presence.tsx +++ b/src/components/presence.tsx @@ -12,7 +12,7 @@ import { } from "solid-js"; import { createStore, reconcile } from "solid-js/store"; import { usePresence, PresenceUser } from "~/lib/presence"; -import { createSocketLazyMemo } from "../../socket/lib/shared"; +import { createSocketMemo } from "../../socket/lib/shared"; import { throttle } from "@solid-primitives/scheduled"; import { RiDevelopmentCursorLine } from "solid-icons/ri"; @@ -20,7 +20,7 @@ export function PresenceHost(props: ParentProps<{ docId?: string }>) { let ref: HTMLElement | undefined; const mousePos = createDebouncedMousePos(() => ref); const userPos = () => ({ docId: props.docId, ...mousePos() }); - const users = usePresence(createSocketLazyMemo(userPos)); + const users = usePresence(createSocketMemo(userPos)); const [presenceStore, setPresenceStore] = createStore([]); createComputed(() => diff --git a/src/components/todos.tsx b/src/components/todos.tsx index 663d529..09cf8d8 100644 --- a/src/components/todos.tsx +++ b/src/components/todos.tsx @@ -1,21 +1,12 @@ -import { createSignal, createMemo, Show, For } from "solid-js"; -import { - TodoCreated, - TodoDeleted, - TodoEdited, - TodoEvent, - TodoToggled, - useServerTodos, -} from "~/lib/todos"; +import { createMemo, createSignal, For, Show } from "solid-js"; +import { useServerTodos } from "~/lib/todos"; import { createClientEventLog, - createEventProjection, createEventComputed, + createEventProjection, } from "../../socket/events"; -import { createSocketLazyMemo } from "../../socket/lib/shared"; +import { createSocketMemo } from "../../socket/lib/shared"; import { CompleteIcon, IncompleteIcon } from "./icons"; -import { createLog } from "../../socket/events/v2"; -import { createEvent, createPartition, createSubjectStore } from "solid-events"; export type TodosFilter = "all" | "active" | "completed" | undefined; @@ -41,7 +32,7 @@ export function TodoApp(props: { filter: TodosFilter; listId?: string }) { }; let inputRef!: HTMLInputElement; - const serverTodos = useServerTodos(createSocketLazyMemo(() => props.listId)); + const serverTodos = useServerTodos(createSocketMemo(() => props.listId)); const { events, appendEvent } = createClientEventLog(serverTodos); const todos = createEventProjection( events, diff --git a/src/lib/counter.ts b/src/lib/counter.ts index 8ed20a5..bbf8671 100644 --- a/src/lib/counter.ts +++ b/src/lib/counter.ts @@ -1,7 +1,7 @@ "use socket"; import { createSignal } from "solid-js"; -import { createSocketLazyMemo } from "../../socket/lib/shared"; +import { createSocketMemo, createSocketRef } from "../../socket/lib/shared"; export const useCounter = () => { const [count, setCount] = createSignal(0); @@ -9,5 +9,9 @@ export const useCounter = () => { const increment = () => setCount(count() + 1); const decrement = () => setCount(count() - 1); - return { count: createSocketLazyMemo(count), increment, decrement }; + return { + count: createSocketMemo(count), + increment: createSocketRef(increment), + decrement: createSocketRef(decrement), + }; }; diff --git a/src/lib/presence.ts b/src/lib/presence.ts index e98a524..bc490b0 100644 --- a/src/lib/presence.ts +++ b/src/lib/presence.ts @@ -1,7 +1,7 @@ "use socket"; import { createEffect, createMemo, createSignal, onCleanup } from "solid-js"; -import { createSocketLazyMemo } from "../../socket/lib/shared"; +import { createSocketMemo } from "../../socket/lib/shared"; import { useCookies } from "../../socket/lib/server"; export type PresenceUser = { @@ -45,5 +45,5 @@ export const usePresence = ( return rest; }); - return createSocketLazyMemo(otherUsers); + return createSocketMemo(otherUsers); }; diff --git a/src/lib/todos.ts b/src/lib/todos.ts index 1545727..d1fd2ab 100644 --- a/src/lib/todos.ts +++ b/src/lib/todos.ts @@ -2,7 +2,7 @@ import { createServerEventLog } from "../../socket/events/socket"; import { useCookies } from "../../socket/lib/server"; -import { createSocketLazyMemo } from "../../socket/lib/shared"; +import { createSocketMemo } from "../../socket/lib/shared"; import { EventLog } from "../../socket/events"; import { createPersistedSignal } from "../../socket/persisted"; import { storage } from "./db"; @@ -46,7 +46,7 @@ export const useServerTodos = (_listId?: () => string | undefined) => { ); return { - serverEvents: createSocketLazyMemo(serverEvents), + serverEvents: createSocketMemo(serverEvents), appendEvent, }; }; @@ -74,12 +74,12 @@ export const useInvites = () => { }; return { - inviteds: createSocketLazyMemo(() => + inviteds: createSocketMemo(() => Object.entries(invites()) .filter(([, invites]) => invites.includes(cookies.userId)) .map(([invitee]) => invitee) ), - invites: createSocketLazyMemo(() => invites()[cookies.userId] || []), + invites: createSocketMemo(() => invites()[cookies.userId] || []), addInvite, removeInvite, }; From 8a37b67777c050fec66311c4cdcfc9222c015da5 Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Thu, 30 Jan 2025 03:56:43 -0600 Subject: [PATCH 5/7] organized imports --- socket/lib/client.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index fd78d09..f489c75 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -1,8 +1,7 @@ import { createLazyMemo } from "@solid-primitives/memo"; -import { createCallback } from "@solid-primitives/rootless"; import { createWS } from "@solid-primitives/websocket"; import { createAsync } from "@solidjs/router"; -import { Observable, from as rxFrom } from "rxjs"; +import { applyPatches, Patch } from "immer"; import { fromJSON, SerovalJSON, toJSON } from "seroval"; import { createEffect, createMemo, createSignal, onCleanup } from "solid-js"; import { createStore, produce } from "solid-js/store"; @@ -18,7 +17,6 @@ import { WsMessageDown, WsMessageUp, } from "./shared"; -import { applyPatches, Patch } from "immer"; const protocol = window.location.protocol === "https:" ? "wss" : "ws"; const wsUrl = `${protocol}://${window.location.hostname}:${window.location.port}/_ws`; From 5dac4d9456a39094ab300c2e3b7e809123fb2626 Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Thu, 30 Jan 2025 04:53:36 -0600 Subject: [PATCH 6/7] error handling delegated to the client --- socket/lib/client.tsx | 56 +++++++++++++------------- socket/lib/server.tsx | 93 +++++++++++++++++++++++++------------------ socket/lib/shared.tsx | 4 ++ 3 files changed, 87 insertions(+), 66 deletions(-) diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index f489c75..336b3f8 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -33,32 +33,35 @@ function wsRpc(message: WsMessageUp) { const ws = getWs(); const id = crypto.randomUUID() as string; - return new Promise<{ value: SerovalJSON; dispose: () => void }>( - async (res, rej) => { - function dispose() { - ws.send( - JSON.stringify({ - type: "dispose", - id, - } satisfies WsMessage) - ); - } - - function handler(event: { data: string }) { - // console.log(`handler ${id}`, message, { data: event.data }); - const data = JSON.parse(event.data) as WsMessage; - if (data.id === id && data.type === "value") { - res({ value: data.value, dispose }); - ws.removeEventListener("message", handler); - } - } - - ws.addEventListener("message", handler); + return new Promise(async (res, rej) => { + function dispose() { + ws.removeEventListener("message", handler); ws.send( - JSON.stringify({ ...message, id } satisfies WsMessage) + JSON.stringify({ + type: "dispose", + id, + } satisfies WsMessage) ); } - ); + + function handler(event: { data: string }) { + // console.log(`handler ${id}`, message, { data: event.data }); + const data = JSON.parse(event.data) as WsMessage; + if (data.id === id && data.type === "value") { + res(data.value); + dispose(); + } + if (data.id === id && data.type === "error") { + rej(data.error); + dispose(); + } + } + + ws.addEventListener("message", handler); + ws.send( + JSON.stringify({ ...message, id } satisfies WsMessage) + ); + }); } // function wsSub(message: WsMessageUp) { @@ -90,7 +93,7 @@ function wsRpc(message: WsMessageUp) { function createSocketRefConsumer(ref: SerializedRef) { return async (...payload: I) => { const input = toJSON(payload); - const { value } = await wsRpc({ type: "invoke", ref, input }); + const value = await wsRpc({ type: "invoke", ref, input }); return fromJSON(value); }; } @@ -153,7 +156,7 @@ export function createEndpoint(name: string, rawInput?: any) { const ws = getWs(); signals.forEach((signal, id) => { createEffect(() => { - ws.send(JSON.stringify({ type: "value", id, value: signal() })); + ws.send(JSON.stringify({ type: "value", id, value: toJSON(signal()) })); }); }); @@ -175,14 +178,13 @@ export function createEndpoint(name: string, rawInput?: any) { onCleanup(() => { // console.log(`cleanup endpoint`); ws.removeEventListener("message", refHandler); - scopePromise.then(({ dispose }) => dispose()); }); const scope = createAsync(() => scopePromise); const deserializedScope = createMemo( () => scope() && - deserializeReactivePayload(scope()!.value, { + deserializeReactivePayload(scope()!, { createSocketMemoConsumer, createSocketRefConsumer, createSocketProjectionConsumer, diff --git a/socket/lib/server.tsx b/socket/lib/server.tsx index 7cacb61..9d04358 100644 --- a/socket/lib/server.tsx +++ b/socket/lib/server.tsx @@ -96,52 +96,67 @@ export class LiveSolidServer { } async create(id: string, name: string, input?: SerovalJSON) { - const [filepath, functionName] = name.split("#"); - const module = await getManifest(import.meta.env.ROUTER_NAME).chunks[ - filepath - ].import(); - const endpoint = module[functionName]; - - if (!endpoint) throw new Error(`Endpoint ${name} not found`); - - const { refs, disposal } = createRoot((disposal) => { - const deserializedInput = - input && - deserializeReactivePayload(input, { - createSocketRefConsumer: (ref) => createSocketRefConsumer(ref, this), - createSocketMemoConsumer: (ref) => - createSocketMemoConsumer(ref, this), - createSocketProjectionConsumer: (ref) => - createSocketProjectionConsumer(ref, this), + try { + const [filepath, functionName] = name.split("#"); + const module = await getManifest(import.meta.env.ROUTER_NAME).chunks[ + filepath + ].import(); + const endpoint = module[functionName]; + + if (!endpoint) throw new Error(`Endpoint ${name} not found`); + + const { refs, disposal } = createRoot((disposal) => { + const deserializedInput = + input && + deserializeReactivePayload(input, { + createSocketRefConsumer: (ref) => + createSocketRefConsumer(ref, this), + createSocketMemoConsumer: (ref) => + createSocketMemoConsumer(ref, this), + createSocketProjectionConsumer: (ref) => + createSocketProjectionConsumer(ref, this), + }); + + let payload: any; + peerCtx.Provider({ + value: this.peer, + // @ts-expect-error + children: () => (payload = endpoint(deserializedInput)), }); - let payload: any; - peerCtx.Provider({ - value: this.peer, - // @ts-expect-error - children: () => (payload = endpoint(deserializedInput)), - }); - - const { refs, signals, value } = serializeReactivePayload(id, payload); - this.send({ value, id, type: "value" }); - signals.forEach((signal, id) => { - createEffect(() => { - this.send({ value: toJSON(signal()), id, type: "value" }); + const { refs, signals, value } = serializeReactivePayload(id, payload); + this.send({ value, id, type: "value" }); + + const scope = id; + signals.forEach((signal, id) => { + createEffect(() => { + try { + this.send({ value: toJSON(signal()), id, type: "value" }); + } catch (error) { + this.send({ error: toJSON(error), id: scope, type: "error" }); + } + }); }); - }); - return { refs, disposal }; - }); - this.closures.set(id, { refs, disposal }); + return { refs, disposal }; + }); + this.closures.set(id, { refs, disposal }); + } catch (error) { + this.send({ error: toJSON(error), id, type: "error" }); + } } async invoke(id: string, ref: SerializedRef, input: SerovalJSON) { - const refFn = this.closures.get(ref.scope)!.refs!.get(ref.id)!; - const fnInput = fromJSON(input); - const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; - const response = await refFn(...arified); - const value = toJSON(response); - this.send({ id, value, type: "value" }); + try { + const refFn = this.closures.get(ref.scope)!.refs!.get(ref.id)!; + const fnInput = fromJSON(input); + const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; + const response = await refFn(...arified); + const value = toJSON(response); + this.send({ id, value, type: "value" }); + } catch (error) { + this.send({ id, error: toJSON(error), type: "error" }); + } } dispose(id: string) { diff --git a/socket/lib/shared.tsx b/socket/lib/shared.tsx index e128e78..1f9def5 100644 --- a/socket/lib/shared.tsx +++ b/socket/lib/shared.tsx @@ -41,6 +41,10 @@ export type WsMessageDown = | { type: "value"; value: SerovalJSON; + } + | { + type: "error"; + error: SerovalJSON; }; export type SerializedRef = { From f9e9f9714bebe48d800e3eef93c4db0e6e6b72ff Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Fri, 31 Jan 2025 22:46:44 -0600 Subject: [PATCH 7/7] fixed creation disposed automatically --- bun.lock | 1454 +++++++++++++++++++++++++++++++++++++++++ socket/lib/client.tsx | 84 +-- socket/lib/server.tsx | 29 +- socket/lib/shared.tsx | 6 - src/routes/index.tsx | 12 +- 5 files changed, 1495 insertions(+), 90 deletions(-) create mode 100644 bun.lock diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..93cfeb5 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1454 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "solid-socket", + "dependencies": { + "@kobalte/core": "^0.13.7", + "@solid-primitives/memo": "^1.3.9", + "@solid-primitives/mouse": "^2.0.20", + "@solid-primitives/scheduled": "^1.4.4", + "@solid-primitives/websocket": "^1.2.2", + "@solidjs/router": "^0.14.10", + "@solidjs/start": "^1.0.9", + "immer": "^10.1.1", + "rxjs": "^7.8.1", + "seroval": "^1.2.0", + "solid-events": "^0.0.5", + "solid-icons": "^1.1.0", + "solid-js": "^1.9.2", + "unique-names-generator": "^4.7.1", + "unstorage": "1.10.2", + "vinxi": "^0.4.3", + }, + "devDependencies": { + "@babel/preset-typescript": "^7.26.0", + "@vinxi/plugin-directives": "^0.4.3", + "babel-plugin-transform-import-paths": "^1.0.3", + "vite-plugin-babel": "^1.2.0", + "vitest": "^3.0.4", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + + "@babel/compat-data": ["@babel/compat-data@7.26.5", "", {}, "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg=="], + + "@babel/core": ["@babel/core@7.26.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA=="], + + "@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.25.9", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.26.5", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/traverse": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], + + "@babel/helpers": ["@babel/helpers@7.26.7", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" } }, "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A=="], + + "@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.26.3", "", { "dependencies": { "@babel/helper-module-transforms": "^7.26.0", "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.26.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.26.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-transform-modules-commonjs": "^7.25.9", "@babel/plugin-transform-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg=="], + + "@babel/standalone": ["@babel/standalone@7.26.7", "", {}, "sha512-Fvdo9Dd20GDUAREzYMIR2EFMKAJ+ccxstgQdb39XV/yvygHL4UPcqgTkiChPyltAe/b+zgq+vUPXeukEZ6aUeA=="], + + "@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="], + + "@babel/traverse": ["@babel/traverse@7.26.7", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA=="], + + "@babel/types": ["@babel/types@7.26.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg=="], + + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.3.4", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q=="], + + "@corvu/utils": ["@corvu/utils@0.4.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.11" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA=="], + + "@deno/shim-deno": ["@deno/shim-deno@0.19.2", "", { "dependencies": { "@deno/shim-deno-test": "^0.5.0", "which": "^4.0.0" } }, "sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q=="], + + "@deno/shim-deno-test": ["@deno/shim-deno-test@0.5.0", "", {}, "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.20.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.20.2", "", { "os": "android", "cpu": "arm" }, "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.20.2", "", { "os": "android", "cpu": "arm64" }, "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.20.2", "", { "os": "android", "cpu": "x64" }, "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.20.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.20.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.20.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.20.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.20.2", "", { "os": "linux", "cpu": "arm" }, "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.20.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.20.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.20.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.20.2", "", { "os": "linux", "cpu": "none" }, "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.20.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.20.2", "", { "os": "linux", "cpu": "x64" }, "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.20.2", "", { "os": "none", "cpu": "x64" }, "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.20.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.20.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.20.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.20.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.20.2", "", { "os": "win32", "cpu": "x64" }, "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ=="], + + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@internationalized/date": ["@internationalized/date@3.7.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ=="], + + "@internationalized/number": ["@internationalized/number@3.6.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw=="], + + "@ioredis/commands": ["@ioredis/commands@1.2.0", "", {}, "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="], + + "@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=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@kobalte/core": ["@kobalte/core@0.13.7", "", { "dependencies": { "@floating-ui/dom": "^1.5.1", "@internationalized/date": "^3.4.0", "@internationalized/number": "^3.2.1", "@kobalte/utils": "^0.9.1", "@solid-primitives/props": "^3.1.8", "@solid-primitives/resize-observer": "^2.0.26", "solid-presence": "^0.1.8", "solid-prevent-scroll": "^0.1.4" }, "peerDependencies": { "solid-js": "^1.8.15" } }, "sha512-COhjWk1KnCkl3qMJDvdrOsvpTlJ9gMLdemkAn5SWfbPn/lxJYabejnNOk+b/ILGg7apzQycgbuo48qb8ppqsAg=="], + + "@kobalte/utils": ["@kobalte/utils@0.9.1", "", { "dependencies": { "@solid-primitives/event-listener": "^2.2.14", "@solid-primitives/keyed": "^1.2.0", "@solid-primitives/map": "^0.4.7", "@solid-primitives/media": "^2.2.4", "@solid-primitives/props": "^3.1.8", "@solid-primitives/refs": "^1.0.5", "@solid-primitives/utils": "^6.2.1" }, "peerDependencies": { "solid-js": "^1.8.8" } }, "sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w=="], + + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg=="], + + "@netlify/functions": ["@netlify/functions@2.8.2", "", { "dependencies": { "@netlify/serverless-functions-api": "1.26.1" } }, "sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA=="], + + "@netlify/node-cookies": ["@netlify/node-cookies@0.1.0", "", {}, "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g=="], + + "@netlify/serverless-functions-api": ["@netlify/serverless-functions-api@1.26.1", "", { "dependencies": { "@netlify/node-cookies": "^0.1.0", "urlpattern-polyfill": "8.0.2" } }, "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.1", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5" } }, "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@redocly/ajv": ["@redocly/ajv@8.11.2", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js-replace": "^1.0.1" } }, "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg=="], + + "@redocly/config": ["@redocly/config@0.20.3", "", {}, "sha512-Nyyv1Bj7GgYwj/l46O0nkH1GTKWbO3Ixe7KFcn021aZipkZd+z8Vlu1BwkhqtVgivcKaClaExtWU/lDHkjBzag=="], + + "@redocly/openapi-core": ["@redocly/openapi-core@1.28.0", "", { "dependencies": { "@redocly/ajv": "^8.11.2", "@redocly/config": "^0.20.1", "colorette": "^1.2.0", "https-proxy-agent": "^7.0.5", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", "minimatch": "^5.0.1", "pluralize": "^8.0.0", "yaml-ast-parser": "0.0.43" } }, "sha512-jnUsOFnz8w71l14Ww34Iswlj0AI4e/R0C5+K2W4v4GaY/sUkpH/145gHLJYlG4XV0neET4lNIptd4I8+yLyEHQ=="], + + "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" } }, "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw=="], + + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], + + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@15.3.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" } }, "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA=="], + + "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ=="], + + "@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" } }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "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" } }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.1", "", { "os": "android", "cpu": "arm" }, "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.1", "", { "os": "android", "cpu": "arm64" }, "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.32.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.32.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.32.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.32.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.32.1", "", { "os": "linux", "cpu": "arm" }, "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.32.1", "", { "os": "linux", "cpu": "arm" }, "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.32.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.32.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.32.1", "", { "os": "linux", "cpu": "none" }, "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.32.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.32.1", "", { "os": "linux", "cpu": "none" }, "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.32.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.32.1", "", { "os": "linux", "cpu": "x64" }, "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.32.1", "", { "os": "linux", "cpu": "x64" }, "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.32.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.32.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.1", "", { "os": "win32", "cpu": "x64" }, "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], + + "@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-TSfR1PNTfojFEYGSxSMCnUhXsaYWBo4p+cm73QmWODa9YnaQAk6PB7VjzG2bOT2D817VlvuOqTj0Qdq+MZrdGg=="], + + "@solid-primitives/keyed": ["@solid-primitives/keyed@1.5.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-g04CXywgWG/7L4sTxQP6q1gdiirItVBq6ZO9YuLTqPFlkX3uD4IEjeL9cLHP6waahrnO8yL3OZl64pcKGYN5Qw=="], + + "@solid-primitives/map": ["@solid-primitives/map@0.4.13", "", { "dependencies": { "@solid-primitives/trigger": "^1.1.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew=="], + + "@solid-primitives/media": ["@solid-primitives/media@2.3.0", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.0", "@solid-primitives/rootless": "^1.5.0", "@solid-primitives/static-store": "^0.1.0", "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-7+C3wfbWnGE/WPoNsqcp/EeOP2aNNB92RCpsWhBth8E5lZo/J+rK6jMb7umVsK0zguT8HBpeXp1pFyFbcsHStA=="], + + "@solid-primitives/memo": ["@solid-primitives/memo@1.4.0", "", { "dependencies": { "@solid-primitives/scheduled": "^1.5.0", "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-Q0eSnGnhzbUPUNES2OOcEj6qF/9YZntoq04nmQEAIp6QhKdpAsH9mNFrVQtB1by41H/QndNui7Yd2wjI7PUpPA=="], + + "@solid-primitives/mouse": ["@solid-primitives/mouse@2.1.0", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.0", "@solid-primitives/rootless": "^1.5.0", "@solid-primitives/static-store": "^0.1.0", "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-ivQG2Lvffwzka+hqW0Z5ClJ61+KFlZ3tvsUGOKPyEshowHyA6zKh9D1WRKXyviFETgJescLw+zLM386/ZbA2Aw=="], + + "@solid-primitives/props": ["@solid-primitives/props@3.2.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-vEg5yERdXftJz2+A6B0IMYTrPL9SE2DPmpURV/nZyqQ+PXziF02V4b4SDr6JX3jNJxBlY6c17LqwYEw+bIfGRg=="], + + "@solid-primitives/refs": ["@solid-primitives/refs@1.1.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-QJ3bTSQOlPdHBP2m6llrT13FvVzAwZfx41lTN8lQrRwwcZoWb7kfCAjhaohPnwkAsQ6nJpLjtGfT5GOyuCA4tA=="], + + "@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.0", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.0", "@solid-primitives/rootless": "^1.5.0", "@solid-primitives/static-store": "^0.1.0", "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-tO9MDAc2pNjpcRd5B8LWbiR1qzIgvGZ5BtTuO98N7CLwd+fnuyGwtlQtJpz5hcLcTnoawpQYLpiRGNgaYW+YzQ=="], + + "@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-YJ+EveQeDv9DLqfDKfsPAAGy2x3vBruoD23yn+nD2dT84QjoBxWT1T0qA0TMFjek6/xuN3flqnHtQ4r++4zdjg=="], + + "@solid-primitives/scheduled": ["@solid-primitives/scheduled@1.5.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-RVw24IRNh1FQ4DCMb3OahB70tXIwc5vH8nhR4nNPsXwUPQeuOkLsDI5BlxaPk0vyZgqw9lDpufgI3HnPwplgDw=="], + + "@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-6Coau0Kv/dF83UQpbBzc+gnJafOQAPe2jCbB4jmTK5UocsR5cWmFBVRm3kin+nZFVaO4WkuELw0cKANWgTVh8Q=="], + + "@solid-primitives/trigger": ["@solid-primitives/trigger@1.2.0", "", { "dependencies": { "@solid-primitives/utils": "^6.3.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-sW4/3cDXSjYQampn8CIFZ11BlxgNf2li8r2fXnb3b3YWE6RdZZCl8PhvpPF38Gzl0CnryrbTPJWM7OIkseCDgQ=="], + + "@solid-primitives/utils": ["@solid-primitives/utils@6.3.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-e7hTlJ1Ywh2+g/Qug+n4L1mpfxsikoIS4/sHE2EK9WatQt8UJqop/vE6bsLnXlU1xuhb/jo94Ah5Y27rd4wP7A=="], + + "@solid-primitives/websocket": ["@solid-primitives/websocket@1.3.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-+yzaneoVUEqiYuX79BDvvWCP6FJ4bkEdV9w3GezJfXM0+W4KC4aRKPDjs7MQbJZoDR5JxS3eO7/w5wujFItF3Q=="], + + "@solidjs/router": ["@solidjs/router@0.14.10", "", { "peerDependencies": { "solid-js": "^1.8.6" } }, "sha512-5B8LVgvvXijfXyXWPVLUm7RQ05BhjIpAyRkYVDZtrR3OaSvftXobWc6qSEwk4ICLoGi/IE9CUp2LUdCBIs9AXg=="], + + "@solidjs/start": ["@solidjs/start@1.0.11", "", { "dependencies": { "@vinxi/plugin-directives": "^0.4.3", "@vinxi/server-components": "^0.4.3", "@vinxi/server-functions": "^0.4.3", "defu": "^6.1.2", "error-stack-parser": "^2.1.4", "html-to-image": "^1.11.11", "radix3": "^1.1.0", "seroval": "^1.0.2", "seroval-plugins": "^1.0.2", "shikiji": "^0.9.12", "source-map-js": "^1.0.2", "terracotta": "^1.0.4", "tinyglobby": "^0.2.2", "vite-plugin-solid": "^2.11.0" } }, "sha512-ZkrHtwxnmaVGItah13BtmST6rh3PtATcj0RyXM19Shj6MK/cIpDBBsDTsgwqCbZoa/AT8/JLM5xUHFjQyBjRCA=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + + "@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/http-proxy": ["@types/http-proxy@1.17.15", "", { "dependencies": { "@types/node": "*" } }, "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ=="], + + "@types/micromatch": ["@types/micromatch@4.0.9", "", { "dependencies": { "@types/braces": "*" } }, "sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg=="], + + "@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@vercel/nft": ["@vercel/nft@0.27.10", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0-rc.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg=="], + + "@vinxi/listhen": ["@vinxi/listhen@1.5.6", "", { "dependencies": { "@parcel/watcher": "^2.3.0", "@parcel/watcher-wasm": "2.3.0", "citty": "^0.1.5", "clipboardy": "^4.0.0", "consola": "^3.2.3", "defu": "^6.1.4", "get-port-please": "^3.1.2", "h3": "^1.10.0", "http-shutdown": "^1.2.2", "jiti": "^1.21.0", "mlly": "^1.5.0", "node-forge": "^1.3.1", "pathe": "^1.1.2", "std-env": "^3.7.0", "ufo": "^1.3.2", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw=="], + + "@vinxi/plugin-directives": ["@vinxi/plugin-directives@0.4.3", "", { "dependencies": { "@babel/parser": "^7.23.5", "acorn": "^8.10.0", "acorn-jsx": "^5.3.2", "acorn-loose": "^8.3.0", "acorn-typescript": "^1.4.3", "astring": "^1.8.6", "magicast": "^0.2.10", "recast": "^0.23.4", "tslib": "^2.6.2" }, "peerDependencies": { "vinxi": "^0.4.3" } }, "sha512-Ey+TRIwyk8871PKhQel8NyZ9B6N0Tvhjo1QIttTyrV0d7BfUpri5GyGygmBY7fHClSE/vqaNCCZIKpTL3NJAEg=="], + + "@vinxi/server-components": ["@vinxi/server-components@0.4.3", "", { "dependencies": { "@vinxi/plugin-directives": "0.4.3", "acorn": "^8.10.0", "acorn-loose": "^8.3.0", "acorn-typescript": "^1.4.3", "astring": "^1.8.6", "magicast": "^0.2.10", "recast": "^0.23.4" }, "peerDependencies": { "vinxi": "^0.4.3" } }, "sha512-KVEnQtb+ZlXIEKaUw4r4WZl/rqFeZqSyIRklY1wFiPw7GCJUxbXzISpsJ+HwDhYi9k4n8uZJyQyLHGkoiEiolg=="], + + "@vinxi/server-functions": ["@vinxi/server-functions@0.4.3", "", { "dependencies": { "@vinxi/plugin-directives": "0.4.3", "acorn": "^8.10.0", "acorn-loose": "^8.3.0", "acorn-typescript": "^1.4.3", "astring": "^1.8.6", "magicast": "^0.2.10", "recast": "^0.23.4" }, "peerDependencies": { "vinxi": "^0.4.3" } }, "sha512-kVYrOrCMHwGvHRwpaeW2/PE7URcGtz4Rk/hIHa2xjt5PGopzzB/Y5GC8YgZjtqSRqo0ElAKsEik7UE6CXH3HXA=="], + + "@vitest/expect": ["@vitest/expect@3.0.4", "", { "dependencies": { "@vitest/spy": "3.0.4", "@vitest/utils": "3.0.4", "chai": "^5.1.2", "tinyrainbow": "^2.0.0" } }, "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg=="], + + "@vitest/mocker": ["@vitest/mocker@3.0.4", "", { "dependencies": { "@vitest/spy": "3.0.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw"] }, "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@3.0.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g=="], + + "@vitest/runner": ["@vitest/runner@3.0.4", "", { "dependencies": { "@vitest/utils": "3.0.4", "pathe": "^2.0.2" } }, "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw=="], + + "@vitest/snapshot": ["@vitest/snapshot@3.0.4", "", { "dependencies": { "@vitest/pretty-format": "3.0.4", "magic-string": "^0.30.17", "pathe": "^2.0.2" } }, "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w=="], + + "@vitest/spy": ["@vitest/spy@3.0.4", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q=="], + + "@vitest/utils": ["@vitest/utils@3.0.4", "", { "dependencies": { "@vitest/pretty-format": "3.0.4", "loupe": "^3.1.2", "tinyrainbow": "^2.0.0" } }, "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ=="], + + "abbrev": ["abbrev@3.0.0", "", {}, "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-loose": ["acorn-loose@8.4.0", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ=="], + + "acorn-typescript": ["acorn-typescript@1.4.13", "", { "peerDependencies": { "acorn": ">=8.9.0" } }, "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q=="], + + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "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-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], + + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "astring": ["astring@1.9.0", "", { "bin": "bin/astring" }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], + + "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], + + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.39.6", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-HMkTn5A3NyydEgG7HKmm48YcnsQQyqeT6SKNWh2TrS6nn5rOLeHDfg5hPbrRUCFUqaT9WGn5NInQfMc3qne3Dg=="], + + "babel-plugin-transform-import-paths": ["babel-plugin-transform-import-paths@1.0.3", "", { "dependencies": { "slash": "^3.0.0" } }, "sha512-scDmJ3c0VvP4eREOVqv03XoeiN6NnEc57zbM2WycyjMVG07YrJ2qWWYjP8hALoFFJaYW9AZ1T/nUnYq5SgeZOA=="], + + "babel-preset-solid": ["babel-preset-solid@1.9.3", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.39.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "boxen": ["boxen@7.1.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": "cli.js" }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "c12": ["c12@2.0.1", "", { "dependencies": { "chokidar": "^4.0.1", "confbox": "^0.1.7", "defu": "^6.1.4", "dotenv": "^16.4.5", "giget": "^1.2.3", "jiti": "^2.3.0", "mlly": "^1.7.1", "ohash": "^1.1.4", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.2.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" } }, "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001696", "", {}, "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ=="], + + "chai": ["chai@5.1.2", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw=="], + + "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], + + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "clipboardy": ["clipboardy@4.0.0", "", { "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", "is64bit": "^2.0.0" } }, "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "compatx": ["compatx@0.1.8", "", {}, "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw=="], + + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], + + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], + + "croner": ["croner@9.0.0", "", {}, "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA=="], + + "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.2.4", "", { "peerDependencies": { "uWebSockets.js": "*" }, "optionalPeers": ["uWebSockets.js"] }, "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "dax-sh": ["dax-sh@0.39.2", "", { "dependencies": { "@deno/shim-deno": "~0.19.0", "undici-types": "^5.26" } }, "sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ=="], + + "db0": ["db0@0.2.3", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-PunuHESDNefmwVy1LDpY663uWwKt2ogLGoB6NOz2sflGREWqDreMwDgF8gfkXxgNXW+dqviyiJGm924H1BaGiw=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destr": ["destr@2.0.3", "", {}, "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": "bin/detect-libc.js" }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], + + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.90", "", {}, "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + + "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + + "esbuild": ["esbuild@0.20.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.20.2", "@esbuild/android-arm": "0.20.2", "@esbuild/android-arm64": "0.20.2", "@esbuild/android-x64": "0.20.2", "@esbuild/darwin-arm64": "0.20.2", "@esbuild/darwin-x64": "0.20.2", "@esbuild/freebsd-arm64": "0.20.2", "@esbuild/freebsd-x64": "0.20.2", "@esbuild/linux-arm": "0.20.2", "@esbuild/linux-arm64": "0.20.2", "@esbuild/linux-ia32": "0.20.2", "@esbuild/linux-loong64": "0.20.2", "@esbuild/linux-mips64el": "0.20.2", "@esbuild/linux-ppc64": "0.20.2", "@esbuild/linux-riscv64": "0.20.2", "@esbuild/linux-s390x": "0.20.2", "@esbuild/linux-x64": "0.20.2", "@esbuild/netbsd-x64": "0.20.2", "@esbuild/openbsd-x64": "0.20.2", "@esbuild/sunos-x64": "0.20.2", "@esbuild/win32-arm64": "0.20.2", "@esbuild/win32-ia32": "0.20.2", "@esbuild/win32-x64": "0.20.2" }, "bin": "bin/esbuild" }, "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "expect-type": ["expect-type@1.1.0", "", {}, "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "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=="], + + "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-port-please": ["get-port-please@3.1.2", "", {}, "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="], + + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "giget": ["giget@1.2.4", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.5.1", "ohash": "^1.1.4", "pathe": "^2.0.2", "tar": "^6.2.1" }, "bin": "dist/cli.mjs" }, "sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA=="], + + "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-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "globby": ["globby@14.0.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.1.0" } }, "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], + + "h3": ["h3@1.14.0", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.2", "defu": "^6.1.4", "destr": "^2.0.3", "iron-webcrypto": "^1.2.1", "ohash": "^1.1.4", "radix3": "^1.1.2", "ufo": "^1.5.4", "uncrypto": "^0.1.3", "unenv": "^1.10.0" } }, "sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + + "html-to-image": ["html-to-image@1.11.11", "", {}, "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], + + "http-shutdown": ["http-shutdown@1.2.2", "", {}, "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "httpxy": ["httpxy@0.1.7", "", {}, "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ=="], + + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immer": ["immer@10.1.1", "", {}, "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw=="], + + "index-to-position": ["index-to-position@0.1.2", "", {}, "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ioredis": ["ioredis@5.4.2", "", { "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": "cli.js" }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "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": "cli.js" }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jiti": ["jiti@2.4.2", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], + + "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="], + + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], + + "listhen": ["listhen@1.9.0", "", { "dependencies": { "@parcel/watcher": "^2.4.1", "@parcel/watcher-wasm": "^2.4.1", "citty": "^0.1.6", "clipboardy": "^4.0.0", "consola": "^3.2.3", "crossws": ">=0.2.0 <0.4.0", "defu": "^6.1.4", "get-port-please": "^3.1.2", "h3": "^1.12.0", "http-shutdown": "^1.2.2", "jiti": "^2.1.2", "mlly": "^1.7.1", "node-forge": "^1.3.1", "pathe": "^1.1.2", "std-env": "^3.7.0", "ufo": "^1.5.4", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg=="], + + "local-pkg": ["local-pkg@1.0.0", "", { "dependencies": { "mlly": "^1.7.3", "pkg-types": "^1.3.0" } }, "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], + + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], + + "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "magicast": ["magicast@0.2.11", "", { "dependencies": { "@babel/parser": "^7.22.16", "@babel/types": "^7.22.17", "recast": "^0.23.4" } }, "sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g=="], + + "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@4.0.6", "", { "bin": "bin/cli.js" }, "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.1", "", { "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" } }, "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": "dist/cjs/src/bin.js" }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": "bin/nanoid.cjs" }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "nitropack": ["nitropack@2.10.4", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.3.4", "@netlify/functions": "^2.8.2", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.1", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.3.0", "@rollup/plugin-replace": "^6.0.1", "@rollup/plugin-terser": "^0.4.4", "@rollup/pluginutils": "^5.1.3", "@types/http-proxy": "^1.17.15", "@vercel/nft": "^0.27.5", "archiver": "^7.0.1", "c12": "2.0.1", "chokidar": "^3.6.0", "citty": "^0.1.6", "compatx": "^0.1.8", "confbox": "^0.1.8", "consola": "^3.2.3", "cookie-es": "^1.2.2", "croner": "^9.0.0", "crossws": "^0.3.1", "db0": "^0.2.1", "defu": "^6.1.4", "destr": "^2.0.3", "dot-prop": "^9.0.0", "esbuild": "^0.24.0", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "fs-extra": "^11.2.0", "globby": "^14.0.2", "gzip-size": "^7.0.0", "h3": "^1.13.0", "hookable": "^5.5.3", "httpxy": "^0.1.5", "ioredis": "^5.4.1", "jiti": "^2.4.0", "klona": "^2.0.6", "knitwork": "^1.1.0", "listhen": "^1.9.0", "magic-string": "^0.30.12", "magicast": "^0.3.5", "mime": "^4.0.4", "mlly": "^1.7.2", "node-fetch-native": "^1.6.4", "ofetch": "^1.4.1", "ohash": "^1.1.4", "openapi-typescript": "^7.4.2", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.2.1", "pretty-bytes": "^6.1.1", "radix3": "^1.1.2", "rollup": "^4.24.3", "rollup-plugin-visualizer": "^5.12.0", "scule": "^1.3.0", "semver": "^7.6.3", "serve-placeholder": "^2.0.2", "serve-static": "^1.16.2", "std-env": "^3.7.0", "ufo": "^1.5.4", "uncrypto": "^0.1.3", "unctx": "^2.3.1", "unenv": "^1.10.0", "unimport": "^3.13.1", "unstorage": "^1.13.1", "untyped": "^1.5.1", "unwasm": "^0.3.9" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "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.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": "bin/nopt.js" }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "nypm": ["nypm@0.5.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.2", "pkg-types": "^1.3.1", "tinyexec": "^0.3.2", "ufo": "^1.5.4" }, "bin": "dist/cli.mjs" }, "sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "ohash": ["ohash@1.1.4", "", {}, "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "openapi-typescript": ["openapi-typescript@7.6.0", "", { "dependencies": { "@redocly/openapi-core": "^1.27.2", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.1.0", "supports-color": "^9.4.0", "yargs-parser": "^21.1.1" }, "peerDependencies": { "typescript": "^5.x" }, "bin": "bin/cli.js" }, "sha512-p/xxKcWFR7aZDOAdnqYBQ1NdNyWdine+gHKHKvjxGXmlq8JT1G9+SkY8I5csKaktLHMbDDH6ZDeWQpydwBHa+Q=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parse-json": ["parse-json@8.1.0", "", { "dependencies": { "@babel/code-frame": "^7.22.13", "index-to-position": "^0.1.2", "type-fest": "^4.7.1" } }, "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA=="], + + "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "path-type": ["path-type@5.0.0", "", {}, "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg=="], + + "pathe": ["pathe@2.0.2", "", {}, "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w=="], + + "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + + "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], + + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "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=="], + + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "recast": ["recast@0.23.9", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q=="], + + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], + + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rimraf": ["rimraf@5.0.10", "", { "dependencies": { "glob": "^10.3.7" }, "bin": "dist/esm/bin.mjs" }, "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ=="], + + "rollup": ["rollup@4.32.1", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.32.1", "@rollup/rollup-android-arm64": "4.32.1", "@rollup/rollup-darwin-arm64": "4.32.1", "@rollup/rollup-darwin-x64": "4.32.1", "@rollup/rollup-freebsd-arm64": "4.32.1", "@rollup/rollup-freebsd-x64": "4.32.1", "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", "@rollup/rollup-linux-arm-musleabihf": "4.32.1", "@rollup/rollup-linux-arm64-gnu": "4.32.1", "@rollup/rollup-linux-arm64-musl": "4.32.1", "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", "@rollup/rollup-linux-riscv64-gnu": "4.32.1", "@rollup/rollup-linux-s390x-gnu": "4.32.1", "@rollup/rollup-linux-x64-gnu": "4.32.1", "@rollup/rollup-linux-x64-musl": "4.32.1", "@rollup/rollup-win32-arm64-msvc": "4.32.1", "@rollup/rollup-win32-ia32-msvc": "4.32.1", "@rollup/rollup-win32-x64-msvc": "4.32.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA=="], + + "rollup-plugin-visualizer": ["rollup-plugin-visualizer@5.14.0", "", { "dependencies": { "open": "^8.4.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rolldown": "1.x", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown"], "bin": "dist/bin/cli.js" }, "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "seroval": ["seroval@1.2.0", "", {}, "sha512-GURoU99ko2UiAgUC3qDCk59Jb3Ss4Po8VIMGkG8j5PFo2Q7y0YSMP8QG9NuL/fJCoTz9V1XZUbpNIMXPOfaGpA=="], + + "seroval-plugins": ["seroval-plugins@1.2.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-hULTbfzSe81jGWLH8TAJjkEvw6JWMqOo9Uq+4V4vg+HNq53hyHldM9ZOfjdzokcFysiTp9aFdV2vJpZFqKeDjQ=="], + + "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "^6.1.4" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shikiji": ["shikiji@0.9.19", "", { "dependencies": { "shikiji-core": "0.9.19" } }, "sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg=="], + + "shikiji-core": ["shikiji-core@0.9.19", "", {}, "sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "smob": ["smob@1.5.0", "", {}, "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="], + + "solid-events": ["solid-events@0.0.5", "", { "dependencies": { "@solidjs/router": "^0.14.8", "rxjs": "^7.8.1", "solid-js": "^1.9.2" } }, "sha512-K3HEVig3S/3nhImqG52S9xi4BakIOj19RkFgGAhOl+V53WIJ10nr9XbqnmFQ3L9Ovm1zhxU/T8Xzuyff0LfwEw=="], + + "solid-icons": ["solid-icons@1.1.0", "", { "peerDependencies": { "solid-js": "*" } }, "sha512-IesTfr/F1ElVwH2E1110s2RPXH4pujKfSs+koT8rwuTAdleO5s26lNSpqJV7D1+QHooJj18mcOiz2PIKs0ic+A=="], + + "solid-js": ["solid-js@1.9.4", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", "seroval-plugins": "^1.1.0" } }, "sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g=="], + + "solid-presence": ["solid-presence@0.1.8", "", { "dependencies": { "@corvu/utils": "~0.4.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA=="], + + "solid-prevent-scroll": ["solid-prevent-scroll@0.1.10", "", { "dependencies": { "@corvu/utils": "~0.4.1" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw=="], + + "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], + + "solid-use": ["solid-use@0.9.0", "", { "peerDependencies": { "solid-js": "^1.7" } }, "sha512-8TGwB4m3qQ7qKo8Lg0pi/ZyyGVmQIjC4sPyxRCH7VPds0BzSsT734PhP3jhR6zMJxoYHM+uoivjq0XdpzXeOJg=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "std-env": ["std-env@3.8.0", "", {}, "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w=="], + + "streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="], + + "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=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "strip-literal": ["strip-literal@2.1.1", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q=="], + + "supports-color": ["supports-color@9.4.0", "", {}, "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + + "terracotta": ["terracotta@1.0.6", "", { "dependencies": { "solid-use": "^0.9.0" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-yVrmT/Lg6a3tEbeYEJH8ksb1PYkR5FA9k5gr1TchaSNIiA2ZWs5a+koEbePXwlBP0poaV7xViZ/v50bQFcMgqw=="], + + "terser": ["terser@5.37.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": "bin/terser" }, "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.10", "", { "dependencies": { "fdir": "^6.4.2", "picomatch": "^4.0.2" } }, "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew=="], + + "tinypool": ["tinypool@1.0.2", "", {}, "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA=="], + + "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "unctx": ["unctx@2.4.1", "", { "dependencies": { "acorn": "^8.14.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "unplugin": "^2.1.0" } }, "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "unenv": ["unenv@1.10.0", "", { "dependencies": { "consola": "^3.2.3", "defu": "^6.1.4", "mime": "^3.0.0", "node-fetch-native": "^1.6.4", "pathe": "^1.1.2" } }, "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ=="], + + "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + + "unimport": ["unimport@3.14.6", "", { "dependencies": { "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "fast-glob": "^3.3.3", "local-pkg": "^1.0.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.1", "picomatch": "^4.0.2", "pkg-types": "^1.3.0", "scule": "^1.3.0", "strip-literal": "^2.1.1", "unplugin": "^1.16.1" } }, "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g=="], + + "unique-names-generator": ["unique-names-generator@4.7.1", "", {}, "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unplugin": ["unplugin@2.1.2", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw=="], + + "unstorage": ["unstorage@1.10.2", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^3.6.0", "destr": "^2.0.3", "h3": "^1.11.1", "listhen": "^1.7.2", "lru-cache": "^10.2.0", "mri": "^1.2.0", "node-fetch-native": "^1.6.2", "ofetch": "^1.3.3", "ufo": "^1.4.0" }, "peerDependencies": { "@azure/app-configuration": "^1.5.0", "@azure/cosmos": "^4.0.0", "@azure/data-tables": "^13.2.2", "@azure/identity": "^4.0.1", "@azure/keyvault-secrets": "^4.8.0", "@azure/storage-blob": "^12.17.0", "@capacitor/preferences": "^5.0.7", "@netlify/blobs": "^6.5.0 || ^7.0.0", "@planetscale/database": "^1.16.0", "@upstash/redis": "^1.28.4", "@vercel/kv": "^1.0.1", "idb-keyval": "^6.2.1", "ioredis": "^5.3.2" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/kv", "idb-keyval"] }, "sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ=="], + + "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, "bin": "bin/untun.mjs" }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], + + "untyped": ["untyped@1.5.2", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/standalone": "^7.26.4", "@babel/types": "^7.26.3", "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.1", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": "dist/cli.mjs" }, "sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg=="], + + "unwasm": ["unwasm@0.3.9", "", { "dependencies": { "knitwork": "^1.0.0", "magic-string": "^0.30.8", "mlly": "^1.6.1", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "unplugin": "^1.10.0" } }, "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], + + "uqr": ["uqr@0.1.2", "", {}, "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="], + + "uri-js-replace": ["uri-js-replace@1.0.1", "", {}, "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="], + + "urlpattern-polyfill": ["urlpattern-polyfill@8.0.2", "", {}, "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "validate-html-nesting": ["validate-html-nesting@1.2.2", "", {}, "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg=="], + + "vinxi": ["vinxi@0.4.3", "", { "dependencies": { "@babel/core": "^7.22.11", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5", "@types/micromatch": "^4.0.2", "@vinxi/listhen": "^1.5.6", "boxen": "^7.1.1", "chokidar": "^3.5.3", "citty": "^0.1.4", "consola": "^3.2.3", "crossws": "^0.2.4", "dax-sh": "^0.39.1", "defu": "^6.1.2", "es-module-lexer": "^1.3.0", "esbuild": "^0.20.2", "fast-glob": "^3.3.1", "get-port-please": "^3.1.1", "h3": "1.11.1", "hookable": "^5.5.3", "http-proxy": "^1.18.1", "micromatch": "^4.0.5", "nitropack": "^2.9.1", "node-fetch-native": "^1.4.0", "path-to-regexp": "^6.2.1", "pathe": "^1.1.1", "radix3": "^1.1.0", "resolve": "^1.22.6", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "ufo": "^1.3.0", "unctx": "^2.3.1", "unenv": "^1.9.0", "unstorage": "^1.10.1", "vite": "^5.2.8", "zod": "^3.22.2" }, "bin": { "vinxi": "bin/cli.mjs" } }, "sha512-RgJz7RWftML5h/qfPsp3QKVc2FSlvV4+HevpE0yEY2j+PS/I2ULjoSsZDXaR8Ks2WYuFFDzQr8yrox7v8aqkng=="], + + "vite": ["vite@6.0.11", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "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": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg=="], + + "vite-node": ["vite-node@3.0.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.2", "vite": "^5.0.0 || ^6.0.0" }, "bin": "vite-node.mjs" }, "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA=="], + + "vite-plugin-babel": ["vite-plugin-babel@1.3.0", "", { "peerDependencies": { "@babel/core": "^7.0.0", "vite": "^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-C5WKX0UwvQKH8WD2GiyWUjI62UBfLbfUhiLexnIm4asLdENX5ymrRipFlBnGeVxoOaYgTL5dh5KW6YDGpWsR8A=="], + + "vite-plugin-solid": ["vite-plugin-solid@2.11.0", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw=="], + + "vitefu": ["vitefu@1.0.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA=="], + + "vitest": ["vitest@3.0.4", "", { "dependencies": { "@vitest/expect": "3.0.4", "@vitest/mocker": "3.0.4", "@vitest/pretty-format": "^3.0.4", "@vitest/runner": "3.0.4", "@vitest/snapshot": "3.0.4", "@vitest/spy": "3.0.4", "@vitest/utils": "3.0.4", "chai": "^5.1.2", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", "pathe": "^2.0.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.0.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.0.4", "@vitest/ui": "3.0.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": "vitest.mjs" }, "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": "cli.js" }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], + + "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=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml-ast-parser": ["yaml-ast-parser@0.0.43", "", {}, "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], + + "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": "cli.js" }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "@mapbox/node-pre-gyp/detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "@mapbox/node-pre-gyp/semver": ["semver@7.7.0", "", { "bin": "bin/semver.js" }, "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ=="], + + "@redocly/openapi-core/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@rollup/plugin-inject/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vinxi/listhen/@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.3.0", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5" } }, "sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA=="], + + "@vinxi/listhen/jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "@vinxi/listhen/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "archiver-utils/glob": ["glob@10.4.5", "", { "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": "dist/esm/bin.mjs" }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "c12/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "c12/magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + + "c12/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "dax-sh/undici-types": ["undici-types@5.28.4", "", {}, "sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww=="], + + "dot-prop/type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "giget/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "globby/slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], + + "h3/crossws": ["crossws@0.3.3", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": "cli.js" }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "listhen/crossws": ["crossws@0.3.3", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw=="], + + "listhen/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "nitropack/crossws": ["crossws@0.3.3", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw=="], + + "nitropack/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": "bin/esbuild" }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "nitropack/magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + + "nitropack/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "nitropack/semver": ["semver@7.7.0", "", { "bin": "bin/semver.js" }, "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ=="], + + "nitropack/unstorage": ["unstorage@1.14.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^3.6.0", "destr": "^2.0.3", "h3": "^1.13.0", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.4", "ofetch": "^1.4.1", "ufo": "^1.5.4" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.5.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3", "@deno/kv": ">=0.8.4", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.1" }, "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/kv", "aws4fetch", "idb-keyval", "uploadthing"] }, "sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "parse-json/type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="], + + "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "rimraf/glob": ["glob@10.4.5", "", { "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": "dist/esm/bin.mjs" }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "rollup-plugin-visualizer/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/mime": ["mime@1.6.0", "", { "bin": "cli.js" }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "unenv/mime": ["mime@3.0.0", "", { "bin": "cli.js" }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "unenv/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "unimport/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + + "untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "unwasm/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "unwasm/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + + "vinxi/h3": ["h3@1.11.1", "", { "dependencies": { "cookie-es": "^1.0.0", "crossws": "^0.2.2", "defu": "^6.1.4", "destr": "^2.0.3", "iron-webcrypto": "^1.0.0", "ohash": "^1.1.3", "radix3": "^1.1.0", "ufo": "^1.4.0", "uncrypto": "^0.1.3", "unenv": "^1.9.0" } }, "sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A=="], + + "vinxi/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "vinxi/unstorage": ["unstorage@1.14.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^3.6.0", "destr": "^2.0.3", "h3": "^1.13.0", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.4", "ofetch": "^1.4.1", "ufo": "^1.5.4" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.5.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3", "@deno/kv": ">=0.8.4", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.1" }, "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/kv", "aws4fetch", "idb-keyval", "uploadthing"] }, "sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg=="], + + "vinxi/vite": ["vite@5.4.14", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA=="], + + "vite/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": "bin/esbuild" }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@redocly/openapi-core/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "archiver-utils/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "c12/chokidar/readdirp": ["readdirp@4.1.1", "", {}, "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "fs-minipass/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "giget/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "giget/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "giget/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "giget/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": "bin/cmd.js" }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "giget/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "vinxi/unstorage/h3": ["h3@1.14.0", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.2", "defu": "^6.1.4", "destr": "^2.0.3", "iron-webcrypto": "^1.2.1", "ohash": "^1.1.4", "radix3": "^1.1.2", "ufo": "^1.5.4", "uncrypto": "^0.1.3", "unenv": "^1.10.0" } }, "sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg=="], + + "vinxi/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "giget/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "vinxi/unstorage/h3/crossws": ["crossws@0.3.3", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw=="], + + "vinxi/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vinxi/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vinxi/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vinxi/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vinxi/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vinxi/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vinxi/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vinxi/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vinxi/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vinxi/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vinxi/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vinxi/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vinxi/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vinxi/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vinxi/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vinxi/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vinxi/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vinxi/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vinxi/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vinxi/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vinxi/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vinxi/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vinxi/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + } +} diff --git a/socket/lib/client.tsx b/socket/lib/client.tsx index 336b3f8..9c1e2e8 100644 --- a/socket/lib/client.tsx +++ b/socket/lib/client.tsx @@ -33,67 +33,42 @@ function wsRpc(message: WsMessageUp) { const ws = getWs(); const id = crypto.randomUUID() as string; - return new Promise(async (res, rej) => { - function dispose() { - ws.removeEventListener("message", handler); - ws.send( - JSON.stringify({ - type: "dispose", - id, - } satisfies WsMessage) - ); - } - - function handler(event: { data: string }) { - // console.log(`handler ${id}`, message, { data: event.data }); - const data = JSON.parse(event.data) as WsMessage; - if (data.id === id && data.type === "value") { - res(data.value); - dispose(); + return new Promise<{ value: SerovalJSON; dispose: () => void }>( + async (res, rej) => { + function dispose() { + ws.removeEventListener("message", handler); + ws.send( + JSON.stringify({ + type: "dispose", + id, + } satisfies WsMessage) + ); } - if (data.id === id && data.type === "error") { - rej(data.error); - dispose(); + + function handler(event: { data: string }) { + // console.log(`handler ${id}`, message, { data: event.data }); + const data = JSON.parse(event.data) as WsMessage; + if (data.id === id && data.type === "value") { + res({ value: data.value, dispose }); + } + if (data.id === id && data.type === "error") { + rej(data.error); + } } - } - ws.addEventListener("message", handler); - ws.send( - JSON.stringify({ ...message, id } satisfies WsMessage) - ); - }); + ws.addEventListener("message", handler); + ws.send( + JSON.stringify({ ...message, id } satisfies WsMessage) + ); + } + ); } -// function wsSub(message: WsMessageUp) { -// const ws = getWs(); -// const id = crypto.randomUUID(); - -// return rxFrom( -// new Observable((obs) => { -// // console.log(`attaching sub handler`); -// function handler(event: { data: string }) { -// const data = JSON.parse(event.data) as WsMessage; -// // console.log(`data`, data, id); -// if (data.id === id && data.type === "value") obs.next(data.value); -// } - -// ws.addEventListener("message", handler); -// ws.send( -// JSON.stringify({ ...message, id } satisfies WsMessage) -// ); - -// return () => { -// // console.log(`detaching sub handler`); -// ws.removeEventListener("message", handler); -// }; -// }) -// ); -// } - function createSocketRefConsumer(ref: SerializedRef) { return async (...payload: I) => { const input = toJSON(payload); - const value = await wsRpc({ type: "invoke", ref, input }); + const { value, dispose } = await wsRpc({ type: "invoke", ref, input }); + dispose(); return fromJSON(value); }; } @@ -178,13 +153,14 @@ export function createEndpoint(name: string, rawInput?: any) { onCleanup(() => { // console.log(`cleanup endpoint`); ws.removeEventListener("message", refHandler); + scopePromise.then(({ dispose }) => dispose()); }); const scope = createAsync(() => scopePromise); const deserializedScope = createMemo( () => scope() && - deserializeReactivePayload(scope()!, { + deserializeReactivePayload(scope()!.value, { createSocketMemoConsumer, createSocketRefConsumer, createSocketProjectionConsumer, diff --git a/socket/lib/server.tsx b/socket/lib/server.tsx index 9d04358..7009266 100644 --- a/socket/lib/server.tsx +++ b/socket/lib/server.tsx @@ -20,7 +20,6 @@ import { SerializedMemo, SerializedProjection, SerializedRef, - SerializedStream, WsMessage, WsMessageDown, WsMessageUp, @@ -69,7 +68,6 @@ export class LiveSolidServer { constructor(public peer: Peer) {} send(message: WsMessage) { - // console.log(`send`, message); this.peer.send(JSON.stringify(message)); } @@ -78,10 +76,6 @@ export class LiveSolidServer { this.create(message.id, message.name, message.input); } - // if (message.type === "subscribe") { - // this.subscribe(message.id, message.ref); - // } - if (message.type === "dispose") { this.dispose(message.id); } @@ -141,6 +135,7 @@ export class LiveSolidServer { return { refs, disposal }; }); this.closures.set(id, { refs, disposal }); + console.log({ id, refs, cl: this.closures }); } catch (error) { this.send({ error: toJSON(error), id, type: "error" }); } @@ -148,7 +143,9 @@ export class LiveSolidServer { async invoke(id: string, ref: SerializedRef, input: SerovalJSON) { try { - const refFn = this.closures.get(ref.scope)!.refs!.get(ref.id)!; + const c = this.closures.get(ref.scope); + console.log({ ref, c, cl: this.closures }); + const refFn = c!.refs!.get(ref.id)!; const fnInput = fromJSON(input); const arified = Array.isArray(fnInput) ? fnInput : [fnInput]; const response = await refFn(...arified); @@ -167,24 +164,8 @@ export class LiveSolidServer { } } - // subscribe(id: string, ref: SerializedReactiveThing) { - // const source = this.closures.get(ref.scope)!.refs!.get(ref.id)!; - - // const response$ = observable(() => source()); - - // const sub = response$.subscribe((payload) => { - // const value = toJSON(payload); - // this.send({ id, value, type: "value" }); - // }); - - // this.closures.set(id, { disposal: () => sub.unsubscribe() }); - // } - - stream(stream: SerializedStream) {} - cleanup() { for (const [key, closure] of this.closures.entries()) { - // console.log(`Disposing ${key}`); closure.disposal(); this.closures.delete(key); } @@ -216,7 +197,7 @@ function createSocketMemoConsumer( server: LiveSolidServer ) { const [signal, setSignal] = createSignal(ref.initial); - server.observers.set(ref.id, (value) => setSignal(() => fromJSON(value))); + server.observers.set(ref.id, (value) => setSignal(() => fromJSON(value))); onCleanup(() => server.observers.delete(ref.id)); return signal; } diff --git a/socket/lib/shared.tsx b/socket/lib/shared.tsx index 1f9def5..f8a3442 100644 --- a/socket/lib/shared.tsx +++ b/socket/lib/shared.tsx @@ -84,12 +84,6 @@ export type SerializedReactiveThing = export type SerializedThing = SerializedRef | SerializedReactiveThing; -export type SerializedStream = { - __type: "stream"; - id: string; - scope: string; -}; - export function createSeriazliedRef( opts: Omit ): SerializedRef { diff --git a/src/routes/index.tsx b/src/routes/index.tsx index ac51c62..a10db28 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,5 +1,5 @@ import { createAsync, type RouteSectionProps } from "@solidjs/router"; -import { Show } from "solid-js"; +import { ErrorBoundary, Show } from "solid-js"; import { Login, Logout } from "~/components/auth"; import { Invites } from "~/components/invites"; import { PresenceHost } from "~/components/presence"; @@ -8,15 +8,15 @@ import { getUserId } from "~/lib/auth"; import { useCounter } from "~/lib/counter"; export default function TodoAppPage(props: RouteSectionProps) { - const userId = createAsync(() => getUserId()); + // const userId = createAsync(() => getUserId()); const counter = useCounter(); return ( - <> + Something went wrong}> - <> @@ -52,7 +52,7 @@ export default function TodoAppPage(props: RouteSectionProps) { - - + */} + ); }