diff --git a/README.md b/README.md index e4230e6..29c4a64 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,11 @@ **[nuxt-better-auth.onmax.me](https://nuxt-better-auth.onmax.me/)** +## Alpha Migration Notes + +- `auth.database.*` module options are removed. This now fails fast during module setup. +- Configure Better Auth's `database` directly in `server/auth.config.ts`, or use a module that registers `better-auth:database:providers`. + ## License MIT diff --git a/docs/app/composables/useSidebarConfig.ts b/docs/app/composables/useSidebarConfig.ts index 8244830..6b6b119 100644 --- a/docs/app/composables/useSidebarConfig.ts +++ b/docs/app/composables/useSidebarConfig.ts @@ -60,7 +60,6 @@ export function useSidebarConfig() { { title: 'NuxtHub', href: '/integrations/nuxthub', icon: 'i-simple-icons-nuxtdotjs' }, { title: 'DevTools', href: '/integrations/devtools', icon: 'i-solar-tuning-square-bold' }, { title: 'i18n', href: '/integrations/i18n', icon: 'i-lucide-languages' }, - { title: 'Convex', href: '/integrations/convex', icon: 'i-custom-convex' }, ], }, { diff --git a/docs/content/1.getting-started/2.configuration.md b/docs/content/1.getting-started/2.configuration.md index 10d860e..ddcdf61 100644 --- a/docs/content/1.getting-started/2.configuration.md +++ b/docs/content/1.getting-started/2.configuration.md @@ -60,22 +60,6 @@ export default defineNuxtConfig({ **Requirement**: Requires [NuxtHub Integration](/integrations/nuxthub) with `hub: { kv: true }`. :: - ::field{name="database.provider" type="'none' | 'nuxthub' | 'convex'"} - Default: auto (`'nuxthub'` when `hub.db` is configured, otherwise `'none'`) - - Select the database backend used by Better Auth. - - `'none'`: No DB adapter - - `'nuxthub'`: Use `@nuxthub/core` database - - `'convex'`: Use Convex HTTP adapter (requires `nuxt-convex`) - :: - - ::field{name="database.convexUrl" type="string"} - Default: auto-detected - - Optional Convex URL override when `database.provider = 'convex'`. - Priority: `auth.database.convexUrl` → `convex.url` → `runtimeConfig.public.convex.url` → `CONVEX_URL` → `NUXT_PUBLIC_CONVEX_URL` - :: - ::field{name="schema.usePlural" type="boolean"} Default: `false` @@ -89,6 +73,45 @@ export default defineNuxtConfig({ :: :: +## Removed Module Database Options + +`auth.database.*` options were removed and now fail fast at module setup. + +Removed keys: +- `auth.database.provider` +- `auth.database.convexUrl` + +::warning +This is a hard removal in the current alpha. The module throws an error when any `auth.database.*` option is configured. +:: + +Before (removed): + +```ts [nuxt.config.ts] +export default defineNuxtConfig({ + auth: { + database: { + provider: 'nuxthub', + convexUrl: 'https://example.convex.cloud', + }, + }, +}) +``` + +After (supported): + +```ts [server/auth.config.ts] +import { defineServerAuth } from '@onmax/nuxt-better-auth/config' +import { drizzleAdapter } from 'better-auth/adapters/drizzle' +import { db, schema } from '@nuxthub/db' + +export default defineServerAuth({ + database: drizzleAdapter(db, { provider: 'sqlite', schema }), +}) +``` + +Or register a provider module via `better-auth:database:providers`. + ## Server Configuration Define your authentication logic in `server/auth.config.ts`, including plugins, providers, and settings. @@ -127,9 +150,8 @@ import { defineServerAuth } from '@onmax/nuxt-better-auth/config' export default defineServerAuth((ctx) => ({ emailAndPassword: { enabled: true }, - // Access the database connection via ctx.db when using NuxtHub - // Example: pass ctx.db to your own plugin/helper. - // Do not set `database` here - the module injects it from `auth.database.provider`. + // Access the auto-injected NuxtHub database connection when available + // (undefined when no module DB provider is active). appName: ctx.runtimeConfig.public.siteUrl ? 'Better Auth App' : 'Better Auth', // Access runtime config if needed @@ -137,6 +159,25 @@ export default defineServerAuth((ctx) => ({ })) ``` +### Configure Better Auth Database Manually + +When you need a custom adapter (or want full control), set Better Auth's native `database` option in `server/auth.config.ts`. + +```ts [server/auth.config.ts] +import { defineServerAuth } from '@onmax/nuxt-better-auth/config' +import { drizzleAdapter } from 'better-auth/adapters/drizzle' +import { db, schema } from '@nuxthub/db' + +export default defineServerAuth({ + database: drizzleAdapter(db, { provider: 'sqlite', schema }), + emailAndPassword: { enabled: true }, +}) +``` + +::note +If `database` is set in `defineServerAuth`, it takes precedence over module auto-detected providers. +:: + ## Base URL Configuration The module resolves `siteUrl` using this priority: @@ -200,6 +241,22 @@ export default defineNuxtModule({ }) ``` +Register a database provider from another Nuxt module: + +```ts +export default defineNuxtModule({ + setup(_options, nuxt) { + nuxt.hook('better-auth:database:providers', (providers) => { + providers.myProvider = { + priority: 200, + isEnabled: () => true, + buildDatabaseCode: () => 'export function createDatabase() { return undefined }\nexport const db = undefined', + } + }) + }, +}) +``` + Access sessions from server handlers: ```ts diff --git a/docs/content/4.integrations/3.convex.md b/docs/content/4.integrations/3.convex.md deleted file mode 100644 index 794bc8d..0000000 --- a/docs/content/4.integrations/3.convex.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Convex -description: Use Convex as your real-time backend with Better Auth. ---- - -Convex provides a real-time backend with automatic data synchronization. You can combine it with Better Auth to build applications where authenticated users access their own data with live updates. - -## Setup - -The `nuxt-convex` module connects your Nuxt application to Convex. Better Auth handles authentication while Convex manages your application data. - -::steps - -### Install nuxt-convex - -```bash -npx nuxt module add nuxt-convex -``` - -### Configure modules - -Add both modules to your Nuxt configuration. - -```ts [nuxt.config.ts] -export default defineNuxtConfig({ - modules: ['nuxt-convex', '@onmax/nuxt-better-auth'], - auth: { - database: { - provider: 'convex', - // optional override; otherwise auto-resolved from convex config/env - // convexUrl: 'https://your-app.convex.cloud' - }, - }, -}) -``` - -:: - -::callout{icon="i-lucide-book" to="https://nuxt-convex.onmax.me" target="_blank"} -See the [nuxt-convex documentation](https://nuxt-convex.onmax.me) for Convex project setup and environment configuration. -:: - -## Authenticated Queries - -Better Auth provides the authenticated user through the `useUserSession` composable. You can pass the user ID to Convex queries to fetch user-specific data with real-time updates. - -```vue [app/pages/tasks.vue] - -``` - -The `computed` wrapper ensures the query re-subscribes automatically when the user changes. When you pass `undefined` as the arguments, Convex pauses the query and returns no data. This behavior prevents unauthorized queries when the user is not authenticated. - -::warning -Authenticated queries require `{ ssr: false }`. Convex queries executed on the server during SSR do not receive authentication cookies, which causes them to fail or return empty results. -:: - -## Convex as Auth Database - -Better Auth typically stores authentication data in a SQL database. The `@convex-dev/better-auth` adapter lets you store users, sessions, and accounts directly in Convex instead. This approach keeps all your data in one place with Convex's real-time synchronization. - -### Install the adapter - -The adapter requires exact versions to ensure compatibility between Better Auth and Convex. - -```bash -pnpm add @convex-dev/better-auth better-auth --save-exact -``` - -### Configure the Convex component - -The Better Auth component registers the authentication tables in your Convex database. - -```ts [convex/convex.config.ts] -import betterAuth from '@convex-dev/better-auth/convex.config' -import { defineApp } from 'convex/server' - -const app = defineApp() -app.use(betterAuth) -export default app -``` - -### Connect Better Auth to Convex - -Set `auth.database.provider = 'convex'` in `nuxt.config.ts`. The module injects the Convex HTTP adapter automatically. In `server/auth.config.ts`, keep your auth options and add the Convex plugin. - -```ts [server/auth.config.ts] -import { convex } from '@convex-dev/better-auth/server/plugins' -import { defineServerAuth } from '@onmax/nuxt-better-auth/config' - -export default defineServerAuth({ - plugins: [convex()], - emailAndPassword: { enabled: true }, -}) -``` - -::note -Convex auth tables are generated at `.nuxt/better-auth/auth-tables.convex.ts`. -:: - -::callout{icon="i-lucide-book" to="https://github.com/get-convex/convex-better-auth" target="_blank"} -See the [@convex-dev/better-auth repository](https://github.com/get-convex/convex-better-auth) for advanced configuration options and additional plugins. -:: diff --git a/docs/content/5.api/1.composables.md b/docs/content/5.api/1.composables.md index 2f6064b..107fe9e 100644 --- a/docs/content/5.api/1.composables.md +++ b/docs/content/5.api/1.composables.md @@ -117,12 +117,16 @@ await fetchSession({ #### `updateUser` -Optimistically updates the local user object. +Updates the user on the server and optimistically patches local state. Local state reverts if the server call fails. ```ts -updateUser({ name: 'New Name' }) +await updateUser({ name: 'New Name' }) ``` +::note +During SSR, `updateUser` only patches local state since no client is available. +:: + ::tip **Reactivity**: `user` and `session` are global states using `useState`. Changes in one component are instantly reflected everywhere. :: diff --git a/package.json b/package.json index f070342..6d4171d 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,6 @@ "./config": { "types": "./dist/runtime/config.d.ts", "import": "./dist/runtime/config.js" - }, - "./adapters/convex": { - "types": "./dist/runtime/adapters/convex.d.ts", - "import": "./dist/runtime/adapters/convex.js" } }, "main": "./dist/module.mjs", @@ -40,9 +36,6 @@ ], "config": [ "./dist/runtime/config.d.ts" - ], - "adapters/convex": [ - "./dist/runtime/adapters/convex.d.ts" ] } }, @@ -67,15 +60,11 @@ }, "peerDependencies": { "@nuxthub/core": ">=0.10.5", - "better-auth": ">=1.0.0", - "convex": ">=1.25.0" + "better-auth": ">=1.0.0" }, "peerDependenciesMeta": { "@nuxthub/core": { "optional": true - }, - "convex": { - "optional": true } }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 173cf02..585a4c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,16 +21,13 @@ importers: dependencies: '@better-auth/cli': specifier: ^1.5.0-beta.3 - version: 1.5.0-beta.4(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 1.5.0-beta.4(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': specifier: ^4.2.2 version: 4.2.2(magicast@0.5.1) '@nuxt/ui': specifier: ^4.2.1 - version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1) - convex: - specifier: '>=1.25.0' - version: 1.31.6 + version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1) defu: specifier: ^6.1.4 version: 6.1.4 @@ -49,16 +46,16 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^4.12.0 - version: 4.19.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + version: 4.19.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@libsql/client': specifier: ^0.15.15 version: 0.15.15 '@nuxt/devtools': specifier: ^3.1.1 - version: 3.1.1(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 3.1.1(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/devtools-kit': specifier: ^3.1.1 - version: 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + version: 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/module-builder': specifier: ^1.0.2 version: 1.0.2(@nuxt/cli@3.31.2(cac@6.7.14)(magicast@0.5.1))(@vue/compiler-core@3.5.25)(esbuild@0.27.1)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) @@ -67,7 +64,7 @@ importers: version: 4.2.2 '@nuxt/test-utils': specifier: ^3.21.0 - version: 3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + version: 3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxthub/core': specifier: ^0.10.5 version: 0.10.5(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(synckit@0.11.11)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3)) @@ -76,10 +73,10 @@ importers: version: 7.6.13 '@types/node': specifier: latest - version: 25.0.10 + version: 25.2.3 better-auth: specifier: ^1.5.0-beta.3 - version: 1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@11.10.0)(drizzle-kit@0.31.8)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@11.10.0)(drizzle-kit@0.31.8)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) better-sqlite3: specifier: ^11.9.1 version: 11.10.0 @@ -103,10 +100,10 @@ importers: version: 9.39.1(jiti@2.6.1) npm-agentskills: specifier: https://pkg.pr.new/onmax/npm-agentskills@394499e - version: https://pkg.pr.new/onmax/npm-agentskills@394499e(d5e897605acd35109370dbc9883608aa) + version: https://pkg.pr.new/onmax/npm-agentskills@394499e(d0b113f6e27e6ae975b038a0745e4589) nuxt: specifier: ^4.2.2 - version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) tinyexec: specifier: ^1.0.2 version: 1.0.2 @@ -115,7 +112,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + version: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vitest-package-exports: specifier: ^0.1.1 version: 0.1.1 @@ -133,10 +130,10 @@ importers: version: 3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1) '@nuxt/fonts': specifier: ^0.12.1 - version: 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + version: 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/ui': specifier: ^4.2.1 - version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@3.25.76) + version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@3.25.76) '@vercel/analytics': specifier: ^1.6.1 version: 1.6.1(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) @@ -151,7 +148,7 @@ importers: version: 1.7.4(@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) nuxt: specifier: ^4.2.2 - version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) devDependencies: '@iconify-json/solar': specifier: ^1.2.5 @@ -161,22 +158,22 @@ importers: version: 4.1.2(rollup@4.53.3) '@vueuse/nuxt': specifier: ^14.1.0 - version: 14.1.0(86c8be3fff62e30dcbbfb9cefb2d955c) + version: 14.1.0(8f6300d217548be7f133f086d85d2621) docus: specifier: ^5.4.0 - version: 5.4.0(9116c6d81496c1961b4baa0546c0cab2) + version: 5.4.0(55411bb8b2c4297f61b49fa4110c69b8) playground: dependencies: '@better-auth/passkey': specifier: 1.4.7 - version: 1.4.7(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)))(better-call@1.1.8(zod@4.2.1))(nanostores@1.1.0) + version: 1.4.7(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)))(better-call@1.1.8(zod@4.2.1))(nanostores@1.1.0) '@nuxt/fonts': specifier: ^0.12.1 - version: 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + version: 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/ui': specifier: ^4.2.1 - version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1) + version: 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1) '@nuxthub/core': specifier: ^0.10.5 version: 0.10.5(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(synckit@0.11.11)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3)) @@ -185,10 +182,10 @@ importers: version: 9.5.6(@vue/compiler-dom@3.5.25)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3)) better-auth: specifier: 1.4.7 - version: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) nuxt: specifier: ^4.2.2 - version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + version: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) nuxt-qrcode: specifier: ^0.4.8 version: 0.4.8(@types/emscripten@1.41.5)(magicast@0.5.1)(vue@3.5.25(typescript@5.9.3)) @@ -198,7 +195,7 @@ importers: devDependencies: '@better-auth/cli': specifier: 1.4.7 - version: 1.4.7(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 1.4.7(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@libsql/client': specifier: ^0.15.15 version: 0.15.15 @@ -3413,8 +3410,8 @@ packages: '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} - '@types/node@25.0.10': - resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} + '@types/node@25.2.3': + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} '@types/parse-path@7.1.0': resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} @@ -4427,22 +4424,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - convex@1.31.6: - resolution: {integrity: sha512-9cIsOzepa3s9DURRF+fZHxbNuzLgilg9XGQCc45v0Xx4FemqeIezpPFSJF9WHC9ckk43TDUUXLecvLVt9djPkw==} - engines: {node: '>=18.0.0', npm: '>=7.0.0'} - hasBin: true - peerDependencies: - '@auth0/auth0-react': ^2.0.1 - '@clerk/clerk-react': ^4.12.8 || ^5.0.0 - react: ^18.0.0 || ^19.0.0-0 || ^19.0.0 - peerDependenciesMeta: - '@auth0/auth0-react': - optional: true - '@clerk/clerk-react': - optional: true - react: - optional: true - cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} @@ -5798,6 +5779,7 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true global-directory@4.0.1: @@ -8009,7 +7991,7 @@ packages: tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me terser@5.44.1: resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} @@ -8883,7 +8865,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@antfu/eslint-config@4.19.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@antfu/eslint-config@4.19.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 @@ -8892,7 +8874,7 @@ snapshots: '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) ansis: 4.2.0 cac: 6.7.14 eslint: 9.39.1(jiti@2.6.1) @@ -9169,7 +9151,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@better-auth/cli@1.4.7(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@better-auth/cli@1.4.7(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/preset-react': 7.28.5(@babel/core@7.28.5) @@ -9181,7 +9163,7 @@ snapshots: '@mrleebo/prisma-ast': 0.13.1 '@prisma/client': 5.22.0(prisma@5.22.0) '@types/pg': 8.16.0 - better-auth: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.33.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + better-auth: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.33.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) better-sqlite3: 12.5.0 c12: 3.3.2(magicast@0.5.1) chalk: 5.6.2 @@ -9239,7 +9221,7 @@ snapshots: - vitest - vue - '@better-auth/cli@1.5.0-beta.4(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@better-auth/cli@1.5.0-beta.4(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@types/better-sqlite3@7.6.13)(better-call@1.1.8(zod@4.2.1))(drizzle-kit@0.31.8)(jose@6.1.3)(kysely@0.28.9)(magicast@0.5.1)(nanostores@1.1.0)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/preset-react': 7.28.5(@babel/core@7.28.5) @@ -9251,7 +9233,7 @@ snapshots: '@mrleebo/prisma-ast': 0.13.1 '@prisma/client': 5.22.0(prisma@5.22.0) '@types/pg': 8.16.0 - better-auth: 1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + better-auth: 1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) better-sqlite3: 12.5.0 c12: 3.3.3(magicast@0.5.1) chalk: 5.6.2 @@ -9343,14 +9325,14 @@ snapshots: nanostores: 1.1.0 zod: 4.2.1 - '@better-auth/passkey@1.4.7(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)))(better-call@1.1.8(zod@4.2.1))(nanostores@1.1.0)': + '@better-auth/passkey@1.4.7(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)))(better-call@1.1.8(zod@4.2.1))(nanostores@1.1.0)': dependencies: '@better-auth/core': 1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@simplewebauthn/browser': 13.2.2 '@simplewebauthn/server': 13.2.2 - better-auth: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + better-auth: 1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) better-call: 1.1.8(zod@4.2.1) nanostores: 1.1.0 zod: 4.2.1 @@ -10725,19 +10707,19 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/devtools-kit@2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@nuxt/kit': 3.20.2(magicast@0.5.1) execa: 8.0.1 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/devtools-kit@3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) execa: 8.0.1 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - magicast @@ -10752,12 +10734,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.3 - '@nuxt/devtools@3.1.1(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@nuxt/devtools@3.1.1(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/devtools-wizard': 3.1.1 '@nuxt/kit': 4.2.2(magicast@0.5.1) - '@vue/devtools-core': 8.0.5(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-core': 8.0.5(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-kit': 8.0.5 birpc: 2.9.0 consola: 3.4.2 @@ -10782,9 +10764,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 1.0.0 tinyglobby: 0.2.15 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-inspect: 11.3.3(@nuxt/kit@4.2.2(magicast@0.5.1))(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - vite-plugin-vue-tracer: 1.1.3(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.2.2(magicast@0.5.1))(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + vite-plugin-vue-tracer: 1.1.3(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -10793,16 +10775,16 @@ snapshots: - utf-8-validate - vue - '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/kit': 4.2.2(magicast@0.5.1) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 esbuild: 0.25.12 fontaine: 0.7.0 - fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) h3: 1.15.4 jiti: 2.6.1 magic-regexp: 0.10.0 @@ -10839,16 +10821,16 @@ snapshots: - uploadthing - vite - '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/kit': 4.2.2(magicast@0.5.1) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 esbuild: 0.25.12 fontaine: 0.7.0 - fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) h3: 1.15.4 jiti: 2.6.1 magic-regexp: 0.10.0 @@ -10885,16 +10867,16 @@ snapshots: - uploadthing - vite - '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/fonts@0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.1.1(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/kit': 4.2.2(magicast@0.5.1) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 esbuild: 0.25.12 fontaine: 0.7.0 - fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + fontless: 0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) h3: 1.15.4 jiti: 2.6.1 magic-regexp: 0.10.0 @@ -10931,13 +10913,13 @@ snapshots: - uploadthing - vite - '@nuxt/icon@2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@nuxt/icon@2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@iconify/collections': 1.0.628 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.0 '@iconify/vue': 5.0.0(vue@3.5.25(typescript@5.9.3)) - '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/kit': 4.2.2(magicast@0.5.1) consola: 3.4.2 local-pkg: 1.1.2 @@ -11062,7 +11044,7 @@ snapshots: - vue - vue-tsc - '@nuxt/nitro-server@4.2.2(06f5f0e8efe3509069eb8652e2c6d977)': + '@nuxt/nitro-server@4.2.2(8b5e7ef04952d7c51d612497b71d245f)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.2.2(magicast@0.5.1) @@ -11079,15 +11061,15 @@ snapshots: impound: 1.0.0 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.12.9(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(rolldown@1.0.0-beta.57) - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nitropack: 2.12.9(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(rolldown@1.0.0-beta.57) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 radix3: 1.1.2 std-env: 3.10.0 ufo: 1.6.1 unctx: 2.4.1 - unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) + unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 @@ -11126,7 +11108,7 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.2.2(8185f9b53990b6cd716c22ebe5e61991)': + '@nuxt/nitro-server@4.2.2(dd904bc313d753d485d014f8371c0544)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.2.2(magicast@0.5.1) @@ -11144,7 +11126,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.12.9(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(rolldown@1.0.0-beta.57) - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 radix3: 1.1.2 @@ -11190,7 +11172,7 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.2.2(9da0ef5d1b459e9bc65a52ec155a3573)': + '@nuxt/nitro-server@4.2.2(e7eae03a22eb52244e5a60caedabb42a)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.2.2(magicast@0.5.1) @@ -11207,15 +11189,15 @@ snapshots: impound: 1.0.0 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.12.9(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(rolldown@1.0.0-beta.57) - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nitropack: 2.12.9(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(rolldown@1.0.0-beta.57) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 radix3: 1.1.2 std-env: 3.10.0 ufo: 1.6.1 unctx: 2.4.1 - unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) + unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 @@ -11279,7 +11261,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/test-utils@3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@nuxt/test-utils@3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@nuxt/kit': 3.20.2(magicast@0.5.1) c12: 3.3.2(magicast@0.5.1) @@ -11304,28 +11286,28 @@ snapshots: tinyexec: 1.0.2 ufo: 1.6.1 unplugin: 2.3.11 - vitest-environment-nuxt: 1.0.1(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + vitest-environment-nuxt: 1.0.1(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) vue: 3.5.25(typescript@5.9.3) optionalDependencies: playwright-core: 1.57.0 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - magicast - typescript - '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1)': + '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1)': dependencies: '@iconify/vue': 5.0.0(vue@3.5.25(typescript@5.9.3)) '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) '@nuxt/schema': 4.2.2 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.1) '@standard-schema/spec': 1.0.0 '@tailwindcss/postcss': 4.1.18 - '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@tanstack/vue-table': 8.21.3(vue@3.5.25(typescript@5.9.3)) '@tanstack/vue-virtual': 3.13.13(vue@3.5.25(typescript@5.9.3)) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) @@ -11406,19 +11388,19 @@ snapshots: - vite - vue - '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@3.25.76)': + '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@3.25.76)': dependencies: '@iconify/vue': 5.0.0(vue@3.5.25(typescript@5.9.3)) '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) '@nuxt/schema': 4.2.2 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.1) '@standard-schema/spec': 1.0.0 '@tailwindcss/postcss': 4.1.18 - '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@tanstack/vue-table': 8.21.3(vue@3.5.25(typescript@5.9.3)) '@tanstack/vue-virtual': 3.13.13(vue@3.5.25(typescript@5.9.3)) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) @@ -11499,19 +11481,19 @@ snapshots: - vite - vue - '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.1.13)': + '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.1.13)': dependencies: '@iconify/vue': 5.0.0(vue@3.5.25(typescript@5.9.3)) '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) '@nuxt/schema': 4.2.2 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.1) '@standard-schema/spec': 1.0.0 '@tailwindcss/postcss': 4.1.18 - '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@tanstack/vue-table': 8.21.3(vue@3.5.25(typescript@5.9.3)) '@tanstack/vue-virtual': 3.13.13(vue@3.5.25(typescript@5.9.3)) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) @@ -11592,19 +11574,19 @@ snapshots: - vite - vue - '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1)': + '@nuxt/ui@4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.2.1)': dependencies: '@iconify/vue': 5.0.0(vue@3.5.25(typescript@5.9.3)) '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/fonts': 0.12.1(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/icon': 2.1.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) '@nuxt/schema': 4.2.2 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.1) '@standard-schema/spec': 1.0.0 '@tailwindcss/postcss': 4.1.18 - '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@tailwindcss/vite': 4.1.18(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@tanstack/vue-table': 8.21.3(vue@3.5.25(typescript@5.9.3)) '@tanstack/vue-virtual': 3.13.13(vue@3.5.25(typescript@5.9.3)) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) @@ -11685,12 +11667,12 @@ snapshots: - vite - vue - '@nuxt/vite-builder@4.2.2(6022c2288353c10f1f256fdecb76a2fb)': + '@nuxt/vite-builder@4.2.2(5bfac7166bc90ee5fbfe32a4e1dd72a5)': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) - '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) autoprefixer: 10.4.22(postcss@8.5.6) consola: 3.4.2 cssnano: 7.1.2(postcss@8.5.6) @@ -11705,7 +11687,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.0 mocked-exports: 0.1.1 - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 @@ -11714,9 +11696,9 @@ snapshots: std-env: 3.10.0 ufo: 1.6.1 unenv: 2.0.0-rc.24(patch_hash=9a59b5822004542ce0d4b7e36ab85d7471f999743c34e706c95956d7c86eed5a) - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-node: 5.2.0(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-node: 5.2.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -11746,12 +11728,12 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.2.2(818dde247a44e95d5d2dfb6e976a22dd)': + '@nuxt/vite-builder@4.2.2(742044ef1dd5c69bee581cb280266cc9)': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) - '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) autoprefixer: 10.4.22(postcss@8.5.6) consola: 3.4.2 cssnano: 7.1.2(postcss@8.5.6) @@ -11766,7 +11748,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.0 mocked-exports: 0.1.1 - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 @@ -11775,9 +11757,9 @@ snapshots: std-env: 3.10.0 ufo: 1.6.1 unenv: 2.0.0-rc.24(patch_hash=9a59b5822004542ce0d4b7e36ab85d7471f999743c34e706c95956d7c86eed5a) - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-node: 5.2.0(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-node: 5.2.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -11807,12 +11789,12 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.2.2(cd350ca02f2e5d4bde1b4faeb83933c6)': + '@nuxt/vite-builder@4.2.2(87df4f8c56e91734f3728aae3f8f8512)': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) - '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) autoprefixer: 10.4.22(postcss@8.5.6) consola: 3.4.2 cssnano: 7.1.2(postcss@8.5.6) @@ -11827,7 +11809,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.0 mocked-exports: 0.1.1 - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 @@ -11836,9 +11818,9 @@ snapshots: std-env: 3.10.0 ufo: 1.6.1 unenv: 2.0.0-rc.24(patch_hash=9a59b5822004542ce0d4b7e36ab85d7471f999743c34e706c95956d7c86eed5a) - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-node: 5.2.0(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.39.1(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-node: 5.2.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-plugin-checker: 0.12.0(eslint@9.39.1(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -13146,12 +13128,12 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.18(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) '@tanstack/table-core@8.21.3': {} @@ -13174,7 +13156,7 @@ snapshots: '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 '@types/chai@5.2.3': dependencies: @@ -13211,7 +13193,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@25.0.10': + '@types/node@25.2.3': dependencies: undici-types: 7.16.0 @@ -13221,7 +13203,7 @@ snapshots: '@types/pg@8.16.0': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -13237,7 +13219,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: @@ -13392,32 +13374,32 @@ snapshots: vue: 3.5.25(typescript@5.9.3) vue-router: 4.6.3(vue@3.5.25(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx@5.1.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.54 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.2(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.2(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.50 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - '@vitest/eslint-plugin@1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -13430,13 +13412,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) '@vitest/pretty-format@4.0.15': dependencies: @@ -13554,14 +13536,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@8.0.5(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vue/devtools-core@8.0.5(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/devtools-kit': 8.0.5 '@vue/devtools-shared': 8.0.5 mitt: 3.0.1 nanoid: 5.1.6 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + vite-hot-client: 2.1.0(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - vite @@ -13666,13 +13648,13 @@ snapshots: '@vueuse/metadata@14.1.0': {} - '@vueuse/nuxt@14.1.0(86c8be3fff62e30dcbbfb9cefb2d955c)': + '@vueuse/nuxt@14.1.0(8f6300d217548be7f133f086d85d2621)': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) '@vueuse/metadata': 14.1.0 local-pkg: 1.1.2 - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -13890,7 +13872,7 @@ snapshots: baseline-browser-mapping@2.9.6: {} - better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.33.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.33.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: '@better-auth/core': 1.4.7(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.5(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.7(@better-auth/core@1.4.7(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) @@ -13911,10 +13893,10 @@ snapshots: drizzle-orm: 0.33.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0) pg: 8.16.3 prisma: 5.22.0 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + better-auth@1.4.7(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: '@better-auth/core': 1.4.7(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.5(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.7(@better-auth/core@1.4.7(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.5(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) @@ -13935,10 +13917,10 @@ snapshots: drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0) pg: 8.16.3 prisma: 5.22.0 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - better-auth@1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@11.10.0)(drizzle-kit@0.31.8)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + better-auth@1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@11.10.0)(drizzle-kit@0.31.8)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: '@better-auth/core': 1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/telemetry': 1.5.0-beta.4(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) @@ -13959,10 +13941,10 @@ snapshots: drizzle-orm: 0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0) pg: 8.16.3 prisma: 5.22.0 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - better-auth@1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + better-auth@1.5.0-beta.4(@prisma/client@5.22.0(prisma@5.22.0))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.41.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(pg@8.16.3)(prisma@5.22.0)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: '@better-auth/core': 1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/telemetry': 1.5.0-beta.4(@better-auth/core@1.5.0-beta.4(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) @@ -13983,7 +13965,7 @@ snapshots: drizzle-orm: 0.41.0(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0) pg: 8.16.3 prisma: 5.22.0 - vitest: 4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) better-call@1.1.5(zod@4.2.1): @@ -14232,7 +14214,7 @@ snapshots: chrome-launcher@1.2.1: dependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -14323,11 +14305,6 @@ snapshots: convert-source-map@2.0.0: {} - convex@1.31.6: - dependencies: - esbuild: 0.27.0 - prettier: 3.7.4 - cookie-es@1.2.2: {} cookie-es@2.0.0: {} @@ -14560,7 +14537,7 @@ snapshots: diff@8.0.2: {} - docus@5.4.0(9116c6d81496c1961b4baa0546c0cab2): + docus@5.4.0(55411bb8b2c4297f61b49fa4110c69b8): dependencies: '@iconify-json/lucide': 1.2.80 '@iconify-json/simple-icons': 1.2.62 @@ -14568,7 +14545,7 @@ snapshots: '@nuxt/content': 3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1) '@nuxt/image': 2.0.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(magicast@0.5.1) '@nuxt/kit': 4.2.2(magicast@0.5.1) - '@nuxt/ui': 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.1.13) + '@nuxt/ui': 4.2.1(@babel/parser@7.28.5)(@nuxt/content@3.9.0(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(magicast@0.5.1))(change-case@5.4.4)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(embla-carousel@8.6.0)(ioredis@5.8.2)(magicast@0.5.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))(zod@4.1.13) '@nuxtjs/i18n': 10.2.1(@vue/compiler-dom@3.5.25)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.1)(rollup@4.53.3)(vue@3.5.25(typescript@5.9.3)) '@nuxtjs/mcp-toolkit': 0.5.2(magicast@0.5.1)(zod@4.1.13) '@nuxtjs/mdc': 0.18.4(magicast@0.5.1) @@ -14580,9 +14557,9 @@ snapshots: git-url-parse: 16.1.0 minimark: 0.2.0 motion-v: 1.7.4(@vueuse/core@13.9.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) nuxt-llms: 0.1.3(magicast@0.5.1) - nuxt-og-image: 5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2))(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + nuxt-og-image: 5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2))(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) pkg-types: 2.3.0 scule: 1.3.0 tailwindcss: 4.1.18 @@ -15534,7 +15511,7 @@ snapshots: unicode-properties: 1.4.1 unicode-trie: 2.0.0 - fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: consola: 3.4.2 css-tree: 3.1.0 @@ -15550,7 +15527,7 @@ snapshots: unifont: 0.6.0 unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) optionalDependencies: - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15572,7 +15549,7 @@ snapshots: - ioredis - uploadthing - fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: consola: 3.4.2 css-tree: 3.1.0 @@ -15588,7 +15565,7 @@ snapshots: unifont: 0.6.0 unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) optionalDependencies: - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15610,7 +15587,7 @@ snapshots: - ioredis - uploadthing - fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + fontless@0.1.0(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: consola: 3.4.2 css-tree: 3.1.0 @@ -15626,7 +15603,7 @@ snapshots: unifont: 0.6.0 unstorage: 1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2) optionalDependencies: - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17300,7 +17277,7 @@ snapshots: normalize-range@0.1.2: {} - npm-agentskills@https://pkg.pr.new/onmax/npm-agentskills@394499e(d5e897605acd35109370dbc9883608aa): + npm-agentskills@https://pkg.pr.new/onmax/npm-agentskills@394499e(d0b113f6e27e6ae975b038a0745e4589): dependencies: citty: 0.1.6 consola: 3.4.2 @@ -17309,7 +17286,7 @@ snapshots: pkg-types: 2.3.0 optionalDependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) - nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2) npm-run-path@5.3.0: dependencies: @@ -17346,9 +17323,9 @@ snapshots: transitivePeerDependencies: - magicast - nuxt-og-image@5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2))(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + nuxt-og-image@5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(ioredis@5.8.2))(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: - '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@nuxt/kit': 4.2.2(magicast@0.5.1) '@resvg/resvg-js': 2.6.2 '@resvg/resvg-wasm': 2.6.2 @@ -17425,16 +17402,16 @@ snapshots: - magicast - vue - nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): dependencies: '@dxup/nuxt': 0.2.2(magicast@0.5.1) '@nuxt/cli': 3.31.2(cac@6.7.14)(magicast@0.5.1) - '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) - '@nuxt/nitro-server': 4.2.2(8185f9b53990b6cd716c22ebe5e61991) + '@nuxt/nitro-server': 4.2.2(dd904bc313d753d485d014f8371c0544) '@nuxt/schema': 4.2.2 '@nuxt/telemetry': 2.6.6(magicast@0.5.1) - '@nuxt/vite-builder': 4.2.2(cd350ca02f2e5d4bde1b4faeb83933c6) + '@nuxt/vite-builder': 4.2.2(87df4f8c56e91734f3728aae3f8f8512) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 c12: 3.3.2(magicast@0.5.1) @@ -17486,7 +17463,7 @@ snapshots: vue-router: 4.6.3(vue@3.5.25(typescript@5.9.3)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 25.0.10 + '@types/node': 25.2.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17548,16 +17525,16 @@ snapshots: - xml2js - yaml - nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@11.10.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@11.10.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@11.10.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): dependencies: '@dxup/nuxt': 0.2.2(magicast@0.5.1) '@nuxt/cli': 3.31.2(cac@6.7.14)(magicast@0.5.1) - '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) - '@nuxt/nitro-server': 4.2.2(9da0ef5d1b459e9bc65a52ec155a3573) + '@nuxt/nitro-server': 4.2.2(8b5e7ef04952d7c51d612497b71d245f) '@nuxt/schema': 4.2.2 '@nuxt/telemetry': 2.6.6(magicast@0.5.1) - '@nuxt/vite-builder': 4.2.2(6022c2288353c10f1f256fdecb76a2fb) + '@nuxt/vite-builder': 4.2.2(5bfac7166bc90ee5fbfe32a4e1dd72a5) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 c12: 3.3.2(magicast@0.5.1) @@ -17609,7 +17586,7 @@ snapshots: vue-router: 4.6.3(vue@3.5.25(typescript@5.9.3)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 25.0.10 + '@types/node': 25.2.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17671,16 +17648,16 @@ snapshots: - xml2js - yaml - nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.0.10)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.2.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.25)(better-sqlite3@12.5.0)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.15.15)(better-sqlite3@12.5.0)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0)))(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20251230.0)(@libsql/client@0.15.15)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.5.0)(kysely@0.28.9)(pg@8.16.3)(prisma@5.22.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2): dependencies: '@dxup/nuxt': 0.2.2(magicast@0.5.1) '@nuxt/cli': 3.31.2(cac@6.7.14)(magicast@0.5.1) - '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/devtools': 3.1.1(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 4.2.2(magicast@0.5.1) - '@nuxt/nitro-server': 4.2.2(06f5f0e8efe3509069eb8652e2c6d977) + '@nuxt/nitro-server': 4.2.2(e7eae03a22eb52244e5a60caedabb42a) '@nuxt/schema': 4.2.2 '@nuxt/telemetry': 2.6.6(magicast@0.5.1) - '@nuxt/vite-builder': 4.2.2(818dde247a44e95d5d2dfb6e976a22dd) + '@nuxt/vite-builder': 4.2.2(742044ef1dd5c69bee581cb280266cc9) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 c12: 3.3.2(magicast@0.5.1) @@ -17732,7 +17709,7 @@ snapshots: vue-router: 4.6.3(vue@3.5.25(typescript@5.9.3)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 25.0.10 + '@types/node': 25.2.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -19721,23 +19698,23 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-dev-rpc@1.1.0(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + vite-dev-rpc@1.1.0(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: birpc: 2.9.0 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-hot-client: 2.1.0(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-hot-client: 2.1.0(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) - vite-hot-client@2.1.0(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + vite-hot-client@2.1.0(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-node@5.2.0(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): + vite-node@5.2.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): dependencies: cac: 6.7.14 es-module-lexer: 1.7.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -19751,7 +19728,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.12.0(eslint@9.39.1(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): + vite-plugin-checker@0.12.0(eslint@9.39.1(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -19760,7 +19737,7 @@ snapshots: picomatch: 4.0.3 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.39.1(jiti@2.6.1) @@ -19768,7 +19745,7 @@ snapshots: typescript: 5.9.3 vue-tsc: 3.1.8(typescript@5.9.3) - vite-plugin-checker@0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): + vite-plugin-checker@0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -19777,7 +19754,7 @@ snapshots: picomatch: 4.0.3 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.39.2(jiti@2.6.1) @@ -19785,7 +19762,7 @@ snapshots: typescript: 5.9.3 vue-tsc: 3.1.8(typescript@5.9.3) - vite-plugin-inspect@11.3.3(@nuxt/kit@4.2.2(magicast@0.5.1))(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-inspect@11.3.3(@nuxt/kit@4.2.2(magicast@0.5.1))(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: ansis: 4.2.0 debug: 4.4.3 @@ -19795,24 +19772,24 @@ snapshots: perfect-debounce: 2.0.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) - vite-dev-rpc: 1.1.0(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite-dev-rpc: 1.1.0(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) optionalDependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) transitivePeerDependencies: - supports-color - vite-plugin-vue-tracer@1.1.3(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): + vite-plugin-vue-tracer@1.1.3(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.8 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): + vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -19821,16 +19798,16 @@ snapshots: rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 terser: 5.44.1 yaml: 2.8.2 - vitest-environment-nuxt@1.0.1(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): + vitest-environment-nuxt@1.0.1(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)): dependencies: - '@nuxt/test-utils': 3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@nuxt/test-utils': 3.21.0(magicast@0.5.1)(playwright-core@1.57.0)(typescript@5.9.3)(vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -19850,10 +19827,10 @@ snapshots: find-up-simple: 1.0.1 pathe: 2.0.3 - vitest@4.0.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): + vitest@4.0.15(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -19870,10 +19847,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.7(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.7(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.0.10 + '@types/node': 25.2.3 transitivePeerDependencies: - jiti - less diff --git a/src/database-provider.ts b/src/database-provider.ts index a2739d0..cbc0249 100644 --- a/src/database-provider.ts +++ b/src/database-provider.ts @@ -1,48 +1,29 @@ -export type DatabaseProvider = 'none' | 'nuxthub' | 'convex' +import type { ModuleDatabaseProviderId } from './runtime/config' +import type { BetterAuthDatabaseProviderDefinition, BetterAuthDatabaseProviderEnabledContext } from './types/hooks' export interface ResolveDatabaseProviderInput { - clientOnly: boolean - hasHubDb: boolean - hasConvexModule: boolean - convexUrl: string - selectedProvider?: DatabaseProvider + providers: Record + context: BetterAuthDatabaseProviderEnabledContext } export interface ResolvedDatabaseProvider { - provider: DatabaseProvider - convexUrl: string + id: ModuleDatabaseProviderId + definition: BetterAuthDatabaseProviderDefinition } +/** + * Resolves the database provider by filtering enabled providers and selecting + * the highest priority (default 0). Ties preserve registration order. + */ export function resolveDatabaseProvider(input: ResolveDatabaseProviderInput): ResolvedDatabaseProvider { - const provider = input.selectedProvider + const enabledProviders = Object.entries(input.providers) + .filter(([_id, provider]) => provider.isEnabled?.(input.context) ?? true) - if (provider === 'nuxthub') { - if (!input.hasHubDb) { - throw new Error('[nuxt-better-auth] auth.database.provider is set to "nuxthub", but @nuxthub/core with hub.db is not configured.') - } - return { provider: 'nuxthub', convexUrl: '' } + if (!enabledProviders.length) { + throw new Error('[nuxt-better-auth] No database provider is enabled. Register one with the better-auth:database:providers hook.') } - if (provider === 'convex') { - if (input.clientOnly) { - throw new Error('[nuxt-better-auth] auth.database.provider "convex" is not available in clientOnly mode.') - } - if (!input.hasConvexModule) { - throw new Error('[nuxt-better-auth] auth.database.provider is set to "convex", but nuxt-convex is not installed.') - } - if (!input.convexUrl) { - throw new Error('[nuxt-better-auth] auth.database.provider is set to "convex", but no Convex URL was found. Set auth.database.convexUrl, convex.url, runtimeConfig.public.convex.url, CONVEX_URL, or NUXT_PUBLIC_CONVEX_URL.') - } - return { provider: 'convex', convexUrl: input.convexUrl } - } - - if (provider === 'none') { - return { provider: 'none', convexUrl: '' } - } - - if (input.hasHubDb) { - return { provider: 'nuxthub', convexUrl: '' } - } - - return { provider: 'none', convexUrl: '' } + enabledProviders.sort((a, b) => (b[1].priority ?? 0) - (a[1].priority ?? 0)) + const [id, definition] = enabledProviders[0] + return { id: id as ModuleDatabaseProviderId, definition } } diff --git a/src/module.ts b/src/module.ts index 96bc6ab..d8ec3db 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1,5 +1,11 @@ import type { NuxtHubOptions } from './module/hub' -import type { BetterAuthModuleOptions } from './runtime/config' +import type { BetterAuthModuleOptions, ModuleDatabaseProviderId } from './runtime/config' +import type { + BetterAuthDatabaseProviderBuildContext, + BetterAuthDatabaseProviderDefinition, + BetterAuthDatabaseProviderEnabledContext, + BetterAuthDatabaseProviderSetupContext, +} from './types/hooks' import { existsSync } from 'node:fs' import { mkdir, writeFile } from 'node:fs/promises' import { addTemplate, createResolver, defineNuxtModule, hasNuxtModule } from '@nuxt/kit' @@ -7,19 +13,29 @@ import { consola as _consola } from 'consola' import { dirname, join } from 'pathe' import { version } from '../package.json' import { resolveDatabaseProvider } from './database-provider' -import { resolveConvexUrl } from './module/convex' import { registerAuthMiddlewareHook, registerDevtools, registerRouteRulesMetaHook, registerServerRuntime, registerTemplateHmrHook } from './module/hooks' import { getHubCasing, getHubDialect } from './module/hub' import { setupRuntimeConfig } from './module/runtime' -import { setupBetterAuthSchema, setupConvexAuthSchema } from './module/schema' +import { setupBetterAuthSchema } from './module/schema' import { promptForSecret } from './module/secret' -import { applyConvexRuntimeConfig, buildDatabaseCode, buildSecondaryStorageCode } from './module/templates' +import { buildDatabaseCode, buildSecondaryStorageCode } from './module/templates' import { registerServerTypeTemplates, registerSharedTypeTemplates } from './module/type-templates' import './types/hooks' const consola = _consola.withTag('nuxt-better-auth') +function resolveRemovedDatabaseOptions(options: BetterAuthModuleOptions): string[] { + const database = (options as { database?: Record }).database + if (!database || typeof database !== 'object') + return [] + + return Object.entries(database) + .filter(([, value]) => value !== undefined) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([key]) => `auth.database.${key}`) +} + function resolveDefaultClientConfig(options: BetterAuthModuleOptions, rootDir: string, srcDir: string): void { if (options.clientConfig !== 'app/auth.config') return @@ -100,40 +116,75 @@ export default defineNuxtModule({ const hasNuxtHub = hasNuxtModule('@nuxthub/core', nuxt) const hub = hasNuxtHub ? (nuxt.options as { hub?: NuxtHubOptions }).hub : undefined const hasHubDbAvailable = !clientOnly && hasNuxtHub && !!hub?.db - const hasConvexModule = hasNuxtModule('nuxt-convex', nuxt) - const detectedConvexUrl = resolveConvexUrl(nuxt, options.database?.convexUrl) - - const resolvedDatabase = resolveDatabaseProvider({ - clientOnly, - hasHubDb: hasHubDbAvailable, - hasConvexModule, - convexUrl: detectedConvexUrl, - selectedProvider: options.database?.provider, - }) + const removedDatabaseOptions = resolveRemovedDatabaseOptions(options) + if (removedDatabaseOptions.length) { + throw new Error( + `[nuxt-better-auth] auth.database options have been removed. Remove: ${removedDatabaseOptions.join(', ')}. To configure a database, either set "database" directly in server/auth.config.ts (defineServerAuth) or install a provider module that registers better-auth:database:providers.`, + ) + } - const databaseProvider = resolvedDatabase.provider - const hasHubDb = databaseProvider === 'nuxthub' - const hasConvexDb = databaseProvider === 'convex' - - if (hasConvexDb) - consola.info('Using Convex HTTP adapter for Better Auth database') - - const { secondaryStorageEnabled } = setupRuntimeConfig({ - nuxt, - options, - clientOnly, - databaseProvider, - hasNuxtHub, - hub, - consola, - }) + let databaseProvider: ModuleDatabaseProviderId = 'none' + let hasHubDb = false nuxt.options.alias['#nuxt-better-auth'] = resolver.resolve('./runtime/types/augment') if (!clientOnly) nuxt.options.alias['#auth/server'] = serverConfigPath nuxt.options.alias['#auth/client'] = clientConfigPath - if (!clientOnly) { + if (clientOnly) { + setupRuntimeConfig({ + nuxt, + options, + clientOnly, + databaseProvider, + hasNuxtHub, + hub, + consola, + }) + } + else { + const hubDialect = getHubDialect(hub) ?? 'sqlite' + const usePlural = options.schema?.usePlural ?? false + const camelCase = (options.schema?.casing ?? getHubCasing(hub)) !== 'snake_case' + + const providers: Record = { + nuxthub: { + priority: 100, + isEnabled: ({ hasHubDbAvailable }) => hasHubDbAvailable, + buildDatabaseCode: () => buildDatabaseCode({ + provider: 'nuxthub', + hubDialect, + usePlural, + camelCase, + }), + }, + none: { + priority: 0, + buildDatabaseCode: () => buildDatabaseCode({ + provider: 'none', + hubDialect, + usePlural, + camelCase, + }), + }, + } + + const enabledCtx: BetterAuthDatabaseProviderEnabledContext = { nuxt, options, clientOnly, hasHubDbAvailable } + await nuxt.callHook('better-auth:database:providers', providers) + const resolvedProvider = resolveDatabaseProvider({ providers, context: enabledCtx }) + databaseProvider = resolvedProvider.id + hasHubDb = databaseProvider === 'nuxthub' + + const { secondaryStorageEnabled } = setupRuntimeConfig({ + nuxt, + options, + clientOnly, + databaseProvider, + hasNuxtHub, + hub, + consola, + }) + if (secondaryStorageEnabled && !nuxt.options.alias['hub:kv']) { throw new Error('[nuxt-better-auth] hub:kv not found. Ensure @nuxthub/core is loaded before this module and hub.kv is enabled.') } @@ -149,16 +200,13 @@ export default defineNuxtModule({ throw new Error('[nuxt-better-auth] hub:db not found. Ensure @nuxthub/core is loaded before this module and hub.db is configured.') } - const hubDialect = getHubDialect(hub) ?? 'sqlite' - const usePlural = options.schema?.usePlural ?? false - const camelCase = (options.schema?.casing ?? getHubCasing(hub)) !== 'snake_case' - - if (hasConvexDb) - applyConvexRuntimeConfig(nuxt, resolvedDatabase.convexUrl) + const setupCtx: BetterAuthDatabaseProviderSetupContext = { nuxt, options, clientOnly } + await resolvedProvider.definition.setup?.(setupCtx) + const buildCtx: BetterAuthDatabaseProviderBuildContext = { hubDialect, usePlural, camelCase } const databaseTemplate = addTemplate({ filename: 'better-auth/database.mjs', - getContents: () => buildDatabaseCode({ provider: databaseProvider, hubDialect, usePlural, camelCase }), + getContents: () => resolvedProvider.definition.buildDatabaseCode(buildCtx), write: true, }) nuxt.options.alias['#auth/database'] = databaseTemplate.dst @@ -168,6 +216,9 @@ export default defineNuxtModule({ hasHubDb, runtimeTypesPath: resolver.resolve('./runtime/types'), }) + + if (hasHubDb) + await setupBetterAuthSchema(nuxt, serverConfigPath, options, consola) } registerSharedTypeTemplates({ @@ -180,12 +231,6 @@ export default defineNuxtModule({ registerServerRuntime({ clientOnly, resolve: resolver.resolve }) registerAuthMiddlewareHook(nuxt, resolver.resolve) - if (hasHubDb) - await setupBetterAuthSchema(nuxt, serverConfigPath, options, consola) - - if (hasConvexDb) - await setupConvexAuthSchema(nuxt, serverConfigPath, consola) - await registerDevtools({ nuxt, clientOnly, hasHubDb, resolve: resolver.resolve }) registerRouteRulesMetaHook(nuxt) }, diff --git a/src/module/convex.ts b/src/module/convex.ts deleted file mode 100644 index f766885..0000000 --- a/src/module/convex.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { Nuxt } from '@nuxt/schema' - -export function resolveConvexUrl(nuxt: Nuxt, explicitConvexUrl?: string): string { - if (explicitConvexUrl) - return explicitConvexUrl - - const convexConfig = (nuxt.options as { convex?: { url?: string } }).convex - if (convexConfig?.url) - return convexConfig.url - - const runtimeUrl = (nuxt.options.runtimeConfig.public as { convex?: { url?: string } })?.convex?.url - if (runtimeUrl) - return runtimeUrl - - if (process.env.CONVEX_URL) - return process.env.CONVEX_URL - - if (process.env.NUXT_PUBLIC_CONVEX_URL) - return process.env.NUXT_PUBLIC_CONVEX_URL - - return '' -} diff --git a/src/module/runtime.ts b/src/module/runtime.ts index 123df89..09ed642 100644 --- a/src/module/runtime.ts +++ b/src/module/runtime.ts @@ -1,7 +1,6 @@ import type { Nuxt } from '@nuxt/schema' import type { ConsolaInstance } from 'consola' -import type { DatabaseProvider } from '../database-provider' -import type { AuthPrivateRuntimeConfig, AuthRuntimeConfig, BetterAuthModuleOptions } from '../runtime/config' +import type { AuthPrivateRuntimeConfig, AuthRuntimeConfig, BetterAuthModuleOptions, ModuleDatabaseProviderId } from '../runtime/config' import type { NuxtHubOptions } from './hub' import { defu } from 'defu' @@ -9,7 +8,7 @@ interface SetupRuntimeConfigInput { nuxt: Nuxt options: BetterAuthModuleOptions clientOnly: boolean - databaseProvider: DatabaseProvider + databaseProvider: ModuleDatabaseProviderId hasNuxtHub: boolean hub?: NuxtHubOptions consola: ConsolaInstance @@ -44,6 +43,7 @@ export function setupRuntimeConfig(input: SetupRuntimeConfigInput): { secondaryS redirects: { login: options.redirects?.login ?? '/login', guest: options.redirects?.guest ?? '/' }, useDatabase: databaseProvider !== 'none', databaseProvider, + databaseSource: 'module', clientOnly, session: { skipHydratedSsrGetSession: options.session?.skipHydratedSsrGetSession ?? false, diff --git a/src/module/schema.ts b/src/module/schema.ts index 21177ea..632d3f8 100644 --- a/src/module/schema.ts +++ b/src/module/schema.ts @@ -7,7 +7,7 @@ import { existsSync } from 'node:fs' import { mkdir, writeFile } from 'node:fs/promises' import { addTemplate } from '@nuxt/kit' import { join } from 'pathe' -import { generateConvexSchema, generateDrizzleSchema, loadUserAuthConfig } from '../schema-generator' +import { generateDrizzleSchema, loadUserAuthConfig } from '../schema-generator' import { getHubCasing, getHubDialect } from './hub' interface SchemaContext { @@ -90,30 +90,3 @@ export async function setupBetterAuthSchema( consola.error('Failed to generate schema:', error) } } - -export async function setupConvexAuthSchema(nuxt: Nuxt, serverConfigPath: string, consola: ConsolaInstance): Promise { - const context: SchemaContext = { nuxt, serverConfigPath } - - try { - const { userConfig, plugins } = await loadAuthOptions(context) - const authOptions = { ...userConfig, plugins } - const schemaCode = await generateConvexSchema(authOptions) - - const schemaDir = join(nuxt.options.buildDir, 'better-auth') - const schemaPath = join(schemaDir, 'auth-tables.convex.ts') - - await mkdir(schemaDir, { recursive: true }) - await writeFile(schemaPath, schemaCode) - - addTemplate({ filename: 'better-auth/auth-tables.convex.ts', getContents: () => schemaCode, write: true }) - nuxt.options.alias['#auth/convex-schema'] = schemaPath - - consola.info('Generated Convex auth schema at .nuxt/better-auth/auth-tables.convex.ts') - } - catch (error) { - const isProduction = !nuxt.options.dev - if (isProduction) - throw error - consola.error('Failed to generate Convex schema:', error) - } -} diff --git a/src/module/templates.ts b/src/module/templates.ts index 7374e1b..8eb8230 100644 --- a/src/module/templates.ts +++ b/src/module/templates.ts @@ -1,7 +1,4 @@ -import type { Nuxt } from '@nuxt/schema' -import type { DatabaseProvider } from '../database-provider' import type { DbDialect } from './hub' -import { defu } from 'defu' export function buildSecondaryStorageCode(enabled: boolean): string { if (!enabled) @@ -18,7 +15,7 @@ export function createSecondaryStorage() { } interface BuildDatabaseCodeInput { - provider: DatabaseProvider + provider: 'none' | 'nuxthub' hubDialect: DbDialect usePlural: boolean camelCase: boolean @@ -34,27 +31,6 @@ export function createDatabase() { return drizzleAdapter(db, { provider: dialect export { db }` } - if (input.provider === 'convex') { - return `import { useRuntimeConfig } from '#imports' -import { createConvexHttpAdapter } from '@onmax/nuxt-better-auth/adapters/convex' -import { api } from '#convex/api' - -export function createDatabase() { - const config = useRuntimeConfig() - const convexUrl = config.betterAuth?.convexUrl || config.public?.convex?.url - if (!convexUrl) throw new Error('[nuxt-better-auth] CONVEX_URL not configured') - return createConvexHttpAdapter({ url: convexUrl, api: api.auth }) -} -export const db = undefined` - } - return `export function createDatabase() { return undefined } export const db = undefined` } - -export function applyConvexRuntimeConfig(nuxt: Nuxt, convexUrl: string): void { - nuxt.options.runtimeConfig.betterAuth = defu( - nuxt.options.runtimeConfig.betterAuth as Record || {}, - { convexUrl }, - ) -} diff --git a/src/module/type-templates.ts b/src/module/type-templates.ts index 3b01bc3..a07aa8f 100644 --- a/src/module/type-templates.ts +++ b/src/module/type-templates.ts @@ -27,9 +27,9 @@ declare module '#auth/secondary-storage' { filename: 'types/auth-database.d.ts', getContents: () => ` declare module '#auth/database' { - import type { drizzleAdapter } from 'better-auth/adapters/drizzle' - export function createDatabase(): ReturnType | undefined - export const db: unknown + import type { BetterAuthOptions } from 'better-auth' + export function createDatabase(): BetterAuthOptions['database'] + export const db: ${hasHubDb ? `typeof import('@nuxthub/db')['db']` : 'undefined'} } `, }, { nitro: true, node: true }) @@ -71,19 +71,19 @@ declare module '#nuxt-better-auth' { interface AuthSession extends _SessionFallback {} interface ServerAuthContext { runtimeConfig: RuntimeConfig - db: ${hasHubDb ? `typeof import('@nuxthub/db')['db']` : 'unknown'} + db: ${hasHubDb ? `typeof import('@nuxthub/db')['db']` : 'undefined'} } type PluginTypes = InferPluginTypes<_Config> } interface _AugmentedServerAuthContext { runtimeConfig: RuntimeConfig - db: ${hasHubDb ? `typeof import('@nuxthub/db')['db']` : 'unknown'} + db: ${hasHubDb ? `typeof import('@nuxthub/db')['db']` : 'undefined'} } declare module '@onmax/nuxt-better-auth/config' { import type { BetterAuthOptions, BetterAuthPlugin } from 'better-auth' - type ServerAuthConfig = Omit & { + type ServerAuthConfig = Omit & { plugins?: readonly BetterAuthPlugin[] } export function defineServerAuth(config: R): (ctx: _AugmentedServerAuthContext) => R diff --git a/src/runtime/adapters/convex.ts b/src/runtime/adapters/convex.ts deleted file mode 100644 index 861e7d8..0000000 --- a/src/runtime/adapters/convex.ts +++ /dev/null @@ -1,299 +0,0 @@ -import type { Where } from 'better-auth/types' -import type { FunctionReference } from 'convex/server' -import { createAdapterFactory } from 'better-auth/adapters' -import { ConvexHttpClient } from 'convex/browser' - -// Placeholder type - Convex generates actual table names dynamically in user's schema -type TableNames = string - -interface ConvexCleanedWhere { - field: string - value: string | number | boolean | string[] | number[] | null - operator?: 'lt' | 'lte' | 'gt' | 'gte' | 'eq' | 'in' | 'not_in' | 'ne' | 'contains' | 'starts_with' | 'ends_with' - connector?: 'AND' | 'OR' -} - -function parseWhere(where?: Where | Where[]): ConvexCleanedWhere[] { - if (!where) - return [] - const whereArray = Array.isArray(where) ? where : [where] - return whereArray.map((w) => { - if (w.value instanceof Date) - return { ...w, value: w.value.getTime() } as ConvexCleanedWhere - return w as ConvexCleanedWhere - }) -} - -interface PaginationResult { - page: T[] - isDone: boolean - continueCursor: string | null - splitCursor?: string - pageStatus?: 'SplitRecommended' | 'SplitRequired' | string - count?: number -} - -async function handlePagination( - next: (opts: { paginationOpts: { numItems: number, cursor: string | null } }) => Promise & { count?: number }>, - { limit }: { limit?: number } = {}, -): Promise<{ docs: T[], count: number }> { - const state: { isDone: boolean, cursor: string | null, docs: T[], count: number } = { isDone: false, cursor: null, docs: [], count: 0 } - - const onResult = (result: PaginationResult & { count?: number }) => { - state.cursor = result.pageStatus === 'SplitRecommended' || result.pageStatus === 'SplitRequired' - ? (result.splitCursor ?? result.continueCursor) - : result.continueCursor - if (result.page) { - state.docs.push(...result.page) - state.isDone = (limit && state.docs.length >= limit) || result.isDone - return - } - if (result.count) { - state.count += result.count - state.isDone = (limit && state.count >= limit) || result.isDone - return - } - state.isDone = result.isDone - } - - do { - const result = await next({ - paginationOpts: { - numItems: Math.min(200, (limit ?? 200) - state.docs.length, 200), - cursor: state.cursor, - }, - }) - onResult(result) - } while (!state.isDone) - - return state -} - -interface ConvexAuthApi { - create: FunctionReference<'mutation', 'public', { input: { model: string, data: Record }, select?: string[] }, unknown> - findOne: FunctionReference<'query', 'public', { model: string, where?: ConvexCleanedWhere[], select?: string[] }, unknown> - findMany: FunctionReference<'query', 'public', { model: string, where?: ConvexCleanedWhere[], limit?: number, sortBy?: { direction: 'asc' | 'desc', field: string }, paginationOpts: { numItems: number, cursor: string | null } }, PaginationResult> - updateOne: FunctionReference<'mutation', 'public', { input: { model: string, where?: ConvexCleanedWhere[], update: Record } }, unknown> - updateMany: FunctionReference<'mutation', 'public', { input: { model: string, where?: ConvexCleanedWhere[], update: Record }, paginationOpts: { numItems: number, cursor: string | null } }, PaginationResult & { count: number }> - deleteOne: FunctionReference<'mutation', 'public', { input: { model: string, where?: ConvexCleanedWhere[] } }, unknown> - deleteMany: FunctionReference<'mutation', 'public', { input: { model: string, where?: ConvexCleanedWhere[] }, paginationOpts: { numItems: number, cursor: string | null } }, PaginationResult & { count: number }> -} - -export interface ConvexHttpAdapterOptions { - /** Convex deployment URL (e.g., https://your-app.convex.cloud) */ - url: string - /** Convex API functions for auth operations - import from your convex/_generated/api */ - api: ConvexAuthApi - /** Enable debug logging for adapter operations */ - debugLogs?: boolean -} - -/** - * Creates a Better Auth adapter that communicates with Convex via HTTP. - * Uses ConvexHttpClient for server-side auth operations. - * - * @example - * ```ts - * import { api } from '~/convex/_generated/api' - * - * export default defineServerAuth(() => ({ - * database: createConvexHttpAdapter({ - * url: process.env.CONVEX_URL!, - * api: api.auth, - * }), - * })) - * ``` - * - * @limitations - * - `update()` only supports AND-connected where clauses (no OR support) - * - `count()` fetches all documents client-side (Convex limitation) - * - `offset` pagination not supported in `findMany()` - */ -export function createConvexHttpAdapter(options: ConvexHttpAdapterOptions) { - if (!options.url.startsWith('https://') || !options.url.includes('.convex.')) { - throw new Error(`Invalid Convex URL: ${options.url}. Expected format: https://your-app.convex.cloud`) - } - - const client = new ConvexHttpClient(options.url) - - return createAdapterFactory({ - config: { - adapterId: 'convex-http', - adapterName: 'Convex HTTP Adapter', - debugLogs: options.debugLogs ?? false, - disableIdGeneration: true, - transaction: false, - supportsNumericIds: false, - supportsJSON: false, - supportsDates: false, - supportsArrays: true, - usePlural: false, - mapKeysTransformInput: { id: '_id' }, - mapKeysTransformOutput: { _id: 'id' }, - customTransformInput: ({ data, fieldAttributes }) => { - if (data && fieldAttributes.type === 'date') - return new Date(data as string | number | Date).getTime() - return data - }, - customTransformOutput: ({ data, fieldAttributes }) => { - if (data && fieldAttributes.type === 'date') - return new Date(data as number).getTime() - return data - }, - }, - adapter: ({ options: authOptions }) => { - // Disable telemetry - HTTP adapter cannot reliably send telemetry from edge/serverless - authOptions.telemetry = { enabled: false } - return { - id: 'convex-http', - - create: async ({ model, data, select }): Promise => { - return client.mutation(options.api.create, { - input: { model: model as TableNames, data }, - select, - }) - }, - - findOne: async (data): Promise => { - if (data.where?.every((w: Where) => w.connector === 'OR')) { - for (const w of data.where) { - const result = await client.query(options.api.findOne, { - ...data, - model: data.model as TableNames, - where: parseWhere(w), - }) - if (result) - return result - } - return null - } - return client.query(options.api.findOne, { - ...data, - model: data.model as TableNames, - where: parseWhere(data.where), - }) - }, - - findMany: async (data): Promise => { - if (data.offset) - throw new Error('offset not supported') - - if (data.where?.some((w: Where) => w.connector === 'OR')) { - const results = await Promise.all( - data.where.map(async (w: Where) => - handlePagination(async ({ paginationOpts }) => { - return client.query(options.api.findMany, { - ...data, - model: data.model as TableNames, - where: parseWhere(w), - paginationOpts, - }) - }, { limit: data.limit }), - ), - ) - const allDocs = results.flatMap(r => r.docs) - const uniqueDocs = [...new Map(allDocs.map((d: unknown) => [(d as { _id: string })._id, d])).values()] - if (data.sortBy) { - return uniqueDocs.sort((a, b) => { - const aVal = (a as Record)[data.sortBy!.field] - const bVal = (b as Record)[data.sortBy!.field] - const cmp = aVal! < bVal! ? -1 : aVal! > bVal! ? 1 : 0 - return data.sortBy!.direction === 'asc' ? cmp : -cmp - }) - } - return uniqueDocs - } - - const result = await handlePagination( - async ({ paginationOpts }) => client.query(options.api.findMany, { - ...data, - model: data.model as TableNames, - where: parseWhere(data.where), - paginationOpts, - }), - { limit: data.limit }, - ) - return result.docs - }, - - // Note: Convex doesn't have a native count query, so we fetch all docs and count client-side. - // This is inefficient for large datasets but acceptable for auth tables (typically small). - count: async (data): Promise => { - if (data.where?.some((w: Where) => w.connector === 'OR')) { - const results = await Promise.all( - data.where.map(async (w: Where) => - handlePagination(async ({ paginationOpts }) => { - return client.query(options.api.findMany, { - ...data, - model: data.model as TableNames, - where: parseWhere(w), - paginationOpts, - }) - }), - ), - ) - const allDocs = results.flatMap(r => r.docs) - const uniqueDocs = [...new Map(allDocs.map((d: unknown) => [(d as { _id: string })._id, d])).values()] - return uniqueDocs.length - } - - const result = await handlePagination(async ({ paginationOpts }) => client.query(options.api.findMany, { - ...data, - model: data.model as TableNames, - where: parseWhere(data.where), - paginationOpts, - })) - return result.docs.length - }, - - // Supports single eq or multiple AND-connected conditions (Better Auth's common patterns) - update: async (data): Promise => { - const hasOrConnector = data.where?.some((w: Where) => w.connector === 'OR') - if (hasOrConnector) { - throw new Error('update() does not support OR conditions - use updateMany() or split into multiple calls') - } - return client.mutation(options.api.updateOne, { - input: { - model: data.model as TableNames, - where: parseWhere(data.where), - update: data.update as Record, - }, - }) - }, - - updateMany: async (data): Promise => { - const result = await handlePagination(async ({ paginationOpts }) => client.mutation(options.api.updateMany, { - input: { - ...data, - model: data.model as TableNames, - where: parseWhere(data.where), - }, - paginationOpts, - })) - return result.count - }, - - delete: async (data): Promise => { - await client.mutation(options.api.deleteOne, { - input: { - model: data.model as TableNames, - where: parseWhere(data.where), - }, - }) - }, - - deleteMany: async (data): Promise => { - const result = await handlePagination(async ({ paginationOpts }) => client.mutation(options.api.deleteMany, { - input: { - ...data, - model: data.model as TableNames, - where: parseWhere(data.where), - }, - paginationOpts, - })) - return result.count - }, - } - }, - }) -} diff --git a/src/runtime/app/composables/useUserSession.ts b/src/runtime/app/composables/useUserSession.ts index 6f39e52..d4e02f7 100644 --- a/src/runtime/app/composables/useUserSession.ts +++ b/src/runtime/app/composables/useUserSession.ts @@ -19,11 +19,13 @@ export interface UseUserSessionReturn { signOut: (options?: SignOutOptions) => Promise waitForSession: () => Promise fetchSession: (options?: { headers?: HeadersInit, force?: boolean }) => Promise - updateUser: (updates: Partial) => void + updateUser: (updates: Partial) => Promise } // Singleton client instance to ensure consistent state across all useUserSession calls let _client: AppAuthClient | null = null +interface UpdateUserResponse { error?: unknown } + function getClient(baseURL: string): AppAuthClient { if (!_client) _client = createAppAuthClient(baseURL) @@ -98,9 +100,33 @@ export function useUserSession(): UseUserSessionReturn { user.value = null } - function updateUser(updates: Partial) { - if (user.value) - user.value = { ...user.value, ...updates } + async function updateUser(updates: Partial) { + if (!user.value) + return + + const previousUser = user.value + user.value = { ...user.value, ...updates } + + if (!client) + return + + try { + const clientWithUpdateUser = client as AppAuthClient & { updateUser: (updates: Partial) => Promise } + const result = await clientWithUpdateUser.updateUser(updates) + if (result?.error) { + if (typeof result.error === 'string') + throw new Error(result.error) + if (result.error instanceof Error) + throw result.error + if (typeof result.error === 'object' && result.error && 'message' in result.error && typeof result.error.message === 'string') + throw new Error(result.error.message) + throw new Error('Failed to update user') + } + } + catch (error) { + user.value = previousUser + throw error + } } // On client, subscribe to better-auth's reactive session store diff --git a/src/runtime/app/pages/__better-auth-devtools.vue b/src/runtime/app/pages/__better-auth-devtools.vue index 7d1f7ee..e3c4924 100644 --- a/src/runtime/app/pages/__better-auth-devtools.vue +++ b/src/runtime/app/pages/__better-auth-devtools.vue @@ -2,13 +2,13 @@ import type { TableColumn } from '@nuxt/ui' import { useDevtoolsClient } from '@nuxt/devtools-kit/iframe-client' import { refDebounced } from '@vueuse/core' +import { isDevtoolsDatabaseEligible } from '../../utils/devtools-database' definePageMeta({ layout: false }) const toast = useToast() const devtoolsClient = useDevtoolsClient() const runtimeConfig = useRuntimeConfig() -const hasDb = computed(() => (runtimeConfig.public.auth as { useDatabase?: boolean } | undefined)?.useDatabase ?? false) // Sync color mode with host app const isDark = computed(() => devtoolsClient.value?.host?.app?.colorMode?.value === 'dark') @@ -42,10 +42,26 @@ const sessionsQuery = computed(() => ({ page: sessionsPage.value, limit: 20, sea const usersQuery = computed(() => ({ page: usersPage.value, limit: 20, search: usersSearch.value })) const accountsQuery = computed(() => ({ page: accountsPage.value, limit: 20, search: accountsSearch.value })) -const { data: sessionsData, refresh: refreshSessions } = await useFetch('/api/_better-auth/sessions', { query: sessionsQuery, immediate: hasDb.value }) -const { data: usersData, refresh: refreshUsers } = await useFetch('/api/_better-auth/users', { query: usersQuery, immediate: hasDb.value }) -const { data: accountsData, refresh: refreshAccounts } = await useFetch('/api/_better-auth/accounts', { query: accountsQuery, immediate: hasDb.value }) const { data: configData } = await useFetch('/api/_better-auth/config') +const hasDb = computed(() => { + return isDevtoolsDatabaseEligible({ + databaseProvider: configData.value?.config?.module?.databaseProvider, + databaseSource: configData.value?.config?.module?.databaseSource, + fallbackModuleProvider: (runtimeConfig.public.auth as { databaseProvider?: string } | undefined)?.databaseProvider, + }) +}) + +const { data: sessionsData, refresh: refreshSessions } = await useFetch('/api/_better-auth/sessions', { query: sessionsQuery, immediate: false }) +const { data: usersData, refresh: refreshUsers } = await useFetch('/api/_better-auth/users', { query: usersQuery, immediate: false }) +const { data: accountsData, refresh: refreshAccounts } = await useFetch('/api/_better-auth/accounts', { query: accountsQuery, immediate: false }) + +watch(hasDb, (enabled, previouslyEnabled) => { + if (!enabled || previouslyEnabled) + return + refreshSessions() + refreshUsers() + refreshAccounts() +}, { immediate: true }) const tabs = computed(() => { const dbTabs = [ @@ -412,7 +428,12 @@ function getAccountActions(row: AccountRow) {
DB - {{ configData.config.module?.databaseProvider === 'nuxthub' ? 'Hub' : configData.config.module?.databaseProvider === 'convex' ? 'Convex' : 'Off' }} + {{ configData.config.module?.databaseProvider === 'none' ? 'Off' : configData.config.module?.databaseProvider }} + +
+
+ DB Source + {{ configData.config.module?.databaseSource || 'module' }}
diff --git a/src/runtime/config.ts b/src/runtime/config.ts index 67ca804..75d49c6 100644 --- a/src/runtime/config.ts +++ b/src/runtime/config.ts @@ -1,6 +1,5 @@ import type { BetterAuthOptions, BetterAuthPlugin } from 'better-auth' import type { BetterAuthClientOptions } from 'better-auth/client' -import type { DatabaseProvider } from '../database-provider' import type { CasingOption } from '../schema-generator' import type { ServerAuthContext } from './types/augment' import { createAuthClient } from 'better-auth/vue' @@ -12,13 +11,16 @@ export interface ClientAuthContext { siteUrl: string } -export type ServerAuthConfig = Omit & { +export type ServerAuthConfig = Omit & { plugins?: readonly BetterAuthPlugin[] } export type ClientAuthConfig = Omit & { baseURL?: string } export type ServerAuthConfigFn = (ctx: ServerAuthContext) => ServerAuthConfig export type ClientAuthConfigFn = (ctx: ClientAuthContext) => ClientAuthConfig +export type ModuleDatabaseProviderId = 'none' | 'nuxthub' | (string & {}) +export type EffectiveDatabaseProviderId = 'user' | ModuleDatabaseProviderId +export type DatabaseSource = 'module' | 'user' // Module options for nuxt.config.ts export interface BetterAuthModuleOptions { @@ -44,13 +46,6 @@ export interface BetterAuthModuleOptions { } /** Enable KV secondary storage for sessions. Requires hub.kv: true */ secondaryStorage?: boolean - /** Database backend selection and provider-specific options */ - database?: { - /** Explicit database provider. Default: auto (nuxthub when available, otherwise none) */ - provider?: DatabaseProvider - /** Convex deployment URL override (highest priority for Convex provider) */ - convexUrl?: string - } /** Schema generation options. Must match drizzleAdapter config. */ schema?: { /** Plural table names: user → users. Default: false */ @@ -64,7 +59,8 @@ export interface BetterAuthModuleOptions { export interface AuthRuntimeConfig { redirects: { login: string, guest: string } useDatabase: boolean - databaseProvider: DatabaseProvider + databaseProvider: EffectiveDatabaseProviderId + databaseSource: DatabaseSource clientOnly: boolean session: { skipHydratedSsrGetSession: boolean } } diff --git a/src/runtime/server/api/_better-auth/accounts.get.ts b/src/runtime/server/api/_better-auth/accounts.get.ts index f7fe383..c4ac9e7 100644 --- a/src/runtime/server/api/_better-auth/accounts.get.ts +++ b/src/runtime/server/api/_better-auth/accounts.get.ts @@ -1,8 +1,20 @@ import { defineEventHandler, getQuery } from 'h3' +import { isDevtoolsDatabaseEligible } from '../../../utils/devtools-database' +import { getDatabaseProvider, getDatabaseSource } from '../../utils/auth' import { paginationQuerySchema, sanitizeSearchPattern } from './_schema' export default defineEventHandler(async (event) => { try { + const databaseProvider = getDatabaseProvider() + const databaseSource = getDatabaseSource() + if (!isDevtoolsDatabaseEligible({ databaseProvider, databaseSource })) { + return { + accounts: [], + total: 0, + error: 'DevTools DB routes are only available for module-managed nuxthub database mode.', + } + } + const { db, schema } = await import('@nuxthub/db') if (!schema.account) return { accounts: [], total: 0, error: 'Account table not found' } diff --git a/src/runtime/server/api/_better-auth/config.get.ts b/src/runtime/server/api/_better-auth/config.get.ts index 7fceb8d..e865859 100644 --- a/src/runtime/server/api/_better-auth/config.get.ts +++ b/src/runtime/server/api/_better-auth/config.get.ts @@ -1,6 +1,6 @@ import { defineEventHandler } from 'h3' import { useRuntimeConfig } from 'nitropack/runtime' -import { serverAuth } from '../../utils/auth' +import { getDatabaseProvider, getDatabaseSource, serverAuth } from '../../utils/auth' export default defineEventHandler(async (event) => { try { @@ -8,8 +8,10 @@ export default defineEventHandler(async (event) => { const options = auth.options const authContext = await ((auth as { $context?: Promise<{ trustedOrigins?: string[] }> | { trustedOrigins?: string[] } }).$context) const runtimeConfig = useRuntimeConfig() - const publicAuth = runtimeConfig.public?.auth as { redirects?: { login?: string, guest?: string }, useDatabase?: boolean, databaseProvider?: 'none' | 'nuxthub' | 'convex' } | undefined + const publicAuth = runtimeConfig.public?.auth as { redirects?: { login?: string, guest?: string } } | undefined const privateAuth = runtimeConfig.auth as { secondaryStorage?: boolean } | undefined + const databaseProvider = getDatabaseProvider() + const databaseSource = getDatabaseSource() const configuredTrustedOrigins = Array.isArray(options.trustedOrigins) ? options.trustedOrigins : [] const effectiveTrustedOrigins = authContext?.trustedOrigins || configuredTrustedOrigins @@ -24,8 +26,9 @@ export default defineEventHandler(async (event) => { module: { redirects: publicAuth?.redirects || { login: '/login', guest: '/' }, secondaryStorage: privateAuth?.secondaryStorage ?? false, - useDatabase: publicAuth?.useDatabase ?? false, - databaseProvider: publicAuth?.databaseProvider ?? 'none', + useDatabase: databaseProvider !== 'none', + databaseProvider, + databaseSource, }, // Server config (server/auth.config.ts) server: { diff --git a/src/runtime/server/api/_better-auth/sessions.get.ts b/src/runtime/server/api/_better-auth/sessions.get.ts index a77ff98..bc4bff8 100644 --- a/src/runtime/server/api/_better-auth/sessions.get.ts +++ b/src/runtime/server/api/_better-auth/sessions.get.ts @@ -1,8 +1,20 @@ import { defineEventHandler, getQuery } from 'h3' +import { isDevtoolsDatabaseEligible } from '../../../utils/devtools-database' +import { getDatabaseProvider, getDatabaseSource } from '../../utils/auth' import { paginationQuerySchema, sanitizeSearchPattern } from './_schema' export default defineEventHandler(async (event) => { try { + const databaseProvider = getDatabaseProvider() + const databaseSource = getDatabaseSource() + if (!isDevtoolsDatabaseEligible({ databaseProvider, databaseSource })) { + return { + sessions: [], + total: 0, + error: 'DevTools DB routes are only available for module-managed nuxthub database mode.', + } + } + const { db, schema } = await import('@nuxthub/db') if (!schema.session) return { sessions: [], total: 0, error: 'Session table not found' } diff --git a/src/runtime/server/api/_better-auth/users.get.ts b/src/runtime/server/api/_better-auth/users.get.ts index 63adb19..9721fe0 100644 --- a/src/runtime/server/api/_better-auth/users.get.ts +++ b/src/runtime/server/api/_better-auth/users.get.ts @@ -1,8 +1,20 @@ import { defineEventHandler, getQuery } from 'h3' +import { isDevtoolsDatabaseEligible } from '../../../utils/devtools-database' +import { getDatabaseProvider, getDatabaseSource } from '../../utils/auth' import { paginationQuerySchema, sanitizeSearchPattern } from './_schema' export default defineEventHandler(async (event) => { try { + const databaseProvider = getDatabaseProvider() + const databaseSource = getDatabaseSource() + if (!isDevtoolsDatabaseEligible({ databaseProvider, databaseSource })) { + return { + users: [], + total: 0, + error: 'DevTools DB routes are only available for module-managed nuxthub database mode.', + } + } + const { db, schema } = await import('@nuxthub/db') if (!schema.user) return { users: [], total: 0, error: 'User table not found' } diff --git a/src/runtime/server/utils/auth.ts b/src/runtime/server/utils/auth.ts index 293178c..5e0ad47 100644 --- a/src/runtime/server/utils/auth.ts +++ b/src/runtime/server/utils/auth.ts @@ -1,5 +1,6 @@ import type { Auth } from 'better-auth' import type { H3Event } from 'h3' +import type { EffectiveDatabaseProviderId, ModuleDatabaseProviderId } from '../../config' import { createDatabase, db } from '#auth/database' import { createSecondaryStorage } from '#auth/secondary-storage' import createServerAuth from '#auth/server' @@ -12,6 +13,8 @@ type AuthInstance = Auth> let _auth: AuthInstance | null = null let _baseURLInferenceLogged = false +let _databaseSource: 'module' | 'user' = 'module' +let _databaseProvider: EffectiveDatabaseProviderId = 'none' function normalizeLoopbackOrigin(origin: string): string { if (!import.meta.dev) @@ -151,9 +154,14 @@ export function serverAuth(event?: H3Event): AuthInstance { const runtimeConfig = useRuntimeConfig() const siteUrl = getBaseURL(event) + const moduleDatabaseProvider = ( + (runtimeConfig.public?.auth as { databaseProvider?: ModuleDatabaseProviderId } | undefined)?.databaseProvider + ) ?? 'none' - const database = createDatabase() const userConfig = createServerAuth({ runtimeConfig, db }) + const database = userConfig.database ?? createDatabase() + _databaseSource = userConfig.database ? 'user' : 'module' + _databaseProvider = userConfig.database ? 'user' : moduleDatabaseProvider _auth = betterAuth({ ...userConfig, @@ -165,3 +173,11 @@ export function serverAuth(event?: H3Event): AuthInstance { return _auth } + +export function getDatabaseSource(): 'module' | 'user' { + return _databaseSource +} + +export function getDatabaseProvider(): EffectiveDatabaseProviderId { + return _databaseProvider +} diff --git a/src/runtime/types/augment.ts b/src/runtime/types/augment.ts index b17a14e..8a8e92b 100644 --- a/src/runtime/types/augment.ts +++ b/src/runtime/types/augment.ts @@ -44,5 +44,5 @@ export interface UserSessionComposable { fetchSession: (options?: { headers?: HeadersInit, force?: boolean }) => Promise waitForSession: () => Promise signOut: (options?: { onSuccess?: () => void | Promise }) => Promise - updateUser: (updates: Partial) => void + updateUser: (updates: Partial) => Promise } diff --git a/src/runtime/utils/devtools-database.ts b/src/runtime/utils/devtools-database.ts new file mode 100644 index 0000000..eef00e5 --- /dev/null +++ b/src/runtime/utils/devtools-database.ts @@ -0,0 +1,14 @@ +export interface DevtoolsDatabaseEligibilityInput { + databaseProvider?: string | null + databaseSource?: string | null + fallbackModuleProvider?: string | null +} + +export function isDevtoolsDatabaseEligible(input: DevtoolsDatabaseEligibilityInput): boolean { + const { databaseProvider, databaseSource, fallbackModuleProvider } = input + + if (typeof databaseProvider === 'string') + return databaseProvider === 'nuxthub' && databaseSource === 'module' + + return fallbackModuleProvider === 'nuxthub' +} diff --git a/src/schema-generator.ts b/src/schema-generator.ts index fdf7ba2..4da5519 100644 --- a/src/schema-generator.ts +++ b/src/schema-generator.ts @@ -1,8 +1,6 @@ import type { DBAdapter } from '@better-auth/cli/api' import type { BetterAuthOptions } from 'better-auth' -import type { BetterAuthDBSchema, DBFieldAttribute } from 'better-auth/db' import { generateDrizzleSchema as _generateDrizzleSchema } from '@better-auth/cli/api' -import { getAuthTables } from 'better-auth/db' import { consola } from 'consola' export type CasingOption = 'camelCase' | 'snake_case' @@ -59,125 +57,6 @@ declare global { var defineServerAuth: DefineServerAuthFn | undefined } -// Index fields for Convex schema -// Source: @convex-dev/better-auth (https://labs.convex.dev/better-auth) -// Keep in sync with upstream when updating convex-dev/better-auth dependency -const convexIndexFields: Record = { - account: ['accountId', ['accountId', 'providerId'], ['providerId', 'userId']], - rateLimit: ['key'], - session: ['expiresAt', ['expiresAt', 'userId']], - verification: ['expiresAt', 'identifier'], - user: [['email', 'name'], 'name', 'userId'], - passkey: ['credentialID'], - oauthConsent: [['clientId', 'userId']], -} - -function getConvexSpecialFields(tables: BetterAuthDBSchema) { - return Object.fromEntries( - Object.entries(tables) - .map(([key, table]) => { - const fields = Object.fromEntries( - Object.entries(table.fields) - .map(([fieldKey, field]) => [ - field.fieldName ?? fieldKey, - { - ...(field.sortable ? { sortable: true } : {}), - ...(field.unique ? { unique: true } : {}), - ...(field.references ? { references: field.references } : {}), - }, - ]) - .filter(([_key, value]) => typeof value === 'object' ? Object.keys(value).length > 0 : true), - ) - return [key, fields] - }) - .filter(([_key, value]) => typeof value === 'object' ? Object.keys(value).length > 0 : true), - ) -} - -function getMergedConvexIndexFields(tables: BetterAuthDBSchema) { - return Object.fromEntries( - Object.entries(tables).map(([key, table]) => { - const manualIndexes = convexIndexFields[key]?.map((index) => { - return typeof index === 'string' - ? (table.fields[index]?.fieldName ?? index) - : index.map(i => table.fields[i]?.fieldName ?? i) - }) || [] - const specialFieldsObj = getConvexSpecialFields(tables) - const specialFieldIndexes = Object.keys(specialFieldsObj[key] || {}).filter( - index => !manualIndexes.some(m => Array.isArray(m) ? m[0] === index : m === index), - ) - return [key, manualIndexes.concat(specialFieldIndexes)] - }), - ) -} - -export async function generateConvexSchema(authOptions: BetterAuthOptions): Promise { - const tables = getAuthTables(authOptions) - - let code = `/** - * Auto-generated Better Auth tables for Convex. - * Generated at: .nuxt/better-auth/auth-tables.convex.ts - * Import these tables in your convex/schema.ts: - * - * import { defineSchema } from 'convex/server' - * import { authTables } from './path-to-auth-tables.convex' - * - * export default defineSchema({ ...authTables, ...yourTables }) - */ - -import { defineTable } from 'convex/server' -import { v } from 'convex/values' - -export const authTables = { -` - - const getType = (_name: string, field: DBFieldAttribute): string => { - const type = field.type as 'string' | 'number' | 'boolean' | 'date' | 'json' | 'string[]' | 'number[]' - const typeMap: Record = { - 'string': 'v.string()', - 'boolean': 'v.boolean()', - 'number': 'v.number()', - 'date': 'v.number()', - 'json': 'v.string()', - 'number[]': 'v.array(v.number())', - 'string[]': 'v.array(v.string())', - } - return typeMap[type] - } - - for (const tableKey in tables) { - const table = tables[tableKey]! - const modelName = table.modelName - - // No id fields in Convex schema - const fields = Object.fromEntries(Object.entries(table.fields).filter(([key]) => key !== 'id')) - - const indexes = getMergedConvexIndexFields(tables)[tableKey]?.map((index) => { - const indexArray = Array.isArray(index) ? index.sort() : [index] - const indexName = indexArray.join('_') - return `.index('${indexName}', ${JSON.stringify(indexArray)})` - }) || [] - - const schema = `${modelName}: defineTable({ -${Object.keys(fields) - .map((field) => { - const attr = fields[field]! - const type = getType(field, attr as DBFieldAttribute) - const optional = (fieldSchema: string) => - attr.required ? fieldSchema : `v.optional(v.union(v.null(), ${fieldSchema}))` - return ` ${attr.fieldName ?? field}: ${optional(type)},` - }) - .join('\n')} - })${indexes.length > 0 ? `\n ${indexes.join('\n ')}` : ''},\n` - code += ` ${schema}` - } - - code += `} -` - - return code -} - export async function loadUserAuthConfig(configPath: string, throwOnError = false): Promise> { const { createJiti } = await import('jiti') const { defineServerAuth } = await import('./runtime/config') diff --git a/src/types/hooks.ts b/src/types/hooks.ts index a693c1a..6dfc69f 100644 --- a/src/types/hooks.ts +++ b/src/types/hooks.ts @@ -1,4 +1,30 @@ +import type { Nuxt } from '@nuxt/schema' import type { BetterAuthOptions } from 'better-auth' +import type { DbDialect } from '../module/hub' +import type { BetterAuthModuleOptions } from '../runtime/config' + +export interface BetterAuthDatabaseProviderBuildContext { + hubDialect: DbDialect + usePlural: boolean + camelCase: boolean +} + +export interface BetterAuthDatabaseProviderSetupContext { + nuxt: Nuxt + options: BetterAuthModuleOptions + clientOnly: boolean +} + +export interface BetterAuthDatabaseProviderEnabledContext extends BetterAuthDatabaseProviderSetupContext { + hasHubDbAvailable: boolean +} + +export interface BetterAuthDatabaseProviderDefinition { + buildDatabaseCode: (ctx: BetterAuthDatabaseProviderBuildContext) => string + setup?: (ctx: BetterAuthDatabaseProviderSetupContext) => void | Promise + isEnabled?: (ctx: BetterAuthDatabaseProviderEnabledContext) => boolean + priority?: number +} declare module '@nuxt/schema' { interface NuxtHooks { @@ -8,5 +34,11 @@ declare module '@nuxt/schema' { * @param config - Partial config to merge into the auth options */ 'better-auth:config:extend': (config: Partial) => void | Promise + + /** + * Register or override Better Auth database providers. + * Providers are auto-selected via `isEnabled` + `priority`. + */ + 'better-auth:database:providers': (providers: Record) => void | Promise } } diff --git a/test/cases/core-auth/server/api/test/config.get.ts b/test/cases/core-auth/server/api/test/config.get.ts index 52ec076..274510a 100644 --- a/test/cases/core-auth/server/api/test/config.get.ts +++ b/test/cases/core-auth/server/api/test/config.get.ts @@ -1,9 +1,12 @@ -export default defineEventHandler(() => { - const runtimeConfig = useRuntimeConfig() - const auth = runtimeConfig.public.auth as { useDatabase?: boolean, databaseProvider?: string } | undefined +import { getDatabaseProvider, getDatabaseSource, serverAuth } from '../../../../../../src/runtime/server/utils/auth' + +export default defineEventHandler((event) => { + serverAuth(event) + const databaseProvider = getDatabaseProvider() return { - useDatabase: auth?.useDatabase ?? false, - databaseProvider: auth?.databaseProvider ?? 'none', + useDatabase: databaseProvider !== 'none', + databaseProvider, + databaseSource: getDatabaseSource(), } }) diff --git a/test/cases/database-less/server/api/test/config.get.ts b/test/cases/database-less/server/api/test/config.get.ts index 52ec076..274510a 100644 --- a/test/cases/database-less/server/api/test/config.get.ts +++ b/test/cases/database-less/server/api/test/config.get.ts @@ -1,9 +1,12 @@ -export default defineEventHandler(() => { - const runtimeConfig = useRuntimeConfig() - const auth = runtimeConfig.public.auth as { useDatabase?: boolean, databaseProvider?: string } | undefined +import { getDatabaseProvider, getDatabaseSource, serverAuth } from '../../../../../../src/runtime/server/utils/auth' + +export default defineEventHandler((event) => { + serverAuth(event) + const databaseProvider = getDatabaseProvider() return { - useDatabase: auth?.useDatabase ?? false, - databaseProvider: auth?.databaseProvider ?? 'none', + useDatabase: databaseProvider !== 'none', + databaseProvider, + databaseSource: getDatabaseSource(), } }) diff --git a/test/cases/manual-db-no-module/.nuxtrc b/test/cases/manual-db-no-module/.nuxtrc new file mode 100644 index 0000000..749fbc6 --- /dev/null +++ b/test/cases/manual-db-no-module/.nuxtrc @@ -0,0 +1 @@ +setups.@onmax/nuxt-better-auth="0.0.2-alpha.21" diff --git a/test/cases/manual-db-no-module/app/app.vue b/test/cases/manual-db-no-module/app/app.vue new file mode 100644 index 0000000..8f62b8b --- /dev/null +++ b/test/cases/manual-db-no-module/app/app.vue @@ -0,0 +1,3 @@ + diff --git a/test/cases/manual-db-no-module/app/auth.config.ts b/test/cases/manual-db-no-module/app/auth.config.ts new file mode 100644 index 0000000..ce985ee --- /dev/null +++ b/test/cases/manual-db-no-module/app/auth.config.ts @@ -0,0 +1,3 @@ +import { defineClientAuth } from '../../../../src/runtime/config' + +export default defineClientAuth({}) diff --git a/test/cases/manual-db-no-module/nuxt.config.ts b/test/cases/manual-db-no-module/nuxt.config.ts new file mode 100644 index 0000000..e8fb009 --- /dev/null +++ b/test/cases/manual-db-no-module/nuxt.config.ts @@ -0,0 +1,10 @@ +export default defineNuxtConfig({ + modules: ['../../../src/module'], + runtimeConfig: { + betterAuthSecret: 'test-secret-for-testing-only-32chars!', + public: { siteUrl: 'http://localhost:3000' }, + }, + auth: { + redirects: { login: '/login', guest: '/' }, + }, +}) diff --git a/test/cases/manual-db-no-module/server/api/test/config.get.ts b/test/cases/manual-db-no-module/server/api/test/config.get.ts new file mode 100644 index 0000000..274510a --- /dev/null +++ b/test/cases/manual-db-no-module/server/api/test/config.get.ts @@ -0,0 +1,12 @@ +import { getDatabaseProvider, getDatabaseSource, serverAuth } from '../../../../../../src/runtime/server/utils/auth' + +export default defineEventHandler((event) => { + serverAuth(event) + const databaseProvider = getDatabaseProvider() + + return { + useDatabase: databaseProvider !== 'none', + databaseProvider, + databaseSource: getDatabaseSource(), + } +}) diff --git a/test/cases/manual-db-no-module/server/auth.config.ts b/test/cases/manual-db-no-module/server/auth.config.ts new file mode 100644 index 0000000..d2dbed4 --- /dev/null +++ b/test/cases/manual-db-no-module/server/auth.config.ts @@ -0,0 +1,18 @@ +import { memoryAdapter } from 'better-auth/adapters/memory' +import { defineServerAuth } from '../../../../src/runtime/config' + +const memoryDb = { + user: [], + session: [], + account: [], + verification: [], + rateLimit: [], +} + +export default defineServerAuth({ + appName: 'Manual DB No Module Provider', + database: memoryAdapter(memoryDb), + socialProviders: { + github: { clientId: 'test', clientSecret: 'test' }, + }, +}) diff --git a/test/cases/manual-db/.nuxtrc b/test/cases/manual-db/.nuxtrc new file mode 100644 index 0000000..c85c9d1 --- /dev/null +++ b/test/cases/manual-db/.nuxtrc @@ -0,0 +1 @@ +setups.@onmax/nuxt-better-auth="0.0.2-alpha.21" \ No newline at end of file diff --git a/test/cases/manual-db/app/app.vue b/test/cases/manual-db/app/app.vue new file mode 100644 index 0000000..8f62b8b --- /dev/null +++ b/test/cases/manual-db/app/app.vue @@ -0,0 +1,3 @@ + diff --git a/test/cases/manual-db/app/auth.config.ts b/test/cases/manual-db/app/auth.config.ts new file mode 100644 index 0000000..ce985ee --- /dev/null +++ b/test/cases/manual-db/app/auth.config.ts @@ -0,0 +1,3 @@ +import { defineClientAuth } from '../../../../src/runtime/config' + +export default defineClientAuth({}) diff --git a/test/cases/manual-db/nuxt.config.ts b/test/cases/manual-db/nuxt.config.ts new file mode 100644 index 0000000..07fc56b --- /dev/null +++ b/test/cases/manual-db/nuxt.config.ts @@ -0,0 +1,11 @@ +export default defineNuxtConfig({ + modules: ['@nuxthub/core', '../../../src/module'], + hub: { db: 'sqlite' }, + runtimeConfig: { + betterAuthSecret: 'test-secret-for-testing-only-32chars!', + public: { siteUrl: 'http://localhost:3000' }, + }, + auth: { + redirects: { login: '/login', guest: '/' }, + }, +}) diff --git a/test/cases/manual-db/server/api/test/config.get.ts b/test/cases/manual-db/server/api/test/config.get.ts new file mode 100644 index 0000000..274510a --- /dev/null +++ b/test/cases/manual-db/server/api/test/config.get.ts @@ -0,0 +1,12 @@ +import { getDatabaseProvider, getDatabaseSource, serverAuth } from '../../../../../../src/runtime/server/utils/auth' + +export default defineEventHandler((event) => { + serverAuth(event) + const databaseProvider = getDatabaseProvider() + + return { + useDatabase: databaseProvider !== 'none', + databaseProvider, + databaseSource: getDatabaseSource(), + } +}) diff --git a/test/cases/manual-db/server/auth.config.ts b/test/cases/manual-db/server/auth.config.ts new file mode 100644 index 0000000..b9f8b32 --- /dev/null +++ b/test/cases/manual-db/server/auth.config.ts @@ -0,0 +1,18 @@ +import { memoryAdapter } from 'better-auth/adapters/memory' +import { defineServerAuth } from '../../../../src/runtime/config' + +const memoryDb = { + user: [], + session: [], + account: [], + verification: [], + rateLimit: [], +} + +export default defineServerAuth({ + appName: 'Manual DB Precedence App', + database: memoryAdapter(memoryDb), + socialProviders: { + github: { clientId: 'test', clientSecret: 'test' }, + }, +}) diff --git a/test/cases/plugins-type-inference/server/auth.config.ts b/test/cases/plugins-type-inference/server/auth.config.ts index c55110d..5afc11f 100644 --- a/test/cases/plugins-type-inference/server/auth.config.ts +++ b/test/cases/plugins-type-inference/server/auth.config.ts @@ -25,7 +25,7 @@ function customAdminLikePlugin() { export default defineServerAuth({ emailAndPassword: { enabled: true }, - plugins: [customAdminLikePlugin()], + plugins: [customAdminLikePlugin()] as const, user: { additionalFields: { internalCode: { diff --git a/test/database-provider.test.ts b/test/database-provider.test.ts index e64f905..9b17a47 100644 --- a/test/database-provider.test.ts +++ b/test/database-provider.test.ts @@ -1,92 +1,89 @@ +import type { BetterAuthDatabaseProviderDefinition, BetterAuthDatabaseProviderEnabledContext } from '../src/types/hooks' import { describe, expect, it } from 'vitest' import { resolveDatabaseProvider } from '../src/database-provider' +function createContext(input: Partial = {}): BetterAuthDatabaseProviderEnabledContext { + return { + nuxt: {} as BetterAuthDatabaseProviderEnabledContext['nuxt'], + options: {}, + clientOnly: false, + hasHubDbAvailable: false, + ...input, + } +} + +function createProvider(partial: Partial = {}): BetterAuthDatabaseProviderDefinition { + return { + buildDatabaseCode: () => 'export function createDatabase() { return undefined }', + ...partial, + } +} + describe('resolveDatabaseProvider', () => { - it('returns nuxthub when explicitly selected and available', () => { - expect(resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: true, - hasConvexModule: false, - convexUrl: '', - selectedProvider: 'nuxthub', - })).toEqual({ provider: 'nuxthub', convexUrl: '' }) - }) + it('selects nuxthub when hub db is available', () => { + const providers = { + none: createProvider({ priority: 0 }), + nuxthub: createProvider({ + priority: 100, + isEnabled: ({ hasHubDbAvailable }) => hasHubDbAvailable, + }), + } - it('throws when nuxthub is explicitly selected but hub db is unavailable', () => { - expect(() => resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: false, - hasConvexModule: false, - convexUrl: '', - selectedProvider: 'nuxthub', - })).toThrow('@nuxthub/core with hub.db is not configured') - }) + const resolved = resolveDatabaseProvider({ + providers, + context: createContext({ hasHubDbAvailable: true }), + }) - it('returns convex when explicitly selected with valid context', () => { - expect(resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: false, - hasConvexModule: true, - convexUrl: 'https://example.convex.cloud', - selectedProvider: 'convex', - })).toEqual({ provider: 'convex', convexUrl: 'https://example.convex.cloud' }) + expect(resolved.id).toBe('nuxthub') }) - it('throws when convex is selected in clientOnly mode', () => { - expect(() => resolveDatabaseProvider({ - clientOnly: true, - hasHubDb: false, - hasConvexModule: true, - convexUrl: 'https://example.convex.cloud', - selectedProvider: 'convex', - })).toThrow('"convex" is not available in clientOnly mode') - }) + it('falls back to none when hub db is unavailable', () => { + const providers = { + none: createProvider({ priority: 0 }), + nuxthub: createProvider({ + priority: 100, + isEnabled: ({ hasHubDbAvailable }) => hasHubDbAvailable, + }), + } - it('throws when convex is selected but module is missing', () => { - expect(() => resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: false, - hasConvexModule: false, - convexUrl: 'https://example.convex.cloud', - selectedProvider: 'convex', - })).toThrow('nuxt-convex is not installed') - }) + const resolved = resolveDatabaseProvider({ + providers, + context: createContext({ hasHubDbAvailable: false }), + }) - it('throws when convex is selected and URL is missing', () => { - expect(() => resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: false, - hasConvexModule: true, - convexUrl: '', - selectedProvider: 'convex', - })).toThrow('no Convex URL was found') + expect(resolved.id).toBe('none') }) - it('returns none when explicitly selected', () => { - expect(resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: true, - hasConvexModule: true, - convexUrl: 'https://example.convex.cloud', - selectedProvider: 'none', - })).toEqual({ provider: 'none', convexUrl: '' }) - }) + it('prefers a higher-priority external provider when enabled', () => { + const providers = { + none: createProvider({ priority: 0 }), + nuxthub: createProvider({ + priority: 100, + isEnabled: ({ hasHubDbAvailable }) => hasHubDbAvailable, + }), + external: createProvider({ + priority: 200, + isEnabled: () => true, + }), + } - it('auto-selects nuxthub when hub db is available', () => { - expect(resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: true, - hasConvexModule: false, - convexUrl: '', - })).toEqual({ provider: 'nuxthub', convexUrl: '' }) + const resolved = resolveDatabaseProvider({ + providers, + context: createContext({ hasHubDbAvailable: true }), + }) + + expect(resolved.id).toBe('external') }) - it('auto-selects none when hub db is unavailable', () => { - expect(resolveDatabaseProvider({ - clientOnly: false, - hasHubDb: false, - hasConvexModule: true, - convexUrl: 'https://example.convex.cloud', - })).toEqual({ provider: 'none', convexUrl: '' }) + it('throws when no provider is enabled', () => { + const providers = { + nuxthub: createProvider({ isEnabled: () => false }), + external: createProvider({ isEnabled: () => false }), + } + + expect(() => resolveDatabaseProvider({ + providers, + context: createContext(), + })).toThrow('No database provider is enabled') }) }) diff --git a/test/devtools-database-eligibility.test.ts b/test/devtools-database-eligibility.test.ts new file mode 100644 index 0000000..80b41bf --- /dev/null +++ b/test/devtools-database-eligibility.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from 'vitest' +import { isDevtoolsDatabaseEligible } from '../src/runtime/utils/devtools-database' + +describe('isDevtoolsDatabaseEligible', () => { + it('returns true for nuxthub + module', () => { + expect(isDevtoolsDatabaseEligible({ + databaseProvider: 'nuxthub', + databaseSource: 'module', + })).toBe(true) + }) + + it('returns false for nuxthub + user', () => { + expect(isDevtoolsDatabaseEligible({ + databaseProvider: 'nuxthub', + databaseSource: 'user', + })).toBe(false) + }) + + it('returns false for custom provider + module', () => { + expect(isDevtoolsDatabaseEligible({ + databaseProvider: 'custom-db', + databaseSource: 'module', + })).toBe(false) + }) + + it('returns false for none provider', () => { + expect(isDevtoolsDatabaseEligible({ + databaseProvider: 'none', + databaseSource: 'module', + })).toBe(false) + }) + + it('returns true from fallback nuxthub provider when config is unavailable', () => { + expect(isDevtoolsDatabaseEligible({ + fallbackModuleProvider: 'nuxthub', + })).toBe(true) + }) + + it('returns false from fallback none/custom provider', () => { + expect(isDevtoolsDatabaseEligible({ + fallbackModuleProvider: 'none', + })).toBe(false) + + expect(isDevtoolsDatabaseEligible({ + fallbackModuleProvider: 'custom-db', + })).toBe(false) + }) +}) diff --git a/test/exports/module.yaml b/test/exports/module.yaml index 48972f2..bab0f66 100644 --- a/test/exports/module.yaml +++ b/test/exports/module.yaml @@ -5,5 +5,3 @@ ./config: defineClientAuth: function defineServerAuth: function -./adapters/convex: - createConvexHttpAdapter: function diff --git a/test/fixtures/convex-url-option-removed/.nuxtrc b/test/fixtures/convex-url-option-removed/.nuxtrc new file mode 100644 index 0000000..749fbc6 --- /dev/null +++ b/test/fixtures/convex-url-option-removed/.nuxtrc @@ -0,0 +1 @@ +setups.@onmax/nuxt-better-auth="0.0.2-alpha.21" diff --git a/test/fixtures/convex-url-option-removed/app/auth.config.ts b/test/fixtures/convex-url-option-removed/app/auth.config.ts new file mode 100644 index 0000000..ce985ee --- /dev/null +++ b/test/fixtures/convex-url-option-removed/app/auth.config.ts @@ -0,0 +1,3 @@ +import { defineClientAuth } from '../../../../src/runtime/config' + +export default defineClientAuth({}) diff --git a/test/fixtures/convex-url-option-removed/nuxt.config.ts b/test/fixtures/convex-url-option-removed/nuxt.config.ts new file mode 100644 index 0000000..dbb4670 --- /dev/null +++ b/test/fixtures/convex-url-option-removed/nuxt.config.ts @@ -0,0 +1,12 @@ +export default defineNuxtConfig({ + modules: ['../../../src/module'], + runtimeConfig: { + betterAuthSecret: 'test-secret-for-testing-only-32chars!', + public: { siteUrl: 'http://localhost:3000' }, + }, + auth: { + database: { + convexUrl: 'https://example.convex.cloud', + }, + }, +}) diff --git a/test/fixtures/convex-url-option-removed/server/auth.config.ts b/test/fixtures/convex-url-option-removed/server/auth.config.ts new file mode 100644 index 0000000..dcafab6 --- /dev/null +++ b/test/fixtures/convex-url-option-removed/server/auth.config.ts @@ -0,0 +1,8 @@ +import { defineServerAuth } from '../../../../src/runtime/config' + +export default defineServerAuth({ + appName: 'Removed Convex URL Option', + socialProviders: { + github: { clientId: 'test', clientSecret: 'test' }, + }, +}) diff --git a/test/fixtures/mixed-database-options-removed/.nuxtrc b/test/fixtures/mixed-database-options-removed/.nuxtrc new file mode 100644 index 0000000..749fbc6 --- /dev/null +++ b/test/fixtures/mixed-database-options-removed/.nuxtrc @@ -0,0 +1 @@ +setups.@onmax/nuxt-better-auth="0.0.2-alpha.21" diff --git a/test/fixtures/mixed-database-options-removed/app/auth.config.ts b/test/fixtures/mixed-database-options-removed/app/auth.config.ts new file mode 100644 index 0000000..ce985ee --- /dev/null +++ b/test/fixtures/mixed-database-options-removed/app/auth.config.ts @@ -0,0 +1,3 @@ +import { defineClientAuth } from '../../../../src/runtime/config' + +export default defineClientAuth({}) diff --git a/test/fixtures/mixed-database-options-removed/nuxt.config.ts b/test/fixtures/mixed-database-options-removed/nuxt.config.ts new file mode 100644 index 0000000..6970149 --- /dev/null +++ b/test/fixtures/mixed-database-options-removed/nuxt.config.ts @@ -0,0 +1,13 @@ +export default defineNuxtConfig({ + modules: ['../../../src/module'], + runtimeConfig: { + betterAuthSecret: 'test-secret-for-testing-only-32chars!', + public: { siteUrl: 'http://localhost:3000' }, + }, + auth: { + database: { + provider: 'nuxthub', + convexUrl: 'https://example.convex.cloud', + }, + }, +}) diff --git a/test/fixtures/mixed-database-options-removed/server/auth.config.ts b/test/fixtures/mixed-database-options-removed/server/auth.config.ts new file mode 100644 index 0000000..33ab282 --- /dev/null +++ b/test/fixtures/mixed-database-options-removed/server/auth.config.ts @@ -0,0 +1,8 @@ +import { defineServerAuth } from '../../../../src/runtime/config' + +export default defineServerAuth({ + appName: 'Removed Mixed Database Options', + socialProviders: { + github: { clientId: 'test', clientSecret: 'test' }, + }, +}) diff --git a/test/fixtures/provider-option-removed/.nuxtrc b/test/fixtures/provider-option-removed/.nuxtrc new file mode 100644 index 0000000..c85c9d1 --- /dev/null +++ b/test/fixtures/provider-option-removed/.nuxtrc @@ -0,0 +1 @@ +setups.@onmax/nuxt-better-auth="0.0.2-alpha.21" \ No newline at end of file diff --git a/test/fixtures/provider-option-removed/app/auth.config.ts b/test/fixtures/provider-option-removed/app/auth.config.ts new file mode 100644 index 0000000..ce985ee --- /dev/null +++ b/test/fixtures/provider-option-removed/app/auth.config.ts @@ -0,0 +1,3 @@ +import { defineClientAuth } from '../../../../src/runtime/config' + +export default defineClientAuth({}) diff --git a/test/fixtures/provider-option-removed/nuxt.config.ts b/test/fixtures/provider-option-removed/nuxt.config.ts new file mode 100644 index 0000000..0c4444a --- /dev/null +++ b/test/fixtures/provider-option-removed/nuxt.config.ts @@ -0,0 +1,12 @@ +export default defineNuxtConfig({ + modules: ['../../../src/module'], + runtimeConfig: { + betterAuthSecret: 'test-secret-for-testing-only-32chars!', + public: { siteUrl: 'http://localhost:3000' }, + }, + auth: { + database: { + provider: 'nuxthub', + }, + }, +}) diff --git a/test/fixtures/provider-option-removed/server/auth.config.ts b/test/fixtures/provider-option-removed/server/auth.config.ts new file mode 100644 index 0000000..7dc83f7 --- /dev/null +++ b/test/fixtures/provider-option-removed/server/auth.config.ts @@ -0,0 +1,8 @@ +import { defineServerAuth } from '../../../../src/runtime/config' + +export default defineServerAuth({ + appName: 'Removed Provider Option', + socialProviders: { + github: { clientId: 'test', clientSecret: 'test' }, + }, +}) diff --git a/test/manual-db-no-module-provider.test.ts b/test/manual-db-no-module-provider.test.ts new file mode 100644 index 0000000..3961a33 --- /dev/null +++ b/test/manual-db-no-module-provider.test.ts @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'node:url' +import { $fetch, setup } from '@nuxt/test-utils/e2e' +import { describe, expect, it } from 'vitest' + +describe('manual Better Auth database without module provider', async () => { + await setup({ + rootDir: fileURLToPath(new URL('./cases/manual-db-no-module', import.meta.url)), + }) + + it('reports effective user database metadata', async () => { + const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string, databaseSource: 'module' | 'user' } + expect(response.useDatabase).toBe(true) + expect(response.databaseProvider).toBe('user') + expect(response.databaseSource).toBe('user') + }) +}) diff --git a/test/manual-db-precedence.test.ts b/test/manual-db-precedence.test.ts new file mode 100644 index 0000000..8139f84 --- /dev/null +++ b/test/manual-db-precedence.test.ts @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'node:url' +import { $fetch, setup } from '@nuxt/test-utils/e2e' +import { describe, expect, it } from 'vitest' + +describe('manual Better Auth database precedence', async () => { + await setup({ + rootDir: fileURLToPath(new URL('./cases/manual-db', import.meta.url)), + }) + + it('uses user-configured database over module auto provider', async () => { + const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string, databaseSource: 'module' | 'user' } + expect(response.useDatabase).toBe(true) + expect(response.databaseProvider).toBe('user') + expect(response.databaseSource).toBe('user') + }) +}) diff --git a/test/module.test.ts b/test/module.test.ts index 52ed6f8..4f95fb5 100644 --- a/test/module.test.ts +++ b/test/module.test.ts @@ -20,9 +20,10 @@ describe('nuxt-better-auth module', async () => { }) it('exposes runtime database metadata as nuxthub', async () => { - const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string } + const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string, databaseSource: 'module' | 'user' } expect(response.useDatabase).toBe(true) expect(response.databaseProvider).toBe('nuxthub') + expect(response.databaseSource).toBe('module') }) }) diff --git a/test/no-db.test.ts b/test/no-db.test.ts index b65774d..4698358 100644 --- a/test/no-db.test.ts +++ b/test/no-db.test.ts @@ -18,8 +18,9 @@ describe('no-db mode (NuxtHub without database)', async () => { }) it('exposes runtime database metadata as none', async () => { - const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string } + const response = await $fetch('/api/test/config') as { useDatabase: boolean, databaseProvider: string, databaseSource: 'module' | 'user' } expect(response.useDatabase).toBe(false) expect(response.databaseProvider).toBe('none') + expect(response.databaseSource).toBe('module') }) }) diff --git a/test/provider-option-removed.test.ts b/test/provider-option-removed.test.ts new file mode 100644 index 0000000..fdee931 --- /dev/null +++ b/test/provider-option-removed.test.ts @@ -0,0 +1,49 @@ +import { fileURLToPath } from 'node:url' +import { x } from 'tinyexec' +import { describe, expect, it } from 'vitest' + +const cases = [ + { + name: 'provider', + fixture: './fixtures/provider-option-removed', + expectedKeys: ['auth.database.provider'], + expectedRemoveList: 'Remove: auth.database.provider', + }, + { + name: 'convexUrl', + fixture: './fixtures/convex-url-option-removed', + expectedKeys: ['auth.database.convexUrl'], + expectedRemoveList: 'Remove: auth.database.convexUrl', + }, + { + name: 'mixed database options', + fixture: './fixtures/mixed-database-options-removed', + expectedKeys: ['auth.database.convexUrl', 'auth.database.provider'], + expectedRemoveList: 'Remove: auth.database.convexUrl, auth.database.provider', + }, +] as const + +describe('removed auth.database.* options', () => { + it.each(cases)('throws a migration error when $name is configured', async ({ fixture, expectedKeys, expectedRemoveList }) => { + const fixtureDir = fileURLToPath(new URL(fixture, import.meta.url)) + const nuxiBin = fileURLToPath(new URL('../node_modules/.bin/nuxi', import.meta.url)) + + const res = await x(nuxiBin, ['prepare'], { + nodeOptions: { + cwd: fixtureDir, + env: { + ...process.env, + CI: '1', + }, + }, + throwOnError: false, + }) + + expect(res.exitCode).not.toBe(0) + const output = `${res.stdout}\n${res.stderr}` + expect(output).toContain('auth.database options have been removed') + expect(output).toContain(expectedRemoveList) + for (const key of expectedKeys) + expect(output).toContain(key) + }, 60_000) +}) diff --git a/test/schema-generator.test.ts b/test/schema-generator.test.ts index bc6e456..e8788cf 100644 --- a/test/schema-generator.test.ts +++ b/test/schema-generator.test.ts @@ -1,10 +1,9 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs' import { join } from 'node:path' import { getAuthTables } from 'better-auth/db' -import { twoFactor } from 'better-auth/plugins' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { defineClientAuth, defineServerAuth } from '../src/runtime/config' -import { generateConvexSchema, generateDrizzleSchema, loadUserAuthConfig } from '../src/schema-generator' +import { generateDrizzleSchema, loadUserAuthConfig } from '../src/schema-generator' const TEST_DIR = join(import.meta.dirname, '.test-configs') @@ -93,17 +92,6 @@ describe('getAuthTables with secondaryStorage', () => { }) }) -describe('generateConvexSchema', () => { - it('includes plugin tables when plugin config is merged', async () => { - const userConfig = {} - const extendedPlugins = [twoFactor()] - const authOptions = { ...userConfig, plugins: extendedPlugins } - const schema = await generateConvexSchema(authOptions) - - expect(schema).toContain('twoFactor: defineTable') - }) -}) - describe('loadUserAuthConfig', () => { it('returns empty object for non-existent file (dev mode)', async () => { const result = await loadUserAuthConfig(join(TEST_DIR, 'nonexistent.ts'), false) @@ -153,21 +141,21 @@ describe('defineServerAuth', () => { it('accepts object syntax and returns config factory', () => { const factory = defineServerAuth({ appName: 'Test', emailAndPassword: { enabled: true } }) expect(typeof factory).toBe('function') - const config = factory({ runtimeConfig: {} as any, db: null }) + const config = factory({ runtimeConfig: {} as any, db: undefined }) expect(config).toEqual({ appName: 'Test', emailAndPassword: { enabled: true } }) }) it('accepts function syntax and returns config factory', () => { const factory = defineServerAuth(ctx => ({ appName: 'Dynamic', runtimeBased: !!ctx.runtimeConfig })) expect(typeof factory).toBe('function') - const config = factory({ runtimeConfig: { public: {} } as any, db: null }) + const config = factory({ runtimeConfig: { public: {} } as any, db: undefined }) expect(config).toEqual({ appName: 'Dynamic', runtimeBased: true }) }) it('function syntax receives context', () => { - const factory = defineServerAuth(({ db }) => ({ hasDb: db !== null })) + const factory = defineServerAuth(({ db }) => ({ hasDb: db !== undefined })) expect(factory({ runtimeConfig: {} as any, db: {} as any })).toEqual({ hasDb: true }) - expect(factory({ runtimeConfig: {} as any, db: null })).toEqual({ hasDb: false }) + expect(factory({ runtimeConfig: {} as any, db: undefined })).toEqual({ hasDb: false }) }) }) diff --git a/test/use-user-session.test.ts b/test/use-user-session.test.ts index d74cce2..b9ec3c2 100644 --- a/test/use-user-session.test.ts +++ b/test/use-user-session.test.ts @@ -36,7 +36,7 @@ const sessionAtom = ref({ error: null, }) -const mockClient = { +const mockClient: Record = { useSession: vi.fn(() => sessionAtom), getSession: vi.fn(async () => ({ data: null })), $store: { @@ -108,6 +108,7 @@ describe('useUserSession hydration bootstrap', () => { mockClient.getSession.mockClear() mockClient.$store.listen.mockClear() mockClient.signOut.mockClear() + mockClient.updateUser = undefined mockClient.signIn.social.mockClear() mockClient.signIn.email.mockClear() mockClient.signUp.email.mockClear() @@ -203,6 +204,50 @@ describe('useUserSession hydration bootstrap', () => { expect(auth.user.value).toEqual({ id: 'user-2', email: 'user@example.com' }) }) + it('updateUser persists on client and updates local state optimistically', async () => { + mockClient.updateUser = vi.fn(async () => ({ data: { status: true } })) + const useUserSession = await loadUseUserSession() + const auth = useUserSession() + auth.user.value = { id: 'user-1', name: 'Old', email: 'a@b.com' } + + await auth.updateUser({ name: 'New' }) + + expect(mockClient.updateUser).toHaveBeenCalledWith({ name: 'New' }) + expect(auth.user.value!.name).toBe('New') + }) + + it('updateUser reverts local state when the server call throws', async () => { + mockClient.updateUser = vi.fn(async () => { + throw new Error('fail') + }) + const useUserSession = await loadUseUserSession() + const auth = useUserSession() + auth.user.value = { id: 'user-1', name: 'Old', email: 'a@b.com' } + + await expect(auth.updateUser({ name: 'New' })).rejects.toThrow('fail') + expect(auth.user.value!.name).toBe('Old') + }) + + it('updateUser reverts local state when server returns an error payload', async () => { + mockClient.updateUser = vi.fn(async () => ({ error: { message: 'invalid user update' } })) + const useUserSession = await loadUseUserSession() + const auth = useUserSession() + auth.user.value = { id: 'user-1', name: 'Old', email: 'a@b.com' } + + await expect(auth.updateUser({ name: 'New' })).rejects.toThrow('invalid user update') + expect(auth.user.value!.name).toBe('Old') + }) + + it('updateUser only updates local state on server (no client)', async () => { + setRuntimeFlags({ client: false, server: true }) + const useUserSession = await loadUseUserSession() + const auth = useUserSession() + auth.user.value = { id: 'user-1', name: 'Old', email: 'a@b.com' } + + await auth.updateUser({ name: 'New' }) + expect(auth.user.value!.name).toBe('New') + }) + it('syncs session on $sessionSignal when option is enabled and SSR payload is hydrated', async () => { payload.serverRendered = true runtimeConfig.public.auth.session.skipHydratedSsrGetSession = true