From 9886b08b97e74492c6280524aa98175766b2a3fe Mon Sep 17 00:00:00 2001 From: James Arthur Date: Mon, 9 Dec 2024 13:59:31 +0100 Subject: [PATCH] docs: write patterns guide and example. (#2021) Add Writes guide and write-patterns example. --- .changeset/beige-snails-brush.md | 5 + .changeset/tender-seas-stare.md | 5 + examples/nextjs-example/app/match-stream.ts | 22 +- examples/write-patterns/.eslintrc.cjs | 41 + examples/write-patterns/.gitignore | 3 + examples/write-patterns/.prettierrc | 6 + examples/write-patterns/README.md | 71 + examples/write-patterns/index.html | 16 + examples/write-patterns/package.json | 59 + .../patterns/1-online-writes/README.md | 32 + .../patterns/1-online-writes/index.tsx | 109 + .../patterns/2-optimistic-state/README.md | 31 + .../patterns/2-optimistic-state/index.tsx | 193 ++ .../patterns/3-shared-persistent/README.md | 42 + .../patterns/3-shared-persistent/index.tsx | 258 +++ .../patterns/4-through-the-db/README.md | 51 + .../patterns/4-through-the-db/db.ts | 43 + .../patterns/4-through-the-db/index.tsx | 167 ++ .../4-through-the-db/local-schema.sql | 345 +++ .../patterns/4-through-the-db/sync.ts | 194 ++ examples/write-patterns/patterns/index.ts | 4 + examples/write-patterns/public/robots.txt | 2 + examples/write-patterns/public/screenshot.png | Bin 0 -> 407261 bytes examples/write-patterns/shared/app/App.tsx | 21 + examples/write-patterns/shared/app/client.ts | 74 + .../shared/app/icons/favicon.ico | Bin 0 -> 4286 bytes .../shared/app/icons/icon-180.png | Bin 0 -> 1304 bytes .../shared/app/icons/icon-192.png | Bin 0 -> 1352 bytes .../shared/app/icons/icon-512.png | Bin 0 -> 4442 bytes .../write-patterns/shared/app/icons/icon.svg | 4 + .../shared/app/icons/spinner.gif | Bin 0 -> 74195 bytes examples/write-patterns/shared/app/main.tsx | 13 + examples/write-patterns/shared/app/style.css | 133 ++ .../write-patterns/shared/app/vite-env.d.ts | 2 + examples/write-patterns/shared/backend/api.js | 201 ++ .../shared/migrations/01-create-todos.sql | 23 + .../shared/migrations/02-add-write-id.sql | 11 + examples/write-patterns/tsconfig.json | 24 + examples/write-patterns/vite.config.ts | 44 + packages/experimental/.eslintrc.cjs | 41 + packages/experimental/.prettierignore | 2 + packages/experimental/.prettierrc | 6 + packages/experimental/README.md | 41 + packages/experimental/package.json | 71 + packages/experimental/src/index.ts | 1 + packages/experimental/src/match.ts | 53 + packages/experimental/test/match.test.ts | 36 + .../experimental/test/support/global-setup.ts | 71 + .../experimental/test/support/test-context.ts | 193 ++ .../experimental/test/support/test-helpers.ts | 51 + packages/experimental/tsconfig.build.json | 5 + packages/experimental/tsconfig.json | 105 + packages/experimental/tsup.config.ts | 60 + packages/experimental/vitest.config.ts | 9 + packages/react-hooks/package.json | 1 + packages/react-hooks/src/react-hooks.tsx | 6 + packages/typescript-client/src/client.ts | 2 +- packages/typescript-client/src/shape.ts | 22 +- packages/typescript-client/src/types.ts | 4 +- pnpm-lock.yaml | 2052 ++++++++++++++++- website/.vitepress/config.mts | 9 +- website/.vitepress/theme/custom.css | 3 + website/.vitepress/theme/index.js | 4 +- ...1-21-local-first-with-your-existing-api.md | 17 + website/docs/api/http.md | 2 +- website/docs/guides/auth.md | 4 + ...ur-own-client.md => client-development.md} | 8 +- website/docs/guides/deployment.md | 4 + website/docs/guides/installation.md | 4 + website/docs/guides/shapes.md | 4 + website/docs/guides/troubleshooting.md | 4 + website/docs/guides/writes.md | 301 +++ website/docs/integrations/livestore.md | 16 +- website/package.json | 1 + website/public/_redirects | 7 +- website/public/img/icons/auth.svg | 14 + website/public/img/icons/coding.svg | 15 + website/public/img/icons/deploy.png | Bin 0 -> 8738 bytes website/public/img/icons/install.svg | 15 + website/public/img/icons/shapes.svg | 4 + website/public/img/icons/troubleshoot.svg | 15 + website/public/img/icons/writes.svg | 15 + 82 files changed, 5397 insertions(+), 150 deletions(-) create mode 100644 .changeset/beige-snails-brush.md create mode 100644 .changeset/tender-seas-stare.md create mode 100644 examples/write-patterns/.eslintrc.cjs create mode 100644 examples/write-patterns/.gitignore create mode 100644 examples/write-patterns/.prettierrc create mode 100644 examples/write-patterns/README.md create mode 100644 examples/write-patterns/index.html create mode 100644 examples/write-patterns/package.json create mode 100644 examples/write-patterns/patterns/1-online-writes/README.md create mode 100644 examples/write-patterns/patterns/1-online-writes/index.tsx create mode 100644 examples/write-patterns/patterns/2-optimistic-state/README.md create mode 100644 examples/write-patterns/patterns/2-optimistic-state/index.tsx create mode 100644 examples/write-patterns/patterns/3-shared-persistent/README.md create mode 100644 examples/write-patterns/patterns/3-shared-persistent/index.tsx create mode 100644 examples/write-patterns/patterns/4-through-the-db/README.md create mode 100644 examples/write-patterns/patterns/4-through-the-db/db.ts create mode 100644 examples/write-patterns/patterns/4-through-the-db/index.tsx create mode 100644 examples/write-patterns/patterns/4-through-the-db/local-schema.sql create mode 100644 examples/write-patterns/patterns/4-through-the-db/sync.ts create mode 100644 examples/write-patterns/patterns/index.ts create mode 100644 examples/write-patterns/public/robots.txt create mode 100644 examples/write-patterns/public/screenshot.png create mode 100644 examples/write-patterns/shared/app/App.tsx create mode 100644 examples/write-patterns/shared/app/client.ts create mode 100644 examples/write-patterns/shared/app/icons/favicon.ico create mode 100644 examples/write-patterns/shared/app/icons/icon-180.png create mode 100644 examples/write-patterns/shared/app/icons/icon-192.png create mode 100644 examples/write-patterns/shared/app/icons/icon-512.png create mode 100644 examples/write-patterns/shared/app/icons/icon.svg create mode 100644 examples/write-patterns/shared/app/icons/spinner.gif create mode 100644 examples/write-patterns/shared/app/main.tsx create mode 100644 examples/write-patterns/shared/app/style.css create mode 100644 examples/write-patterns/shared/app/vite-env.d.ts create mode 100644 examples/write-patterns/shared/backend/api.js create mode 100644 examples/write-patterns/shared/migrations/01-create-todos.sql create mode 100644 examples/write-patterns/shared/migrations/02-add-write-id.sql create mode 100644 examples/write-patterns/tsconfig.json create mode 100644 examples/write-patterns/vite.config.ts create mode 100644 packages/experimental/.eslintrc.cjs create mode 100644 packages/experimental/.prettierignore create mode 100644 packages/experimental/.prettierrc create mode 100644 packages/experimental/README.md create mode 100644 packages/experimental/package.json create mode 100644 packages/experimental/src/index.ts create mode 100644 packages/experimental/src/match.ts create mode 100644 packages/experimental/test/match.test.ts create mode 100644 packages/experimental/test/support/global-setup.ts create mode 100644 packages/experimental/test/support/test-context.ts create mode 100644 packages/experimental/test/support/test-helpers.ts create mode 100644 packages/experimental/tsconfig.build.json create mode 100644 packages/experimental/tsconfig.json create mode 100644 packages/experimental/tsup.config.ts create mode 100644 packages/experimental/vitest.config.ts create mode 100644 website/blog/posts/2024-11-21-local-first-with-your-existing-api.md rename website/docs/guides/{writing-your-own-client.md => client-development.md} (99%) create mode 100644 website/docs/guides/writes.md create mode 100644 website/public/img/icons/coding.svg create mode 100644 website/public/img/icons/deploy.png create mode 100644 website/public/img/icons/install.svg create mode 100644 website/public/img/icons/shapes.svg create mode 100644 website/public/img/icons/troubleshoot.svg create mode 100644 website/public/img/icons/writes.svg diff --git a/.changeset/beige-snails-brush.md b/.changeset/beige-snails-brush.md new file mode 100644 index 0000000000..8b6dc13a40 --- /dev/null +++ b/.changeset/beige-snails-brush.md @@ -0,0 +1,5 @@ +--- +"@electric-sql/client": patch +--- + +Expose `shape.stream` as public readonly property. diff --git a/.changeset/tender-seas-stare.md b/.changeset/tender-seas-stare.md new file mode 100644 index 0000000000..ef18216bb1 --- /dev/null +++ b/.changeset/tender-seas-stare.md @@ -0,0 +1,5 @@ +--- +"@electric-sql/react": patch +--- + +Expose `stream` in the useShape result data. This allows React components to easily access the stream to match on. diff --git a/examples/nextjs-example/app/match-stream.ts b/examples/nextjs-example/app/match-stream.ts index 6c5372bf9b..c9b8b9e68e 100644 --- a/examples/nextjs-example/app/match-stream.ts +++ b/examples/nextjs-example/app/match-stream.ts @@ -23,6 +23,10 @@ export async function matchStream({ timeout?: number }): Promise> { return new Promise>((resolve, reject) => { + const timeoutId = setTimeout(() => { + reject(`matchStream timed out after ${timeout}ms`) + }, timeout) + const unsubscribe = stream.subscribe((messages) => { const message = messages.filter(isChangeMessage).find( (message) => @@ -32,18 +36,12 @@ export async function matchStream({ message: message, }) ) - if (message) return finish(message) - }) - const timeoutId = setTimeout(() => { - console.error(`matchStream timed out after ${timeout}ms`) - reject(`matchStream timed out after ${timeout}ms`) - }, timeout) - - function finish(message: ChangeMessage) { - clearTimeout(timeoutId) - unsubscribe() - return resolve(message) - } + if (message) { + clearTimeout(timeoutId) + unsubscribe() + return resolve(message) + } + }) }) } diff --git a/examples/write-patterns/.eslintrc.cjs b/examples/write-patterns/.eslintrc.cjs new file mode 100644 index 0000000000..b630f873ab --- /dev/null +++ b/examples/write-patterns/.eslintrc.cjs @@ -0,0 +1,41 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + parserOptions: { + ecmaVersion: 2022, + requireConfigFile: false, + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + }, + parser: '@typescript-eslint/parser', + plugins: ['prettier'], + rules: { + quotes: ['error', 'single'], + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + }, + ignorePatterns: [ + '**/node_modules/**', + '**/dist/**', + 'tsup.config.ts', + 'vitest.config.ts', + '.eslintrc.js', + ], +} diff --git a/examples/write-patterns/.gitignore b/examples/write-patterns/.gitignore new file mode 100644 index 0000000000..d97f3f9c91 --- /dev/null +++ b/examples/write-patterns/.gitignore @@ -0,0 +1,3 @@ +dist +node_modules +.env.local diff --git a/examples/write-patterns/.prettierrc b/examples/write-patterns/.prettierrc new file mode 100644 index 0000000000..ad4d895523 --- /dev/null +++ b/examples/write-patterns/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5" +} diff --git a/examples/write-patterns/README.md b/examples/write-patterns/README.md new file mode 100644 index 0000000000..64ad8635ed --- /dev/null +++ b/examples/write-patterns/README.md @@ -0,0 +1,71 @@ + +# Write patterns example + +This example implements and describes four different patterns for handling writes in an application built with [ElectricSQL](https://electric-sql.com). + +These patterns are described in the [Writes guide](https://electric-sql.com/docs/guides/writes) from the ElectricSQL documentation. It's worth reading the guide for context. The idea is that if you walk through these patterns in turn, you can get a sense of the range of techniques and their evolution in both power and complexity. + +The example is set up to run all the patterns together, in the page, at the same time, as components of a single React application. So you can also evaluate their behaviour side-by-side and and with different network connectivity. + +[![Screenshot of the application running](./public/screenshot.png)](https://write-patterns.electric-sql.com) + +You can see the example deployed and running online at: +https://write-patterns.examples.electric-sql.com + +## Patterns + +The main code is in the [`./patterns`](./patterns) folder, which has a subfolder for each pattern. There's also some shared code, including an API server and some app boilerplate in [`./shared`](./shared). + +All of the patterns use [Electric](https://electric-sql.com/product/sync) for the read-path (i.e.: syncing data from Postgres into the local app) and implement a different approach to the write-path (i.e.: how they handle local writes and get data from the local app back into Postgres). + +### [1. Online writes](./patterns/1-online-writes) + +The first pattern is in [`./patterns/1-online-writes`](./patterns/1-online-writes). + +This is the simplest approach, which just sends writes to an API and only works if you're online. It has a resilient client that will retry in the event of network failure but the app doesn't update until the write goes through. + +### [2. Optimistic state](./patterns/2-optimistic-state) + +The second pattern is in [`./patterns/2-optimistic-state`](./patterns/2-optimistic-state). + +It extends the first pattern with support for local offline writes with simple optimistic state. The optimistic state is "simple" in the sense that it's only available within the component that makes the write and it's not persisted if the page reloads or the component unmounts. + +### [3. Shared persistent optimistic state](./patterns/3-shared-persistent) + +The third pattern is in [`./patterns/3-shared-persistent`](./patterns/3-shared-persistent). + +It extends the second pattern by storing the optimistic state in a shared, persistent local store. This makes offline writes more resilient and avoids components getting out of sync. It's a compelling point in the design space: providing good UX and DX without introducing too much complexity or any heavy dependencies. + +### [4. Through-the-database sync](./patterns/4-database-sync) + +The fourth pattern is in [`./patterns/4-database-sync`](./patterns/4-database-sync). + +It extends the concept of shared, persistent optimistic state all the way to a local embedded database. Specifically, it: + +1. syncs data from Electric into an immutable table +2. persists local optimistic state in a shadow table +2. combines the two into a view that provides a unified interface for reads and writes +4. automatically detects local changes and syncs them to the server + +This provides a pure local-first development experience, where the application code talks directly to a single database "table" and changes sync automatically in the background. However, this "power" does come at the cost of increased complexity in the form of an embedded database, complex local schema and loss of context when handling rollbacks. + +## How to run + +Make sure you've installed all dependencies for the monorepo and built the packages (from the monorepo root directory): + +```shell +pnpm install +pnpm run -r build +``` + +Start the docker containers (in this directory): + +```shell +pnpm backend:up +``` + +Start the dev server: + +```shell +pnpm dev +``` diff --git a/examples/write-patterns/index.html b/examples/write-patterns/index.html new file mode 100644 index 0000000000..b9b77ebd17 --- /dev/null +++ b/examples/write-patterns/index.html @@ -0,0 +1,16 @@ + + + + + + Write Patterns - ElectricSQL + + + + + + +
+ + + diff --git a/examples/write-patterns/package.json b/examples/write-patterns/package.json new file mode 100644 index 0000000000..fa1108790b --- /dev/null +++ b/examples/write-patterns/package.json @@ -0,0 +1,59 @@ +{ + "name": "@electric-examples/write-patterns", + "private": true, + "version": "0.0.1", + "author": "ElectricSQL", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/electric-sql/electric/issues" + }, + "type": "module", + "scripts": { + "backend:up": "PROJECT_NAME=write-patterns pnpm -C ../../ run example-backend:up && pnpm db:migrate", + "backend:down": "PROJECT_NAME=write-patterns pnpm -C ../../ run example-backend:down", + "db:migrate": "dotenv -e ../../.env.dev -- pnpm exec pg-migrations apply --directory ./shared/migrations", + "dev": "concurrently \"vite\" \"node shared/backend/api.js\"", + "build": "vite build", + "format": "eslint . --ext ts,tsx --fix", + "stylecheck": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@electric-sql/client": "workspace:*", + "@electric-sql/experimental": "workspace:*", + "@electric-sql/pglite": "^0.2.14", + "@electric-sql/pglite-react": "^0.2.14", + "@electric-sql/pglite-sync": "^0.2.16", + "@electric-sql/react": "workspace:*", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "express": "^4.19.2", + "pg": "^8.12.0", + "react": "19.0.0-rc.1", + "react-dom": "19.0.0-rc.1", + "uuid": "^10.0.0", + "valtio": "^2.1.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "@databases/pg-migrations": "^5.0.3", + "@types/react": "npm:types-react@rc", + "@types/react-dom": "npm:types-react-dom@rc", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-react": "^4.3.1", + "concurrently": "^8.2.2", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "rollup": "2.79.2", + "typescript": "^5.5.3", + "vite": "^5.3.4", + "vite-plugin-pwa": "^0.21.0" + }, + "overrides": { + "@types/react": "npm:types-react@rc", + "@types/react-dom": "npm:types-react-dom@rc", + "react": "19.0.0-rc.1", + "react-dom": "19.0.0-rc.1" + } +} diff --git a/examples/write-patterns/patterns/1-online-writes/README.md b/examples/write-patterns/patterns/1-online-writes/README.md new file mode 100644 index 0000000000..d1dd60f04c --- /dev/null +++ b/examples/write-patterns/patterns/1-online-writes/README.md @@ -0,0 +1,32 @@ + +# Online writes pattern + +This is an example of an application using: + +- Electric for read-path sync, to sync data from into a local app +- online writes to write data back into Postgres from the local app + +It's the simplest of the [write-patterns](https://electric-sql.com/docs/guides/writes#patterns) introduced in the [Writes](https://electric-sql.com/docs/guides/writes#patterns) guide. + +> [!TIP] Other examples +> The [Phoenix LiveView example](../../../phoenix-liveview) also implements this pattern — using Electric to stream data into the LiveView client and normal Phoenix APIs to handle writes. + +## Benefits + +It's very simple to implement. It allows you [use your existing API](https://electric-sql.com/blog/2024/11/21/local-first-with-your-existing-api). It allows you to create apps that are fast and available offline for reading data. + +Good use-cases include: + +- live dashboards, data analytics and data visualisation +- AI applications that generate embeddings in the cloud +- systems where writes require online integration anyway, e.g.: making payments + +## Drawbacks + +You have the network on the write path — slow, laggy, loading spinners. + +Interactive applications won't work offline without implementing [optimistic writes with local optimistic state](../2-optimistic-state). + +## How to run + +See the [How to run](../../README.md#how-to-run) section in the example README. diff --git a/examples/write-patterns/patterns/1-online-writes/index.tsx b/examples/write-patterns/patterns/1-online-writes/index.tsx new file mode 100644 index 0000000000..10d9b79938 --- /dev/null +++ b/examples/write-patterns/patterns/1-online-writes/index.tsx @@ -0,0 +1,109 @@ +import React from 'react' +import { v4 as uuidv4 } from 'uuid' +import { useShape } from '@electric-sql/react' +import api from '../../shared/app/client' + +const ELECTRIC_URL = import.meta.env.ELECTRIC_URL || 'http://localhost:3000' + +type Todo = { + id: string + title: string + completed: boolean + created_at: Date +} + +export default function OnlineWrites() { + // Use Electric's `useShape` hook to sync data from Postgres + // into a React state variable. + const { isLoading, data } = useShape({ + url: `${ELECTRIC_URL}/v1/shape`, + params: { + table: 'todos', + }, + parser: { + timestamptz: (value: string) => new Date(value), + }, + }) + + const todos = data ? data.sort((a, b) => +a.created_at - +b.created_at) : [] + + // Handle user input events by making requests to the backend + // API to create, update and delete todos. + + async function createTodo(event: React.FormEvent) { + event.preventDefault() + + const form = event.target as HTMLFormElement + const formData = new FormData(form) + const title = formData.get('todo') as string + + const path = '/todos' + const data = { + id: uuidv4(), + title: title, + created_at: new Date(), + } + + await api.request(path, 'POST', data) + + form.reset() + } + + async function updateTodo(todo: Todo) { + const path = `/todos/${todo.id}` + + const data = { + completed: !todo.completed, + } + + await api.request(path, 'PUT', data) + } + + async function deleteTodo(event: React.MouseEvent, todo: Todo) { + event.preventDefault() + + const path = `/todos/${todo.id}` + + await api.request(path, 'DELETE') + } + + if (isLoading) { + return
Loading …
+ } + + // prettier-ignore + return ( +
+

1. Online writes

+
    + {todos.map((todo) => ( +
  • + + deleteTodo(event, todo)}> + ✕ +
  • + ))} + {todos.length === 0 && ( +
  • All done 🎉
  • + )} +
+
+ + +
+
+ ) +} diff --git a/examples/write-patterns/patterns/2-optimistic-state/README.md b/examples/write-patterns/patterns/2-optimistic-state/README.md new file mode 100644 index 0000000000..cd52e3d7ec --- /dev/null +++ b/examples/write-patterns/patterns/2-optimistic-state/README.md @@ -0,0 +1,31 @@ + +# Optimistic state pattern + +This is an example of an application using: + +- Electric for read-path sync, to sync data from into a local app +- local-optimistic writes using React's built-in [`useOptimistic`](https://react.dev/reference/react/useOptimistic) hook + +This allows writes to be displayed locally immediately, by merging temporary optimistic state into the synced todo list before rendering. If the app (or API) is offline, then the writes are retried following a backoff algorithm and should eventually succeed when the app (or API) comes back online. + +When the writes do succeed, they are automatically synced back to the app via Electric and the local optimistic state is discarded. + +## Benefits + +Simple to implement. Allows you [use your existing API](https://electric-sql.com/blog/2024/11/21/local-first-with-your-existing-api). Takes the network off the write path. Allows you to create apps that are fast and available offline for both reading and writing data. + +Good use-cases include: + +- management apps and interactive dashboards +- apps that want to feel fast and avoid loading spinners on write +- mobile apps that want to be resilient to patchy connectivity + +## Drawbacks + +The optimistic state is only available within the component that makes the write. This means that other components rendering the same state may not see it and may display stale data. The optimistic state is also not peristent. So it's lost if you unmount the component or reload the page. + +These limitations are addressed by the [shared persistent optimistic state](../../3-shared-persistent) pattern. + +## How to run + +See the [How to run](../../README.md#how-to-run) section in the example README. diff --git a/examples/write-patterns/patterns/2-optimistic-state/index.tsx b/examples/write-patterns/patterns/2-optimistic-state/index.tsx new file mode 100644 index 0000000000..1c8a3d221e --- /dev/null +++ b/examples/write-patterns/patterns/2-optimistic-state/index.tsx @@ -0,0 +1,193 @@ +import React, { useOptimistic, useTransition } from 'react' +import { v4 as uuidv4 } from 'uuid' +import { matchBy, matchStream } from '@electric-sql/experimental' +import { useShape } from '@electric-sql/react' +import api from '../../shared/app/client' + +const ELECTRIC_URL = import.meta.env.ELECTRIC_URL || 'http://localhost:3000' + +type Todo = { + id: string + title: string + completed: boolean + created_at: Date +} +type PartialTodo = Partial & { + id: string +} + +type Write = { + operation: 'insert' | 'update' | 'delete' + value: PartialTodo +} + +export default function OptimisticState() { + const [isPending, startTransition] = useTransition() + + // Use Electric's `useShape` hook to sync data from Postgres + // into a React state variable. + // + // Note that we also unpack the `stream` from the useShape + // return value, so that we can monitor it below to detect + // local writes syncing back from the server. + const { isLoading, data, stream } = useShape({ + url: `${ELECTRIC_URL}/v1/shape`, + params: { + table: 'todos', + }, + parser: { + timestamptz: (value: string) => new Date(value), + }, + }) + + const sorted = data ? data.sort((a, b) => +a.created_at - +b.created_at) : [] + + // Use React's built in `useOptimistic` hook. This provides + // a mechanism to apply local optimistic state whilst writes + // are being sent-to and syncing-back-from the server. + const [todos, addOptimisticState] = useOptimistic( + sorted, + (synced: Todo[], { operation, value }: Write) => { + switch (operation) { + case 'insert': + return synced.some((todo) => todo.id === value.id) + ? synced + : [...synced, value as Todo] + + case 'update': + return synced.map((todo) => + todo.id === value.id ? { ...todo, ...value } : todo + ) + + case 'delete': + return synced.filter((todo) => todo.id !== value.id) + } + } + ) + + // These are the same event handler functions from the online + // example, extended with `startTransition` -> `addOptimisticState` + // to apply local optimistic state. + // + // Note that the local state is applied: + // + // 1. whilst the HTTP request is being made to the API server; and + // 2. until the write syncs back through the Electric shape stream + // + // This is slightly different from most optimistic state examples + // because we wait for the sync as well as the api request. + + async function createTodo(event: React.FormEvent) { + event.preventDefault() + + const form = event.target as HTMLFormElement + const formData = new FormData(form) + const title = formData.get('todo') as string + + const path = '/todos' + const data = { + id: uuidv4(), + title: title, + created_at: new Date(), + completed: false, + } + + startTransition(async () => { + addOptimisticState({ operation: 'insert', value: data }) + + const fetchPromise = api.request(path, 'POST', data) + const syncPromise = matchStream( + stream, + ['insert'], + matchBy('id', data.id) + ) + + await Promise.all([fetchPromise, syncPromise]) + }) + + form.reset() + } + + async function updateTodo(todo: Todo) { + const { id, completed } = todo + + const path = `/todos/${id}` + const data = { + id, + completed: !completed, + } + + startTransition(async () => { + addOptimisticState({ operation: 'update', value: data }) + + const fetchPromise = api.request(path, 'PUT', data) + const syncPromise = matchStream(stream, ['update'], matchBy('id', id)) + + await Promise.all([fetchPromise, syncPromise]) + }) + } + + async function deleteTodo(event: React.MouseEvent, todo: Todo) { + event.preventDefault() + + const { id } = todo + + const path = `/todos/${id}` + + startTransition(async () => { + addOptimisticState({ operation: 'delete', value: { id } }) + + const fetchPromise = api.request(path, 'DELETE') + const syncPromise = matchStream(stream, ['delete'], matchBy('id', id)) + + await Promise.all([fetchPromise, syncPromise]) + }) + } + + if (isLoading) { + return
Loading …
+ } + + // The template below the heading is identical to the other patterns. + + // prettier-ignore + return ( +
+

+ + 2. Optimistic state + + +

+
    + {todos.map((todo) => ( +
  • + + deleteTodo(event, todo)}> + ✕ +
  • + ))} + {todos.length === 0 && ( +
  • All done 🎉
  • + )} +
+
+ + +
+
+ ) +} diff --git a/examples/write-patterns/patterns/3-shared-persistent/README.md b/examples/write-patterns/patterns/3-shared-persistent/README.md new file mode 100644 index 0000000000..8b1951dcdf --- /dev/null +++ b/examples/write-patterns/patterns/3-shared-persistent/README.md @@ -0,0 +1,42 @@ + +# Shared persistent optimistic state pattern + +This is an example of an application using: + +- Electric for read-path sync +- local optimistic writes with shared, persistent optimistic state + +This pattern can be implemented with a variety of client-side state management and storage mechanisms. This example uses [valtio](https://valtio.dev) for a shared reactive store and persists this store to localStorage on any change. This allows us to keep the code very similar to the previous [`../2-optimistic-state`](../2-optimistic-state) pattern (with a valtio `useSnapshot` and a custom reduce function playing almost exactly the same role as the React `useOptimistic` hook). + +## Benefits + +This is a powerful and pragmatic pattern, occupying a compelling point in the design space. It's relatively simple to implement. Persisting optimistic state makes local writes more resilient. + +Storing optimistic state in a shared store allows all your components to see and react to it. This avoids one of the weaknesses with component-scoped optimistic state with a [more naive optimistic state pattern](../2-optimistic-state) and makes this pattern more suitable for more complex, real world apps. + +Seperating immutable synced state from mutable local state makes it easy to reason about and implement rollback strategies. The entrypoint for handling rollbacks has the local write context as well as the shared store, so it's easy to make rollbacks relatively surgical. + +Good use-cases include: + +- building local-first software +- interactive SaaS applications +- collaboration and authoring software + +## Drawbacks + +Combining data on-read makes local reads slightly slower. + +Writes are still made via an API. This can often be helpful and pragmatic, allowing you to [re-use your existing API](https://electric-sql.com/blog/2024/11/21/local-first-with-your-existing-api). However, you may want to avoid running an API and leverage [through the DB sync](../4-through-the-db) for a purer local-first approach. + +## Implementation notes + +The merge logic in the `matchWrite` function supports rebasing local optimistic state on concurrent updates from other users. + +This differs from the previous optimistic state example, in that it matches inserts and updates on the `write_id`, rather than the `id`. This means that concurrent updates to the same row will not +clear the optimistic state, which allows it to be rebased on changes made concurrently to the same data by other users. + +Note that we still match deletes by `id`, because delete operations can't update the `write_id` column. If you'd like to support revertable concurrent deletes, you can use soft deletes (which are obviously actually updates). + +## How to run + +See the [How to run](../../README.md#how-to-run) section in the example README. diff --git a/examples/write-patterns/patterns/3-shared-persistent/index.tsx b/examples/write-patterns/patterns/3-shared-persistent/index.tsx new file mode 100644 index 0000000000..4c3c5b6f45 --- /dev/null +++ b/examples/write-patterns/patterns/3-shared-persistent/index.tsx @@ -0,0 +1,258 @@ +import React, { useTransition } from 'react' +import { v4 as uuidv4 } from 'uuid' +import { subscribe, useSnapshot } from 'valtio' +import { proxyMap } from 'valtio/utils' + +import { type Operation, ShapeStream } from '@electric-sql/client' +import { matchBy, matchStream } from '@electric-sql/experimental' +import { useShape } from '@electric-sql/react' + +import api from '../../shared/app/client' + +const ELECTRIC_URL = import.meta.env.ELECTRIC_URL || 'http://localhost:3000' +const KEY = 'electric-sql/examples/write-patterns/shared-persistent' + +type Todo = { + id: string + title: string + completed: boolean + created_at: Date +} +type PartialTodo = Partial & { + id: string +} + +type LocalWrite = { + id: string + operation: Operation + value: PartialTodo +} + +// Define a shared, persistent, reactive store for local optimistic state. +const optimisticState = proxyMap( + JSON.parse(localStorage.getItem(KEY) || '[]') +) +subscribe(optimisticState, () => { + localStorage.setItem(KEY, JSON.stringify([...optimisticState])) +}) + +/* + * Add a local write to the optimistic state + */ +function addLocalWrite(operation: Operation, value: PartialTodo): LocalWrite { + const id = uuidv4() + + const write: LocalWrite = { + id, + operation, + value, + } + + optimisticState.set(id, write) + + return write +} + +/* + * Subscribe to the shape `stream` until the local write syncs back through it. + * At which point, delete the local write from the optimistic state. + */ +async function matchWrite( + stream: ShapeStream, + write: LocalWrite +): Promise { + const { operation, value } = write + + const matchFn = + operation === 'delete' + ? matchBy('id', value.id) + : matchBy('write_id', write.id) + + try { + await matchStream(stream, [operation], matchFn) + } catch (_err) { + return + } + + optimisticState.delete(write.id) +} + +/* + * Make an HTTP request to send the write to the API server. + * If the request fails, delete the local write from the optimistic state. + * If it succeeds, return the `txid` of the write from the response data. + */ +async function sendRequest( + path: string, + method: string, + { id, value }: LocalWrite +): Promise { + const data = { + ...value, + write_id: id, + } + + let response: Response | undefined + try { + response = await api.request(path, method, data) + } catch (err) { + // ignore + } + + if (response === undefined || !response.ok) { + optimisticState.delete(id) + } +} + +export default function SharedPersistent() { + const [isPending, startTransition] = useTransition() + + // Use Electric's `useShape` hook to sync data from Postgres. + const { isLoading, data, stream } = useShape({ + url: `${ELECTRIC_URL}/v1/shape`, + params: { + table: 'todos', + }, + parser: { + timestamptz: (value: string) => new Date(value), + }, + }) + + const sorted = data ? data.sort((a, b) => +a.created_at - +b.created_at) : [] + + // Get the local optimistic state. + const localWrites = useSnapshot>(optimisticState) + + // Merge the synced state with the local state. + const todos = localWrites + .values() + .reduce((synced: Todo[], { operation, value }: LocalWrite) => { + switch (operation) { + case 'insert': + return synced.some((todo) => todo.id === value.id) + ? synced + : [...synced, value as Todo] + + case 'update': + return synced.map((todo) => + todo.id === value.id ? { ...todo, ...value } : todo + ) + + case 'delete': + return synced.filter((todo) => todo.id !== value.id) + } + }, sorted) + + // These are the same event handler functions from the previous optimistic + // state pattern, adapted to add the state to the shared, persistent store. + + async function createTodo(event: React.FormEvent) { + event.preventDefault() + + const form = event.target as HTMLFormElement + const formData = new FormData(form) + const title = formData.get('todo') as string + + const path = '/todos' + const data = { + id: uuidv4(), + title: title, + completed: false, + created_at: new Date(), + } + + startTransition(async () => { + const write = addLocalWrite('insert', data) + const fetchPromise = sendRequest(path, 'POST', write) + const syncPromise = matchWrite(stream, write) + + await Promise.all([fetchPromise, syncPromise]) + }) + + form.reset() + } + + async function updateTodo(todo: Todo) { + const { id, completed } = todo + + const path = `/todos/${id}` + const data = { + id, + completed: !completed, + } + + startTransition(async () => { + const write = addLocalWrite('update', data) + const fetchPromise = sendRequest(path, 'PUT', write) + const syncPromise = matchWrite(stream, write) + + await Promise.all([fetchPromise, syncPromise]) + }) + } + + async function deleteTodo(event: React.MouseEvent, todo: Todo) { + event.preventDefault() + + const { id } = todo + + const path = `/todos/${id}` + const data = { + id, + } + + startTransition(async () => { + const write = addLocalWrite('delete', data) + const fetchPromise = sendRequest(path, 'DELETE', write) + const syncPromise = matchWrite(stream, write) + + await Promise.all([fetchPromise, syncPromise]) + }) + } + + if (isLoading) { + return
Loading …
+ } + + // The template below the heading is identical to the other patterns. + + // prettier-ignore + return ( +
+

+ + 3. Shared persistent + + +

+
    + {todos.map((todo) => ( +
  • + + deleteTodo(event, todo)}> + ✕ +
  • + ))} + {todos.length === 0 && ( +
  • All done 🎉
  • + )} +
+
+ + +
+
+ ) +} diff --git a/examples/write-patterns/patterns/4-through-the-db/README.md b/examples/write-patterns/patterns/4-through-the-db/README.md new file mode 100644 index 0000000000..726e396243 --- /dev/null +++ b/examples/write-patterns/patterns/4-through-the-db/README.md @@ -0,0 +1,51 @@ + +# Through-the-database sync pattern + +This is an example of an application using: + +- Electric for read-path sync +- local reads and writes to and from a single DB table +- shared, persistent optimistic state +- automatic change detection and background sync + +The implementation uses a local embedded [PGlite](https://electric-sql.com/product/pglite) database, to store both synced and local optimistic state. It automatically manages optimistic state lifecycle, presents a single table interface for reads and writes and auto-syncs the local writes. + +Specifically, we: + +1. sync data into an immutable table +2. persist optimistic state in a shadow table +3. combine the two on read using a view + +Plus for the write path sync, we: + +4. detect local writes +5. write them into a change log table +6. POST the changes to the API server + +## Benefits + +This provides full offline support, shared optimistic state and allows your components to interact purely with the local database. No coding over the network is needed. Data fetching and sending is abstracted away behind the Electric sync (for reads) and the change message log (for writes). + +Good use-cases include: + +- building local-first software +- mobile and desktop applications +- collaboration and authoring software + +## Drawbacks + +Using a local embedded database adds a relatively-heavy dependency to your app. The shadow table and trigger machinery complicate your client side schema definition. + +Syncing changes in the background complicates any potential rollback handling. In the [shared persistent optimistic state](../../3-shared-persistent) pattern, you can detect a write being rejected by the server whilst still in context, handling user input. With through the database sync, this context is harder to reconstruct. + +## Implementation notes + +The merge logic in the `delete_local_on_synced_insert_and_update_trigger` in [`./local-schema.sql`](./local-schema.sql) supports rebasing local optimistic state on concurrent updates from other users. + +The rollback strategy in the `rollback` method of the `ChangeLogSynchronizer` in [`./sync.ts`](./sync.ts) is very naive: clearing all local state and writes in the event of any write being rejected by the server. You may want to implement a more nuanced strategy. For example, to provide information to the user about what is happening and / or minimise data loss by only clearing local-state that's causally dependent on a rejected write. + +This opens the door to a lot of complexity that may best be addressed by using an existing framework. See the [Writes guide](https://electric-sql.com/docs/guides/writes) for more information and links to [existing frameworks](https://electric-sql.com/docs/guides/writes#tools). + +## How to run + +See the [How to run](../../README.md#how-to-run) section in the example README. diff --git a/examples/write-patterns/patterns/4-through-the-db/db.ts b/examples/write-patterns/patterns/4-through-the-db/db.ts new file mode 100644 index 0000000000..3ac8c56162 --- /dev/null +++ b/examples/write-patterns/patterns/4-through-the-db/db.ts @@ -0,0 +1,43 @@ +import { PGlite } from '@electric-sql/pglite' +import { type PGliteWithLive, live } from '@electric-sql/pglite/live' +import { electricSync } from '@electric-sql/pglite-sync' + +import localSchemaMigrations from './local-schema.sql?raw' + +const DATA_DIR = 'idb://electric-write-patterns-example' +const ELECTRIC_URL = import.meta.env.ELECTRIC_URL || 'http://localhost:3000' + +const registry = new Map>() + +export default async function loadPGlite(): Promise { + const loadingPromise = registry.get('loadingPromise') + + if (loadingPromise === undefined) { + registry.set('loadingPromise', _loadPGlite()) + } + + return loadingPromise as Promise +} + +async function _loadPGlite(): Promise { + const pglite: PGliteWithLive = await PGlite.create(DATA_DIR, { + extensions: { + electric: electricSync(), + live, + }, + }) + + await pglite.exec(localSchemaMigrations) + + await pglite.electric.syncShapeToTable({ + shape: { + url: `${ELECTRIC_URL}/v1/shape`, + table: 'todos', + }, + shapeKey: 'todos', + table: 'todos_synced', + primaryKey: ['id'], + }) + + return pglite +} diff --git a/examples/write-patterns/patterns/4-through-the-db/index.tsx b/examples/write-patterns/patterns/4-through-the-db/index.tsx new file mode 100644 index 0000000000..05f17a7af4 --- /dev/null +++ b/examples/write-patterns/patterns/4-through-the-db/index.tsx @@ -0,0 +1,167 @@ +import React, { useEffect, useState } from 'react' +import { v4 as uuidv4 } from 'uuid' + +import { + PGliteProvider, + useLiveQuery, + usePGlite, +} from '@electric-sql/pglite-react' +import { type PGliteWithLive } from '@electric-sql/pglite/live' + +import loadPGlite from './db' +import ChangeLogSynchronizer from './sync' + +type Todo = { + id: string + title: string + completed: boolean + created_at: Date +} + +/* + * Setup the local PGlite database, with automatic change detection and syncing. + * + * See `./local-schema.sql` for the local database schema, including view + * and trigger machinery. + * + * See `./sync.ts` for the write-path sync utility, which listens to changes + * using pg_notify, as per https://pglite.dev/docs/api#listen + */ +export default function Wrapper() { + const [db, setDb] = useState() + + useEffect(() => { + let isMounted = true + let writePathSync: ChangeLogSynchronizer + + async function init() { + const pglite = await loadPGlite() + + if (!isMounted) { + return + } + + writePathSync = new ChangeLogSynchronizer(pglite) + writePathSync.start() + + setDb(pglite) + } + + init() + + return () => { + isMounted = false + + if (writePathSync !== undefined) { + writePathSync.stop() + } + } + }, []) + + if (db === undefined) { + return
Loading …
+ } + + return ( + + + + ) +} + +function ThroughTheDB() { + const db = usePGlite() + const results = useLiveQuery('SELECT * FROM todos ORDER BY created_at') + + async function createTodo(event: React.FormEvent) { + event.preventDefault() + + const form = event.target as HTMLFormElement + const formData = new FormData(form) + const title = formData.get('todo') as string + + await db.sql` + INSERT INTO todos ( + id, + title, + completed, + created_at + ) + VALUES ( + ${uuidv4()}, + ${title}, + ${false}, + ${new Date()} + ) + ` + + form.reset() + } + + async function updateTodo(todo: Todo) { + const { id, completed } = todo + + await db.sql` + UPDATE todos + SET completed = ${!completed} + WHERE id = ${id} + ` + } + + async function deleteTodo(event: React.MouseEvent, todo: Todo) { + event.preventDefault() + + await db.sql` + DELETE FROM todos + WHERE id = ${todo.id} + ` + } + + if (results === undefined) { + return
Loading …
+ } + + const todos = results.rows + + // The template below the heading is identical to the other patterns. + + // prettier-ignore + return ( +
+

+ + 4. Through the DB + +

+
    + {todos.map((todo: Todo) => ( +
  • + + deleteTodo(event, todo)}> + ✕ +
  • + ))} + {todos.length === 0 && ( +
  • All done 🎉
  • + )} +
+
+ + +
+
+ ) +} diff --git a/examples/write-patterns/patterns/4-through-the-db/local-schema.sql b/examples/write-patterns/patterns/4-through-the-db/local-schema.sql new file mode 100644 index 0000000000..d20a2133e1 --- /dev/null +++ b/examples/write-patterns/patterns/4-through-the-db/local-schema.sql @@ -0,0 +1,345 @@ +-- This is the local database schema for PGlite. + +-- It uses two tables: `todos_synced` and `todos_local`. These are combined +-- into a `todos` view that provides a merged view on both tables and supports +-- local live queries. Writes to the `todos` view are redirected using +-- `INSTEAD OF` triggers to the `todos_local` and `changes` tables. + +-- The `todos_synced` table for immutable, synced state from the server. +CREATE TABLE IF NOT EXISTS todos_synced ( + id UUID PRIMARY KEY, + title TEXT NOT NULL, + completed BOOLEAN NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + -- Bookkeeping column. + write_id UUID +); + +-- The `todos_local` table for local optimistic state. +CREATE TABLE IF NOT EXISTS todos_local ( + id UUID PRIMARY KEY, + title TEXT, + completed BOOLEAN, + created_at TIMESTAMP WITH TIME ZONE, + -- Bookkeeping columns. + changed_columns TEXT[], + is_deleted BOOLEAN NOT NULL DEFAULT FALSE, + write_id UUID NOT NULL +); + +-- The `todos` view to combine the two tables on read. +CREATE OR REPLACE VIEW todos AS + SELECT + COALESCE(local.id, synced.id) AS id, + CASE + WHEN 'title' = ANY(local.changed_columns) + THEN local.title + ELSE synced.title + END AS title, + CASE + WHEN 'completed' = ANY(local.changed_columns) + THEN local.completed + ELSE synced.completed + END AS completed, + CASE + WHEN 'created_at' = ANY(local.changed_columns) + THEN local.created_at + ELSE synced.created_at + END AS created_at + FROM todos_synced AS synced + FULL OUTER JOIN todos_local AS local + ON synced.id = local.id + WHERE local.id IS NULL OR local.is_deleted = FALSE; + +-- Triggers to automatically remove local optimistic state when the corresponding +-- row syncs over the replication stream. Match on `write_id`, to allow local +-- state to be rebased on concurrent changes to the same row. +CREATE OR REPLACE FUNCTION delete_local_on_synced_insert_and_update_trigger() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM todos_local + WHERE id = NEW.id + AND write_id IS NOT NULL + AND write_id = NEW.write_id; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- N.b.: deletes can be concurrent, but can't update the `write_id` and aren't +-- revertable (once a row is deleted, it would be re-created with an insert), +-- so its safe to just match on ID. You could implement revertable concurrent +-- deletes using soft deletes (which are actually updates). +CREATE OR REPLACE FUNCTION delete_local_on_synced_delete_trigger() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM todos_local WHERE id = OLD.id; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER delete_local_on_synced_insert +AFTER INSERT ON todos_synced +FOR EACH ROW +EXECUTE FUNCTION delete_local_on_synced_insert_trigger(); + +CREATE OR REPLACE TRIGGER delete_local_on_synced_insert_and_update +AFTER UPDATE ON todos_synced +FOR EACH ROW +EXECUTE FUNCTION delete_local_on_synced_insert_and_update_trigger(); + +-- The local `changes` table for capturing and persisting a log +-- of local write operations that we want to sync to the server. +CREATE TABLE IF NOT EXISTS changes ( + id BIGSERIAL PRIMARY KEY, + operation TEXT NOT NULL, + value JSONB NOT NULL, + write_id UUID NOT NULL, + transaction_id XID8 NOT NULL +); + +-- The following `INSTEAD OF` triggers: +-- 1. allow the app code to write directly to the view +-- 2. to capture write operations and write change messages into the + +-- The insert trigger +CREATE OR REPLACE FUNCTION todos_insert_trigger() +RETURNS TRIGGER AS $$ +DECLARE + local_write_id UUID := gen_random_uuid(); +BEGIN + IF EXISTS (SELECT 1 FROM todos_synced WHERE id = NEW.id) THEN + RAISE EXCEPTION 'Cannot insert: id already exists in the synced table'; + END IF; + IF EXISTS (SELECT 1 FROM todos_local WHERE id = NEW.id) THEN + RAISE EXCEPTION 'Cannot insert: id already exists in the local table'; + END IF; + + -- Insert into the local table. + INSERT INTO todos_local ( + id, + title, + completed, + created_at, + changed_columns, + write_id + ) + VALUES ( + NEW.id, + NEW.title, + NEW.completed, + NEW.created_at, + ARRAY['title', 'completed', 'created_at'], + local_write_id + ); + + -- Record the write operation in the change log. + INSERT INTO changes ( + operation, + value, + write_id, + transaction_id + ) + VALUES ( + 'insert', + jsonb_build_object( + 'id', NEW.id, + 'title', NEW.title, + 'completed', NEW.completed, + 'created_at', NEW.created_at + ), + local_write_id, + pg_current_xact_id() + ); + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- The update trigger +CREATE OR REPLACE FUNCTION todos_update_trigger() +RETURNS TRIGGER AS $$ +DECLARE + synced todos_synced%ROWTYPE; + local todos_local%ROWTYPE; + changed_cols TEXT[] := '{}'; + local_write_id UUID := gen_random_uuid(); +BEGIN + -- Fetch the corresponding rows from the synced and local tables + SELECT * INTO synced FROM todos_synced WHERE id = NEW.id; + SELECT * INTO local FROM todos_local WHERE id = NEW.id; + + -- If the row is not present in the local table, insert it + IF NOT FOUND THEN + -- Compare each column with the synced table and add to changed_cols if different + IF NEW.title IS DISTINCT FROM synced.title THEN + changed_cols := array_append(changed_cols, 'title'); + END IF; + IF NEW.completed IS DISTINCT FROM synced.completed THEN + changed_cols := array_append(changed_cols, 'completed'); + END IF; + IF NEW.created_at IS DISTINCT FROM synced.created_at THEN + changed_cols := array_append(changed_cols, 'created_at'); + END IF; + + INSERT INTO todos_local ( + id, + title, + completed, + created_at, + changed_columns, + write_id + ) + VALUES ( + NEW.id, + NEW.title, + NEW.completed, + NEW.created_at, + changed_cols, + local_write_id + ); + + -- Otherwise, if the row is already in the local table, update it and adjust + -- the changed_columns + ELSE + UPDATE todos_local + SET + title = + CASE + WHEN NEW.title IS DISTINCT FROM synced.title + THEN NEW.title + ELSE local.title + END, + completed = + CASE + WHEN NEW.completed IS DISTINCT FROM synced.completed + THEN NEW.completed + ELSE local.completed + END, + created_at = + CASE + WHEN NEW.created_at IS DISTINCT FROM synced.created_at + THEN NEW.created_at + ELSE local.created_at + END, + -- Set the changed_columns to columes that have both been marked as changed + -- and have values that have actually changed. + changed_columns = ( + SELECT array_agg(DISTINCT col) FROM ( + SELECT unnest(local.changed_columns) AS col + UNION + SELECT unnest(ARRAY['title', 'completed', 'created_at']) AS col + ) AS cols + WHERE ( + CASE + WHEN col = 'title' + THEN COALESCE(NEW.title, local.title) IS DISTINCT FROM synced.title + WHEN col = 'completed' + THEN COALESCE(NEW.completed, local.completed) IS DISTINCT FROM synced.completed + WHEN col = 'created_at' + THEN COALESCE(NEW.created_at, local.created_at) IS DISTINCT FROM synced.created_at + END + ) + ), + write_id = local_write_id + WHERE id = NEW.id; + END IF; + + -- Record the update into the change log. + INSERT INTO changes ( + operation, + value, + write_id, + transaction_id + ) + VALUES ( + 'update', + jsonb_strip_nulls( + jsonb_build_object( + 'id', NEW.id, + 'title', NEW.title, + 'completed', NEW.completed, + 'created_at', NEW.created_at + ) + ), + local_write_id, + pg_current_xact_id() + ); + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- The delete trigger +CREATE OR REPLACE FUNCTION todos_delete_trigger() +RETURNS TRIGGER AS $$ +DECLARE + local_write_id UUID := gen_random_uuid(); +BEGIN + -- Upsert a soft-deletion record in the local table. + IF EXISTS (SELECT 1 FROM todos_local WHERE id = OLD.id) THEN + UPDATE todos_local + SET + is_deleted = TRUE, + write_id = local_write_id + WHERE id = OLD.id; + ELSE + INSERT INTO todos_local ( + id, + is_deleted, + write_id + ) + VALUES ( + OLD.id, + TRUE, + local_write_id + ); + END IF; + + -- Record in the change log. + INSERT INTO changes ( + operation, + value, + write_id, + transaction_id + ) + VALUES ( + 'delete', + jsonb_build_object( + 'id', OLD.id + ), + local_write_id, + pg_current_xact_id() + ); + + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER todos_insert +INSTEAD OF INSERT ON todos +FOR EACH ROW +EXECUTE FUNCTION todos_insert_trigger(); + +CREATE OR REPLACE TRIGGER todos_update +INSTEAD OF UPDATE ON todos +FOR EACH ROW +EXECUTE FUNCTION todos_update_trigger(); + +CREATE OR REPLACE TRIGGER todos_delete +INSTEAD OF DELETE ON todos +FOR EACH ROW +EXECUTE FUNCTION todos_delete_trigger(); + +-- Notify on a `changes` topic whenever anything is added to the change log. +CREATE OR REPLACE FUNCTION changes_notify_trigger() +RETURNS TRIGGER AS $$ +BEGIN + NOTIFY changes; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER changes_notify +AFTER INSERT ON changes +FOR EACH ROW +EXECUTE FUNCTION changes_notify_trigger(); diff --git a/examples/write-patterns/patterns/4-through-the-db/sync.ts b/examples/write-patterns/patterns/4-through-the-db/sync.ts new file mode 100644 index 0000000000..98b832a776 --- /dev/null +++ b/examples/write-patterns/patterns/4-through-the-db/sync.ts @@ -0,0 +1,194 @@ +import { type Operation } from '@electric-sql/client' +import { type PGliteWithLive } from '@electric-sql/pglite/live' + +import api from '../../shared/app/client' + +type Change = { + id: number + operation: Operation + value: { + id: string + title?: string + completed?: boolean + created_at?: Date + } + write_id: string + transaction_id: string +} + +type SendResult = 'accepted' | 'rejected' | 'retry' + +/* + * Minimal, naive synchronization utility, just to illustrate the pattern of + * `listen`ing to `changes` and `POST`ing them to the api server. + */ +export default class ChangeLogSynchronizer { + #db: PGliteWithLive + #position: number + + #hasChangedWhileProcessing: boolean = false + #shouldContinue: boolean = true + #status: 'idle' | 'processing' = 'idle' + + #abortController?: AbortController + #unsubscribe?: () => Promise + + constructor(db: PGliteWithLive, position = 0) { + this.#db = db + this.#position = position + } + + /* + * Start by listening for notifications. + */ + async start(): Promise { + this.#abortController = new AbortController() + this.#unsubscribe = await this.#db.listen('changes', this.handle.bind(this)) + + this.process() + } + + /* + * On notify, either kick off processing or note down that there were changes + * so we can process them straightaway on the next loop. + */ + async handle(): Promise { + if (this.#status === 'processing') { + this.#hasChangedWhileProcessing = true + + return + } + + this.#status = 'processing' + + this.process() + } + + // Process the changes by fetching them and posting them to the server. + // If the changes are accepted then proceed, otherwise rollback or retry. + async process(): Promise { + this.#hasChangedWhileProcessing = false + + const { changes, position } = await this.query() + + if (changes.length) { + const result: SendResult = await this.send(changes) + + switch (result) { + case 'accepted': + await this.proceed(position) + + break + + case 'rejected': + await this.rollback() + + break + + case 'retry': + this.#hasChangedWhileProcessing = true + + break + } + } + + if (this.#hasChangedWhileProcessing && this.#shouldContinue) { + return await this.process() + } + + this.#status = 'idle' + } + + /* + * Fetch the current batch of changes + */ + async query(): Promise<{ changes: Change[]; position: number }> { + const { rows } = await this.#db.sql` + SELECT * from changes + WHERE id > ${this.#position} + ORDER BY id asc + ` + + const position = rows.length ? rows.at(-1)!.id : this.#position + + return { + changes: rows, + position, + } + } + + /* + * Send the current batch of changes to the server, grouped by transaction. + */ + async send(changes: Change[]): Promise { + const path = '/changes' + + const groups = Object.groupBy(changes, (x) => x.transaction_id) + const sorted = Object.entries(groups).sort((a, b) => + a[0].localeCompare(b[0]) + ) + const transactions = sorted.map(([transaction_id, changes]) => { + return { + id: transaction_id, + changes: changes, + } + }) + + const signal = this.#abortController?.signal + + let response: Response | undefined + try { + response = await api.request(path, 'POST', transactions, signal) + } catch (_err) { + return 'retry' + } + + if (response === undefined) { + return 'retry' + } + + if (response.ok) { + return 'accepted' + } + + return response.status < 500 ? 'rejected' : 'retry' + } + + /* + * Proceed by clearing the processed changes and moving the position forward. + */ + async proceed(position: number): Promise { + await this.#db.sql` + DELETE from changes + WHERE id <= ${position} + ` + + this.#position = position + } + + /* + * Rollback with an extremely naive strategy: if any write is rejected, simply + * wipe the entire local state. + */ + async rollback(): Promise { + await this.#db.transaction(async (tx) => { + await tx.sql`DELETE from changes` + await tx.sql`DELETE from todos_local` + }) + } + + /* + * Stop synchronizing + */ + async stop(): Promise { + this.#shouldContinue = false + + if (this.#abortController !== undefined) { + this.#abortController.abort() + } + + if (this.#unsubscribe !== undefined) { + await this.#unsubscribe() + } + } +} diff --git a/examples/write-patterns/patterns/index.ts b/examples/write-patterns/patterns/index.ts new file mode 100644 index 0000000000..653ca5bfcd --- /dev/null +++ b/examples/write-patterns/patterns/index.ts @@ -0,0 +1,4 @@ +export { default as OnlineWrites } from './1-online-writes' +export { default as OptimisticState } from './2-optimistic-state' +export { default as SharedPersistent } from './3-shared-persistent' +export { default as ThroughTheDB } from './4-through-the-db' diff --git a/examples/write-patterns/public/robots.txt b/examples/write-patterns/public/robots.txt new file mode 100644 index 0000000000..14267e9032 --- /dev/null +++ b/examples/write-patterns/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / \ No newline at end of file diff --git a/examples/write-patterns/public/screenshot.png b/examples/write-patterns/public/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9ecade6e997f9bdd6666e1a506a059045a2b2fb0 GIT binary patch literal 407261 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

}>8hn-Y&(`pre_dJ~d{bdC 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�LIn3!i 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 z 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

o} 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 S?)fS3kEE!aNUo6f^Zy6!`v { + return ( +

+ ) +} + +export default App diff --git a/examples/write-patterns/shared/app/client.ts b/examples/write-patterns/shared/app/client.ts new file mode 100644 index 0000000000..967cca7419 --- /dev/null +++ b/examples/write-patterns/shared/app/client.ts @@ -0,0 +1,74 @@ +const API_URL = import.meta.env.API_URL || 'http://localhost:3001' + +type RequestOptions = { + method: string + headers: HeadersInit + body?: string + signal?: AbortSignal +} + +// Keeps trying for 3 minutes, with the delay +// increasing slowly from 1 to 20 seconds. +const maxRetries = 32 +const backoffMultiplier = 1.1 +const initialDelayMs = 1_000 + +async function retryFetch( + url: string, + options: RequestOptions, + retryCount: number +): Promise { + if (retryCount > maxRetries) { + return + } + + const delay = retryCount * backoffMultiplier * initialDelayMs + + return await new Promise((resolve) => { + setTimeout(async () => { + resolve(await resilientFetch(url, options, retryCount)) + }, delay) + }) +} + +async function resilientFetch( + url: string, + options: RequestOptions, + retryCount: number +): Promise { + try { + // Could also check the status and retry before returning if you want to be + // resilient to 4xx and 5xx responses as well as network errors + return await fetch(url, options) + } catch (err) { + return await retryFetch(url, options, retryCount + 1) + } +} + +async function request( + path: string, + method: string, + data?: object, + signal?: AbortSignal +): Promise { + const url = `${API_URL}${path}` + + const options: RequestOptions = { + method: method, + headers: { + 'Content-Type': 'application/json', + }, + } + + if (data !== undefined) { + options.body = JSON.stringify(data) + } + + if (signal !== undefined) { + options.signal = signal + } + + return await resilientFetch(url, options, 0) +} + +export default { request } diff --git a/examples/write-patterns/shared/app/icons/favicon.ico b/examples/write-patterns/shared/app/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..55765b6d8922b420e9394d826ede5a5f4c9bb85a GIT binary patch literal 4286 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 I=1_I<-`!$R4FCWD literal 0 HcmV?d00001 diff --git a/examples/write-patterns/shared/app/icons/icon-512.png b/examples/write-patterns/shared/app/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..9e986317983378280d53fffddc0b12fdf4c3280e GIT binary patch literal 4442 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 a(5`zH8hcwa>Df@gf8$0c$A34 + + + \ No newline at end of file diff --git a/examples/write-patterns/shared/app/icons/spinner.gif b/examples/write-patterns/shared/app/icons/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5fcd7f2f21516a37806f5833ece78c29b45035b9 GIT binary patch literal 74195 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 b2^A13AXGr8fKUOU0zw6Z3J4YWPYV1K)J`Ld literal 0 HcmV?d00001 diff --git a/examples/write-patterns/shared/app/main.tsx b/examples/write-patterns/shared/app/main.tsx new file mode 100644 index 0000000000..6201bd4023 --- /dev/null +++ b/examples/write-patterns/shared/app/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' + +import App from './App' +import './style.css' + +const root = document.getElementById('root')! + +ReactDOM.createRoot(root).render( + + + +) diff --git a/examples/write-patterns/shared/app/style.css b/examples/write-patterns/shared/app/style.css new file mode 100644 index 0000000000..d77fc923dc --- /dev/null +++ b/examples/write-patterns/shared/app/style.css @@ -0,0 +1,133 @@ +body { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + + background: #1c1e20; + color: rgba(227, 227, 239, 0.92); + font-family: "Helvetica Neue", Helvetica, sans-serif; + font-size: 15px; + margin: 0; +} + +code { + font-family: source-code-pro, Menlo, Monaco, "Courier New", monospace; +} + +.app { + margin: 10px; + padding: 10px; + width: 100%; + + display:grid; + grid-template-columns: calc(50% - 30px) calc(50% - 30px); + grid-row: auto auto; + grid-column-gap: 20px; + grid-row-gap: 20px; +} + +.example { + padding: 65px 20px 20px 20px; + + background-color: #262628; + border-radius:10px; + + min-height: calc(50vh - 115px); + + background-image: url(/shared/app/icons/icon.svg); + background-position: 17px 23px; + background-repeat: no-repeat; + background-size: 34px; +} + +.example h3 { + margin: 5px 0 10px; +} + +.example ul { + list-style: none; + margin: 0; + padding: 20px 0 10px; + border-top: 1px solid #404049; + border-bottom: 1px solid #404049; +} + +.example ul li { + width: calc(100%); + margin-bottom: 10px; +} + +.example label { + display: inline-flex; + cursor: pointer; +} + +.example label input[type=checkbox] { + margin-right: 7px; + + accent-color: rgb(208, 188, 255); +} + +.example label .title.completed { + text-decoration: line-through; +} + +.example a.close { + float: right; + margin-right: 5px; + text-decoration: none; + color: inherit; + font-size: 13px; + margin-top: 1px; +} + +.example form { + margin-top: 18px; +} + +.example form input[type=text] { + padding: 9px; + margin-bottom: 12px; + background: #363638; + border: 0.2px solid #404049; + border-radius: 3px; + color: rgba(227, 227, 239, 0.92); + outline: none; + font-size: 14px; + display: block; + width: calc(100% - 20px); +} + +.example form button[type=submit] { + background: #404049; + border: none; + padding: 6px 9px; + border-radius: 7px; + color: rgba(227, 227, 239, 0.92); + font-size: 14.5px; + cursor: pointer; +} + +span.title { + display: inline; +} + +span.pending { + display: inline; + opacity: 1; + + width: 50px; + height: 50px; + position: absolute; + margin: -14px 0 0 -7px; + + background-image: url(/shared/app/icons/spinner.gif); + background-repeat: no-repeat; + background-size: 50px 50px; + + -webkit-transition: opacity 0.5s ease-in-out; + -moz-transition: opacity 0.5s ease-in-out; + transition: opacity 0.5s ease-in-out; +} +span.pending.hidden { + opacity: 0; +} diff --git a/examples/write-patterns/shared/app/vite-env.d.ts b/examples/write-patterns/shared/app/vite-env.d.ts new file mode 100644 index 0000000000..a08026d9c9 --- /dev/null +++ b/examples/write-patterns/shared/app/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/examples/write-patterns/shared/backend/api.js b/examples/write-patterns/shared/backend/api.js new file mode 100644 index 0000000000..6b4f4a8798 --- /dev/null +++ b/examples/write-patterns/shared/backend/api.js @@ -0,0 +1,201 @@ +import bodyParser from 'body-parser' +import cors from 'cors' +import express from 'express' +import pg from 'pg' + +import { z } from 'zod' + +// Connect to Postgres. +const DATABASE_URL = process.env.DATABASE_URL || 'postgresql://postgres:password@localhost:54321/electric' +const DATABASE_USE_SSL = process.env.DATABASE_USE_SSL === 'true' || false +const pool = new pg.Pool({connectionString: DATABASE_URL, ssl: DATABASE_USE_SSL}) +const db = await pool.connect() + +// Expose an HTTP server. +const PORT = parseInt(process.env.PORT || '3001') +const app = express() +app.use(bodyParser.json()) +app.use(cors()) + +// Validate user input +const idSchema = z.string().uuid() +const createSchema = z.object({ + id: z.string().uuid(), + title: z.string(), + created_at: z.string(), + write_id: z.string().optional() +}) +const updateSchema = z.object({ + completed: z.boolean(), + write_id: z.string().optional() +}) +const deleteSchema = z.object({ + write_id: z.string().optional() +}) + +// Define functions to create, update and delete todos +// using the `db` client. + +const createTodo = async (id, title, created_at, write_id) => { + const sql = ` + INSERT INTO todos (id, title, completed, created_at, write_id) + VALUES ($1, $2, false, $3, $4) + ` + + const params = [ + id, + title, + created_at, + write_id || null + ] + + await db.query(sql, params) +} + +const updateTodo = async (id, completed, write_id) => { + const sql = ` + UPDATE todos SET completed = $1, write_id = $2 + WHERE id = $3 + ` + + const params = [ + completed ? '1' : '0', + write_id || null, + id + ] + + await db.query(sql, params) +} + +const deleteTodo = async (id) => { + const sql = `DELETE from todos where id = $1` + const params = [id] + await db.query(sql, params) +} + +// Expose the shared REST API to create, update and delete todos. + +app.post(`/todos`, async (req, res) => { + let data + try { + data = createSchema.parse(req.body) + } + catch (err) { + return res.status(400).json({ errors: err.errors }) + } + + try { + await createTodo(data.id, data.title, data.created_at, data.write_id) + } + catch (err) { + return res.status(500).json({ errors: err }) + } + + return res.status(200).json({ status: 'OK' }) +}) + +app.put(`/todos/:id`, async (req, res) => { + let id, data + try { + id = idSchema.parse(req.params.id) + data = updateSchema.parse(req.body) + } + catch (err) { + return res.status(400).json({ errors: err.errors }) + } + + try { + await updateTodo(id, data.completed, data.write_id) + } + catch (err) { + return res.status(500).json({ errors: err }) + } + + return res.status(200).json({ status: 'OK' }) +}) + +app.delete(`/todos/:id`, async (req, res) => { + let id + try { + id = idSchema.parse(req.params.id) + } + catch (err) { + return res.status(400).json({ errors: err.errors }) + } + + try { + await deleteTodo(id) + } + catch (err) { + return res.status(500).json({ errors: err }) + } + + return res.status(200).json({ status: 'OK' }) +}) + +// And expose a `POST /changes` route specifically to support the +// through the DB sync pattern. + +const transactionsSchema = z.array( + z.object({ + id: z.string(), + changes: z.array( + z.object({ + operation: z.string(), + value: z.object({ + id: z.string().uuid(), + title: z.string().optional(), + completed: z.boolean().optional(), + created_at: z.string().optional(), + }), + write_id: z.string() + }) + ) + }) +) + +app.post(`/changes`, async (req, res) => { + let data + try { + data = transactionsSchema.parse(req.body) + } + catch (err) { + return res.status(400).json({ errors: err.errors }) + } + + try { + await db.query('BEGIN') + + data.forEach((tx) => { + tx.changes.forEach(({operation, value, write_id}) => { + switch (operation) { + case 'insert': + createTodo(value.id, value.title, value.created_at, write_id) + break + + case 'update': + updateTodo(value.id, value.completed, write_id) + break + + case 'delete': + deleteTodo(value.id) + break + } + }) + }) + + await db.query('COMMIT') + } + catch (err) { + await db.query('ROLLBACK') + + return res.status(500).json({ errors: err }) + } + + return res.status(200).json({ status: 'OK' }) +}) + +// Start the server +app.listen(PORT, () => { + console.log(`Server listening at http://localhost:${PORT}`) +}) diff --git a/examples/write-patterns/shared/migrations/01-create-todos.sql b/examples/write-patterns/shared/migrations/01-create-todos.sql new file mode 100644 index 0000000000..8bdd835474 --- /dev/null +++ b/examples/write-patterns/shared/migrations/01-create-todos.sql @@ -0,0 +1,23 @@ +-- Basic todos table. +CREATE TABLE IF NOT EXISTS todos ( + id UUID PRIMARY KEY, + title TEXT NOT NULL, + completed BOOLEAN NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL +); + +-- Insert some todos to get started. +INSERT INTO todos ( + id, + title, + completed, + created_at +) +SELECT + gen_random_uuid(), + 'Get stuff done', + '0', + CURRENT_TIMESTAMP +WHERE NOT EXISTS ( + SELECT * FROM todos +); diff --git a/examples/write-patterns/shared/migrations/02-add-write-id.sql b/examples/write-patterns/shared/migrations/02-add-write-id.sql new file mode 100644 index 0000000000..489d39be46 --- /dev/null +++ b/examples/write-patterns/shared/migrations/02-add-write-id.sql @@ -0,0 +1,11 @@ +-- Add an optional `write_id` field to the table. +-- +-- This is not necessary for simpler patterns but provides an option for more +-- advanced patterns to match on when monitoring the Electric replication +-- stream in order to invalidate local state. +-- +-- Matching on a per-operation update key and not, say, just the row `id`, +-- allows you to rebase local optimistic state on top of concurrent changes to +-- the same row made by other users. (Because you only clear the local state +-- when *your* local write syncs through, not anyone else's). +ALTER TABLE todos ADD COLUMN write_id UUID; diff --git a/examples/write-patterns/tsconfig.json b/examples/write-patterns/tsconfig.json new file mode 100644 index 0000000000..27245b362f --- /dev/null +++ b/examples/write-patterns/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* 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": ["shared/app", "patterns"] +} diff --git a/examples/write-patterns/vite.config.ts b/examples/write-patterns/vite.config.ts new file mode 100644 index 0000000000..3ed5dd7be0 --- /dev/null +++ b/examples/write-patterns/vite.config.ts @@ -0,0 +1,44 @@ +import { defineConfig } from 'vite' +import { VitePWA } from 'vite-plugin-pwa' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + target: 'esnext', + }, + optimizeDeps: { + exclude: ['@electric-sql/pglite'], + }, + plugins: [ + react(), + VitePWA({ + registerType: 'autoUpdate', + workbox: { + maximumFileSizeToCacheInBytes: 10 * 1024 ** 2, + }, + devOptions: { + enabled: false, + }, + includeAssets: ['shared/app/icons/*'], + manifest: { + name: 'Write Patterns Example - ElectricSQL ', + short_name: 'Writes', + description: 'Four different write-patterns that work with Electric.', + theme_color: '#1c1e20', + icons: [ + { + src: './shared/app/icons/icon-192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: './shared/app/icons/icon-512.png', + sizes: '512x512', + type: 'image/png', + }, + ], + }, + }), + ], +}) diff --git a/packages/experimental/.eslintrc.cjs b/packages/experimental/.eslintrc.cjs new file mode 100644 index 0000000000..5bc530843d --- /dev/null +++ b/packages/experimental/.eslintrc.cjs @@ -0,0 +1,41 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + `eslint:recommended`, + `plugin:@typescript-eslint/recommended`, + `plugin:prettier/recommended`, + ], + parserOptions: { + ecmaVersion: 2022, + requireConfigFile: false, + sourceType: `module`, + ecmaFeatures: { + jsx: true, + }, + }, + parser: `@typescript-eslint/parser`, + plugins: [`prettier`], + rules: { + quotes: [`error`, `backtick`], + 'no-unused-vars': `off`, + '@typescript-eslint/no-unused-vars': [ + `error`, + { + argsIgnorePattern: `^_`, + varsIgnorePattern: `^_`, + caughtErrorsIgnorePattern: `^_`, + }, + ], + }, + ignorePatterns: [ + '**/node_modules/**', + '**/dist/**', + 'tsup.config.ts', + 'vitest.config.ts', + '.eslintrc.js' + ], +} diff --git a/packages/experimental/.prettierignore b/packages/experimental/.prettierignore new file mode 100644 index 0000000000..55371e5c85 --- /dev/null +++ b/packages/experimental/.prettierignore @@ -0,0 +1,2 @@ +node_modules +.vscode \ No newline at end of file diff --git a/packages/experimental/.prettierrc b/packages/experimental/.prettierrc new file mode 100644 index 0000000000..f685078fff --- /dev/null +++ b/packages/experimental/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "semi": false, + "tabWidth": 2, + "singleQuote": true +} diff --git a/packages/experimental/README.md b/packages/experimental/README.md new file mode 100644 index 0000000000..77e87bf61a --- /dev/null +++ b/packages/experimental/README.md @@ -0,0 +1,41 @@ + +# Experimental TypeScript features for ElectricSQL + +## Install + +The client is published on NPM as [`@electric-sql/experimental`](https://www.npmjs.com/package/@electric-sql/experimental): + +```sh +npm i @electric-sql/experimental +``` + +## Develop + +Install the pnpm workspace at the repo root: + +```shell +pnpm install +``` + +Build the package: + +```shell +cd packages/typescript-client +pnpm build +``` + +## Test + +In one terminal, start the backend running: + +```shell +cd ../sync-service +mix deps.get +mix stop_dev && mix compile && mix start_dev && ies -S mix +``` + +Then in this folder: + +```shell +pnpm test +``` diff --git a/packages/experimental/package.json b/packages/experimental/package.json new file mode 100644 index 0000000000..ad3e3c6ced --- /dev/null +++ b/packages/experimental/package.json @@ -0,0 +1,71 @@ +{ + "name": "@electric-sql/experimental", + "version": "0.1.0", + "description": "Experimental TypeScript features for ElectricSQL.", + "type": "module", + "main": "dist/cjs/index.cjs", + "module": "dist/index.legacy-esm.js", + "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "default": "./dist/cjs/index.cjs" + } + }, + "files": [ + "dist", + "src" + ], + "sideEffects": false, + "repository": { + "type": "git", + "url": "git+https://github.com/electric-sql/electric.git" + }, + "author": "ElectricSQL team and contributors.", + "license": "Apache-2", + "bugs": { + "url": "https://github.com/electric-sql/electric/issues" + }, + "homepage": "https://electric-sql.com", + "dependencies": { + "@electric-sql/client": "workspace:*" + }, + "devDependencies": { + "@types/pg": "^8.11.6", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", + "concurrently": "^8.2.2", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "glob": "^10.3.10", + "pg": "^8.12.0", + "prettier": "^3.3.2", + "shx": "^0.3.4", + "tsup": "^8.0.1", + "typescript": "^5.5.2", + "uuid": "^10.0.0", + "vitest": "^2.0.2" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "^4.18.1" + }, + "typesVersions": { + "*": { + "*": [ + "./dist/index.d.ts" + ] + } + }, + "scripts": { + "test": "pnpm exec vitest", + "typecheck": "tsc -p tsconfig.json", + "build": "shx rm -rf dist && concurrently \"tsup\" \"tsc -p tsconfig.build.json\"", + "prepack": "pnpm build", + "stylecheck": "eslint . --quiet", + "format": "eslint . --fix" + } +} diff --git a/packages/experimental/src/index.ts b/packages/experimental/src/index.ts new file mode 100644 index 0000000000..e9f564c2b1 --- /dev/null +++ b/packages/experimental/src/index.ts @@ -0,0 +1 @@ +export * from './match' diff --git a/packages/experimental/src/match.ts b/packages/experimental/src/match.ts new file mode 100644 index 0000000000..f0200f41cb --- /dev/null +++ b/packages/experimental/src/match.ts @@ -0,0 +1,53 @@ +import { + isChangeMessage, + type ShapeStreamInterface, + type ChangeMessage, + type GetExtensions, + type Operation, + type Row, + type Value, +} from '@electric-sql/client' + +export function matchStream>( + stream: ShapeStreamInterface, + operations: Array, + matchFn: (message: ChangeMessage) => boolean, + timeout = 60000 // ms +): Promise> { + return new Promise>((resolve, reject) => { + const unsubscribe: () => void = stream.subscribe((messages) => { + const message = messages.filter(isChangeMessage).find((message) => { + const operation = message.headers.operation + + return operations.includes(operation) && matchFn(message) + }) + + if (message) { + return finish(message) + } + }) + + const timeoutId = setTimeout(() => { + const msg = `matchStream timed out after ${timeout}ms` + + console.error(msg) + + reject(msg) + }, timeout) + + function finish(message: ChangeMessage) { + clearTimeout(timeoutId) + + unsubscribe() + + return resolve(message) + } + }) +} + +export function matchBy>( + column: string, + value: Value> +): (message: ChangeMessage) => boolean { + return (message) => message.value[column] === value +} diff --git a/packages/experimental/test/match.test.ts b/packages/experimental/test/match.test.ts new file mode 100644 index 0000000000..d3a9d23fb7 --- /dev/null +++ b/packages/experimental/test/match.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, inject } from 'vitest' +import { v4 as uuidv4 } from 'uuid' +import { ShapeStream } from '@electric-sql/client' +import { testWithIssuesTable as it } from './support/test-context' + +import { matchBy, matchStream } from '../src/match' + +const BASE_URL = inject(`baseUrl`) + +describe(`matchStream`, () => { + it(`should match`, async ({ insertIssues, issuesTableUrl }) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-nocheck + const stream = new ShapeStream({ + url: `${BASE_URL}/v1/shape`, + params: { + table: issuesTableUrl, + }, + }) + + const id = uuidv4() + const issue = { + id: id, + title: `test title`, + } + + setTimeout(() => { + insertIssues(issue) + }, 10) + + const matchFn = matchBy(`id`, id) + const result = await matchStream(stream, [`insert`], matchFn, 200) + + expect(result.value.title).toEqual(`test title`) + }) +}) diff --git a/packages/experimental/test/support/global-setup.ts b/packages/experimental/test/support/global-setup.ts new file mode 100644 index 0000000000..a97f2e2667 --- /dev/null +++ b/packages/experimental/test/support/global-setup.ts @@ -0,0 +1,71 @@ +import type { GlobalSetupContext } from 'vitest/node' +import { makePgClient } from './test-helpers' + +const url = process.env.ELECTRIC_URL ?? `http://localhost:3000` +const proxyUrl = process.env.ELECTRIC_PROXY_CACHE_URL ?? `http://localhost:3002` + +// name of proxy cache container to execute commands against, +// see docker-compose.yml that spins it up for details +const proxyCacheContainerName = `electric_dev-nginx-1` +// path pattern for cache files inside proxy cache to clear +const proxyCachePath = `/var/cache/nginx/*` + +// eslint-disable-next-line quotes -- eslint is acting dumb with enforce backtick quotes mode, and is trying to use it here where it's not allowed. +declare module 'vitest' { + export interface ProvidedContext { + baseUrl: string + proxyCacheBaseUrl: string + testPgSchema: string + proxyCacheContainerName: string + proxyCachePath: string + } +} + +function waitForElectric(url: string): Promise { + return new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(`Timed out waiting for Electric to be active`), + 10000 + ) + + const tryHealth = async () => + fetch(`${url}/v1/health`) + .then(async (res): Promise => { + if (!res.ok) return tryHealth() + const { status } = (await res.json()) as { status: string } + if (status !== `active`) return tryHealth() + clearTimeout(timeout) + resolve() + }) + .catch((err) => { + clearTimeout(timeout) + reject(err) + }) + + return tryHealth() + }) +} + +/** + * Global setup for the test suite. Validates that our server is running, and creates and tears down a + * special schema in Postgres to ensure clean slate between runs. + */ +export default async function ({ provide }: GlobalSetupContext) { + await waitForElectric(url) + + const client = makePgClient() + + await client.connect() + await client.query(`CREATE SCHEMA IF NOT EXISTS electric_test`) + + provide(`baseUrl`, url) + provide(`testPgSchema`, `electric_test`) + provide(`proxyCacheBaseUrl`, proxyUrl) + provide(`proxyCacheContainerName`, proxyCacheContainerName) + provide(`proxyCachePath`, proxyCachePath) + + return async () => { + await client.query(`DROP SCHEMA electric_test CASCADE`) + await client.end() + } +} diff --git a/packages/experimental/test/support/test-context.ts b/packages/experimental/test/support/test-context.ts new file mode 100644 index 0000000000..24211f4089 --- /dev/null +++ b/packages/experimental/test/support/test-context.ts @@ -0,0 +1,193 @@ +/* eslint-disable no-empty-pattern */ +import { v4 as uuidv4 } from 'uuid' +import { Client, QueryResult } from 'pg' +import { inject, test } from 'vitest' +import { makePgClient } from './test-helpers' +import { FetchError } from '@electric-sql/client' + +const SHAPE_HANDLE_QUERY_PARAM = `handle` + +export type IssueRow = { id: string; title: string; priority?: string } +export type GeneratedIssueRow = { id?: string; title: string } +export type UpdateIssueFn = (row: IssueRow) => Promise> +export type DeleteIssueFn = (row: IssueRow) => Promise> +export type InsertIssuesFn = (...rows: GeneratedIssueRow[]) => Promise +export type ClearIssuesShapeFn = (handle?: string) => Promise +export type ClearShapeFn = ( + table: string, + options?: { handle?: string } +) => Promise + +export const testWithDbClient = test.extend<{ + dbClient: Client + aborter: AbortController + baseUrl: string + pgSchema: string + clearShape: ClearShapeFn +}>({ + dbClient: async ({}, use) => { + const searchOption = `-csearch_path=${inject(`testPgSchema`)}` + const client = makePgClient({ options: searchOption }) + await client.connect() + await use(client) + await client.end() + }, + aborter: async ({}, use) => { + const controller = new AbortController() + await use(controller) + controller.abort(`Test complete`) + }, + baseUrl: async ({}, use) => use(inject(`baseUrl`)), + pgSchema: async ({}, use) => use(inject(`testPgSchema`)), + clearShape: async ({}, use) => { + await use( + async ( + table: string, + options: { + handle?: string + } = {} + ) => { + const baseUrl = inject(`baseUrl`) + const url = new URL(`${baseUrl}/v1/shape`) + url.searchParams.set(`table`, table) + + if (options.handle) { + url.searchParams.set(SHAPE_HANDLE_QUERY_PARAM, options.handle) + } + + const resp = await fetch(url.toString(), { method: `DELETE` }) + if (!resp.ok) { + console.error( + await FetchError.fromResponse(resp, `DELETE ${url.toString()}`) + ) + throw new Error( + `Could not delete shape ${table} with ID ${options.handle}` + ) + } + } + ) + }, +}) + +export const testWithIssuesTable = testWithDbClient.extend<{ + issuesTableSql: string + issuesTableUrl: string + issuesTableKey: string + updateIssue: UpdateIssueFn + deleteIssue: DeleteIssueFn + insertIssues: InsertIssuesFn + clearIssuesShape: ClearIssuesShapeFn +}>({ + issuesTableSql: async ({ dbClient, task }, use) => { + const tableName = `"issues for ${task.id}_${Math.random().toString(16)}"` + await dbClient.query(` + DROP TABLE IF EXISTS ${tableName}; + CREATE TABLE ${tableName} ( + id UUID PRIMARY KEY, + title TEXT NOT NULL, + priority INTEGER NOT NULL + ); + COMMENT ON TABLE ${tableName} IS 'Created for ${task.file?.name.replace(/'/g, `\``) ?? `unknown`} - ${task.name.replace(`'`, `\``)}'; + `) + await use(tableName) + await dbClient.query(`DROP TABLE ${tableName}`) + }, + issuesTableUrl: async ({ issuesTableSql, pgSchema, clearShape }, use) => { + const urlAppropriateTable = pgSchema + `.` + issuesTableSql + await use(urlAppropriateTable) + try { + await clearShape(urlAppropriateTable) + } catch (_) { + // ignore - clearShape has its own logging + // we don't want to interrupt cleanup + } + }, + issuesTableKey: ({ issuesTableSql, pgSchema }, use) => + use(`"${pgSchema}".${issuesTableSql}`), + updateIssue: ({ issuesTableSql, dbClient }, use) => + use(({ id, title }) => + dbClient.query(`UPDATE ${issuesTableSql} SET title = $2 WHERE id = $1`, [ + id, + title, + ]) + ), + deleteIssue: ({ issuesTableSql, dbClient }, use) => + use(({ id }) => + dbClient.query(`DELETE FROM ${issuesTableSql} WHERE id = $1`, [id]) + ), + insertIssues: ({ issuesTableSql, dbClient }, use) => + use(async (...rows) => { + const placeholders = rows.map( + (_, i) => `($${i * 3 + 1}, $${i * 3 + 2}, $${i * 3 + 3})` + ) + const { rows: rows_1 } = await dbClient.query( + `INSERT INTO ${issuesTableSql} (id, title, priority) VALUES ${placeholders} RETURNING id`, + rows.flatMap((x) => [x.id ?? uuidv4(), x.title, 10]) + ) + return rows_1.map((x) => x.id) + }), + + clearIssuesShape: async ({ clearShape, issuesTableUrl }, use) => { + use((handle?: string) => clearShape(issuesTableUrl, { handle })) + }, +}) + +export const testWithMultitypeTable = testWithDbClient.extend<{ + tableSql: string + tableUrl: string +}>({ + tableSql: async ({ dbClient, task }, use) => { + const tableName = `"multitype table for ${task.id}_${Math.random().toString(16)}"` + + await dbClient.query(` + DROP TABLE IF EXISTS ${tableName}; + DROP TYPE IF EXISTS mood; + DROP TYPE IF EXISTS complex; + DROP DOMAIN IF EXISTS posint; + CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); + CREATE TYPE complex AS (r double precision, i double precision); + CREATE DOMAIN posint AS integer CHECK (VALUE > 0); + CREATE TABLE ${tableName} ( + txt VARCHAR, + i2 INT2 PRIMARY KEY, + i4 INT4, + i8 INT8, + f8 FLOAT8, + b BOOLEAN, + json JSON, + jsonb JSONB, + ints INT8[], + ints2 INT8[][], + int4s INT4[], + doubles FLOAT8[], + bools BOOLEAN[], + moods mood[], + moods2 mood[][], + complexes complex[], + posints posint[], + jsons JSONB[], + txts TEXT[], + value JSON + )`) + + await use(tableName) + + // Cleanup + await dbClient.query(` + DROP TABLE ${tableName}; + DROP TYPE IF EXISTS mood; + DROP TYPE IF EXISTS complex; + DROP DOMAIN IF EXISTS posint; + `) + }, + tableUrl: async ({ tableSql, clearShape, pgSchema }, use) => { + const urlAppropriateTable = pgSchema + `.` + tableSql + await use(urlAppropriateTable) + try { + await clearShape(urlAppropriateTable) + } catch (_) { + // ignore - clearShape has its own logging + // we don't want to interrupt cleanup + } + }, +}) diff --git a/packages/experimental/test/support/test-helpers.ts b/packages/experimental/test/support/test-helpers.ts new file mode 100644 index 0000000000..3c5999ef3b --- /dev/null +++ b/packages/experimental/test/support/test-helpers.ts @@ -0,0 +1,51 @@ +import { Client, ClientConfig } from 'pg' +import { + ShapeStreamInterface, + type Message, + type Row, +} from '@electric-sql/client' + +export function makePgClient(overrides: ClientConfig = {}) { + return new Client({ + host: `localhost`, + port: 54321, + password: `password`, + user: `postgres`, + database: `electric`, + options: `-csearch_path=electric_test`, + ...overrides, + }) +} + +export function forEachMessage>( + stream: ShapeStreamInterface, + controller: AbortController, + handler: ( + resolve: () => void, + message: Message, + nthDataMessage: number + ) => Promise | void +) { + return new Promise((resolve, reject) => { + let messageIdx = 0 + + stream.subscribe(async (messages) => { + for (const message of messages) { + try { + await handler( + () => { + controller.abort() + return resolve() + }, + message as Message, + messageIdx + ) + if (`operation` in message.headers) messageIdx++ + } catch (e) { + controller.abort() + return reject(e) + } + } + }, reject) + }) +} diff --git a/packages/experimental/tsconfig.build.json b/packages/experimental/tsconfig.build.json new file mode 100644 index 0000000000..94732df2ed --- /dev/null +++ b/packages/experimental/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.build.json", + "include": ["src/**/*"], + "exclude": ["node_modules", "test", "dist"] +} diff --git a/packages/experimental/tsconfig.json b/packages/experimental/tsconfig.json new file mode 100644 index 0000000000..5bd3117ad9 --- /dev/null +++ b/packages/experimental/tsconfig.json @@ -0,0 +1,105 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": [ + "ESNext" + ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "preserve" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/experimental/tsup.config.ts b/packages/experimental/tsup.config.ts new file mode 100644 index 0000000000..075298b6c3 --- /dev/null +++ b/packages/experimental/tsup.config.ts @@ -0,0 +1,60 @@ +import type { Options } from 'tsup' +import { defineConfig } from 'tsup' + +export default defineConfig((options) => { + const entry = { + index: 'src/index.ts', + } + const commonOptions: Partial = { + entry, + tsconfig: `./tsconfig.build.json`, + sourcemap: true, + ...options, + } + + return [ + // Standard ESM, embedded `process.env.NODE_ENV` checks + { + ...commonOptions, + format: ['esm'], + outExtension: () => ({ js: '.mjs' }), // Add dts: '.d.ts' when egoist/tsup#1053 lands + dts: true, + clean: true, + }, + // Support Webpack 4 by pointing `"module"` to a file with a `.js` extension + { + ...commonOptions, + format: ['esm'], + target: 'es2017', + dts: false, + outExtension: () => ({ js: '.js' }), + entry: Object.fromEntries( + Object.entries(entry).map(([key, value]) => [ + `${key}.legacy-esm`, + value, + ]) + ), + }, + // Browser-ready ESM, production + minified + { + ...commonOptions, + + entry: Object.fromEntries( + Object.entries(entry).map(([key, value]) => [`${key}.browser`, value]) + ), + + define: { + 'process.env.NODE_ENV': JSON.stringify('production'), + }, + format: ['esm'], + outExtension: () => ({ js: '.mjs' }), + minify: true, + }, + { + ...commonOptions, + format: 'cjs', + outDir: './dist/cjs/', + outExtension: () => ({ js: '.cjs' }), + }, + ] +}) diff --git a/packages/experimental/vitest.config.ts b/packages/experimental/vitest.config.ts new file mode 100644 index 0000000000..9ca6c004fe --- /dev/null +++ b/packages/experimental/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globalSetup: `test/support/global-setup.ts`, + typecheck: { enabled: true }, + fileParallelism: false, + }, +}) diff --git a/packages/react-hooks/package.json b/packages/react-hooks/package.json index 5af6e0f280..c5a74aebdc 100644 --- a/packages/react-hooks/package.json +++ b/packages/react-hooks/package.json @@ -50,6 +50,7 @@ "pg": "^8.12.0", "prettier": "^3.3.2", "react": "^18.3.1", + "react-dom": "^18.3.1", "shx": "^0.3.4", "tsup": "^8.0.1", "typescript": "^5.5.2", diff --git a/packages/react-hooks/src/react-hooks.tsx b/packages/react-hooks/src/react-hooks.tsx index 0e8a97df3b..96aa9a11ec 100644 --- a/packages/react-hooks/src/react-hooks.tsx +++ b/packages/react-hooks/src/react-hooks.tsx @@ -102,6 +102,11 @@ export interface UseShapeResult = Row> { * @type {Shape} */ shape: Shape + /** + * The ShapeStream instance used by this Shape + * @type {ShapeStream} + */ + stream: ShapeStream /** True during initial fetch. False afterwise. */ isLoading: boolean /** Unix time at which we last synced. Undefined when `isLoading` is true. */ @@ -129,6 +134,7 @@ function parseShapeData>( lastSyncedAt: shape.lastSyncedAt(), isError: shape.error !== false, shape, + stream: shape.stream as ShapeStream, error: shape.error, } } diff --git a/packages/typescript-client/src/client.ts b/packages/typescript-client/src/client.ts index d2944bf06c..1ee875535b 100644 --- a/packages/typescript-client/src/client.ts +++ b/packages/typescript-client/src/client.ts @@ -190,7 +190,7 @@ export interface ShapeStreamInterface = Row> { subscribe( callback: (messages: Message[]) => MaybePromise, onError?: (error: FetchError | Error) => void - ): void + ): () => void unsubscribeAll(): void isLoading(): boolean diff --git a/packages/typescript-client/src/shape.ts b/packages/typescript-client/src/shape.ts index 553ee91878..0fe5a11b21 100644 --- a/packages/typescript-client/src/shape.ts +++ b/packages/typescript-client/src/shape.ts @@ -46,7 +46,7 @@ export type ShapeChangedCallback = Row> = (data: { * }) */ export class Shape = Row> { - readonly #stream: ShapeStreamInterface + readonly stream: ShapeStreamInterface readonly #data: ShapeData = new Map() readonly #subscribers = new Map>() @@ -55,23 +55,23 @@ export class Shape = Row> { #error: FetchError | false = false constructor(stream: ShapeStreamInterface) { - this.#stream = stream - this.#stream.subscribe( + this.stream = stream + this.stream.subscribe( this.#process.bind(this), this.#handleError.bind(this) ) } get isUpToDate(): boolean { - return this.#stream.isUpToDate + return this.stream.isUpToDate } get lastOffset(): Offset { - return this.#stream.lastOffset + return this.stream.lastOffset } get handle(): string | undefined { - return this.#stream.shapeHandle + return this.stream.shapeHandle } get rows(): Promise { @@ -84,7 +84,7 @@ export class Shape = Row> { get value(): Promise> { return new Promise((resolve, reject) => { - if (this.#stream.isUpToDate) { + if (this.stream.isUpToDate) { resolve(this.currentValue) } else { const unsubscribe = this.subscribe(({ value }) => { @@ -106,22 +106,22 @@ export class Shape = Row> { /** Unix time at which we last synced. Undefined when `isLoading` is true. */ lastSyncedAt(): number | undefined { - return this.#stream.lastSyncedAt() + return this.stream.lastSyncedAt() } /** Time elapsed since last sync (in ms). Infinity if we did not yet sync. */ lastSynced() { - return this.#stream.lastSynced() + return this.stream.lastSynced() } /** True during initial fetch. False afterwise. */ isLoading() { - return this.#stream.isLoading() + return this.stream.isLoading() } /** Indicates if we are connected to the Electric sync service. */ isConnected(): boolean { - return this.#stream.isConnected() + return this.stream.isConnected() } subscribe(callback: ShapeChangedCallback): () => void { diff --git a/packages/typescript-client/src/types.ts b/packages/typescript-client/src/types.ts index 2332a4e706..9de8c68e8e 100644 --- a/packages/typescript-client/src/types.ts +++ b/packages/typescript-client/src/types.ts @@ -23,6 +23,8 @@ interface Header { [key: Exclude]: Value } +export type Operation = `insert` | `update` | `delete` + export type ControlMessage = { headers: Header & { control: `up-to-date` | `must-refetch` } } @@ -30,7 +32,7 @@ export type ControlMessage = { export type ChangeMessage = Row> = { key: string value: T - headers: Header & { operation: `insert` | `update` | `delete` } + headers: Header & { operation: Operation } offset: Offset } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40755304df..1d0f179b37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 18.3.1 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -52,7 +52,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/encryption: dependencies: @@ -101,7 +101,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -116,7 +116,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/gatekeeper-auth: dependencies: @@ -237,7 +237,7 @@ importers: version: 9.0.1 vite-plugin-svgr: specifier: ^3.2.0 - version: 3.3.0(rollup@4.24.4)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)) + version: 3.3.0(rollup@4.24.4)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)(terser@5.36.0)) devDependencies: '@databases/pg': specifier: ^5.5.0 @@ -289,7 +289,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.6.3) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@4.5.5(@types/node@20.17.6)) + version: 4.3.3(vite@4.5.5(@types/node@20.17.6)(terser@5.36.0)) autoprefixer: specifier: ^10.4.19 version: 10.4.20(postcss@8.4.47) @@ -328,7 +328,7 @@ importers: version: 5.6.3 vite: specifier: ^4.4.5 - version: 4.5.5(@types/node@20.17.6) + version: 4.5.5(@types/node@20.17.6)(terser@5.36.0) examples/nextjs-example: dependencies: @@ -374,7 +374,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -389,7 +389,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/proxy-auth: dependencies: @@ -435,7 +435,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -447,7 +447,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/redis-sync: dependencies: @@ -515,7 +515,7 @@ importers: version: link:../../packages/react-hooks '@remix-run/dev': specifier: ^2.11.0 - version: 2.13.1(@remix-run/react@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.13.1(typescript@5.6.3))(@types/node@20.17.6)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.6)) + version: 2.13.1(@remix-run/react@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.13.1(typescript@5.6.3))(@types/node@20.17.6)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) '@remix-run/node': specifier: ^2.11.0 version: 2.13.1(typescript@5.6.3) @@ -558,7 +558,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -570,7 +570,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/tanstack-example: dependencies: @@ -616,7 +616,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.10(@types/node@20.17.6)) + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -631,7 +631,7 @@ importers: version: 5.6.3 vite: specifier: ^5.3.4 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) examples/todo-app: dependencies: @@ -692,7 +692,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.6.3) '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.10(@types/node@20.17.6)) + version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -725,13 +725,157 @@ importers: version: 5.6.3 vite: specifier: ^5.3.1 - version: 5.4.10(@types/node@20.17.6) + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) vite-plugin-capsize-radix: specifier: ^0.0.9 version: 0.0.9 + examples/write-patterns: + dependencies: + '@electric-sql/client': + specifier: workspace:* + version: link:../../packages/typescript-client + '@electric-sql/experimental': + specifier: workspace:* + version: link:../../packages/experimental + '@electric-sql/pglite': + specifier: ^0.2.14 + version: 0.2.14 + '@electric-sql/pglite-react': + specifier: ^0.2.14 + version: 0.2.14(@electric-sql/pglite@0.2.14)(react@19.0.0-rc.1) + '@electric-sql/pglite-sync': + specifier: ^0.2.16 + version: 0.2.16(@electric-sql/pglite@0.2.14) + '@electric-sql/react': + specifier: workspace:* + version: link:../../packages/react-hooks + body-parser: + specifier: ^1.20.2 + version: 1.20.3 + cors: + specifier: ^2.8.5 + version: 2.8.5 + express: + specifier: ^4.19.2 + version: 4.21.1 + pg: + specifier: ^8.12.0 + version: 8.13.1 + react: + specifier: 19.0.0-rc.1 + version: 19.0.0-rc.1 + react-dom: + specifier: 19.0.0-rc.1 + version: 19.0.0-rc.1(react@19.0.0-rc.1) + uuid: + specifier: ^10.0.0 + version: 10.0.0 + valtio: + specifier: ^2.1.2 + version: 2.1.2(react@19.0.0-rc.1)(types-react@19.0.0-rc.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@databases/pg-migrations': + specifier: ^5.0.3 + version: 5.0.3(typescript@5.6.3) + '@types/react': + specifier: npm:types-react@rc + version: types-react@19.0.0-rc.1 + '@types/react-dom': + specifier: npm:types-react-dom@rc + version: types-react-dom@19.0.0-rc.1 + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + eslint: + specifier: ^8.57.0 + version: 8.57.1 + rollup: + specifier: 2.79.2 + version: 2.79.2 + typescript: + specifier: ^5.5.3 + version: 5.6.3 + vite: + specifier: ^5.3.4 + version: 5.4.10(@types/node@20.17.6)(terser@5.36.0) + vite-plugin-pwa: + specifier: ^0.21.0 + version: 0.21.0(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + packages/elixir-client: {} + packages/experimental: + dependencies: + '@electric-sql/client': + specifier: workspace:* + version: link:../typescript-client + optionalDependencies: + '@rollup/rollup-darwin-arm64': + specifier: ^4.18.1 + version: 4.24.4 + devDependencies: + '@types/pg': + specifier: ^8.11.6 + version: 8.11.10 + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^7.14.1 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^7.14.1 + version: 7.18.0(eslint@8.57.1)(typescript@5.6.3) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + eslint: + specifier: ^8.57.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) + glob: + specifier: ^10.3.10 + version: 10.4.5 + pg: + specifier: ^8.12.0 + version: 8.13.1 + prettier: + specifier: ^3.3.2 + version: 3.3.3 + shx: + specifier: ^0.3.4 + version: 0.3.4 + tsup: + specifier: ^8.0.1 + version: 8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + typescript: + specifier: ^5.5.2 + version: 5.6.3 + uuid: + specifier: ^10.0.0 + version: 10.0.0 + vitest: + specifier: ^2.0.2 + version: 2.1.4(@types/node@20.17.6)(jsdom@25.0.1)(terser@5.36.0) + packages/react-hooks: dependencies: '@electric-sql/client': @@ -789,6 +933,9 @@ importers: react: specifier: ^18.3.1 version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) shx: specifier: ^0.3.4 version: 0.3.4 @@ -803,7 +950,7 @@ importers: version: 10.0.0 vitest: specifier: ^2.0.2 - version: 2.1.4(@types/node@20.17.6)(jsdom@25.0.1) + version: 2.1.4(@types/node@20.17.6)(jsdom@25.0.1)(terser@5.36.0) packages/sync-service: {} @@ -863,7 +1010,7 @@ importers: version: 10.0.0 vitest: specifier: ^2.0.2 - version: 2.1.4(@types/node@20.17.6)(jsdom@25.0.1) + version: 2.1.4(@types/node@20.17.6)(jsdom@25.0.1)(terser@5.36.0) website: devDependencies: @@ -875,7 +1022,10 @@ importers: version: 3.1.7 vitepress: specifier: ^1.3.1 - version: 1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3) + version: 1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) + vitepress-plugin-tabs: + specifier: ^0.5.0 + version: 0.5.0(vitepress@1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3)) vue-tweet: specifier: ^2.3.1 version: 2.3.1(vue@3.5.12(typescript@5.6.3)) @@ -965,6 +1115,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@apideck/better-ajv-errors@0.3.6': + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -985,6 +1141,10 @@ packages: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} @@ -995,6 +1155,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-member-expression-to-functions@7.25.9': resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} @@ -1017,6 +1188,12 @@ packages: resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.25.9': resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} @@ -1043,6 +1220,10 @@ packages: resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.0': resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} @@ -1052,12 +1233,60 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.25.9': resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} @@ -1070,94 +1299,405 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.25.9': - resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.25.9': - resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.26.0': - resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@capsizecss/core@4.1.2': - resolution: {integrity: sha512-5tMjLsVsaEEwJ816y3eTfhhTIyUWNFt58x6YcHni0eV5tta8MGDOAIe+CV5ICb5pguXgDpNGLprqhPqBWtkFSg==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@capsizecss/metrics@2.2.0': - resolution: {integrity: sha512-DkFIser1KbGxWyG2hhQQeCit72TnOQDx5pr9bkA7+XlIy7qv+4lYtslH3bidVxm2qkY2guAgypSIPYuQQuk70A==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@capsizecss/metrics@3.3.0': - resolution: {integrity: sha512-WAQtKgyz7fZDEMuERSLPmWXuV53O/HDJZLof8BMWEX1GTWYiiNdqGA6j56+GCSSeVyzYDxkBnm5taIh0YyW6fQ==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cfaester/enzyme-adapter-react-18@0.8.0': - resolution: {integrity: sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} peerDependencies: - enzyme: ^3.11.0 - react: '>=18' - react-dom: '>=18' + '@babel/core': ^7.0.0 - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/cli@2.27.9': - resolution: {integrity: sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==} - hasBin: true + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@changesets/get-version-range-type@0.4.0': + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@capsizecss/core@4.1.2': + resolution: {integrity: sha512-5tMjLsVsaEEwJ816y3eTfhhTIyUWNFt58x6YcHni0eV5tta8MGDOAIe+CV5ICb5pguXgDpNGLprqhPqBWtkFSg==} + + '@capsizecss/metrics@2.2.0': + resolution: {integrity: sha512-DkFIser1KbGxWyG2hhQQeCit72TnOQDx5pr9bkA7+XlIy7qv+4lYtslH3bidVxm2qkY2guAgypSIPYuQQuk70A==} + + '@capsizecss/metrics@3.3.0': + resolution: {integrity: sha512-WAQtKgyz7fZDEMuERSLPmWXuV53O/HDJZLof8BMWEX1GTWYiiNdqGA6j56+GCSSeVyzYDxkBnm5taIh0YyW6fQ==} + + '@cfaester/enzyme-adapter-react-18@0.8.0': + resolution: {integrity: sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==} + peerDependencies: + enzyme: ^3.11.0 + react: '>=18' + react-dom: '>=18' + + '@changesets/apply-release-plan@7.0.5': + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + + '@changesets/assemble-release-plan@6.0.4': + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.9': + resolution: {integrity: sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==} + hasBin: true + + '@changesets/config@3.0.3': + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.4': + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + + '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} '@changesets/git@3.0.1': @@ -1261,6 +1801,23 @@ packages: search-insights: optional: true + '@electric-sql/client@0.8.0': + resolution: {integrity: sha512-M4VnuL2q2i1yhsjc9DEQtf4GEkXoaMjlfm0Lq7KqLDjj2nqPhbUTo8IeWhf3OJSZ7j+GyFd/YlLg4rlBDrE/6Q==} + + '@electric-sql/pglite-react@0.2.14': + resolution: {integrity: sha512-QseE5Y2a7+9G1gj0Xffg3nKpKQ0KIN/6euofmRMMwTUWxK8eok6sVus2XtUY+Hy8TkzhoLa8boEOJ+xTU8/bZQ==} + peerDependencies: + '@electric-sql/pglite': ^0.2.14 + react: ^18.0.0 + + '@electric-sql/pglite-sync@0.2.16': + resolution: {integrity: sha512-jv/86TRBAPHA273Dt0af/mf/kARHkzsmjTMVhmSs8FAn6UKR1fcqIIAeC3EyI0ihP2H3E2M3ivpMMvO8DULGxQ==} + peerDependencies: + '@electric-sql/pglite': ^0.2.14 + + '@electric-sql/pglite@0.2.14': + resolution: {integrity: sha512-ZMYZL/yFu5sCewYecdX4OjyOPcrI2OmQ6598e/tyke4Rpgeekd4+pINf9jjzJNJk1Kq5dtuB6buqZsBQf0sx8A==} + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -2077,6 +2634,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -2910,6 +3470,46 @@ packages: '@remix-run/web-stream@1.1.0': resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@5.1.3': resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} @@ -3030,6 +3630,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -3429,6 +4032,9 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -3528,6 +4134,9 @@ packages: '@types/react@18.3.12': resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -3540,6 +4149,9 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -3868,6 +4480,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + algoliasearch@5.13.0: resolution: {integrity: sha512-04lyQX3Ev/oLYQx+aagamQDXvkUUfX1mwrLrus15+9fNaYj28GDxxEzbwaRfvmHFcZyoxvup7mMtDTTw8SrTEQ==} engines: {node: '>= 14.0.0'} @@ -3960,9 +4575,16 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -3977,6 +4599,21 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4220,6 +4857,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -4273,6 +4914,9 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js@3.39.0: resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} @@ -4302,6 +4946,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} @@ -4530,6 +5178,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.52: resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} @@ -4871,6 +5524,9 @@ packages: estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -4945,6 +5601,9 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -4963,6 +5622,9 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -5037,6 +5699,10 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -5089,6 +5755,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} @@ -5262,6 +5931,9 @@ packages: peerDependencies: postcss: ^8.1.0 + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5401,6 +6073,9 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -5413,6 +6088,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -5438,6 +6117,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -5508,6 +6191,11 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + javascript-stringify@2.1.0: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} @@ -5593,6 +6281,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -5607,6 +6298,10 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -5624,6 +6319,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5754,6 +6453,9 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} @@ -6692,6 +7394,14 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6795,6 +7505,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-compare@3.0.1: + resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -6861,6 +7574,11 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.0.0-rc.1: + resolution: {integrity: sha512-k8MfDX+4G+eaa1cXXI9QF4d+pQtYol3nx8vauqRWUEOPqC7NQn2qmEqUsLoSd28rrZUL+R3T2VC+kZ2Hyx1geQ==} + peerDependencies: + react: 19.0.0-rc.1 + react-icons@4.12.0: resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} peerDependencies: @@ -6986,6 +7704,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.0.0-rc.1: + resolution: {integrity: sha512-NZKln+uyPuyHchzP07I6GGYFxdAoaKhehgpCa3ltJGzwE31OYumLeshGaitA1R/fS5d9D2qpZVwTFAr6zCLM9w==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -7031,9 +7753,19 @@ packages: reftools@1.1.9: resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regex@4.4.0: resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} @@ -7041,6 +7773,17 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + remark-frontmatter@4.0.1: resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} @@ -7116,6 +7859,11 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + rollup@3.29.5: resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -7173,6 +7921,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.25.0-rc.1: + resolution: {integrity: sha512-fVinv2lXqYpKConAMdergOl5owd0rY1O4P/QTe0aWKCqGtu7VsCt1iqQFxSJtqK4Lci/upVSBpGwVC7eWcuS9Q==} + search-insights@2.17.2: resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} @@ -7189,6 +7940,9 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -7289,6 +8043,9 @@ packages: resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} engines: {node: '>=8.0.0'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -7311,6 +8068,10 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -7426,6 +8187,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -7446,6 +8211,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7458,6 +8227,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -7555,10 +8328,23 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + engines: {node: '>=10'} + hasBin: true + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -7705,6 +8491,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -7733,6 +8523,12 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + types-react-dom@19.0.0-rc.1: + resolution: {integrity: sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==} + + types-react@19.0.0-rc.1: + resolution: {integrity: sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==} + typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -7762,6 +8558,22 @@ packages: resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} engines: {node: '>=18.17'} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -7773,6 +8585,10 @@ packages: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} @@ -7824,6 +8640,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -7899,6 +8719,18 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + valtio@2.1.2: + resolution: {integrity: sha512-fhekN5Rq7dvHULHHBlJeXHrQDl0Jj9GXfNavCm3gkD06crGchaG1nf/J7gSlfZU2wPcRdVS5jBKWHtE2NNz97A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -7928,6 +8760,18 @@ packages: vite-plugin-capsize-radix@0.0.9: resolution: {integrity: sha512-pd9qgkxyTXkWstMy5yri65mbgCZrmQm/VHcPzbfdLs0jUEP0/C6LUtupEMzxcjYP2jqQyic4tBNocyVf060Ccw==} + vite-plugin-pwa@0.21.0: + resolution: {integrity: sha512-gnDE5sN2hdxA4vTl0pe6PCTPXqChk175jH8dZVVTBjFhWarZZoXaAdoTIKCIa8Zbx94sC0CnCOyERBWpxvry+g==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.6 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.3.0 + workbox-window: ^7.3.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + vite-plugin-svgr@3.3.0: resolution: {integrity: sha512-vWZMCcGNdPqgziYFKQ3Y95XP0d0YGp28+MM3Dp9cTa/px5CKcHHrIoPl2Jw81rgVm6/ZUNONzjXbZQZ7Kw66og==} peerDependencies: @@ -8008,6 +8852,12 @@ packages: terser: optional: true + vitepress-plugin-tabs@0.5.0: + resolution: {integrity: sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==} + peerDependencies: + vitepress: ^1.0.0-rc.27 + vue: ^3.3.8 + vitepress@1.5.0: resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} hasBin: true @@ -8151,6 +9001,55 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workbox-background-sync@7.3.0: + resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} + + workbox-broadcast-update@7.3.0: + resolution: {integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==} + + workbox-build@7.3.0: + resolution: {integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==} + engines: {node: '>=16.0.0'} + + workbox-cacheable-response@7.3.0: + resolution: {integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==} + + workbox-core@7.3.0: + resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} + + workbox-expiration@7.3.0: + resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} + + workbox-google-analytics@7.3.0: + resolution: {integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==} + + workbox-navigation-preload@7.3.0: + resolution: {integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==} + + workbox-precaching@7.3.0: + resolution: {integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==} + + workbox-range-requests@7.3.0: + resolution: {integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==} + + workbox-recipes@7.3.0: + resolution: {integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==} + + workbox-routing@7.3.0: + resolution: {integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==} + + workbox-strategies@7.3.0: + resolution: {integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==} + + workbox-streams@7.3.0: + resolution: {integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==} + + workbox-sw@7.3.0: + resolution: {integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==} + + workbox-window@7.3.0: + resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -8370,6 +9269,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': + dependencies: + ajv: 8.17.1 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -8410,6 +9316,13 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-compilation-targets@7.25.9': dependencies: '@babel/compat-data': 7.26.2 @@ -8431,6 +9344,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.25.9 @@ -8460,6 +9391,15 @@ snapshots: '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8489,6 +9429,14 @@ snapshots: '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 @@ -8498,51 +9446,502 @@ snapshots: dependencies: '@babel/types': 7.26.0 - '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-simple-access': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8862,6 +10261,22 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' + '@electric-sql/client@0.8.0': + optionalDependencies: + '@rollup/rollup-darwin-arm64': 4.24.4 + + '@electric-sql/pglite-react@0.2.14(@electric-sql/pglite@0.2.14)(react@19.0.0-rc.1)': + dependencies: + '@electric-sql/pglite': 0.2.14 + react: 19.0.0-rc.1 + + '@electric-sql/pglite-sync@0.2.16(@electric-sql/pglite@0.2.14)': + dependencies: + '@electric-sql/client': 0.8.0 + '@electric-sql/pglite': 0.2.14 + + '@electric-sql/pglite@0.2.14': {} + '@emotion/hash@0.9.2': {} '@emotion/is-prop-valid@1.2.2': @@ -9337,6 +10752,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': @@ -10193,7 +11613,7 @@ snapshots: '@remirror/core-constants@3.0.0': {} - '@remix-run/dev@2.13.1(@remix-run/react@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.13.1(typescript@5.6.3))(@types/node@20.17.6)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.6))': + '@remix-run/dev@2.13.1(@remix-run/react@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.13.1(typescript@5.6.3))(@types/node@20.17.6)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/generator': 7.26.2 @@ -10210,7 +11630,7 @@ snapshots: '@remix-run/router': 1.20.0 '@remix-run/server-runtime': 2.13.1(typescript@5.6.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@20.17.6) + '@vanilla-extract/integration': 6.5.0(@types/node@20.17.6)(terser@5.36.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -10252,7 +11672,7 @@ snapshots: optionalDependencies: '@remix-run/serve': 2.13.1(typescript@5.6.3) typescript: 5.6.3 - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10358,6 +11778,56 @@ snapshots: dependencies: web-streams-polyfill: 3.3.3 + '@rollup/plugin-babel@5.3.1(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + optionalDependencies: + '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + magic-string: 0.25.9 + rollup: 2.79.2 + + '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.36.0 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@5.1.3(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 2.79.2 + '@rollup/pluginutils@5.1.3(rollup@4.24.4)': dependencies: '@types/estree': 1.0.6 @@ -10453,6 +11923,13 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -10869,6 +12346,8 @@ snapshots: dependencies: '@types/estree': 1.0.6 + '@types/estree@0.0.39': {} + '@types/estree@1.0.6': {} '@types/hast@2.3.10': @@ -10988,6 +12467,8 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/resolve@1.20.2': {} + '@types/semver@7.5.8': {} '@types/stack-utils@2.0.3': {} @@ -10998,6 +12479,8 @@ snapshots: dependencies: '@types/node': 20.17.6 + '@types/trusted-types@2.0.7': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -11219,7 +12702,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@20.17.6)': + '@vanilla-extract/integration@6.5.0(@types/node@20.17.6)(terser@5.36.0)': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) @@ -11232,8 +12715,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.2 outdent: 0.8.0 - vite: 5.4.10(@types/node@20.17.6) - vite-node: 1.6.0(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) + vite-node: 1.6.0(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11248,38 +12731,38 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vitejs/plugin-react-swc@3.7.1(@swc/helpers@0.5.5)(vite@5.4.10(@types/node@20.17.6))': + '@vitejs/plugin-react-swc@3.7.1(@swc/helpers@0.5.5)(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))': dependencies: '@swc/core': 1.9.1(@swc/helpers@0.5.5) - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.3(vite@4.5.5(@types/node@20.17.6))': + '@vitejs/plugin-react@4.3.3(vite@4.5.5(@types/node@20.17.6)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 4.5.5(@types/node@20.17.6) + vite: 4.5.5(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@20.17.6))': + '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@20.17.6))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) '@vitest/expect@2.1.4': @@ -11289,13 +12772,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@20.17.6))': + '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))': dependencies: '@vitest/spy': 2.1.4 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) '@vitest/pretty-format@2.1.4': dependencies: @@ -11462,6 +12945,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + algoliasearch@5.13.0: dependencies: '@algolia/client-abtesting': 5.13.0 @@ -11563,8 +13053,12 @@ snapshots: astring@1.9.0: {} + async@3.2.6: {} + asynckit@0.4.0: {} + at-least-node@1.0.0: {} + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.24.2 @@ -11581,6 +13075,30 @@ snapshots: aws4fetch@1.0.20: {} + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -11835,6 +13353,8 @@ snapshots: commander@7.2.0: {} + common-tags@1.8.2: {} + compressible@2.0.18: dependencies: mime-db: 1.53.0 @@ -11889,6 +13409,10 @@ snapshots: dependencies: is-what: 4.1.16 + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.2 + core-js@3.39.0: {} core-util-is@1.0.3: {} @@ -11921,6 +13445,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-random-string@2.0.0: {} + css-box-model@1.2.1: dependencies: tiny-invariant: 1.3.3 @@ -12148,6 +13674,10 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.5.52: {} emoji-regex@8.0.0: {} @@ -12650,6 +14180,8 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 2.0.11 + estree-walker@1.0.1: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -12757,6 +14289,8 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-uri@3.0.3: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -12773,6 +14307,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -12858,6 +14396,13 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -12904,6 +14449,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-property-symbols@3.0.2: {} + get-port-please@3.1.2: {} get-port@5.1.1: {} @@ -13124,6 +14671,8 @@ snapshots: dependencies: postcss: 8.4.47 + idb@7.1.1: {} + ieee754@1.2.1: {} ignore-by-default@1.0.1: {} @@ -13253,6 +14802,8 @@ snapshots: is-map@2.0.3: {} + is-module@1.0.0: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -13261,6 +14812,8 @@ snapshots: is-number@7.0.0: {} + is-obj@1.0.1: {} + is-path-inside@3.0.3: {} is-plain-obj@3.0.0: {} @@ -13280,6 +14833,8 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regexp@1.0.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: @@ -13337,6 +14892,13 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + javascript-stringify@2.1.0: {} jest-diff@29.7.0: @@ -13441,6 +15003,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -13455,6 +15019,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -13485,6 +15051,8 @@ snapshots: kleur@4.1.5: {} + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -13589,6 +15157,10 @@ snapshots: lz-string@1.5.0: {} + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -14684,6 +16256,10 @@ snapshots: prettier@3.3.3: {} + pretty-bytes@5.6.0: {} + + pretty-bytes@6.1.1: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -14829,6 +16405,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-compare@3.0.1: {} + pseudomap@1.0.2: {} pstree.remy@1.1.8: {} @@ -14905,6 +16483,11 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@19.0.0-rc.1(react@19.0.0-rc.1): + dependencies: + react: 19.0.0-rc.1 + scheduler: 0.25.0-rc.1 + react-icons@4.12.0(react@18.3.1): dependencies: react: 18.3.1 @@ -15037,6 +16620,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.0.0-rc.1: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -15124,8 +16709,18 @@ snapshots: reftools@1.1.9: {} + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + regenerator-runtime@0.14.1: {} + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + regex@4.4.0: {} regexp.prototype.flags@1.5.3: @@ -15135,6 +16730,21 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + remark-frontmatter@4.0.1: dependencies: '@types/mdast': 3.0.15 @@ -15212,6 +16822,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + rollup@3.29.5: optionalDependencies: fsevents: 2.3.3 @@ -15290,6 +16904,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.25.0-rc.1: {} + search-insights@2.17.2: {} semver@6.3.1: {} @@ -15314,6 +16930,10 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -15438,6 +17058,8 @@ snapshots: slugify@1.4.7: {} + smob@1.5.0: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -15458,6 +17080,8 @@ snapshots: dependencies: whatwg-url: 7.1.0 + sourcemap-codec@1.4.8: {} + space-separated-tokens@2.0.2: {} spawn-command@0.0.2: {} @@ -15554,6 +17178,21 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.3 + set-function-name: 2.0.2 + side-channel: 1.0.6 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -15586,6 +17225,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -15596,6 +17241,8 @@ snapshots: strip-bom@3.0.0: {} + strip-comments@2.0.1: {} + strip-final-newline@2.0.0: {} strip-json-comments@3.1.1: {} @@ -15741,8 +17388,24 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + temp-dir@2.0.0: {} + + tempy@0.6.0: + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + term-size@2.2.1: {} + terser@5.36.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + text-table@0.2.0: {} thenify-all@1.6.0: @@ -15884,6 +17547,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.16.0: {} + type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -15925,6 +17590,14 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + types-react-dom@19.0.0-rc.1: + dependencies: + '@types/react': 18.3.12 + + types-react@19.0.0-rc.1: + dependencies: + csstype: 3.1.3 + typescript@5.6.3: {} uc.micro@2.1.0: {} @@ -15947,6 +17620,17 @@ snapshots: undici@6.20.1: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + unified@10.1.2: dependencies: '@types/unist': 2.0.11 @@ -15965,6 +17649,10 @@ snapshots: dependencies: imurmurhash: 0.1.4 + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + unist-util-generated@2.0.1: {} unist-util-is@5.2.1: @@ -16028,6 +17716,8 @@ snapshots: unpipe@1.0.0: {} + upath@1.2.0: {} + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -16095,6 +17785,13 @@ snapshots: validate-npm-package-name@5.0.1: {} + valtio@2.1.2(react@19.0.0-rc.1)(types-react@19.0.0-rc.1): + dependencies: + proxy-compare: 3.0.1 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.1 + react: 19.0.0-rc.1 + vary@1.1.2: {} vfile-message@3.1.4: @@ -16119,13 +17816,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@1.6.0(@types/node@20.17.6): + vite-node@1.6.0(@types/node@20.17.6)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -16137,12 +17834,12 @@ snapshots: - supports-color - terser - vite-node@2.1.4(@types/node@20.17.6): + vite-node@2.1.4(@types/node@20.17.6)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@5.5.0) pathe: 1.1.2 - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -16160,12 +17857,23 @@ snapshots: '@capsizecss/metrics': 2.2.0 mustache: 4.2.0 - vite-plugin-svgr@3.3.0(rollup@4.24.4)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)): + vite-plugin-pwa@0.21.0(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + dependencies: + debug: 4.3.7(supports-color@5.5.0) + pretty-bytes: 6.1.1 + tinyglobby: 0.2.10 + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) + workbox-build: 7.3.0(@types/babel__core@7.20.5) + workbox-window: 7.3.0 + transitivePeerDependencies: + - supports-color + + vite-plugin-svgr@3.3.0(rollup@4.24.4)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)(terser@5.36.0)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.24.4) '@svgr/core': 8.1.0(typescript@5.6.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) - vite: 4.5.5(@types/node@20.17.6) + vite: 4.5.5(@types/node@20.17.6)(terser@5.36.0) transitivePeerDependencies: - rollup - supports-color @@ -16180,7 +17888,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - vite@4.5.5(@types/node@20.17.6): + vite@4.5.5(@types/node@20.17.6)(terser@5.36.0): dependencies: esbuild: 0.18.20 postcss: 8.4.47 @@ -16188,8 +17896,9 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 fsevents: 2.3.3 + terser: 5.36.0 - vite@5.4.10(@types/node@20.17.6): + vite@5.4.10(@types/node@20.17.6)(terser@5.36.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -16197,8 +17906,14 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 fsevents: 2.3.3 + terser: 5.36.0 + + vitepress-plugin-tabs@0.5.0(vitepress@1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3)): + dependencies: + vitepress: 1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) + vue: 3.5.12(typescript@5.6.3) - vitepress@1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3): + vitepress@1.5.0(@algolia/client-search@5.13.0)(@types/node@20.17.6)(@types/react@18.3.12)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): dependencies: '@docsearch/css': 3.7.0 '@docsearch/js': 3.7.0(@algolia/client-search@5.13.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2) @@ -16207,7 +17922,7 @@ snapshots: '@shikijs/transformers': 1.22.2 '@shikijs/types': 1.22.2 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@20.17.6))(vue@3.5.12(typescript@5.6.3)) + '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vue/devtools-api': 7.6.3 '@vue/shared': 3.5.12 '@vueuse/core': 11.2.0(vue@3.5.12(typescript@5.6.3)) @@ -16216,7 +17931,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.22.2 - vite: 5.4.10(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) optionalDependencies: postcss: 8.4.47 @@ -16248,10 +17963,10 @@ snapshots: - typescript - universal-cookie - vitest@2.1.4(@types/node@20.17.6)(jsdom@25.0.1): + vitest@2.1.4(@types/node@20.17.6)(jsdom@25.0.1)(terser@5.36.0): dependencies: '@vitest/expect': 2.1.4 - '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@20.17.6)) + '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@20.17.6)(terser@5.36.0)) '@vitest/pretty-format': 2.1.4 '@vitest/runner': 2.1.4 '@vitest/snapshot': 2.1.4 @@ -16267,8 +17982,8 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@20.17.6) - vite-node: 2.1.4(@types/node@20.17.6) + vite: 5.4.10(@types/node@20.17.6)(terser@5.36.0) + vite-node: 2.1.4(@types/node@20.17.6)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.17.6 @@ -16392,6 +18107,119 @@ snapshots: wordwrap@1.0.0: {} + workbox-background-sync@7.3.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + + workbox-broadcast-update@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-build@7.3.0(@types/babel__core@7.20.5): + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) + '@babel/core': 7.26.0 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.0(rollup@2.79.2) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.17.1 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.3.0 + workbox-broadcast-update: 7.3.0 + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-google-analytics: 7.3.0 + workbox-navigation-preload: 7.3.0 + workbox-precaching: 7.3.0 + workbox-range-requests: 7.3.0 + workbox-recipes: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + workbox-streams: 7.3.0 + workbox-sw: 7.3.0 + workbox-window: 7.3.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-cacheable-response@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-core@7.3.0: {} + + workbox-expiration@7.3.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + + workbox-google-analytics@7.3.0: + dependencies: + workbox-background-sync: 7.3.0 + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-navigation-preload@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-precaching@7.3.0: + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-range-requests@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-recipes@7.3.0: + dependencies: + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-precaching: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-routing@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-strategies@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-streams@7.3.0: + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + + workbox-sw@7.3.0: {} + + workbox-window@7.3.0: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.3.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 diff --git a/website/.vitepress/config.mts b/website/.vitepress/config.mts index 191db818ea..67da270852 100644 --- a/website/.vitepress/config.mts +++ b/website/.vitepress/config.mts @@ -1,5 +1,6 @@ import fs from 'node:fs' import { defineConfig } from 'vitepress' +import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs' import postsData from '../data/posts.data.ts' @@ -51,7 +52,10 @@ export default defineConfig({ 'sql', 'tsx', 'typescript' - ] + ], + config(md) { + md.use(tabsMarkdownPlugin) + } }, rewrites(id) { if (id.startsWith('blog/posts')) { @@ -154,10 +158,11 @@ export default defineConfig({ items: [ { text: 'Auth', link: '/docs/guides/auth' }, { text: 'Shapes', link: '/docs/guides/shapes' }, + { text: 'Writes', link: '/docs/guides/writes' }, { text: 'Installation', link: '/docs/guides/installation' }, { text: 'Deployment', link: '/docs/guides/deployment' }, { text: 'Troubleshooting', link: '/docs/guides/troubleshooting' }, - { text: 'Writing your own client', link: '/docs/guides/writing-your-own-client' }, + { text: 'Client development', link: '/docs/guides/client-development' }, ] }, { diff --git a/website/.vitepress/theme/custom.css b/website/.vitepress/theme/custom.css index 80130bc115..8d718413a3 100644 --- a/website/.vitepress/theme/custom.css +++ b/website/.vitepress/theme/custom.css @@ -129,6 +129,9 @@ display: inline-flex !important; align-items: center; } +.vpi-social-github { + --icon: url('https://api.iconify.design/simple-icons/github.svg'); +} .action a .vpi-social-discord, .action a .vpi-social-github, .feature-cta a .vpi-social-github, diff --git a/website/.vitepress/theme/index.js b/website/.vitepress/theme/index.js index e2aeca1448..b377e7c808 100644 --- a/website/.vitepress/theme/index.js +++ b/website/.vitepress/theme/index.js @@ -1,12 +1,14 @@ import DefaultTheme, { VPButton } from 'vitepress/theme-without-fonts' -import Layout from './Layout.vue' +import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client' import YoutubeEmbed from '../../src/components/YoutubeEmbed.vue' +import Layout from './Layout.vue' import './custom.css' export default { enhanceApp({ app }) { app.component('VPButton', VPButton) app.component('YoutubeEmbed', YoutubeEmbed) + enhanceAppWithTabs(app) }, extends: DefaultTheme, Layout: Layout diff --git a/website/blog/posts/2024-11-21-local-first-with-your-existing-api.md b/website/blog/posts/2024-11-21-local-first-with-your-existing-api.md new file mode 100644 index 0000000000..252592329d --- /dev/null +++ b/website/blog/posts/2024-11-21-local-first-with-your-existing-api.md @@ -0,0 +1,17 @@ +--- +title: Local-first with your existing API +description: >- + How to develop local-first apps incrementally, using your existing API. +excerpt: >- + Local-first is often seen as eliminating your API. But what if you like + your API or need to keep it because of other code paths and integrations? + This post shows how you can develop local-first apps incrementally, + using your existing API. +authors: [thruflo] +image: /img/blog/local-first-with-your-existing-api/humble-toaster.jpg +tags: [local-first example] +outline: [2, 4] +post: true +--- + +This post will be published shortly. Bear with us. \ No newline at end of file diff --git a/website/docs/api/http.md b/website/docs/api/http.md index 1c63824956..98affc7893 100644 --- a/website/docs/api/http.md +++ b/website/docs/api/http.md @@ -109,7 +109,7 @@ The server holds open the request until either a timeout (returning `204 No cont The algorithm for consuming the HTTP API described above can be implemented from scratch for your application. Howerver, it's typically implemented by clients that can be re-used and provide a simpler interface for application code. -There are a number of existing clients, such as the [TypeScript](/docs/api/clients/typescript) and [Elixir](/docs/api/clients/elixir) clients. If one doesn't exist for your language or environment, we hope that the pattern is simple enough that you should be able to [write your own client](/docs/guides/writing-your-own-client) relatively easily. +There are a number of existing clients, such as the [TypeScript](/docs/api/clients/typescript) and [Elixir](/docs/api/clients/elixir) clients. If one doesn't exist for your language or environment, we hope that the pattern is simple enough that you should be able to [write your own client](/docs/guides/client-development) relatively easily. ## Caching diff --git a/website/docs/guides/auth.md b/website/docs/guides/auth.md index e947a32f17..140ec395e0 100644 --- a/website/docs/guides/auth.md +++ b/website/docs/guides/auth.md @@ -14,6 +14,10 @@ import GatekeeperFlow from '/static/img/docs/guides/auth/gatekeeper-flow.dark.pn import GatekeeperFlowJPG from '/static/img/docs/guides/auth/gatekeeper-flow.jpg?url' + + # Auth