From 222b80618e410493370611ecd575012f5b573a99 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Fri, 29 Dec 2023 20:08:31 -0800 Subject: [PATCH 01/22] started adding solid js library --- lib/sqlsync-solid-js/index.html | 16 + lib/sqlsync-solid-js/package.json | 60 ++++ .../sqlsync-react-test-reducer/Cargo.toml | 14 + .../sqlsync-react-test-reducer/src/lib.rs | 53 +++ lib/sqlsync-solid-js/src/context.tsx | 38 +++ lib/sqlsync-solid-js/src/hooks.ts | 119 +++++++ lib/sqlsync-solid-js/src/index.ts | 10 + lib/sqlsync-solid-js/src/sql.ts | 42 +++ lib/sqlsync-solid-js/src/sqlsync.ts | 306 ++++++++++++++++++ lib/sqlsync-solid-js/src/util.ts | 63 ++++ lib/sqlsync-solid-js/test/react-sanity.html | 15 + lib/sqlsync-solid-js/test/react-sanity.tsx | 96 ++++++ lib/sqlsync-solid-js/tsconfig.json | 39 +++ lib/sqlsync-solid-js/tsconfig.node.json | 12 + lib/sqlsync-solid-js/vite.config.ts | 35 ++ pnpm-workspace.yaml | 1 + 16 files changed, 919 insertions(+) create mode 100644 lib/sqlsync-solid-js/index.html create mode 100644 lib/sqlsync-solid-js/package.json create mode 100644 lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml create mode 100644 lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs create mode 100644 lib/sqlsync-solid-js/src/context.tsx create mode 100644 lib/sqlsync-solid-js/src/hooks.ts create mode 100644 lib/sqlsync-solid-js/src/index.ts create mode 100644 lib/sqlsync-solid-js/src/sql.ts create mode 100644 lib/sqlsync-solid-js/src/sqlsync.ts create mode 100644 lib/sqlsync-solid-js/src/util.ts create mode 100644 lib/sqlsync-solid-js/test/react-sanity.html create mode 100644 lib/sqlsync-solid-js/test/react-sanity.tsx create mode 100644 lib/sqlsync-solid-js/tsconfig.json create mode 100644 lib/sqlsync-solid-js/tsconfig.node.json create mode 100644 lib/sqlsync-solid-js/vite.config.ts diff --git a/lib/sqlsync-solid-js/index.html b/lib/sqlsync-solid-js/index.html new file mode 100644 index 0000000..4fb2a86 --- /dev/null +++ b/lib/sqlsync-solid-js/index.html @@ -0,0 +1,16 @@ + + + + + + + sqlsync-react tests index + + + + + + + \ No newline at end of file diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json new file mode 100644 index 0000000..4e70f95 --- /dev/null +++ b/lib/sqlsync-solid-js/package.json @@ -0,0 +1,60 @@ +{ + "name": "@orbitinghail/sqlsync-react-solid-js", + "version": "0.2.0", + "description": "SQLSync is a collaborative offline-first wrapper around SQLite. It is designed to synchronize web application state between users, devices, and the edge.", + "homepage": "https://sqlsync.dev", + "license": "Apache-2.0", + "keywords": [ + "sqlsync", + "sql", + "database", + "sqlite", + "offline-first", + "local-first", + "solid-js" + ], + "repository": { + "type": "git", + "url": "https://github.com/orbitinghail/sqlsync" + }, + "files": [ + "dist", + "src" + ], + "type": "module", + "main": "./dist/sqlsync-react.js", + "types": "./src/index.ts", + "exports": { + ".": { + "import": "./dist/sqlsync-solid-js.js", + "require": "./dist/sqlsync-solid-js.umd.cjs", + "types": "./src/index.ts" + } + }, + "scripts": { + "dev": "vite", + "build": "tsc && vite build" + }, + "devDependencies": { + "@types/node": "^20.8.8", + "vite-plugin-solid": "^2.7.0", + "typescript": "^5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.1", + "vite-tsconfig-paths": "^4.2.1", + "vitest": "^0.34.6", + "@solidjs/testing-library": "^0.8.4", + "@testing-library/jest-dom": "^6.1.3" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "dependencies": { + "solid-js": "^1.8.7", + "@orbitinghail/sqlsync-worker": "workspace:^", + "@scure/base": "^1.1.3", + "fast-equals": "^5.0.1", + "fast-sha256": "^1.3.0" + } +} diff --git a/lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml b/lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml new file mode 100644 index 0000000..fd36407 --- /dev/null +++ b/lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "sqlsync-react-test-reducer" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +sqlsync-reducer = { path = "../../sqlsync-reducer" } +serde = { version = "1.0.171", features = ["derive"] } +serde_json = "1.0.105" +log = "0.4.20" +futures = "0.3.28" diff --git a/lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs b/lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs new file mode 100644 index 0000000..2dbcdfd --- /dev/null +++ b/lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs @@ -0,0 +1,53 @@ +// build: "cargo build --target wasm32-unknown-unknown -p counter-reducer" +use serde::{Deserialize, Serialize}; +use sqlsync_reducer::{execute, init_reducer, types::ReducerError}; + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "tag")] +enum Mutation { + InitSchema, + Incr { value: i32 }, + Decr { value: i32 }, +} + +init_reducer!(reducer); +async fn reducer(mutation: Vec) -> Result<(), ReducerError> { + let mutation: Mutation = serde_json::from_slice(&mutation[..])?; + + match mutation { + Mutation::InitSchema => { + let create_table = execute!( + "CREATE TABLE IF NOT EXISTS counter ( + id INTEGER PRIMARY KEY, + value INTEGER + )" + ); + let init_counter = execute!( + "INSERT OR IGNORE INTO counter (id, value) VALUES (0, 0)" + ); + + create_table.await?; + init_counter.await?; + } + + Mutation::Incr { value } => { + execute!( + "INSERT INTO counter (id, value) VALUES (0, 0) + ON CONFLICT (id) DO UPDATE SET value = value + ?", + value + ) + .await?; + } + + Mutation::Decr { value } => { + execute!( + "INSERT INTO counter (id, value) VALUES (0, 0) + ON CONFLICT (id) DO UPDATE SET value = value - ?", + value + ) + .await?; + } + } + + Ok(()) +} diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx new file mode 100644 index 0000000..116e58f --- /dev/null +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -0,0 +1,38 @@ +// import { ReactNode, createContext, useEffect, useState } from "react"; +import { + ParentComponent, + Show, + createContext, + createEffect, + createSignal, + onCleanup, +} from "solid-js"; +import { SQLSync } from "./sqlsync"; + +export const SQLSyncContext = createContext(null); + +interface Props { + workerUrl: string | URL; + wasmUrl: string | URL; + coordinatorUrl?: string | URL; +} + +export const SQLSyncProvider: ParentComponent = (props) => { + const [sqlsync, setSQLSync] = createSignal(null); + + createEffect(() => { + const sqlsync = new SQLSync(props.workerUrl, props.wasmUrl, props.coordinatorUrl); + setSQLSync(sqlsync); + onCleanup(() => { + sqlsync.close(); + }); + }); + + return ( + + {(sqlSync) => { + return {props.children}; + }} + + ); +}; diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts new file mode 100644 index 0000000..7932e8b --- /dev/null +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -0,0 +1,119 @@ +import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; +import { deepEqual } from "fast-equals"; +// import { useCallback, useContext, useEffect, useRef, useState } from "react"; +import { createContext, createMemo } from "solid-js"; +import { SQLSyncContext } from "./context"; +import { ParameterizedQuery, normalizeQuery } from "./sql"; +import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; +import { pendingPromise } from "./util"; + +export function useSQLSync(): SQLSync { + const value = createContext(SQLSyncContext); + if (import.meta.env.DEV && !value) { + throw new Error( + "could not find sqlsync context value; please ensure the component is wrapped in a " + ); + } + // biome-ignore lint/style/noNonNullAssertion: asserts in dev + return value!; +} + +type MutateFn = (mutation: M) => Promise; +type UseMutateFn = (docId: DocId) => MutateFn; + +type UseQueryFn = (docId: DocId, query: ParameterizedQuery | string) => QueryState; + +type SetConnectionEnabledFn = (enabled: boolean) => Promise; +type UseSetConnectionEnabledFn = (docId: DocId) => SetConnectionEnabledFn; + +export interface DocHooks { + useMutate: UseMutateFn; + useQuery: UseQueryFn; + useSetConnectionEnabled: UseSetConnectionEnabledFn; +} + +export function createDocHooks(docType: DocType): DocHooks { + const useMutate = (docId: DocId): MutateFn => { + const sqlsync = useSQLSync(); + return createMemo((mutation: M) => sqlsync.mutate(docId, docType, mutation)); + }; + + const useQueryWrapper = (docId: DocId, query: ParameterizedQuery | string) => { + return useQuery(docType, docId, query); + }; + + const useSetConnectionEnabledWrapper = (docId: DocId) => { + const sqlsync = useSQLSync(); + return useCallback( + (enabled: boolean) => sqlsync.setConnectionEnabled(docId, docType, enabled), + [sqlsync, docId, docType] + ); + }; + + return { + useMutate, + useQuery: useQueryWrapper, + useSetConnectionEnabled: useSetConnectionEnabledWrapper, + }; +} + +export type QueryState = + | { state: "pending"; rows?: R[] } + | { state: "success"; rows: R[] } + | { state: "error"; error: Error; rows?: R[] }; + +export function useQuery( + docType: DocType, + docId: DocId, + rawQuery: ParameterizedQuery | string +): QueryState { + const sqlsync = useSQLSync(); + const [state, setState] = useState>({ state: "pending" }); + + // memoize query based on deep equality + let query = normalizeQuery(rawQuery); + const queryRef = useRef(query); + if (!deepEqual(queryRef.current, query)) { + queryRef.current = query; + } + query = queryRef.current; + + useEffect(() => { + const [unsubPromise, unsubResolve] = pendingPromise<() => void>(); + + const subscription: QuerySubscription = { + handleRows: (rows: Row[]) => setState({ state: "success", rows: rows as R[] }), + handleErr: (err: string) => + setState((s) => ({ + state: "error", + error: new Error(err), + rows: s.rows, + })), + }; + + sqlsync + .subscribe(docId, docType, query, subscription) + .then(unsubResolve) + .catch((err: Error) => { + console.error("sqlsync: error subscribing", err); + setState({ state: "error", error: err }); + }); + + return () => { + unsubPromise + .then((unsub) => unsub()) + .catch((err) => { + console.error("sqlsync: error unsubscribing", err); + }); + }; + }, [sqlsync, docId, docType, query]); + + return state; +} + +export const useConnectionStatus = (): ConnectionStatus => { + const sqlsync = useSQLSync(); + const [status, setStatus] = useState(sqlsync.connectionStatus); + useEffect(() => sqlsync.addConnectionStatusListener(setStatus), [sqlsync]); + return status; +}; diff --git a/lib/sqlsync-solid-js/src/index.ts b/lib/sqlsync-solid-js/src/index.ts new file mode 100644 index 0000000..44ca817 --- /dev/null +++ b/lib/sqlsync-solid-js/src/index.ts @@ -0,0 +1,10 @@ +import { SQLSyncProvider } from "./context"; +import { createDocHooks, useConnectionStatus } from "./hooks"; +import { sql } from "./sql"; +import { DocType, Row } from "./sqlsync"; +import { serializeMutationAsJSON } from "./util"; + +export { SQLSyncProvider, createDocHooks, serializeMutationAsJSON, sql, useConnectionStatus }; +export type { DocType, Row }; + +// eof: this file only exports diff --git a/lib/sqlsync-solid-js/src/sql.ts b/lib/sqlsync-solid-js/src/sql.ts new file mode 100644 index 0000000..195d712 --- /dev/null +++ b/lib/sqlsync-solid-js/src/sql.ts @@ -0,0 +1,42 @@ +import { QueryKey, SqlValue } from "@orbitinghail/sqlsync-worker"; +import { base58 } from "@scure/base"; +import { sha256Digest } from "./util"; + +const UTF8_ENCODER = new TextEncoder(); + +export interface ParameterizedQuery { + sql: string; + params: SqlValue[]; +} + +export function normalizeQuery(query: ParameterizedQuery | string): ParameterizedQuery { + if (typeof query === "string") { + return { sql: query, params: [] }; + } + return query; +} + +/** + * Returns a parameterized query object with the given SQL string and parameters. + * This function should be used as a template literal tag. + * + * @example + * const query = sql`SELECT * FROM users WHERE id = ${userId}`; + * + * @param chunks - An array of string literals. + * @param params - An array of parameter values to be inserted into the SQL string. + * @returns A parameterized query object with the given SQL string and parameters. + */ +export function sql(chunks: readonly string[], ...params: SqlValue[]): ParameterizedQuery { + return { + sql: chunks.join("?"), + params, + }; +} + +export async function toQueryKey(query: ParameterizedQuery): Promise { + const queryJson = JSON.stringify([query.sql, query.params]); + const encoded = UTF8_ENCODER.encode(queryJson); + const hashed = await sha256Digest(encoded); + return base58.encode(new Uint8Array(hashed)); +} diff --git a/lib/sqlsync-solid-js/src/sqlsync.ts b/lib/sqlsync-solid-js/src/sqlsync.ts new file mode 100644 index 0000000..0321c53 --- /dev/null +++ b/lib/sqlsync-solid-js/src/sqlsync.ts @@ -0,0 +1,306 @@ +import { + ConnectionStatus, + DocEvent, + DocId, + DocReply, + HandlerId, + QueryKey, + SqlValue, + WorkerRequest, + WorkerToHostMsg, + journalIdToString, +} from "@orbitinghail/sqlsync-worker"; +import { ParameterizedQuery, toQueryKey } from "./sql"; +import { NarrowTaggedEnum, OmitUnion, assertUnreachable, initWorker, toRows } from "./util"; + +export type Row = Record; + +export interface DocType { + readonly reducerUrl: string | URL; + readonly serializeMutation: (mutation: Mutation) => Uint8Array; +} + +type DocReplyTag = DocReply["tag"]; +type SelectDocReply = NarrowTaggedEnum; + +export interface QuerySubscription { + handleRows: (rows: Row[]) => void; + handleErr: (err: string) => void; +} + +const nextHandlerId = (() => { + let handlerId = 0; + return () => handlerId++; +})(); + +export class SQLSync { + #port: MessagePort; + #openDocs = new Set(); + #pendingOpens = new Map>(); + #msgHandlers = new Map void>(); + #querySubscriptions = new Map(); + #connectionStatus: ConnectionStatus = "disconnected"; + #connectionStatusListeners = new Set<(status: ConnectionStatus) => void>(); + + constructor(workerUrl: string | URL, wasmUrl: string | URL, coordinatorUrl?: string | URL) { + this.#msgHandlers = new Map(); + const port = initWorker(workerUrl); + this.#port = port; + + // We use a WeakRef here to avoid a circular reference between this.port and this. + // This allows the SQLSync object to be garbage collected when it is no longer needed. + const weakThis = new WeakRef(this); + this.#port.onmessage = (msg) => { + const thisRef = weakThis.deref(); + if (thisRef) { + thisRef.#handleMessage(msg); + } else { + console.log( + "sqlsync: dropping message; sqlsync object has been garbage collected", + msg.data, + ); + // clean up the port + port.postMessage({ tag: "Close", handlerId: 0 }); + port.onmessage = null; + return; + } + }; + + this.#boot(wasmUrl.toString(), coordinatorUrl?.toString()).catch((err) => { + // TODO: expose this error to the app in a nicer way + // probably through some event handlers on the SQLSync object + console.error("sqlsync boot failed", err); + throw err; + }); + } + + close() { + this.#port.onmessage = null; + this.#port.postMessage({ tag: "Close", handlerId: 0 }); + } + + #handleMessage(event: MessageEvent) { + const msg = event.data as WorkerToHostMsg; + + if (msg.tag === "Reply") { + console.log("sqlsync: received reply", msg.handlerId, msg.reply); + const handler = this.#msgHandlers.get(msg.handlerId); + if (handler) { + handler(msg.reply); + } else { + console.error("sqlsync: no handler for message", msg); + throw new Error("no handler for message"); + } + } else if (msg.tag === "Event") { + this.#handleDocEvent(msg.docId, msg.evt); + } else { + assertUnreachable("unknown message", msg); + } + } + + #handleDocEvent(docId: DocId, evt: DocEvent) { + console.log(`sqlsync: doc ${journalIdToString(docId)} received event`, evt); + if (evt.tag === "ConnectionStatus") { + this.#connectionStatus = evt.status; + for (const listener of this.#connectionStatusListeners) { + listener(evt.status); + } + } else if (evt.tag === "SubscriptionChanged") { + const subscriptions = this.#querySubscriptions.get(evt.key); + if (subscriptions) { + for (const subscription of subscriptions) { + subscription.handleRows(toRows(evt.columns, evt.rows)); + } + } + } else if (evt.tag === "SubscriptionErr") { + const subscriptions = this.#querySubscriptions.get(evt.key); + if (subscriptions) { + for (const subscription of subscriptions) { + subscription.handleErr(evt.err); + } + } + } else { + assertUnreachable("unknown event", evt); + } + } + + #send>( + expectedReplyTag: T, + msg: OmitUnion, + ): Promise> { + return new Promise((resolve, reject) => { + const handlerId = nextHandlerId(); + const req: WorkerRequest = { ...msg, handlerId }; + + console.log("sqlsync: sending message", req.handlerId, req.tag === "Doc" ? req.req : req); + + this.#msgHandlers.set(handlerId, (msg: DocReply) => { + this.#msgHandlers.delete(handlerId); + if (msg.tag === "Err") { + reject(msg.err); + } else if (msg.tag === expectedReplyTag) { + // TODO: is it possible to get Typescript to infer this cast? + resolve(msg as SelectDocReply); + } else { + console.warn("sqlsync: unexpected reply", msg); + reject(new Error(`expected ${expectedReplyTag} reply; got ${msg.tag}`)); + } + }); + + this.#port.postMessage(req); + }); + } + + async #boot(wasmUrl: string, coordinatorUrl?: string): Promise { + await this.#send("Ack", { + tag: "Boot", + wasmUrl, + coordinatorUrl, + }); + } + + async #open(docId: DocId, docType: DocType): Promise { + let openPromise = this.#pendingOpens.get(docId); + if (!openPromise) { + openPromise = this.#send("Ack", { + tag: "Doc", + docId, + req: { + tag: "Open", + reducerUrl: docType.reducerUrl.toString(), + }, + }); + this.#pendingOpens.set(docId, openPromise); + } + await openPromise; + this.#pendingOpens.delete(docId); + this.#openDocs.add(docId); + } + + async query( + docId: DocId, + docType: DocType, + sql: string, + params: SqlValue[], + ): Promise { + if (!this.#openDocs.has(docId)) { + await this.#open(docId, docType); + } + + const reply = await this.#send("RecordSet", { + tag: "Doc", + docId: docId, + req: { tag: "Query", sql, params }, + }); + + return toRows(reply.columns, reply.rows); + } + + async subscribe( + docId: DocId, + docType: DocType, + query: ParameterizedQuery, + subscription: QuerySubscription, + ): Promise<() => void> { + if (!this.#openDocs.has(docId)) { + await this.#open(docId, docType); + } + const queryKey = await toQueryKey(query); + + // get or create subscription + let subscriptions = this.#querySubscriptions.get(queryKey); + if (!subscriptions) { + subscriptions = []; + this.#querySubscriptions.set(queryKey, subscriptions); + } + if (subscriptions.indexOf(subscription) === -1) { + subscriptions.push(subscription); + } else { + throw new Error("sqlsync: duplicate subscription"); + } + + // send subscribe request + await this.#send("Ack", { + tag: "Doc", + docId, + req: { tag: "QuerySubscribe", key: queryKey, sql: query.sql, params: query.params }, + }); + + // return unsubscribe function + return () => { + const subscriptions = this.#querySubscriptions.get(queryKey); + if (!subscriptions) { + // no subscriptions + return; + } + const idx = subscriptions.indexOf(subscription); + if (idx === -1) { + // no subscription + return; + } + subscriptions.splice(idx, 1); + + window.setTimeout(() => { + // we want to wait a tiny bit before sending finalizing the unsubscribe + // to handle the case that React resubscribes to the same query right away + this.#unsubscribeIfNeeded(docId, queryKey).catch((err) => { + console.error("sqlsync: error unsubscribing", err); + }); + }, 10); + }; + } + + async #unsubscribeIfNeeded(docId: DocId, queryKey: QueryKey): Promise { + const subscriptions = this.#querySubscriptions.get(queryKey); + if (Array.isArray(subscriptions) && subscriptions.length === 0) { + // query subscription is still registered but has no subscriptions on our side + // inform the worker that we are no longer interested in this query + this.#querySubscriptions.delete(queryKey); + + if (this.#openDocs.has(docId)) { + await this.#send("Ack", { + tag: "Doc", + docId, + req: { tag: "QueryUnsubscribe", key: queryKey }, + }); + } + } + } + + async mutate(docId: DocId, docType: DocType, mutation: M): Promise { + if (!this.#openDocs.has(docId)) { + await this.#open(docId, docType); + } + await this.#send("Ack", { + tag: "Doc", + docId, + req: { tag: "Mutate", mutation: docType.serializeMutation(mutation) }, + }); + } + + get connectionStatus(): ConnectionStatus { + return this.#connectionStatus; + } + + addConnectionStatusListener(listener: (status: ConnectionStatus) => void): () => void { + this.#connectionStatusListeners.add(listener); + return () => { + this.#connectionStatusListeners.delete(listener); + }; + } + + async setConnectionEnabled( + docId: DocId, + docType: DocType, + enabled: boolean, + ): Promise { + if (!this.#openDocs.has(docId)) { + await this.#open(docId, docType); + } + await this.#send("Ack", { + tag: "Doc", + docId, + req: { tag: "SetConnectionEnabled", enabled }, + }); + } +} diff --git a/lib/sqlsync-solid-js/src/util.ts b/lib/sqlsync-solid-js/src/util.ts new file mode 100644 index 0000000..902a705 --- /dev/null +++ b/lib/sqlsync-solid-js/src/util.ts @@ -0,0 +1,63 @@ +import { SqlValue } from "@orbitinghail/sqlsync-worker"; +import * as sha256 from "fast-sha256"; +import { Row } from "./sqlsync"; + +// omits the given keys from each member of the union +// https://stackoverflow.com/a/57103940/65872 +// biome-ignore lint/suspicious/noExplicitAny: any is required for this type magic to work +export type OmitUnion = T extends any ? Omit : never; + +export type NarrowTaggedEnum = E extends { tag: T } ? E : never; + +export function assertUnreachable(err: string, x: never): never { + throw new Error(`unreachable: ${err}; got ${JSON.stringify(x)}`); +} + +export function initWorker(workerUrl: string | URL): MessagePort { + const type: WorkerType = workerUrl.toString().endsWith(".cjs") ? "classic" : "module"; + + if (typeof SharedWorker !== "undefined") { + const worker = new SharedWorker(workerUrl, { type }); + return worker.port; + } + + const worker = new Worker(workerUrl, { type }); + // biome-ignore lint/suspicious/noExplicitAny: WebWorker extends MessagePort via duck typing + return worker as any as MessagePort; +} + +const UTF8Encoder = new TextEncoder(); +export const serializeMutationAsJSON = (mutation: M) => { + const serialized = JSON.stringify(mutation); + return UTF8Encoder.encode(serialized); +}; + +export function toRows(columns: string[], rows: SqlValue[][]): R[] { + const out: R[] = []; + for (const row of rows) { + const obj: Row = {}; + for (let i = 0; i < columns.length; i++) { + obj[columns[i]] = row[i]; + } + out.push(obj as R); + } + return out; +} + +export const pendingPromise = (): [Promise, (v: T) => void] => { + let resolve: (v: T) => void; + const promise = new Promise((r) => { + resolve = r; + }); + // biome-ignore lint/style/noNonNullAssertion: we know resolve is defined because the promise constructor runs syncronously + return [promise, resolve!]; +}; + +export const sha256Digest = async (data: Uint8Array): Promise => { + if (crypto?.subtle?.digest) { + const hash = await crypto.subtle.digest("SHA-256", data); + return new Uint8Array(hash); + } + + return Promise.resolve(sha256.hash(data)); +}; diff --git a/lib/sqlsync-solid-js/test/react-sanity.html b/lib/sqlsync-solid-js/test/react-sanity.html new file mode 100644 index 0000000..b7240f2 --- /dev/null +++ b/lib/sqlsync-solid-js/test/react-sanity.html @@ -0,0 +1,15 @@ + + + + + + + sqlsync-react tests + + + +
if nothing renders, open the console
+ + + + \ No newline at end of file diff --git a/lib/sqlsync-solid-js/test/react-sanity.tsx b/lib/sqlsync-solid-js/test/react-sanity.tsx new file mode 100644 index 0000000..83d80cf --- /dev/null +++ b/lib/sqlsync-solid-js/test/react-sanity.tsx @@ -0,0 +1,96 @@ +import React, { useEffect } from "react"; + +import { JournalId, journalIdFromString } from "@orbitinghail/sqlsync-worker"; +import { createDocHooks } from "../src/hooks"; +import { sql } from "../src/sql"; +import { DocType } from "../src/sqlsync"; +import { serializeMutationAsJSON } from "../src/util"; + +const DEMO_REDUCER_URL = new URL( + "../../../target/wasm32-unknown-unknown/debug/sqlsync_react_test_reducer.wasm", + import.meta.url +); + +const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); + +type CounterOps = + | { + tag: "InitSchema"; + } + | { + tag: "Incr"; + value: number; + } + | { + tag: "Decr"; + value: number; + }; + +const CounterDocType: DocType = { + reducerUrl: DEMO_REDUCER_URL, + serializeMutation: serializeMutationAsJSON, +}; + +const { useMutate, useQuery } = createDocHooks(CounterDocType); + +// biome-ignore lint/style/noNonNullAssertion: root is defined +// ReactDOM.createRoot(document.getElementById("root")!).render( +// +// +// +// +// , +// ); + +function App({ docId }: { docId: JournalId }) { + const mutate = useMutate(docId); + + useEffect(() => { + mutate({ tag: "InitSchema" }).catch((err) => { + console.error("Failed to init schema", err); + }); + }, [mutate]); + + const handleIncr = React.useCallback(() => { + mutate({ tag: "Incr", value: 1 }).catch((err) => { + console.error("Failed to incr", err); + }); + }, [mutate]); + + const handleDecr = React.useCallback(() => { + mutate({ tag: "Decr", value: 1 }).catch((err) => { + console.error("Failed to decr", err); + }); + }, [mutate]); + + const query = useQuery<{ value: number }>( + docId, + sql`select value, 'hi', 1.23, ${"foo"} as s from counter` + ); + + return ( + <> +

sqlsync-react sanity test

+

+ This is a sanity test for sqlsync-react. It should display a counter that can be incremented + and decremented. +

+

The counter is stored in a SQL database, and the state is managed by sqlsync-react.

+

+ + +

+ {query.state === "pending" ? ( +
Loading...
+ ) : query.state === "error" ? ( +
{query.error.message}
+ ) : ( +
{query.rows[0]?.value.toString()}
+ )} + + ); +} diff --git a/lib/sqlsync-solid-js/tsconfig.json b/lib/sqlsync-solid-js/tsconfig.json new file mode 100644 index 0000000..07a282b --- /dev/null +++ b/lib/sqlsync-solid-js/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "lib": [ + "ES6", + "DOM", + "DOM.Iterable", + "ES2021.WeakRef" + ], + "types": [ + "vite/client" + ], + "skipLibCheck": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src", + "test" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/lib/sqlsync-solid-js/tsconfig.node.json b/lib/sqlsync-solid-js/tsconfig.node.json new file mode 100644 index 0000000..b6dda0b --- /dev/null +++ b/lib/sqlsync-solid-js/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "types": ["node"], + "strict": true, + }, + "include": ["vite.config.ts"] +} diff --git a/lib/sqlsync-solid-js/vite.config.ts b/lib/sqlsync-solid-js/vite.config.ts new file mode 100644 index 0000000..70c1bd7 --- /dev/null +++ b/lib/sqlsync-solid-js/vite.config.ts @@ -0,0 +1,35 @@ +import { resolve } from "path"; +import { defineConfig, searchForWorkspaceRoot } from "vite"; +import dts from "vite-plugin-dts"; +import solidPlugin from "vite-plugin-solid"; + +export default defineConfig({ + plugins: [ + solidPlugin(), + dts({ + exclude: "test/**/*", + }), + ], + build: { + lib: { + entry: resolve(__dirname, "src/index.ts"), + name: "SQLSyncReact", + formats: ["es", "umd"], + }, + sourcemap: true, + rollupOptions: { + external: ["react"], + output: { + exports: "named", + globals: { + react: "React", + }, + }, + }, + }, + server: { + fs: { + allow: [searchForWorkspaceRoot(process.cwd())], + }, + }, +}); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b393bd5..a0455a0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,5 +2,6 @@ packages: - "demo/cloudflare-backend" - "demo/frontend" - "lib/sqlsync-react" + - "lib/sqlsync-solid-js" - "lib/sqlsync-worker" - "examples/guestbook-react" From 8eb218815bd665c36000d4285cbebae0dbc206d4 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 30 Dec 2023 11:07:37 -0800 Subject: [PATCH 02/22] more changes. just have to fix the test --- lib/sqlsync-solid-js/src/context.tsx | 24 +++---- lib/sqlsync-solid-js/src/hooks.ts | 82 +++++++++++++--------- lib/sqlsync-solid-js/src/sqlsync.ts | 14 ++-- lib/sqlsync-solid-js/test/react-sanity.tsx | 58 +++++++++------ 4 files changed, 101 insertions(+), 77 deletions(-) diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index 116e58f..67f5188 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,7 +1,7 @@ // import { ReactNode, createContext, useEffect, useState } from "react"; import { + Accessor, ParentComponent, - Show, createContext, createEffect, createSignal, @@ -9,7 +9,7 @@ import { } from "solid-js"; import { SQLSync } from "./sqlsync"; -export const SQLSyncContext = createContext(null); +export const SQLSyncContext = createContext<[Accessor]>([() => null]); interface Props { workerUrl: string | URL; @@ -17,22 +17,20 @@ interface Props { coordinatorUrl?: string | URL; } +const createSqlSync = (props: Props): SQLSync => { + return new SQLSync(props.workerUrl, props.wasmUrl, props.coordinatorUrl); +}; + export const SQLSyncProvider: ParentComponent = (props) => { - const [sqlsync, setSQLSync] = createSignal(null); + const [sqlSync, setSQLSync] = createSignal(null); createEffect(() => { - const sqlsync = new SQLSync(props.workerUrl, props.wasmUrl, props.coordinatorUrl); - setSQLSync(sqlsync); + const sqlSync = createSqlSync(props); + setSQLSync(sqlSync); onCleanup(() => { - sqlsync.close(); + sqlSync.close(); }); }); - return ( - - {(sqlSync) => { - return {props.children}; - }} - - ); + return {props.children}; }; diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index 7932e8b..fe6e7ac 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -1,27 +1,42 @@ import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; -import { deepEqual } from "fast-equals"; // import { useCallback, useContext, useEffect, useRef, useState } from "react"; -import { createContext, createMemo } from "solid-js"; +import { Accessor, createEffect, createSignal, onCleanup, useContext } from "solid-js"; import { SQLSyncContext } from "./context"; import { ParameterizedQuery, normalizeQuery } from "./sql"; import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; import { pendingPromise } from "./util"; -export function useSQLSync(): SQLSync { - const value = createContext(SQLSyncContext); - if (import.meta.env.DEV && !value) { +export function useSQLSync(): Accessor { + const [value] = useContext(SQLSyncContext); + if (import.meta.env.DEV && !value()) { throw new Error( "could not find sqlsync context value; please ensure the component is wrapped in a " ); } + // biome-ignore lint/style/noNonNullAssertion: asserts in dev - return value!; + return () => { + const sqlsync = value(); + if (import.meta.env.DEV && !sqlsync) { + throw new Error( + "could not find sqlsync context value; please ensure the component is wrapped in a " + ); + } else if (!sqlsync) { + console.error( + "could not find sqlsync context value; please ensure the component is wrapped in a " + ); + } + return sqlsync!; + }; } type MutateFn = (mutation: M) => Promise; type UseMutateFn = (docId: DocId) => MutateFn; -type UseQueryFn = (docId: DocId, query: ParameterizedQuery | string) => QueryState; +type UseQueryFn = ( + docId: Accessor, + query: Accessor +) => Accessor>; type SetConnectionEnabledFn = (enabled: boolean) => Promise; type UseSetConnectionEnabledFn = (docId: DocId) => SetConnectionEnabledFn; @@ -32,22 +47,22 @@ export interface DocHooks { useSetConnectionEnabled: UseSetConnectionEnabledFn; } -export function createDocHooks(docType: DocType): DocHooks { +export function createDocHooks(docType: Accessor>): DocHooks { const useMutate = (docId: DocId): MutateFn => { const sqlsync = useSQLSync(); - return createMemo((mutation: M) => sqlsync.mutate(docId, docType, mutation)); + return (mutation: M) => sqlsync().mutate(docId, docType(), mutation); }; - const useQueryWrapper = (docId: DocId, query: ParameterizedQuery | string) => { + const useQueryWrapper = ( + docId: Accessor, + query: Accessor + ) => { return useQuery(docType, docId, query); }; const useSetConnectionEnabledWrapper = (docId: DocId) => { const sqlsync = useSQLSync(); - return useCallback( - (enabled: boolean) => sqlsync.setConnectionEnabled(docId, docType, enabled), - [sqlsync, docId, docType] - ); + return (enabled: boolean) => sqlsync().setConnectionEnabled(docId, docType(), enabled); }; return { @@ -63,22 +78,16 @@ export type QueryState = | { state: "error"; error: Error; rows?: R[] }; export function useQuery( - docType: DocType, - docId: DocId, - rawQuery: ParameterizedQuery | string -): QueryState { + docType: Accessor>, + docId: Accessor, + rawQuery: Accessor +): Accessor> { const sqlsync = useSQLSync(); - const [state, setState] = useState>({ state: "pending" }); + const [state, setState] = createSignal>({ state: "pending" }); - // memoize query based on deep equality - let query = normalizeQuery(rawQuery); - const queryRef = useRef(query); - if (!deepEqual(queryRef.current, query)) { - queryRef.current = query; - } - query = queryRef.current; + createEffect(() => { + let query = normalizeQuery(rawQuery()); - useEffect(() => { const [unsubPromise, unsubResolve] = pendingPromise<() => void>(); const subscription: QuerySubscription = { @@ -91,29 +100,32 @@ export function useQuery( })), }; - sqlsync - .subscribe(docId, docType, query, subscription) + sqlsync() + .subscribe(docId(), docType(), query, subscription) .then(unsubResolve) .catch((err: Error) => { console.error("sqlsync: error subscribing", err); setState({ state: "error", error: err }); }); - return () => { + onCleanup(() => { unsubPromise .then((unsub) => unsub()) .catch((err) => { console.error("sqlsync: error unsubscribing", err); }); - }; - }, [sqlsync, docId, docType, query]); + }); + }); return state; } -export const useConnectionStatus = (): ConnectionStatus => { +export const useConnectionStatus = (): Accessor => { const sqlsync = useSQLSync(); - const [status, setStatus] = useState(sqlsync.connectionStatus); - useEffect(() => sqlsync.addConnectionStatusListener(setStatus), [sqlsync]); + const [status, setStatus] = createSignal(sqlsync().connectionStatus); + createEffect(() => { + const cleanup = sqlsync().addConnectionStatusListener(setStatus); + onCleanup(cleanup); + }); return status; }; diff --git a/lib/sqlsync-solid-js/src/sqlsync.ts b/lib/sqlsync-solid-js/src/sqlsync.ts index 0321c53..85ecbc0 100644 --- a/lib/sqlsync-solid-js/src/sqlsync.ts +++ b/lib/sqlsync-solid-js/src/sqlsync.ts @@ -57,7 +57,7 @@ export class SQLSync { } else { console.log( "sqlsync: dropping message; sqlsync object has been garbage collected", - msg.data, + msg.data ); // clean up the port port.postMessage({ tag: "Close", handlerId: 0 }); @@ -94,7 +94,7 @@ export class SQLSync { } else if (msg.tag === "Event") { this.#handleDocEvent(msg.docId, msg.evt); } else { - assertUnreachable("unknown message", msg); + assertUnreachable("unknown message", msg as never); } } @@ -120,13 +120,13 @@ export class SQLSync { } } } else { - assertUnreachable("unknown event", evt); + assertUnreachable("unknown event", evt as never); } } #send>( expectedReplyTag: T, - msg: OmitUnion, + msg: OmitUnion ): Promise> { return new Promise((resolve, reject) => { const handlerId = nextHandlerId(); @@ -181,7 +181,7 @@ export class SQLSync { docId: DocId, docType: DocType, sql: string, - params: SqlValue[], + params: SqlValue[] ): Promise { if (!this.#openDocs.has(docId)) { await this.#open(docId, docType); @@ -200,7 +200,7 @@ export class SQLSync { docId: DocId, docType: DocType, query: ParameterizedQuery, - subscription: QuerySubscription, + subscription: QuerySubscription ): Promise<() => void> { if (!this.#openDocs.has(docId)) { await this.#open(docId, docType); @@ -292,7 +292,7 @@ export class SQLSync { async setConnectionEnabled( docId: DocId, docType: DocType, - enabled: boolean, + enabled: boolean ): Promise { if (!this.#openDocs.has(docId)) { await this.#open(docId, docType); diff --git a/lib/sqlsync-solid-js/test/react-sanity.tsx b/lib/sqlsync-solid-js/test/react-sanity.tsx index 83d80cf..84809f3 100644 --- a/lib/sqlsync-solid-js/test/react-sanity.tsx +++ b/lib/sqlsync-solid-js/test/react-sanity.tsx @@ -1,6 +1,9 @@ -import React, { useEffect } from "react"; +// import React, { useEffect } from "react"; import { JournalId, journalIdFromString } from "@orbitinghail/sqlsync-worker"; +import { Match, Switch, createEffect } from "solid-js"; +import { createSignal } from "solid-js/types/server/reactive.js"; +import { SQLSyncProvider } from "../src"; import { createDocHooks } from "../src/hooks"; import { sql } from "../src/sql"; import { DocType } from "../src/sqlsync"; @@ -31,42 +34,43 @@ const CounterDocType: DocType = { serializeMutation: serializeMutationAsJSON, }; -const { useMutate, useQuery } = createDocHooks(CounterDocType); +const [counterDocType, _setCounterDocType] = createSignal(CounterDocType); + +const { useMutate, useQuery } = createDocHooks(counterDocType); // biome-ignore lint/style/noNonNullAssertion: root is defined -// ReactDOM.createRoot(document.getElementById("root")!).render( -// -// -// -// -// , -// ); +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + +); function App({ docId }: { docId: JournalId }) { const mutate = useMutate(docId); - useEffect(() => { + createEffect(() => { mutate({ tag: "InitSchema" }).catch((err) => { console.error("Failed to init schema", err); }); - }, [mutate]); + }); - const handleIncr = React.useCallback(() => { + const handleIncr = () => { mutate({ tag: "Incr", value: 1 }).catch((err) => { console.error("Failed to incr", err); }); - }, [mutate]); + }; - const handleDecr = React.useCallback(() => { + const handleDecr = () => { mutate({ tag: "Decr", value: 1 }).catch((err) => { console.error("Failed to decr", err); }); - }, [mutate]); + }; - const query = useQuery<{ value: number }>( - docId, - sql`select value, 'hi', 1.23, ${"foo"} as s from counter` - ); + + const query = useQuery<{ value: number }>(() => docId, () => + sql`select value, 'hi', 1.23, ${"foo"} as s from counter`); return ( <> @@ -84,12 +88,22 @@ function App({ docId }: { docId: JournalId }) { Decr

- {query.state === "pending" ? ( + + + +
Loading...
+
+ +
Loading...
+
+ +
+ {query().state === "pending" ? ( ) : query.state === "error" ? ( -
{query.error.message}
+
{query().error.message}
) : ( -
{query.rows[0]?.value.toString()}
+
{query().rows?.[0]?.value.toString()}
)} ); From 41cbad6adb5a6ecabc630925640e14a2a527212b Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:17:08 -0800 Subject: [PATCH 03/22] wip: trying to get the library to work for host --- justfile | 3 ++ lib/sqlsync-solid-js/package.json | 14 +++--- lib/sqlsync-solid-js/src/context.tsx | 40 ++++++++-------- lib/sqlsync-solid-js/src/context_utils.ts | 4 ++ lib/sqlsync-solid-js/src/hooks.ts | 10 +++- lib/sqlsync-solid-js/src/index.ts | 22 +++++++-- lib/sqlsync-solid-js/test/react-sanity.tsx | 53 ++++++++++------------ 7 files changed, 83 insertions(+), 63 deletions(-) create mode 100644 lib/sqlsync-solid-js/src/context_utils.ts diff --git a/justfile b/justfile index 83a3164..670a197 100644 --- a/justfile +++ b/justfile @@ -59,6 +59,9 @@ node_modules: package-sqlsync-react: cd lib/sqlsync-react && pnpm build +package-sqlsync-solid-js: + cd lib/sqlsync-solid-js && pnpm build + package-sqlsync-worker target='release': #!/usr/bin/env bash if [[ '{{target}}' = 'release' ]]; then diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json index 4e70f95..95b2c2c 100644 --- a/lib/sqlsync-solid-js/package.json +++ b/lib/sqlsync-solid-js/package.json @@ -1,5 +1,5 @@ { - "name": "@orbitinghail/sqlsync-react-solid-js", + "name": "@orbitinghail/sqlsync-solid-js", "version": "0.2.0", "description": "SQLSync is a collaborative offline-first wrapper around SQLite. It is designed to synchronize web application state between users, devices, and the edge.", "homepage": "https://sqlsync.dev", @@ -22,7 +22,7 @@ "src" ], "type": "module", - "main": "./dist/sqlsync-react.js", + "main": "./dist/sqlsync-solid-js.js", "types": "./src/index.ts", "exports": { ".": { @@ -46,15 +46,13 @@ "@solidjs/testing-library": "^0.8.4", "@testing-library/jest-dom": "^6.1.3" }, - "peerDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, "dependencies": { - "solid-js": "^1.8.7", - "@orbitinghail/sqlsync-worker": "workspace:^", + "@orbitinghail/sqlsync-worker": "0.2.0", "@scure/base": "^1.1.3", "fast-equals": "^5.0.1", "fast-sha256": "^1.3.0" + }, + "peerDependencies": { + "solid-js": "^1.8.7" } } diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index 67f5188..22744fd 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,36 +1,36 @@ // import { ReactNode, createContext, useEffect, useState } from "react"; -import { - Accessor, - ParentComponent, - createContext, - createEffect, - createSignal, - onCleanup, -} from "solid-js"; +import { ParentComponent, createSignal } from "solid-js"; +import { SQLSyncContext } from "."; import { SQLSync } from "./sqlsync"; -export const SQLSyncContext = createContext<[Accessor]>([() => null]); - interface Props { workerUrl: string | URL; wasmUrl: string | URL; coordinatorUrl?: string | URL; } -const createSqlSync = (props: Props): SQLSync => { +export const createSqlSync = (props: Props): SQLSync => { return new SQLSync(props.workerUrl, props.wasmUrl, props.coordinatorUrl); }; export const SQLSyncProvider: ParentComponent = (props) => { - const [sqlSync, setSQLSync] = createSignal(null); + const [sqlSync, setSQLSync] = createSignal(createSqlSync(props)); + // console.log("sqlSync in provider:", sqlSync(), JSON.stringify(sqlSync(), null, 2)); + + // const sqlSyncValue: [Accessor] = [sqlSync]; - createEffect(() => { - const sqlSync = createSqlSync(props); - setSQLSync(sqlSync); - onCleanup(() => { - sqlSync.close(); - }); - }); + // createEffect(() => { + // const sqlSync = createSqlSync(props); + // console.log("sqlSync in effect:", sqlSync, JSON.stringify(sqlSync, null, 2)); + // setSQLSync(sqlSync); + // onCleanup(() => { + // sqlSync.close(); + // }); + // }); - return {props.children}; + return ( + + {props.children} + + ); }; diff --git a/lib/sqlsync-solid-js/src/context_utils.ts b/lib/sqlsync-solid-js/src/context_utils.ts new file mode 100644 index 0000000..4d30364 --- /dev/null +++ b/lib/sqlsync-solid-js/src/context_utils.ts @@ -0,0 +1,4 @@ +import { createContext } from "solid-js"; +import { SQLSync } from "./sqlsync"; + +export const SQLSyncContext = createContext<[() => SQLSync, (sqlSync: SQLSync) => void]>(); diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index fe6e7ac..e8b1924 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -1,13 +1,19 @@ import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; // import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { Accessor, createEffect, createSignal, onCleanup, useContext } from "solid-js"; -import { SQLSyncContext } from "./context"; +import { SQLSyncContext } from "./context_utils"; import { ParameterizedQuery, normalizeQuery } from "./sql"; import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; import { pendingPromise } from "./util"; +export const useSqlContext = () => { + return [useContext(SQLSyncContext)!, SQLSyncContext, useContext]; +}; + export function useSQLSync(): Accessor { - const [value] = useContext(SQLSyncContext); + console.log("context", SQLSyncContext.id.toString()); + const [value] = useContext(SQLSyncContext)!; + console.log("sqlsync: useSQLSync", value, JSON.stringify(value)); if (import.meta.env.DEV && !value()) { throw new Error( "could not find sqlsync context value; please ensure the component is wrapped in a " diff --git a/lib/sqlsync-solid-js/src/index.ts b/lib/sqlsync-solid-js/src/index.ts index 44ca817..5ce778b 100644 --- a/lib/sqlsync-solid-js/src/index.ts +++ b/lib/sqlsync-solid-js/src/index.ts @@ -1,10 +1,24 @@ -import { SQLSyncProvider } from "./context"; -import { createDocHooks, useConnectionStatus } from "./hooks"; +import { createSignal } from "solid-js"; +import { SQLSyncProvider, createSqlSync } from "./context"; +import { SQLSyncContext } from "./context_utils"; +import { createDocHooks, useConnectionStatus, useSQLSync, useSqlContext } from "./hooks"; import { sql } from "./sql"; -import { DocType, Row } from "./sqlsync"; +import { DocType, Row, SQLSync } from "./sqlsync"; import { serializeMutationAsJSON } from "./util"; -export { SQLSyncProvider, createDocHooks, serializeMutationAsJSON, sql, useConnectionStatus }; +export { + SQLSync, + SQLSyncContext, + SQLSyncProvider, + createDocHooks, + createSignal, + createSqlSync, + serializeMutationAsJSON, + sql, + useConnectionStatus, + useSQLSync, + useSqlContext, +}; export type { DocType, Row }; // eof: this file only exports diff --git a/lib/sqlsync-solid-js/test/react-sanity.tsx b/lib/sqlsync-solid-js/test/react-sanity.tsx index 84809f3..c4ea0a1 100644 --- a/lib/sqlsync-solid-js/test/react-sanity.tsx +++ b/lib/sqlsync-solid-js/test/react-sanity.tsx @@ -1,9 +1,8 @@ // import React, { useEffect } from "react"; -import { JournalId, journalIdFromString } from "@orbitinghail/sqlsync-worker"; +import { JournalId } from "@orbitinghail/sqlsync-worker"; import { Match, Switch, createEffect } from "solid-js"; import { createSignal } from "solid-js/types/server/reactive.js"; -import { SQLSyncProvider } from "../src"; import { createDocHooks } from "../src/hooks"; import { sql } from "../src/sql"; import { DocType } from "../src/sqlsync"; @@ -14,7 +13,7 @@ const DEMO_REDUCER_URL = new URL( import.meta.url ); -const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); +// const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); type CounterOps = | { @@ -39,14 +38,15 @@ const [counterDocType, _setCounterDocType] = createSignal(CounterDocType); const { useMutate, useQuery } = createDocHooks(counterDocType); // biome-ignore lint/style/noNonNullAssertion: root is defined -ReactDOM.createRoot(document.getElementById("root")!).render( - - - - - -); - +// ReactDOM.createRoot(document.getElementById("root")!).render( +// +// +// +// +// +// ); + +// @ts-ignore function App({ docId }: { docId: JournalId }) { const mutate = useMutate(docId); @@ -68,9 +68,10 @@ function App({ docId }: { docId: JournalId }) { }); }; - - const query = useQuery<{ value: number }>(() => docId, () => - sql`select value, 'hi', 1.23, ${"foo"} as s from counter`); + const query = useQuery<{ value: number }>( + () => docId, + () => sql`select value, 'hi', 1.23, ${"foo"} as s from counter` + ); return ( <> @@ -88,23 +89,17 @@ function App({ docId }: { docId: JournalId }) { Decr

- + - -
Loading...
-
- - -
Loading...
-
- +
Loading...
+ + +
{(query() as any).error.message}
+
+ +
{query().rows?.[0]?.value.toString()}
+
- {query().state === "pending" ? ( - ) : query.state === "error" ? ( -
{query().error.message}
- ) : ( -
{query().rows?.[0]?.value.toString()}
- )} ); } From a469fe1ff01cf9e848b9c84145ba5f38d2124ebd Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 14:14:55 -0800 Subject: [PATCH 04/22] downstream application is consuming solid library properly although no queries have been tested --- .vscode/settings.json | 14 ++++++++++++++ .../Cargo.toml | 0 .../src/lib.rs | 0 lib/sqlsync-solid-js/src/context.tsx | 5 +++-- lib/sqlsync-solid-js/src/context_utils.ts | 3 --- lib/sqlsync-solid-js/src/hooks.ts | 2 +- lib/sqlsync-solid-js/src/index.ts | 3 +-- lib/sqlsync-solid-js/vite.config.ts | 2 +- 8 files changed, 20 insertions(+), 9 deletions(-) rename lib/sqlsync-solid-js/{sqlsync-react-test-reducer => sqlsync-solid-js-test-reducer}/Cargo.toml (100%) rename lib/sqlsync-solid-js/{sqlsync-react-test-reducer => sqlsync-solid-js-test-reducer}/src/lib.rs (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index ff9e6b7..a06f639 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,5 +22,19 @@ "editor.defaultFormatter": "biomejs.biome", "editor.tabSize": 2, "editor.insertSpaces": true + }, + "workbench.colorCustomizations": { + "[Monokai Pro]": { + "editorInlayHint.background": "#f8f8f200", + "editorInlayHint.foreground": "#f8f8f280" + }, + "editorCursor.foreground": "#fea726", + "editorCursor.background": "#000000", + "editor.wordHighlightBackground": "#3fea9a11", + "editor.selectionBackground": "#25a76a55", + "editor.findMatchBackground": "#34c78279", + "activityBar.background": "#2E2C35", + "titleBar.activeBackground": "#413E4B", + "titleBar.activeForeground": "#FAFAFB" } } diff --git a/lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml b/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml similarity index 100% rename from lib/sqlsync-solid-js/sqlsync-react-test-reducer/Cargo.toml rename to lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml diff --git a/lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs b/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs similarity index 100% rename from lib/sqlsync-solid-js/sqlsync-react-test-reducer/src/lib.rs rename to lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index 22744fd..e00dffa 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,8 +1,9 @@ // import { ReactNode, createContext, useEffect, useState } from "react"; -import { ParentComponent, createSignal } from "solid-js"; -import { SQLSyncContext } from "."; +import { ParentComponent, createContext, createSignal } from "solid-js"; import { SQLSync } from "./sqlsync"; +export const SQLSyncContext = createContext<[() => SQLSync, (sqlSync: SQLSync) => void]>(); + interface Props { workerUrl: string | URL; wasmUrl: string | URL; diff --git a/lib/sqlsync-solid-js/src/context_utils.ts b/lib/sqlsync-solid-js/src/context_utils.ts index 4d30364..8b13789 100644 --- a/lib/sqlsync-solid-js/src/context_utils.ts +++ b/lib/sqlsync-solid-js/src/context_utils.ts @@ -1,4 +1 @@ -import { createContext } from "solid-js"; -import { SQLSync } from "./sqlsync"; -export const SQLSyncContext = createContext<[() => SQLSync, (sqlSync: SQLSync) => void]>(); diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index e8b1924..306e7db 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -1,7 +1,7 @@ import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; // import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { Accessor, createEffect, createSignal, onCleanup, useContext } from "solid-js"; -import { SQLSyncContext } from "./context_utils"; +import { SQLSyncContext } from "./context"; import { ParameterizedQuery, normalizeQuery } from "./sql"; import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; import { pendingPromise } from "./util"; diff --git a/lib/sqlsync-solid-js/src/index.ts b/lib/sqlsync-solid-js/src/index.ts index 5ce778b..f0045b9 100644 --- a/lib/sqlsync-solid-js/src/index.ts +++ b/lib/sqlsync-solid-js/src/index.ts @@ -1,6 +1,5 @@ import { createSignal } from "solid-js"; -import { SQLSyncProvider, createSqlSync } from "./context"; -import { SQLSyncContext } from "./context_utils"; +import { SQLSyncContext, SQLSyncProvider, createSqlSync } from "./context"; import { createDocHooks, useConnectionStatus, useSQLSync, useSqlContext } from "./hooks"; import { sql } from "./sql"; import { DocType, Row, SQLSync } from "./sqlsync"; diff --git a/lib/sqlsync-solid-js/vite.config.ts b/lib/sqlsync-solid-js/vite.config.ts index 70c1bd7..9b393bd 100644 --- a/lib/sqlsync-solid-js/vite.config.ts +++ b/lib/sqlsync-solid-js/vite.config.ts @@ -18,7 +18,7 @@ export default defineConfig({ }, sourcemap: true, rollupOptions: { - external: ["react"], + external: ["solid-js"], output: { exports: "named", globals: { From 08bd7457aab84263505b7be72dbe61cc0e1a8143 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:26:56 -0800 Subject: [PATCH 05/22] some cleanup --- lib/sqlsync-solid-js/src/context.tsx | 25 ++++++++++++------------- lib/sqlsync-solid-js/src/hooks.ts | 21 +++++++-------------- lib/sqlsync-solid-js/src/index.ts | 21 ++++----------------- 3 files changed, 23 insertions(+), 44 deletions(-) diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index e00dffa..1c7aa6b 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,8 +1,11 @@ // import { ReactNode, createContext, useEffect, useState } from "react"; -import { ParentComponent, createContext, createSignal } from "solid-js"; +import { ParentComponent, createContext, createEffect, createSignal, onCleanup } from "solid-js"; import { SQLSync } from "./sqlsync"; -export const SQLSyncContext = createContext<[() => SQLSync, (sqlSync: SQLSync) => void]>(); +export const SQLSyncContext = createContext<[() => SQLSync | null, (sqlSync: SQLSync) => void]>([ + () => null, + () => {}, +]); interface Props { workerUrl: string | URL; @@ -16,18 +19,14 @@ export const createSqlSync = (props: Props): SQLSync => { export const SQLSyncProvider: ParentComponent = (props) => { const [sqlSync, setSQLSync] = createSignal(createSqlSync(props)); - // console.log("sqlSync in provider:", sqlSync(), JSON.stringify(sqlSync(), null, 2)); - // const sqlSyncValue: [Accessor] = [sqlSync]; - - // createEffect(() => { - // const sqlSync = createSqlSync(props); - // console.log("sqlSync in effect:", sqlSync, JSON.stringify(sqlSync, null, 2)); - // setSQLSync(sqlSync); - // onCleanup(() => { - // sqlSync.close(); - // }); - // }); + createEffect(() => { + const sqlSync = createSqlSync(props); + setSQLSync(sqlSync); + onCleanup(() => { + sqlSync.close(); + }); + }); return ( diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index 306e7db..1c86e2a 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -1,38 +1,31 @@ import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; -// import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { Accessor, createEffect, createSignal, onCleanup, useContext } from "solid-js"; import { SQLSyncContext } from "./context"; import { ParameterizedQuery, normalizeQuery } from "./sql"; import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; import { pendingPromise } from "./util"; -export const useSqlContext = () => { - return [useContext(SQLSyncContext)!, SQLSyncContext, useContext]; -}; - export function useSQLSync(): Accessor { - console.log("context", SQLSyncContext.id.toString()); - const [value] = useContext(SQLSyncContext)!; - console.log("sqlsync: useSQLSync", value, JSON.stringify(value)); - if (import.meta.env.DEV && !value()) { + const [sqlSync] = useContext(SQLSyncContext); + if (import.meta.env.DEV && !sqlSync()) { throw new Error( "could not find sqlsync context value; please ensure the component is wrapped in a " ); } - // biome-ignore lint/style/noNonNullAssertion: asserts in dev return () => { - const sqlsync = value(); - if (import.meta.env.DEV && !sqlsync) { + const sqlSyncValue = sqlSync(); + if (import.meta.env.DEV && !sqlSyncValue) { throw new Error( "could not find sqlsync context value; please ensure the component is wrapped in a " ); - } else if (!sqlsync) { + } else if (!sqlSyncValue) { console.error( "could not find sqlsync context value; please ensure the component is wrapped in a " ); } - return sqlsync!; + // biome-ignore lint/style/noNonNullAssertion: asserts in dev + return sqlSyncValue!; }; } diff --git a/lib/sqlsync-solid-js/src/index.ts b/lib/sqlsync-solid-js/src/index.ts index f0045b9..44ca817 100644 --- a/lib/sqlsync-solid-js/src/index.ts +++ b/lib/sqlsync-solid-js/src/index.ts @@ -1,23 +1,10 @@ -import { createSignal } from "solid-js"; -import { SQLSyncContext, SQLSyncProvider, createSqlSync } from "./context"; -import { createDocHooks, useConnectionStatus, useSQLSync, useSqlContext } from "./hooks"; +import { SQLSyncProvider } from "./context"; +import { createDocHooks, useConnectionStatus } from "./hooks"; import { sql } from "./sql"; -import { DocType, Row, SQLSync } from "./sqlsync"; +import { DocType, Row } from "./sqlsync"; import { serializeMutationAsJSON } from "./util"; -export { - SQLSync, - SQLSyncContext, - SQLSyncProvider, - createDocHooks, - createSignal, - createSqlSync, - serializeMutationAsJSON, - sql, - useConnectionStatus, - useSQLSync, - useSqlContext, -}; +export { SQLSyncProvider, createDocHooks, serializeMutationAsJSON, sql, useConnectionStatus }; export type { DocType, Row }; // eof: this file only exports From 22c28c017f7164946d0d3fb221b9f3fd660d5f1d Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:27:21 -0800 Subject: [PATCH 06/22] wip: more cleanup --- lib/sqlsync-solid-js/src/context_utils.ts | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lib/sqlsync-solid-js/src/context_utils.ts diff --git a/lib/sqlsync-solid-js/src/context_utils.ts b/lib/sqlsync-solid-js/src/context_utils.ts deleted file mode 100644 index 8b13789..0000000 --- a/lib/sqlsync-solid-js/src/context_utils.ts +++ /dev/null @@ -1 +0,0 @@ - From f97af124ce91d13698ab080ad0029ecc7217c599 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:36:57 -0800 Subject: [PATCH 07/22] wip: cleanup tests --- .../{react-sanity.html => solid-sanity.html} | 19 ++++++-------- .../{react-sanity.tsx => solid-sanity.tsx} | 26 ++++++++++--------- 2 files changed, 22 insertions(+), 23 deletions(-) rename lib/sqlsync-solid-js/test/{react-sanity.html => solid-sanity.html} (52%) rename lib/sqlsync-solid-js/test/{react-sanity.tsx => solid-sanity.tsx} (81%) diff --git a/lib/sqlsync-solid-js/test/react-sanity.html b/lib/sqlsync-solid-js/test/solid-sanity.html similarity index 52% rename from lib/sqlsync-solid-js/test/react-sanity.html rename to lib/sqlsync-solid-js/test/solid-sanity.html index b7240f2..74c12f0 100644 --- a/lib/sqlsync-solid-js/test/react-sanity.html +++ b/lib/sqlsync-solid-js/test/solid-sanity.html @@ -1,15 +1,12 @@ - + - - + - sqlsync-react tests - - - + sqlsync-solid-js tests + +
if nothing renders, open the console
- - - - \ No newline at end of file + + + diff --git a/lib/sqlsync-solid-js/test/react-sanity.tsx b/lib/sqlsync-solid-js/test/solid-sanity.tsx similarity index 81% rename from lib/sqlsync-solid-js/test/react-sanity.tsx rename to lib/sqlsync-solid-js/test/solid-sanity.tsx index c4ea0a1..534cd47 100644 --- a/lib/sqlsync-solid-js/test/react-sanity.tsx +++ b/lib/sqlsync-solid-js/test/solid-sanity.tsx @@ -1,8 +1,10 @@ -// import React, { useEffect } from "react"; - -import { JournalId } from "@orbitinghail/sqlsync-worker"; +import { JournalId, journalIdFromString } from "@orbitinghail/sqlsync-worker"; +import sqlSyncWasmUrl from "@orbitinghail/sqlsync-worker/sqlsync.wasm?url"; +import workerUrl from "@orbitinghail/sqlsync-worker/worker.ts?url"; import { Match, Switch, createEffect } from "solid-js"; import { createSignal } from "solid-js/types/server/reactive.js"; +import { render } from "solid-js/web"; +import { SQLSyncProvider } from "../src"; import { createDocHooks } from "../src/hooks"; import { sql } from "../src/sql"; import { DocType } from "../src/sqlsync"; @@ -13,7 +15,7 @@ const DEMO_REDUCER_URL = new URL( import.meta.url ); -// const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); +const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); type CounterOps = | { @@ -37,14 +39,14 @@ const [counterDocType, _setCounterDocType] = createSignal(CounterDocType); const { useMutate, useQuery } = createDocHooks(counterDocType); -// biome-ignore lint/style/noNonNullAssertion: root is defined -// ReactDOM.createRoot(document.getElementById("root")!).render( -// -// -// -// -// -// ); +render( + () => ( + + + + ), + document.getElementById("root")! +); // @ts-ignore function App({ docId }: { docId: JournalId }) { From 19e9ecc1b04e87349d19008879ace53899741ef6 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:39:01 -0800 Subject: [PATCH 08/22] wip: remove vscode settings --- .vscode/settings.json | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a06f639..6cfdd6d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,18 +23,4 @@ "editor.tabSize": 2, "editor.insertSpaces": true }, - "workbench.colorCustomizations": { - "[Monokai Pro]": { - "editorInlayHint.background": "#f8f8f200", - "editorInlayHint.foreground": "#f8f8f280" - }, - "editorCursor.foreground": "#fea726", - "editorCursor.background": "#000000", - "editor.wordHighlightBackground": "#3fea9a11", - "editor.selectionBackground": "#25a76a55", - "editor.findMatchBackground": "#34c78279", - "activityBar.background": "#2E2C35", - "titleBar.activeBackground": "#413E4B", - "titleBar.activeForeground": "#FAFAFB" - } } From b3751d6145b4a8adece62e45fe1c3f78597c921a Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:39:14 -0800 Subject: [PATCH 09/22] wip --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 6cfdd6d..ff9e6b7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,5 +22,5 @@ "editor.defaultFormatter": "biomejs.biome", "editor.tabSize": 2, "editor.insertSpaces": true - }, + } } From b87b359607f5c9e640e4335e498bfb1e7112cb3d Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Mon, 1 Jan 2024 16:39:59 -0800 Subject: [PATCH 10/22] wip --- lib/sqlsync-solid-js/vite.config.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/sqlsync-solid-js/vite.config.ts b/lib/sqlsync-solid-js/vite.config.ts index 9b393bd..d615ad9 100644 --- a/lib/sqlsync-solid-js/vite.config.ts +++ b/lib/sqlsync-solid-js/vite.config.ts @@ -21,9 +21,6 @@ export default defineConfig({ external: ["solid-js"], output: { exports: "named", - globals: { - react: "React", - }, }, }, }, From 3c2b58d026d337564be647ee5c2298209a27307a Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:30:25 -0800 Subject: [PATCH 11/22] fix --- lib/sqlsync-solid-js/src/context.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index 1c7aa6b..06675e0 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,5 +1,4 @@ -// import { ReactNode, createContext, useEffect, useState } from "react"; -import { ParentComponent, createContext, createEffect, createSignal, onCleanup } from "solid-js"; +import { ParentComponent, createContext, createSignal, onCleanup } from "solid-js"; import { SQLSync } from "./sqlsync"; export const SQLSyncContext = createContext<[() => SQLSync | null, (sqlSync: SQLSync) => void]>([ @@ -20,12 +19,11 @@ export const createSqlSync = (props: Props): SQLSync => { export const SQLSyncProvider: ParentComponent = (props) => { const [sqlSync, setSQLSync] = createSignal(createSqlSync(props)); - createEffect(() => { - const sqlSync = createSqlSync(props); - setSQLSync(sqlSync); - onCleanup(() => { - sqlSync.close(); - }); + onCleanup(() => { + const s = sqlSync(); + if (s) { + s.close(); + } }); return ( From 44f4128ed67596634dc53f6b59fac44bddeff186 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:20:41 -0800 Subject: [PATCH 12/22] cleanup after rebasing onto reeact refactor --- lib/sqlsync-react/src/hooks.ts | 8 +- lib/sqlsync-solid-js/src/hooks.ts | 15 +- lib/sqlsync-solid-js/src/index.ts | 6 +- lib/sqlsync-solid-js/src/sql.ts | 42 ---- lib/sqlsync-solid-js/src/sqlsync.ts | 306 ---------------------------- lib/sqlsync-solid-js/src/util.ts | 63 ------ 6 files changed, 16 insertions(+), 424 deletions(-) delete mode 100644 lib/sqlsync-solid-js/src/sql.ts delete mode 100644 lib/sqlsync-solid-js/src/sqlsync.ts delete mode 100644 lib/sqlsync-solid-js/src/util.ts diff --git a/lib/sqlsync-react/src/hooks.ts b/lib/sqlsync-react/src/hooks.ts index a9a4e78..1dcc382 100644 --- a/lib/sqlsync-react/src/hooks.ts +++ b/lib/sqlsync-react/src/hooks.ts @@ -18,7 +18,7 @@ export function useSQLSync(): SQLSync { const value = useContext(SQLSyncContext); if (!value) { throw new Error( - "could not find sqlsync context value; please ensure the component is wrapped in a ", + "could not find sqlsync context value; please ensure the component is wrapped in a " ); } return value; @@ -43,7 +43,7 @@ export function createDocHooks(docType: DocType): DocHooks { const sqlsync = useSQLSync(); return useCallback( (mutation: M) => sqlsync.mutate(docId, docType, mutation), - [sqlsync, docId, docType], + [sqlsync, docId, docType] ); }; @@ -55,7 +55,7 @@ export function createDocHooks(docType: DocType): DocHooks { const sqlsync = useSQLSync(); return useCallback( (enabled: boolean) => sqlsync.setConnectionEnabled(docId, docType, enabled), - [sqlsync, docId, docType], + [sqlsync, docId, docType] ); }; @@ -74,7 +74,7 @@ export type QueryState = export function useQuery( docType: DocType, docId: DocId, - rawQuery: ParameterizedQuery | string, + rawQuery: ParameterizedQuery | string ): QueryState { const sqlsync = useSQLSync(); const [state, setState] = useState>({ state: "pending" }); diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index 1c86e2a..5d30388 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -1,9 +1,16 @@ -import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; +import { + ConnectionStatus, + DocId, + DocType, + ParameterizedQuery, + QuerySubscription, + Row, + SQLSync, + normalizeQuery, + pendingPromise, +} from "@orbitinghail/sqlsync-worker"; import { Accessor, createEffect, createSignal, onCleanup, useContext } from "solid-js"; import { SQLSyncContext } from "./context"; -import { ParameterizedQuery, normalizeQuery } from "./sql"; -import { DocType, QuerySubscription, Row, SQLSync } from "./sqlsync"; -import { pendingPromise } from "./util"; export function useSQLSync(): Accessor { const [sqlSync] = useContext(SQLSyncContext); diff --git a/lib/sqlsync-solid-js/src/index.ts b/lib/sqlsync-solid-js/src/index.ts index 44ca817..f91277f 100644 --- a/lib/sqlsync-solid-js/src/index.ts +++ b/lib/sqlsync-solid-js/src/index.ts @@ -1,10 +1,6 @@ import { SQLSyncProvider } from "./context"; import { createDocHooks, useConnectionStatus } from "./hooks"; -import { sql } from "./sql"; -import { DocType, Row } from "./sqlsync"; -import { serializeMutationAsJSON } from "./util"; -export { SQLSyncProvider, createDocHooks, serializeMutationAsJSON, sql, useConnectionStatus }; -export type { DocType, Row }; +export { SQLSyncProvider, createDocHooks, useConnectionStatus }; // eof: this file only exports diff --git a/lib/sqlsync-solid-js/src/sql.ts b/lib/sqlsync-solid-js/src/sql.ts deleted file mode 100644 index 195d712..0000000 --- a/lib/sqlsync-solid-js/src/sql.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { QueryKey, SqlValue } from "@orbitinghail/sqlsync-worker"; -import { base58 } from "@scure/base"; -import { sha256Digest } from "./util"; - -const UTF8_ENCODER = new TextEncoder(); - -export interface ParameterizedQuery { - sql: string; - params: SqlValue[]; -} - -export function normalizeQuery(query: ParameterizedQuery | string): ParameterizedQuery { - if (typeof query === "string") { - return { sql: query, params: [] }; - } - return query; -} - -/** - * Returns a parameterized query object with the given SQL string and parameters. - * This function should be used as a template literal tag. - * - * @example - * const query = sql`SELECT * FROM users WHERE id = ${userId}`; - * - * @param chunks - An array of string literals. - * @param params - An array of parameter values to be inserted into the SQL string. - * @returns A parameterized query object with the given SQL string and parameters. - */ -export function sql(chunks: readonly string[], ...params: SqlValue[]): ParameterizedQuery { - return { - sql: chunks.join("?"), - params, - }; -} - -export async function toQueryKey(query: ParameterizedQuery): Promise { - const queryJson = JSON.stringify([query.sql, query.params]); - const encoded = UTF8_ENCODER.encode(queryJson); - const hashed = await sha256Digest(encoded); - return base58.encode(new Uint8Array(hashed)); -} diff --git a/lib/sqlsync-solid-js/src/sqlsync.ts b/lib/sqlsync-solid-js/src/sqlsync.ts deleted file mode 100644 index 85ecbc0..0000000 --- a/lib/sqlsync-solid-js/src/sqlsync.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { - ConnectionStatus, - DocEvent, - DocId, - DocReply, - HandlerId, - QueryKey, - SqlValue, - WorkerRequest, - WorkerToHostMsg, - journalIdToString, -} from "@orbitinghail/sqlsync-worker"; -import { ParameterizedQuery, toQueryKey } from "./sql"; -import { NarrowTaggedEnum, OmitUnion, assertUnreachable, initWorker, toRows } from "./util"; - -export type Row = Record; - -export interface DocType { - readonly reducerUrl: string | URL; - readonly serializeMutation: (mutation: Mutation) => Uint8Array; -} - -type DocReplyTag = DocReply["tag"]; -type SelectDocReply = NarrowTaggedEnum; - -export interface QuerySubscription { - handleRows: (rows: Row[]) => void; - handleErr: (err: string) => void; -} - -const nextHandlerId = (() => { - let handlerId = 0; - return () => handlerId++; -})(); - -export class SQLSync { - #port: MessagePort; - #openDocs = new Set(); - #pendingOpens = new Map>(); - #msgHandlers = new Map void>(); - #querySubscriptions = new Map(); - #connectionStatus: ConnectionStatus = "disconnected"; - #connectionStatusListeners = new Set<(status: ConnectionStatus) => void>(); - - constructor(workerUrl: string | URL, wasmUrl: string | URL, coordinatorUrl?: string | URL) { - this.#msgHandlers = new Map(); - const port = initWorker(workerUrl); - this.#port = port; - - // We use a WeakRef here to avoid a circular reference between this.port and this. - // This allows the SQLSync object to be garbage collected when it is no longer needed. - const weakThis = new WeakRef(this); - this.#port.onmessage = (msg) => { - const thisRef = weakThis.deref(); - if (thisRef) { - thisRef.#handleMessage(msg); - } else { - console.log( - "sqlsync: dropping message; sqlsync object has been garbage collected", - msg.data - ); - // clean up the port - port.postMessage({ tag: "Close", handlerId: 0 }); - port.onmessage = null; - return; - } - }; - - this.#boot(wasmUrl.toString(), coordinatorUrl?.toString()).catch((err) => { - // TODO: expose this error to the app in a nicer way - // probably through some event handlers on the SQLSync object - console.error("sqlsync boot failed", err); - throw err; - }); - } - - close() { - this.#port.onmessage = null; - this.#port.postMessage({ tag: "Close", handlerId: 0 }); - } - - #handleMessage(event: MessageEvent) { - const msg = event.data as WorkerToHostMsg; - - if (msg.tag === "Reply") { - console.log("sqlsync: received reply", msg.handlerId, msg.reply); - const handler = this.#msgHandlers.get(msg.handlerId); - if (handler) { - handler(msg.reply); - } else { - console.error("sqlsync: no handler for message", msg); - throw new Error("no handler for message"); - } - } else if (msg.tag === "Event") { - this.#handleDocEvent(msg.docId, msg.evt); - } else { - assertUnreachable("unknown message", msg as never); - } - } - - #handleDocEvent(docId: DocId, evt: DocEvent) { - console.log(`sqlsync: doc ${journalIdToString(docId)} received event`, evt); - if (evt.tag === "ConnectionStatus") { - this.#connectionStatus = evt.status; - for (const listener of this.#connectionStatusListeners) { - listener(evt.status); - } - } else if (evt.tag === "SubscriptionChanged") { - const subscriptions = this.#querySubscriptions.get(evt.key); - if (subscriptions) { - for (const subscription of subscriptions) { - subscription.handleRows(toRows(evt.columns, evt.rows)); - } - } - } else if (evt.tag === "SubscriptionErr") { - const subscriptions = this.#querySubscriptions.get(evt.key); - if (subscriptions) { - for (const subscription of subscriptions) { - subscription.handleErr(evt.err); - } - } - } else { - assertUnreachable("unknown event", evt as never); - } - } - - #send>( - expectedReplyTag: T, - msg: OmitUnion - ): Promise> { - return new Promise((resolve, reject) => { - const handlerId = nextHandlerId(); - const req: WorkerRequest = { ...msg, handlerId }; - - console.log("sqlsync: sending message", req.handlerId, req.tag === "Doc" ? req.req : req); - - this.#msgHandlers.set(handlerId, (msg: DocReply) => { - this.#msgHandlers.delete(handlerId); - if (msg.tag === "Err") { - reject(msg.err); - } else if (msg.tag === expectedReplyTag) { - // TODO: is it possible to get Typescript to infer this cast? - resolve(msg as SelectDocReply); - } else { - console.warn("sqlsync: unexpected reply", msg); - reject(new Error(`expected ${expectedReplyTag} reply; got ${msg.tag}`)); - } - }); - - this.#port.postMessage(req); - }); - } - - async #boot(wasmUrl: string, coordinatorUrl?: string): Promise { - await this.#send("Ack", { - tag: "Boot", - wasmUrl, - coordinatorUrl, - }); - } - - async #open(docId: DocId, docType: DocType): Promise { - let openPromise = this.#pendingOpens.get(docId); - if (!openPromise) { - openPromise = this.#send("Ack", { - tag: "Doc", - docId, - req: { - tag: "Open", - reducerUrl: docType.reducerUrl.toString(), - }, - }); - this.#pendingOpens.set(docId, openPromise); - } - await openPromise; - this.#pendingOpens.delete(docId); - this.#openDocs.add(docId); - } - - async query( - docId: DocId, - docType: DocType, - sql: string, - params: SqlValue[] - ): Promise { - if (!this.#openDocs.has(docId)) { - await this.#open(docId, docType); - } - - const reply = await this.#send("RecordSet", { - tag: "Doc", - docId: docId, - req: { tag: "Query", sql, params }, - }); - - return toRows(reply.columns, reply.rows); - } - - async subscribe( - docId: DocId, - docType: DocType, - query: ParameterizedQuery, - subscription: QuerySubscription - ): Promise<() => void> { - if (!this.#openDocs.has(docId)) { - await this.#open(docId, docType); - } - const queryKey = await toQueryKey(query); - - // get or create subscription - let subscriptions = this.#querySubscriptions.get(queryKey); - if (!subscriptions) { - subscriptions = []; - this.#querySubscriptions.set(queryKey, subscriptions); - } - if (subscriptions.indexOf(subscription) === -1) { - subscriptions.push(subscription); - } else { - throw new Error("sqlsync: duplicate subscription"); - } - - // send subscribe request - await this.#send("Ack", { - tag: "Doc", - docId, - req: { tag: "QuerySubscribe", key: queryKey, sql: query.sql, params: query.params }, - }); - - // return unsubscribe function - return () => { - const subscriptions = this.#querySubscriptions.get(queryKey); - if (!subscriptions) { - // no subscriptions - return; - } - const idx = subscriptions.indexOf(subscription); - if (idx === -1) { - // no subscription - return; - } - subscriptions.splice(idx, 1); - - window.setTimeout(() => { - // we want to wait a tiny bit before sending finalizing the unsubscribe - // to handle the case that React resubscribes to the same query right away - this.#unsubscribeIfNeeded(docId, queryKey).catch((err) => { - console.error("sqlsync: error unsubscribing", err); - }); - }, 10); - }; - } - - async #unsubscribeIfNeeded(docId: DocId, queryKey: QueryKey): Promise { - const subscriptions = this.#querySubscriptions.get(queryKey); - if (Array.isArray(subscriptions) && subscriptions.length === 0) { - // query subscription is still registered but has no subscriptions on our side - // inform the worker that we are no longer interested in this query - this.#querySubscriptions.delete(queryKey); - - if (this.#openDocs.has(docId)) { - await this.#send("Ack", { - tag: "Doc", - docId, - req: { tag: "QueryUnsubscribe", key: queryKey }, - }); - } - } - } - - async mutate(docId: DocId, docType: DocType, mutation: M): Promise { - if (!this.#openDocs.has(docId)) { - await this.#open(docId, docType); - } - await this.#send("Ack", { - tag: "Doc", - docId, - req: { tag: "Mutate", mutation: docType.serializeMutation(mutation) }, - }); - } - - get connectionStatus(): ConnectionStatus { - return this.#connectionStatus; - } - - addConnectionStatusListener(listener: (status: ConnectionStatus) => void): () => void { - this.#connectionStatusListeners.add(listener); - return () => { - this.#connectionStatusListeners.delete(listener); - }; - } - - async setConnectionEnabled( - docId: DocId, - docType: DocType, - enabled: boolean - ): Promise { - if (!this.#openDocs.has(docId)) { - await this.#open(docId, docType); - } - await this.#send("Ack", { - tag: "Doc", - docId, - req: { tag: "SetConnectionEnabled", enabled }, - }); - } -} diff --git a/lib/sqlsync-solid-js/src/util.ts b/lib/sqlsync-solid-js/src/util.ts deleted file mode 100644 index 902a705..0000000 --- a/lib/sqlsync-solid-js/src/util.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { SqlValue } from "@orbitinghail/sqlsync-worker"; -import * as sha256 from "fast-sha256"; -import { Row } from "./sqlsync"; - -// omits the given keys from each member of the union -// https://stackoverflow.com/a/57103940/65872 -// biome-ignore lint/suspicious/noExplicitAny: any is required for this type magic to work -export type OmitUnion = T extends any ? Omit : never; - -export type NarrowTaggedEnum = E extends { tag: T } ? E : never; - -export function assertUnreachable(err: string, x: never): never { - throw new Error(`unreachable: ${err}; got ${JSON.stringify(x)}`); -} - -export function initWorker(workerUrl: string | URL): MessagePort { - const type: WorkerType = workerUrl.toString().endsWith(".cjs") ? "classic" : "module"; - - if (typeof SharedWorker !== "undefined") { - const worker = new SharedWorker(workerUrl, { type }); - return worker.port; - } - - const worker = new Worker(workerUrl, { type }); - // biome-ignore lint/suspicious/noExplicitAny: WebWorker extends MessagePort via duck typing - return worker as any as MessagePort; -} - -const UTF8Encoder = new TextEncoder(); -export const serializeMutationAsJSON = (mutation: M) => { - const serialized = JSON.stringify(mutation); - return UTF8Encoder.encode(serialized); -}; - -export function toRows(columns: string[], rows: SqlValue[][]): R[] { - const out: R[] = []; - for (const row of rows) { - const obj: Row = {}; - for (let i = 0; i < columns.length; i++) { - obj[columns[i]] = row[i]; - } - out.push(obj as R); - } - return out; -} - -export const pendingPromise = (): [Promise, (v: T) => void] => { - let resolve: (v: T) => void; - const promise = new Promise((r) => { - resolve = r; - }); - // biome-ignore lint/style/noNonNullAssertion: we know resolve is defined because the promise constructor runs syncronously - return [promise, resolve!]; -}; - -export const sha256Digest = async (data: Uint8Array): Promise => { - if (crypto?.subtle?.digest) { - const hash = await crypto.subtle.digest("SHA-256", data); - return new Uint8Array(hash); - } - - return Promise.resolve(sha256.hash(data)); -}; From a72e0c579342c6ee5dbbb9dc04914f74982cebb0 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:29:31 -0800 Subject: [PATCH 13/22] more cleanups and fixes --- lib/sqlsync-solid-js/index.html | 16 - lib/sqlsync-solid-js/src/context.tsx | 2 +- lib/sqlsync-solid-js/test/solid-sanity.html | 12 - lib/sqlsync-solid-js/test/solid-sanity.tsx | 107 -- pnpm-lock.yaml | 1637 ++++++++++++++++++- 5 files changed, 1570 insertions(+), 204 deletions(-) delete mode 100644 lib/sqlsync-solid-js/index.html delete mode 100644 lib/sqlsync-solid-js/test/solid-sanity.html delete mode 100644 lib/sqlsync-solid-js/test/solid-sanity.tsx diff --git a/lib/sqlsync-solid-js/index.html b/lib/sqlsync-solid-js/index.html deleted file mode 100644 index 4fb2a86..0000000 --- a/lib/sqlsync-solid-js/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - sqlsync-react tests index - - - - - - - \ No newline at end of file diff --git a/lib/sqlsync-solid-js/src/context.tsx b/lib/sqlsync-solid-js/src/context.tsx index 06675e0..c5eadf8 100644 --- a/lib/sqlsync-solid-js/src/context.tsx +++ b/lib/sqlsync-solid-js/src/context.tsx @@ -1,5 +1,5 @@ +import { SQLSync } from "@orbitinghail/sqlsync-worker"; import { ParentComponent, createContext, createSignal, onCleanup } from "solid-js"; -import { SQLSync } from "./sqlsync"; export const SQLSyncContext = createContext<[() => SQLSync | null, (sqlSync: SQLSync) => void]>([ () => null, diff --git a/lib/sqlsync-solid-js/test/solid-sanity.html b/lib/sqlsync-solid-js/test/solid-sanity.html deleted file mode 100644 index 74c12f0..0000000 --- a/lib/sqlsync-solid-js/test/solid-sanity.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - sqlsync-solid-js tests - - -
if nothing renders, open the console
- - - diff --git a/lib/sqlsync-solid-js/test/solid-sanity.tsx b/lib/sqlsync-solid-js/test/solid-sanity.tsx deleted file mode 100644 index 534cd47..0000000 --- a/lib/sqlsync-solid-js/test/solid-sanity.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { JournalId, journalIdFromString } from "@orbitinghail/sqlsync-worker"; -import sqlSyncWasmUrl from "@orbitinghail/sqlsync-worker/sqlsync.wasm?url"; -import workerUrl from "@orbitinghail/sqlsync-worker/worker.ts?url"; -import { Match, Switch, createEffect } from "solid-js"; -import { createSignal } from "solid-js/types/server/reactive.js"; -import { render } from "solid-js/web"; -import { SQLSyncProvider } from "../src"; -import { createDocHooks } from "../src/hooks"; -import { sql } from "../src/sql"; -import { DocType } from "../src/sqlsync"; -import { serializeMutationAsJSON } from "../src/util"; - -const DEMO_REDUCER_URL = new URL( - "../../../target/wasm32-unknown-unknown/debug/sqlsync_react_test_reducer.wasm", - import.meta.url -); - -const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); - -type CounterOps = - | { - tag: "InitSchema"; - } - | { - tag: "Incr"; - value: number; - } - | { - tag: "Decr"; - value: number; - }; - -const CounterDocType: DocType = { - reducerUrl: DEMO_REDUCER_URL, - serializeMutation: serializeMutationAsJSON, -}; - -const [counterDocType, _setCounterDocType] = createSignal(CounterDocType); - -const { useMutate, useQuery } = createDocHooks(counterDocType); - -render( - () => ( - - - - ), - document.getElementById("root")! -); - -// @ts-ignore -function App({ docId }: { docId: JournalId }) { - const mutate = useMutate(docId); - - createEffect(() => { - mutate({ tag: "InitSchema" }).catch((err) => { - console.error("Failed to init schema", err); - }); - }); - - const handleIncr = () => { - mutate({ tag: "Incr", value: 1 }).catch((err) => { - console.error("Failed to incr", err); - }); - }; - - const handleDecr = () => { - mutate({ tag: "Decr", value: 1 }).catch((err) => { - console.error("Failed to decr", err); - }); - }; - - const query = useQuery<{ value: number }>( - () => docId, - () => sql`select value, 'hi', 1.23, ${"foo"} as s from counter` - ); - - return ( - <> -

sqlsync-react sanity test

-

- This is a sanity test for sqlsync-react. It should display a counter that can be incremented - and decremented. -

-

The counter is stored in a SQL database, and the state is managed by sqlsync-react.

-

- - -

- - -
Loading...
-
- -
{(query() as any).error.message}
-
- -
{query().rows?.[0]?.value.toString()}
-
-
- - ); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95f1734..80e20e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,38 +132,7 @@ importers: version: 5.2.2 vite: specifier: ^5.0.8 - version: 5.0.10 - - examples/simple-counter-react: - dependencies: - '@orbitinghail/sqlsync-react': - specifier: workspace:* - version: link:../../lib/sqlsync-react - '@orbitinghail/sqlsync-worker': - specifier: workspace:* - version: link:../../lib/sqlsync-worker - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@types/react': - specifier: ^18.2.43 - version: 18.2.46 - '@types/react-dom': - specifier: ^18.2.17 - version: 18.2.18 - '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.2.1(vite@5.0.10) - typescript: - specifier: ^5.2.2 - version: 5.2.2 - vite: - specifier: ^5.0.8 - version: 5.0.10 + version: 5.0.10(@types/node@20.8.8) lib/sqlsync-react: dependencies: @@ -202,6 +171,52 @@ importers: specifier: ^5.2.2 version: 5.2.2 + lib/sqlsync-solid-js: + dependencies: + '@orbitinghail/sqlsync-worker': + specifier: 0.2.0 + version: link:../sqlsync-worker + '@scure/base': + specifier: ^1.1.3 + version: 1.1.3 + fast-equals: + specifier: ^5.0.1 + version: 5.0.1 + fast-sha256: + specifier: ^1.3.0 + version: 1.3.0 + solid-js: + specifier: ^1.8.7 + version: 1.8.8 + devDependencies: + '@solidjs/testing-library': + specifier: ^0.8.4 + version: 0.8.5(@solidjs/router@0.10.6)(solid-js@1.8.8) + '@testing-library/jest-dom': + specifier: ^6.1.3 + version: 6.2.0(vitest@0.34.6) + '@types/node': + specifier: ^20.8.8 + version: 20.8.8 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + vite: + specifier: ^4.5.0 + version: 4.5.0(@types/node@20.8.8) + vite-plugin-dts: + specifier: ^3.6.1 + version: 3.7.0(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0) + vite-plugin-solid: + specifier: ^2.7.0 + version: 2.8.0(solid-js@1.8.8)(vite@4.5.0) + vite-tsconfig-paths: + specifier: ^4.2.1 + version: 4.2.3(typescript@5.2.2)(vite@4.5.0) + vitest: + specifier: ^0.34.6 + version: 0.34.6 + lib/sqlsync-worker: dependencies: '@scure/base': @@ -232,6 +247,10 @@ importers: packages: + /@adobe/css-tools@4.3.2: + resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} + dev: true + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -332,6 +351,13 @@ packages: jsesc: 2.5.2 dev: true + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} @@ -354,6 +380,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -374,6 +418,20 @@ packages: '@babel/types': 7.23.4 dev: true + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} @@ -409,11 +467,30 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} @@ -421,6 +498,13 @@ packages: '@babel/types': 7.23.4 dev: true + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -504,6 +588,38 @@ packages: '@babel/types': 7.23.6 dev: true + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} @@ -544,12 +660,38 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) + dev: true + /@babel/runtime@7.23.2: resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - dev: false /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} @@ -1400,6 +1542,13 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1484,6 +1633,49 @@ packages: react: 18.2.0 dev: false + /@microsoft/api-extractor-model@7.28.3(@types/node@20.8.8): + resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.8.8) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.39.0(@types/node@20.8.8): + resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.8.8) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.8.8) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1581,6 +1773,20 @@ packages: rollup: 3.29.4 dev: true + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.3 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/rollup-android-arm-eabi@4.9.2: resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==} cpu: [arm] @@ -1685,10 +1891,68 @@ packages: dev: true optional: true + /@rushstack/node-core-library@3.62.0(@types/node@20.8.8): + resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.8.8 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.5.1: + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + /@scure/base@1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} dev: false + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@solidjs/router@0.10.6(solid-js@1.8.8): + resolution: {integrity: sha512-PiJO/wsAh0+0mmAIw/+gGgZa0xeMzKGrITWvBfNQ0wiAwNzOF/T0Bm10uhyaWdxPu9td0xK2LuMnC//4CXqnyA==} + peerDependencies: + solid-js: ^1.8.6 + dependencies: + solid-js: 1.8.8 + dev: true + + /@solidjs/testing-library@0.8.5(@solidjs/router@0.10.6)(solid-js@1.8.8): + resolution: {integrity: sha512-L9TowCoqdRQGB8ikODh9uHXrYTjCUZseVUG0tIVa836//qeSqXP4m0BKG66v9Zp1y1wRxok5qUW97GwrtEBMcw==} + engines: {node: '>= 14'} + peerDependencies: + '@solidjs/router': '>=0.6.0' + solid-js: '>=1.0.0' + dependencies: + '@solidjs/router': 0.10.6(solid-js@1.8.8) + '@testing-library/dom': 9.3.3 + solid-js: 1.8.8 + dev: true + /@tabler/icons-react@2.39.0(react@18.2.0): resolution: {integrity: sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==} peerDependencies: @@ -1703,6 +1967,57 @@ packages: resolution: {integrity: sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==} dev: false + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom@6.2.0(vitest@0.34.6): + resolution: {integrity: sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.2 + '@babel/runtime': 7.23.2 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + vitest: 0.34.6 + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + /@types/babel__core@7.20.3: resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: @@ -1742,6 +2057,16 @@ packages: '@babel/types': 7.23.4 dev: true + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.11 + dev: true + + /@types/chai@4.3.11: + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + dev: true + /@types/estree@1.0.3: resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} dev: true @@ -1824,53 +2149,206 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.0.10 + vite: 5.0.10(@types/node@20.8.8) transitivePeerDependencies: - supports-color dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.3.10 dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.1 dev: true - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} dependencies: - color-convert: 1.9.3 + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 dev: true - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + tinyspy: 2.2.0 dev: true - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} dependencies: - tslib: 2.6.2 - dev: false + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} dependencies: - printable-characters: 1.0.42 + '@volar/source-map': 1.11.1 dev: true - /autoprefixer@10.4.16(postcss@8.4.31): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true + + /@vue/compiler-core@3.4.5: + resolution: {integrity: sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.4.5 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom@3.4.5: + resolution: {integrity: sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==} + dependencies: + '@vue/compiler-core': 3.4.5 + '@vue/shared': 3.4.5 + dev: true + + /@vue/language-core@1.8.27(typescript@5.2.2): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.5 + '@vue/shared': 3.4.5 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.2.2 + vue-template-compiler: 2.7.16 + dev: true + + /@vue/shared@3.4.5: + resolution: {integrity: sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.3 + dev: true + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 @@ -1884,6 +2362,33 @@ packages: postcss-value-parser: 4.2.0 dev: true + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /babel-plugin-jsx-dom-expressions@0.37.11(@babel/core@7.23.7): + resolution: {integrity: sha512-0NaWy4sFsE0AWlucvL/myEiZ851BgjeLwhtctOFmyVCK6fPXqQHQUBB5SrrrmvOiw/BZCmMe8dOy7JL3FSyTtQ==} + peerDependencies: + '@babel/core': ^7.20.12 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + html-entities: 2.3.3 + validate-html-nesting: 1.2.2 + dev: true + + /babel-preset-solid@1.8.8(@babel/core@7.23.7): + resolution: {integrity: sha512-m+sFxzriUgMiyUPz/oWxU+N6PwY2bVsZVlc4Jxx+5XhDt5lGE/meg+ZL/kLgSAZ75YuU9AJZr444Un1bO0vhJQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + babel-plugin-jsx-dom-expressions: 0.37.11(@babel/core@7.23.7) + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1941,6 +2446,19 @@ packages: engines: {node: '>=6'} dev: true + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -1963,6 +2481,19 @@ packages: - supports-color dev: true + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1972,6 +2503,28 @@ packages: supports-color: 5.5.0 dev: true + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1998,14 +2551,41 @@ packages: color-name: 1.1.3 dev: true + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + optional: true + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true @@ -2015,6 +2595,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2028,6 +2612,10 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} dev: true + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2040,15 +2628,82 @@ packages: ms: 2.1.2 dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.2 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true + /electron-to-chromium@1.4.565: resolution: {integrity: sha512-XbMoT6yIvg2xzcbs5hCADi0dXBh4//En3oFXmtPX+jiyyiCTiM9DGFT2SLottjpEs9Z8Mh8SqahbR96MaHfuSg==} dev: true @@ -2057,6 +2712,25 @@ packages: resolution: {integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==} dev: true + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -2178,7 +2852,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false /fast-equals@5.0.1: resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} @@ -2196,6 +2869,10 @@ packages: micromatch: 4.0.5 dev: true + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + /fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} dev: false @@ -2213,10 +2890,25 @@ packages: to-regex-range: 5.0.1 dev: true + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2233,11 +2925,28 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -2281,11 +2990,57 @@ packages: engines: {node: '>=4'} dev: true + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -2293,11 +3048,30 @@ packages: function-bind: 1.1.2 dev: true + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + /highlight.js@11.9.0: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} dev: false + /html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -2309,12 +3083,43 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: false + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -2322,6 +3127,14 @@ packages: binary-extensions: 2.2.0 dev: true + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -2329,12 +3142,24 @@ packages: builtin-modules: 3.3.0 dev: true + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 dev: true + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2347,10 +3172,21 @@ packages: is-extglob: 2.1.1 dev: true + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2362,6 +3198,69 @@ packages: '@types/estree': 1.0.3 dev: true + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2371,17 +3270,52 @@ packages: hasBin: true dev: true + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} dev: false + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2389,12 +3323,30 @@ packages: js-tokens: 4.0.0 dev: false + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -2408,6 +3360,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2427,6 +3386,11 @@ packages: hasBin: true dev: true + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + /miniflare@3.20231016.0: resolution: {integrity: sha512-AmlqI89zsnBJfC+nKKZdCB/fuu0q/br24Kqt9NZwcT6yJEpO5NytNKfjl6nJROHROwuJSRQR1T3yopCtG1/0DA==} engines: {node: '>=16.13'} @@ -2449,17 +3413,37 @@ packages: - utf-8-validate dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: - brace-expansion: 2.0.1 + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.2 dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -2505,12 +3489,50 @@ packages: engines: {node: '>=0.10.0'} dev: false + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -2519,6 +3541,14 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -2528,6 +3558,14 @@ packages: engines: {node: '>=8.6'} dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: true + /postcss-js@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -2610,6 +3648,24 @@ packages: source-map-js: 1.0.2 dev: true + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} dev: true @@ -2622,6 +3678,11 @@ packages: react-is: 16.13.1 dev: false + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + /qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} dev: false @@ -2653,6 +3714,14 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /react-number-format@5.3.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==} peerDependencies: @@ -2786,9 +3855,32 @@ packages: picomatch: 2.3.1 dev: true + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} @@ -2878,6 +3970,66 @@ packages: hasBin: true dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /seroval@1.0.2: + resolution: {integrity: sha512-buswWxRzf65ZGUk8MAf3qVtBJHbe5gq6hZyPeqlJCKEIl/tEhUZze0YJg7vB7tFRGgPeneRaP083OB/vDiYLvA==} + engines: {node: '>=10'} + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /solid-js@1.8.8: + resolution: {integrity: sha512-9CtL5xWTYX1WWjQKqht3Tl0AJzgz4YWVQk8hoscO9TzRCgzlpAauEOexXa6bPG30W+fWLnFVE7XUiAzQFNeUKw==} + dependencies: + csstype: 3.1.2 + seroval: 1.0.2 + + /solid-refresh@0.5.3(solid-js@1.8.8): + resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} + peerDependencies: + solid-js: ^1.3 + dependencies: + '@babel/generator': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/types': 7.23.6 + solid-js: 1.8.8 + dev: true + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -2900,6 +4052,14 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} dependencies: @@ -2907,11 +4067,45 @@ packages: get-source: 2.0.12 dev: true + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.6 + dev: true + /stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} dev: true + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + /sugarss@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} @@ -2928,6 +4122,13 @@ packages: has-flag: 3.0.0 dev: true + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2937,6 +4138,20 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false + /tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + dev: true + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -2949,9 +4164,27 @@ packages: is-number: 7.0.0 dev: true + /tsconfck@2.1.2(typescript@5.2.2): + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.2.2 + dev: true + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} @@ -2963,6 +4196,16 @@ packages: hasBin: true dev: true + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + /undici-types@5.25.3: resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} dev: true @@ -2974,6 +4217,11 @@ packages: '@fastify/busboy': 2.0.0 dev: true + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -2996,6 +4244,12 @@ packages: picocolors: 1.0.0 dev: true + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} @@ -3071,6 +4325,97 @@ packages: hasBin: true dev: false + /validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + + /vite-node@0.34.6(@types/node@20.8.8): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.2 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 5.0.10(@types/node@20.8.8) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-dts@3.7.0(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0): + resolution: {integrity: sha512-np1uPaYzu98AtPReB8zkMnbjwcNHOABsLhqVOf81b3ol9b5M2wPcAVs8oqPnOpr6Us+7yDXVauwkxsk5+ldmRA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.39.0(@types/node@20.8.8) + '@rollup/pluginutils': 5.1.0 + '@vue/language-core': 1.8.27(typescript@5.2.2) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.2.2 + vite: 4.5.0(@types/node@20.8.8) + vue-tsc: 1.8.27(typescript@5.2.2) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite-plugin-solid@2.8.0(solid-js@1.8.8)(vite@4.5.0): + resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} + peerDependencies: + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.8.8(@babel/core@7.23.7) + merge-anything: 5.1.7 + solid-js: 1.8.8 + solid-refresh: 0.5.3(solid-js@1.8.8) + vite: 4.5.0(@types/node@20.8.8) + vitefu: 0.2.5(vite@4.5.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-tsconfig-paths@4.2.3(typescript@5.2.2)(vite@4.5.0): + resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2(typescript@5.2.2) + vite: 4.5.0(@types/node@20.8.8) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /vite@4.5.0(@types/node@20.8.8): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3107,7 +4452,7 @@ packages: fsevents: 2.3.3 dev: true - /vite@5.0.10: + /vite@5.0.10(@types/node@20.8.8): resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -3135,6 +4480,7 @@ packages: terser: optional: true dependencies: + '@types/node': 20.8.8 esbuild: 0.19.11 postcss: 8.4.32 rollup: 4.9.2 @@ -3142,6 +4488,140 @@ packages: fsevents: 2.3.3 dev: true + /vitefu@0.2.5(vite@4.5.0): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.5.0(@types/node@20.8.8) + dev: true + + /vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.11 + '@types/chai-subset': 1.3.5 + '@types/node': 20.8.8 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.10 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.5 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.7.0 + vite: 5.0.10(@types/node@20.8.8) + vite-node: 0.34.6(@types/node@20.8.8) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.27(typescript@5.2.2): + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.2.2) + semver: 7.5.4 + typescript: 5.2.2 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /workerd@1.20231016.0: resolution: {integrity: sha512-v2GDb5XitSqgub/xm7EWHVAlAK4snxQu3itdMQxXstGtUG9hl79fQbXS/8fNFbmms2R2bAxUwSv47q8k5T5Erw==} engines: {node: '>=16'} @@ -3206,6 +4686,15 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /youch@3.3.2: resolution: {integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==} dependencies: @@ -3214,6 +4703,18 @@ packages: stacktracey: 2.1.8 dev: true + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true + /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: true From d9555b6c3978f20042ee88b7cc358c205803eebc Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Fri, 5 Jan 2024 19:50:49 -0800 Subject: [PATCH 14/22] add solid js guestbook --- examples/guestbook-solid-js/README.md | 3 + examples/guestbook-solid-js/index.html | 15 +++ examples/guestbook-solid-js/package.json | 24 ++++ examples/guestbook-solid-js/src/doctype.ts | 29 +++++ examples/guestbook-solid-js/src/main.tsx | 114 ++++++++++++++++++ examples/guestbook-solid-js/tsconfig.json | 27 +++++ .../guestbook-solid-js/tsconfig.node.json | 10 ++ examples/guestbook-solid-js/vite.config.ts | 7 ++ justfile | 3 + pnpm-lock.yaml | 70 ++++++++++- pnpm-workspace.yaml | 1 + 11 files changed, 301 insertions(+), 2 deletions(-) create mode 100644 examples/guestbook-solid-js/README.md create mode 100644 examples/guestbook-solid-js/index.html create mode 100644 examples/guestbook-solid-js/package.json create mode 100644 examples/guestbook-solid-js/src/doctype.ts create mode 100644 examples/guestbook-solid-js/src/main.tsx create mode 100644 examples/guestbook-solid-js/tsconfig.json create mode 100644 examples/guestbook-solid-js/tsconfig.node.json create mode 100644 examples/guestbook-solid-js/vite.config.ts diff --git a/examples/guestbook-solid-js/README.md b/examples/guestbook-solid-js/README.md new file mode 100644 index 0000000..ecef389 --- /dev/null +++ b/examples/guestbook-solid-js/README.md @@ -0,0 +1,3 @@ +# Solid JS + TypeScript + Vite + SQLSync + +This template provides a minimal setup to get SQLSync working with Solid JS and Vite. diff --git a/examples/guestbook-solid-js/index.html b/examples/guestbook-solid-js/index.html new file mode 100644 index 0000000..74ce165 --- /dev/null +++ b/examples/guestbook-solid-js/index.html @@ -0,0 +1,15 @@ + + + + + + + SQLSync + Vite + Solid JS + TS + + + +
if nothing renders, open the console
+ + + + \ No newline at end of file diff --git a/examples/guestbook-solid-js/package.json b/examples/guestbook-solid-js/package.json new file mode 100644 index 0000000..ced4a85 --- /dev/null +++ b/examples/guestbook-solid-js/package.json @@ -0,0 +1,24 @@ +{ + "name": "guestbook-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@orbitinghail/sqlsync-solid-js": "workspace:*", + "@orbitinghail/sqlsync-worker": "workspace:*", + "uuid": "^9.0.1", + "solid-js": "^1.8.7" + }, + "devDependencies": { + "@types/uuid": "^9.0.6", + "vite-plugin-solid": "^2.7.0", + "typescript": "^5.2.2", + "vite": "^4.5.0", + "vitest": "^0.34.6" + } +} diff --git a/examples/guestbook-solid-js/src/doctype.ts b/examples/guestbook-solid-js/src/doctype.ts new file mode 100644 index 0000000..426b3f6 --- /dev/null +++ b/examples/guestbook-solid-js/src/doctype.ts @@ -0,0 +1,29 @@ +import { createDocHooks } from "@orbitinghail/sqlsync-solid-js"; +import { DocType, serializeMutationAsJSON } from "@orbitinghail/sqlsync-worker"; + +const REDUCER_URL = new URL( + "../../../target/wasm32-unknown-unknown/release/reducer_guestbook.wasm", + import.meta.url +); + +// Must match the Mutation type in the Rust Reducer code +export type Mutation = + | { + tag: "InitSchema"; + } + | { + tag: "AddMessage"; + id: string; + msg: string; + } + | { + tag: "DeleteMessage"; + id: string; + }; + +export const TaskDocType: DocType = { + reducerUrl: REDUCER_URL, + serializeMutation: serializeMutationAsJSON, +}; + +export const { useMutate, useQuery, useSetConnectionEnabled } = createDocHooks(() => TaskDocType); diff --git a/examples/guestbook-solid-js/src/main.tsx b/examples/guestbook-solid-js/src/main.tsx new file mode 100644 index 0000000..d8677dd --- /dev/null +++ b/examples/guestbook-solid-js/src/main.tsx @@ -0,0 +1,114 @@ +import { SQLSyncProvider } from "@orbitinghail/sqlsync-solid-js"; +import { journalIdFromString, sql } from "@orbitinghail/sqlsync-worker"; + +// this example uses the uuid library (`npm install uuid`) +import { JSX } from "solid-js/jsx-runtime"; +import { v4 as uuidv4 } from "uuid"; + +// You'll need to configure your build system to make these entrypoints +// available as urls. Vite does this automatically via the `?url` and `?worker&url` suffix. +import sqlSyncWasmUrl from "@orbitinghail/sqlsync-worker/sqlsync.wasm?url"; +import workerUrl from "@orbitinghail/sqlsync-worker/worker.ts?worker&url"; + +import { createEffect, createSignal } from "solid-js"; +import { For, render } from "solid-js/web"; +import { useMutate, useQuery } from "./doctype"; + +// Create a DOC_ID to use, each DOC_ID will correspond to a different SQLite +// database. We use a static doc id so we can play with cross-tab sync. +const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); + +// Use SQLSync hooks in your app +export function App() { + // we will use the standard useState hook to handle the message input box + const [msg, setMsg] = createSignal(""); + + // create a mutate function for our document + const mutate = useMutate(DOC_ID); + + // initialize the schema; eventually this will be handled by SQLSync automatically + createEffect(() => { + mutate({ tag: "InitSchema" }).catch((err) => { + console.error("Failed to init schema", err); + }); + }); + + // create a callback which knows how to trigger the add message mutation + const handleSubmit: JSX.EventHandler = (e) => { + // Prevent the browser from reloading the page + e.preventDefault(); + + // create a unique message id + const id = crypto.randomUUID ? crypto.randomUUID() : uuidv4(); + + // don't add empty messages + if (msg().trim() !== "") { + mutate({ tag: "AddMessage", id, msg: msg() }).catch((err) => { + console.error("Failed to add message", err); + }); + // clear the message + setMsg(""); + } + }; + + // create a callback to delete a message + const handleDelete = (id: string) => { + mutate({ tag: "DeleteMessage", id }).catch((err) => { + console.error("Failed to delete message", err); + }); + }; + + // finally, query SQLSync for all the messages, sorted by created_at + const queryState = useQuery<{ id: string; msg: string }>( + () => DOC_ID, + () => sql` + select id, msg from messages + order by created_at + ` + ); + + const rows = () => queryState().rows ?? []; + + return ( +
+

Guestbook:

+
    + + {(row) => { + return ( +
  • + {row.msg} + +
  • + ); + }} +
    +
+

Leave a message:

+
+ + +
+
+ ); +} + +// Configure the SQLSync provider near the top of the React tree +// biome-ignore lint/style/noNonNullAssertion: we know this element exists +render( + () => ( + + + + ), + document.getElementById("root")! +); diff --git a/examples/guestbook-solid-js/tsconfig.json b/examples/guestbook-solid-js/tsconfig.json new file mode 100644 index 0000000..d5f246b --- /dev/null +++ b/examples/guestbook-solid-js/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "ES2021.WeakRef", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "types": ["vite/client"], + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/guestbook-solid-js/tsconfig.node.json b/examples/guestbook-solid-js/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/examples/guestbook-solid-js/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/guestbook-solid-js/vite.config.ts b/examples/guestbook-solid-js/vite.config.ts new file mode 100644 index 0000000..e76f7d8 --- /dev/null +++ b/examples/guestbook-solid-js/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import solid from "vite-plugin-solid"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [solid()], +}); diff --git a/justfile b/justfile index 670a197..e10180e 100644 --- a/justfile +++ b/justfile @@ -44,6 +44,9 @@ wasm-examples-reducer-guestbook: example-guestbook-react: wasm-examples-reducer-guestbook cd examples/guestbook-react && pnpm dev +example-guestbook-solid-js: wasm-examples-reducer-guestbook + cd examples/guestbook-solid-js && pnpm dev + test-end-to-end-local rng_seed="": wasm-task-reducer RUST_BACKTRACE=1 cargo run --example end-to-end-local {{rng_seed}} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80e20e3..b08066a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,6 +134,37 @@ importers: specifier: ^5.0.8 version: 5.0.10(@types/node@20.8.8) + examples/guestbook-solid-js: + dependencies: + '@orbitinghail/sqlsync-solid-js': + specifier: workspace:* + version: link:../../lib/sqlsync-solid-js + '@orbitinghail/sqlsync-worker': + specifier: workspace:* + version: link:../../lib/sqlsync-worker + solid-js: + specifier: ^1.8.7 + version: 1.8.8 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@types/uuid': + specifier: ^9.0.6 + version: 9.0.6 + typescript: + specifier: ^5.2.2 + version: 5.3.3 + vite: + specifier: ^4.5.0 + version: 4.5.0 + vite-plugin-solid: + specifier: ^2.7.0 + version: 2.8.0(solid-js@1.8.8)(vite@4.5.0) + vitest: + specifier: ^0.34.6 + version: 0.34.6 + lib/sqlsync-react: dependencies: fast-equals: @@ -4393,7 +4424,7 @@ packages: merge-anything: 5.1.7 solid-js: 1.8.8 solid-refresh: 0.5.3(solid-js@1.8.8) - vite: 4.5.0(@types/node@20.8.8) + vite: 4.5.0 vitefu: 0.2.5(vite@4.5.0) transitivePeerDependencies: - supports-color @@ -4416,6 +4447,41 @@ packages: - typescript dev: true + /vite@4.5.0: + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.32 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vite@4.5.0(@types/node@20.8.8): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4496,7 +4562,7 @@ packages: vite: optional: true dependencies: - vite: 4.5.0(@types/node@20.8.8) + vite: 4.5.0 dev: true /vitest@0.34.6: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a0455a0..ef64e81 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,3 +5,4 @@ packages: - "lib/sqlsync-solid-js" - "lib/sqlsync-worker" - "examples/guestbook-react" + - "examples/guestbook-solid-js" From c336448fd4e63aa42afad7a3f8e181d565a4b2de Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Fri, 5 Jan 2024 19:54:57 -0800 Subject: [PATCH 15/22] revert react changes --- lib/sqlsync-react/src/hooks.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/sqlsync-react/src/hooks.ts b/lib/sqlsync-react/src/hooks.ts index 1dcc382..a9a4e78 100644 --- a/lib/sqlsync-react/src/hooks.ts +++ b/lib/sqlsync-react/src/hooks.ts @@ -18,7 +18,7 @@ export function useSQLSync(): SQLSync { const value = useContext(SQLSyncContext); if (!value) { throw new Error( - "could not find sqlsync context value; please ensure the component is wrapped in a " + "could not find sqlsync context value; please ensure the component is wrapped in a ", ); } return value; @@ -43,7 +43,7 @@ export function createDocHooks(docType: DocType): DocHooks { const sqlsync = useSQLSync(); return useCallback( (mutation: M) => sqlsync.mutate(docId, docType, mutation), - [sqlsync, docId, docType] + [sqlsync, docId, docType], ); }; @@ -55,7 +55,7 @@ export function createDocHooks(docType: DocType): DocHooks { const sqlsync = useSQLSync(); return useCallback( (enabled: boolean) => sqlsync.setConnectionEnabled(docId, docType, enabled), - [sqlsync, docId, docType] + [sqlsync, docId, docType], ); }; @@ -74,7 +74,7 @@ export type QueryState = export function useQuery( docType: DocType, docId: DocId, - rawQuery: ParameterizedQuery | string + rawQuery: ParameterizedQuery | string, ): QueryState { const sqlsync = useSQLSync(); const [state, setState] = useState>({ state: "pending" }); From 0333e03a9ebabed9df92e5a768588a37baec7180 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Fri, 5 Jan 2024 19:59:41 -0800 Subject: [PATCH 16/22] wip: remove reducer --- .../sqlsync-solid-js-test-reducer/Cargo.toml | 14 ----- .../sqlsync-solid-js-test-reducer/src/lib.rs | 53 ------------------- 2 files changed, 67 deletions(-) delete mode 100644 lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml delete mode 100644 lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs diff --git a/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml b/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml deleted file mode 100644 index fd36407..0000000 --- a/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "sqlsync-react-test-reducer" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -sqlsync-reducer = { path = "../../sqlsync-reducer" } -serde = { version = "1.0.171", features = ["derive"] } -serde_json = "1.0.105" -log = "0.4.20" -futures = "0.3.28" diff --git a/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs b/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs deleted file mode 100644 index 2dbcdfd..0000000 --- a/lib/sqlsync-solid-js/sqlsync-solid-js-test-reducer/src/lib.rs +++ /dev/null @@ -1,53 +0,0 @@ -// build: "cargo build --target wasm32-unknown-unknown -p counter-reducer" -use serde::{Deserialize, Serialize}; -use sqlsync_reducer::{execute, init_reducer, types::ReducerError}; - -#[derive(Serialize, Deserialize, Debug)] -#[serde(tag = "tag")] -enum Mutation { - InitSchema, - Incr { value: i32 }, - Decr { value: i32 }, -} - -init_reducer!(reducer); -async fn reducer(mutation: Vec) -> Result<(), ReducerError> { - let mutation: Mutation = serde_json::from_slice(&mutation[..])?; - - match mutation { - Mutation::InitSchema => { - let create_table = execute!( - "CREATE TABLE IF NOT EXISTS counter ( - id INTEGER PRIMARY KEY, - value INTEGER - )" - ); - let init_counter = execute!( - "INSERT OR IGNORE INTO counter (id, value) VALUES (0, 0)" - ); - - create_table.await?; - init_counter.await?; - } - - Mutation::Incr { value } => { - execute!( - "INSERT INTO counter (id, value) VALUES (0, 0) - ON CONFLICT (id) DO UPDATE SET value = value + ?", - value - ) - .await?; - } - - Mutation::Decr { value } => { - execute!( - "INSERT INTO counter (id, value) VALUES (0, 0) - ON CONFLICT (id) DO UPDATE SET value = value - ?", - value - ) - .await?; - } - } - - Ok(()) -} From 3d18fbd8a551561fe787ecbe8f779b0e2b774482 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:34:14 -0800 Subject: [PATCH 17/22] move from vite to rollup --- lib/sqlsync-react/tsconfig.json | 3 +- lib/sqlsync-solid-js/package.json | 16 +- lib/sqlsync-solid-js/rollup.config.js | 23 + lib/sqlsync-solid-js/src/hooks.ts | 17 +- lib/sqlsync-solid-js/tsconfig.json | 25 +- lib/sqlsync-solid-js/tsconfig.node.json | 12 - lib/sqlsync-solid-js/vite.config.ts | 32 - pnpm-lock.yaml | 1004 +---------------------- 8 files changed, 80 insertions(+), 1052 deletions(-) create mode 100644 lib/sqlsync-solid-js/rollup.config.js delete mode 100644 lib/sqlsync-solid-js/tsconfig.node.json delete mode 100644 lib/sqlsync-solid-js/vite.config.ts diff --git a/lib/sqlsync-react/tsconfig.json b/lib/sqlsync-react/tsconfig.json index 56a3e59..7592ab3 100644 --- a/lib/sqlsync-react/tsconfig.json +++ b/lib/sqlsync-react/tsconfig.json @@ -3,8 +3,7 @@ "target": "esnext", "module": "esnext", "moduleResolution": "Bundler", - "baseUrl": ".", - "lib": ["ES6", "DOM", "ES2021.WeakRef"], + "lib": ["ES6", "DOM", "DOM.Iterable", "ES2021.WeakRef"], /* Compiling */ "allowJs": true, diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json index 95b2c2c..e0752f1 100644 --- a/lib/sqlsync-solid-js/package.json +++ b/lib/sqlsync-solid-js/package.json @@ -33,18 +33,16 @@ }, "scripts": { "dev": "vite", - "build": "tsc && vite build" + "build": "rollup --config" }, "devDependencies": { + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.5", "@types/node": "^20.8.8", - "vite-plugin-solid": "^2.7.0", - "typescript": "^5.2.2", - "vite": "^4.5.0", - "vite-plugin-dts": "^3.6.1", - "vite-tsconfig-paths": "^4.2.1", - "vitest": "^0.34.6", - "@solidjs/testing-library": "^0.8.4", - "@testing-library/jest-dom": "^6.1.3" + "babel-preset-solid": "^1.8.8", + "rollup": "^3.29.4", + "typescript": "^5.2.2" }, "dependencies": { "@orbitinghail/sqlsync-worker": "0.2.0", diff --git a/lib/sqlsync-solid-js/rollup.config.js b/lib/sqlsync-solid-js/rollup.config.js new file mode 100644 index 0000000..2ad8147 --- /dev/null +++ b/lib/sqlsync-solid-js/rollup.config.js @@ -0,0 +1,23 @@ +import babel from "@rollup/plugin-babel"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import typescript from "@rollup/plugin-typescript"; + +export default { + input: "src/index.ts", + output: { + dir: "dist", + format: "es", + sourcemap: true, + }, + external: ["react", "@orbitinghail/sqlsync-worker"], + plugins: [ + typescript(), + nodeResolve(), + babel({ + extensions: [".ts", ".tsx"], + babelHelpers: "bundled", + presets: ["solid", "@babel/preset-typescript"], + exclude: /node_modules\//, + }), + ], +}; diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index 5d30388..eff0973 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -14,25 +14,14 @@ import { SQLSyncContext } from "./context"; export function useSQLSync(): Accessor { const [sqlSync] = useContext(SQLSyncContext); - if (import.meta.env.DEV && !sqlSync()) { - throw new Error( - "could not find sqlsync context value; please ensure the component is wrapped in a " - ); - } - return () => { - const sqlSyncValue = sqlSync(); - if (import.meta.env.DEV && !sqlSyncValue) { + const value = sqlSync(); + if (!value) { throw new Error( "could not find sqlsync context value; please ensure the component is wrapped in a " ); - } else if (!sqlSyncValue) { - console.error( - "could not find sqlsync context value; please ensure the component is wrapped in a " - ); } - // biome-ignore lint/style/noNonNullAssertion: asserts in dev - return sqlSyncValue!; + return value; }; } diff --git a/lib/sqlsync-solid-js/tsconfig.json b/lib/sqlsync-solid-js/tsconfig.json index 07a282b..a039b54 100644 --- a/lib/sqlsync-solid-js/tsconfig.json +++ b/lib/sqlsync-solid-js/tsconfig.json @@ -1,39 +1,26 @@ { "compilerOptions": { "target": "esnext", - "useDefineForClassFields": true, "module": "esnext", + "moduleResolution": "Bundler", "lib": [ "ES6", "DOM", "DOM.Iterable", "ES2021.WeakRef" ], - "types": [ - "vite/client" - ], - "skipLibCheck": true, "jsx": "preserve", "jsxImportSource": "solid-js", /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, + "allowJs": true, + "outDir": "dist", + "declaration": true, + /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": [ - "src", - "test" - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] + "include": ["src"] } \ No newline at end of file diff --git a/lib/sqlsync-solid-js/tsconfig.node.json b/lib/sqlsync-solid-js/tsconfig.node.json deleted file mode 100644 index b6dda0b..0000000 --- a/lib/sqlsync-solid-js/tsconfig.node.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "types": ["node"], - "strict": true, - }, - "include": ["vite.config.ts"] -} diff --git a/lib/sqlsync-solid-js/vite.config.ts b/lib/sqlsync-solid-js/vite.config.ts deleted file mode 100644 index d615ad9..0000000 --- a/lib/sqlsync-solid-js/vite.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { resolve } from "path"; -import { defineConfig, searchForWorkspaceRoot } from "vite"; -import dts from "vite-plugin-dts"; -import solidPlugin from "vite-plugin-solid"; - -export default defineConfig({ - plugins: [ - solidPlugin(), - dts({ - exclude: "test/**/*", - }), - ], - build: { - lib: { - entry: resolve(__dirname, "src/index.ts"), - name: "SQLSyncReact", - formats: ["es", "umd"], - }, - sourcemap: true, - rollupOptions: { - external: ["solid-js"], - output: { - exports: "named", - }, - }, - }, - server: { - fs: { - allow: [searchForWorkspaceRoot(process.cwd())], - }, - }, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b08066a..f672124 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -220,33 +220,27 @@ importers: specifier: ^1.8.7 version: 1.8.8 devDependencies: - '@solidjs/testing-library': - specifier: ^0.8.4 - version: 0.8.5(@solidjs/router@0.10.6)(solid-js@1.8.8) - '@testing-library/jest-dom': - specifier: ^6.1.3 - version: 6.2.0(vitest@0.34.6) + '@rollup/plugin-babel': + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.23.7)(rollup@3.29.4) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.2.3(rollup@3.29.4) + '@rollup/plugin-typescript': + specifier: ^11.1.5 + version: 11.1.5(rollup@3.29.4)(tslib@2.6.2)(typescript@5.2.2) '@types/node': specifier: ^20.8.8 version: 20.8.8 + babel-preset-solid: + specifier: ^1.8.8 + version: 1.8.8(@babel/core@7.23.7) + rollup: + specifier: ^3.29.4 + version: 3.29.4 typescript: specifier: ^5.2.2 version: 5.2.2 - vite: - specifier: ^4.5.0 - version: 4.5.0(@types/node@20.8.8) - vite-plugin-dts: - specifier: ^3.6.1 - version: 3.7.0(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0) - vite-plugin-solid: - specifier: ^2.7.0 - version: 2.8.0(solid-js@1.8.8)(vite@4.5.0) - vite-tsconfig-paths: - specifier: ^4.2.1 - version: 4.2.3(typescript@5.2.2)(vite@4.5.0) - vitest: - specifier: ^0.34.6 - version: 0.34.6 lib/sqlsync-worker: dependencies: @@ -278,10 +272,6 @@ importers: packages: - /@adobe/css-tools@4.3.2: - resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} - dev: true - /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -723,6 +713,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 + dev: false /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} @@ -1664,49 +1655,6 @@ packages: react: 18.2.0 dev: false - /@microsoft/api-extractor-model@7.28.3(@types/node@20.8.8): - resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.8.8) - transitivePeerDependencies: - - '@types/node' - dev: true - - /@microsoft/api-extractor@7.39.0(@types/node@20.8.8): - resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.3(@types/node@20.8.8) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.62.0(@types/node@20.8.8) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - dev: true - - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1733,6 +1681,25 @@ packages: engines: {node: '>=14.0.0'} dev: false + /@rollup/plugin-babel@6.0.4(@babel/core@7.23.7)(rollup@3.29.4): + resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.22.15 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + rollup: 3.29.4 + dev: true + /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} @@ -1782,7 +1749,7 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) resolve: 1.22.8 rollup: 3.29.4 tslib: 2.6.2 @@ -1804,7 +1771,7 @@ packages: rollup: 3.29.4 dev: true - /@rollup/pluginutils@5.1.0: + /@rollup/pluginutils@5.1.0(rollup@3.29.4): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1816,6 +1783,7 @@ packages: '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 + rollup: 3.29.4 dev: true /@rollup/rollup-android-arm-eabi@4.9.2: @@ -1922,40 +1890,6 @@ packages: dev: true optional: true - /@rushstack/node-core-library@3.62.0(@types/node@20.8.8): - resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@types/node': 20.8.8 - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - - /@rushstack/rig-package@0.5.1: - resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true - - /@rushstack/ts-command-line@4.17.1: - resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - dev: true - /@scure/base@1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} dev: false @@ -1964,26 +1898,6 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@solidjs/router@0.10.6(solid-js@1.8.8): - resolution: {integrity: sha512-PiJO/wsAh0+0mmAIw/+gGgZa0xeMzKGrITWvBfNQ0wiAwNzOF/T0Bm10uhyaWdxPu9td0xK2LuMnC//4CXqnyA==} - peerDependencies: - solid-js: ^1.8.6 - dependencies: - solid-js: 1.8.8 - dev: true - - /@solidjs/testing-library@0.8.5(@solidjs/router@0.10.6)(solid-js@1.8.8): - resolution: {integrity: sha512-L9TowCoqdRQGB8ikODh9uHXrYTjCUZseVUG0tIVa836//qeSqXP4m0BKG66v9Zp1y1wRxok5qUW97GwrtEBMcw==} - engines: {node: '>= 14'} - peerDependencies: - '@solidjs/router': '>=0.6.0' - solid-js: '>=1.0.0' - dependencies: - '@solidjs/router': 0.10.6(solid-js@1.8.8) - '@testing-library/dom': 9.3.3 - solid-js: 1.8.8 - dev: true - /@tabler/icons-react@2.39.0(react@18.2.0): resolution: {integrity: sha512-MyUK1jqtmHPZBnDXqIc1Y5OnfoqG+tGaSB1/gcl0mlY462fJ5f3QB0ZIZzAHMAGYb6K2iJSdFIFavhcgpDDZ7Q==} peerDependencies: @@ -1998,57 +1912,6 @@ packages: resolution: {integrity: sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==} dev: false - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.2 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - - /@testing-library/jest-dom@6.2.0(vitest@0.34.6): - resolution: {integrity: sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - dependencies: - '@adobe/css-tools': 4.3.2 - '@babel/runtime': 7.23.2 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - vitest: 0.34.6 - dev: true - - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true - /@types/babel__core@7.20.3: resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: @@ -2223,66 +2086,6 @@ packages: pretty-format: 29.7.0 dev: true - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true - - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true - - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true - - /@vue/compiler-core@3.4.5: - resolution: {integrity: sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.4.5 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true - - /@vue/compiler-dom@3.4.5: - resolution: {integrity: sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==} - dependencies: - '@vue/compiler-core': 3.4.5 - '@vue/shared': 3.4.5 - dev: true - - /@vue/language-core@1.8.27(typescript@5.2.2): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.5 - '@vue/shared': 3.4.5 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.2.2 - vue-template-compiler: 2.7.16 - dev: true - - /@vue/shared@3.4.5: - resolution: {integrity: sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==} - dev: true - /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -2294,20 +2097,6 @@ packages: hasBin: true dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2315,13 +2104,6 @@ packages: color-convert: 1.9.3 dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} @@ -2335,12 +2117,6 @@ packages: picomatch: 2.3.1 dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /aria-hidden@1.2.3: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} @@ -2348,25 +2124,6 @@ packages: tslib: 2.6.2 dev: false - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - dev: true - /as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} dependencies: @@ -2393,11 +2150,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - /babel-plugin-jsx-dom-expressions@0.37.11(@babel/core@7.23.7): resolution: {integrity: sha512-0NaWy4sFsE0AWlucvL/myEiZ851BgjeLwhtctOFmyVCK6fPXqQHQUBB5SrrrmvOiw/BZCmMe8dOy7JL3FSyTtQ==} peerDependencies: @@ -2482,14 +2234,6 @@ packages: engines: {node: '>=8'} dev: true - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: true - /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -2534,22 +2278,6 @@ packages: supports-color: 5.5.0 dev: true - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -2582,41 +2310,14 @@ packages: color-name: 1.1.3 dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colors@1.2.5: - resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} - engines: {node: '>=0.1.90'} - dev: true - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - requiresBuild: true - dev: true - optional: true - /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true @@ -2626,10 +2327,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true - /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2643,10 +2340,6 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} dev: true - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2666,58 +2359,11 @@ packages: type-detect: 4.0.8 dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.2 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -2727,14 +2373,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true - /electron-to-chromium@1.4.565: resolution: {integrity: sha512-XbMoT6yIvg2xzcbs5hCADi0dXBh4//En3oFXmtPX+jiyyiCTiM9DGFT2SLottjpEs9Z8Mh8SqahbR96MaHfuSg==} dev: true @@ -2743,25 +2381,6 @@ packages: resolution: {integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==} dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -2883,6 +2502,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false /fast-equals@5.0.1: resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} @@ -2900,10 +2520,6 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - /fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} dev: false @@ -2921,25 +2537,10 @@ packages: to-regex-range: 5.0.1 dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2956,10 +2557,6 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2969,15 +2566,6 @@ packages: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -3021,57 +2609,11 @@ packages: engines: {node: '>=4'} dev: true - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -3079,11 +2621,6 @@ packages: function-bind: 1.1.2 dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - /highlight.js@11.9.0: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} @@ -3093,16 +2630,6 @@ packages: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} dev: true - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3114,43 +2641,12 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: false - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -3158,14 +2654,6 @@ packages: binary-extensions: 2.2.0 dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -3173,24 +2661,12 @@ packages: builtin-modules: 3.3.0 dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3203,21 +2679,10 @@ packages: is-extglob: 2.1.1 dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3229,69 +2694,11 @@ packages: '@types/estree': 1.0.3 dev: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.13 - dev: true - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3301,10 +2708,6 @@ packages: hasBin: true dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3315,38 +2718,16 @@ packages: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} dev: false - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true - /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} dev: true - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3366,18 +2747,6 @@ packages: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true - /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -3417,11 +2786,6 @@ packages: hasBin: true dev: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - /miniflare@3.20231016.0: resolution: {integrity: sha512-AmlqI89zsnBJfC+nKKZdCB/fuu0q/br24Kqt9NZwcT6yJEpO5NytNKfjl6nJROHROwuJSRQR1T3yopCtG1/0DA==} engines: {node: '>=16.13'} @@ -3451,13 +2815,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /mlly@1.4.2: resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: @@ -3471,10 +2828,6 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true - /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -3520,33 +2873,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3560,10 +2886,6 @@ packages: yocto-queue: 1.0.0 dev: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -3679,15 +3001,6 @@ packages: source-map-js: 1.0.2 dev: true - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3709,11 +3022,6 @@ packages: react-is: 16.13.1 dev: false - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - /qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} dev: false @@ -3745,10 +3053,6 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true @@ -3886,32 +3190,9 @@ packages: picomatch: 2.3.1 dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true - - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true + dev: false /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} @@ -4001,45 +3282,10 @@ packages: hasBin: true dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /seroval@1.0.2: resolution: {integrity: sha512-buswWxRzf65ZGUk8MAf3qVtBJHbe5gq6hZyPeqlJCKEIl/tEhUZze0YJg7vB7tFRGgPeneRaP083OB/vDiYLvA==} engines: {node: '>=10'} - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -4083,10 +3329,6 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -4102,35 +3344,11 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.6 - dev: true - /stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} dev: true - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: @@ -4153,13 +3371,6 @@ packages: has-flag: 3.0.0 dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4195,19 +3406,6 @@ packages: is-number: 7.0.0 dev: true - /tsconfck@2.1.2(typescript@5.2.2): - resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.2.2 - dev: true - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -4248,11 +3446,6 @@ packages: '@fastify/busboy': 2.0.0 dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -4275,12 +3468,6 @@ packages: picocolors: 1.0.0 dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} @@ -4360,11 +3547,6 @@ packages: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} dev: true - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true - /vite-node@0.34.6(@types/node@20.8.8): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} @@ -4387,30 +3569,6 @@ packages: - terser dev: true - /vite-plugin-dts@3.7.0(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0): - resolution: {integrity: sha512-np1uPaYzu98AtPReB8zkMnbjwcNHOABsLhqVOf81b3ol9b5M2wPcAVs8oqPnOpr6Us+7yDXVauwkxsk5+ldmRA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - '@microsoft/api-extractor': 7.39.0(@types/node@20.8.8) - '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.2.2) - debug: 4.3.4 - kolorist: 1.8.0 - typescript: 5.2.2 - vite: 4.5.0(@types/node@20.8.8) - vue-tsc: 1.8.27(typescript@5.2.2) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - dev: true - /vite-plugin-solid@2.8.0(solid-js@1.8.8)(vite@4.5.0): resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} peerDependencies: @@ -4430,23 +3588,6 @@ packages: - supports-color dev: true - /vite-tsconfig-paths@4.2.3(typescript@5.2.2)(vite@4.5.0): - resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4 - globrex: 0.1.2 - tsconfck: 2.1.2(typescript@5.2.2) - vite: 4.5.0(@types/node@20.8.8) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /vite@4.5.0: resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4630,55 +3771,6 @@ packages: - terser dev: true - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - - /vue-tsc@1.8.27(typescript@5.2.2): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.2.2) - semver: 7.5.4 - typescript: 5.2.2 - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -4752,10 +3844,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} @@ -4769,18 +3857,6 @@ packages: stacktracey: 2.1.8 dev: true - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.11.0 - optionalDependencies: - commander: 9.5.0 - dev: true - /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: true From 4646235398e87b3aa3642e00674bc85400ada598 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:40:36 -0800 Subject: [PATCH 18/22] fix exports --- lib/sqlsync-solid-js/package.json | 17 ++++++++++++++--- lib/sqlsync-solid-js/rollup.config.js | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json index e0752f1..7a526f8 100644 --- a/lib/sqlsync-solid-js/package.json +++ b/lib/sqlsync-solid-js/package.json @@ -22,15 +22,26 @@ "src" ], "type": "module", - "main": "./dist/sqlsync-solid-js.js", "types": "./src/index.ts", + "main": "./src/index.ts", "exports": { ".": { - "import": "./dist/sqlsync-solid-js.js", - "require": "./dist/sqlsync-solid-js.umd.cjs", + "import": "./src/index.ts", + "default": "./src/index.ts", "types": "./src/index.ts" } }, + "publishConfig": { + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "default": "./dist/index.js", + "types": "./dist/index.d.ts" + } + } + }, "scripts": { "dev": "vite", "build": "rollup --config" diff --git a/lib/sqlsync-solid-js/rollup.config.js b/lib/sqlsync-solid-js/rollup.config.js index 2ad8147..a034c62 100644 --- a/lib/sqlsync-solid-js/rollup.config.js +++ b/lib/sqlsync-solid-js/rollup.config.js @@ -9,7 +9,7 @@ export default { format: "es", sourcemap: true, }, - external: ["react", "@orbitinghail/sqlsync-worker"], + external: ["solid-js", "@orbitinghail/sqlsync-worker"], plugins: [ typescript(), nodeResolve(), @@ -17,7 +17,7 @@ export default { extensions: [".ts", ".tsx"], babelHelpers: "bundled", presets: ["solid", "@babel/preset-typescript"], - exclude: /node_modules\//, + exclude: [/node_modules\//], }), ], }; From 29ee7e02289afac0f346fb60164b07aec6082771 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:44:15 -0800 Subject: [PATCH 19/22] wip: more fixes --- lib/sqlsync-solid-js/package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json index 7a526f8..bb5630d 100644 --- a/lib/sqlsync-solid-js/package.json +++ b/lib/sqlsync-solid-js/package.json @@ -52,16 +52,15 @@ "@rollup/plugin-typescript": "^11.1.5", "@types/node": "^20.8.8", "babel-preset-solid": "^1.8.8", + "@orbitinghail/sqlsync-worker": "workspace:^", "rollup": "^3.29.4", "typescript": "^5.2.2" }, "dependencies": { - "@orbitinghail/sqlsync-worker": "0.2.0", - "@scure/base": "^1.1.3", - "fast-equals": "^5.0.1", - "fast-sha256": "^1.3.0" + "fast-equals": "^5.0.1" }, "peerDependencies": { - "solid-js": "^1.8.7" + "solid-js": "^1.8.7", + "@orbitinghail/sqlsync-worker": "workspace:^" } } From 12e51c39e02f91983e3e52c5c08c6b675c03181b Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:47:06 -0800 Subject: [PATCH 20/22] wip: formatting --- lib/sqlsync-solid-js/package.json | 1 - lib/sqlsync-solid-js/src/hooks.ts | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/sqlsync-solid-js/package.json b/lib/sqlsync-solid-js/package.json index bb5630d..3a1ea76 100644 --- a/lib/sqlsync-solid-js/package.json +++ b/lib/sqlsync-solid-js/package.json @@ -43,7 +43,6 @@ } }, "scripts": { - "dev": "vite", "build": "rollup --config" }, "devDependencies": { diff --git a/lib/sqlsync-solid-js/src/hooks.ts b/lib/sqlsync-solid-js/src/hooks.ts index eff0973..244a5aa 100644 --- a/lib/sqlsync-solid-js/src/hooks.ts +++ b/lib/sqlsync-solid-js/src/hooks.ts @@ -18,7 +18,7 @@ export function useSQLSync(): Accessor { const value = sqlSync(); if (!value) { throw new Error( - "could not find sqlsync context value; please ensure the component is wrapped in a " + "could not find sqlsync context value; please ensure the component is wrapped in a ", ); } return value; @@ -30,7 +30,7 @@ type UseMutateFn = (docId: DocId) => MutateFn; type UseQueryFn = ( docId: Accessor, - query: Accessor + query: Accessor, ) => Accessor>; type SetConnectionEnabledFn = (enabled: boolean) => Promise; @@ -50,7 +50,7 @@ export function createDocHooks(docType: Accessor>): DocHooks { const useQueryWrapper = ( docId: Accessor, - query: Accessor + query: Accessor, ) => { return useQuery(docType, docId, query); }; @@ -75,13 +75,13 @@ export type QueryState = export function useQuery( docType: Accessor>, docId: Accessor, - rawQuery: Accessor + rawQuery: Accessor, ): Accessor> { const sqlsync = useSQLSync(); const [state, setState] = createSignal>({ state: "pending" }); createEffect(() => { - let query = normalizeQuery(rawQuery()); + const query = normalizeQuery(rawQuery()); const [unsubPromise, unsubResolve] = pendingPromise<() => void>(); From 83eeb8dbbc7adf4512af424388f032f51035ddab Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:52:37 -0800 Subject: [PATCH 21/22] wip: formatting --- examples/guestbook-solid-js/src/doctype.ts | 2 +- examples/guestbook-solid-js/src/main.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/guestbook-solid-js/src/doctype.ts b/examples/guestbook-solid-js/src/doctype.ts index 426b3f6..82dda55 100644 --- a/examples/guestbook-solid-js/src/doctype.ts +++ b/examples/guestbook-solid-js/src/doctype.ts @@ -3,7 +3,7 @@ import { DocType, serializeMutationAsJSON } from "@orbitinghail/sqlsync-worker"; const REDUCER_URL = new URL( "../../../target/wasm32-unknown-unknown/release/reducer_guestbook.wasm", - import.meta.url + import.meta.url, ); // Must match the Mutation type in the Rust Reducer code diff --git a/examples/guestbook-solid-js/src/main.tsx b/examples/guestbook-solid-js/src/main.tsx index d8677dd..856a5f5 100644 --- a/examples/guestbook-solid-js/src/main.tsx +++ b/examples/guestbook-solid-js/src/main.tsx @@ -64,7 +64,7 @@ export function App() { () => sql` select id, msg from messages order by created_at - ` + `, ); const rows = () => queryState().rows ?? []; @@ -103,12 +103,12 @@ export function App() { } // Configure the SQLSync provider near the top of the React tree -// biome-ignore lint/style/noNonNullAssertion: we know this element exists render( () => ( ), - document.getElementById("root")! + // biome-ignore lint/style/noNonNullAssertion: we know this element exists + document.getElementById("root")!, ); From 65c103d2e8a23b3b2fd808ed590dbef55268cb61 Mon Sep 17 00:00:00 2001 From: Matthew Gapp <61894094+matthewgapp@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:53:45 -0800 Subject: [PATCH 22/22] wip: update lockfile --- pnpm-lock.yaml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f672124..ae3c864 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -204,22 +204,16 @@ importers: lib/sqlsync-solid-js: dependencies: - '@orbitinghail/sqlsync-worker': - specifier: 0.2.0 - version: link:../sqlsync-worker - '@scure/base': - specifier: ^1.1.3 - version: 1.1.3 fast-equals: specifier: ^5.0.1 version: 5.0.1 - fast-sha256: - specifier: ^1.3.0 - version: 1.3.0 solid-js: specifier: ^1.8.7 version: 1.8.8 devDependencies: + '@orbitinghail/sqlsync-worker': + specifier: workspace:^ + version: link:../sqlsync-worker '@rollup/plugin-babel': specifier: ^6.0.4 version: 6.0.4(@babel/core@7.23.7)(rollup@3.29.4)