diff --git a/docs/start/config.json b/docs/start/config.json index d0215c67184..0dc894fa0c4 100644 --- a/docs/start/config.json +++ b/docs/start/config.json @@ -338,6 +338,10 @@ "label": "Basic + Supabase", "to": "framework/solid/examples/start-basic-supabase" }, + { + "label": "Bare + Convex + Better Auth", + "to": "framework/solid/examples/start-convex-better-auth" + }, { "label": "Cloudflare Vite Plugin", "to": "framework/solid/examples/start-basic-cloudflare" diff --git a/examples/solid/start-convex-better-auth/.env.example b/examples/solid/start-convex-better-auth/.env.example new file mode 100644 index 00000000000..7b3fe32b0a9 --- /dev/null +++ b/examples/solid/start-convex-better-auth/.env.example @@ -0,0 +1,10 @@ +# Deployment used by `npx convex dev` +CONVEX_DEPLOYMENT= + +VITE_CONVEX_URL= + +# Same as VITE_CONVEX_URL but ends in .site +VITE_CONVEX_SITE_URL= + +# Your local site URL +SITE_URL=http://localhost:3000 \ No newline at end of file diff --git a/examples/solid/start-convex-better-auth/.gitignore b/examples/solid/start-convex-better-auth/.gitignore new file mode 100644 index 00000000000..3edd24c5f68 --- /dev/null +++ b/examples/solid/start-convex-better-auth/.gitignore @@ -0,0 +1,3 @@ + +.env.local +/convex/_generated/ \ No newline at end of file diff --git a/examples/solid/start-convex-better-auth/README.md b/examples/solid/start-convex-better-auth/README.md new file mode 100644 index 00000000000..184dabcd397 --- /dev/null +++ b/examples/solid/start-convex-better-auth/README.md @@ -0,0 +1,15 @@ +### Guide + +Rename .env.example to .env.local + +Run + +- `pnpm i` +- `pnpx convex dev` +- `pnpx convex env set SITE_URL http://localhost:3000/` +- `pnpx convex env set BETTER_AUTH_SECRET=$(openssl rand -base64 32)` +- `pnpx convex dev` - takes up one terminal + +In a separate terminal run + +- `pnpm run dev` diff --git a/examples/solid/start-convex-better-auth/convex/README.md b/examples/solid/start-convex-better-auth/convex/README.md new file mode 100644 index 00000000000..896489de6ad --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/README.md @@ -0,0 +1,90 @@ +# Welcome to your Convex functions directory! + +Write your Convex functions here. +See https://docs.convex.dev/functions for more. + +A query function that takes two arguments looks like: + +```ts +// functions.js +import { query } from './_generated/server' +import { v } from 'convex/values' + +export const myQueryFunction = query({ + // Validators for arguments. + args: { + first: v.number(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Read the database as many times as you need here. + // See https://docs.convex.dev/database/reading-data. + const documents = await ctx.db.query('tablename').collect() + + // Arguments passed from the client are properties of the args object. + console.log(args.first, args.second) + + // Write arbitrary JavaScript here: filter, aggregate, build derived data, + // remove non-public properties, or create new objects. + return documents + }, +}) +``` + +Using this query function in a React component looks like: + +```ts +const data = useQuery(api.functions.myQueryFunction, { + first: 10, + second: 'hello', +}) +``` + +A mutation function looks like: + +```ts +// functions.js +import { mutation } from './_generated/server' +import { v } from 'convex/values' + +export const myMutationFunction = mutation({ + // Validators for arguments. + args: { + first: v.string(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Insert or modify documents in the database here. + // Mutations can also read from the database like queries. + // See https://docs.convex.dev/database/writing-data. + const message = { body: args.first, author: args.second } + const id = await ctx.db.insert('messages', message) + + // Optionally, return a value from your mutation. + return await ctx.db.get(id) + }, +}) +``` + +Using this mutation function in a React component looks like: + +```ts +const mutation = useMutation(api.functions.myMutationFunction) +function handleButtonPress() { + // fire and forget, the most common way to use mutations + mutation({ first: 'Hello!', second: 'me' }) + // OR + // use the result once the mutation has completed + mutation({ first: 'Hello!', second: 'me' }).then((result) => + console.log(result), + ) +} +``` + +Use the Convex CLI to push your functions to a deployment. See everything +the Convex CLI can do by running `npx convex -h` in your project root +directory. To learn more, launch the docs with `npx convex docs`. diff --git a/examples/solid/start-convex-better-auth/convex/auth.config.ts b/examples/solid/start-convex-better-auth/convex/auth.config.ts new file mode 100644 index 00000000000..afc62641f9c --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/auth.config.ts @@ -0,0 +1,8 @@ +export default { + providers: [ + { + domain: process.env.CONVEX_SITE_URL, + applicationID: 'convex', + }, + ], +} diff --git a/examples/solid/start-convex-better-auth/convex/auth.ts b/examples/solid/start-convex-better-auth/convex/auth.ts new file mode 100644 index 00000000000..e9c2cdb4998 --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/auth.ts @@ -0,0 +1,46 @@ +import { createClient } from '@convex-dev/better-auth' +import { convex } from '@convex-dev/better-auth/plugins' +import { betterAuth } from 'better-auth' +import { components } from './_generated/api' +import { query } from './_generated/server' +import type { GenericCtx } from '@convex-dev/better-auth' +import type { DataModel } from './_generated/dataModel' + +const siteUrl = process.env.SITE_URL! + +// The component client has methods needed for integrating Convex with Better Auth, +// as well as helper methods for general use. +export const authComponent = createClient(components.betterAuth) + +export const createAuth = ( + ctx: GenericCtx, + { optionsOnly } = { optionsOnly: false }, +) => { + return betterAuth({ + // disable logging when createAuth is called just to generate options. + // this is not required, but there's a lot of noise in logs without it. + logger: { + disabled: optionsOnly, + }, + baseURL: siteUrl, + database: authComponent.adapter(ctx), + // Configure simple, non-verified email/password to get started + emailAndPassword: { + enabled: true, + requireEmailVerification: false, + }, + plugins: [ + // The Convex plugin is required for Convex compatibility + convex({ jwtExpirationSeconds: 60 * 60 * 24 }), + ], + }) +} + +// Example function for getting the current user +// Feel free to edit, omit, etc. +export const getCurrentUser = query({ + args: {}, + handler: async (ctx) => { + return authComponent.getAuthUser(ctx) + }, +}) diff --git a/examples/solid/start-convex-better-auth/convex/convex.config.ts b/examples/solid/start-convex-better-auth/convex/convex.config.ts new file mode 100644 index 00000000000..398dd596aa9 --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/convex.config.ts @@ -0,0 +1,6 @@ +import { defineApp } from 'convex/server' +import betterAuth from '@convex-dev/better-auth/convex.config' + +const app = defineApp() +app.use(betterAuth) +export default app diff --git a/examples/solid/start-convex-better-auth/convex/http.ts b/examples/solid/start-convex-better-auth/convex/http.ts new file mode 100644 index 00000000000..7e4257dac4b --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/http.ts @@ -0,0 +1,6 @@ +import { httpRouter } from 'convex/server' +import { authComponent, createAuth } from './auth' + +const http = httpRouter() +authComponent.registerRoutes(http, createAuth) +export default http diff --git a/examples/solid/start-convex-better-auth/convex/myFunctions.ts b/examples/solid/start-convex-better-auth/convex/myFunctions.ts new file mode 100644 index 00000000000..c17895c9d4f --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/myFunctions.ts @@ -0,0 +1,94 @@ +import { v } from 'convex/values' +import { action, mutation, query } from './_generated/server' +import { api } from './_generated/api' +import { authComponent } from './auth' + +// Write your Convex functions in any file inside this directory (`convex`). +// See https://docs.convex.dev/functions for more. + +// You can read data from the database via a query: +export const listNumbers = query({ + // Validators for arguments. + args: { + count: v.number(), + }, + + // Query implementation. + handler: async (ctx, args) => { + // Get the current authenticated user + const authUser = await authComponent.getAuthUser(ctx) + if (!authUser._id) { + throw new Error('User must be authenticated to list random numbers') + } + + // Read the database as many times as you need here. + // See https://docs.convex.dev/database/reading-data. + const numbers = await ctx.db + .query('numbers') + .withIndex('userId', (q) => q.eq('userId', authUser._id)) + // Ordered by _creationTime, return most recent + .order('desc') + .take(args.count) + return { + viewer: (await ctx.auth.getUserIdentity())?.name ?? null, + numbers: numbers.reverse().map((number) => number.value), + } + }, +}) + +// You can write data to the database via a mutation: +export const addNumber = mutation({ + // Validators for arguments. + args: { + value: v.number(), + }, + + // Mutation implementation. + handler: async (ctx, args) => { + // Get the current authenticated user + const authUser = await authComponent.getAuthUser(ctx) + if (!authUser._id) { + throw new Error('User must be authenticated to create a random number') + } + + // Insert or modify documents in the database here. + // Mutations can also read from the database like queries. + // See https://docs.convex.dev/database/writing-data. + + const id = await ctx.db.insert('numbers', { + value: args.value, + userId: authUser._id, + }) + + console.log('Added new document with id:', id) + // Optionally, return a value from your mutation. + // return id; + }, +}) + +// You can fetch data from and send data to third-party APIs via an action: +export const myAction = action({ + // Validators for arguments. + args: { + first: v.number(), + }, + + // Action implementation. + handler: async (ctx, args) => { + // // Use the browser-like `fetch` API to send HTTP requests. + // // See https://docs.convex.dev/functions/actions#calling-third-party-apis-and-using-npm-packages. + // const response = await ctx.fetch("https://api.thirdpartyservice.com"); + // const data = await response.json(); + + // // Query data by running Convex queries. + const data = await ctx.runQuery(api.myFunctions.listNumbers, { + count: 10, + }) + console.log(data) + + // // Write data by running Convex mutations. + await ctx.runMutation(api.myFunctions.addNumber, { + value: args.first, + }) + }, +}) diff --git a/examples/solid/start-convex-better-auth/convex/schema.ts b/examples/solid/start-convex-better-auth/convex/schema.ts new file mode 100644 index 00000000000..996612fd426 --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/schema.ts @@ -0,0 +1,13 @@ +import { defineSchema, defineTable } from 'convex/server' +import { v } from 'convex/values' + +// The schema is entirely optional. +// You can delete this file (schema.ts) and the +// app will continue to work. +// The schema provides more precise TypeScript types. +export default defineSchema({ + numbers: defineTable({ + value: v.number(), + userId: v.string(), + }).index('userId', ['userId']), +}) diff --git a/examples/solid/start-convex-better-auth/convex/tsconfig.json b/examples/solid/start-convex-better-auth/convex/tsconfig.json new file mode 100644 index 00000000000..ce1ac8b50a7 --- /dev/null +++ b/examples/solid/start-convex-better-auth/convex/tsconfig.json @@ -0,0 +1,25 @@ +{ + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings are required to use Convex. + */ + "compilerOptions": { + /* These settings are not required by Convex and can be modified. */ + "allowJs": true, + "strict": true, + "moduleResolution": "Bundler", + "jsx": "preserve", + "jsxImportSource": "solid-js", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + /* These compiler options are required by Convex */ + "target": "ESNext", + "lib": ["ES2021", "dom"], + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "isolatedModules": true, + "noEmit": true + }, + "include": ["./**/*"], + "exclude": ["./_generated"] +} diff --git a/examples/solid/start-convex-better-auth/package.json b/examples/solid/start-convex-better-auth/package.json new file mode 100644 index 00000000000..691d64e1183 --- /dev/null +++ b/examples/solid/start-convex-better-auth/package.json @@ -0,0 +1,36 @@ +{ + "name": "tanstack-solid-start-example-convex-better-auth", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vite dev", + "convex:dev": "convex dev", + "build": "vite build && tsc --noEmit", + "start": "vite start" + }, + "dependencies": { + "@convex-dev/better-auth": "^0.9.7", + "@tailwindcss/vite": "^4.1.17", + "@tanstack/solid-router": "^1.134.16", + "@tanstack/solid-router-devtools": "^1.134.16", + "@tanstack/solid-start": "^1.134.16", + "better-auth": "^1.3.27", + "clsx": "^2.1.1", + "convex": "^1.28.2", + "convex-solidjs": "^0.0.3", + "redaxios": "^0.5.1", + "solid-js": "^1.9.10", + "tailwind-merge": "^2.6.0", + "tailwindcss": "^4.1.17", + "zod": "^3.24.2" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "combinate": "^1.1.11", + "typescript": "^5.7.2", + "vite": "^7.1.7", + "vite-plugin-solid": "^2.11.10", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/examples/solid/start-convex-better-auth/public/favicon.ico b/examples/solid/start-convex-better-auth/public/favicon.ico new file mode 100644 index 00000000000..1a1751676f7 Binary files /dev/null and b/examples/solid/start-convex-better-auth/public/favicon.ico differ diff --git a/examples/solid/start-convex-better-auth/src/components/login-signup-form.tsx b/examples/solid/start-convex-better-auth/src/components/login-signup-form.tsx new file mode 100644 index 00000000000..3f45d9a619a --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/components/login-signup-form.tsx @@ -0,0 +1,199 @@ +import { useNavigate } from '@tanstack/solid-router' +import { createSignal } from 'solid-js' +import { authClient } from '~/library/auth-client' +import { refreshAuth } from '~/library/convex-client' + +export default function LoginSignupForm() { + const navigate = useNavigate() + const [isLogin, setIsLogin] = createSignal(true) + const [name, setName] = createSignal('') + const [email, setEmail] = createSignal('') + const [password, setPassword] = createSignal('') + const [error, setError] = createSignal('') + const [loading, setLoading] = createSignal(false) + + const handleSubmit = async (e: Event) => { + e.preventDefault() + setError('') + setLoading(true) + + try { + if (isLogin()) { + await authClient.signIn.email({ + email: email(), + password: password(), + }) + } else { + await authClient.signUp.email({ + name: name(), + email: email(), + password: password(), + }) + } + + refreshAuth() + + navigate({ to: '/dashboard' }) + } catch (err: any) { + setError(err?.message || 'An error occurred') + } finally { + setLoading(false) + } + } + + return ( +
+
+
+
+

+ {isLogin() ? 'Welcome Back' : 'Create Account'} +

+

+ {isLogin() + ? 'Sign in to continue to your account' + : 'Get started with your free account'} +

+
+ +
+ {!isLogin() && ( +
+ + setName(e.currentTarget.value)} + required={!isLogin()} + class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-all duration-200 text-gray-900 placeholder-gray-400" + placeholder="John Doe" + /> +
+ )} + +
+ + setEmail(e.currentTarget.value)} + required + class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-all duration-200 text-gray-900 placeholder-gray-400" + placeholder="you@example.com" + /> +
+ +
+ + setPassword(e.currentTarget.value)} + required + class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-all duration-200 text-gray-900 placeholder-gray-400" + placeholder="••••••••" + /> +
+ + {error() && ( +
+ + + + {error()} +
+ )} + + +
+ +
+ +
+
+
+
+ ) +} diff --git a/examples/solid/start-convex-better-auth/src/library/auth-client.ts b/examples/solid/start-convex-better-auth/src/library/auth-client.ts new file mode 100644 index 00000000000..e43f63c1bd1 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/library/auth-client.ts @@ -0,0 +1,6 @@ +import { createAuthClient } from 'better-auth/solid' +import { convexClient } from '@convex-dev/better-auth/client/plugins' + +export const authClient = createAuthClient({ + plugins: [convexClient()], +}) diff --git a/examples/solid/start-convex-better-auth/src/library/auth-server.ts b/examples/solid/start-convex-better-auth/src/library/auth-server.ts new file mode 100644 index 00000000000..fb3fffb7672 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/library/auth-server.ts @@ -0,0 +1,6 @@ +import { createAuth } from 'convex/auth' +import { setupFetchClient } from '@convex-dev/better-auth/react-start' +import { getCookie } from '@tanstack/solid-start/server' + +export const { fetchQuery, fetchMutation, fetchAction } = + await setupFetchClient(createAuth, getCookie) diff --git a/examples/solid/start-convex-better-auth/src/library/convex-client.ts b/examples/solid/start-convex-better-auth/src/library/convex-client.ts new file mode 100644 index 00000000000..4f60bbdbfd1 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/library/convex-client.ts @@ -0,0 +1,20 @@ +import { setupConvex } from 'convex-solidjs' +import { fetchAuth } from '~/library/server' + +const CONVEX_URL = import.meta.env.VITE_CONVEX_URL +if (!CONVEX_URL) { + console.error('missing envar CONVEX_URL') +} + +// Set up Convex client with auth +export const convexClient = setupConvex(CONVEX_URL) + +// Configure auth token fetcher +export function refreshAuth() { + convexClient.setAuth(async () => { + const { token } = await fetchAuth() + return token + }) +} + +refreshAuth() diff --git a/examples/solid/start-convex-better-auth/src/library/server.ts b/examples/solid/start-convex-better-auth/src/library/server.ts new file mode 100644 index 00000000000..ade4e6e0993 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/library/server.ts @@ -0,0 +1,42 @@ +import { + fetchSession, + getCookieName, +} from '@convex-dev/better-auth/react-start' +import { createServerFn } from '@tanstack/solid-start' +import { redirect } from '@tanstack/solid-router' +import { getCookie, getRequest } from '@tanstack/solid-start/server' +import { api } from 'convex/_generated/api' +import { fetchMutation, fetchQuery } from './auth-server' + +// Get auth information for SSR using available cookies +export const fetchAuth = createServerFn({ method: 'GET' }).handler(async () => { + const { createAuth } = await import('../../convex/auth') + const request = getRequest() + const { session } = await fetchSession(request) + const sessionCookieName = getCookieName(createAuth) + const token = getCookie(sessionCookieName) + + return { + session, + token, + } +}) + +export const fetchUser = createServerFn({ method: 'GET' }).handler(async () => { + try { + const user = await fetchQuery(api.auth.getCurrentUser, {}) + return user + } catch (error) { + throw redirect({ to: '/' }) + } +}) + +// example of calling Convex functions using server functions +export const addNumber = createServerFn({ method: 'POST' }).handler( + async () => { + const number = await fetchMutation(api.myFunctions.addNumber, { + value: Math.floor(Math.random() * 100), + }) + return number + }, +) diff --git a/examples/solid/start-convex-better-auth/src/library/utils.ts b/examples/solid/start-convex-better-auth/src/library/utils.ts new file mode 100644 index 00000000000..914ec868afb --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/library/utils.ts @@ -0,0 +1,7 @@ +import { clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' +import type { ClassValue } from 'clsx' + +export function cn(...inputs: Array) { + return twMerge(clsx(inputs)) +} diff --git a/examples/solid/start-convex-better-auth/src/providers/convex.tsx b/examples/solid/start-convex-better-auth/src/providers/convex.tsx new file mode 100644 index 00000000000..787b1d0663a --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/providers/convex.tsx @@ -0,0 +1,7 @@ +import { ConvexProvider } from 'convex-solidjs' +import type { JSXElement } from 'solid-js' +import { convexClient } from '~/library/convex-client' + +export default function AppConvexProvider(props: { children: JSXElement }) { + return {props.children} +} diff --git a/examples/solid/start-convex-better-auth/src/routeTree.gen.ts b/examples/solid/start-convex-better-auth/src/routeTree.gen.ts new file mode 100644 index 00000000000..e0a4f396fc0 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routeTree.gen.ts @@ -0,0 +1,152 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as AboutRouteImport } from './routes/about' +import { Route as AuthedRouteImport } from './routes/_authed' +import { Route as IndexRouteImport } from './routes/index' +import { Route as AuthedDashboardRouteImport } from './routes/_authed/dashboard' +import { Route as ApiAuthSplatRouteImport } from './routes/api/auth/$' + +const AboutRoute = AboutRouteImport.update({ + id: '/about', + path: '/about', + getParentRoute: () => rootRouteImport, +} as any) +const AuthedRoute = AuthedRouteImport.update({ + id: '/_authed', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const AuthedDashboardRoute = AuthedDashboardRouteImport.update({ + id: '/dashboard', + path: '/dashboard', + getParentRoute: () => AuthedRoute, +} as any) +const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({ + id: '/api/auth/$', + path: '/api/auth/$', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/about': typeof AboutRoute + '/dashboard': typeof AuthedDashboardRoute + '/api/auth/$': typeof ApiAuthSplatRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/about': typeof AboutRoute + '/dashboard': typeof AuthedDashboardRoute + '/api/auth/$': typeof ApiAuthSplatRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/_authed': typeof AuthedRouteWithChildren + '/about': typeof AboutRoute + '/_authed/dashboard': typeof AuthedDashboardRoute + '/api/auth/$': typeof ApiAuthSplatRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/about' | '/dashboard' | '/api/auth/$' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/about' | '/dashboard' | '/api/auth/$' + id: + | '__root__' + | '/' + | '/_authed' + | '/about' + | '/_authed/dashboard' + | '/api/auth/$' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthedRoute: typeof AuthedRouteWithChildren + AboutRoute: typeof AboutRoute + ApiAuthSplatRoute: typeof ApiAuthSplatRoute +} + +declare module '@tanstack/solid-router' { + interface FileRoutesByPath { + '/about': { + id: '/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof AboutRouteImport + parentRoute: typeof rootRouteImport + } + '/_authed': { + id: '/_authed' + path: '' + fullPath: '' + preLoaderRoute: typeof AuthedRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/_authed/dashboard': { + id: '/_authed/dashboard' + path: '/dashboard' + fullPath: '/dashboard' + preLoaderRoute: typeof AuthedDashboardRouteImport + parentRoute: typeof AuthedRoute + } + '/api/auth/$': { + id: '/api/auth/$' + path: '/api/auth/$' + fullPath: '/api/auth/$' + preLoaderRoute: typeof ApiAuthSplatRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +interface AuthedRouteChildren { + AuthedDashboardRoute: typeof AuthedDashboardRoute +} + +const AuthedRouteChildren: AuthedRouteChildren = { + AuthedDashboardRoute: AuthedDashboardRoute, +} + +const AuthedRouteWithChildren = + AuthedRoute._addFileChildren(AuthedRouteChildren) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthedRoute: AuthedRouteWithChildren, + AboutRoute: AboutRoute, + ApiAuthSplatRoute: ApiAuthSplatRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/solid-start' +declare module '@tanstack/solid-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/examples/solid/start-convex-better-auth/src/router.tsx b/examples/solid/start-convex-better-auth/src/router.tsx new file mode 100644 index 00000000000..84312aad0d3 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/router.tsx @@ -0,0 +1,14 @@ +import { createRouter } from '@tanstack/solid-router' +import { routeTree } from './routeTree.gen' + +export function getRouter() { + const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultErrorComponent: (err) =>

{err.error.stack}

, + defaultNotFoundComponent: () =>

not found

, + scrollRestoration: true, + }) + + return router +} diff --git a/examples/solid/start-convex-better-auth/src/routes/__root.tsx b/examples/solid/start-convex-better-auth/src/routes/__root.tsx new file mode 100644 index 00000000000..34e24068d37 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/__root.tsx @@ -0,0 +1,37 @@ +/// +import { HeadContent, Scripts, createRootRoute } from '@tanstack/solid-router' +import { HydrationScript, Suspense } from 'solid-js/web' +import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools' +import type * as Solid from 'solid-js' +import appCss from '~/styles/app.css?url' +import AppConvexProvider from '~/providers/convex' +import { fetchAuth } from '~/library/server' + +export const Route = createRootRoute({ + head: () => ({ + links: [{ rel: 'stylesheet', href: appCss }], + }), + beforeLoad: async () => { + const { session, token } = await fetchAuth() + return { session, token } + }, + shellComponent: RootDocument, +}) + +function RootDocument(props: { children: Solid.JSX.Element }) { + return ( + + + + + + + + {props.children} + + + + + + ) +} diff --git a/examples/solid/start-convex-better-auth/src/routes/_authed.tsx b/examples/solid/start-convex-better-auth/src/routes/_authed.tsx new file mode 100644 index 00000000000..c7cb0add0b7 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/_authed.tsx @@ -0,0 +1,19 @@ +import { Outlet, createFileRoute, redirect } from '@tanstack/solid-router' +import { fetchUser } from '~/library/server' + +export const Route = createFileRoute('/_authed')({ + component: () => ( + <> + + + ), + beforeLoad: async (ctx) => { + const user = await fetchUser() + if (!ctx.context.token) { + throw redirect({ + to: '/', + }) + } + return { user } + }, +}) diff --git a/examples/solid/start-convex-better-auth/src/routes/_authed/dashboard.tsx b/examples/solid/start-convex-better-auth/src/routes/_authed/dashboard.tsx new file mode 100644 index 00000000000..5fd8e2bf4d9 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/_authed/dashboard.tsx @@ -0,0 +1,107 @@ +import { + createFileRoute, + useNavigate, + useRouteContext, +} from '@tanstack/solid-router' +import { useQuery } from 'convex-solidjs' +import { api } from 'convex/_generated/api' +import { For, Show } from 'solid-js' +import { addNumber } from '~/library/server' +import { authClient } from '~/library/auth-client' + +export const Route = createFileRoute('/_authed/dashboard')({ + component: RouteComponent, +}) + +function RouteComponent() { + const navigate = useNavigate() + const context = useRouteContext({ from: '/_authed' }) + // example of a Convex query + const { data } = useQuery(api.myFunctions.listNumbers, { count: 10 }) + + const handleSignOut = async () => { + await authClient.signOut() + navigate({ to: '/' }) + } + + return ( +
+ {/* Header */} +
+
+
+
+

Dashboard

+ + {(u) => ( +

+ Welcome back, {u().name || u().email}! +

+ )} +
+
+ +
+
+
+ + {/* Main Content */} +
+ {/* Numbers Card */} +
+
+

Numbers

+ +
+ + 0} + fallback={ +
+ + + +

+ No numbers yet +

+

+ Get started by adding your first number. +

+
+ } + > +
+ + {(number) => ( +
+
{number}
+
+ )} +
+
+
+
+
+
+ ) +} diff --git a/examples/solid/start-convex-better-auth/src/routes/about.tsx b/examples/solid/start-convex-better-auth/src/routes/about.tsx new file mode 100644 index 00000000000..324a9c8eef4 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/about.tsx @@ -0,0 +1,12 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/about')({ + component: RouteComponent, +}) + +function RouteComponent() { + return ( +
+

About

+
+ ) +} diff --git a/examples/solid/start-convex-better-auth/src/routes/api/auth/$.ts b/examples/solid/start-convex-better-auth/src/routes/api/auth/$.ts new file mode 100644 index 00000000000..8decbc6610a --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/api/auth/$.ts @@ -0,0 +1,15 @@ +import { createFileRoute } from '@tanstack/solid-router' +import { reactStartHandler } from '@convex-dev/better-auth/react-start' + +export const Route = createFileRoute('/api/auth/$')({ + server: { + handlers: { + GET: ({ request }) => { + return reactStartHandler(request) + }, + POST: ({ request }) => { + return reactStartHandler(request) + }, + }, + }, +}) diff --git a/examples/solid/start-convex-better-auth/src/routes/index.tsx b/examples/solid/start-convex-better-auth/src/routes/index.tsx new file mode 100644 index 00000000000..93fa5464946 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/routes/index.tsx @@ -0,0 +1,20 @@ +import { createFileRoute, redirect } from '@tanstack/solid-router' + +import LoginSignupForm from '~/components/login-signup-form' + +export const Route = createFileRoute('/')({ + beforeLoad: (ctx) => { + if (ctx.context.token) { + throw redirect({ to: '/dashboard' }) + } + }, + component: RouteComponent, +}) + +function RouteComponent() { + return ( +
+ +
+ ) +} diff --git a/examples/solid/start-convex-better-auth/src/styles/app.css b/examples/solid/start-convex-better-auth/src/styles/app.css new file mode 100644 index 00000000000..43d97fa7a76 --- /dev/null +++ b/examples/solid/start-convex-better-auth/src/styles/app.css @@ -0,0 +1,17 @@ +@import 'tailwindcss'; + +body { + font-family: + Gordita, Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', + sans-serif; +} + +a { + margin-right: 1rem; +} + +main { + text-align: center; + padding: 1em; + margin: 0 auto; +} diff --git a/examples/solid/start-convex-better-auth/tsconfig.json b/examples/solid/start-convex-better-auth/tsconfig.json new file mode 100644 index 00000000000..57ea27b2868 --- /dev/null +++ b/examples/solid/start-convex-better-auth/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": ["**/*.ts", "**/*.tsx", "public/script*.js"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./src/*"] + }, + "noEmit": true + } +} diff --git a/examples/solid/start-convex-better-auth/vite.config.ts b/examples/solid/start-convex-better-auth/vite.config.ts new file mode 100644 index 00000000000..a74c0fe0d48 --- /dev/null +++ b/examples/solid/start-convex-better-auth/vite.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'vite' +import tsConfigPaths from 'vite-tsconfig-paths' +import { tanstackStart } from '@tanstack/solid-start/plugin/vite' +import viteSolid from 'vite-plugin-solid' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + server: { + port: 3000, + }, + plugins: [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + tailwindcss(), + tanstackStart(), + viteSolid({ ssr: true }), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 229e2347e42..c12ea183813 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5853,7 +5853,7 @@ importers: version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6(@types/node@22.10.2)(playwright@1.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4))(@vitest/ui@3.0.6(vitest@3.2.4))(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -7621,6 +7621,70 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + examples/solid/start-convex-better-auth: + dependencies: + '@convex-dev/better-auth': + specifier: ^0.9.7 + version: 0.9.7(@standard-schema/spec@1.0.0)(better-auth@1.3.27(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.10))(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2) + '@tailwindcss/vite': + specifier: ^4.1.17 + version: 4.1.17(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + '@tanstack/solid-router': + specifier: ^1.134.16 + version: link:../../../packages/solid-router + '@tanstack/solid-router-devtools': + specifier: workspace:^ + version: link:../../../packages/solid-router-devtools + '@tanstack/solid-start': + specifier: workspace:* + version: link:../../../packages/solid-start + better-auth: + specifier: ^1.3.27 + version: 1.3.27(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.10) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + convex: + specifier: ^1.28.2 + version: 1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-solidjs: + specifier: ^0.0.3 + version: 0.0.3(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(solid-js@1.9.10) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + solid-js: + specifier: 1.9.10 + version: 1.9.10 + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 + tailwindcss: + specifier: ^4.1.17 + version: 4.1.17 + zod: + specifier: ^3.24.2 + version: 3.25.57 + devDependencies: + '@types/node': + specifier: 22.10.2 + version: 22.10.2 + combinate: + specifier: ^1.1.11 + version: 1.1.11 + typescript: + specifier: ^5.7.2 + version: 5.9.2 + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.11.10 + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + packages/arktype-adapter: devDependencies: '@tanstack/react-router': @@ -8866,6 +8930,15 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} + '@better-auth/core@1.3.27': + resolution: {integrity: sha512-3Sfdax6MQyronY+znx7bOsfQHI6m1SThvJWb0RDscFEAhfqLy95k1sl+/PgGyg0cwc2cUXoEiAOSqYdFYrg3vA==} + + '@better-auth/utils@0.3.0': + resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} + + '@better-fetch/fetch@1.1.18': + resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==} + '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -8976,6 +9049,14 @@ packages: resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} + '@convex-dev/better-auth@0.9.7': + resolution: {integrity: sha512-ni0oLM3IQho8KVBlMoyTk50IIbckhZmlEMxLgaVSixKmFJ4N/kGC6T91MjPTw3+bVLn/qHmIinLp7Dm+NRYzBw==} + peerDependencies: + better-auth: 1.3.27 + convex: '>=1.28.2 <1.35.0' + react: ^19.0.0 + react-dom: ^19.0.0 + '@convex-dev/react-query@0.0.0-alpha.8': resolution: {integrity: sha512-Rv/q7/CplU75f7ckBd2vh+HoeeQ0tOrjwMl14Hk7D/03e55oUIU0TV5JYYzC79ZQyyAtoj7CmCo5ZxcmtKNv1Q==} peerDependencies: @@ -10060,6 +10141,9 @@ packages: engines: {node: '>=6'} hasBin: true + '@hexagon/base64@1.1.28': + resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -10441,6 +10525,9 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@levischuck/tiny-cbor@0.2.11': + resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@lix-js/sdk@0.4.7': resolution: {integrity: sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==} engines: {node: '>=18'} @@ -10690,6 +10777,14 @@ packages: engines: {node: '>=18.14.0'} hasBin: true + '@noble/ciphers@2.0.1': + resolution: {integrity: sha512-xHK3XHPUW8DTAobU+G0XT+/w+JLM7/8k1UFdB5xg/zTFPnFCobhftzw8wl4Lw2aq/Rvir5pxfZV5fEazmeCJ2g==} + engines: {node: '>= 20.19.0'} + + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -10868,8 +10963,38 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-schema@2.3.15': - resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + '@peculiar/asn1-android@2.5.0': + resolution: {integrity: sha512-t8A83hgghWQkcneRsgGs2ebAlRe54ns88p7ouv8PW2tzF1nAW4yHcL4uZKrFpIU+uszIRzTkcCuie37gpkId0A==} + + '@peculiar/asn1-cms@2.5.0': + resolution: {integrity: sha512-p0SjJ3TuuleIvjPM4aYfvYw8Fk1Hn/zAVyPJZTtZ2eE9/MIer6/18ROxX6N/e6edVSfvuZBqhxAj3YgsmSjQ/A==} + + '@peculiar/asn1-csr@2.5.0': + resolution: {integrity: sha512-ioigvA6WSYN9h/YssMmmoIwgl3RvZlAYx4A/9jD2qaqXZwGcNlAxaw54eSx2QG1Yu7YyBC5Rku3nNoHrQ16YsQ==} + + '@peculiar/asn1-ecc@2.5.0': + resolution: {integrity: sha512-t4eYGNhXtLRxaP50h3sfO6aJebUCDGQACoeexcelL4roMFRRVgB20yBIu2LxsPh/tdW9I282gNgMOyg3ywg/mg==} + + '@peculiar/asn1-pfx@2.5.0': + resolution: {integrity: sha512-Vj0d0wxJZA+Ztqfb7W+/iu8Uasw6hhKtCdLKXLG/P3kEPIQpqGI4P4YXlROfl7gOCqFIbgsj1HzFIFwQ5s20ug==} + + '@peculiar/asn1-pkcs8@2.5.0': + resolution: {integrity: sha512-L7599HTI2SLlitlpEP8oAPaJgYssByI4eCwQq2C9eC90otFpm8MRn66PpbKviweAlhinWQ3ZjDD2KIVtx7PaVw==} + + '@peculiar/asn1-pkcs9@2.5.0': + resolution: {integrity: sha512-UgqSMBLNLR5TzEZ5ZzxR45Nk6VJrammxd60WMSkofyNzd3DQLSNycGWSK5Xg3UTYbXcDFyG8pA/7/y/ztVCa6A==} + + '@peculiar/asn1-rsa@2.5.0': + resolution: {integrity: sha512-qMZ/vweiTHy9syrkkqWFvbT3eLoedvamcUdnnvwyyUNv5FgFXA3KP8td+ATibnlZ0EANW5PYRm8E6MJzEB/72Q==} + + '@peculiar/asn1-schema@2.5.0': + resolution: {integrity: sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==} + + '@peculiar/asn1-x509-attr@2.5.0': + resolution: {integrity: sha512-9f0hPOxiJDoG/bfNLAFven+Bd4gwz/VzrCIIWc1025LEI4BXO0U5fOCTNDPbbp2ll+UzqKsZ3g61mpBp74gk9A==} + + '@peculiar/asn1-x509@2.5.0': + resolution: {integrity: sha512-CpwtMCTJvfvYTFMuiME5IH+8qmDe3yEWzKHe7OOADbGfq7ohxeLaXwQo0q4du3qs0AII3UbLCvb9NF/6q0oTKQ==} '@peculiar/json-schema@1.1.12': resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} @@ -10879,6 +11004,9 @@ packages: resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} engines: {node: '>=10.12.0'} + '@peculiar/x509@1.14.0': + resolution: {integrity: sha512-Yc4PDxN3OrxUPiXgU63c+ZRXKGE8YKF2McTciYhUHFtHVB0KMnjeFSU0qpztGhsp4P0uKix4+J2xEpIEDu8oXg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -12183,6 +12311,13 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simplewebauthn/browser@13.2.2': + resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} + + '@simplewebauthn/server@13.2.2': + resolution: {integrity: sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==} + engines: {node: '>=20.0.0'} + '@sinclair/typebox@0.31.28': resolution: {integrity: sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==} @@ -12224,6 +12359,11 @@ packages: peerDependencies: solid-js: 1.9.10 + '@solid-primitives/context@0.3.2': + resolution: {integrity: sha512-6fvTtpK17PFHnUf/UOc1TzBjd+kLFjtA62aRFEm1kDP9ufTo7FYW2kUzQAWbfbRHi30yjBJtopbR8qd6nShwyg==} + peerDependencies: + solid-js: 1.9.10 + '@solid-primitives/cursor@0.0.115': resolution: {integrity: sha512-8nEmUN/sacXPChwuJOAi6Yi6VnxthW/Jk8VGvvcF38AenjUvOA6FHI6AkJILuFXjQw1PGxia1YbH/Mn77dPiOA==} peerDependencies: @@ -12434,6 +12574,9 @@ packages: '@tailwindcss/node@4.1.15': resolution: {integrity: sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==} + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + '@tailwindcss/node@4.1.6': resolution: {integrity: sha512-ed6zQbgmKsjsVvodAS1q1Ld2BolEuxJOSyyNc+vhkjdmfNUDCmQnlXBfQkHrlzNmslxHsQU/bFmzcEbv4xXsLg==} @@ -12449,6 +12592,12 @@ packages: cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-android-arm64@4.1.6': resolution: {integrity: sha512-VHwwPiwXtdIvOvqT/0/FLH/pizTVu78FOnI9jQo64kSAikFSZT7K4pjyzoDpSMaveJTGyAKvDjuhxJxKfmvjiQ==} engines: {node: '>= 10'} @@ -12467,6 +12616,12 @@ packages: cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.1.6': resolution: {integrity: sha512-weINOCcqv1HVBIGptNrk7c6lWgSFFiQMcCpKM4tnVi5x8OY2v1FrV76jwLukfT6pL1hyajc06tyVmZFYXoxvhQ==} engines: {node: '>= 10'} @@ -12485,6 +12640,12 @@ packages: cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.6': resolution: {integrity: sha512-3FzekhHG0ww1zQjQ1lPoq0wPrAIVXAbUkWdWM8u5BnYFZgb9ja5ejBqyTgjpo5mfy0hFOoMnMuVDI+7CXhXZaQ==} engines: {node: '>= 10'} @@ -12503,6 +12664,12 @@ packages: cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.1.6': resolution: {integrity: sha512-4m5F5lpkBZhVQJq53oe5XgJ+aFYWdrgkMwViHjRsES3KEu2m1udR21B1I77RUqie0ZYNscFzY1v9aDssMBZ/1w==} engines: {node: '>= 10'} @@ -12521,6 +12688,12 @@ packages: cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.6': resolution: {integrity: sha512-qU0rHnA9P/ZoaDKouU1oGPxPWzDKtIfX7eOGi5jOWJKdxieUJdVV+CxWZOpDWlYTd4N3sFQvcnVLJWJ1cLP5TA==} engines: {node: '>= 10'} @@ -12539,6 +12712,12 @@ packages: cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.6': resolution: {integrity: sha512-jXy3TSTrbfgyd3UxPQeXC3wm8DAgmigzar99Km9Sf6L2OFfn/k+u3VqmpgHQw5QNfCpPe43em6Q7V76Wx7ogIQ==} engines: {node: '>= 10'} @@ -12557,6 +12736,12 @@ packages: cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.6': resolution: {integrity: sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==} engines: {node: '>= 10'} @@ -12575,6 +12760,12 @@ packages: cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.6': resolution: {integrity: sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==} engines: {node: '>= 10'} @@ -12593,6 +12784,12 @@ packages: cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.6': resolution: {integrity: sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==} engines: {node: '>= 10'} @@ -12623,6 +12820,18 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-wasm32-wasi@4.1.6': resolution: {integrity: sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==} engines: {node: '>=14.0.0'} @@ -12647,6 +12856,12 @@ packages: cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.1.6': resolution: {integrity: sha512-nqpDWk0Xr8ELO/nfRUDjk1pc9wDJ3ObeDdNMHLaymc4PJBWj11gdPCWZFKSK2AVKjJQC7J2EfmSmf47GN7OuLg==} engines: {node: '>= 10'} @@ -12665,6 +12880,12 @@ packages: cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.6': resolution: {integrity: sha512-5k9xF33xkfKpo9wCvYcegQ21VwIBU1/qEbYlVukfEIyQbEA47uK8AAwS7NVjNE3vHzcmxMYwd0l6L4pPjjm1rQ==} engines: {node: '>= 10'} @@ -12679,6 +12900,10 @@ packages: resolution: {integrity: sha512-krhX+UOOgnsUuks2SR7hFafXmLQrKxB4YyRTERuCE59JlYL+FawgaAlSkOYmDRJdf1Q+IFNDMl9iRnBW7QBDfQ==} engines: {node: '>= 10'} + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} + engines: {node: '>= 10'} + '@tailwindcss/oxide@4.1.6': resolution: {integrity: sha512-0bpEBQiGx+227fW4G0fLQ8vuvyy5rsB1YIYNapTq3aRsJ9taF3f5cCaovDjN5pUGKKzcpMrZst/mhNaKAPOHOA==} engines: {node: '>= 10'} @@ -12691,6 +12916,11 @@ packages: peerDependencies: vite: ^7.1.7 + '@tailwindcss/vite@4.1.17': + resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==} + peerDependencies: + vite: ^7.1.7 + '@tailwindcss/vite@4.1.6': resolution: {integrity: sha512-zjtqjDeY1w3g2beYQtrMAf51n5G7o+UwmyOjtsDMP7t6XyoRMOidcoKP32ps7AkNOHIXEOK0bhIC05dj8oJp4w==} peerDependencies: @@ -13813,6 +14043,38 @@ packages: peerDependencies: ajv: 4.11.8 - 8 + better-auth@1.3.27: + resolution: {integrity: sha512-SwiGAJ7yU6dBhNg0NdV1h5M8T5sa7/AszZVc4vBfMDrLLmvUfbt9JoJ0uRUJUEdKRAAxTyl9yA+F3+GhtAD80w==} + peerDependencies: + '@lynx-js/react': '*' + '@sveltejs/kit': '*' + next: '*' + react: '*' + react-dom: '*' + solid-js: '*' + svelte: '*' + vue: '*' + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + + better-call@1.0.19: + resolution: {integrity: sha512-sI3GcA1SCVa3H+CDHl8W8qzhlrckwXOTKhqq3OOPXjgn5aTOMIqGY34zLY/pHA6tRRMjTUC3lz5Mi7EbDA24Kw==} + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -14112,6 +14374,10 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -14192,6 +14458,34 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convex-helpers@0.1.104: + resolution: {integrity: sha512-7CYvx7T3K6n+McDTK4ZQaQNNGBzq5aWezpjzsKbOxPXx7oNcTP9wrpef3JxeXWFzkByJv5hRCjseh9B7eNJ7Ig==} + hasBin: true + peerDependencies: + '@standard-schema/spec': ^1.0.0 + convex: ^1.24.0 + hono: ^4.0.5 + react: ^19.0.0 + typescript: ^5.5 + zod: ^3.22.4 || ^4.0.15 + peerDependenciesMeta: + '@standard-schema/spec': + optional: true + hono: + optional: true + react: + optional: true + typescript: + optional: true + zod: + optional: true + + convex-solidjs@0.0.3: + resolution: {integrity: sha512-DCKgtE1rzLUe2x3M7CzjFnN8q4e2ig7d/eudMkjyQOWzMyj19v52AL3JxKH1zpCxGFszQANygQvAltr9R99bfw==} + engines: {node: '>=18', pnpm: '>=9.0.0'} + peerDependencies: + solid-js: 1.9.10 + convex@1.19.0: resolution: {integrity: sha512-TcglkEi392oK0Ah+zDoetFCRFXBM/lvCewi6AWfIgVCtVc9I/xdimdFOLN602V5wp7H4PN8wotpdIoixwSH7mQ==} engines: {node: '>=18.0.0', npm: '>=7.0.0'} @@ -14211,6 +14505,22 @@ packages: react-dom: optional: true + convex@1.28.2: + resolution: {integrity: sha512-KzNsLbcVXb1OhpVQ+vHMgu+hjrsQ1ks5BZwJ2lR8O+nfbeJXE6tHbvsg1H17+ooUDvIDBSMT3vXS+AlodDhTnQ==} + 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: ^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==} @@ -15892,6 +16202,9 @@ packages: jose@6.0.10: resolution: {integrity: sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==} + jose@6.1.0: + resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -16041,6 +16354,10 @@ packages: resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} engines: {node: '>=14.0.0'} + kysely@0.28.8: + resolution: {integrity: sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==} + engines: {node: '>=20.0.0'} + lambda-local@2.2.0: resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} engines: {node: '>=8'} @@ -16399,6 +16716,9 @@ packages: magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -16649,6 +16969,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanostores@1.0.1: + resolution: {integrity: sha512-kNZ9xnoJYKg/AfxjrVL4SS0fKX++4awQReGqWnwTRHxeHGZ1FJFVgTqr/eMrNQdp0Tz7M7tG/TDaX8QfHDwVCw==} + engines: {node: ^20.0.0 || >=22.0.0} + napi-postinstall@0.3.3: resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -17437,6 +17761,9 @@ packages: reduce-configs@1.1.0: resolution: {integrity: sha512-DQxy6liNadHfrLahZR7lMdc227NYVaQZhY5FMsxLEjX8X0SCuH+ESHSLCoz2yDZFq1/CLMDOAHdsEHwOEXKtvg==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -17444,6 +17771,9 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + remeda@2.32.0: + resolution: {integrity: sha512-BZx9DsT4FAgXDTOdgJIc5eY6ECIXMwtlSPQoPglF20ycSWigttDDe88AozEsPPT4OWk5NujroGSBC1phw5uU+w==} + remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -17549,6 +17879,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rou3@0.5.1: + resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + rou3@0.7.5: resolution: {integrity: sha512-bwUHDHw1HSARty7TWNV71R0NZs5fOt74OM+hcMdJyPfchfRktEmxLoMSNa7PwEp6WqJ0a3feKztsIfTUEYhskw==} @@ -17634,6 +17967,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -17670,6 +18008,9 @@ packages: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -17991,6 +18332,9 @@ packages: tailwindcss@4.1.16: resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tailwindcss@4.1.6: resolution: {integrity: sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==} @@ -18213,6 +18557,9 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -18226,6 +18573,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -19091,6 +19442,9 @@ packages: zod@3.25.57: resolution: {integrity: sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA==} + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + snapshots: '@adobe/css-tools@4.4.1': {} @@ -19533,6 +19887,15 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@better-auth/core@1.3.27': + dependencies: + better-call: 1.0.19 + zod: 4.1.12 + + '@better-auth/utils@0.3.0': {} + + '@better-fetch/fetch@1.1.18': {} + '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 @@ -19651,6 +20014,24 @@ snapshots: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 + '@convex-dev/better-auth@0.9.7(@standard-schema/spec@1.0.0)(better-auth@1.3.27(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.10))(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2)': + dependencies: + better-auth: 1.3.27(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.10) + common-tags: 1.8.2 + convex: 1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-helpers: 0.1.104(@standard-schema/spec@1.0.0)(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@3.25.57) + jose: 6.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + remeda: 2.32.0 + semver: 7.7.3 + type-fest: 4.41.0 + zod: 3.25.57 + transitivePeerDependencies: + - '@standard-schema/spec' + - hono + - typescript + '@convex-dev/react-query@0.0.0-alpha.8(@tanstack/react-query@5.90.6(react@19.0.0))(convex@1.19.0(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': dependencies: '@tanstack/react-query': 5.90.6(react@19.0.0) @@ -20638,6 +21019,8 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@hexagon/base64@1.1.28': {} + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -20964,6 +21347,8 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@levischuck/tiny-cbor@0.2.11': {} + '@lix-js/sdk@0.4.7(babel-plugin-macros@3.1.0)': dependencies: '@lix-js/server-protocol-schema': 0.1.1 @@ -21477,6 +21862,10 @@ snapshots: - rollup - supports-color + '@noble/ciphers@2.0.1': {} + + '@noble/hashes@2.0.1': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -21612,8 +22001,84 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 - '@peculiar/asn1-schema@2.3.15': + '@peculiar/asn1-android@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-cms@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + '@peculiar/asn1-x509-attr': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.5.0': dependencies: + '@peculiar/asn1-cms': 2.5.0 + '@peculiar/asn1-pkcs8': 2.5.0 + '@peculiar/asn1-rsa': 2.5.0 + '@peculiar/asn1-schema': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.5.0': + dependencies: + '@peculiar/asn1-cms': 2.5.0 + '@peculiar/asn1-pfx': 2.5.0 + '@peculiar/asn1-pkcs8': 2.5.0 + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + '@peculiar/asn1-x509-attr': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.5.0': + dependencies: + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.5.0': + dependencies: + '@peculiar/asn1-schema': 2.5.0 asn1js: 3.0.6 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -21624,12 +22089,26 @@ snapshots: '@peculiar/webcrypto@1.5.0': dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.6 tslib: 2.8.1 webcrypto-core: 1.8.1 + '@peculiar/x509@1.14.0': + dependencies: + '@peculiar/asn1-cms': 2.5.0 + '@peculiar/asn1-csr': 2.5.0 + '@peculiar/asn1-ecc': 2.5.0 + '@peculiar/asn1-pkcs9': 2.5.0 + '@peculiar/asn1-rsa': 2.5.0 + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -22917,6 +23396,19 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@simplewebauthn/browser@13.2.2': {} + + '@simplewebauthn/server@13.2.2': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.11 + '@peculiar/asn1-android': 2.5.0 + '@peculiar/asn1-ecc': 2.5.0 + '@peculiar/asn1-rsa': 2.5.0 + '@peculiar/asn1-schema': 2.5.0 + '@peculiar/asn1-x509': 2.5.0 + '@peculiar/x509': 1.14.0 + '@sinclair/typebox@0.31.28': {} '@sinclair/typebox@0.34.38': {} @@ -22976,6 +23468,10 @@ snapshots: '@solid-primitives/utils': 6.3.0(solid-js@1.9.10) solid-js: 1.9.10 + '@solid-primitives/context@0.3.2(solid-js@1.9.10)': + dependencies: + solid-js: 1.9.10 + '@solid-primitives/cursor@0.0.115(solid-js@1.9.10)': dependencies: '@solid-primitives/utils': 6.3.0(solid-js@1.9.10) @@ -23199,6 +23695,16 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.15 + '@tailwindcss/node@4.1.17': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.17 + '@tailwindcss/node@4.1.6': dependencies: '@ampproject/remapping': 2.3.0 @@ -23215,6 +23721,9 @@ snapshots: '@tailwindcss/oxide-android-arm64@4.1.15': optional: true + '@tailwindcss/oxide-android-arm64@4.1.17': + optional: true + '@tailwindcss/oxide-android-arm64@4.1.6': optional: true @@ -23224,6 +23733,9 @@ snapshots: '@tailwindcss/oxide-darwin-arm64@4.1.15': optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.17': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.6': optional: true @@ -23233,6 +23745,9 @@ snapshots: '@tailwindcss/oxide-darwin-x64@4.1.15': optional: true + '@tailwindcss/oxide-darwin-x64@4.1.17': + optional: true + '@tailwindcss/oxide-darwin-x64@4.1.6': optional: true @@ -23242,6 +23757,9 @@ snapshots: '@tailwindcss/oxide-freebsd-x64@4.1.15': optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.17': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.6': optional: true @@ -23251,6 +23769,9 @@ snapshots: '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.15': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.6': optional: true @@ -23260,6 +23781,9 @@ snapshots: '@tailwindcss/oxide-linux-arm64-gnu@4.1.15': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.6': optional: true @@ -23269,6 +23793,9 @@ snapshots: '@tailwindcss/oxide-linux-arm64-musl@4.1.15': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.6': optional: true @@ -23278,6 +23805,9 @@ snapshots: '@tailwindcss/oxide-linux-x64-gnu@4.1.15': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.6': optional: true @@ -23287,6 +23817,9 @@ snapshots: '@tailwindcss/oxide-linux-x64-musl@4.1.15': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.6': optional: true @@ -23296,6 +23829,9 @@ snapshots: '@tailwindcss/oxide-wasm32-wasi@4.1.15': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.6': optional: true @@ -23305,6 +23841,9 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc@4.1.15': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.6': optional: true @@ -23314,6 +23853,9 @@ snapshots: '@tailwindcss/oxide-win32-x64-msvc@4.1.15': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.6': optional: true @@ -23350,6 +23892,21 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.15 '@tailwindcss/oxide-win32-x64-msvc': 4.1.15 + '@tailwindcss/oxide@4.1.17': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 + '@tailwindcss/oxide@4.1.6': dependencies: detect-libc: 2.0.4 @@ -23383,6 +23940,13 @@ snapshots: tailwindcss: 4.1.13 vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + '@tailwindcss/vite@4.1.17(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + tailwindcss: 4.1.17 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + '@tailwindcss/vite@4.1.6(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.6 @@ -24820,6 +25384,34 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + better-auth@1.3.27(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.10): + dependencies: + '@better-auth/core': 1.3.27 + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.18 + '@noble/ciphers': 2.0.1 + '@noble/hashes': 2.0.1 + '@simplewebauthn/browser': 13.2.2 + '@simplewebauthn/server': 13.2.2 + better-call: 1.0.19 + defu: 6.1.4 + jose: 6.1.0 + kysely: 0.28.8 + nanostores: 1.0.1 + zod: 4.1.12 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + solid-js: 1.9.10 + + better-call@1.0.19: + dependencies: + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.18 + rou3: 0.5.1 + set-cookie-parser: 2.7.2 + uncrypto: 0.1.3 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -25164,6 +25756,8 @@ snapshots: common-path-prefix@3.0.0: {} + common-tags@1.8.2: {} + commondir@1.0.1: {} compare-func@2.0.0: @@ -25250,6 +25844,25 @@ snapshots: convert-source-map@2.0.0: {} + convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@3.25.57): + dependencies: + convex: 1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@standard-schema/spec': 1.0.0 + react: 19.0.0 + typescript: 5.9.2 + zod: 3.25.57 + + convex-solidjs@0.0.3(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(solid-js@1.9.10): + dependencies: + '@solid-primitives/context': 0.3.2(solid-js@1.9.10) + convex: 1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + solid-js: 1.9.10 + transitivePeerDependencies: + - '@auth0/auth0-react' + - '@clerk/clerk-react' + - react + convex@1.19.0(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: esbuild: 0.23.0 @@ -25260,6 +25873,14 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0): + dependencies: + esbuild: 0.25.4 + prettier: 3.6.2 + optionalDependencies: + '@clerk/clerk-react': 5.53.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + cookie-es@1.2.2: {} cookie-es@2.0.0: {} @@ -27090,6 +27711,8 @@ snapshots: jose@6.0.10: {} + jose@6.1.0: {} + jpeg-js@0.4.4: {} js-cookie@3.0.5: {} @@ -27259,6 +27882,8 @@ snapshots: kysely@0.27.6: {} + kysely@0.28.8: {} + lambda-local@2.2.0: dependencies: commander: 10.0.1 @@ -27558,6 +28183,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -27828,6 +28457,8 @@ snapshots: nanoid@3.3.11: {} + nanostores@1.0.1: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -28805,10 +29436,16 @@ snapshots: reduce-configs@1.1.0: {} + reflect-metadata@0.2.2: {} + regenerator-runtime@0.14.1: {} relateurl@0.2.7: {} + remeda@2.32.0: + dependencies: + type-fest: 4.41.0 + remove-trailing-separator@1.1.0: {} renderkid@3.0.0: @@ -28947,6 +29584,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 + rou3@0.5.1: {} + rou3@0.7.5: {} rou3@0.7.8: {} @@ -29025,6 +29664,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -29103,6 +29744,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@2.7.2: {} + setprototypeof@1.1.0: {} setprototypeof@1.2.0: {} @@ -29252,9 +29895,9 @@ snapshots: solid-refresh@0.6.3(solid-js@1.9.10): dependencies: - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.3 '@babel/helper-module-imports': 7.27.1 - '@babel/types': 7.27.7 + '@babel/types': 7.28.4 solid-js: 1.9.10 transitivePeerDependencies: - supports-color @@ -29501,6 +30144,8 @@ snapshots: tailwindcss@4.1.16: {} + tailwindcss@4.1.17: {} + tailwindcss@4.1.6: {} tapable@2.2.1: {} @@ -29710,6 +30355,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tslib@1.14.1: {} + tslib@2.8.1: {} tsx@4.19.2: @@ -29726,6 +30373,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -30158,7 +30809,7 @@ snapshots: vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: - debug: 4.4.0 + debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.8.2) optionalDependencies: @@ -30169,7 +30820,7 @@ snapshots: vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: - debug: 4.4.0 + debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.8.3) optionalDependencies: @@ -30180,7 +30831,7 @@ snapshots: vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: - debug: 4.4.0 + debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.9.2) optionalDependencies: @@ -30195,7 +30846,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.10.2 @@ -30212,7 +30863,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.10.2 @@ -30227,7 +30878,7 @@ snapshots: optionalDependencies: vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) - vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6(@types/node@22.10.2)(playwright@1.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4))(@vitest/ui@3.0.6(vitest@3.2.4))(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -30256,7 +30907,7 @@ snapshots: '@types/node': 22.10.2 '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.0.6(vitest@3.2.4) - jsdom: 25.0.1 + jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti - less @@ -30271,7 +30922,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -30300,7 +30951,7 @@ snapshots: '@types/node': 22.10.2 '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.0.6(vitest@3.2.4) - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 25.0.1 transitivePeerDependencies: - jiti - less @@ -30368,7 +31019,7 @@ snapshots: webcrypto-core@1.8.1: dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -30732,3 +31383,5 @@ snapshots: zod@3.22.3: {} zod@3.25.57: {} + + zod@4.1.12: {}