From 3b3b3a5528c8ab42f006fd40958f75f40d27b473 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:09:08 +0200 Subject: [PATCH 01/16] add tanstack start example app --- apps/nextjs/package.json | 1 - apps/tanstack-start/eslint.config.ts | 13 + apps/tanstack-start/package.json | 54 + apps/tanstack-start/public/favicon.ico | Bin 0 -> 103027 bytes apps/tanstack-start/src/auth/client.ts | 3 + apps/tanstack-start/src/auth/server.ts | 16 + .../src/component/auth-showcase.tsx | 48 + apps/tanstack-start/src/env.ts | 36 + apps/tanstack-start/src/lib/trpc.ts | 33 + apps/tanstack-start/src/lib/url.ts | 16 + apps/tanstack-start/src/routeTree.gen.ts | 105 ++ apps/tanstack-start/src/router.tsx | 46 + apps/tanstack-start/src/routes/__root.tsx | 50 + apps/tanstack-start/src/routes/api.auth.$.ts | 16 + apps/tanstack-start/src/routes/api/trpc.$.ts | 30 + apps/tanstack-start/src/routes/index.tsx | 216 +++ apps/tanstack-start/src/styles.css | 33 + apps/tanstack-start/tsconfig.json | 22 + apps/tanstack-start/vite.config.ts | 19 + package.json | 1 + packages/auth/src/index.ts | 7 +- pnpm-lock.yaml | 1490 ++++++++++++++++- pnpm-workspace.yaml | 1 + 23 files changed, 2176 insertions(+), 80 deletions(-) create mode 100644 apps/tanstack-start/eslint.config.ts create mode 100644 apps/tanstack-start/package.json create mode 100644 apps/tanstack-start/public/favicon.ico create mode 100644 apps/tanstack-start/src/auth/client.ts create mode 100644 apps/tanstack-start/src/auth/server.ts create mode 100644 apps/tanstack-start/src/component/auth-showcase.tsx create mode 100644 apps/tanstack-start/src/env.ts create mode 100644 apps/tanstack-start/src/lib/trpc.ts create mode 100644 apps/tanstack-start/src/lib/url.ts create mode 100644 apps/tanstack-start/src/routeTree.gen.ts create mode 100644 apps/tanstack-start/src/router.tsx create mode 100644 apps/tanstack-start/src/routes/__root.tsx create mode 100644 apps/tanstack-start/src/routes/api.auth.$.ts create mode 100644 apps/tanstack-start/src/routes/api/trpc.$.ts create mode 100644 apps/tanstack-start/src/routes/index.tsx create mode 100644 apps/tanstack-start/src/styles.css create mode 100644 apps/tanstack-start/tsconfig.json create mode 100644 apps/tanstack-start/vite.config.ts diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index b40c46cf4c..181f6b7d4c 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -38,7 +38,6 @@ "@types/node": "^22.18.10", "@types/react": "catalog:react19", "@types/react-dom": "catalog:react19", - "dotenv-cli": "^10.0.0", "eslint": "catalog:", "jiti": "^2.5.1", "prettier": "catalog:", diff --git a/apps/tanstack-start/eslint.config.ts b/apps/tanstack-start/eslint.config.ts new file mode 100644 index 0000000000..ed900db148 --- /dev/null +++ b/apps/tanstack-start/eslint.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "eslint/config"; + +import { baseConfig, restrictEnvAccess } from "@acme/eslint-config/base"; +import { reactConfig } from "@acme/eslint-config/react"; + +export default defineConfig( + { + ignores: [".next/**"], + }, + baseConfig, + reactConfig, + restrictEnvAccess, +); diff --git a/apps/tanstack-start/package.json b/apps/tanstack-start/package.json new file mode 100644 index 0000000000..179b12a682 --- /dev/null +++ b/apps/tanstack-start/package.json @@ -0,0 +1,54 @@ +{ + "name": "@acme/tanstack-start", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "pnpm with-env vite dev", + "build": "vite build && tsc --noEmit", + "start": "vite start", + "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint --flag unstable_native_nodejs_ts_config", + "with-env": "dotenv -e ../../.env --" + }, + "dependencies": { + "@acme/api": "workspace:*", + "@acme/auth": "workspace:*", + "@acme/db": "workspace:*", + "@acme/ui": "workspace:*", + "@fontsource-variable/geist": "^5.2.8", + "@fontsource-variable/geist-mono": "^5.2.7", + "@t3-oss/env-core": "^0.13.8", + "@tanstack/react-query": "catalog:", + "@tanstack/react-router": "^1.132.47", + "@tanstack/react-router-devtools": "^1.132.51", + "@tanstack/react-router-ssr-query": "^1.132.47", + "@tanstack/react-start": "^1.132.52", + "@trpc/client": "catalog:", + "@trpc/server": "catalog:", + "@trpc/tanstack-react-query": "catalog:", + "better-auth": "1.3.27", + "react": "catalog:react19", + "react-dom": "catalog:react19", + "superjson": "2.2.2", + "zod": "catalog:" + }, + "devDependencies": { + "@acme/eslint-config": "workspace:*", + "@acme/prettier-config": "workspace:*", + "@acme/tailwind-config": "workspace:*", + "@acme/tsconfig": "workspace:*", + "@tailwindcss/vite": "catalog:", + "@types/node": "^22.18.10", + "@types/react": "catalog:react19", + "@types/react-dom": "catalog:react19", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "catalog:", + "prettier": "catalog:", + "tailwindcss": "catalog:", + "typescript": "catalog:", + "vite": "^7.1.7", + "vite-tsconfig-paths": "^5.1.4" + }, + "prettier": "@acme/prettier-config" +} diff --git a/apps/tanstack-start/public/favicon.ico b/apps/tanstack-start/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f0058b404f98275b58117d309a8b3753c54aa619 GIT binary patch literal 103027 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 { + const res = await authClient.signIn.social({ + provider: "discord", + callbackURL: "/", + }); + if (!res.data?.url) { + throw new Error("No URL returned from signInSocial"); + } + await navigate({ href: res.data.url, replace: true }); + }} + > + Sign in with Discord + + ); + } + + return ( +
+

+ Logged in as {session.user.name} +

+ + +
+ ); +} diff --git a/apps/tanstack-start/src/env.ts b/apps/tanstack-start/src/env.ts new file mode 100644 index 0000000000..a595f54182 --- /dev/null +++ b/apps/tanstack-start/src/env.ts @@ -0,0 +1,36 @@ +import { createEnv } from "@t3-oss/env-core"; +import { vercel } from "@t3-oss/env-core/presets-zod"; +import { z } from "zod/v4"; + +import { authEnv } from "@acme/auth/env"; + +export const env = createEnv({ + clientPrefix: "VITE_", + extends: [authEnv(), vercel()], + shared: { + NODE_ENV: z + .enum(["development", "production", "test"]) + .default("development"), + }, + /** + * Specify your server-side environment variables schema here. + * This way you can ensure the app isn't built with invalid env vars. + */ + server: { + POSTGRES_URL: z.url(), + }, + + /** + * Specify your client-side environment variables schema here. + * For them to be exposed to the client, prefix them with `NEXT_PUBLIC_`. + */ + client: { + // NEXT_PUBLIC_CLIENTVAR: z.string(), + }, + /** + * Destructure all variables from `process.env` to make sure they aren't tree-shaken away. + */ + runtimeEnv: process.env, + skipValidation: + !!process.env.CI || process.env.npm_lifecycle_event === "lint", +}); diff --git a/apps/tanstack-start/src/lib/trpc.ts b/apps/tanstack-start/src/lib/trpc.ts new file mode 100644 index 0000000000..a6e4189ce8 --- /dev/null +++ b/apps/tanstack-start/src/lib/trpc.ts @@ -0,0 +1,33 @@ +import { + createTRPCClient, + httpBatchStreamLink, + loggerLink, +} from "@trpc/client"; +import { createTRPCContext } from "@trpc/tanstack-react-query"; +import SuperJSON from "superjson"; + +import type { AppRouter } from "@acme/api"; + +import { env } from "~/env"; +import { getBaseUrl } from "~/lib/url"; + +export const trpcClient = createTRPCClient({ + links: [ + loggerLink({ + enabled: (op) => + env.NODE_ENV === "development" || + (op.direction === "down" && op.result instanceof Error), + }), + httpBatchStreamLink({ + transformer: SuperJSON, + url: getBaseUrl() + "/api/trpc", + headers() { + const headers = new Headers(); + headers.set("x-trpc-source", "nextjs-react"); + return headers; + }, + }), + ], +}); + +export const { useTRPC, TRPCProvider } = createTRPCContext(); diff --git a/apps/tanstack-start/src/lib/url.ts b/apps/tanstack-start/src/lib/url.ts new file mode 100644 index 0000000000..8df496d018 --- /dev/null +++ b/apps/tanstack-start/src/lib/url.ts @@ -0,0 +1,16 @@ +import { env } from "~/env"; + +export function getBaseUrl() { + if (typeof window !== "undefined") { + return window.location.origin; + } + if (env.VERCEL_ENV === "production") { + return `https://${env.VERCEL_PROJECT_PRODUCTION_URL}`; + } + if (env.VERCEL_ENV === "preview") { + return `https://${env.VERCEL_URL}`; + } + + // eslint-disable-next-line no-restricted-properties + return `http://localhost:${process.env.PORT ?? 3001}`; +} diff --git a/apps/tanstack-start/src/routeTree.gen.ts b/apps/tanstack-start/src/routeTree.gen.ts new file mode 100644 index 0000000000..42ee0fa1f7 --- /dev/null +++ b/apps/tanstack-start/src/routeTree.gen.ts @@ -0,0 +1,105 @@ +/* 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 type { createStart } from "@tanstack/react-start"; + +import type { getRouter } from "./router.tsx"; +import { Route as rootRouteImport } from "./routes/__root"; +import { Route as ApiAuthSplatRouteImport } from "./routes/api.auth.$"; +import { Route as ApiTrpcSplatRouteImport } from "./routes/api/trpc.$"; +import { Route as IndexRouteImport } from "./routes/index"; + +const IndexRoute = IndexRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => rootRouteImport, +} as any); +const ApiTrpcSplatRoute = ApiTrpcSplatRouteImport.update({ + id: "/api/trpc/$", + path: "/api/trpc/$", + getParentRoute: () => rootRouteImport, +} as any); +const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({ + id: "/api/auth/$", + path: "/api/auth/$", + getParentRoute: () => rootRouteImport, +} as any); + +export interface FileRoutesByFullPath { + "/": typeof IndexRoute; + "/api/auth/$": typeof ApiAuthSplatRoute; + "/api/trpc/$": typeof ApiTrpcSplatRoute; +} +export interface FileRoutesByTo { + "/": typeof IndexRoute; + "/api/auth/$": typeof ApiAuthSplatRoute; + "/api/trpc/$": typeof ApiTrpcSplatRoute; +} +export interface FileRoutesById { + __root__: typeof rootRouteImport; + "/": typeof IndexRoute; + "/api/auth/$": typeof ApiAuthSplatRoute; + "/api/trpc/$": typeof ApiTrpcSplatRoute; +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath; + fullPaths: "/" | "/api/auth/$" | "/api/trpc/$"; + fileRoutesByTo: FileRoutesByTo; + to: "/" | "/api/auth/$" | "/api/trpc/$"; + id: "__root__" | "/" | "/api/auth/$" | "/api/trpc/$"; + fileRoutesById: FileRoutesById; +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute; + ApiAuthSplatRoute: typeof ApiAuthSplatRoute; + ApiTrpcSplatRoute: typeof ApiTrpcSplatRoute; +} + +declare module "@tanstack/react-router" { + interface FileRoutesByPath { + "/": { + id: "/"; + path: "/"; + fullPath: "/"; + preLoaderRoute: typeof IndexRouteImport; + parentRoute: typeof rootRouteImport; + }; + "/api/trpc/$": { + id: "/api/trpc/$"; + path: "/api/trpc/$"; + fullPath: "/api/trpc/$"; + preLoaderRoute: typeof ApiTrpcSplatRouteImport; + parentRoute: typeof rootRouteImport; + }; + "/api/auth/$": { + id: "/api/auth/$"; + path: "/api/auth/$"; + fullPath: "/api/auth/$"; + preLoaderRoute: typeof ApiAuthSplatRouteImport; + parentRoute: typeof rootRouteImport; + }; + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ApiAuthSplatRoute: ApiAuthSplatRoute, + ApiTrpcSplatRoute: ApiTrpcSplatRoute, +}; +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes(); + +declare module "@tanstack/react-start" { + interface Register { + ssr: true; + router: Awaited>; + } +} diff --git a/apps/tanstack-start/src/router.tsx b/apps/tanstack-start/src/router.tsx new file mode 100644 index 0000000000..7a2554dba3 --- /dev/null +++ b/apps/tanstack-start/src/router.tsx @@ -0,0 +1,46 @@ +import { QueryClient } from "@tanstack/react-query"; +import { createRouter } from "@tanstack/react-router"; +import { setupRouterSsrQueryIntegration } from "@tanstack/react-router-ssr-query"; +import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query"; +import SuperJSON from "superjson"; + +import { trpcClient, TRPCProvider } from "~/lib/trpc"; +import { routeTree } from "./routeTree.gen"; + +export function getRouter() { + const queryClient = new QueryClient({ + defaultOptions: { + dehydrate: { serializeData: SuperJSON.serialize }, + hydrate: { deserializeData: SuperJSON.deserialize }, + }, + }); + const trpc = createTRPCOptionsProxy({ + client: trpcClient, + queryClient, + }); + + const router = createRouter({ + routeTree, + context: { queryClient, trpc }, + defaultPreload: "intent", + Wrap: (props) => ( + + ), + }); + setupRouterSsrQueryIntegration({ + router, + queryClient, + }); + + return router; +} + +declare module "@tanstack/react-router" { + interface Register { + router: ReturnType; + } +} diff --git a/apps/tanstack-start/src/routes/__root.tsx b/apps/tanstack-start/src/routes/__root.tsx new file mode 100644 index 0000000000..b06aca00d8 --- /dev/null +++ b/apps/tanstack-start/src/routes/__root.tsx @@ -0,0 +1,50 @@ +/// +import type { QueryClient } from "@tanstack/react-query"; +import type { TRPCOptionsProxy } from "@trpc/tanstack-react-query"; +import type * as React from "react"; +import { + createRootRouteWithContext, + HeadContent, + Outlet, + Scripts, +} from "@tanstack/react-router"; +import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; + +import type { AppRouter } from "@acme/api"; +import { Toaster } from "@acme/ui/toast"; + +import appCss from "~/styles.css?url"; + +export const Route = createRootRouteWithContext<{ + queryClient: QueryClient; + trpc: TRPCOptionsProxy; +}>()({ + head: () => ({ + links: [{ rel: "stylesheet", href: appCss }], + }), + component: RootComponent, +}); + +function RootComponent() { + return ( + + + + ); +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + + + ); +} diff --git a/apps/tanstack-start/src/routes/api.auth.$.ts b/apps/tanstack-start/src/routes/api.auth.$.ts new file mode 100644 index 0000000000..226720e40c --- /dev/null +++ b/apps/tanstack-start/src/routes/api.auth.$.ts @@ -0,0 +1,16 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { auth } from "~/auth/server"; + +export const Route = createFileRoute("/api/auth/$")({ + server: { + handlers: { + GET: ({ request }) => { + return auth.handler(request); + }, + POST: ({ request }) => { + return auth.handler(request); + }, + }, + }, +}); diff --git a/apps/tanstack-start/src/routes/api/trpc.$.ts b/apps/tanstack-start/src/routes/api/trpc.$.ts new file mode 100644 index 0000000000..c9f3d70351 --- /dev/null +++ b/apps/tanstack-start/src/routes/api/trpc.$.ts @@ -0,0 +1,30 @@ +import { createFileRoute } from "@tanstack/react-router"; +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; + +import { appRouter, createTRPCContext } from "@acme/api"; + +import { auth } from "~/auth/server"; + +const handler = (req: Request) => + fetchRequestHandler({ + endpoint: "/api/trpc", + router: appRouter, + req, + createContext: () => + createTRPCContext({ + auth: auth, + headers: req.headers, + }), + onError({ error, path }) { + console.error(`>>> tRPC Error on '${path}'`, error); + }, + }); + +export const Route = createFileRoute("/api/trpc/$")({ + server: { + handlers: { + GET: ({ request }) => handler(request), + POST: ({ request }) => handler(request), + }, + }, +}); diff --git a/apps/tanstack-start/src/routes/index.tsx b/apps/tanstack-start/src/routes/index.tsx new file mode 100644 index 0000000000..fd4cd4db05 --- /dev/null +++ b/apps/tanstack-start/src/routes/index.tsx @@ -0,0 +1,216 @@ +import { Suspense } from "react"; +import { + useMutation, + useQueryClient, + useSuspenseQuery, +} from "@tanstack/react-query"; +import { createFileRoute } from "@tanstack/react-router"; + +import type { RouterOutputs } from "@acme/api"; +import { CreatePostSchema } from "@acme/db/schema"; +import { cn } from "@acme/ui"; +import { Button } from "@acme/ui/button"; +import { + Form, + FormControl, + FormField, + FormItem, + FormMessage, + useForm, +} from "@acme/ui/form"; +import { Input } from "@acme/ui/input"; +import { toast } from "@acme/ui/toast"; + +import { AuthShowcase } from "~/component/auth-showcase"; +import { useTRPC } from "~/lib/trpc"; + +export const Route = createFileRoute("/")({ + loader: ({ context }) => { + const { trpc, queryClient } = context; + void queryClient.prefetchQuery(trpc.post.all.queryOptions()); + }, + component: RouteComponent, +}); + +function RouteComponent() { + return ( +
+
+

+ Create T3 Turbo +

+ + + +
+ + + + +
+ } + > + + +
+ +
+ ); +} + +function CreatePostForm() { + const trpc = useTRPC(); + const form = useForm({ + schema: CreatePostSchema, + defaultValues: { + content: "", + title: "", + }, + }); + + const queryClient = useQueryClient(); + const createPost = useMutation( + trpc.post.create.mutationOptions({ + onSuccess: async () => { + form.reset(); + await queryClient.invalidateQueries(trpc.post.pathFilter()); + }, + onError: (err) => { + toast.error( + err.data?.code === "UNAUTHORIZED" + ? "You must be logged in to post" + : "Failed to create post", + ); + }, + }), + ); + + return ( +
+ { + createPost.mutate(data); + })} + > + ( + + + + + + + )} + /> + ( + + + + + + + )} + /> + + + + ); +} + +function PostList() { + const trpc = useTRPC(); + const { data: posts } = useSuspenseQuery(trpc.post.all.queryOptions()); + + if (posts.length === 0) { + return ( +
+ + + + +
+

No posts yet

+
+
+ ); + } + + return ( +
+ {posts.map((p) => { + return ; + })} +
+ ); +} + +function PostCard(props: { post: RouterOutputs["post"]["all"][number] }) { + const trpc = useTRPC(); + const queryClient = useQueryClient(); + const deletePost = useMutation( + trpc.post.delete.mutationOptions({ + onSuccess: async () => { + await queryClient.invalidateQueries(trpc.post.pathFilter()); + }, + onError: (err) => { + toast.error( + err.data?.code === "UNAUTHORIZED" + ? "You must be logged in to delete a post" + : "Failed to delete post", + ); + }, + }), + ); + + return ( +
+
+

{props.post.title}

+

{props.post.content}

+
+
+ +
+
+ ); +} + +function PostCardSkeleton(props: { pulse?: boolean }) { + const { pulse = true } = props; + return ( +
+
+

+   +

+

+   +

+
+
+ ); +} diff --git a/apps/tanstack-start/src/styles.css b/apps/tanstack-start/src/styles.css new file mode 100644 index 0000000000..116374dc10 --- /dev/null +++ b/apps/tanstack-start/src/styles.css @@ -0,0 +1,33 @@ +@import "tailwindcss"; +@import "@acme/tailwind-config/theme"; + +@import "@fontsource-variable/geist"; +@import "@fontsource-variable/geist-mono"; + +@source '../../../packages/ui/src/*.{ts,tsx}'; + +/* @custom-variant dark (&:is(.dark *)); */ + +@utility container { + margin-inline: auto; + padding-inline: 2rem; + @media (width >= --theme(--breakpoint-sm)) { + max-width: none; + } + @media (width >= 1400px) { + max-width: 1400px; + } +} + +@layer base { + :root { + --font-geist-sans: "Geist Variable"; + --font-geist-mono: "Geist Mono Variable"; + } + * { + @apply border-border; + } + body { + letter-spacing: var(--tracking-normal); + } +} diff --git a/apps/tanstack-start/tsconfig.json b/apps/tanstack-start/tsconfig.json new file mode 100644 index 0000000000..b3a2d67dfa --- /dev/null +++ b/apps/tanstack-start/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx", "public/script*.js"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "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/apps/tanstack-start/vite.config.ts b/apps/tanstack-start/vite.config.ts new file mode 100644 index 0000000000..af7d518d8a --- /dev/null +++ b/apps/tanstack-start/vite.config.ts @@ -0,0 +1,19 @@ +import tailwindcss from "@tailwindcss/vite"; +import { tanstackStart } from "@tanstack/react-start/plugin/vite"; +import viteReact from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import tsConfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + server: { + port: 3001, + }, + plugins: [ + tsConfigPaths({ + projects: ["./tsconfig.json"], + }), + tanstackStart(), + viteReact(), + tailwindcss(), + ], +}); diff --git a/package.json b/package.json index 5daa6959e9..c463f5e611 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "devDependencies": { "@acme/prettier-config": "workspace:*", "@turbo/gen": "^2.5.8", + "dotenv-cli": "^10.0.0", "prettier": "catalog:", "turbo": "^2.5.8", "typescript": "catalog:" diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index e06d0d9f49..c915e82523 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -1,4 +1,4 @@ -import type { BetterAuthOptions } from "better-auth"; +import type { BetterAuthOptions, BetterAuthPlugin } from "better-auth"; import { expo } from "@better-auth/expo"; import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; @@ -6,13 +6,15 @@ import { oAuthProxy } from "better-auth/plugins"; import { db } from "@acme/db/client"; -export function initAuth(options: { +export function initAuth(options: { baseUrl: string; productionUrl: string; secret: string | undefined; discordClientId: string; discordClientSecret: string; + + plugins?: TPlugins; }) { const config = { database: drizzleAdapter(db, { @@ -29,6 +31,7 @@ export function initAuth(options: { productionURL: options.productionUrl, }), expo(), + ...(options.plugins ?? []), ], socialProviders: { discord: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec95400602..4f75e060df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,9 @@ catalogs: '@tailwindcss/postcss': specifier: ^4.1.14 version: 4.1.14 + '@tailwindcss/vite': + specifier: ^4.1.14 + version: 4.1.14 '@tanstack/react-query': specifier: ^5.90.2 version: 5.90.2 @@ -66,6 +69,9 @@ importers: '@turbo/gen': specifier: ^2.5.8 version: 2.5.8(@types/node@24.7.2)(typescript@5.9.3) + dotenv-cli: + specifier: ^10.0.0 + version: 10.0.0 prettier: specifier: 'catalog:' version: 3.6.2 @@ -266,9 +272,6 @@ importers: '@types/react-dom': specifier: catalog:react19 version: 19.1.9(@types/react@19.1.12) - dotenv-cli: - specifier: ^10.0.0 - version: 10.0.0 eslint: specifier: 'catalog:' version: 9.37.0(jiti@2.6.1) @@ -288,6 +291,115 @@ importers: specifier: 'catalog:' version: 5.9.3 + apps/tanstack-start: + dependencies: + '@acme/api': + specifier: workspace:* + version: link:../../packages/api + '@acme/auth': + specifier: workspace:* + version: link:../../packages/auth + '@acme/db': + specifier: workspace:* + version: link:../../packages/db + '@acme/ui': + specifier: workspace:* + version: link:../../packages/ui + '@fontsource-variable/geist': + specifier: ^5.2.8 + version: 5.2.8 + '@fontsource-variable/geist-mono': + specifier: ^5.2.7 + version: 5.2.7 + '@t3-oss/env-core': + specifier: ^0.13.8 + version: 0.13.8(arktype@2.1.20)(typescript@5.9.3)(valibot@1.0.0-beta.15(typescript@5.9.3))(zod@4.1.12) + '@tanstack/react-query': + specifier: 'catalog:' + version: 5.90.2(react@19.1.1) + '@tanstack/react-router': + specifier: ^1.132.47 + version: 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-router-devtools': + specifier: ^1.132.51 + version: 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.47)(@types/node@22.18.10)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router-ssr-query': + specifier: ^1.132.47 + version: 1.132.47(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.47)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start': + specifier: ^1.132.52 + version: 1.132.52(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@trpc/client': + specifier: 'catalog:' + version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/server': + specifier: 'catalog:' + version: 11.6.0(typescript@5.9.3) + '@trpc/tanstack-react-query': + specifier: 'catalog:' + version: 11.6.0(@tanstack/react-query@5.90.2(react@19.1.1))(@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.6.0(typescript@5.9.3))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3) + better-auth: + specifier: 1.3.27 + version: 1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + react: + specifier: catalog:react19 + version: 19.1.1 + react-dom: + specifier: catalog:react19 + version: 19.1.1(react@19.1.1) + superjson: + specifier: 2.2.2 + version: 2.2.2 + zod: + specifier: 'catalog:' + version: 4.1.12 + devDependencies: + '@acme/eslint-config': + specifier: workspace:* + version: link:../../tooling/eslint + '@acme/prettier-config': + specifier: workspace:* + version: link:../../tooling/prettier + '@acme/tailwind-config': + specifier: workspace:* + version: link:../../tooling/tailwind + '@acme/tsconfig': + specifier: workspace:* + version: link:../../tooling/typescript + '@tailwindcss/vite': + specifier: 'catalog:' + version: 4.1.14(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@types/node': + specifier: ^22.18.10 + version: 22.18.10 + '@types/react': + specifier: catalog:react19 + version: 19.1.12 + '@types/react-dom': + specifier: catalog:react19 + version: 19.1.9(@types/react@19.1.12) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.7.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + eslint: + specifier: 'catalog:' + version: 9.37.0(jiti@2.6.1) + prettier: + specifier: 'catalog:' + version: 3.6.2 + tailwindcss: + specifier: 'catalog:' + version: 4.1.14 + typescript: + specifier: 'catalog:' + version: 5.9.3 + vite: + specifier: ^7.1.7 + version: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + packages/api: dependencies: '@acme/auth': @@ -632,6 +744,10 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1679,6 +1795,12 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@fontsource-variable/geist-mono@5.2.7': + resolution: {integrity: sha512-ZKlZ5sjtalb2TwXKs400mAGDlt/+2ENLNySPx0wTz3bP3mWARCsUW+rpxzZc7e05d2qGch70pItt3K4qttbIYA==} + + '@fontsource-variable/geist@5.2.8': + resolution: {integrity: sha512-cJ6m9e+8MQ5dCYJsLylfZrgBh6KkG4bOLckB35Tr9J/EqdkEM6QllH5PxqP1dhTvFup+HtMRPuz9xOjxXJggxw==} + '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} @@ -2022,6 +2144,22 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -3038,6 +3176,122 @@ packages: '@react-navigation/routers@7.5.1': resolution: {integrity: sha512-pxipMW/iEBSUrjxz2cDD7fNwkqR4xoi0E/PcfTQGCcdJwLoaxzab5kSadBLj1MTJyT0YRrOXL9umHpXtp+Dv4w==} + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -3185,6 +3439,21 @@ packages: '@tailwindcss/postcss@4.1.14': resolution: {integrity: sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==} + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tanstack/directive-functions-plugin@1.132.51': + resolution: {integrity: sha512-0MFIPKxv9zfsLFPNybeaMXgTfBrTRAM52QAttWY02h2NHQ0P7Fl7tyZq8T/YVdE3zwixfQRnyK569Pf5ttdZog==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0 || >=7.0.0' + + '@tanstack/history@1.132.31': + resolution: {integrity: sha512-UCHM2uS0t/uSszqPEo+SBSSoQVeQ+LlOWAVBl5SA7+AedeAbKafIPjFn8huZCXNLAYb0WKV2+wETr7lDK9uz7g==} + engines: {node: '>=12'} + '@tanstack/query-core@5.90.2': resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} @@ -3193,6 +3462,140 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-router-devtools@1.132.51': + resolution: {integrity: sha512-09gHGUE9BVE6O+7u4ICnKigdPP0vZAYI70dKNqGp8bEy9jaMmHGlUxVV6pKqBLVgcPmwT9YMRAeJ5+QrcznXGA==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/react-router': ^1.132.47 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-router-ssr-query@1.132.47': + resolution: {integrity: sha512-cCjyn6u54ADvn0b+iJfmfoSgyCEbE6qhXcrvb0KdEeOMNXYG6syfxmJ5E3TTfW51khadv9tTqxu/0tPZ91RfMQ==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/query-core': '>=5.66.0' + '@tanstack/react-query': '>=5.66.2' + '@tanstack/react-router': '>=1.127.0' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-router@1.132.47': + resolution: {integrity: sha512-mjCN1ueVLHBOK1gqLeacCrUPBZietMKTkr7xZlC32dCGn4e+83zMSlRTS2TrEl7+wEH+bqjnoyx8ALYTSiQ1Cg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.132.48': + resolution: {integrity: sha512-XjeFcTa38vZ+Fx3H3awctFH2Fvaeme8FR/TV1hioiTqrvTI3bgi50G5q9QRIjsgA7rdcja9XyRGm3MNfpNLo7Q==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-server@1.132.48': + resolution: {integrity: sha512-PTKb7awJzb7XR9KJ/hfTQ7MnRAURnx0qBqfximPGqpzDYAjtTfj+95VR2fTuQ/J6N6B7uW1qik2tmUj/l6LTBQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.132.52': + resolution: {integrity: sha512-1Nt6ZUPRIQXPHj6iHPkXz37eTZ4wIk0T3fzeTD+s8+Aloe+yPAKbtcLgIl5CVY3UTqiaP6cwlp1F105naa/Crw==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + + '@tanstack/react-store@0.7.7': + resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.132.47': + resolution: {integrity: sha512-8YKFHmG6VUqXaWAJzEqjyW6w31dARS2USd2mtI5ZeZcihqMbskK28N4iotBXNn+sSKJnPRjc7A4jTnnEf8Mn8Q==} + engines: {node: '>=12'} + + '@tanstack/router-devtools-core@1.132.51': + resolution: {integrity: sha512-uhbk4rSeUpYaqOJLZwOwfyysSoeedIEiRWz37sTVM4tUBFsWqA/p9gO2kVSx/Xmcu8grLy512KNDDeji3QhdwQ==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/router-core': ^1.132.47 + csstype: ^3.0.10 + solid-js: '>=1.9.5' + tiny-invariant: ^1.3.3 + peerDependenciesMeta: + csstype: + optional: true + + '@tanstack/router-generator@1.132.51': + resolution: {integrity: sha512-iAGz2IZ2rr38o+7cgE33qPyNFJFx7PcPOvUXk5kcX1TtXeyTgVLoe7vqQzKYbungZmht2V8xSFmy6kakUJhxOA==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.132.51': + resolution: {integrity: sha512-eAC22XJmfJJU1f/wdW9j3e/U/74KFxUZfb38fVTugNAo+TUw58krS/XRrpOjZFnsg4lO4HseGntC4SxKD3agHw==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.132.47 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' + vite-plugin-solid: ^2.11.8 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-ssr-query-core@1.132.47': + resolution: {integrity: sha512-naDXetw6B2zEn+LkY7uhm8m0ZcxXASGlRETnRhHFwfSsO8llZ4oG+0Zajek3aYBNRGWbgimVTfom/sCWc/9l5Q==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/query-core': '>=5.66.0' + '@tanstack/router-core': '>=1.127.0' + + '@tanstack/router-utils@1.132.51': + resolution: {integrity: sha512-8wmYmc8LY0MhgNw1jfwjTdpYgl5CmvvkamoHOUcz4odFiAWOXLhwo3UBOwKihw+6SxJ/M7l9tEcq5PdLUOUi0Q==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.132.51': + resolution: {integrity: sha512-T0SbynWKY0HszwLLQWVq/MEjMD+zAN5aWCCIMJ+UZnF6V65Ug7/5bTR02IRwAgpxF1tCAqHNNhEtHJkKo3Nhjw==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.132.48': + resolution: {integrity: sha512-8aXQaqq3EDU5HxE6jyEq1q/I32Wwp6y1oZ7ey/QDsEUTS7jeSxn+z+JcY4z8hpUmFvDOJy3w39EWneR2qiKMXg==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.132.52': + resolution: {integrity: sha512-Myjt23+ihr+JIDzVIcKOMwbLFYYwOHat/xQWIL1GD8R64yL0/XVPw6+SIwqS/iJub7lAETE2EKXxo9ojE9H2JQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + vite: '>=7.0.0' + + '@tanstack/start-server-core@1.132.48': + resolution: {integrity: sha512-jEN2FqRXdoK0bahnLazdne+d3B5q+kXQlypMf+ZmSrqmLWXLTtRPdjL/E0m0741ZSdIYwCBQIdL4QkErhjnsVQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-storage-context@1.132.48': + resolution: {integrity: sha512-+QC2fXEHrcNhMoPojE18qf58kdd9kuja24xCpzuwSVq/3a8JAHvjj5H6bucZxydGbkD0MEnT3B+7wWx+8zM7Hw==} + engines: {node: '>=22.12.0'} + + '@tanstack/store@0.7.7': + resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} + + '@tanstack/virtual-file-routes@1.132.31': + resolution: {integrity: sha512-rxS8Cm2nIXroLqkm9pE/8X2lFNuvcTIIiFi5VH4PwzvKscAuaW3YRMN1WmaGDI2mVEn+GLaoY6Kc3jOczL5i4w==} + engines: {node: '>=12'} + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -3255,8 +3658,8 @@ packages: '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} @@ -3400,6 +3803,12 @@ packages: resolution: {integrity: sha512-fSD23DxGND40IzSkXjcFcxr53t3Tiym59Is0jSYIFpG4/0f0KO9SGtcp1sXiebvPaGe7N/tU05cH4yt2S6/IPg==} engines: {node: '>=18.14'} + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vue/compiler-core@3.5.16': resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} @@ -3487,6 +3896,10 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -3570,6 +3983,10 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -3593,6 +4010,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3721,12 +4141,19 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bplist-creator@0.1.0: resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} @@ -3849,9 +4276,20 @@ packages: chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.2: + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + engines: {node: '>=20.18.1'} + chevrotain@10.5.0: resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -3996,6 +4434,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -4024,6 +4465,13 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4154,6 +4602,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4162,6 +4614,19 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} @@ -4407,6 +4872,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -4418,6 +4886,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-editor@0.4.2: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} engines: {node: '>=8'} @@ -4841,6 +5313,18 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -5019,6 +5503,14 @@ packages: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + goober@2.1.18: + resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5037,6 +5529,15 @@ packages: resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} engines: {node: '>= 10.x'} + h3@2.0.0-beta.4: + resolution: {integrity: sha512-/JdwHUGuHjbBXAVxQN7T7QeI9cVlhsqMKVNFHebZVs9RoEYH85Ogh9O1DEy/1ZiJkmMwa1gNg6bBcGhc1Itjdg==} + engines: {node: '>=20.11.1'} + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -5104,6 +5605,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -5211,6 +5715,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.1: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} @@ -5370,6 +5878,10 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} + isbot@5.1.31: + resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -5984,6 +6496,9 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} @@ -6151,6 +6666,15 @@ packages: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} engines: {node: '>=10'} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -6219,6 +6743,10 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -6556,6 +7084,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -6594,10 +7126,18 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -6704,9 +7244,17 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + 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.7: + resolution: {integrity: sha512-z+6o7c3DarUbuBMLIdhzj2CqJLtUWrGk4fZlf07dIMitX3UpBXeInJ3lMD9huxj9yh9eo1RqtXf9aL0YzkDDUA==} + run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} @@ -6791,6 +7339,16 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -6900,6 +7458,9 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.9.9: + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} + sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -6921,6 +7482,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -6932,6 +7497,11 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + srvx@0.8.16: + resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} + engines: {node: '>=20.16.0'} + hasBin: true + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -7130,6 +7700,12 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} @@ -7139,6 +7715,10 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} @@ -7183,6 +7763,16 @@ packages: '@swc/wasm': optional: true + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -7192,6 +7782,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -7276,6 +7871,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -7298,6 +7896,10 @@ packages: resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} engines: {node: '>=18.17'} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -7326,6 +7928,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -7414,6 +8020,62 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -7430,9 +8092,20 @@ packages: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url-without-unicode@8.0.0-3: resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==} engines: {node: '>=10'} @@ -7539,6 +8212,10 @@ packages: resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} engines: {node: '>=4.0.0'} + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -7627,6 +8304,12 @@ snapshots: dependencies: '@babel/highlight': 7.25.9 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -8303,7 +8986,7 @@ snapshots: '@better-auth/core@1.3.27': dependencies: better-call: 1.0.19 - zod: 4.1.5 + zod: 4.1.12 '@better-auth/expo@1.3.27(better-auth@1.3.27(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(expo-constants@18.0.9)(expo-crypto@15.0.7(expo@54.0.13))(expo-linking@8.0.8)(expo-secure-store@15.0.7(expo@54.0.13))(expo-web-browser@15.0.8(expo@54.0.13)(react-native@0.82.0(@babel/core@7.28.4)(@types/react@19.1.12)(bufferutil@4.0.8)(react@19.1.1)(utf-8-validate@6.0.4)))': dependencies: @@ -8972,7 +9655,7 @@ snapshots: metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro-config: 0.83.1(bufferutil@4.0.8) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 @@ -9069,6 +9752,10 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@fontsource-variable/geist-mono@5.2.7': {} + + '@fontsource-variable/geist@5.2.8': {} + '@hexagon/base64@1.1.28': {} '@hookform/resolvers@5.2.2(react-hook-form@7.65.0(react@19.1.1))': @@ -9383,6 +10070,23 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + '@opentelemetry/api@1.9.0': optional: true @@ -10368,7 +11072,7 @@ snapshots: debug: 4.4.3 invariant: 2.2.4 metro: 0.83.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - metro-config: 0.83.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro-config: 0.83.3(bufferutil@4.0.8) metro-core: 0.83.3 semver: 7.7.3 transitivePeerDependencies: @@ -10559,6 +11263,76 @@ snapshots: dependencies: nanoid: 3.3.11 + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.0-beta.40': {} + + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-x64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + '@rtsao/scc@1.1.0': {} '@simplewebauthn/browser@13.1.2': {} @@ -10645,44 +11419,324 @@ snapshots: '@tailwindcss/oxide-wasm32-wasi@4.1.14': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': - optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide@4.1.14': + dependencies: + detect-libc: 2.1.2 + tar: 7.5.1 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/postcss@4.1.14': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + postcss: 8.5.6 + tailwindcss: 4.1.14 + + '@tailwindcss/vite@4.1.14(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + + '@tanstack/directive-functions-plugin@1.132.51(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-utils': 1.132.51 + babel-dead-code-elimination: 1.0.10 + pathe: 2.0.3 + tiny-invariant: 1.3.3 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/history@1.132.31': {} + + '@tanstack/query-core@5.90.2': {} + + '@tanstack/react-query@5.90.2(react@19.1.1)': + dependencies: + '@tanstack/query-core': 5.90.2 + react: 19.1.1 + + '@tanstack/react-router-devtools@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.47)(@types/node@22.18.10)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + dependencies: + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-devtools-core': 1.132.51(@tanstack/router-core@1.132.47)(@types/node@22.18.10)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@tanstack/router-core' + - '@types/node' + - csstype + - jiti + - less + - lightningcss + - sass + - sass-embedded + - solid-js + - stylus + - sugarss + - terser + - tiny-invariant + - tsx + - yaml + + '@tanstack/react-router-ssr-query@1.132.47(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.47)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/query-core': 5.90.2 + '@tanstack/react-query': 5.90.2(react@19.1.1) + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-ssr-query-core': 1.132.47(@tanstack/query-core@5.90.2)(@tanstack/router-core@1.132.47) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - '@tanstack/router-core' + + '@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/react-store': 0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.47 + isbot: 5.1.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-client@1.132.48(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-server@1.132.48(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-server-core': 1.132.48 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start@1.132.52(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start-client': 1.132.48(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start-server': 1.132.48(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-utils': 1.132.51 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-plugin-core': 1.132.52(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.48 + pathe: 2.0.3 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/react-store@0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/store': 0.7.7 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) + + '@tanstack/router-core@1.132.47': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/store': 0.7.7 + cookie-es: 2.0.0 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-devtools-core@1.132.51(@tanstack/router-core@1.132.47)(@types/node@22.18.10)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + dependencies: + '@tanstack/router-core': 1.132.47 + clsx: 2.1.1 + goober: 2.1.18(csstype@3.1.3) + solid-js: 1.9.9 + tiny-invariant: 1.3.3 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + optionalDependencies: + csstype: 3.1.3 + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + '@tanstack/router-generator@1.132.51': + dependencies: + '@tanstack/router-core': 1.132.47 + '@tanstack/router-utils': 1.132.51 + '@tanstack/virtual-file-routes': 1.132.31 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.20.6 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-core': 1.132.47 + '@tanstack/router-generator': 1.132.51 + '@tanstack/router-utils': 1.132.51 + '@tanstack/virtual-file-routes': 1.132.31 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.10 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-ssr-query-core@1.132.47(@tanstack/query-core@5.90.2)(@tanstack/router-core@1.132.47)': + dependencies: + '@tanstack/query-core': 5.90.2 + '@tanstack/router-core': 1.132.47 - '@tailwindcss/oxide-win32-x64-msvc@4.1.14': - optional: true + '@tanstack/router-utils@1.132.51': + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + ansis: 4.2.0 + diff: 8.0.2 + pathe: 2.0.3 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - supports-color - '@tailwindcss/oxide@4.1.14': + '@tanstack/server-functions-plugin@1.132.51(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - detect-libc: 2.1.2 - tar: 7.5.1 - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.14 - '@tailwindcss/oxide-darwin-arm64': 4.1.14 - '@tailwindcss/oxide-darwin-x64': 4.1.14 - '@tailwindcss/oxide-freebsd-x64': 4.1.14 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 - '@tailwindcss/oxide-linux-x64-musl': 4.1.14 - '@tailwindcss/oxide-wasm32-wasi': 4.1.14 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/directive-functions-plugin': 1.132.51(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite - '@tailwindcss/postcss@4.1.14': + '@tanstack/start-client-core@1.132.48': dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.14 - '@tailwindcss/oxide': 4.1.14 - postcss: 8.5.6 - tailwindcss: 4.1.14 + '@tanstack/router-core': 1.132.47 + '@tanstack/start-storage-context': 1.132.48 + seroval: 1.3.2 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 - '@tanstack/query-core@5.90.2': {} + '@tanstack/start-plugin-core@1.132.52(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.4 + '@babel/types': 7.28.4 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.132.47 + '@tanstack/router-generator': 1.132.51 + '@tanstack/router-plugin': 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.132.51 + '@tanstack/server-functions-plugin': 1.132.51(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-server-core': 1.132.48 + babel-dead-code-elimination: 1.0.10 + cheerio: 1.1.2 + exsolve: 1.0.7 + pathe: 2.0.3 + srvx: 0.8.16 + tinyglobby: 0.2.15 + ufo: 1.6.1 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + xmlbuilder2: 3.1.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@rsbuild/core' + - '@tanstack/react-router' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/start-server-core@1.132.48': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-storage-context': 1.132.48 + h3-v2: h3@2.0.0-beta.4 + seroval: 1.3.2 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - crossws - '@tanstack/react-query@5.90.2(react@19.1.1)': + '@tanstack/start-storage-context@1.132.48': dependencies: - '@tanstack/query-core': 5.90.2 - react: 19.1.1 + '@tanstack/router-core': 1.132.47 + + '@tanstack/store@0.7.7': {} + + '@tanstack/virtual-file-routes@1.132.31': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -10778,7 +11832,7 @@ snapshots: dependencies: '@types/node': 22.18.10 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/glob@7.2.0': dependencies: @@ -10975,6 +12029,18 @@ snapshots: transitivePeerDependencies: - utf-8-validate + '@vitejs/plugin-react@4.7.0(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.16': dependencies: '@babel/parser': 7.28.4 @@ -11071,6 +12137,8 @@ snapshots: ansi-styles@6.2.3: {} + ansis@4.2.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -11185,6 +12253,10 @@ snapshots: dependencies: tslib: 2.8.1 + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + async-function@1.0.0: {} async-limiter@1.0.1: {} @@ -11200,6 +12272,15 @@ snapshots: axobject-query@4.1.0: {} + babel-dead-code-elimination@1.0.10: + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 @@ -11357,7 +12438,7 @@ snapshots: jose: 6.1.0 kysely: 0.28.5 nanostores: 1.0.1 - zod: 4.1.5 + zod: 4.1.12 optionalDependencies: next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 @@ -11377,12 +12458,32 @@ snapshots: jose: 6.1.0 kysely: 0.28.5 nanostores: 1.0.1 - zod: 4.1.5 + zod: 4.1.12 optionalDependencies: next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + better-auth@1.3.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9): + dependencies: + '@better-auth/core': 1.3.27 + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.18 + '@noble/ciphers': 2.0.0 + '@noble/hashes': 2.0.0 + '@simplewebauthn/browser': 13.1.2 + '@simplewebauthn/server': 13.1.2 + better-call: 1.0.19 + defu: 6.1.4 + jose: 6.1.0 + kysely: 0.28.5 + nanostores: 1.0.1 + zod: 4.1.12 + optionalDependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + solid-js: 1.9.9 + better-call@1.0.19: dependencies: '@better-auth/utils': 0.3.0 @@ -11402,6 +12503,8 @@ snapshots: big-integer@1.6.52: {} + binary-extensions@2.3.0: {} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -11412,6 +12515,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + boolbase@1.0.0: {} + bplist-creator@0.1.0: dependencies: stream-buffers: 2.2.0 @@ -11564,6 +12669,29 @@ snapshots: chardet@2.1.0: {} + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.2: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.0.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.16.0 + whatwg-mimetype: 4.0.0 + chevrotain@10.5.0: dependencies: '@chevrotain/cst-dts-gen': 10.5.0 @@ -11573,6 +12701,18 @@ snapshots: lodash: 4.17.21 regexp-to-ast: 0.5.0 + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -11720,6 +12860,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@2.0.0: {} + copy-anything@3.0.5: dependencies: is-what: 4.1.16 @@ -11749,6 +12891,16 @@ snapshots: crypto-random-string@2.0.0: {} + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -11858,6 +13010,8 @@ snapshots: diff@4.0.2: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -11866,6 +13020,24 @@ snapshots: dependencies: esutils: 2.0.3 + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@2.1.1: dependencies: no-case: 2.3.2 @@ -11956,6 +13128,11 @@ snapshots: encodeurl@2.0.0: {} + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -11965,8 +13142,9 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.3 - entities@4.5.0: - optional: true + entities@4.5.0: {} + + entities@6.0.1: {} env-editor@0.4.2: {} @@ -12288,7 +13466,7 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 @@ -12752,6 +13930,12 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fetchdts@0.1.7: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -12968,6 +14152,12 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globrex@0.1.2: {} + + goober@2.1.18(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -12982,6 +14172,13 @@ snapshots: graphql@15.8.0: optional: true + h3@2.0.0-beta.4: + dependencies: + cookie-es: 2.0.0 + fetchdts: 0.1.7 + rou3: 0.7.7 + srvx: 0.8.16 + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -13048,6 +14245,13 @@ snapshots: dependencies: lru-cache: 10.4.3 + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -13079,7 +14283,6 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - optional: true iconv-lite@0.7.0: dependencies: @@ -13188,6 +14391,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.1: dependencies: call-bound: 1.0.4 @@ -13324,6 +14531,8 @@ snapshots: isbinaryfile@4.0.10: {} + isbot@5.1.31: {} + isexe@2.0.0: {} isexe@3.1.1: @@ -13689,21 +14898,6 @@ snapshots: - supports-color - utf-8-validate - metro-config@0.83.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): - dependencies: - connect: 3.7.0 - cosmiconfig: 5.2.1 - flow-enums-runtime: 0.0.6 - jest-validate: 29.7.0 - metro: 0.83.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) - metro-cache: 0.83.1 - metro-core: 0.83.1 - metro-runtime: 0.83.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro-config@0.83.3(bufferutil@4.0.8): dependencies: connect: 3.7.0 @@ -13719,21 +14913,6 @@ snapshots: - supports-color - utf-8-validate - metro-config@0.83.3(bufferutil@4.0.8)(utf-8-validate@6.0.4): - dependencies: - connect: 3.7.0 - flow-enums-runtime: 0.0.6 - jest-validate: 29.7.0 - metro: 0.83.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - metro-cache: 0.83.3 - metro-core: 0.83.3 - metro-runtime: 0.83.3 - yaml: 2.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro-core@0.83.1: dependencies: flow-enums-runtime: 0.0.6 @@ -14029,7 +15208,7 @@ snapshots: metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro-config: 0.83.1(bufferutil@4.0.8) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 @@ -14123,7 +15302,7 @@ snapshots: metro-babel-transformer: 0.83.3 metro-cache: 0.83.3 metro-cache-key: 0.83.3 - metro-config: 0.83.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro-config: 0.83.3(bufferutil@4.0.8) metro-core: 0.83.3 metro-file-map: 0.83.3 metro-resolver: 0.83.3 @@ -14318,6 +15497,10 @@ snapshots: dependencies: path-key: 3.1.1 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + nullthrows@1.1.1: {} nypm@0.6.1: @@ -14551,6 +15734,19 @@ snapshots: dependencies: pngjs: 3.4.0 + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} pascal-case@2.0.1: @@ -14605,6 +15801,8 @@ snapshots: picomatch@3.0.1: {} + picomatch@4.0.3: {} + pirates@4.0.7: {} pkg-types@2.3.0: @@ -15097,6 +16295,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.1.12)(react@19.1.1): dependencies: react: 19.1.1 @@ -15132,8 +16332,20 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -15246,8 +16458,38 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.52.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 + fsevents: 2.3.3 + rou3@0.5.1: {} + rou3@0.7.7: {} + run-applescript@7.0.0: {} run-async@2.4.1: {} @@ -15347,6 +16589,12 @@ snapshots: serialize-error@2.1.0: {} + seroval-plugins@1.3.3(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + + seroval@1.3.2: {} + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -15501,6 +16749,12 @@ snapshots: ip-address: 10.0.1 smart-buffer: 4.2.0 + solid-js@1.9.9: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + sonner@2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 @@ -15517,6 +16771,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + split-on-first@1.1.0: {} sprintf-js@1.0.3: {} @@ -15524,6 +16780,8 @@ snapshots: sqlstring@2.3.3: optional: true + srvx@0.8.16: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -15745,12 +17003,21 @@ snapshots: through@2.3.8: {} + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + tinycolor2@1.6.0: {} tinyexec@0.3.2: {} tinyexec@1.0.1: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinygradient@1.1.5: dependencies: '@types/tinycolor2': 1.4.6 @@ -15797,6 +17064,10 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -15808,6 +17079,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.20.6: + dependencies: + esbuild: 0.25.10 + get-tsconfig: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -15897,6 +17175,8 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.1: {} + uglify-js@3.19.3: optional: true @@ -15915,6 +17195,8 @@ snapshots: undici@6.22.0: {} + undici@7.16.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -15934,6 +17216,13 @@ snapshots: unpipe@1.0.0: {} + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: browserslist: 4.26.3 @@ -16009,6 +17298,38 @@ snapshots: - '@types/react' - '@types/react-dom' + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + - typescript + + vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.10 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + terser: 5.44.0 + tsx: 4.20.6 + yaml: 2.8.1 + + vitefu@1.1.1(vite@7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + optionalDependencies: + vite: 7.1.9(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vlq@1.0.1: {} walker@1.0.8: @@ -16023,8 +17344,16 @@ snapshots: webidl-conversions@5.0.0: {} + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-fetch@3.6.20: {} + whatwg-mimetype@4.0.0: {} + whatwg-url-without-unicode@8.0.0-3: dependencies: buffer: 5.7.1 @@ -16143,6 +17472,13 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + xmlbuilder@11.0.1: {} xmlbuilder@15.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8a88a35c06..2ee2b82e55 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,6 +6,7 @@ packages: catalog: "@eslint/js": ^9.37.0 "@tailwindcss/postcss": ^4.1.14 + "@tailwindcss/vite": ^4.1.14 "@tanstack/react-query": ^5.90.2 "@trpc/client": ^11.6.0 "@trpc/server": ^11.6.0 From 90554b4754541ddf0e191a10de9360d1fe1e7ac3 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:15:12 +0200 Subject: [PATCH 02/16] simplify tsconfig --- .gitignore | 3 +++ apps/tanstack-start/tsconfig.json | 24 +++++++----------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 201ea51f16..202a4df834 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ dist/ # turbo .turbo + +# tanstack +.tanstack \ No newline at end of file diff --git a/apps/tanstack-start/tsconfig.json b/apps/tanstack-start/tsconfig.json index b3a2d67dfa..f618883454 100644 --- a/apps/tanstack-start/tsconfig.json +++ b/apps/tanstack-start/tsconfig.json @@ -1,22 +1,12 @@ { - "include": ["**/*.ts", "**/*.tsx", "public/script*.js"], + "extends": "@acme/tsconfig/base.json", "compilerOptions": { - "strict": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "isolatedModules": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "target": "ES2022", - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", + "lib": ["ES2022", "dom", "dom.iterable"], + "jsx": "preserve", "paths": { "~/*": ["./src/*"] - }, - "noEmit": true - } + } + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] } From 800c747d2ee8bf98c859bae56dea77e45667b765 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:15:51 +0200 Subject: [PATCH 03/16] ignores --- apps/tanstack-start/eslint.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tanstack-start/eslint.config.ts b/apps/tanstack-start/eslint.config.ts index ed900db148..d69b9e42c2 100644 --- a/apps/tanstack-start/eslint.config.ts +++ b/apps/tanstack-start/eslint.config.ts @@ -5,7 +5,7 @@ import { reactConfig } from "@acme/eslint-config/react"; export default defineConfig( { - ignores: [".next/**"], + ignores: [".nitro/**", ".output/**", ".tanstack/**"], }, baseConfig, reactConfig, From adc09b473e2cb3708670920e6f2a1e61aa36cbba Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:16:51 +0200 Subject: [PATCH 04/16] kewl --- apps/tanstack-start/turbo.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/tanstack-start/turbo.json diff --git a/apps/tanstack-start/turbo.json b/apps/tanstack-start/turbo.json new file mode 100644 index 0000000000..4c3f71fbc8 --- /dev/null +++ b/apps/tanstack-start/turbo.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "extends": ["//"], + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": [".nitro/**", ".output/**", ".tanstack/**"] + }, + "dev": { + "persistent": true + } + } +} From f9ad53a368b97369ff565a10629ad317bbf9e1c4 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:18:00 +0200 Subject: [PATCH 05/16] vsc conf --- .vscode/settings.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index be22763f17..ae80c88875 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,6 +17,12 @@ "files.associations": { "*.css": "tailwindcss" }, + "files.readonlyInclude": { + "**/routeTree.gen.ts": true + }, + "files.watcherExclude": { + "**/routeTree.gen.ts": true + }, "prettier.ignorePath": ".gitignore", "tailwindCSS.classFunctions": ["cva", "cx", "cn"], "typescript.enablePromptUseWorkspaceTsdk": true, From 697a89a87aeb16d11dacb9c052b5bb84a9dd027b Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:21:03 +0200 Subject: [PATCH 06/16] sync lock? --- pnpm-lock.yaml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 337c349e07..c8f8ba5a0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3655,6 +3655,9 @@ packages: '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -11829,6 +11832,8 @@ snapshots: dependencies: '@types/node': 22.18.10 + '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/glob@7.2.0': @@ -12435,7 +12440,7 @@ snapshots: jose: 6.1.0 kysely: 0.28.5 nanostores: 1.0.1 - zod: 4.1.12 + zod: 4.1.5 optionalDependencies: next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 @@ -12455,7 +12460,7 @@ snapshots: jose: 6.1.0 kysely: 0.28.5 nanostores: 1.0.1 - zod: 4.1.12 + zod: 4.1.5 optionalDependencies: next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 @@ -12475,7 +12480,7 @@ snapshots: jose: 6.1.0 kysely: 0.28.5 nanostores: 1.0.1 - zod: 4.1.12 + zod: 4.1.5 optionalDependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -13463,7 +13468,7 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 From c12453c914eca690b7e54fef48a3265c24ac7cdf Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 12 Oct 2025 00:56:30 +0200 Subject: [PATCH 07/16] new theme provider --- apps/nextjs/src/app/layout.tsx | 2 +- apps/tanstack-start/src/routeTree.gen.ts | 123 +++++++++---------- apps/tanstack-start/src/routes/__root.tsx | 28 +++-- apps/tanstack-start/src/styles.css | 4 +- packages/ui/package.json | 1 - packages/ui/src/theme.tsx | 143 +++++++++++++++++++++- packages/ui/src/toast.tsx | 7 +- pnpm-lock.yaml | 14 --- 8 files changed, 226 insertions(+), 96 deletions(-) diff --git a/apps/nextjs/src/app/layout.tsx b/apps/nextjs/src/app/layout.tsx index 7b8ba5a935..187e0a397a 100644 --- a/apps/nextjs/src/app/layout.tsx +++ b/apps/nextjs/src/app/layout.tsx @@ -57,7 +57,7 @@ export default function RootLayout(props: { children: React.ReactNode }) { geistMono.variable, )} > - + {props.children}
diff --git a/apps/tanstack-start/src/routeTree.gen.ts b/apps/tanstack-start/src/routeTree.gen.ts index 42ee0fa1f7..b4721e1caf 100644 --- a/apps/tanstack-start/src/routeTree.gen.ts +++ b/apps/tanstack-start/src/routeTree.gen.ts @@ -8,83 +8,80 @@ // 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 type { createStart } from "@tanstack/react-start"; - -import type { getRouter } from "./router.tsx"; -import { Route as rootRouteImport } from "./routes/__root"; -import { Route as ApiAuthSplatRouteImport } from "./routes/api.auth.$"; -import { Route as ApiTrpcSplatRouteImport } from "./routes/api/trpc.$"; -import { Route as IndexRouteImport } from "./routes/index"; +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' +import { Route as ApiTrpcSplatRouteImport } from './routes/api/trpc.$' +import { Route as ApiAuthSplatRouteImport } from './routes/api.auth.$' const IndexRoute = IndexRouteImport.update({ - id: "/", - path: "/", + id: '/', + path: '/', getParentRoute: () => rootRouteImport, -} as any); +} as any) const ApiTrpcSplatRoute = ApiTrpcSplatRouteImport.update({ - id: "/api/trpc/$", - path: "/api/trpc/$", + id: '/api/trpc/$', + path: '/api/trpc/$', getParentRoute: () => rootRouteImport, -} as any); +} as any) const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({ - id: "/api/auth/$", - path: "/api/auth/$", + id: '/api/auth/$', + path: '/api/auth/$', getParentRoute: () => rootRouteImport, -} as any); +} as any) export interface FileRoutesByFullPath { - "/": typeof IndexRoute; - "/api/auth/$": typeof ApiAuthSplatRoute; - "/api/trpc/$": typeof ApiTrpcSplatRoute; + '/': typeof IndexRoute + '/api/auth/$': typeof ApiAuthSplatRoute + '/api/trpc/$': typeof ApiTrpcSplatRoute } export interface FileRoutesByTo { - "/": typeof IndexRoute; - "/api/auth/$": typeof ApiAuthSplatRoute; - "/api/trpc/$": typeof ApiTrpcSplatRoute; + '/': typeof IndexRoute + '/api/auth/$': typeof ApiAuthSplatRoute + '/api/trpc/$': typeof ApiTrpcSplatRoute } export interface FileRoutesById { - __root__: typeof rootRouteImport; - "/": typeof IndexRoute; - "/api/auth/$": typeof ApiAuthSplatRoute; - "/api/trpc/$": typeof ApiTrpcSplatRoute; + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/api/auth/$': typeof ApiAuthSplatRoute + '/api/trpc/$': typeof ApiTrpcSplatRoute } export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath; - fullPaths: "/" | "/api/auth/$" | "/api/trpc/$"; - fileRoutesByTo: FileRoutesByTo; - to: "/" | "/api/auth/$" | "/api/trpc/$"; - id: "__root__" | "/" | "/api/auth/$" | "/api/trpc/$"; - fileRoutesById: FileRoutesById; + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/api/auth/$' | '/api/trpc/$' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/api/auth/$' | '/api/trpc/$' + id: '__root__' | '/' | '/api/auth/$' | '/api/trpc/$' + fileRoutesById: FileRoutesById } export interface RootRouteChildren { - IndexRoute: typeof IndexRoute; - ApiAuthSplatRoute: typeof ApiAuthSplatRoute; - ApiTrpcSplatRoute: typeof ApiTrpcSplatRoute; + IndexRoute: typeof IndexRoute + ApiAuthSplatRoute: typeof ApiAuthSplatRoute + ApiTrpcSplatRoute: typeof ApiTrpcSplatRoute } -declare module "@tanstack/react-router" { +declare module '@tanstack/react-router' { interface FileRoutesByPath { - "/": { - id: "/"; - path: "/"; - fullPath: "/"; - preLoaderRoute: typeof IndexRouteImport; - parentRoute: typeof rootRouteImport; - }; - "/api/trpc/$": { - id: "/api/trpc/$"; - path: "/api/trpc/$"; - fullPath: "/api/trpc/$"; - preLoaderRoute: typeof ApiTrpcSplatRouteImport; - parentRoute: typeof rootRouteImport; - }; - "/api/auth/$": { - id: "/api/auth/$"; - path: "/api/auth/$"; - fullPath: "/api/auth/$"; - preLoaderRoute: typeof ApiAuthSplatRouteImport; - parentRoute: typeof rootRouteImport; - }; + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/api/trpc/$': { + id: '/api/trpc/$' + path: '/api/trpc/$' + fullPath: '/api/trpc/$' + preLoaderRoute: typeof ApiTrpcSplatRouteImport + parentRoute: typeof rootRouteImport + } + '/api/auth/$': { + id: '/api/auth/$' + path: '/api/auth/$' + fullPath: '/api/auth/$' + preLoaderRoute: typeof ApiAuthSplatRouteImport + parentRoute: typeof rootRouteImport + } } } @@ -92,14 +89,16 @@ const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, ApiAuthSplatRoute: ApiAuthSplatRoute, ApiTrpcSplatRoute: ApiTrpcSplatRoute, -}; +} export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) - ._addFileTypes(); + ._addFileTypes() -declare module "@tanstack/react-start" { +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { interface Register { - ssr: true; - router: Awaited>; + ssr: true + router: Awaited> } } diff --git a/apps/tanstack-start/src/routes/__root.tsx b/apps/tanstack-start/src/routes/__root.tsx index b06aca00d8..15a1cac3ca 100644 --- a/apps/tanstack-start/src/routes/__root.tsx +++ b/apps/tanstack-start/src/routes/__root.tsx @@ -11,6 +11,7 @@ import { import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; import type { AppRouter } from "@acme/api"; +import { ThemeProvider, ThemeToggle } from "@acme/ui/theme"; import { Toaster } from "@acme/ui/toast"; import appCss from "~/styles.css?url"; @@ -35,16 +36,21 @@ function RootComponent() { function RootDocument({ children }: { children: React.ReactNode }) { return ( - - - - - - {children} - - - - - + + + + + + + {children} +
+ +
+ + + + + +
); } diff --git a/apps/tanstack-start/src/styles.css b/apps/tanstack-start/src/styles.css index 116374dc10..9ba26be0dc 100644 --- a/apps/tanstack-start/src/styles.css +++ b/apps/tanstack-start/src/styles.css @@ -6,7 +6,9 @@ @source '../../../packages/ui/src/*.{ts,tsx}'; -/* @custom-variant dark (&:is(.dark *)); */ +@custom-variant light (&:is(.light *)); +@custom-variant dark (&:is(.dark *)); +@custom-variant auto (&:is(.auto *)); @utility container { margin-inline: auto; diff --git a/packages/ui/package.json b/packages/ui/package.json index 6ff4f0d72a..c0c380a5a2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -24,7 +24,6 @@ "@hookform/resolvers": "^5.2.2", "@radix-ui/react-icons": "^1.3.2", "class-variance-authority": "^0.7.1", - "next-themes": "^0.4.6", "radix-ui": "^1.4.3", "react-hook-form": "^7.65.0", "sonner": "^2.0.7", diff --git a/packages/ui/src/theme.tsx b/packages/ui/src/theme.tsx index 7ee5de9d1f..4e0aac4b38 100644 --- a/packages/ui/src/theme.tsx +++ b/packages/ui/src/theme.tsx @@ -1,7 +1,8 @@ "use client"; +import * as React from "react"; import { MoonIcon, SunIcon } from "@radix-ui/react-icons"; -import { useTheme } from "next-themes"; +import * as z from "zod"; import { Button } from "./button"; import { @@ -11,7 +12,143 @@ import { DropdownMenuTrigger, } from "./dropdown-menu"; -export { ThemeProvider } from "next-themes"; +const ThemeModeSchema = z.enum(["light", "dark", "auto"]); + +const themeKey = "theme-mode"; + +export type ThemeMode = z.output; +export type ResolvedTheme = Exclude; + +const getStoredThemeMode = (): ThemeMode => { + if (typeof window === "undefined") return "auto"; + try { + const storedTheme = localStorage.getItem(themeKey); + return ThemeModeSchema.parse(storedTheme); + } catch { + return "auto"; + } +}; + +const setStoredThemeMode = (theme: ThemeMode) => { + try { + const parsedTheme = ThemeModeSchema.parse(theme); + localStorage.setItem(themeKey, parsedTheme); + } catch { + // Silently fail if localStorage is unavailable + } +}; + +const getSystemTheme = () => { + if (typeof window === "undefined") return "light"; + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; +}; + +const updateThemeClass = (themeMode: ThemeMode) => { + const root = document.documentElement; + root.classList.remove("light", "dark", "auto"); + const newTheme = themeMode === "auto" ? getSystemTheme() : themeMode; + root.classList.add(newTheme); + + if (themeMode === "auto") { + root.classList.add("auto"); + } +}; + +const setupPreferredListener = () => { + const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + const handler = () => updateThemeClass("auto"); + mediaQuery.addEventListener("change", handler); + return () => mediaQuery.removeEventListener("change", handler); +}; + +const getNextTheme = (current: ThemeMode): ThemeMode => { + const themes: ThemeMode[] = + getSystemTheme() === "dark" + ? ["auto", "light", "dark"] + : ["auto", "dark", "light"]; + return themes[(themes.indexOf(current) + 1) % themes.length]!; +}; + +export const themeDetectorScript = (function () { + function themeFn() { + const isValidTheme = (theme: string): theme is ThemeMode => { + const validThemes = ["light", "dark", "auto"] as const; + return validThemes.includes(theme as ThemeMode); + }; + + const storedTheme = localStorage.getItem("theme-mode") ?? "auto"; + const validTheme = isValidTheme(storedTheme) ? storedTheme : "auto"; + + if (validTheme === "auto") { + const autoTheme = window.matchMedia("(prefers-color-scheme: dark)") + .matches + ? "dark" + : "light"; + document.documentElement.classList.add(autoTheme, "auto"); + } else { + document.documentElement.classList.add(validTheme); + } + } + return `(${themeFn.toString()})();`; +})(); + +type ThemeContextProps = { + themeMode: ThemeMode; + resolvedTheme: ResolvedTheme; + setTheme: (theme: ThemeMode) => void; + toggleMode: () => void; +}; +const ThemeContext = React.createContext( + undefined, +); + +export function ThemeProvider({ children }: React.PropsWithChildren) { + const [themeMode, setThemeMode] = React.useState(getStoredThemeMode); + + React.useEffect(() => { + if (themeMode !== "auto") return; + return setupPreferredListener(); + }, [themeMode]); + + const resolvedTheme = themeMode === "auto" ? getSystemTheme() : themeMode; + + const setTheme = (newTheme: ThemeMode) => { + setThemeMode(newTheme); + setStoredThemeMode(newTheme); + updateThemeClass(newTheme); + }; + + const toggleMode = () => { + setTheme(getNextTheme(themeMode)); + }; + + return ( + +