diff --git a/.github/workflows/actions.yaml b/.github/workflows/actions.yaml index 8016de0..41d3cf6 100644 --- a/.github/workflows/actions.yaml +++ b/.github/workflows/actions.yaml @@ -45,3 +45,7 @@ jobs: run: just test-sqlsync-reducer - name: build sqlsync react and worker packages run: just package-sqlsync-react package-sqlsync-worker + - name: build frontend + run: cd demo/frontend && pnpm build + - name: build examples + run: cd examples/guestbook-react && pnpm build diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fc693f..1d31002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,16 @@ This changelog documents changes across multiple projects contained in this monorepo. Each project is released for every SQLSync version, even if the project has not changed. The reason for this decision is to simplify testing and debugging. Lockstep versioning will be relaxed as SQLSync matures. +# Pending Changes + +- Moved the majority of functionality from `sqlsync-react` to `sqlsync-worker` to make it easier to add additional JS framework support. ([#38]) + # 0.2.0 - Dec 1 2023 -- Reducer can now handle query errors (#29) +- Reducer can now handle query errors ([#29]) # 0.1.0 - Oct 23 2023 - Initial release + +[#38]: https://github.com/orbitinghail/sqlsync/pull/38 +[#29]: https://github.com/orbitinghail/sqlsync/pull/29 diff --git a/Cargo.lock b/Cargo.lock index a8abda8..438a5ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -255,7 +255,7 @@ dependencies = [ "log", "serde", "serde_json", - "sqlsync-reducer", + "sqlsync-reducer 0.2.0", ] [[package]] @@ -1006,6 +1006,16 @@ dependencies = [ "getrandom", ] +[[package]] +name = "reducer-guestbook" +version = "0.2.0" +dependencies = [ + "log", + "serde", + "serde_json", + "sqlsync-reducer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "regex" version = "1.9.5" @@ -1243,7 +1253,7 @@ dependencies = [ "serde", "simple_logger", "sqlite-vfs", - "sqlsync-reducer", + "sqlsync-reducer 0.2.0", "testutil", "thiserror", "time", @@ -1271,28 +1281,30 @@ dependencies = [ ] [[package]] -name = "sqlsync-react-test-reducer" -version = "0.1.0" +name = "sqlsync-reducer" +version = "0.2.0" dependencies = [ + "anyhow", + "bincode", "futures", "log", "serde", - "serde_json", - "sqlsync-reducer", + "simple_logger", + "thiserror", + "wasmi", ] [[package]] name = "sqlsync-reducer" version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c88981b831c525276b86f1a97e75ebc79f054159035c629d44a724f84613b199" dependencies = [ - "anyhow", "bincode", "futures", "log", "serde", - "simple_logger", "thiserror", - "wasmi", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c8edbc9..478b6d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,8 @@ members = [ "lib/sqlsync-reducer", "lib/sqlite-vfs", "lib/testutil", - "lib/sqlsync-react/sqlsync-react-test-reducer", + + "examples/reducer-guestbook", "demo/demo-reducer", "demo/cloudflare-backend", diff --git a/GUIDE.md b/GUIDE.md index 76fda5b..71942a8 100644 --- a/GUIDE.md +++ b/GUIDE.md @@ -5,7 +5,10 @@ SQLSync is distributed as a JavaScript package as well as a Rust Crate. Currently, both are required to use SQLSync. Also, React is the only supported framework at the moment. -If you want to jump ahead to a working demo, check out the finished product at: https://github.com/orbitinghail/sqlsync-demo-guestbook +If you want to jump ahead to a working demo, [check out the finished product here][guestbook-src]. Note that it has a couple more features than what you get with this guide. + +[guestbook-src]: examples/guestbook-react + ## Step 1: Creating the Reducer @@ -48,7 +51,7 @@ strip = "debuginfo" codegen-units = 1 [dependencies] -sqlsync-reducer = "0.1" +sqlsync-reducer = "0.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = "0.4" @@ -118,17 +121,12 @@ Also, make sure your JS bundling tool supports importing assets from the file sy Create a file which will contain type information for your Mutations, the reducer URL, and export some useful React hooks for your app to consume. It should look something like this: ```typescript -import { - DocType, - createDocHooks, - serializeMutationAsJSON, -} from "@orbitinghail/sqlsync-react"; - -// Path to your compiled reducer artifact, your js bundler should handle making -// this a working URL that resolves during development and in production. +import { createDocHooks } from "@orbitinghail/sqlsync-react"; +import { DocType, serializeMutationAsJSON } from "@orbitinghail/sqlsync-worker"; + const REDUCER_URL = new URL( - "../reducer/target/wasm32-unknown-unknown/release/reducer.wasm", - import.meta.url + "../../../target/wasm32-unknown-unknown/release/reducer_guestbook.wasm", + import.meta.url, ); // Must match the Mutation type in the Rust Reducer code @@ -147,8 +145,7 @@ export const TaskDocType: DocType = { serializeMutation: serializeMutationAsJSON, }; -export const { useMutate, useQuery, useSetConnectionEnabled } = - createDocHooks(TaskDocType); +export const { useMutate, useQuery, useSetConnectionEnabled } = createDocHooks(TaskDocType); ``` ## Step 3: Hooking it up to your app @@ -158,31 +155,32 @@ Using the hooks exported from the file in [Step 2](#step-2-install-and-configure Here is a complete example of a very trivial guestbook application which uses the reducer we created above. ```tsx -import React, { FormEvent, useEffect } from "react"; -import ReactDOM from "react-dom/client"; +import { SQLSyncProvider } from "@orbitinghail/sqlsync-react"; +import { journalIdFromString, sql } from "@orbitinghail/sqlsync-worker"; // this example uses the uuid library (`npm install uuid`) import { v4 as uuidv4 } from "uuid"; +import React, { FormEvent, useCallback, useEffect } from "react"; +import ReactDOM from "react-dom/client"; + // You'll need to configure your build system to make these entrypoints -// available as urls. Vite does this automatically via the `?url` suffix. +// 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.js?url"; +import workerUrl from "@orbitinghail/sqlsync-worker/worker.js?worker&url"; -// import the SQLSync provider and hooks -import { SQLSyncProvider, sql } from "@orbitinghail/sqlsync-react"; 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. -import { journalIdFromString } from "@orbitinghail/sqlsync-worker"; const DOC_ID = journalIdFromString("VM7fC4gKxa52pbdtrgd9G9"); // Configure the SQLSync provider near the top of the React tree +// biome-ignore lint/style/noNonNullAssertion: we know this element exists ReactDOM.createRoot(document.getElementById("root")!).render( - + , ); // Use SQLSync hooks in your app @@ -201,7 +199,7 @@ export function App() { }, [mutate]); // create a callback which knows how to trigger the add message mutation - const handleSubmit = React.useCallback( + const handleSubmit = useCallback( (e: FormEvent) => { // Prevent the browser from reloading the page e.preventDefault(); @@ -218,7 +216,7 @@ export function App() { setMsg(""); } }, - [mutate, msg] + [mutate, msg, setMsg], ); // finally, query SQLSync for all the messages, sorted by created_at @@ -227,7 +225,7 @@ export function App() { sql` select id, msg from messages order by created_at - ` + `, ); return ( @@ -242,12 +240,7 @@ export function App() {
diff --git a/demo/frontend/src/components/TaskList.tsx b/demo/frontend/src/components/TaskList.tsx index c3d15f0..b484dc1 100644 --- a/demo/frontend/src/components/TaskList.tsx +++ b/demo/frontend/src/components/TaskList.tsx @@ -1,6 +1,5 @@ import { Center, Flex, Paper, Stack, Title } from "@mantine/core"; -import { sql } from "@orbitinghail/sqlsync-react"; -import { JournalId } from "@orbitinghail/sqlsync-worker"; +import { JournalId, sql } from "@orbitinghail/sqlsync-worker"; import { useMutate, useQuery } from "../doctype"; import { ConnectionStatus } from "./ConnectionStatus"; import { TaskForm } from "./TaskForm"; diff --git a/demo/frontend/src/doctype.ts b/demo/frontend/src/doctype.ts index 6c9bc9c..ab57c69 100644 --- a/demo/frontend/src/doctype.ts +++ b/demo/frontend/src/doctype.ts @@ -1,4 +1,5 @@ -import { DocType, createDocHooks, serializeMutationAsJSON } from "@orbitinghail/sqlsync-react"; +import { createDocHooks } from "@orbitinghail/sqlsync-react"; +import { DocType, serializeMutationAsJSON } from "@orbitinghail/sqlsync-worker"; const REDUCER_URL = new URL( "../../../target/wasm32-unknown-unknown/release/demo_reducer.wasm", diff --git a/demo/frontend/src/main.tsx b/demo/frontend/src/main.tsx index c097637..72814ec 100644 --- a/demo/frontend/src/main.tsx +++ b/demo/frontend/src/main.tsx @@ -1,21 +1,27 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { RouterProvider, createBrowserRouter, redirect, useParams } from "react-router-dom"; +import { + RouterProvider, + createBrowserRouter, + redirect, + useParams, + useRouteError, +} from "react-router-dom"; -// HACK: switch to the .ts version for nicer local dev -// import workerUrl from "@orbitinghail/sqlsync-worker/worker.ts?url"; -import workerUrl from "@orbitinghail/sqlsync-worker/worker.js?url"; +import sqlSyncWasmUrl from "@orbitinghail/sqlsync-worker/sqlsync.wasm?url"; +import workerUrl from "@orbitinghail/sqlsync-worker/worker.ts?worker&url"; -import { MantineProvider } from "@mantine/core"; +import { Alert, Container, MantineProvider, Stack } from "@mantine/core"; import { SQLSyncProvider } from "@orbitinghail/sqlsync-react"; import { journalIdFromString, journalIdToString } from "@orbitinghail/sqlsync-worker"; -import sqlSyncWasmUrl from "@orbitinghail/sqlsync-worker/sqlsync.wasm?url"; import { App } from "./App"; import "@mantine/code-highlight/styles.css"; // import stylesheets import "@mantine/core/styles.css"; +import { IconInfoCircle } from "@tabler/icons-react"; +import { Header } from "./components/Header"; import { MANTINE_THEME } from "./theme"; const isLocalhost = location.hostname === "localhost" || location.hostname.startsWith("192.168"); @@ -33,6 +39,9 @@ const newDocumentId = async (name = "") => { const response = await fetch(url, { method: "POST", }); + if (!response.ok) { + throw new Error(`Failed to create new document: ${response.status}`); + } return journalIdFromString(await response.text()); }; @@ -47,9 +56,27 @@ export const DocRoute = () => { return ; }; +const ErrorBoundary = () => { + // biome-ignore lint/suspicious/noExplicitAny: could be thrown from anywhere + const error = useRouteError() as any; + console.error(error); + return ( + + +
+ }> + Failed to load document + {Object.prototype.hasOwnProperty.call(error, "message") ? `: ${error.message}` : ""} + + + + ); +}; + const router = createBrowserRouter([ { path: "/", + errorElement: , loader: async () => { const docId = await newDocumentId(); return redirect(`/${journalIdToString(docId)}`); @@ -57,6 +84,7 @@ const router = createBrowserRouter([ }, { path: "/named/:name", + errorElement: , loader: async ({ params }) => { const docId = await newDocumentId(params.name); return redirect(`/${journalIdToString(docId)}`); @@ -65,6 +93,7 @@ const router = createBrowserRouter([ { path: "/:docId", element: , + errorElement: , }, ]); diff --git a/demo/frontend/tailwind.config.js b/demo/frontend/tailwind.config.js deleted file mode 100644 index 614c86b..0000000 --- a/demo/frontend/tailwind.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], - theme: { - extend: {}, - }, - plugins: [], -}; diff --git a/demo/frontend/tsconfig.json b/demo/frontend/tsconfig.json index 8725971..1d0f3c9 100644 --- a/demo/frontend/tsconfig.json +++ b/demo/frontend/tsconfig.json @@ -1,11 +1,12 @@ { "compilerOptions": { - "target": "ESNext", + "target": "ES2020", "useDefineForClassFields": true, - "lib": ["ESNext", "DOM", "DOM.Iterable"], + "lib": ["ES2020", "ES2021.WeakRef", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, "types": ["vite/client"], + /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -13,6 +14,7 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", + /* Linting */ "strict": true, "noUnusedLocals": true, diff --git a/demo/frontend/tsconfig.node.json b/demo/frontend/tsconfig.node.json index f40f9b2..7935fe6 100644 --- a/demo/frontend/tsconfig.node.json +++ b/demo/frontend/tsconfig.node.json @@ -8,5 +8,5 @@ "strict": true, "types": ["node"] }, - "include": ["vite.config.ts", "tailwind.config.js", "vite-plugin-wasm.d.ts", "postcss.config.js"] + "include": ["vite.config.ts", "vite-plugin-wasm.d.ts", "postcss.config.js"] } diff --git a/demo/frontend/vite.config.ts b/demo/frontend/vite.config.ts index d3ec646..1ff0da0 100644 --- a/demo/frontend/vite.config.ts +++ b/demo/frontend/vite.config.ts @@ -1,16 +1,7 @@ import react from "@vitejs/plugin-react"; -import { defineConfig, searchForWorkspaceRoot } from "vite"; +import { defineConfig } from "vite"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], - server: { - fs: { - allow: [ - searchForWorkspaceRoot(process.cwd()), - "../../target/wasm32-unknown-unknown/debug/demo_reducer.wasm", - "../../target/wasm32-unknown-unknown/release/demo_reducer.wasm", - ], - }, - }, }); diff --git a/examples/guestbook-react/README.md b/examples/guestbook-react/README.md new file mode 100644 index 0000000..5661f92 --- /dev/null +++ b/examples/guestbook-react/README.md @@ -0,0 +1,3 @@ +# React + TypeScript + Vite + SQLSync + +This template provides a minimal setup to get SQLSync working with React and Vite. diff --git a/examples/guestbook-react/index.html b/examples/guestbook-react/index.html new file mode 100644 index 0000000..cc92f76 --- /dev/null +++ b/examples/guestbook-react/index.html @@ -0,0 +1,15 @@ + + + + + + + SQLSync + Vite + React + TS + + + +
if nothing renders, open the console
+ + + + \ No newline at end of file diff --git a/examples/guestbook-react/package.json b/examples/guestbook-react/package.json new file mode 100644 index 0000000..8a11d38 --- /dev/null +++ b/examples/guestbook-react/package.json @@ -0,0 +1,26 @@ +{ + "name": "guestbook-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@orbitinghail/sqlsync-react": "workspace:*", + "@orbitinghail/sqlsync-worker": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@types/uuid": "^9.0.6", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } +} diff --git a/examples/guestbook-react/src/doctype.ts b/examples/guestbook-react/src/doctype.ts new file mode 100644 index 0000000..082f5bc --- /dev/null +++ b/examples/guestbook-react/src/doctype.ts @@ -0,0 +1,29 @@ +import { createDocHooks } from "@orbitinghail/sqlsync-react"; +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-react/src/main.tsx b/examples/guestbook-react/src/main.tsx new file mode 100644 index 0000000..f170098 --- /dev/null +++ b/examples/guestbook-react/src/main.tsx @@ -0,0 +1,107 @@ +import { SQLSyncProvider } from "@orbitinghail/sqlsync-react"; +import { journalIdFromString, sql } from "@orbitinghail/sqlsync-worker"; + +// this example uses the uuid library (`npm install uuid`) +import { v4 as uuidv4 } from "uuid"; + +import React, { FormEvent, useCallback, useEffect } from "react"; +import ReactDOM from "react-dom/client"; + +// 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 { 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"); + +// Configure the SQLSync provider near the top of the React tree +// biome-ignore lint/style/noNonNullAssertion: we know this element exists +ReactDOM.createRoot(document.getElementById("root")!).render( + + + , +); + +// 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] = React.useState(""); + + // create a mutate function for our document + const mutate = useMutate(DOC_ID); + + // initialize the schema; eventually this will be handled by SQLSync automatically + useEffect(() => { + mutate({ tag: "InitSchema" }).catch((err) => { + console.error("Failed to init schema", err); + }); + }, [mutate]); + + // create a callback which knows how to trigger the add message mutation + const handleSubmit = useCallback( + (e: FormEvent) => { + // 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 }).catch((err) => { + console.error("Failed to add message", err); + }); + // clear the message + setMsg(""); + } + }, + [mutate, msg, setMsg], + ); + + // create a callback to delete a message + const handleDelete = useCallback( + (id: string) => { + mutate({ tag: "DeleteMessage", id }).catch((err) => { + console.error("Failed to delete message", err); + }); + }, + [mutate], + ); + + // finally, query SQLSync for all the messages, sorted by created_at + const { rows } = useQuery<{ id: string; msg: string }>( + DOC_ID, + sql` + select id, msg from messages + order by created_at + `, + ); + + return ( +
+

Guestbook:

+
    + {(rows ?? []).map(({ id, msg }) => ( +
  • + {msg} + +
  • + ))} +
+

Leave a message:

+
+ + +
+
+ ); +} diff --git a/examples/guestbook-react/tsconfig.json b/examples/guestbook-react/tsconfig.json new file mode 100644 index 0000000..58a7c63 --- /dev/null +++ b/examples/guestbook-react/tsconfig.json @@ -0,0 +1,26 @@ +{ + "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": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/lib/sqlsync-react/tsconfig.node.json b/examples/guestbook-react/tsconfig.node.json similarity index 67% rename from lib/sqlsync-react/tsconfig.node.json rename to examples/guestbook-react/tsconfig.node.json index 1a555ac..42872c5 100644 --- a/lib/sqlsync-react/tsconfig.node.json +++ b/examples/guestbook-react/tsconfig.node.json @@ -4,9 +4,7 @@ "skipLibCheck": true, "module": "ESNext", "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true, - "types": ["node"] + "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] } diff --git a/examples/guestbook-react/vite.config.ts b/examples/guestbook-react/vite.config.ts new file mode 100644 index 0000000..1ff0da0 --- /dev/null +++ b/examples/guestbook-react/vite.config.ts @@ -0,0 +1,7 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/examples/reducer-guestbook/Cargo.toml b/examples/reducer-guestbook/Cargo.toml new file mode 100644 index 0000000..da34ca6 --- /dev/null +++ b/examples/reducer-guestbook/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "reducer-guestbook" +authors.workspace = true +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +strip = "debuginfo" +codegen-units = 1 + +[dependencies] +sqlsync-reducer = "0.2" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +log = "0.4" diff --git a/examples/reducer-guestbook/src/lib.rs b/examples/reducer-guestbook/src/lib.rs new file mode 100644 index 0000000..45c0b00 --- /dev/null +++ b/examples/reducer-guestbook/src/lib.rs @@ -0,0 +1,44 @@ +use serde::Deserialize; +use sqlsync_reducer::{execute, init_reducer, types::ReducerError}; + +#[derive(Deserialize, Debug)] +#[serde(tag = "tag")] +enum Mutation { + InitSchema, + AddMessage { id: String, msg: String }, + DeleteMessage { id: String }, +} + +init_reducer!(reducer); +async fn reducer(mutation: Vec) -> Result<(), ReducerError> { + let mutation: Mutation = serde_json::from_slice(&mutation[..])?; + + match mutation { + Mutation::InitSchema => { + execute!( + "CREATE TABLE IF NOT EXISTS messages ( + id TEXT PRIMARY KEY, + msg TEXT NOT NULL, + created_at TEXT NOT NULL + )" + ) + .await?; + } + + Mutation::AddMessage { id, msg } => { + log::info!("appending message({}): {}", id, msg); + execute!( + "insert into messages (id, msg, created_at) values (?, ?, datetime('now'))", + id, + msg + ) + .await?; + } + + Mutation::DeleteMessage { id } => { + execute!("delete from messages where id = ?", id).await?; + } + } + + Ok(()) +} diff --git a/justfile b/justfile index 938cda1..83a3164 100644 --- a/justfile +++ b/justfile @@ -38,8 +38,11 @@ wasm-counter-reducer: wasm-task-reducer: cargo build --target wasm32-unknown-unknown --example task-reducer -wasm-sqlsync-react-test-reducer: - cargo build --target wasm32-unknown-unknown --package sqlsync-react-test-reducer +wasm-examples-reducer-guestbook: + cargo build --target wasm32-unknown-unknown --package reducer-guestbook --release + +example-guestbook-react: wasm-examples-reducer-guestbook + cd examples/guestbook-react && pnpm dev test-end-to-end-local rng_seed="": wasm-task-reducer RUST_BACKTRACE=1 cargo run --example end-to-end-local {{rng_seed}} @@ -51,8 +54,7 @@ test-sqlsync-reducer: wasm-sqlsync-reducer-guest cargo run --example host node_modules: - cd lib/sqlsync-worker && pnpm i - cd demo/frontend && pnpm i + pnpm i package-sqlsync-react: cd lib/sqlsync-react && pnpm build diff --git a/lib/sqlsync-react/index.html b/lib/sqlsync-react/index.html deleted file mode 100644 index 4fb2a86..0000000 --- a/lib/sqlsync-react/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - sqlsync-react tests index - - - - - - - \ No newline at end of file diff --git a/lib/sqlsync-react/package.json b/lib/sqlsync-react/package.json index 85b9012..8625e21 100644 --- a/lib/sqlsync-react/package.json +++ b/lib/sqlsync-react/package.json @@ -9,40 +9,46 @@ "type": "git", "url": "https://github.com/orbitinghail/sqlsync" }, - "files": ["dist", "src"], "type": "module", - "main": "./dist/sqlsync-react.js", - "types": "./src/index.ts", + "files": ["dist"], + "main": "./src/index.ts", "exports": { ".": { - "import": "./dist/sqlsync-react.js", - "require": "./dist/sqlsync-react.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": "tsc && vite build" + "build": "rollup --config" }, "devDependencies": { - "@types/node": "^20.8.8", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.5", "@types/react": "^18.2.31", "@types/react-dom": "^18.2.14", - "@vitejs/plugin-react": "^4.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "typescript": "^5.2.2", - "vite": "^4.5.0", - "vite-plugin-dts": "^3.6.1" + "@orbitinghail/sqlsync-worker": "workspace:^", + "rollup": "^3.29.4", + "tslib": "^2.6.2", + "typescript": "^5.2.2" }, "peerDependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "@orbitinghail/sqlsync-worker": "workspace:^" }, "dependencies": { - "@orbitinghail/sqlsync-worker": "workspace:^", - "@scure/base": "^1.1.3", - "fast-equals": "^5.0.1", - "fast-sha256": "^1.3.0" + "fast-equals": "^5.0.1" } } diff --git a/lib/sqlsync-react/rollup.config.mjs b/lib/sqlsync-react/rollup.config.mjs new file mode 100644 index 0000000..81bd56b --- /dev/null +++ b/lib/sqlsync-react/rollup.config.mjs @@ -0,0 +1,13 @@ +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()], +}; diff --git a/lib/sqlsync-react/sqlsync-react-test-reducer/Cargo.toml b/lib/sqlsync-react/sqlsync-react-test-reducer/Cargo.toml deleted file mode 100644 index fd36407..0000000 --- a/lib/sqlsync-react/sqlsync-react-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-react/sqlsync-react-test-reducer/src/lib.rs b/lib/sqlsync-react/sqlsync-react-test-reducer/src/lib.rs deleted file mode 100644 index 2dbcdfd..0000000 --- a/lib/sqlsync-react/sqlsync-react-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(()) -} diff --git a/lib/sqlsync-react/src/context.tsx b/lib/sqlsync-react/src/context.tsx index 5f2585b..f3618e9 100644 --- a/lib/sqlsync-react/src/context.tsx +++ b/lib/sqlsync-react/src/context.tsx @@ -1,5 +1,5 @@ -import { ReactNode, createContext, useEffect, useState } from "react"; -import { SQLSync } from "./sqlsync"; +import { SQLSync } from "@orbitinghail/sqlsync-worker"; +import { ReactNode, createContext, createElement, useEffect, useState } from "react"; export const SQLSyncContext = createContext(null); @@ -23,6 +23,6 @@ export const SQLSyncProvider = (props: Props) => { }, [workerUrl, wasmUrl, coordinatorUrl]); if (sqlsync) { - return {children}; + return createElement(SQLSyncContext.Provider, { value: sqlsync }, children); } }; diff --git a/lib/sqlsync-react/src/hooks.ts b/lib/sqlsync-react/src/hooks.ts index 13152e1..a9a4e78 100644 --- a/lib/sqlsync-react/src/hooks.ts +++ b/lib/sqlsync-react/src/hooks.ts @@ -1,20 +1,27 @@ -import { ConnectionStatus, DocId } from "@orbitinghail/sqlsync-worker"; +import { + ConnectionStatus, + DocId, + DocType, + ParameterizedQuery, + QuerySubscription, + Row, + SQLSync, + normalizeQuery, + pendingPromise, +} from "@orbitinghail/sqlsync-worker"; + import { deepEqual } from "fast-equals"; import { useCallback, useContext, useEffect, useRef, useState } from "react"; 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 = useContext(SQLSyncContext); - if (import.meta.env.DEV && !value) { + if (!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 value; } type MutateFn = (mutation: M) => Promise; diff --git a/lib/sqlsync-react/src/index.ts b/lib/sqlsync-react/src/index.ts index 44ca817..056554d 100644 --- a/lib/sqlsync-react/src/index.ts +++ b/lib/sqlsync-react/src/index.ts @@ -1,10 +1,3 @@ -import { SQLSyncProvider } from "./context"; -import { createDocHooks, useConnectionStatus } from "./hooks"; -import { sql } from "./sql"; -import { DocType, Row } from "./sqlsync"; -import { serializeMutationAsJSON } from "./util"; +export { SQLSyncProvider } from "./context"; +export { createDocHooks, useConnectionStatus } from "./hooks"; -export { SQLSyncProvider, createDocHooks, serializeMutationAsJSON, sql, useConnectionStatus }; -export type { DocType, Row }; - -// eof: this file only exports diff --git a/lib/sqlsync-react/src/util.ts b/lib/sqlsync-react/src/util.ts deleted file mode 100644 index 902a705..0000000 --- a/lib/sqlsync-react/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)); -}; diff --git a/lib/sqlsync-react/test/react-sanity.html b/lib/sqlsync-react/test/react-sanity.html deleted file mode 100644 index b7240f2..0000000 --- a/lib/sqlsync-react/test/react-sanity.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - sqlsync-react tests - - - -
if nothing renders, open the console
- - - - \ No newline at end of file diff --git a/lib/sqlsync-react/test/react-sanity.tsx b/lib/sqlsync-react/test/react-sanity.tsx deleted file mode 100644 index 27c95a4..0000000 --- a/lib/sqlsync-react/test/react-sanity.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React, { useEffect } from "react"; -import ReactDOM from "react-dom/client"; - -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 { SQLSyncProvider } from "../src/context"; -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-react/tsconfig.json b/lib/sqlsync-react/tsconfig.json index 7018be7..56a3e59 100644 --- a/lib/sqlsync-react/tsconfig.json +++ b/lib/sqlsync-react/tsconfig.json @@ -1,38 +1,23 @@ { "compilerOptions": { "target": "esnext", - "useDefineForClassFields": true, "module": "esnext", - "lib": [ - "ES6", - "DOM", - "DOM.Iterable", - "ES2021.WeakRef" - ], - "types": [ - "vite/client" - ], - "skipLibCheck": true, + "moduleResolution": "Bundler", + "baseUrl": ".", + "lib": ["ES6", "DOM", "ES2021.WeakRef"], + + /* Compiling */ + "allowJs": true, + "outDir": "dist", + "declaration": true, + "sourceMap": true, "jsx": "react-jsx", - /* 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 + "include": ["src"] +} diff --git a/lib/sqlsync-react/vite.config.ts b/lib/sqlsync-react/vite.config.ts deleted file mode 100644 index 96a1d3c..0000000 --- a/lib/sqlsync-react/vite.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -import react from "@vitejs/plugin-react"; -import { resolve } from "path"; -import { defineConfig, searchForWorkspaceRoot } from "vite"; -import dts from "vite-plugin-dts"; - -export default defineConfig({ - plugins: [ - react(), - 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/lib/sqlsync-worker/package.json b/lib/sqlsync-worker/package.json index 4bf45b0..006bc74 100644 --- a/lib/sqlsync-worker/package.json +++ b/lib/sqlsync-worker/package.json @@ -12,25 +12,32 @@ "type": "module", "files": [ "dist", - "src", "sqlsync-wasm/pkg/sqlsync_wasm.js", "sqlsync-wasm/pkg/sqlsync_wasm.d.ts", "sqlsync-wasm/pkg/sqlsync_wasm_bg.wasm" ], - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./src/index.ts", "exports": { ".": { + "default": "./src/index.ts", "import": "./src/index.ts", - "require": "./dist/index.js", "types": "./src/index.ts" }, - "./worker.js": "./dist/worker.js", - "./api.js": "./dist/api.js", "./worker.ts": "./src/worker.ts", - "./api.ts": "./src/api.ts", "./sqlsync.wasm": "./sqlsync-wasm/pkg/sqlsync_wasm_bg.wasm" }, + "publishConfig": { + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "default": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./worker.js": "./dist/worker.js", + "./sqlsync.wasm": "./sqlsync-wasm/pkg/sqlsync_wasm_bg.wasm" + } + }, "scripts": { "build-wasm": "cd sqlsync-wasm && wasm-pack build --target web --dev", "build-wasm-release": "cd sqlsync-wasm && wasm-pack build --target web --release", @@ -38,6 +45,7 @@ "build-release": "pnpm run build-wasm-release && rollup --config" }, "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.5", "rollup": "^3.29.4", @@ -45,6 +53,7 @@ "typescript": "^5.2.2" }, "dependencies": { - "@scure/base": "^1.1.3" + "@scure/base": "^1.1.3", + "fast-sha256": "^1.3.0" } } diff --git a/lib/sqlsync-worker/rollup.config.mjs b/lib/sqlsync-worker/rollup.config.mjs index 3ed7d46..60f1516 100644 --- a/lib/sqlsync-worker/rollup.config.mjs +++ b/lib/sqlsync-worker/rollup.config.mjs @@ -1,18 +1,15 @@ +import commonjs from "@rollup/plugin-commonjs"; import { nodeResolve } from "@rollup/plugin-node-resolve"; import typescript from "@rollup/plugin-typescript"; -const output = (name, entry) => ({ +const output = (entry) => ({ input: entry, output: { dir: "dist", - format: "umd", + format: "es", sourcemap: true, - name, }, - plugins: [typescript(), nodeResolve()], + plugins: [commonjs(), typescript(), nodeResolve()], }); -export default [ - output("SQLSyncWorkerTypes", "src/index.ts"), - output("SQLSyncWorker", "src/worker.ts"), -]; +export default [output("src/index.ts"), output("src/worker.ts")]; diff --git a/lib/sqlsync-worker/src/index.ts b/lib/sqlsync-worker/src/index.ts index 6f58a29..c60a945 100644 --- a/lib/sqlsync-worker/src/index.ts +++ b/lib/sqlsync-worker/src/index.ts @@ -1,48 +1,35 @@ +export { + journalIdFromString, + journalIdToString, + randomJournalId, + randomJournalId256 +} from "./journal-id"; +export { normalizeQuery, sql } from "./sql"; +export { SQLSync } from "./sqlsync"; +export { pendingPromise, serializeMutationAsJSON } from "./util"; + import type { ConnectionStatus, - DocEvent, DocId, - DocReply, DocRequest, HandlerId, - HostToWorkerMsg, - QueryKey, SqlValue, - WorkerToHostMsg, } from "../sqlsync-wasm/pkg/sqlsync_wasm"; +import type { JournalId } from "./journal-id"; +import type { ParameterizedQuery } from "./sql"; +import type { DocType, QuerySubscription } from "./sqlsync"; +import type { Row } from "./types"; -export * from "./journal-id"; export type { - HostToWorkerMsg, - DocRequest, - WorkerToHostMsg, - DocReply, - DocEvent, + ConnectionStatus, DocId, - SqlValue, + DocRequest, + DocType, HandlerId, - QueryKey, - ConnectionStatus, + JournalId, + ParameterizedQuery, + QuerySubscription, + Row, + SqlValue }; -export interface BootRequest { - tag: "Boot"; - handlerId: HandlerId; - coordinatorUrl?: string; - wasmUrl: string; -} - -export interface CloseRequest { - tag: "Close"; - handlerId: HandlerId; -} - -export type WorkerRequest = - | { - tag: "Doc"; - handlerId: HandlerId; - docId: DocId; - req: DocRequest; - } - | BootRequest - | CloseRequest; diff --git a/lib/sqlsync-react/src/sql.ts b/lib/sqlsync-worker/src/sql.ts similarity index 94% rename from lib/sqlsync-react/src/sql.ts rename to lib/sqlsync-worker/src/sql.ts index 195d712..c88f876 100644 --- a/lib/sqlsync-react/src/sql.ts +++ b/lib/sqlsync-worker/src/sql.ts @@ -1,5 +1,5 @@ -import { QueryKey, SqlValue } from "@orbitinghail/sqlsync-worker"; import { base58 } from "@scure/base"; +import { QueryKey, SqlValue } from "../sqlsync-wasm/pkg/sqlsync_wasm"; import { sha256Digest } from "./util"; const UTF8_ENCODER = new TextEncoder(); diff --git a/lib/sqlsync-react/src/sqlsync.ts b/lib/sqlsync-worker/src/sqlsync.ts similarity index 98% rename from lib/sqlsync-react/src/sqlsync.ts rename to lib/sqlsync-worker/src/sqlsync.ts index 0321c53..d7c0535 100644 --- a/lib/sqlsync-react/src/sqlsync.ts +++ b/lib/sqlsync-worker/src/sqlsync.ts @@ -6,15 +6,13 @@ import { HandlerId, QueryKey, SqlValue, - WorkerRequest, WorkerToHostMsg, - journalIdToString, -} from "@orbitinghail/sqlsync-worker"; +} from "../sqlsync-wasm/pkg/sqlsync_wasm"; +import { journalIdToString } from "./journal-id"; import { ParameterizedQuery, toQueryKey } from "./sql"; +import { Row, WorkerRequest } from "./types"; import { NarrowTaggedEnum, OmitUnion, assertUnreachable, initWorker, toRows } from "./util"; -export type Row = Record; - export interface DocType { readonly reducerUrl: string | URL; readonly serializeMutation: (mutation: Mutation) => Uint8Array; diff --git a/lib/sqlsync-worker/src/types.ts b/lib/sqlsync-worker/src/types.ts new file mode 100644 index 0000000..efbb5db --- /dev/null +++ b/lib/sqlsync-worker/src/types.ts @@ -0,0 +1,25 @@ +import { DocId, DocRequest, HandlerId, SqlValue } from "../sqlsync-wasm/pkg/sqlsync_wasm"; + +export interface BootRequest { + tag: "Boot"; + handlerId: HandlerId; + coordinatorUrl?: string; + wasmUrl: string; +} + +export interface CloseRequest { + tag: "Close"; + handlerId: HandlerId; +} + +export type WorkerRequest = + | { + tag: "Doc"; + handlerId: HandlerId; + docId: DocId; + req: DocRequest; + } + | BootRequest + | CloseRequest; + +export type Row = Record; diff --git a/lib/sqlsync-worker/src/util.ts b/lib/sqlsync-worker/src/util.ts index 266f019..354736b 100644 --- a/lib/sqlsync-worker/src/util.ts +++ b/lib/sqlsync-worker/src/util.ts @@ -1,3 +1,63 @@ +import * as sha256 from "fast-sha256"; +import { SqlValue } from "../sqlsync-wasm/pkg/sqlsync_wasm"; +import { Row } from "./types"; + +// 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-worker/src/worker.ts b/lib/sqlsync-worker/src/worker.ts index d995789..be66db0 100644 --- a/lib/sqlsync-worker/src/worker.ts +++ b/lib/sqlsync-worker/src/worker.ts @@ -1,6 +1,6 @@ import init, { DocReply, HandlerId, WorkerApi } from "../sqlsync-wasm/pkg/sqlsync_wasm.js"; -import { WorkerRequest } from "./index"; import { PortId, PortRouter } from "./port"; +import { WorkerRequest } from "./types"; import { assertUnreachable } from "./util"; const ports = new PortRouter(); diff --git a/lib/sqlsync-worker/tsconfig.json b/lib/sqlsync-worker/tsconfig.json index 8210a3e..09862fd 100644 --- a/lib/sqlsync-worker/tsconfig.json +++ b/lib/sqlsync-worker/tsconfig.json @@ -1,16 +1,16 @@ { "compilerOptions": { - "target": "esnext", + "target": "es6", "module": "esnext", "moduleResolution": "Bundler", "baseUrl": ".", - "lib": ["ES6", "WebWorker", "ES2021.WeakRef"], /* Compiling */ "allowJs": true, "outDir": "dist", "declaration": true, "sourceMap": true, + "lib": ["ES6", "DOM", "WebWorker", "ES2021.WeakRef"], /* Linting */ "strict": true, @@ -18,5 +18,5 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src"] + "include": ["src"], } diff --git a/package.json b/package.json index 6cadba5..b854de6 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { "devDependencies": { - "@biomejs/biome": "1.4.0" + "@biomejs/biome": "1.4.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 896937f..95f1734 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 1.4.0 - version: 1.4.0 + specifier: 1.4.1 + version: 1.4.1 demo/cloudflare-backend: devDependencies: @@ -97,55 +97,123 @@ importers: specifier: ^3.14.0 version: 3.14.0 - lib/sqlsync-react: + examples/guestbook-react: dependencies: + '@orbitinghail/sqlsync-react': + specifier: workspace:* + version: link:../../lib/sqlsync-react '@orbitinghail/sqlsync-worker': - specifier: workspace:^ - 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 + 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) + uuid: + specifier: ^9.0.1 + version: 9.0.1 devDependencies: - '@types/node': - specifier: ^20.8.8 - version: 20.8.8 '@types/react': - specifier: ^18.2.31 - version: 18.2.31 + specifier: ^18.2.43 + version: 18.2.46 '@types/react-dom': - specifier: ^18.2.14 - version: 18.2.14 + specifier: ^18.2.17 + version: 18.2.18 + '@types/uuid': + specifier: ^9.0.6 + version: 9.0.6 '@vitejs/plugin-react': - specifier: ^4.1.0 - version: 4.1.0(vite@4.5.0) + 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 + + 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: ^4.5.0 - version: 4.5.0(@types/node@20.8.8) - vite-plugin-dts: - specifier: ^3.6.1 - version: 3.6.1(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0) + specifier: ^5.0.8 + version: 5.0.10 + + lib/sqlsync-react: + dependencies: + fast-equals: + specifier: ^5.0.1 + version: 5.0.1 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@orbitinghail/sqlsync-worker': + specifier: workspace:^ + version: link:../sqlsync-worker + '@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/react': + specifier: ^18.2.31 + version: 18.2.31 + '@types/react-dom': + specifier: ^18.2.14 + version: 18.2.14 + rollup: + specifier: ^3.29.4 + version: 3.29.4 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.2.2 + version: 5.2.2 lib/sqlsync-worker: dependencies: '@scure/base': specifier: ^1.1.3 version: 1.1.3 + fast-sha256: + specifier: ^1.3.0 + version: 1.3.0 devDependencies: + '@rollup/plugin-commonjs': + specifier: ^25.0.7 + version: 25.0.7(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.2.3 version: 15.2.3(rollup@3.29.4) @@ -180,11 +248,24 @@ packages: chalk: 2.4.2 dev: true + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} @@ -208,6 +289,29 @@ packages: - supports-color dev: true + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.23.0: resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} @@ -218,6 +322,16 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} @@ -229,6 +343,17 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -270,6 +395,20 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + 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-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -304,6 +443,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helpers@7.23.2: resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} @@ -315,6 +459,17 @@ packages: - supports-color dev: true + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.13: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} @@ -324,6 +479,15 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -332,6 +496,14 @@ packages: '@babel/types': 7.23.4 dev: true + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + 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'} @@ -342,6 +514,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + 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-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} @@ -352,6 +534,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + 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/runtime@7.23.2: resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} @@ -386,6 +578,24 @@ packages: - supports-color dev: true + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.23.4: resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} engines: {node: '>=6.9.0'} @@ -395,22 +605,31 @@ packages: to-fast-properties: 2.0.0 dev: true - /@biomejs/biome@1.4.0: - resolution: {integrity: sha512-/rDlao6ra38nhxo4IYCqWCzfTJcpMk4YHjSVBI9yN/ifdhnzSwirL25xDVH7G9hZdNhpF9g78FaPJhFa9DX0Cw==} + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@biomejs/biome@1.4.1: + resolution: {integrity: sha512-JccVAwPbhi37pdxbAGmaOBjUTKEwEjWAhl7rKkVVuXHo4MLASXJ5HR8BTgrImi4/7rTBsGz1tgVD1Kwv1CHGRg==} engines: {node: '>=14.*'} hasBin: true requiresBuild: true optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.4.0 - '@biomejs/cli-darwin-x64': 1.4.0 - '@biomejs/cli-linux-arm64': 1.4.0 - '@biomejs/cli-linux-x64': 1.4.0 - '@biomejs/cli-win32-arm64': 1.4.0 - '@biomejs/cli-win32-x64': 1.4.0 + '@biomejs/cli-darwin-arm64': 1.4.1 + '@biomejs/cli-darwin-x64': 1.4.1 + '@biomejs/cli-linux-arm64': 1.4.1 + '@biomejs/cli-linux-x64': 1.4.1 + '@biomejs/cli-win32-arm64': 1.4.1 + '@biomejs/cli-win32-x64': 1.4.1 dev: true - /@biomejs/cli-darwin-arm64@1.4.0: - resolution: {integrity: sha512-nBrtVRwr4IlTtxLOHwBwLv1sWvggf9/DnT5/ALIANJZOpoING6u8jHWipods69wK8kGa8Ld7iwHm3W5BrJJFFQ==} + /@biomejs/cli-darwin-arm64@1.4.1: + resolution: {integrity: sha512-PZWy2Idndqux38p6AXSDQM2ldRAWi32bvb7bMbTN0ALzpWYMYnxd71ornatumSSJYoNhKmxzDLq+jct7nZJ79w==} engines: {node: '>=14.*'} cpu: [arm64] os: [darwin] @@ -418,8 +637,8 @@ packages: dev: true optional: true - /@biomejs/cli-darwin-x64@1.4.0: - resolution: {integrity: sha512-nny0VgOj3ksUGzU5GblgtQEvrAZFgFe1IJBoYOP978OQdDrg7BpS+GX5udfof87Dl4ZlHPRBU951ceHOxF7BTg==} + /@biomejs/cli-darwin-x64@1.4.1: + resolution: {integrity: sha512-soj3BWhnsM1M2JlzR09cibUzG1owJqetwj/Oo7yg0foijo9lNH9XWXZfJBYDKgW/6Fomn+CC2EcUS+hisQzt9g==} engines: {node: '>=14.*'} cpu: [x64] os: [darwin] @@ -427,8 +646,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-arm64@1.4.0: - resolution: {integrity: sha512-gyLkT/Yh9xfW1T9yjQs/2txkCeG0e+LRs0adLugMwN0ptcNTRyusBvUoiHnpB+9rS6hWu9ZCedGMNmKQ8v2GSw==} + /@biomejs/cli-linux-arm64@1.4.1: + resolution: {integrity: sha512-YIZqfJUg4F+fPsBTXxgD7EU2E5OAYbmYSl/snf4PevwfQCWE/omOFZv+NnIQmjYj9I7ParDgcJvanoA3/kO0JQ==} engines: {node: '>=14.*'} cpu: [arm64] os: [linux] @@ -436,8 +655,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-x64@1.4.0: - resolution: {integrity: sha512-LIxTuU2zSbIHM9XDYjQphJ5UU8h2eS7yR8uIvGYSba7Qt9AKqfbenyVJTsVnoj1CXxxgKNVSc/wVmlOlGz5DBQ==} + /@biomejs/cli-linux-x64@1.4.1: + resolution: {integrity: sha512-9YOZw3qBd/KUj63A6Hn2zZgzGb2nbESM0qNmeMXgmqinVKM//uc4OgY5TuKITuGjMSvcVxxd4dX1IzYjV9qvNQ==} engines: {node: '>=14.*'} cpu: [x64] os: [linux] @@ -445,8 +664,8 @@ packages: dev: true optional: true - /@biomejs/cli-win32-arm64@1.4.0: - resolution: {integrity: sha512-U2jT1/0wZLJIRqnU8qHAfi/A/+yUwlL3sYJgqs+wO0BbR22WGQZlj03u5FdpEoyLXdsLv1pbeIcjNp+V0NYXWA==} + /@biomejs/cli-win32-arm64@1.4.1: + resolution: {integrity: sha512-nWQbvkNKxYn/kCQ0yVF8kCaS3VzaGvtFSmItXiMknU4521LDjJ7tNWH12Gol+pIslrCbd4E1LhJa0a3ThRsBVg==} engines: {node: '>=14.*'} cpu: [arm64] os: [win32] @@ -454,8 +673,8 @@ packages: dev: true optional: true - /@biomejs/cli-win32-x64@1.4.0: - resolution: {integrity: sha512-gN6DgyyBxIwoCovAUFJHFWVallb0cLosayDRtNyxU3MDv/atZxSXOWQezfVKBIbgmFPxYWJObd+awvbPYXwwww==} + /@biomejs/cli-win32-x64@1.4.1: + resolution: {integrity: sha512-88fR2CQxQ4YLs2BUDuywWYQpUKgU3A3sTezANFc/4LGKQFFLV2yX+F7QAdZVkMHfA+RD9Xg178HomM/6mnTNPA==} engines: {node: '>=14.*'} cpu: [x64] os: [win32] @@ -532,6 +751,15 @@ packages: rollup-plugin-node-polyfills: 0.2.1 dev: true + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -550,6 +778,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -568,6 +805,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -586,6 +832,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -604,6 +859,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -622,6 +886,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -640,6 +913,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -658,6 +940,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -676,6 +967,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -694,6 +994,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -712,6 +1021,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -730,6 +1048,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -748,6 +1075,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -766,6 +1102,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -784,6 +1129,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -802,6 +1156,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -820,6 +1183,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -838,6 +1210,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -856,6 +1237,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -874,6 +1264,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -892,6 +1291,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -910,6 +1318,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -928,6 +1345,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@fastify/busboy@2.0.0: resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} engines: {node: '>=14'} @@ -1058,49 +1484,6 @@ packages: react: 18.2.0 dev: false - /@microsoft/api-extractor-model@7.28.2(@types/node@20.8.8): - resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.61.0(@types/node@20.8.8) - transitivePeerDependencies: - - '@types/node' - dev: true - - /@microsoft/api-extractor@7.38.0(@types/node@20.8.8): - resolution: {integrity: sha512-e1LhZYnfw+JEebuY2bzhw0imDCl1nwjSThTrQqBXl40hrVo6xm3j/1EpUr89QyzgjqmAwek2ZkIVZbrhaR+cqg==} - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.2(@types/node@20.8.8) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.61.0(@types/node@20.8.8) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.16.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.0.4 - 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'} @@ -1127,6 +1510,24 @@ packages: engines: {node: '>=14.0.0'} dev: false + /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4): + resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.5 + rollup: 3.29.4 + dev: true + /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} @@ -1180,39 +1581,109 @@ packages: rollup: 3.29.4 dev: true - /@rushstack/node-core-library@3.61.0(@types/node@20.8.8): - resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} - 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 + /@rollup/rollup-android-arm-eabi@4.9.2: + resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.2: + resolution: {integrity: sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.2: + resolution: {integrity: sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.2: + resolution: {integrity: sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.2: + resolution: {integrity: sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.2: + resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.2: + resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.2: + resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.2: + resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.2: + resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.2: + resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: 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 + /@rollup/rollup-win32-ia32-msvc@4.9.2: + resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true dev: true + optional: true - /@rushstack/ts-command-line@4.16.1: - resolution: {integrity: sha512-+OCsD553GYVLEmz12yiFjMOzuPeCiZ3f8wTiFHL30ZVXexTyPmgjwXEhg2K2P0a2lVf+8YBy7WtPoflB2Fp8/A==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 + /@rollup/rollup-win32-x64-msvc@4.9.2: + resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true /@scure/base@1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} @@ -1232,10 +1703,6 @@ packages: resolution: {integrity: sha512-iK3j2jIEGIUaJcbYYg5iwyG1Y/m4lzUxAUbxRpvgeXCWP29jvZaH5hajZmU3KaSealddHuJg7PSQislPHpCsoQ==} dev: false - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - /@types/babel__core@7.20.3: resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: @@ -1246,6 +1713,16 @@ packages: '@types/babel__traverse': 7.20.3 dev: true + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.4 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 + dev: true + /@types/babel__generator@7.6.6: resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} dependencies: @@ -1284,6 +1761,12 @@ packages: '@types/react': 18.2.31 dev: true + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.46 + dev: true + /@types/react@18.2.31: resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==} dependencies: @@ -1291,6 +1774,14 @@ packages: '@types/scheduler': 0.16.5 csstype: 3.1.2 + /@types/react@18.2.46: + resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + dependencies: + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 + csstype: 3.1.2 + dev: true + /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true @@ -1322,70 +1813,20 @@ packages: - supports-color dev: true - /@volar/language-core@1.10.4: - resolution: {integrity: sha512-Na69qA6uwVIdA0rHuOc2W3pHtVQQO8hCNim7FOaKNpRJh0oAFnu5r9i7Oopo5C4cnELZkPNjTrbmpcCTiW+CMQ==} - dependencies: - '@volar/source-map': 1.10.4 - dev: true - - /@volar/source-map@1.10.4: - resolution: {integrity: sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==} - dependencies: - muggle-string: 0.3.1 - dev: true - - /@volar/typescript@1.10.4: - resolution: {integrity: sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==} - dependencies: - '@volar/language-core': 1.10.4 - dev: true - - /@vue/compiler-core@3.3.6: - resolution: {integrity: sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==} - dependencies: - '@babel/parser': 7.23.0 - '@vue/shared': 3.3.6 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true - - /@vue/compiler-dom@3.3.6: - resolution: {integrity: sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==} - dependencies: - '@vue/compiler-core': 3.3.6 - '@vue/shared': 3.3.6 - dev: true - - /@vue/language-core@1.8.20(typescript@5.2.2): - resolution: {integrity: sha512-vNJaqjCTSrWEr+erSq6Rq0CqDC8MOAwyxirxwK8esOxd+1LmAUJUTG2p7I84Mj1Izy5uHiHQAkRTVR2QxMBY+A==} + /@vitejs/plugin-react@4.2.1(vite@5.0.10): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.10.4 - '@volar/source-map': 1.10.4 - '@vue/compiler-dom': 3.3.6 - '@vue/shared': 3.3.6 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - typescript: 5.2.2 - vue-template-compiler: 2.7.15 - dev: true - - /@vue/shared@3.3.6: - resolution: {integrity: sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==} - dev: true - - /@vue/typescript@1.8.20(typescript@5.2.2): - resolution: {integrity: sha512-F0XX1wK71Fo9ewtzLSCSo5dfOuwKrSi/dR2AlI00iTJ4Bfk0wq1BNTRgnlvfx4kz/vQovaGXqwpIkif14W9KrA==} + vite: ^4.2.0 || ^5.0.0 dependencies: - '@volar/typescript': 1.10.4 - '@vue/language-core': 1.8.20(typescript@5.2.2) + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) + '@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 transitivePeerDependencies: - - typescript + - supports-color dev: true /acorn-walk@8.2.0: @@ -1399,15 +1840,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-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1423,12 +1855,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'} @@ -1495,6 +1921,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001574 + electron-to-chromium: 1.4.620 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -1513,6 +1950,10 @@ packages: resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} dev: true + /caniuse-lite@1.0.30001574: + resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} + dev: true + /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: @@ -1561,20 +2002,8 @@ packages: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 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 - - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true /convert-source-map@2.0.0: @@ -1599,10 +2028,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'} @@ -1628,6 +2053,10 @@ packages: resolution: {integrity: sha512-XbMoT6yIvg2xzcbs5hCADi0dXBh4//En3oFXmtPX+jiyyiCTiM9DGFT2SLottjpEs9Z8Mh8SqahbR96MaHfuSg==} dev: true + /electron-to-chromium@1.4.620: + resolution: {integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==} + dev: true + /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -1688,6 +2117,37 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -1718,6 +2178,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==} @@ -1735,10 +2196,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 @@ -1760,13 +2217,8 @@ packages: 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 + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true /fsevents@2.3.3: @@ -1813,15 +2265,22 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1834,19 +2293,20 @@ 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 - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true /invariant@2.2.4: @@ -1896,8 +2356,10 @@ packages: engines: {node: '>=0.12.0'} dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.3 dev: true /js-tokens@4.0.0: @@ -1909,48 +2371,23 @@ 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 - /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 - - /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 dependencies: js-tokens: 4.0.0 + dev: false /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1958,19 +2395,19 @@ 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 - /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 dev: true + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2012,9 +2449,9 @@ packages: - utf-8-validate dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true @@ -2023,10 +2460,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 @@ -2038,6 +2471,12 @@ packages: hasBin: true dev: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -2047,6 +2486,10 @@ packages: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2062,6 +2505,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -2152,6 +2601,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} dev: true @@ -2164,11 +2622,6 @@ packages: react-is: 16.13.1 dev: false - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - /qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} dev: false @@ -2185,6 +2638,7 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false /react-github-btn@1.4.0(react@18.2.0): resolution: {integrity: sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==} @@ -2323,6 +2777,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -2335,13 +2790,6 @@ packages: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false - /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==} hasBin: true @@ -2385,6 +2833,27 @@ packages: fsevents: 2.3.3 dev: true + /rollup@4.9.2: + resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.2 + '@rollup/rollup-android-arm64': 4.9.2 + '@rollup/rollup-darwin-arm64': 4.9.2 + '@rollup/rollup-darwin-x64': 4.9.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.2 + '@rollup/rollup-linux-arm64-gnu': 4.9.2 + '@rollup/rollup-linux-arm64-musl': 4.9.2 + '@rollup/rollup-linux-riscv64-gnu': 4.9.2 + '@rollup/rollup-linux-x64-gnu': 4.9.2 + '@rollup/rollup-linux-x64-musl': 4.9.2 + '@rollup/rollup-win32-arm64-msvc': 4.9.2 + '@rollup/rollup-win32-ia32-msvc': 4.9.2 + '@rollup/rollup-win32-x64-msvc': 4.9.2 + fsevents: 2.3.3 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -2395,6 +2864,7 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false /selfsigned@2.1.1: resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} @@ -2408,14 +2878,6 @@ 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 - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -2438,10 +2900,6 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - /stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} dependencies: @@ -2454,16 +2912,6 @@ packages: 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-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /sugarss@4.0.1(postcss@8.4.31): resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} @@ -2509,12 +2957,6 @@ packages: engines: {node: '>=14.16'} dev: false - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -2532,11 +2974,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 @@ -2548,10 +2985,15 @@ packages: picocolors: 1.0.0 dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' dependencies: - punycode: 2.3.0 + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 dev: true /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): @@ -2629,35 +3071,6 @@ packages: hasBin: true dev: false - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true - - /vite-plugin-dts@3.6.1(@types/node@20.8.8)(typescript@5.2.2)(vite@4.5.0): - resolution: {integrity: sha512-Juy5qsDVxag9p0seSjkcdXnAkTfI9WtYcP9ccJbxZlavtK5nGY17ViqjuKpj0+qk+003PPcC6j/CIV/KIorlAg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - '@microsoft/api-extractor': 7.38.0(@types/node@20.8.8) - '@rollup/pluginutils': 5.0.5(rollup@3.29.4) - '@vue/language-core': 1.8.20(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.20(typescript@5.2.2) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - 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} @@ -2694,23 +3107,39 @@ packages: fsevents: 2.3.3 dev: true - /vue-template-compiler@2.7.15: - resolution: {integrity: sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - - /vue-tsc@1.8.20(typescript@5.2.2): - resolution: {integrity: sha512-bIADlyxJl+1ZWQQHAi47NZoi2iTiw/lBwQLL98wXROcQlUuGVtyroAIiqvto9pJotcyhtU0JbGvsHN6JN0fYfg==} + /vite@5.0.10: + resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - typescript: '*' + '@types/node': ^18.0.0 || >=20.0.0 + 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: - '@vue/language-core': 1.8.20(typescript@5.2.2) - '@vue/typescript': 1.8.20(typescript@5.2.2) - semver: 7.5.4 - typescript: 5.2.2 + esbuild: 0.19.11 + postcss: 8.4.32 + rollup: 4.9.2 + optionalDependencies: + fsevents: 2.3.3 dev: true /workerd@1.20231016.0: @@ -2752,6 +3181,10 @@ packages: - utf-8-validate dev: true + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + /ws@8.14.2: resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} @@ -2773,10 +3206,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /youch@3.3.2: resolution: {integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==} dependencies: @@ -2785,18 +3214,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 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5b63639..b393bd5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,4 @@ packages: - "demo/frontend" - "lib/sqlsync-react" - "lib/sqlsync-worker" - - "docs" + - "examples/guestbook-react"