From 41921c9e52869dc2e10177303f47be13d1c2bc5a Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Sun, 30 Aug 2026 20:10:03 +0000 Subject: [PATCH 1/3] Add @fedify/pglite with PgliteKvStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a new package providing PgliteKvStore, a KvStore backed by an embedded PGlite database. It accepts a caller-created PGlite instance and reuses the PostgresKvStore schema and default table name, so a PGlite data directory can be migrated to PostgreSQL without conversion. Values are bound as text and cast to jsonb because PGlite rejects bare JavaScript strings for jsonb parameters. A message queue is not provided because PGlite does not share data between processes. Add testKvStore() to @fedify/testing, a KvStore conformance suite modeled on testMessageQueue(). It runs against MemoryKvStore in @fedify/testing and against PgliteKvStore in @fedify/pglite. Register the package in the workspaces, README, CODEOWNERS, and repo checks, and document PgliteKvStore in the key–value store manual. https://github.com/fedify-dev/fedify/issues/1018 Assisted-by: Codex:gpt-5.6-sol Assisted-by: Claude Code:claude-fable-5 --- .github/CODEOWNERS | 1 + CHANGES.md | 12 + changes.d/pglite/pglite-kv-store.md | 5 + changes.d/testing/kv-store-tester.md | 2 + cspell.json | 1 + deno.json | 7 +- deno.lock | 49 +-- docs/manual/kv.md | 68 ++++ docs/package.json | 6 +- packages/fedify/README.md | 3 + packages/pglite/README.md | 52 ++++ packages/pglite/deno.json | 23 ++ packages/pglite/package.json | 86 +++++ packages/pglite/src/kv.test.ts | 171 ++++++++++ packages/pglite/src/kv.ts | 294 +++++++++++++++++ packages/pglite/src/mod.ts | 7 + packages/pglite/tsdown.config.ts | 55 ++++ packages/testing/README.md | 27 ++ packages/testing/src/kv-tester.test.ts | 10 + packages/testing/src/kv-tester.ts | 211 +++++++++++++ packages/testing/src/mod.ts | 4 + pnpm-lock.yaml | 416 ++++++++++++++----------- pnpm-workspace.yaml | 19 +- scripts/check_fixture_usage.ts | 3 + scripts/check_temporal_polyfill.ts | 4 + 25 files changed, 1316 insertions(+), 220 deletions(-) create mode 100644 changes.d/pglite/pglite-kv-store.md create mode 100644 changes.d/testing/kv-store-tester.md create mode 100644 packages/pglite/README.md create mode 100644 packages/pglite/deno.json create mode 100644 packages/pglite/package.json create mode 100644 packages/pglite/src/kv.test.ts create mode 100644 packages/pglite/src/kv.ts create mode 100644 packages/pglite/src/mod.ts create mode 100644 packages/pglite/tsdown.config.ts create mode 100644 packages/testing/src/kv-tester.test.ts create mode 100644 packages/testing/src/kv-tester.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3071ac905..c095f50b3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -80,6 +80,7 @@ /packages/amqp/ @dahlia /packages/denokv/ @dahlia @2chanhaeng /packages/mysql/ @dahlia +/packages/pglite/ @dahlia @2chanhaeng /packages/postgres/ @dahlia @2chanhaeng /packages/redis/ @dahlia @2chanhaeng /packages/sqlite/ @dahlia @2chanhaeng diff --git a/CHANGES.md b/CHANGES.md index 92cd12d48..0331680bd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -251,6 +251,16 @@ To be released. explicit recovery for unobservable dead-letter failures. [[#930], [#934]] +### @fedify/pglite + + - Added the `@fedify/pglite` package with `PgliteKvStore`, a `KvStore` backed + by an embedded PGlite database. It accepts a caller-created PGlite instance + and is intended for a single PGlite instance in a single runtime isolate; a + message queue is not provided because PGlite does not share data between + processes. [[#1018]] + +[#1018]: https://github.com/fedify-dev/fedify/issues/1018 + ### @fedify/postgres - Added `PostgresKvStore.cas()`, including atomic creation, replacement, and @@ -304,6 +314,8 @@ To be released. ### @fedify/testing + - Added `testKvStore()`, a conformance test suite for `KvStore` + implementations, complementing `testMessageQueue()`. [[#1018]] - Fixed the CommonJS testing utilities build so it no longer requires `@js-temporal/polyfill` at runtime. The build now bundles `temporal-polyfill`, while type declarations rely on the standard diff --git a/changes.d/pglite/pglite-kv-store.md b/changes.d/pglite/pglite-kv-store.md new file mode 100644 index 000000000..54ccbdc9c --- /dev/null +++ b/changes.d/pglite/pglite-kv-store.md @@ -0,0 +1,5 @@ + - Added the `@fedify/pglite` package with `PgliteKvStore`, a `KvStore` backed + by an embedded PGlite database. It accepts a caller-created PGlite instance + and is intended for a single PGlite instance in a single runtime isolate; a + message queue is not provided because PGlite does not share data between + processes. [[#1018]] diff --git a/changes.d/testing/kv-store-tester.md b/changes.d/testing/kv-store-tester.md new file mode 100644 index 000000000..f4154cdb7 --- /dev/null +++ b/changes.d/testing/kv-store-tester.md @@ -0,0 +1,2 @@ + - Added `testKvStore()`, a conformance test suite for `KvStore` + implementations, complementing `testMessageQueue()`. [[#1018]] diff --git a/cspell.json b/cspell.json index 07a948002..d279dd19c 100644 --- a/cspell.json +++ b/cspell.json @@ -86,6 +86,7 @@ "optique", "oxlint", "oxlintrc", + "pglite", "phensley", "Pico", "Pixelfed", diff --git a/deno.json b/deno.json index efc05f9fd..44f20799e 100644 --- a/deno.json +++ b/deno.json @@ -21,6 +21,7 @@ "./packages/mysql", "./packages/netlify", "./packages/nuxt", + "./packages/pglite", "./packages/postgres", "./packages/redis", "./packages/relay", @@ -45,6 +46,7 @@ "imports": { "@cloudflare/workers-types": "npm:@cloudflare/workers-types@^4.20260511.1", "@david/dax": "jsr:@david/dax@^0.46.1", + "@electric-sql/pglite": "npm:@electric-sql/pglite@^0.5.8", "@fxts/core": "npm:@fxts/core@^1.21.1", "@hongminhee/localtunnel": "jsr:@hongminhee/localtunnel@^0.3.0", "@js-temporal/polyfill": "npm:@js-temporal/polyfill@^0.5.1", @@ -61,6 +63,8 @@ "@optique/core": "jsr:@optique/core@^1.1.0", "@optique/discover": "jsr:@optique/discover@^1.1.0", "@optique/run": "jsr:@optique/run@^1.1.0", + "@solidjs/start/middleware": "npm:@solidjs/start@^1.3.0/middleware", + "@solidjs/start/server": "npm:@solidjs/start@^1.3.0/server", "@standard-schema/spec": "jsr:@standard-schema/spec@^1.1.0", "@std/assert": "jsr:@std/assert@^1.0.13", "@std/async": "jsr:@std/async@^1.0.13", @@ -69,11 +73,10 @@ "@std/path": "jsr:@std/path@^1.0.6", "@std/testing": "jsr:@std/testing@^0.224.0", "@std/yaml": "jsr:@std/yaml@^1.0.8", + "@types/emscripten": "npm:@types/emscripten@^1.41.1", "@types/node": "npm:@types/node@^22.16.0", "amqplib": "npm:amqplib@^0.10.9", "asn1js": "npm:asn1js@^3.0.10", - "@solidjs/start/middleware": "npm:@solidjs/start@^1.3.0/middleware", - "@solidjs/start/server": "npm:@solidjs/start@^1.3.0/server", "astro": "npm:astro@^7.0.0", "byte-encodings": "npm:byte-encodings@^1.0.11", "chalk": "npm:chalk@^5.6.2", diff --git a/deno.lock b/deno.lock index 5b415dc03..1290bf2b3 100644 --- a/deno.lock +++ b/deno.lock @@ -73,12 +73,13 @@ "jsr:@std/yaml@^1.0.8": "1.1.0", "jsr:@valibot/valibot@^1.4.0": "1.4.1", "npm:@alinea/suite@~0.6.3": "0.6.3", - "npm:@astrojs/node@^11.0.2": "11.0.2_astro@7.0.9__@emnapi+core@1.11.2__@emnapi+runtime@1.11.2__@types+node@24.12.2__ioredis@5.10.1__rollup@4.60.1__tsx@4.21.0__yaml@2.9.0_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0", + "npm:@astrojs/node@^11.0.2": "11.0.2_astro@7.0.9__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8", "npm:@babel/preset-react@^7.27.1": "7.28.5_@babel+core@7.29.7", "npm:@cfworker/json-schema@^4.1.1": "4.1.1", "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_vitest@3.2.4__@types+node@24.12.2__yaml@2.9.0_@cloudflare+workers-types@4.20260511.1", "npm:@cloudflare/workers-types@^4.20260511.1": "4.20260511.1", - "npm:@deno/astro-adapter@0.6": "0.6.0_@opentelemetry+api@1.9.1_astro@7.0.9__@emnapi+core@1.11.2__@emnapi+runtime@1.11.2__@types+node@24.12.2__ioredis@5.10.1__rollup@4.60.1__tsx@4.21.0__yaml@2.9.0_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0", + "npm:@deno/astro-adapter@0.6": "0.6.0_@opentelemetry+api@1.9.1_astro@7.0.9__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8", + "npm:@electric-sql/pglite@~0.5.8": "0.5.8", "npm:@fxts/core@^1.21.1": "1.26.0", "npm:@hongminhee/localtunnel@0.5": "0.5.0", "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@24.12.2", @@ -89,7 +90,7 @@ "npm:@multiformats/base-x@^4.0.1": "4.0.1", "npm:@nestjs/common@^11.0.1": "11.1.19_reflect-metadata@0.2.2_rxjs@7.8.2", "npm:@netlify/async-workloads@^0.0.106": "0.0.106_@google-cloud+storage@5.20.5_@trpc+server@11.18.0__typescript@5.9.3_@types+react@19.2.17_autoprefixer@10.5.2__postcss@8.5.19_graphql@16.14.2_postcss@8.5.19_react@19.2.7_react-dom@19.2.7__react@19.2.7_rollup@4.60.1_tailwindcss@3.4.19__tsx@4.21.0__yaml@2.9.0_tsx@4.21.0_yaml@2.9.0", - "npm:@netlify/database@^1.1.0": "1.1.0_mysql2@3.22.3__@types+node@24.12.2_postgres@3.4.9", + "npm:@netlify/database@^1.1.0": "1.1.0_@electric-sql+pglite@0.5.8", "npm:@nuxt/kit@4": "4.4.2", "npm:@nuxt/schema@4": "4.4.2", "npm:@opentelemetry/api@^1.9.0": "1.9.1", @@ -104,12 +105,13 @@ "npm:@preact/signals@^2.5.1": "2.9.1_preact@10.29.2", "npm:@prefresh/vite@^2.4.8": "2.4.12_preact@10.29.2_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0", "npm:@remix-run/node-fetch-server@0.12": "0.12.0", - "npm:@solidjs/start@^1.3.0": "1.3.2_acorn@8.17.0_ioredis@5.10.1_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0", + "npm:@solidjs/start@^1.3.0": "1.3.2_@electric-sql+pglite@0.5.8_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0", "npm:@standard-schema/spec@^1.1.0": "1.1.0", "npm:@sveltejs/kit@2": "2.57.1_@opentelemetry+api@1.9.1_typescript@6.0.3_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0", "npm:@types/amqplib@*": "0.10.8", "npm:@types/amqplib@~0.10.7": "0.10.8", "npm:@types/babel__core@^7.20.5": "7.20.5", + "npm:@types/emscripten@^1.41.1": "1.41.5", "npm:@types/eslint@9": "9.6.1", "npm:@types/estree@^1.0.8": "1.0.9", "npm:@types/estree@^1.0.9": "1.0.9", @@ -120,7 +122,7 @@ "npm:@typescript-eslint/utils@8": "8.58.2_eslint@9.39.4_typescript@6.0.3", "npm:amqplib@~0.10.9": "0.10.9", "npm:asn1js@^3.0.10": "3.0.10", - "npm:astro@7": "7.0.9_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0", + "npm:astro@7": "7.0.9_@electric-sql+pglite@0.5.8", "npm:byte-encodings@^1.0.11": "1.0.11", "npm:chalk@^5.6.2": "5.6.2", "npm:cli-highlight@^2.1.11": "2.1.11", @@ -600,7 +602,7 @@ "satteri" ] }, - "@astrojs/node@11.0.2_astro@7.0.9__@emnapi+core@1.11.2__@emnapi+runtime@1.11.2__@types+node@24.12.2__ioredis@5.10.1__rollup@4.60.1__tsx@4.21.0__yaml@2.9.0_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0": { + "@astrojs/node@11.0.2_astro@7.0.9__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8": { "integrity": "sha512-/ijULxT+A5Cm8wSwWZ2vgqfim1b05D6B8n/a9l6MMA4FCotIH73g7fL7y76XojKXpTe75FVvQH92OxsMqea9kQ==", "dependencies": [ "@astrojs/internal-helpers", @@ -1047,7 +1049,7 @@ "kuler" ] }, - "@deno/astro-adapter@0.6.0_@opentelemetry+api@1.9.1_astro@7.0.9__@emnapi+core@1.11.2__@emnapi+runtime@1.11.2__@types+node@24.12.2__ioredis@5.10.1__rollup@4.60.1__tsx@4.21.0__yaml@2.9.0_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0": { + "@deno/astro-adapter@0.6.0_@opentelemetry+api@1.9.1_astro@7.0.9__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8": { "integrity": "sha512-zltNm5I7MME7Udb5TtAGIfLrfOHiuDG1FrKWDqYbFQ+AurmwxHvfwVCca4f+jfGQY3DnwYLDvb0tnmeI8aUWfg==", "dependencies": [ "@opentelemetry/api", @@ -1081,6 +1083,9 @@ "undici@6.25.0" ] }, + "@electric-sql/pglite@0.5.8": { + "integrity": "sha512-n9tsbUOhwx2epK1V0ZG9Ar4SHWUju04dhmzZXiSBXwBoleOvIfals33NAaWgagQVAL4Rbvx/Ptsu3P+pA09f6Q==" + }, "@emnapi/core@1.11.1": { "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dependencies": [ @@ -3861,7 +3866,7 @@ ], "scripts": true }, - "@netlify/database@1.1.0_mysql2@3.22.3__@types+node@24.12.2_postgres@3.4.9": { + "@netlify/database@1.1.0_@electric-sql+pglite@0.5.8": { "integrity": "sha512-Y36JMyQfxwHxvtFzF8K+2PyooGFQXzPNINw/guujQfMujfAwUTwv7f6XiSL3c5orNy8YZTqVVWVjkbFarhDRjw==", "dependencies": [ "@neondatabase/serverless", @@ -5426,7 +5431,7 @@ "@socket.io/component-emitter@3.1.2": { "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, - "@solidjs/start@1.3.2_acorn@8.17.0_ioredis@5.10.1_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0": { + "@solidjs/start@1.3.2_@electric-sql+pglite@0.5.8_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.9.0": { "integrity": "sha512-tasDl3utVbtP0rr4InB3ntBIFV2upvEiFrOOCkRrAA3yBfjx9elpxnc94sJQXo65PNYdAAAkPIC6h93vLrtwHg==", "dependencies": [ "@tanstack/server-functions-plugin", @@ -5851,6 +5856,9 @@ "@types/deep-eql@4.0.2": { "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" }, + "@types/emscripten@1.41.5": { + "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==" + }, "@types/eslint@9.6.1": { "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dependencies": [ @@ -6325,7 +6333,7 @@ ], "bin": true }, - "@vinxi/plugin-directives@0.5.1_vinxi@0.5.11__acorn@8.17.0__ioredis@5.10.1_ioredis@5.10.1": { + "@vinxi/plugin-directives@0.5.1_vinxi@0.5.11__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8": { "integrity": "sha512-pH/KIVBvBt7z7cXrUH/9uaqcdxjegFC7+zvkZkdOyWzs+kQD5KPf3cl8kC+5ayzXHT+OMlhGhyitytqN3cGmHg==", "dependencies": [ "@babel/parser@7.29.7", @@ -6340,7 +6348,7 @@ "vinxi" ] }, - "@vinxi/server-components@0.5.1_vinxi@0.5.11__acorn@8.17.0__ioredis@5.10.1_ioredis@5.10.1": { + "@vinxi/server-components@0.5.1_vinxi@0.5.11__@electric-sql+pglite@0.5.8_@electric-sql+pglite@0.5.8": { "integrity": "sha512-0BsG95qac3dkhfdRZxqzqYWJE4NvPL7ILlV43B6K6ho1etXWB2e5b0IxsUAUbyqpqiXM7mSRivojuXjb2G4OsQ==", "dependencies": [ "@vinxi/plugin-directives", @@ -6793,7 +6801,7 @@ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "bin": true }, - "astro@7.0.9_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@24.12.2_ioredis@5.10.1_rollup@4.60.1_tsx@4.21.0_yaml@2.9.0": { + "astro@7.0.9_@electric-sql+pglite@0.5.8": { "integrity": "sha512-WB5pA4LLQnmqjBh6EIu0z8aUV4q2/AoThgSZq57Rsp+oqqvPu7OwZ5eF+W4ku20TUTxIhiJW8dccuGvJPiW2UA==", "dependencies": [ "@astrojs/compiler-rs", @@ -8075,12 +8083,14 @@ "undici-types@5.28.4" ] }, - "db0@0.3.4_mysql2@3.22.3__@types+node@24.12.2_@types+node@24.12.2": { + "db0@0.3.4_@electric-sql+pglite@0.5.8_mysql2@3.22.3__@types+node@24.12.2": { "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", "dependencies": [ + "@electric-sql/pglite", "mysql2" ], "optionalPeers": [ + "@electric-sql/pglite", "mysql2" ] }, @@ -9194,7 +9204,6 @@ "natural-compare", "optionator" ], - "deprecated": true, "bin": true }, "esm-env@1.2.2": { @@ -12430,7 +12439,7 @@ "next-tick@1.1.0": { "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "nitropack@2.13.3_acorn@8.17.0": { + "nitropack@2.13.3_@electric-sql+pglite@0.5.8": { "integrity": "sha512-C8vO7RxkU0AQ3HbYUumuG6MVM5JjRaBchke/rYFOp3EvrLtTBHZYhDVGECdpa27vNuOYRzm3GtQMn2YDOjDJLA==", "dependencies": [ "@cloudflare/kv-asset-handler@0.4.2", @@ -15666,7 +15675,7 @@ "webpack-virtual-modules" ] }, - "unstorage@1.17.5_ioredis@5.10.1_@types+node@24.12.2_mysql2@3.22.3__@types+node@24.12.2": { + "unstorage@1.17.5_ioredis@5.10.1_@electric-sql+pglite@0.5.8": { "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "dependencies": [ "anymatch", @@ -15837,7 +15846,7 @@ "vfile-message" ] }, - "vinxi@0.5.11_acorn@8.17.0_ioredis@5.10.1": { + "vinxi@0.5.11_@electric-sql+pglite@0.5.8": { "integrity": "sha512-82Qm+EG/b2PRFBvXBbz1lgWBGcd9totIL6SJhnrZYfakjloTVG9+5l6gfO6dbCCtztm5pqWFzLY0qpZ3H3ww/w==", "dependencies": [ "@babel/plugin-syntax-jsx@7.28.6_@babel+core@7.29.7", @@ -16014,15 +16023,17 @@ "xml-name-validator" ] }, - "waddler@0.1.1_@neondatabase+serverless@1.1.0_mysql2@3.22.3__@types+node@24.12.2_pg@8.22.0_postgres@3.4.9": { + "waddler@0.1.1_@electric-sql+pglite@0.5.8_@neondatabase+serverless@1.1.0_mysql2@3.22.3__@types+node@24.12.2_pg@8.22.0_postgres@3.4.9": { "integrity": "sha512-lBJXYFBLEpYe+scAeCJmLj6Iqweuq1whM6Am3I9WfopOCFxvKz8Nq5hXoy8/b3zwJqHIQMglFIvM4skRydSpZg==", "dependencies": [ + "@electric-sql/pglite", "@neondatabase/serverless", "mysql2", "pg", "postgres" ], "optionalPeers": [ + "@electric-sql/pglite", "@neondatabase/serverless", "mysql2", "pg", @@ -16507,6 +16518,7 @@ "jsr:@std/testing@0.224", "jsr:@std/yaml@^1.0.8", "npm:@cloudflare/workers-types@^4.20260511.1", + "npm:@electric-sql/pglite@~0.5.8", "npm:@fxts/core@^1.21.1", "npm:@js-temporal/polyfill@~0.5.1", "npm:@nestjs/common@^11.0.1", @@ -16517,6 +16529,7 @@ "npm:@opentelemetry/sdk-trace-base@^2.7.1", "npm:@opentelemetry/semantic-conventions@^1.40.0", "npm:@solidjs/start@^1.3.0", + "npm:@types/emscripten@^1.41.1", "npm:@types/node@^22.16.0", "npm:amqplib@~0.10.9", "npm:asn1js@^3.0.10", diff --git a/docs/manual/kv.md b/docs/manual/kv.md index d759ed5df..542428fb0 100644 --- a/docs/manual/kv.md +++ b/docs/manual/kv.md @@ -306,6 +306,74 @@ const federation = createFederation({ [`PostgresKvStore`]: https://jsr.io/@fedify/postgres/doc/kv/~/PostgresKvStore +### [`PgliteKvStore`] + +*This API is available since Fedify 2.4.0.* + +To use the [`PgliteKvStore`], install the *@fedify/pglite* package and PGlite: + +::: code-group + +~~~~ bash [Deno] +deno add jsr:@fedify/pglite npm:@electric-sql/pglite +~~~~ + +~~~~ bash [npm] +npm add @fedify/pglite @electric-sql/pglite +~~~~ + +~~~~ bash [pnpm] +pnpm add @fedify/pglite @electric-sql/pglite +~~~~ + +~~~~ bash [Yarn] +yarn add @fedify/pglite @electric-sql/pglite +~~~~ + +~~~~ bash [Bun] +bun add @fedify/pglite @electric-sql/pglite +~~~~ + +::: + +[`PgliteKvStore`] uses an embedded PGlite database without requiring a +PostgreSQL server. It uses the same schema and default table name as +[`PostgresKvStore`], so data can be migrated to PostgreSQL without converting +the key–value records. + +Best for +: Development and testing, single-process deployments, and embedded or + desktop applications that need PostgreSQL-compatible storage without a + PostgreSQL server. + +Pros +: No server installation, PostgreSQL-compatible SQL, and the same schema as + [`PostgresKvStore`]. + +Cons +: Only one process and PGlite instance can open a data directory, data are + not shared between processes, and horizontal scaling is not supported. + +~~~~ typescript twoslash +import { PGlite } from "@electric-sql/pglite"; +import { createFederation } from "@fedify/fedify"; +import { PgliteKvStore } from "@fedify/pglite"; + +const pg = new PGlite("./data/fedify"); +const federation = createFederation({ + kv: new PgliteKvStore(pg), + // ... other options +}); +~~~~ + +> [!WARNING] +> The caller owns the PGlite instance and must close it during application +> shutdown after pending store operations finish. Do not open the same data +> directory from multiple worker processes. Use one PGlite instance per data +> directory and runtime isolate. + +[`PgliteKvStore`]: https://jsr.io/@fedify/pglite/doc/kv/~/PgliteKvStore + ### [`MysqlKvStore`] *This API is available since Fedify 2.1.0.* diff --git a/docs/package.json b/docs/package.json index 69c513187..c203dd7ba 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "@electric-sql/pglite": "catalog:", "@braintree/sanitize-url": "^7.1.2", "@cloudflare/workers-types": "catalog:", "@deno/kv": "^0.8.4", @@ -17,9 +18,10 @@ "@fedify/koa": "workspace:^", "@fedify/lint": "workspace:^", "@fedify/mysql": "workspace:^", - "@fedify/netlify": "workspace:^", "@fedify/nestjs": "workspace:^", + "@fedify/netlify": "workspace:^", "@fedify/next": "workspace:^", + "@fedify/pglite": "workspace:^", "@fedify/postgres": "workspace:^", "@fedify/redis": "workspace:^", "@fedify/relay": "workspace:^", @@ -27,8 +29,8 @@ "@fedify/sveltekit": "workspace:^", "@fedify/testing": "workspace:^", "@fedify/uri-template": "workspace:^", - "@fedify/vocab": "workspace:^", "@fedify/vocab-runtime": "workspace:^", + "@fedify/vocab": "workspace:^", "@fedify/webfinger": "workspace:^", "@fontsource-variable/bricolage-grotesque": "^5.2.10", "@hackmd/markdown-it-task-lists": "^2.1.4", diff --git a/packages/fedify/README.md b/packages/fedify/README.md index 0d1e16f7d..007e4f4b0 100644 --- a/packages/fedify/README.md +++ b/packages/fedify/README.md @@ -121,6 +121,7 @@ Here is the list of packages: | [@fedify/nuxt](/packages/nuxt/) | [JSR][jsr:@fedify/nuxt] | [npm][npm:@fedify/nuxt] | Nuxt integration | | [@fedify/mysql](/packages/mysql/) | [JSR][jsr:@fedify/mysql] | [npm][npm:@fedify/mysql] | MySQL/MariaDB driver | | [@fedify/netlify](/packages/netlify/) | [JSR][jsr:@fedify/netlify] | [npm][npm:@fedify/netlify] | Netlify Async Workloads integration | +| [@fedify/pglite](/packages/pglite/) | [JSR][jsr:@fedify/pglite] | [npm][npm:@fedify/pglite] | PGlite driver | | [@fedify/postgres](/packages/postgres/) | [JSR][jsr:@fedify/postgres] | [npm][npm:@fedify/postgres] | PostgreSQL driver | | [@fedify/redis](/packages/redis/) | [JSR][jsr:@fedify/redis] | [npm][npm:@fedify/redis] | Redis driver | | [@fedify/relay](/packages/relay/) | [JSR][jsr:@fedify/relay] | [npm][npm:@fedify/relay] | ActivityPub relay support | @@ -174,6 +175,8 @@ Here is the list of packages: [npm:@fedify/mysql]: https://www.npmjs.com/package/@fedify/mysql [jsr:@fedify/netlify]: https://jsr.io/@fedify/netlify [npm:@fedify/netlify]: https://www.npmjs.com/package/@fedify/netlify +[jsr:@fedify/pglite]: https://jsr.io/@fedify/pglite +[npm:@fedify/pglite]: https://www.npmjs.com/package/@fedify/pglite [jsr:@fedify/postgres]: https://jsr.io/@fedify/postgres [npm:@fedify/postgres]: https://www.npmjs.com/package/@fedify/postgres [jsr:@fedify/redis]: https://jsr.io/@fedify/redis diff --git a/packages/pglite/README.md b/packages/pglite/README.md new file mode 100644 index 000000000..a2c241d66 --- /dev/null +++ b/packages/pglite/README.md @@ -0,0 +1,52 @@ + + +@fedify/pglite: PGlite driver for Fedify +======================================== + +[![JSR][JSR badge]][JSR] +[![npm][npm badge]][npm] + +This package provides [`PgliteKvStore`], a PGlite-backed implementation of +Fedify's [`KvStore`]: + +~~~~ typescript +import { PGlite } from "@electric-sql/pglite"; +import { createFederation } from "@fedify/fedify"; +import { PgliteKvStore } from "@fedify/pglite"; + +const pg = new PGlite("./data/fedify"); +const federation = createFederation({ + kv: new PgliteKvStore(pg), +}); +~~~~ + +The caller owns the `PGlite` instance. Close it during application shutdown, +after every pending store operation has completed. `PgliteKvStore` neither +creates nor closes the instance. + +Use one PGlite instance per data directory and runtime isolate. PGlite does +not make writes visible to other processes, so the same data directory cannot +back horizontally scaled workers. This package does not provide a message +queue because those constraints cannot preserve ordering or delivery during a +rolling restart. See [PGlite issue #489] and [PGlite pull request #892]. + +[JSR badge]: https://jsr.io/badges/@fedify/pglite +[JSR]: https://jsr.io/@fedify/pglite +[npm badge]: https://img.shields.io/npm/v/@fedify/pglite?logo=npm +[npm]: https://www.npmjs.com/package/@fedify/pglite +[`PgliteKvStore`]: https://jsr.io/@fedify/pglite/doc/~/PgliteKvStore +[`KvStore`]: https://jsr.io/@fedify/fedify/doc/federation/~/KvStore +[PGlite issue #489]: https://github.com/electric-sql/pglite/issues/489#issuecomment-2587892190 +[PGlite pull request #892]: https://github.com/electric-sql/pglite/pull/892 + + +Installation +------------ + +~~~~ sh +deno add jsr:@fedify/pglite npm:@electric-sql/pglite # Deno +npm add @fedify/pglite @electric-sql/pglite # npm +pnpm add @fedify/pglite @electric-sql/pglite # pnpm +yarn add @fedify/pglite @electric-sql/pglite # Yarn +bun add @fedify/pglite @electric-sql/pglite # Bun +~~~~ diff --git a/packages/pglite/deno.json b/packages/pglite/deno.json new file mode 100644 index 000000000..36794bc0c --- /dev/null +++ b/packages/pglite/deno.json @@ -0,0 +1,23 @@ +{ + "name": "@fedify/pglite", + "version": "2.4.0", + "license": "MIT", + "exports": { + ".": "./src/mod.ts", + "./kv": "./src/kv.ts" + }, + "exclude": [ + "dist", + "node_modules" + ], + "publish": { + "exclude": [ + "**/*.test.ts", + "tsdown.config.ts" + ] + }, + "tasks": { + "check": "deno fmt --check && deno lint && deno check src/*.ts", + "test": "deno test --allow-read --allow-write --allow-env" + } +} diff --git a/packages/pglite/package.json b/packages/pglite/package.json new file mode 100644 index 000000000..9800d32e3 --- /dev/null +++ b/packages/pglite/package.json @@ -0,0 +1,86 @@ +{ + "name": "@fedify/pglite", + "version": "2.4.0", + "description": "PGlite driver for Fedify", + "keywords": [ + "fedify", + "pglite", + "postgresql", + "embedded" + ], + "license": "MIT", + "author": { + "name": "ChanHaeng Lee", + "email": "2chanhaeng@gmail.com", + "url": "https://github.com/2chanhaeng" + }, + "homepage": "https://fedify.dev/", + "repository": { + "type": "git", + "url": "git+https://github.com/fedify-dev/fedify.git", + "directory": "packages/pglite" + }, + "bugs": { + "url": "https://github.com/fedify-dev/fedify/issues" + }, + "funding": "https://opencollective.com/fedify", + "type": "module", + "main": "./dist/mod.cjs", + "module": "./dist/mod.js", + "types": "./dist/mod.d.ts", + "exports": { + ".": { + "types": { + "import": "./dist/mod.d.ts", + "require": "./dist/mod.d.cts", + "default": "./dist/mod.d.ts" + }, + "import": "./dist/mod.js", + "require": "./dist/mod.cjs", + "default": "./dist/mod.js" + }, + "./kv": { + "types": { + "import": "./dist/kv.d.ts", + "require": "./dist/kv.d.cts", + "default": "./dist/kv.d.ts" + }, + "import": "./dist/kv.js", + "require": "./dist/kv.cjs", + "default": "./dist/kv.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "package.json", + "README.md" + ], + "dependencies": { + "@logtape/logtape": "catalog:", + "@types/emscripten": "catalog:", + "temporal-polyfill": "catalog:" + }, + "peerDependencies": { + "@electric-sql/pglite": "catalog:", + "@fedify/fedify": "workspace:^" + }, + "devDependencies": { + "@fedify/fixture": "workspace:^", + "@fedify/testing": "workspace:^", + "@js-temporal/polyfill": "catalog:", + "@std/async": "catalog:", + "tsdown": "catalog:", + "typescript": "catalog:" + }, + "scripts": { + "build:self": "tsdown", + "build": "pnpm --filter @fedify/pglite... run build:self", + "prepack": "pnpm build", + "prepublish": "pnpm build", + "pretest": "pnpm build", + "test": "node --experimental-transform-types --test", + "pretest:bun": "pnpm build", + "test:bun": "bun test --timeout=60000" + } +} diff --git a/packages/pglite/src/kv.test.ts b/packages/pglite/src/kv.test.ts new file mode 100644 index 000000000..da7900dca --- /dev/null +++ b/packages/pglite/src/kv.test.ts @@ -0,0 +1,171 @@ +import { PGlite } from "@electric-sql/pglite"; +import { PgliteKvStore } from "@fedify/pglite/kv"; +import { testKvStore } from "@fedify/testing"; +import * as temporal from "@js-temporal/polyfill"; +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import assert from "node:assert/strict"; +import { test } from "node:test"; + +const Temporal = globalThis.Temporal ?? temporal.Temporal; + +const randomName = (prefix: string): string => + `${prefix}_${crypto.randomUUID().replaceAll("-", "")}`; + +test("PgliteKvStore conforms to KvStore", async () => { + const pg = new PGlite(); + const store = new PgliteKvStore(pg, { tableName: randomName("fedify_kv") }); + try { + await testKvStore( + () => store, + () => undefined, + ); + } finally { + await store.drop(); + await pg.close(); + } +}); + +test("PgliteKvStore.initialize() is idempotent", async () => { + const pg = new PGlite(); + const tableName = randomName("fedify_kv"); + const store = new PgliteKvStore(pg, { tableName }); + try { + await Promise.all([store.initialize(), store.initialize()]); + await store.initialize(); + const result = await pg.query<{ table_name: string | null }>( + "SELECT to_regclass($1) AS table_name;", + [tableName], + ); + assert.strictEqual(result.rows[0].table_name, tableName); + } finally { + await store.drop(); + await pg.close(); + } +}); + +test("PgliteKvStore.drop() is idempotent", async () => { + const pg = new PGlite(); + const tableName = randomName("fedify_kv"); + const store = new PgliteKvStore(pg, { tableName }); + try { + await store.initialize(); + await store.drop(); + await store.drop(); + const result = await pg.query<{ table_name: string | null }>( + "SELECT to_regclass($1) AS table_name;", + [tableName], + ); + assert.strictEqual(result.rows[0].table_name, null); + } finally { + await store.drop(); + await pg.close(); + } +}); + +test("PgliteKvStore supports qualified mixed-case table names", async () => { + const pg = new PGlite(); + const suffix = crypto.randomUUID().replaceAll("-", ""); + const schemaName = `FedifySchema${suffix}`; + const relationName = `FedifyTable${suffix}`; + const store = new PgliteKvStore(pg, { + tableName: `${schemaName}.${relationName}`, + }); + try { + await pg.query(`CREATE SCHEMA "${schemaName}";`); + await store.initialize(); + assert.strictEqual(await store.cas(["key"], undefined, { value: 1 }), true); + assert.deepStrictEqual(await store.get(["key"]), { value: 1 }); + } finally { + await store.drop(); + await pg.query(`DROP SCHEMA IF EXISTS "${schemaName}";`); + await pg.close(); + } +}); + +test("PgliteKvStore stores values as jsonb", async () => { + const pg = new PGlite(); + const tableName = randomName("fedify_kv"); + const store = new PgliteKvStore(pg, { tableName }); + try { + const value = { nested: { answer: 42 } }; + await store.set(["json"], value); + const result = await pg.query<{ value: unknown; value_type: string }>( + ` + SELECT value, pg_typeof(value)::text AS value_type + FROM "${tableName}" + WHERE key = $1::text[]; + `, + [["json"]], + ); + assert.deepStrictEqual(result.rows[0].value, value); + assert.strictEqual(result.rows[0].value_type, "jsonb"); + } finally { + await store.drop(); + await pg.close(); + } +}); + +test("PgliteKvStore.set() refreshes the TTL origin", async () => { + const pg = new PGlite(); + const tableName = randomName("fedify_kv"); + const store = new PgliteKvStore(pg, { tableName }); + try { + await store.initialize(); + await pg.query( + ` + INSERT INTO "${tableName}" (key, value, created) + VALUES ( + $1::text[], + $2::text::jsonb, + CURRENT_TIMESTAMP - INTERVAL '2 days' + ); + `, + [["ttl", "origin"], JSON.stringify("stale")], + ); + + await store.set(["ttl", "origin"], "fresh", { + ttl: Temporal.Duration.from({ days: 1 }), + }); + + assert.strictEqual(await store.get(["ttl", "origin"]), "fresh"); + const result = await pg.query<{ recent: boolean }>( + ` + SELECT created > CURRENT_TIMESTAMP - INTERVAL '1 minute' AS recent + FROM "${tableName}" + WHERE key = $1::text[]; + `, + [["ttl", "origin"]], + ); + assert.strictEqual(result.rows[0].recent, true); + } finally { + await store.drop(); + await pg.close(); + } +}); + +test("PgliteKvStore persists data after its owner reopens PGlite", async () => { + const dataDir = await mkdtemp(join(tmpdir(), "fedify-pglite-")); + const tableName = randomName("fedify_kv"); + let pg: PGlite | undefined; + try { + pg = new PGlite(dataDir); + const firstStore = new PgliteKvStore(pg, { tableName }); + await firstStore.set(["persistent"], { value: true }); + await pg.close(); + + pg = new PGlite(dataDir); + const secondStore = new PgliteKvStore(pg, { + tableName, + initialized: true, + }); + assert.deepStrictEqual(await secondStore.get(["persistent"]), { + value: true, + }); + await secondStore.drop(); + } finally { + if (pg != null && !pg.closed) await pg.close(); + await rm(dataDir, { recursive: true, force: true }); + } +}); diff --git a/packages/pglite/src/kv.ts b/packages/pglite/src/kv.ts new file mode 100644 index 000000000..eac8997ab --- /dev/null +++ b/packages/pglite/src/kv.ts @@ -0,0 +1,294 @@ +/// + +import type { PGliteInterface } from "@electric-sql/pglite"; +import type { + KvKey, + KvStore, + KvStoreListEntry, + KvStoreSetOptions, +} from "@fedify/fedify"; +import { getLogger } from "@logtape/logtape"; + +const logger = getLogger(["fedify", "pglite", "kv"]); + +function quoteIdentifier(identifier: string): string { + return `"${identifier.replaceAll('"', '""').replaceAll(".", '"."')}"`; +} + +function serializeJson(value: unknown): string { + const serialized = JSON.stringify(value); + if (serialized == null) { + throw new TypeError("PGlite cannot store a value that is not valid JSON"); + } + return serialized; +} + +/** + * Options for the PGlite key–value store. + */ +export interface PgliteKvStoreOptions { + /** + * The table name to use for the key–value store. + * `"fedify_kv_v2"` by default. + * @default `"fedify_kv_v2"` + */ + readonly tableName?: string; + + /** + * Whether the table has already been initialized. `false` by default. + * @default `false` + */ + readonly initialized?: boolean; +} + +/** + * A key–value store backed by an embedded PGlite database. + * + * The caller owns the PGlite instance and is responsible for closing it after + * every operation using the store has completed. Use only one PGlite instance + * for a data directory within a runtime isolate. + * + * @example + * ```ts ignore + * import { PGlite } from "@electric-sql/pglite"; + * import { createFederation } from "@fedify/fedify"; + * import { PgliteKvStore } from "@fedify/pglite"; + * + * const pg = new PGlite("./data/fedify"); + * const federation = createFederation({ + * // ... + * kv: new PgliteKvStore(pg), + * }); + * + * // Close pg during application shutdown, after pending operations finish. + * await pg.close(); + * ``` + * @since 2.4.0 + */ +export class PgliteKvStore implements KvStore { + readonly #pg: PGliteInterface; + readonly #tableName: string; + #initialized: boolean; + #initializing?: Promise; + + /** + * Creates a new PGlite key–value store. + * @param pg The caller-owned PGlite instance to use. + * @param options The options for the key–value store. + */ + constructor( + pg: PGliteInterface, + options: PgliteKvStoreOptions = {}, + ) { + this.#pg = pg; + this.#tableName = options.tableName ?? "fedify_kv_v2"; + this.#initialized = options.initialized ?? false; + } + + async #expire(): Promise { + await this.#pg.query(` + DELETE FROM ${quoteIdentifier(this.#tableName)} + WHERE ttl IS NOT NULL AND created + ttl < CURRENT_TIMESTAMP; + `); + } + + async get(key: KvKey): Promise { + await this.initialize(); + const result = await this.#pg.query<{ value: T }>( + ` + SELECT value + FROM ${quoteIdentifier(this.#tableName)} + WHERE key = $1::text[] + AND (ttl IS NULL OR created + ttl > CURRENT_TIMESTAMP); + `, + [key], + ); + return result.rows[0]?.value; + } + + async set( + key: KvKey, + value: unknown, + options?: KvStoreSetOptions, + ): Promise { + await this.initialize(); + const ttl = options?.ttl == null + ? null + : Temporal.Duration.from(options.ttl).toString(); + await this.#pg.query( + ` + INSERT INTO ${quoteIdentifier(this.#tableName)} (key, value, ttl) + VALUES ($1::text[], $2::text::jsonb, $3::text::interval) + ON CONFLICT (key) + DO UPDATE SET + value = EXCLUDED.value, + created = CURRENT_TIMESTAMP, + ttl = EXCLUDED.ttl; + `, + [key, serializeJson(value), ttl], + ); + await this.#expire(); + } + + async delete(key: KvKey): Promise { + await this.initialize(); + await this.#pg.query( + ` + DELETE FROM ${quoteIdentifier(this.#tableName)} + WHERE key = $1::text[]; + `, + [key], + ); + await this.#expire(); + } + + /** {@inheritDoc KvStore.cas} */ + async cas( + key: KvKey, + expectedValue: unknown, + newValue: unknown, + options?: KvStoreSetOptions, + ): Promise { + await this.initialize(); + const ttl = options?.ttl == null + ? null + : Temporal.Duration.from(options.ttl).toString(); + + if (expectedValue === undefined && newValue === undefined) { + const matched = await this.get(key) === undefined; + await this.#expire(); + return matched; + } + + let rowCount: number; + if (expectedValue === undefined) { + const result = await this.#pg.query( + ` + INSERT INTO ${quoteIdentifier(this.#tableName)} AS existing + (key, value, created, ttl) + VALUES ( + $1::text[], + $2::text::jsonb, + CURRENT_TIMESTAMP, + $3::text::interval + ) + ON CONFLICT (key) + DO UPDATE SET + value = EXCLUDED.value, + created = EXCLUDED.created, + ttl = EXCLUDED.ttl + WHERE existing.ttl IS NOT NULL + AND existing.created + existing.ttl <= CURRENT_TIMESTAMP + RETURNING key; + `, + [key, serializeJson(newValue), ttl], + ); + rowCount = result.rows.length; + } else if (newValue === undefined) { + const result = await this.#pg.query( + ` + DELETE FROM ${quoteIdentifier(this.#tableName)} + WHERE key = $1::text[] + AND (ttl IS NULL OR created + ttl > CURRENT_TIMESTAMP) + AND value = $2::text::jsonb + RETURNING key; + `, + [key, serializeJson(expectedValue)], + ); + rowCount = result.rows.length; + } else { + const result = await this.#pg.query( + ` + UPDATE ${quoteIdentifier(this.#tableName)} + SET + value = $3::text::jsonb, + created = CURRENT_TIMESTAMP, + ttl = $4::text::interval + WHERE key = $1::text[] + AND (ttl IS NULL OR created + ttl > CURRENT_TIMESTAMP) + AND value = $2::text::jsonb + RETURNING key; + `, + [ + key, + serializeJson(expectedValue), + serializeJson(newValue), + ttl, + ], + ); + rowCount = result.rows.length; + } + + await this.#expire(); + return rowCount > 0; + } + + /** {@inheritDoc KvStore.list} */ + async *list(prefix?: KvKey): AsyncIterable { + await this.initialize(); + + const result = prefix == null || prefix.length === 0 + ? await this.#pg.query<{ key: KvKey; value: unknown }>(` + SELECT key, value + FROM ${quoteIdentifier(this.#tableName)} + WHERE ttl IS NULL OR created + ttl > CURRENT_TIMESTAMP + ORDER BY key; + `) + : await this.#pg.query<{ key: KvKey; value: unknown }>( + ` + SELECT key, value + FROM ${quoteIdentifier(this.#tableName)} + WHERE array_length(key, 1) >= $1 + AND key[1:$1] = $2::text[] + AND (ttl IS NULL OR created + ttl > CURRENT_TIMESTAMP) + ORDER BY key; + `, + [prefix.length, prefix], + ); + + for (const row of result.rows) yield row; + } + + /** + * Creates the table used by the store if it does not already exist. + */ + async initialize(): Promise { + await this.#pg.waitReady; + if (this.#initialized) return; + this.#initializing ??= (async () => { + logger.debug("Initializing the key–value store table {tableName}...", { + tableName: this.#tableName, + }); + await this.#pg.query(` + CREATE TABLE IF NOT EXISTS ${quoteIdentifier(this.#tableName)} ( + key text[] PRIMARY KEY, + value jsonb NOT NULL, + created timestamp with time zone DEFAULT CURRENT_TIMESTAMP, + ttl interval + ); + `); + this.#initialized = true; + logger.debug("Initialized the key–value store table {tableName}.", { + tableName: this.#tableName, + }); + })(); + try { + await this.#initializing; + } catch (error) { + this.#initializing = undefined; + throw error; + } + } + + /** + * Drops the table used by the store. Does nothing if it does not exist. + */ + async drop(): Promise { + await this.#pg.waitReady; + await this.#pg.query( + `DROP TABLE IF EXISTS ${quoteIdentifier(this.#tableName)};`, + ); + this.#initialized = false; + this.#initializing = undefined; + } +} diff --git a/packages/pglite/src/mod.ts b/packages/pglite/src/mod.ts new file mode 100644 index 000000000..865ef9654 --- /dev/null +++ b/packages/pglite/src/mod.ts @@ -0,0 +1,7 @@ +/** + * PGlite-backed storage for Fedify applications. + * + * @module + */ + +export * from "./kv.ts"; diff --git a/packages/pglite/tsdown.config.ts b/packages/pglite/tsdown.config.ts new file mode 100644 index 000000000..172d29766 --- /dev/null +++ b/packages/pglite/tsdown.config.ts @@ -0,0 +1,55 @@ +import { readFile, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import { defineConfig } from "tsdown"; +import { + temporalPolyfillCjsBanner, + temporalPolyfillCjsDeps, + temporalPolyfillEsmBanner, + temporalPolyfillImportPlugin, +} from "../../scripts/tsdown/temporal.mts"; + +const emscriptenReference = '/// \n'; + +async function addEmscriptenReference( + outDir: string, + fileName: string, +): Promise { + const path = join(outDir, fileName); + const declaration = await readFile(path, "utf8"); + if (declaration.includes(emscriptenReference.trim())) return; + await writeFile(path, emscriptenReference + declaration); +} + +export default defineConfig({ + entry: ["src/mod.ts", "src/kv.ts"], + dts: { compilerOptions: { isolatedDeclarations: true, declaration: true } }, + unbundle: true, + format: { + esm: { + banner: temporalPolyfillEsmBanner(), + }, + cjs: { + deps: temporalPolyfillCjsDeps(), + plugins: [temporalPolyfillImportPlugin], + banner: temporalPolyfillCjsBanner(), + }, + }, + platform: "node", + hooks: { + "build:done": async (ctx) => { + await Promise.all( + ctx.chunks + .filter((chunk) => /\.d\.(?:c|m)?ts$/.test(chunk.fileName)) + .map((chunk) => + addEmscriptenReference(ctx.options.outDir, chunk.fileName) + ), + ); + }, + }, + outExtensions({ format }) { + return { + js: format === "cjs" ? ".cjs" : ".js", + dts: format === "cjs" ? ".d.cts" : ".d.ts", + }; + }, +}); diff --git a/packages/testing/README.md b/packages/testing/README.md index b43f31705..a352a5479 100644 --- a/packages/testing/README.md +++ b/packages/testing/README.md @@ -95,6 +95,33 @@ The package also exports helper functions for creating various context types: - `createRequestContext()`: Creates a request context - `createInboxContext()`: Creates an inbox context +### Store conformance tests + +The package provides reusable conformance suites for Fedify storage adapters. +Use `testKvStore()` to check a `KvStore` implementation and +`testMessageQueue()` to check a `MessageQueue` implementation: + +~~~~ typescript +import { test } from "@fedify/fixture"; +import { testKvStore, testMessageQueue } from "@fedify/testing"; + +test("MyKvStore", () => + testKvStore( + () => new MyKvStore(), + async ({ store }) => await store.close(), + )); + +test("MyMessageQueue", () => + testMessageQueue( + () => new MyMessageQueue(), + async ({ mq1, mq2, controller }) => { + controller.abort(); + await mq1.close(); + await mq2.close(); + }, + )); +~~~~ + Features -------- diff --git a/packages/testing/src/kv-tester.test.ts b/packages/testing/src/kv-tester.test.ts new file mode 100644 index 000000000..a0a7351cd --- /dev/null +++ b/packages/testing/src/kv-tester.test.ts @@ -0,0 +1,10 @@ +import { MemoryKvStore } from "@fedify/fedify"; +import { test } from "@fedify/fixture"; +import "temporal-polyfill/global"; +import testKvStore from "./kv-tester.ts"; + +test("testKvStore() validates MemoryKvStore", () => + testKvStore( + () => new MemoryKvStore(), + () => undefined, + )); diff --git a/packages/testing/src/kv-tester.ts b/packages/testing/src/kv-tester.ts new file mode 100644 index 000000000..cc458aa94 --- /dev/null +++ b/packages/testing/src/kv-tester.ts @@ -0,0 +1,211 @@ +import type { KvKey, KvStore, KvStoreListEntry } from "@fedify/fedify"; +import { delay } from "es-toolkit"; +import { deepStrictEqual, strictEqual } from "node:assert/strict"; + +/** + * Options for {@link testKvStore}. + */ +export interface TestKvStoreOptions { + /** + * Whether to test compare-and-swap support. By default, these tests run + * when the store implements {@link KvStore.cas}. + */ + readonly testCas?: boolean; + + /** + * Whether to test time-to-live support. `true` by default. + * @default true + */ + readonly testTtl?: boolean; +} + +/** + * Tests a {@link KvStore} implementation with a standard set of tests. + * + * The suite covers reads and writes, deletion, structured keys and values, + * prefix listing, TTL expiration, and optional compare-and-swap behavior. + * Every key is isolated below a random prefix and is deleted after the suite. + * + * @example + * ```typescript ignore + * import { test } from "@fedify/fixture"; + * import { testKvStore } from "@fedify/testing"; + * import { MyKvStore } from "./my-kv.ts"; + * + * test("MyKvStore", () => + * testKvStore( + * () => new MyKvStore(), + * async ({ store }) => await store.close(), + * ) + * ); + * ``` + * + * @param getKvStore A factory that creates the store to test. + * @param onFinally A cleanup function called after the suite completes. + * @param options Optional configuration for the suite. + */ +export default async function testKvStore( + getKvStore: () => KV | Promise, + onFinally: ({ store }: { store: KV }) => Promise | void, + options: TestKvStoreOptions = {}, +): Promise { + const store = await getKvStore(); + const prefix = [`fedify_test_${crypto.randomUUID()}`] as KvKey; + const key = (...segments: string[]): KvKey => + [...prefix, ...segments] as KvKey; + + try { + strictEqual(await store.get(key("missing")), undefined); + + const values = [ + "text", + 42, + true, + null, + [1, "two", false], + { nested: { value: "test" } }, + ] as const; + for (const [index, value] of values.entries()) { + const valueKey = key("values", index.toString()); + await store.set(valueKey, value); + deepStrictEqual(await store.get(valueKey), value); + } + + const overwriteKey = key("overwrite"); + await store.set(overwriteKey, "before"); + await store.set(overwriteKey, "after"); + strictEqual(await store.get(overwriteKey), "after"); + + const deleteKey = key("delete"); + await store.set(deleteKey, "value"); + await store.delete(deleteKey); + strictEqual(await store.get(deleteKey), undefined); + await store.delete(deleteKey); + + const isolatedKeys = [ + key("a", "b"), + key("a,b"), + key("a:b"), + ] as const; + for (const [index, isolatedKey] of isolatedKeys.entries()) { + await store.set(isolatedKey, index); + } + for (const [index, isolatedKey] of isolatedKeys.entries()) { + strictEqual(await store.get(isolatedKey), index); + } + + if (options.testTtl ?? true) { + const expiringKey = key("ttl", "expiring"); + await store.set(expiringKey, "expired", { + ttl: Temporal.Duration.from({ milliseconds: 50 }), + }); + await delay(100); + strictEqual(await store.get(expiringKey), undefined); + deepStrictEqual(await collect(store.list(key("ttl"))), []); + + const refreshedKey = key("ttl", "refreshed"); + await store.set(refreshedKey, "temporary", { + ttl: Temporal.Duration.from({ milliseconds: 50 }), + }); + await store.set(refreshedKey, "persistent"); + await delay(100); + strictEqual(await store.get(refreshedKey), "persistent"); + } + + const listPrefix = key("list"); + const listEntries = [ + { key: listPrefix, value: "exact" }, + { key: key("list", "child"), value: "child" }, + { key: key("list", "child", "nested"), value: "nested" }, + { key: key("list-other"), value: "other" }, + ] as const; + for (const entry of listEntries) await store.set(entry.key, entry.value); + + deepStrictEqual( + normalize(await collect(store.list(listPrefix))), + normalize(listEntries.slice(0, 3)), + ); + const prefixedEntries = await collect(store.list(prefix)); + const allEntries = await collect(store.list()); + deepStrictEqual( + normalize(filterByPrefix(allEntries, prefix)), + normalize(prefixedEntries), + ); + const emptyPrefixEntries = await collect( + store.list([] as unknown as KvKey), + ); + deepStrictEqual( + normalize(filterByPrefix(emptyPrefixEntries, prefix)), + normalize(prefixedEntries), + ); + + if (options.testCas ?? store.cas != null) { + if (store.cas == null) { + throw new TypeError("KvStore.cas is not implemented"); + } + const cas = store.cas.bind(store); + const casKey = key("cas", "value"); + strictEqual(await cas(casKey, "wrong", "value"), false); + strictEqual(await cas(casKey, undefined, "created"), true); + strictEqual(await cas(casKey, "wrong", "updated"), false); + strictEqual(await cas(casKey, "created", "updated"), true); + strictEqual(await store.get(casKey), "updated"); + strictEqual(await cas(casKey, "updated", undefined), true); + strictEqual(await store.get(casKey), undefined); + + if (options.testTtl ?? true) { + const expiredCasKey = key("cas", "expired"); + await store.set(expiredCasKey, "old", { + ttl: Temporal.Duration.from({ milliseconds: 50 }), + }); + await delay(100); + strictEqual(await cas(expiredCasKey, undefined, "replaced"), true); + + const ttlCasKey = key("cas", "ttl"); + strictEqual( + await cas(ttlCasKey, undefined, "temporary", { + ttl: Temporal.Duration.from({ milliseconds: 50 }), + }), + true, + ); + await delay(100); + strictEqual(await store.get(ttlCasKey), undefined); + } + + const concurrentKey = key("cas", "concurrent"); + const results = await Promise.all( + Array.from( + { length: 8 }, + (_, index) => cas(concurrentKey, undefined, index), + ), + ); + strictEqual(results.filter(Boolean).length, 1); + } + } finally { + for await (const entry of store.list(prefix)) await store.delete(entry.key); + await onFinally({ store }); + } +} + +async function collect( + entries: AsyncIterable, +): Promise { + const results: KvStoreListEntry[] = []; + for await (const entry of entries) results.push(entry); + return results; +} + +function normalize( + entries: readonly KvStoreListEntry[], +): string[] { + return entries.map((entry) => JSON.stringify(entry)).sort(); +} + +function filterByPrefix( + entries: readonly KvStoreListEntry[], + prefix: KvKey, +): KvStoreListEntry[] { + return entries.filter((entry) => + prefix.every((segment, index) => entry.key[index] === segment) + ); +} diff --git a/packages/testing/src/mod.ts b/packages/testing/src/mod.ts index 7f16a16f5..a8cf6ff26 100644 --- a/packages/testing/src/mod.ts +++ b/packages/testing/src/mod.ts @@ -31,6 +31,10 @@ export { createOutboxContext, createRequestContext, } from "./mock.ts"; +export { + default as testKvStore, + type TestKvStoreOptions, +} from "./kv-tester.ts"; export { default as testMessageQueue, getRandomKey, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d210a948c..be4f9f20c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,9 @@ catalogs: '@cloudflare/workers-types': specifier: ^4.20260511.1 version: 4.20260511.1 + '@electric-sql/pglite': + specifier: ^0.5.8 + version: 0.5.8 '@fxts/core': specifier: ^1.21.1 version: 1.26.0 @@ -102,6 +105,9 @@ catalogs: '@types/bun': specifier: ^1.2.23 version: 1.3.3 + '@types/emscripten': + specifier: ^1.41.1 + version: 1.41.5 '@types/express': specifier: ^4.0.0 version: 4.17.23 @@ -214,6 +220,9 @@ importers: '@deno/kv': specifier: ^0.8.4 version: 0.8.4 + '@electric-sql/pglite': + specifier: 'catalog:' + version: 0.5.8 '@fedify/amqp': specifier: workspace:^ version: link:../packages/amqp @@ -265,6 +274,9 @@ importers: '@fedify/next': specifier: workspace:^ version: link:../packages/next + '@fedify/pglite': + specifier: workspace:^ + version: link:../packages/pglite '@fedify/postgres': specifier: workspace:^ version: link:../packages/postgres @@ -378,7 +390,7 @@ importers: version: 4.4.1 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) + version: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) express: specifier: 'catalog:' version: 5.2.1 @@ -453,10 +465,10 @@ importers: dependencies: '@astrojs/node': specifier: ^11.0.2 - version: 11.0.2(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 11.0.2(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@deno/astro-adapter': specifier: ^0.6.0 - version: 0.6.0(@opentelemetry/api@1.9.1)(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.6.0(@opentelemetry/api@1.9.1)(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@fedify/astro': specifier: workspace:^ version: link:../../packages/astro @@ -468,7 +480,7 @@ importers: version: link:../../packages/vocab astro: specifier: 'catalog:' - version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) examples/cloudflare-workers: dependencies: @@ -615,7 +627,7 @@ importers: version: 0.9.9(prettier@3.9.5)(typescript@6.0.3) '@astrojs/netlify': specifier: 'catalog:' - version: 6.6.5(bc12e49c2cab07db7fa1c8abbb805615) + version: 6.6.5(1f32f412c3d47588b649573931abb61b) '@fedify/astro': specifier: workspace:^ version: link:../../packages/astro @@ -636,10 +648,10 @@ importers: version: 0.0.106(@google-cloud/storage@5.20.5)(@trpc/server@11.18.0(typescript@6.0.3))(@types/react@19.1.8)(autoprefixer@10.5.0(postcss@8.5.19))(graphql@16.14.2)(postcss@8.5.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.2)(tailwindcss@4.1.12) '@netlify/database': specifier: 'catalog:' - version: 1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(postgres@3.4.7) + version: 1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(postgres@3.4.7) astro: specifier: 'catalog:' - version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) postgres: specifier: 'catalog:' version: 3.4.7 @@ -813,7 +825,7 @@ importers: version: 1.15.11 nuxt: specifier: 'catalog:' - version: 4.4.2(7db89b35953831c98bf5f8751fd1480e) + version: 4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44) devDependencies: '@types/node': specifier: 'catalog:' @@ -838,13 +850,13 @@ importers: version: 0.15.4(solid-js@1.9.12) '@solidjs/start': specifier: ^1.3.2 - version: 1.3.2(87c83422ed6ca85d89bfad7ccc2bb2bd) + version: 1.3.2(417873816f80f3ab939dc6813c244530) solid-js: specifier: ^1.9.11 version: 1.9.12 vinxi: specifier: ^0.5.11 - version: 0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + version: 0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) devDependencies: typescript: specifier: ^5.5.4 @@ -965,7 +977,7 @@ importers: devDependencies: astro: specifier: 'catalog:' - version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + version: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) tsdown: specifier: 'catalog:' version: 0.22.0(tsx@4.21.0)(typescript@6.0.3)(unrun@0.2.34(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)) @@ -1650,7 +1662,7 @@ importers: version: 0.5.1 '@netlify/database': specifier: 'catalog:' - version: 1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(postgres@3.4.7) + version: 1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(postgres@3.4.7) '@standard-schema/spec': specifier: 'catalog:' version: 1.1.0 @@ -1659,7 +1671,7 @@ importers: version: 22.19.1 netlify-cli: specifier: 'catalog:' - version: 26.2.0(@types/node@22.19.1)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(picomatch@4.0.5)(rollup@4.60.2) + version: 26.2.0(@types/node@22.19.1)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(picomatch@4.0.5)(rollup@4.60.2) postgres: specifier: 'catalog:' version: 3.4.7 @@ -1705,7 +1717,7 @@ importers: version: 1.15.11 nuxt: specifier: 'catalog:' - version: 4.4.2(7db89b35953831c98bf5f8751fd1480e) + version: 4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44) devDependencies: '@fedify/fixture': specifier: workspace:^ @@ -1720,6 +1732,43 @@ importers: specifier: 'catalog:' version: 6.0.3 + packages/pglite: + dependencies: + '@electric-sql/pglite': + specifier: 'catalog:' + version: 0.5.8 + '@fedify/fedify': + specifier: workspace:^ + version: link:../fedify + '@logtape/logtape': + specifier: 'catalog:' + version: 2.2.0 + '@types/emscripten': + specifier: 'catalog:' + version: 1.41.5 + temporal-polyfill: + specifier: 'catalog:' + version: 1.0.1 + devDependencies: + '@fedify/fixture': + specifier: workspace:^ + version: link:../fixture + '@fedify/testing': + specifier: workspace:^ + version: link:../testing + '@js-temporal/polyfill': + specifier: 'catalog:' + version: 0.5.1 + '@std/async': + specifier: 'catalog:' + version: '@jsr/std__async@1.5.0' + tsdown: + specifier: 'catalog:' + version: 0.22.0(tsx@4.21.0)(typescript@6.0.3)(unrun@0.2.34(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)) + typescript: + specifier: 'catalog:' + version: 6.0.3 + packages/postgres: dependencies: '@fedify/fedify': @@ -1826,7 +1875,7 @@ importers: version: link:../fedify '@solidjs/start': specifier: ^1.3.0 - version: 1.3.2(87c83422ed6ca85d89bfad7ccc2bb2bd) + version: 1.3.2(417873816f80f3ab939dc6813c244530) devDependencies: tsdown: specifier: 'catalog:' @@ -2324,11 +2373,6 @@ packages: resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} @@ -2373,10 +2417,6 @@ packages: resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} @@ -2706,6 +2746,9 @@ packages: '@electric-sql/pglite@0.3.16': resolution: {integrity: sha512-mZkZfOd9OqTMHsK+1cje8OSzfAQcpD7JmILXTl5ahdempjUDdmg4euf1biDex5/LfQIDJ3gvCu6qDgdnDxfJmA==} + '@electric-sql/pglite@0.5.8': + resolution: {integrity: sha512-n9tsbUOhwx2epK1V0ZG9Ar4SHWUju04dhmzZXiSBXwBoleOvIfals33NAaWgagQVAL4Rbvx/Ptsu3P+pA09f6Q==} + '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -2730,9 +2773,6 @@ packages: '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} @@ -4816,6 +4856,12 @@ packages: '@jsr/std__async@1.0.13': resolution: {integrity: sha512-GEApyNtzauJ0kEZ/GxebSkdEN0t29qJtkw+WEvzYTwkL6fHX8cq3YWzRjCqHu+4jMl+rpHiwyr/lfitNInntzA==, tarball: https://npm.jsr.io/~/11/@jsr/std__async/1.0.13.tgz} + '@jsr/std__async@1.5.0': + resolution: {integrity: sha512-I2Qekl1oQYM+dpI2RQUCKi1TBuaA7Od3LNzxcqls9s1e2ytiZyREL4403qHJ6UbLNAwbqO2ZhdWAWDUQAajyiA==, tarball: https://npm.jsr.io/~/11/@jsr/std__async/1.5.0.tgz} + + '@jsr/std__data-structures@1.1.2': + resolution: {integrity: sha512-YaNAaUYGr3qBnq8LJ0/FSW6tsnDBMX7hcPuGU7Zi/+aWlAJsZ4OroBNSpRIflizbOvCJCycAnXe9yLjIwDF2KA==, tarball: https://npm.jsr.io/~/11/@jsr/std__data-structures/1.1.2.tgz} + '@jsr/std__internal@1.0.14': resolution: {integrity: sha512-JT8b/t40WcR9q0GDwRZUooY7aXeXnFal8iidE/5TckdAFtvpVAsaJ71/Xgf1SfoChs41s6CZkuCYM8toaNgdvA==, tarball: https://npm.jsr.io/~/11/@jsr/std__internal/1.0.14.tgz} @@ -7068,9 +7114,6 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0': - resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} - '@rolldown/pluginutils@1.0.0-rc.12': resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} @@ -8083,6 +8126,9 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/emscripten@1.41.5': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -14718,10 +14764,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} @@ -16566,10 +16608,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -18302,15 +18340,15 @@ snapshots: github-slugger: 2.0.0 satteri: 0.9.5 - '@astrojs/netlify@6.6.5(bc12e49c2cab07db7fa1c8abbb805615)': + '@astrojs/netlify@6.6.5(1f32f412c3d47588b649573931abb61b)': dependencies: '@astrojs/internal-helpers': 0.7.6 '@astrojs/underscore-redirects': 1.0.0 '@netlify/blobs': 10.7.9(supports-color@10.2.2) '@netlify/functions': 5.3.0 - '@netlify/vite-plugin': 2.12.8(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)(vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@netlify/vite-plugin': 2.12.8(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)(vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vercel/nft': 0.30.4(rollup@4.60.2) - astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) esbuild: 0.25.5 tinyglobby: 0.2.17 vite: 6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) @@ -18352,10 +18390,10 @@ snapshots: - uploadthing - yaml - '@astrojs/node@11.0.2(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@astrojs/node@11.0.2(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@astrojs/internal-helpers': 0.10.1 - astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) send: 1.2.1 server-destroy: 1.0.1 transitivePeerDependencies: @@ -18399,10 +18437,10 @@ snapshots: '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@10.2.2) @@ -18520,10 +18558,6 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.7 - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.7 - '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 @@ -18578,11 +18612,6 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 @@ -18795,9 +18824,9 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@deno/astro-adapter@0.6.0(@opentelemetry/api@1.9.1)(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@deno/astro-adapter@0.6.0(@opentelemetry/api@1.9.1)(astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + astro: 7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -18864,6 +18893,8 @@ snapshots: '@electric-sql/pglite@0.3.16': {} + '@electric-sql/pglite@0.5.8': {} + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -18893,11 +18924,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 @@ -20088,17 +20114,17 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-wasm32@0.34.3': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-win32-arm64@0.34.3': @@ -20604,6 +20630,14 @@ snapshots: '@jsr/std__async@1.0.13': {} + '@jsr/std__async@1.5.0': + dependencies: + '@jsr/std__data-structures': 1.1.2 + + '@jsr/std__data-structures@1.1.2': + dependencies: + '@jsr/std__assert': 1.0.19 + '@jsr/std__internal@1.0.14': {} '@jsr/std__internal@1.0.8': {} @@ -21400,12 +21434,12 @@ snapshots: '@electric-sql/pglite': 0.3.16 pg-gateway: 0.3.0-beta.4 - '@netlify/database@1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(postgres@3.4.7)': + '@netlify/database@1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(postgres@3.4.7)': dependencies: '@neondatabase/serverless': 1.1.0 '@netlify/runtime-utils': 2.3.0 pg: 8.22.0 - waddler: 0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) + waddler: 0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) ws: 8.21.0 transitivePeerDependencies: - '@clickhouse/client' @@ -21430,12 +21464,12 @@ snapshots: - postgres - utf-8-validate - '@netlify/database@1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(postgres@3.4.7)': + '@netlify/database@1.1.0(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(postgres@3.4.7)': dependencies: '@neondatabase/serverless': 1.1.0 '@netlify/runtime-utils': 2.3.0 pg: 8.22.0 - waddler: 0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7) + waddler: 0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7) ws: 8.21.0 transitivePeerDependencies: - '@clickhouse/client' @@ -21525,7 +21559,7 @@ snapshots: semver: 7.8.0 tmp-promise: 3.0.3 - '@netlify/dev@4.18.7(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)': + '@netlify/dev@4.18.7(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)': dependencies: '@netlify/ai': 0.4.2 '@netlify/blobs': 10.7.9(supports-color@10.2.2) @@ -21535,7 +21569,7 @@ snapshots: '@netlify/edge-functions-dev': 1.0.20 '@netlify/functions-dev': 1.3.0(rollup@4.60.2) '@netlify/headers': 2.1.11 - '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) '@netlify/redirects': 3.1.13 '@netlify/runtime': 4.1.25 '@netlify/static': 3.1.10 @@ -21566,7 +21600,7 @@ snapshots: - supports-color - uploadthing - '@netlify/dev@4.18.9(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(rollup@4.60.2)': + '@netlify/dev@4.18.9(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(rollup@4.60.2)': dependencies: '@netlify/ai': 0.4.2 '@netlify/blobs': 10.7.9(supports-color@10.2.2) @@ -21576,7 +21610,7 @@ snapshots: '@netlify/edge-functions-dev': 1.0.22 '@netlify/functions-dev': 1.3.1(rollup@4.60.2) '@netlify/headers': 2.1.11 - '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) '@netlify/redirects': 3.1.13 '@netlify/runtime': 4.1.25 '@netlify/static': 3.1.10 @@ -21792,9 +21826,9 @@ snapshots: dependencies: '@netlify/headers-parser': 9.0.3 - '@netlify/images@1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)': + '@netlify/images@1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + ipx: 3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -21816,9 +21850,9 @@ snapshots: - ioredis - uploadthing - '@netlify/images@1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)': + '@netlify/images@1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + ipx: 3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -22478,9 +22512,9 @@ snapshots: - react-dom - ts-node - '@netlify/vite-plugin@2.12.8(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)(vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@netlify/vite-plugin@2.12.8(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2)(vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@netlify/dev': 4.18.7(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2) + '@netlify/dev': 4.18.7(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(rollup@4.60.2) '@netlify/dev-utils': 4.4.6 dedent: 1.7.2(babel-plugin-macros@3.1.0) vite: 6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) @@ -22557,7 +22591,7 @@ snapshots: '@netlify/zip-it-and-ship-it@14.7.1(rollup@4.60.2)(supports-color@10.2.2)': dependencies: '@babel/parser': 7.29.7 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.16.0 '@vercel/nft': 0.29.4(rollup@4.60.2)(supports-color@10.2.2) @@ -22830,7 +22864,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(magicast@0.5.2)(mysql2@3.22.3(@types/node@22.19.1))(nuxt@4.4.2(7db89b35953831c98bf5f8751fd1480e))(rolldown@1.1.5)(typescript@6.0.3)': + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(magicast@0.5.2)(mysql2@3.22.3(@types/node@22.19.1))(nuxt@4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44))(rolldown@1.1.5)(typescript@6.0.3)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 @@ -22848,8 +22882,8 @@ snapshots: impound: 1.1.5 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.3(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1))(rolldown@1.1.5) - nuxt: 4.4.2(7db89b35953831c98bf5f8751fd1480e) + nitropack: 2.13.3(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1))(rolldown@1.1.5) + nuxt: 4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -22858,7 +22892,7 @@ snapshots: std-env: 4.1.0 ufo: 1.6.3 unctx: 2.5.0 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) vue: 3.5.40(typescript@6.0.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 @@ -22916,7 +22950,7 @@ snapshots: rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.1)(lightningcss@1.32.0)(magicast@0.5.2)(nuxt@4.4.2(7db89b35953831c98bf5f8751fd1480e))(optionator@0.9.4)(oxlint@1.66.0)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.1)(lightningcss@1.32.0)(magicast@0.5.2)(nuxt@4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44))(optionator@0.9.4)(oxlint@1.66.0)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) @@ -22934,7 +22968,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.2(7db89b35953831c98bf5f8751fd1480e) + nuxt: 4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44) nypm: 0.6.5 pathe: 2.0.3 pkg-types: 2.3.0 @@ -24270,8 +24304,6 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true - '@rolldown/pluginutils@1.0.0': {} - '@rolldown/pluginutils@1.0.0-rc.12': optional: true @@ -24756,11 +24788,11 @@ snapshots: dependencies: solid-js: 1.9.12 - '@solidjs/start@1.3.2(87c83422ed6ca85d89bfad7ccc2bb2bd)': + '@solidjs/start@1.3.2(417873816f80f3ab939dc6813c244530)': dependencies: '@tanstack/server-functions-plugin': 1.121.21(vite@8.1.4(@types/node@24.3.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) cookie-es: 2.0.1 defu: 6.1.7 error-stack-parser: 2.1.4 @@ -24772,7 +24804,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.1.0(solid-js@1.9.12) tinyglobby: 0.2.15 - vinxi: 0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vinxi: 0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-solid: 2.11.12(solid-js@1.9.12)(vite@8.1.4(@types/node@24.3.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -24801,7 +24833,7 @@ snapshots: - react-native-b4a - supports-color - '@stackbit/cms-contentful@0.4.56(debug@4.4.1)': + '@stackbit/cms-contentful@0.4.56(debug@4.4.1)(graphql@16.14.2)': dependencies: '@contentful/rich-text-types': 15.15.1 '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) @@ -24815,6 +24847,7 @@ snapshots: - bare-buffer - debug - encoding + - graphql - react-native-b4a - supports-color @@ -24890,47 +24923,57 @@ snapshots: - supports-color - utf-8-validate - '@stackbit/cms-git@0.4.18': + '@stackbit/cms-git@0.4.18(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2)': dependencies: '@stackbit/artisanal-names': 1.0.1 - '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(graphql@16.14.2) + '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) '@stackbit/sdk': 2.0.1 '@stackbit/types': 1.0.1 '@stackbit/utils': 0.4.19 - axios: 0.24.0 + axios: 0.24.0(debug@4.4.1) fs-extra: 11.3.6 git-url-parse: 13.1.1 lodash: 4.18.1 micromatch: 4.0.8 slugify: 1.6.9 transitivePeerDependencies: + - '@types/react' - bare-abort-controller - bare-buffer + - bufferutil + - canvas - debug - encoding + - graphql - react-native-b4a - supports-color + - utf-8-validate - '@stackbit/cms-git@0.4.18(debug@4.4.1)': + '@stackbit/cms-git@0.4.18(@types/react@19.1.8)(graphql@16.14.2)': dependencies: '@stackbit/artisanal-names': 1.0.1 - '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) + '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(graphql@16.14.2) '@stackbit/sdk': 2.0.1 '@stackbit/types': 1.0.1 '@stackbit/utils': 0.4.19 - axios: 0.24.0(debug@4.4.1) + axios: 0.24.0 fs-extra: 11.3.6 git-url-parse: 13.1.1 lodash: 4.18.1 micromatch: 4.0.8 slugify: 1.6.9 transitivePeerDependencies: + - '@types/react' - bare-abort-controller - bare-buffer + - bufferutil + - canvas - debug - encoding + - graphql - react-native-b4a - supports-color + - utf-8-validate '@stackbit/cms-sanity@0.2.56(@types/react@19.1.8)': dependencies: @@ -24959,7 +25002,7 @@ snapshots: - supports-color - utf-8-validate - '@stackbit/cms-sanity@0.2.56(@types/react@19.1.8)(debug@4.4.1)': + '@stackbit/cms-sanity@0.2.56(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2)': dependencies: '@sanity/block-tools': 2.36.6 '@sanity/client': 3.4.1 @@ -24982,6 +25025,7 @@ snapshots: - canvas - debug - encoding + - graphql - react-native-b4a - supports-color - utf-8-validate @@ -24992,7 +25036,7 @@ snapshots: '@stackbit/artisanal-names': 1.0.1 '@stackbit/cms-contentful': 0.4.56 '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(graphql@16.14.2) - '@stackbit/cms-git': 0.4.18 + '@stackbit/cms-git': 0.4.18(@types/react@19.1.8)(graphql@16.14.2) '@stackbit/cms-sanity': 0.2.56(@types/react@19.1.8) '@stackbit/sdk': 2.0.1 '@stackbit/types': 1.0.1 @@ -25026,14 +25070,14 @@ snapshots: - supports-color - utf-8-validate - '@stackbit/dev-common@0.5.51(@types/react@19.1.8)(debug@4.4.1)': + '@stackbit/dev-common@0.5.51(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2)': dependencies: '@iarna/toml': 2.2.5 '@stackbit/artisanal-names': 1.0.1 - '@stackbit/cms-contentful': 0.4.56(debug@4.4.1) + '@stackbit/cms-contentful': 0.4.56(debug@4.4.1)(graphql@16.14.2) '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) - '@stackbit/cms-git': 0.4.18(debug@4.4.1) - '@stackbit/cms-sanity': 0.2.56(@types/react@19.1.8)(debug@4.4.1) + '@stackbit/cms-git': 0.4.18(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) + '@stackbit/cms-sanity': 0.2.56(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) '@stackbit/sdk': 2.0.1 '@stackbit/types': 1.0.1 '@stackbit/utils': 0.4.19 @@ -25062,6 +25106,7 @@ snapshots: - canvas - debug - encoding + - graphql - react-native-b4a - supports-color - utf-8-validate @@ -25069,8 +25114,8 @@ snapshots: '@stackbit/dev@1.0.35(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2)': dependencies: '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) - '@stackbit/cms-git': 0.4.18(debug@4.4.1) - '@stackbit/dev-common': 0.5.51(@types/react@19.1.8)(debug@4.4.1) + '@stackbit/cms-git': 0.4.18(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) + '@stackbit/dev-common': 0.5.51(@types/react@19.1.8)(debug@4.4.1)(graphql@16.14.2) '@stackbit/sdk': 2.0.1 axios: 0.25.0(debug@4.4.1) chalk: 4.1.2 @@ -25104,7 +25149,7 @@ snapshots: '@stackbit/dev@1.0.35(@types/react@19.1.8)(graphql@16.14.2)': dependencies: '@stackbit/cms-core': 2.0.1(@types/react@19.1.8)(graphql@16.14.2) - '@stackbit/cms-git': 0.4.18 + '@stackbit/cms-git': 0.4.18(@types/react@19.1.8)(graphql@16.14.2) '@stackbit/dev-common': 0.5.51(@types/react@19.1.8) '@stackbit/sdk': 2.0.1 axios: 0.25.0 @@ -25457,7 +25502,7 @@ snapshots: babel-dead-code-elimination: 1.0.12 diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 transitivePeerDependencies: - supports-color @@ -25469,7 +25514,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/directive-functions-plugin': 1.121.21(vite@8.1.4(@types/node@24.3.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 @@ -25742,6 +25787,8 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/emscripten@1.41.5': {} + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.9 @@ -26359,7 +26406,7 @@ snapshots: debug: 4.4.3(supports-color@10.2.2) minimatch: 9.0.5 semver: 7.8.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.1.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -26374,7 +26421,7 @@ snapshots: debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.8.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -26389,7 +26436,7 @@ snapshots: debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.8.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -26626,9 +26673,9 @@ snapshots: untun: 0.1.3 uqr: 0.1.3 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) acorn-loose: 8.5.2 @@ -26637,25 +26684,25 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vinxi: 0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) - '@vinxi/server-components@0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vinxi/server-components@0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) acorn: 8.16.0 acorn-loose: 8.5.2 acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vinxi: 0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0 + '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) vite: 7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vue: 3.5.40(typescript@6.0.3) @@ -27271,7 +27318,7 @@ snapshots: astring@1.9.0: {} - astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): + astro@7.0.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: '@astrojs/compiler-rs': 0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) '@astrojs/internal-helpers': 0.10.1 @@ -27320,7 +27367,7 @@ snapshots: tinyglobby: 0.2.17 ultrahtml: 1.6.0 unifont: 0.7.4 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) vite: 8.1.4(@types/node@24.3.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vitefu: 1.1.3(vite@8.1.4(@types/node@24.3.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) xxhash-wasm: 1.1.0 @@ -28812,18 +28859,18 @@ snapshots: dayjs@1.11.20: {} - db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)): + db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)): optionalDependencies: - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 better-sqlite3: 12.9.0 - drizzle-orm: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) + drizzle-orm: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7) mysql2: 3.22.3(@types/node@22.19.1) - db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)): + db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)): optionalDependencies: - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 better-sqlite3: 12.9.0 - drizzle-orm: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7) + drizzle-orm: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7) mysql2: 3.22.3(@types/node@24.3.0) debug@2.6.9: @@ -29159,10 +29206,10 @@ snapshots: react-is: 18.3.1 tslib: 2.8.1 - drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7): + drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7): optionalDependencies: '@cloudflare/workers-types': 4.20260511.1 - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 '@neondatabase/serverless': 1.1.0 '@opentelemetry/api': 1.9.1 '@types/better-sqlite3': 7.6.13 @@ -29173,10 +29220,10 @@ snapshots: pg: 8.22.0 postgres: 3.4.7 - drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7): + drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7): optionalDependencies: '@cloudflare/workers-types': 4.20260511.1 - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 '@neondatabase/serverless': 1.1.0 '@opentelemetry/api': 1.9.1 '@types/better-sqlite3': 7.6.13 @@ -29769,7 +29816,7 @@ snapshots: get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.6.1)))(eslint@9.32.0(jiti@2.6.1)))(eslint@9.32.0(jiti@2.6.1)) @@ -29784,7 +29831,7 @@ snapshots: get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) @@ -29799,7 +29846,7 @@ snapshots: get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.6.1)) @@ -29975,7 +30022,7 @@ snapshots: eslint-plugin-react-hooks@7.1.1(eslint@9.32.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 eslint: 9.32.0(jiti@2.6.1) hermes-parser: 0.25.1 zod: 3.25.76 @@ -30508,10 +30555,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -31626,7 +31669,7 @@ snapshots: ipaddr.js@2.2.0: {} - ipx@3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1): + ipx@3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -31642,7 +31685,7 @@ snapshots: sharp: 0.34.5 svgo: 4.0.1 ufo: 1.6.3 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -31665,7 +31708,7 @@ snapshots: - ioredis - uploadthing - ipx@3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1): + ipx@3.1.1(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -31681,7 +31724,7 @@ snapshots: sharp: 0.34.5 svgo: 4.0.1 ufo: 1.6.3 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -32710,8 +32753,8 @@ snapshots: magicast@0.5.2: dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 make-dir@3.1.0: @@ -33433,7 +33476,7 @@ snapshots: neotraverse@0.6.18: {} - netlify-cli@26.2.0(@types/node@22.19.1)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(picomatch@4.0.5)(rollup@4.60.2): + netlify-cli@26.2.0(@types/node@22.19.1)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(picomatch@4.0.5)(rollup@4.60.2): dependencies: '@fastify/static': 9.3.0 '@netlify/ai': 0.4.2 @@ -33442,13 +33485,13 @@ snapshots: '@netlify/build': 35.15.0(@opentelemetry/api@1.9.1)(@types/node@22.19.1)(picomatch@4.0.5)(rollup@4.60.2) '@netlify/build-info': 10.5.1 '@netlify/config': 24.6.0 - '@netlify/dev': 4.18.9(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(rollup@4.60.2) + '@netlify/dev': 4.18.9(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1)(rollup@4.60.2) '@netlify/dev-utils': 4.4.6 '@netlify/edge-bundler': 14.10.3 '@netlify/edge-functions': 3.0.8 '@netlify/edge-functions-bootstrap': 2.17.1 '@netlify/headers-parser': 9.0.3 - '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + '@netlify/images': 1.3.10(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) '@netlify/local-functions-proxy': 2.0.3 '@netlify/redirect-parser': 15.0.4 '@netlify/zip-it-and-ship-it': 14.7.1(rollup@4.60.2)(supports-color@10.2.2) @@ -33655,7 +33698,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.13.3(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1))(rolldown@1.1.5): + nitropack@2.13.3(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1))(rolldown@1.1.5): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.2) @@ -33676,7 +33719,7 @@ snapshots: cookie-es: 2.0.1 croner: 10.0.1 crossws: 0.3.5 - db0: 0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)) + db0: 0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)) defu: 6.1.7 destr: 2.0.5 dot-prop: 10.1.0 @@ -33722,7 +33765,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 6.1.1 unplugin-utils: 0.3.1 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.1 @@ -33758,7 +33801,7 @@ snapshots: - supports-color - uploadthing - nitropack@2.13.3(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5): + nitropack@2.13.3(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.2) @@ -33779,7 +33822,7 @@ snapshots: cookie-es: 2.0.1 croner: 10.0.1 crossws: 0.3.5 - db0: 0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)) + db0: 0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)) defu: 6.1.7 destr: 2.0.5 dot-prop: 10.1.0 @@ -33825,7 +33868,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 6.1.1 unplugin-utils: 0.3.1 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.1 @@ -33973,16 +34016,16 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@4.4.2(7db89b35953831c98bf5f8751fd1480e): + nuxt@4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.2)(typescript@6.0.3) '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2) '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@22.19.1)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(magicast@0.5.2)(mysql2@3.22.3(@types/node@22.19.1))(nuxt@4.4.2(7db89b35953831c98bf5f8751fd1480e))(rolldown@1.1.5)(typescript@6.0.3) + '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(magicast@0.5.2)(mysql2@3.22.3(@types/node@22.19.1))(nuxt@4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44))(rolldown@1.1.5)(typescript@6.0.3) '@nuxt/schema': 4.4.2 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.2(magicast@0.5.2)) - '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.1)(lightningcss@1.32.0)(magicast@0.5.2)(nuxt@4.4.2(7db89b35953831c98bf5f8751fd1480e))(optionator@0.9.4)(oxlint@1.66.0)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0) + '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.1)(lightningcss@1.32.0)(magicast@0.5.2)(nuxt@4.4.2(13ea3f48f8f6e09baf0bc216fcff4e44))(optionator@0.9.4)(oxlint@1.66.0)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0) '@unhead/vue': 2.1.13(vue@3.5.40(typescript@6.0.3)) '@vue/shared': 3.5.33 c12: 3.3.4(magicast@0.5.2) @@ -34682,8 +34725,6 @@ snapshots: picomatch@4.0.3: {} - picomatch@4.0.4: {} - picomatch@4.0.5: {} picoquery@2.5.0: {} @@ -35664,7 +35705,7 @@ snapshots: rolldown@1.1.5: dependencies: '@oxc-project/types': 0.139.0 - '@rolldown/pluginutils': 1.0.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: '@rolldown/binding-android-arm64': 1.1.5 '@rolldown/binding-darwin-arm64': 1.1.5 @@ -36856,18 +36897,13 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyglobby@0.2.17: dependencies: @@ -37433,7 +37469,7 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.16.0 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 unplugin@3.0.0: @@ -37479,7 +37515,7 @@ snapshots: - '@emnapi/runtime' optional: true - unstorage@1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1): + unstorage@1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)))(ioredis@5.10.1): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -37491,10 +37527,10 @@ snapshots: ufo: 1.6.3 optionalDependencies: '@netlify/blobs': 10.7.9(supports-color@10.2.2) - db0: 0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)) + db0: 0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@22.19.1)) ioredis: 5.10.1 - unstorage@1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1): + unstorage@1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -37506,7 +37542,7 @@ snapshots: ufo: 1.6.3 optionalDependencies: '@netlify/blobs': 10.7.9(supports-color@10.2.2) - db0: 0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)) + db0: 0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)) ioredis: 5.10.1 untildify@4.0.0: {} @@ -37619,7 +37655,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.11(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): + vinxi@0.5.11(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(@types/node@24.3.0)(better-sqlite3@12.9.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -37640,7 +37676,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1(debug@4.4.3) micromatch: 4.0.8 - nitropack: 2.13.3(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5) + nitropack: 2.13.3(@electric-sql/pglite@0.5.8)(@netlify/blobs@10.7.9)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0))(rolldown@1.1.5) node-fetch-native: 1.6.7 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -37652,7 +37688,7 @@ snapshots: ufo: 1.6.3 unctx: 2.5.0 unenv: 1.10.0 - unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.3.16)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) + unstorage: 1.17.5(@netlify/blobs@10.7.9)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.9.0)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7))(mysql2@3.22.3(@types/node@24.3.0)))(ioredis@5.10.1) vite: 6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) zod: 4.3.6 transitivePeerDependencies: @@ -37811,11 +37847,11 @@ snapshots: vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.5 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.10 rollup: 4.44.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.3.0 fsevents: 2.3.3 @@ -37845,11 +37881,11 @@ snapshots: vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.19 rollup: 4.60.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 22.19.1 fsevents: 2.3.3 @@ -37862,11 +37898,11 @@ snapshots: vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.19 rollup: 4.60.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.3.0 fsevents: 2.3.3 @@ -38208,10 +38244,10 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - waddler@0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7): + waddler@0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@22.19.1))(pg@8.22.0)(postgres@3.4.7): optionalDependencies: '@cloudflare/workers-types': 4.20260511.1 - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 '@neondatabase/serverless': 1.1.0 better-sqlite3: 12.9.0 bun-types: 1.3.3 @@ -38219,10 +38255,10 @@ snapshots: pg: 8.22.0 postgres: 3.4.7 - waddler@0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.3.16)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7): + waddler@0.1.1(@cloudflare/workers-types@4.20260511.1)(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(pg@8.22.0)(postgres@3.4.7): optionalDependencies: '@cloudflare/workers-types': 4.20260511.1 - '@electric-sql/pglite': 0.3.16 + '@electric-sql/pglite': 0.5.8 '@neondatabase/serverless': 1.1.0 better-sqlite3: 12.9.0 bun-types: 1.3.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2b9e0e470..8032bc60f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,6 +22,7 @@ packages: - packages/nestjs - packages/next - packages/nuxt +- packages/pglite - packages/postgres - packages/redis - packages/relay @@ -61,20 +62,23 @@ allowBuilds: catalog: "@astrojs/netlify": ^6.6.5 "@cloudflare/workers-types": ^4.20260511.1 - "@netlify/database": ^1.1.0 - netlify-cli: ^26.2.0 - "@netlify/async-workloads": ^0.0.106 + "@electric-sql/pglite": ^0.5.8 "@fxts/core": ^1.21.1 "@js-temporal/polyfill": ^0.5.1 "@logtape/file": ^2.2.0 "@logtape/logtape": ^2.2.0 "@multiformats/base-x": ^4.0.1 + "@nestjs/common": ^11.0.1 + "@netlify/async-workloads": ^0.0.106 + "@netlify/database": ^1.1.0 + "@nuxt/kit": ^4.4.2 + "@nuxt/schema": ^4.4.2 "@opentelemetry/api": ^1.9.1 - "@opentelemetry/exporter-trace-otlp-proto": ^0.211.0 "@opentelemetry/context-async-hooks": ^2.7.1 "@opentelemetry/core": ^2.7.1 - "@opentelemetry/sdk-node": ^0.211.0 + "@opentelemetry/exporter-trace-otlp-proto": ^0.211.0 "@opentelemetry/sdk-metrics": 2.7.1 + "@opentelemetry/sdk-node": ^0.211.0 "@opentelemetry/sdk-trace-base": ^2.7.1 "@opentelemetry/semantic-conventions": ^1.40.0 "@optique/config": ^1.1.0 @@ -89,12 +93,11 @@ catalog: "@types/amqplib": ^0.10.8 "@types/better-sqlite3": ^7.6.13 "@types/bun": ^1.2.23 + "@types/emscripten": ^1.41.1 "@types/express": ^4.0.0 "@types/koa": ^2.15.0 "@types/node": ^22.17.0 - "@nestjs/common": ^11.0.1 - "@nuxt/kit": ^4.4.2 - "@nuxt/schema": ^4.4.2 + netlify-cli: ^26.2.0 astro: ^7.0.0 amqplib: ^0.10.9 asn1js: ^3.0.10 diff --git a/scripts/check_fixture_usage.ts b/scripts/check_fixture_usage.ts index ad4c921cc..cf746eb12 100644 --- a/scripts/check_fixture_usage.ts +++ b/scripts/check_fixture_usage.ts @@ -42,6 +42,9 @@ const ALLOWLIST: readonly string[] = [ // JSDoc `@example` block mentions `import { test } from "@fedify/fixture"` // as documentation; not a real runtime import. "packages/testing/src/mq-tester.ts", + // JSDoc `@example` block mentions `import { test } from "@fedify/fixture"` + // as documentation; not a real runtime import. + "packages/testing/src/kv-tester.ts", ].map((path) => join(...path.split("/") as [string, ...string[]])) .flatMap((path) => path.includes("*") ? expandGlobPattern(path) : path); diff --git a/scripts/check_temporal_polyfill.ts b/scripts/check_temporal_polyfill.ts index 23be2e7bc..4e2058647 100644 --- a/scripts/check_temporal_polyfill.ts +++ b/scripts/check_temporal_polyfill.ts @@ -16,6 +16,7 @@ const packages = [ "debugger", "fedify", "mysql", + "pglite", "postgres", "redis", "relay", @@ -195,6 +196,7 @@ async function prepareTypeConsumerProject( import type * as debuggerModule from "@fedify/debugger"; import type * as fedify from "@fedify/fedify"; import type * as mysql from "@fedify/mysql"; + import type * as pglite from "@fedify/pglite"; import type * as postgres from "@fedify/postgres"; import type * as redis from "@fedify/redis"; import type * as relay from "@fedify/relay"; @@ -211,6 +213,7 @@ async function prepareTypeConsumerProject( typeof debuggerModule | undefined, typeof fedify | undefined, typeof mysql | undefined, + typeof pglite | undefined, typeof postgres | undefined, typeof redis | undefined, typeof relay | undefined, @@ -227,6 +230,7 @@ async function prepareTypeConsumerProject( undefined, undefined, undefined, + undefined, ]; void object; From daf2db6c8b1b491f7f5c40d93b0aa1d1b77b8a5b Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Sun, 30 Aug 2026 20:15:45 +0000 Subject: [PATCH 2/3] Lower docs build heap cap to 3 GiB A 12 GiB cap exceeds common dev machines' RAM, disabling V8 GC pressure and triggering kernel OOM kills. The cap was raised to 12 GiB in 38f0a9fdd, when every build still re-typechecked all Twoslash blocks in one process. Since 467941e02 persists Twoslash results in a file system cache, measured builds peak around 3 GiB of heap even with a cold cache, so the cap can drop below physical memory and let GC work again. Assisted-by: Claude Code:claude-fable-5 --- docs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/package.json b/docs/package.json index c203dd7ba..d177b7655 100644 --- a/docs/package.json +++ b/docs/package.json @@ -86,7 +86,7 @@ }, "scripts": { "dev": "cd ../ && pnpm run --filter '@fedify/*' -r build:self && cd docs/ && vitepress dev --host", - "build": "cd ../ && pnpm run --filter '@fedify/*' -r build:self && cd docs/ && NODE_OPTIONS='--max-old-space-size=12288' vitepress build", + "build": "cd ../ && pnpm run --filter '@fedify/*' -r build:self && cd docs/ && NODE_OPTIONS='--max-old-space-size=3072' vitepress build", "preview": "cd ../ && pnpm run --filter '@fedify/*' -r build:self && cd docs/ && vitepress preview" } } From 6037ebad44c1a0ce6b2fe33f5cb2d22f3139e3a8 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Sun, 30 Aug 2026 22:22:21 +0000 Subject: [PATCH 3/3] Add PR number --- CHANGES.md | 6 ++++-- changes.d/pglite/pglite-kv-store.md | 2 +- changes.d/testing/kv-store-tester.md | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0331680bd..618b29154 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -257,9 +257,10 @@ To be released. by an embedded PGlite database. It accepts a caller-created PGlite instance and is intended for a single PGlite instance in a single runtime isolate; a message queue is not provided because PGlite does not share data between - processes. [[#1018]] + processes. [[#1018], [#1020] by ChanHaeng Lee\] [#1018]: https://github.com/fedify-dev/fedify/issues/1018 +[#1020]: https://github.com/fedify-dev/fedify/issues/1020 ### @fedify/postgres @@ -315,7 +316,8 @@ To be released. ### @fedify/testing - Added `testKvStore()`, a conformance test suite for `KvStore` - implementations, complementing `testMessageQueue()`. [[#1018]] + implementations, complementing `testMessageQueue()`. + [[#1018], [#1020] by ChanHaeng Lee\] - Fixed the CommonJS testing utilities build so it no longer requires `@js-temporal/polyfill` at runtime. The build now bundles `temporal-polyfill`, while type declarations rely on the standard diff --git a/changes.d/pglite/pglite-kv-store.md b/changes.d/pglite/pglite-kv-store.md index 54ccbdc9c..b8b37c1c9 100644 --- a/changes.d/pglite/pglite-kv-store.md +++ b/changes.d/pglite/pglite-kv-store.md @@ -2,4 +2,4 @@ by an embedded PGlite database. It accepts a caller-created PGlite instance and is intended for a single PGlite instance in a single runtime isolate; a message queue is not provided because PGlite does not share data between - processes. [[#1018]] + processes. [[#1018], [#1020] by ChanHaeng Lee] diff --git a/changes.d/testing/kv-store-tester.md b/changes.d/testing/kv-store-tester.md index f4154cdb7..994b4eb9d 100644 --- a/changes.d/testing/kv-store-tester.md +++ b/changes.d/testing/kv-store-tester.md @@ -1,2 +1,3 @@ - Added `testKvStore()`, a conformance test suite for `KvStore` - implementations, complementing `testMessageQueue()`. [[#1018]] + implementations, complementing `testMessageQueue()`. + [[#1018], [#1020] by ChanHaeng Lee]