@better-t-stack/template-generator 3.13.2-dev.6c6cffb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fs-writer.d.mts +8 -0
- package/dist/fs-writer.d.mts.map +1 -0
- package/dist/fs-writer.mjs +50 -0
- package/dist/fs-writer.mjs.map +1 -0
- package/dist/index.d.mts +182 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +26727 -0
- package/dist/index.mjs.map +1 -0
- package/dist/template-reader.d.mts +30 -0
- package/dist/template-reader.d.mts.map +1 -0
- package/dist/template-reader.mjs +2860 -0
- package/dist/template-reader.mjs.map +1 -0
- package/dist/types-BubFnV2d.d.mts +36 -0
- package/dist/types-BubFnV2d.d.mts.map +1 -0
- package/package.json +66 -0
- package/scripts/generate-templates.ts +97 -0
- package/templates/addons/biome/biome.json.hbs +96 -0
- package/templates/addons/husky/.husky/pre-commit +1 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/apple-touch-icon.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/favicon-96x96.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/favicon.svg +6 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/site.webmanifest.hbs +21 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-192x192.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-512x512.png +0 -0
- package/templates/addons/pwa/apps/web/next/src/app/manifest.ts.hbs +26 -0
- package/templates/addons/pwa/apps/web/vite/public/logo.png +0 -0
- package/templates/addons/pwa/apps/web/vite/pwa-assets.config.ts.hbs +12 -0
- package/templates/addons/ruler/.ruler/bts.md.hbs +142 -0
- package/templates/addons/ruler/.ruler/ruler.toml.hbs +80 -0
- package/templates/addons/turborepo/turbo.json.hbs +74 -0
- package/templates/addons/ultracite/biome.json.hbs +26 -0
- package/templates/api/orpc/fullstack/next/src/app/api/rpc/[[...rest]]/route.ts.hbs +50 -0
- package/templates/api/orpc/fullstack/tanstack-start/src/routes/api/rpc/$.ts.hbs +58 -0
- package/templates/api/orpc/native/utils/orpc.ts.hbs +39 -0
- package/templates/api/orpc/server/_gitignore +34 -0
- package/templates/api/orpc/server/package.json.hbs +15 -0
- package/templates/api/orpc/server/src/context.ts.hbs +148 -0
- package/templates/api/orpc/server/src/index.ts.hbs +21 -0
- package/templates/api/orpc/server/src/routers/index.ts.hbs +55 -0
- package/templates/api/orpc/server/tsconfig.json.hbs +10 -0
- package/templates/api/orpc/web/nuxt/app/plugins/orpc.ts.hbs +32 -0
- package/templates/api/orpc/web/nuxt/app/plugins/vue-query.ts.hbs +44 -0
- package/templates/api/orpc/web/react/base/src/utils/orpc.ts.hbs +113 -0
- package/templates/api/orpc/web/solid/src/utils/orpc.ts.hbs +30 -0
- package/templates/api/orpc/web/svelte/src/lib/orpc.ts.hbs +30 -0
- package/templates/api/trpc/fullstack/next/src/app/api/trpc/[trpc]/route.ts.hbs +14 -0
- package/templates/api/trpc/fullstack/tanstack-start/src/routes/api/trpc/$.ts.hbs +22 -0
- package/templates/api/trpc/native/utils/trpc.ts.hbs +37 -0
- package/templates/api/trpc/server/_gitignore +34 -0
- package/templates/api/trpc/server/package.json.hbs +14 -0
- package/templates/api/trpc/server/src/context.ts.hbs +148 -0
- package/templates/api/trpc/server/src/index.ts.hbs +26 -0
- package/templates/api/trpc/server/src/routers/index.ts.hbs +55 -0
- package/templates/api/trpc/server/tsconfig.json.hbs +10 -0
- package/templates/api/trpc/web/react/base/src/utils/trpc.ts.hbs +97 -0
- package/templates/auth/better-auth/convex/backend/convex/auth.config.ts.hbs +6 -0
- package/templates/auth/better-auth/convex/backend/convex/auth.ts.hbs +68 -0
- package/templates/auth/better-auth/convex/backend/convex/http.ts.hbs +12 -0
- package/templates/auth/better-auth/convex/backend/convex/privateData.ts.hbs +17 -0
- package/templates/auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs +127 -0
- package/templates/auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs +138 -0
- package/templates/auth/better-auth/convex/native/base/lib/auth-client.ts.hbs +18 -0
- package/templates/auth/better-auth/convex/native/unistyles/components/sign-in.tsx.hbs +127 -0
- package/templates/auth/better-auth/convex/native/unistyles/components/sign-up.tsx.hbs +145 -0
- package/templates/auth/better-auth/convex/native/uniwind/components/sign-in.tsx.hbs +73 -0
- package/templates/auth/better-auth/convex/native/uniwind/components/sign-up.tsx.hbs +85 -0
- package/templates/auth/better-auth/convex/web/react/next/src/app/api/auth/[...all]/route.ts.hbs +3 -0
- package/templates/auth/better-auth/convex/web/react/next/src/app/dashboard/page.tsx.hbs +40 -0
- package/templates/auth/better-auth/convex/web/react/next/src/components/sign-in-form.tsx.hbs +129 -0
- package/templates/auth/better-auth/convex/web/react/next/src/components/sign-up-form.tsx.hbs +154 -0
- package/templates/auth/better-auth/convex/web/react/next/src/components/user-menu.tsx.hbs +48 -0
- package/templates/auth/better-auth/convex/web/react/next/src/lib/auth-client.ts.hbs +6 -0
- package/templates/auth/better-auth/convex/web/react/next/src/lib/auth-server.ts.hbs +16 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-router/src/components/sign-in-form.tsx.hbs +133 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-router/src/components/sign-up-form.tsx.hbs +158 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-router/src/components/user-menu.tsx.hbs +52 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-router/src/lib/auth-client.ts.hbs +11 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +43 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/components/sign-in-form.tsx.hbs +133 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/components/sign-up-form.tsx.hbs +158 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/components/user-menu.tsx.hbs +47 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/lib/auth-client.ts.hbs +6 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/lib/auth-server.ts.hbs +13 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/routes/api/auth/$.ts.hbs +11 -0
- package/templates/auth/better-auth/convex/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +43 -0
- package/templates/auth/better-auth/fullstack/next/src/app/api/auth/[...all]/route.ts.hbs +4 -0
- package/templates/auth/better-auth/fullstack/tanstack-start/src/routes/api/auth/$.ts.hbs +15 -0
- package/templates/auth/better-auth/native/bare/app/(drawer)/index.tsx.hbs +186 -0
- package/templates/auth/better-auth/native/bare/components/sign-in.tsx.hbs +131 -0
- package/templates/auth/better-auth/native/bare/components/sign-up.tsx.hbs +150 -0
- package/templates/auth/better-auth/native/base/lib/auth-client.ts.hbs +16 -0
- package/templates/auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs +187 -0
- package/templates/auth/better-auth/native/unistyles/components/sign-in.tsx.hbs +139 -0
- package/templates/auth/better-auth/native/unistyles/components/sign-up.tsx.hbs +157 -0
- package/templates/auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs +123 -0
- package/templates/auth/better-auth/native/uniwind/components/sign-in.tsx.hbs +87 -0
- package/templates/auth/better-auth/native/uniwind/components/sign-up.tsx.hbs +128 -0
- package/templates/auth/better-auth/server/base/_gitignore +34 -0
- package/templates/auth/better-auth/server/base/package.json.hbs +14 -0
- package/templates/auth/better-auth/server/base/src/index.ts.hbs +304 -0
- package/templates/auth/better-auth/server/base/tsconfig.json.hbs +10 -0
- package/templates/auth/better-auth/server/db/drizzle/mysql/src/schema/auth.ts.hbs +100 -0
- package/templates/auth/better-auth/server/db/drizzle/postgres/src/schema/auth.ts.hbs +93 -0
- package/templates/auth/better-auth/server/db/drizzle/sqlite/src/schema/auth.ts.hbs +107 -0
- package/templates/auth/better-auth/server/db/mongoose/mongodb/src/models/auth.model.ts.hbs +68 -0
- package/templates/auth/better-auth/server/db/prisma/mongodb/prisma/schema/auth.prisma.hbs +62 -0
- package/templates/auth/better-auth/server/db/prisma/mysql/prisma/schema/auth.prisma.hbs +62 -0
- package/templates/auth/better-auth/server/db/prisma/postgres/prisma/schema/auth.prisma.hbs +62 -0
- package/templates/auth/better-auth/server/db/prisma/sqlite/prisma/schema/auth.prisma.hbs +62 -0
- package/templates/auth/better-auth/web/nuxt/app/components/SignInForm.vue.hbs +82 -0
- package/templates/auth/better-auth/web/nuxt/app/components/SignUpForm.vue.hbs +91 -0
- package/templates/auth/better-auth/web/nuxt/app/components/UserMenu.vue.hbs +42 -0
- package/templates/auth/better-auth/web/nuxt/app/middleware/auth.ts.hbs +14 -0
- package/templates/auth/better-auth/web/nuxt/app/pages/dashboard.vue.hbs +99 -0
- package/templates/auth/better-auth/web/nuxt/app/pages/login.vue.hbs +27 -0
- package/templates/auth/better-auth/web/nuxt/app/plugins/auth-client.ts.hbs +21 -0
- package/templates/auth/better-auth/web/react/base/src/lib/auth-client.ts.hbs +16 -0
- package/templates/auth/better-auth/web/react/next/src/app/dashboard/dashboard.tsx.hbs +60 -0
- package/templates/auth/better-auth/web/react/next/src/app/dashboard/page.tsx.hbs +42 -0
- package/templates/auth/better-auth/web/react/next/src/app/login/page.tsx.hbs +16 -0
- package/templates/auth/better-auth/web/react/next/src/components/sign-in-form.tsx.hbs +135 -0
- package/templates/auth/better-auth/web/react/next/src/components/sign-up-form.tsx.hbs +160 -0
- package/templates/auth/better-auth/web/react/next/src/components/user-menu.tsx.hbs +62 -0
- package/templates/auth/better-auth/web/react/react-router/src/components/sign-in-form.tsx.hbs +135 -0
- package/templates/auth/better-auth/web/react/react-router/src/components/sign-up-form.tsx.hbs +160 -0
- package/templates/auth/better-auth/web/react/react-router/src/components/user-menu.tsx.hbs +61 -0
- package/templates/auth/better-auth/web/react/react-router/src/routes/dashboard.tsx.hbs +80 -0
- package/templates/auth/better-auth/web/react/react-router/src/routes/login.tsx.hbs +13 -0
- package/templates/auth/better-auth/web/react/tanstack-router/src/components/sign-in-form.tsx.hbs +135 -0
- package/templates/auth/better-auth/web/react/tanstack-router/src/components/sign-up-form.tsx.hbs +160 -0
- package/templates/auth/better-auth/web/react/tanstack-router/src/components/user-menu.tsx.hbs +63 -0
- package/templates/auth/better-auth/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +71 -0
- package/templates/auth/better-auth/web/react/tanstack-router/src/routes/login.tsx.hbs +18 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/components/sign-in-form.tsx.hbs +135 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/components/sign-up-form.tsx.hbs +160 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/components/user-menu.tsx.hbs +63 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/functions/get-user.ts.hbs +6 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/middleware/auth.ts.hbs +31 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +84 -0
- package/templates/auth/better-auth/web/react/tanstack-start/src/routes/login.tsx.hbs +18 -0
- package/templates/auth/better-auth/web/solid/src/components/sign-in-form.tsx.hbs +124 -0
- package/templates/auth/better-auth/web/solid/src/components/sign-up-form.tsx.hbs +148 -0
- package/templates/auth/better-auth/web/solid/src/components/user-menu.tsx.hbs +55 -0
- package/templates/auth/better-auth/web/solid/src/lib/auth-client.ts.hbs +12 -0
- package/templates/auth/better-auth/web/solid/src/routes/dashboard.tsx.hbs +67 -0
- package/templates/auth/better-auth/web/solid/src/routes/login.tsx.hbs +23 -0
- package/templates/auth/better-auth/web/svelte/src/components/SignInForm.svelte.hbs +109 -0
- package/templates/auth/better-auth/web/svelte/src/components/SignUpForm.svelte.hbs +142 -0
- package/templates/auth/better-auth/web/svelte/src/components/UserMenu.svelte.hbs +52 -0
- package/templates/auth/better-auth/web/svelte/src/lib/auth-client.ts.hbs +12 -0
- package/templates/auth/better-auth/web/svelte/src/routes/dashboard/+page.svelte.hbs +59 -0
- package/templates/auth/better-auth/web/svelte/src/routes/login/+page.svelte.hbs +12 -0
- package/templates/auth/clerk/convex/backend/convex/auth.config.ts.hbs +12 -0
- package/templates/auth/clerk/convex/backend/convex/privateData.ts.hbs +16 -0
- package/templates/auth/clerk/convex/native/base/app/(auth)/_layout.tsx.hbs +12 -0
- package/templates/auth/clerk/convex/native/base/app/(auth)/sign-in.tsx.hbs +67 -0
- package/templates/auth/clerk/convex/native/base/app/(auth)/sign-up.tsx.hbs +110 -0
- package/templates/auth/clerk/convex/native/base/components/sign-out-button.tsx.hbs +27 -0
- package/templates/auth/clerk/convex/web/react/next/src/app/dashboard/page.tsx.hbs +29 -0
- package/templates/auth/clerk/convex/web/react/next/src/middleware.ts.hbs +12 -0
- package/templates/auth/clerk/convex/web/react/react-router/src/routes/dashboard.tsx.hbs +32 -0
- package/templates/auth/clerk/convex/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +37 -0
- package/templates/auth/clerk/convex/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +37 -0
- package/templates/auth/clerk/convex/web/react/tanstack-start/src/start.ts.hbs +8 -0
- package/templates/backend/convex/packages/backend/_gitignore +2 -0
- package/templates/backend/convex/packages/backend/convex/README.md +90 -0
- package/templates/backend/convex/packages/backend/convex/convex.config.ts.hbs +17 -0
- package/templates/backend/convex/packages/backend/convex/healthCheck.ts.hbs +7 -0
- package/templates/backend/convex/packages/backend/convex/schema.ts.hbs +11 -0
- package/templates/backend/convex/packages/backend/convex/tsconfig.json.hbs +25 -0
- package/templates/backend/convex/packages/backend/package.json.hbs +15 -0
- package/templates/backend/server/base/_gitignore +55 -0
- package/templates/backend/server/base/package.json.hbs +17 -0
- package/templates/backend/server/base/tsconfig.json.hbs +13 -0
- package/templates/backend/server/base/tsdown.config.ts.hbs +9 -0
- package/templates/backend/server/elysia/src/index.ts.hbs +122 -0
- package/templates/backend/server/express/src/index.ts.hbs +126 -0
- package/templates/backend/server/fastify/src/index.ts.hbs +187 -0
- package/templates/backend/server/hono/src/index.ts.hbs +171 -0
- package/templates/base/_gitignore +50 -0
- package/templates/base/package.json.hbs +10 -0
- package/templates/base/tsconfig.json.hbs +3 -0
- package/templates/db/base/_gitignore +35 -0
- package/templates/db/base/package.json.hbs +14 -0
- package/templates/db/base/tsconfig.json.hbs +10 -0
- package/templates/db/drizzle/base/src/schema/index.ts.hbs +7 -0
- package/templates/db/drizzle/mysql/drizzle.config.ts.hbs +19 -0
- package/templates/db/drizzle/mysql/src/index.ts.hbs +54 -0
- package/templates/db/drizzle/postgres/drizzle.config.ts.hbs +19 -0
- package/templates/db/drizzle/postgres/src/index.ts.hbs +44 -0
- package/templates/db/drizzle/sqlite/drizzle.config.ts.hbs +28 -0
- package/templates/db/drizzle/sqlite/src/index.ts.hbs +39 -0
- package/templates/db/mongoose/mongodb/src/index.ts.hbs +10 -0
- package/templates/db/prisma/mongodb/prisma/schema/schema.prisma.hbs +19 -0
- package/templates/db/prisma/mongodb/prisma.config.ts.hbs +18 -0
- package/templates/db/prisma/mongodb/src/index.ts.hbs +5 -0
- package/templates/db/prisma/mysql/prisma/schema/schema.prisma.hbs +21 -0
- package/templates/db/prisma/mysql/prisma.config.ts.hbs +21 -0
- package/templates/db/prisma/mysql/src/index.ts.hbs +55 -0
- package/templates/db/prisma/postgres/prisma/schema/schema.prisma.hbs +21 -0
- package/templates/db/prisma/postgres/prisma.config.ts.hbs +21 -0
- package/templates/db/prisma/postgres/src/index.ts.hbs +69 -0
- package/templates/db/prisma/sqlite/prisma/schema/schema.prisma.hbs +18 -0
- package/templates/db/prisma/sqlite/prisma.config.ts.hbs +25 -0
- package/templates/db/prisma/sqlite/src/index.ts.hbs +25 -0
- package/templates/db-setup/docker-compose/mongodb/docker-compose.yml.hbs +23 -0
- package/templates/db-setup/docker-compose/mysql/docker-compose.yml.hbs +24 -0
- package/templates/db-setup/docker-compose/postgres/docker-compose.yml.hbs +23 -0
- package/templates/examples/ai/convex/packages/backend/convex/agent.ts.hbs +9 -0
- package/templates/examples/ai/convex/packages/backend/convex/chat.ts.hbs +67 -0
- package/templates/examples/ai/fullstack/next/src/app/api/ai/route.ts.hbs +20 -0
- package/templates/examples/ai/fullstack/tanstack-start/src/routes/api/ai/$.ts.hbs +36 -0
- package/templates/examples/ai/native/bare/app/(drawer)/ai.tsx.hbs +586 -0
- package/templates/examples/ai/native/bare/polyfills.js +22 -0
- package/templates/examples/ai/native/unistyles/app/(drawer)/ai.tsx.hbs +588 -0
- package/templates/examples/ai/native/unistyles/polyfills.js +22 -0
- package/templates/examples/ai/native/uniwind/app/(drawer)/ai.tsx.hbs +331 -0
- package/templates/examples/ai/native/uniwind/polyfills.js +22 -0
- package/templates/examples/ai/web/nuxt/app/pages/ai.vue.hbs +54 -0
- package/templates/examples/ai/web/react/next/src/app/ai/page.tsx.hbs +267 -0
- package/templates/examples/ai/web/react/react-router/src/routes/ai.tsx.hbs +235 -0
- package/templates/examples/ai/web/react/tanstack-router/src/routes/ai.tsx.hbs +242 -0
- package/templates/examples/ai/web/react/tanstack-start/src/routes/ai.tsx.hbs +243 -0
- package/templates/examples/ai/web/svelte/src/routes/ai/+page.svelte.hbs +107 -0
- package/templates/examples/todo/convex/packages/backend/convex/todos.ts.hbs +42 -0
- package/templates/examples/todo/native/bare/app/(drawer)/todos.tsx.hbs +521 -0
- package/templates/examples/todo/native/unistyles/app/(drawer)/todos.tsx.hbs +340 -0
- package/templates/examples/todo/native/uniwind/app/(drawer)/todos.tsx.hbs +282 -0
- package/templates/examples/todo/server/drizzle/base/src/routers/todo.ts.hbs +75 -0
- package/templates/examples/todo/server/drizzle/mysql/src/schema/todo.ts +7 -0
- package/templates/examples/todo/server/drizzle/postgres/src/schema/todo.ts +7 -0
- package/templates/examples/todo/server/drizzle/sqlite/src/schema/todo.ts +7 -0
- package/templates/examples/todo/server/mongoose/base/src/routers/todo.ts.hbs +66 -0
- package/templates/examples/todo/server/mongoose/mongodb/src/models/todo.model.ts.hbs +24 -0
- package/templates/examples/todo/server/prisma/base/src/routers/todo.ts.hbs +116 -0
- package/templates/examples/todo/server/prisma/mongodb/prisma/schema/todo.prisma.hbs +7 -0
- package/templates/examples/todo/server/prisma/mysql/prisma/schema/todo.prisma.hbs +7 -0
- package/templates/examples/todo/server/prisma/postgres/prisma/schema/todo.prisma.hbs +7 -0
- package/templates/examples/todo/server/prisma/sqlite/prisma/schema/todo.prisma.hbs +7 -0
- package/templates/examples/todo/web/nuxt/app/pages/todos.vue.hbs +220 -0
- package/templates/examples/todo/web/react/next/src/app/todos/page.tsx.hbs +245 -0
- package/templates/examples/todo/web/react/react-router/src/routes/todos.tsx.hbs +242 -0
- package/templates/examples/todo/web/react/tanstack-router/src/routes/todos.tsx.hbs +247 -0
- package/templates/examples/todo/web/react/tanstack-start/src/routes/todos.tsx.hbs +272 -0
- package/templates/examples/todo/web/solid/src/routes/todos.tsx.hbs +132 -0
- package/templates/examples/todo/web/svelte/src/routes/todos/+page.svelte.hbs +317 -0
- package/templates/extras/_npmrc.hbs +5 -0
- package/templates/extras/bunfig.toml.hbs +6 -0
- package/templates/extras/pnpm-workspace.yaml +3 -0
- package/templates/frontend/native/bare/_gitignore +18 -0
- package/templates/frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbs +41 -0
- package/templates/frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs +43 -0
- package/templates/frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs +43 -0
- package/templates/frontend/native/bare/app/(drawer)/_layout.tsx.hbs +90 -0
- package/templates/frontend/native/bare/app/(drawer)/index.tsx.hbs +234 -0
- package/templates/frontend/native/bare/app/+not-found.tsx.hbs +65 -0
- package/templates/frontend/native/bare/app/_layout.tsx.hbs +165 -0
- package/templates/frontend/native/bare/app/modal.tsx.hbs +34 -0
- package/templates/frontend/native/bare/app.json.hbs +50 -0
- package/templates/frontend/native/bare/components/container.tsx.hbs +25 -0
- package/templates/frontend/native/bare/components/header-button.tsx.hbs +47 -0
- package/templates/frontend/native/bare/components/tabbar-icon.tsx.hbs +9 -0
- package/templates/frontend/native/bare/lib/android-navigation-bar.tsx.hbs +12 -0
- package/templates/frontend/native/bare/lib/constants.ts.hbs +19 -0
- package/templates/frontend/native/bare/lib/use-color-scheme.ts.hbs +20 -0
- package/templates/frontend/native/bare/metro.config.js.hbs +9 -0
- package/templates/frontend/native/bare/package.json.hbs +51 -0
- package/templates/frontend/native/bare/tsconfig.json.hbs +11 -0
- package/templates/frontend/native/base/assets/images/android-icon-background.png +0 -0
- package/templates/frontend/native/base/assets/images/android-icon-foreground.png +0 -0
- package/templates/frontend/native/base/assets/images/android-icon-monochrome.png +0 -0
- package/templates/frontend/native/base/assets/images/favicon.png +0 -0
- package/templates/frontend/native/base/assets/images/icon.png +0 -0
- package/templates/frontend/native/base/assets/images/partial-react-logo.png +0 -0
- package/templates/frontend/native/base/assets/images/react-logo.png +0 -0
- package/templates/frontend/native/base/assets/images/react-logo@2x.png +0 -0
- package/templates/frontend/native/base/assets/images/react-logo@3x.png +0 -0
- package/templates/frontend/native/base/assets/images/splash-icon.png +0 -0
- package/templates/frontend/native/unistyles/_gitignore +24 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/_layout.tsx.hbs +39 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/index.tsx.hbs +37 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/two.tsx.hbs +37 -0
- package/templates/frontend/native/unistyles/app/(drawer)/_layout.tsx.hbs +87 -0
- package/templates/frontend/native/unistyles/app/(drawer)/index.tsx.hbs +333 -0
- package/templates/frontend/native/unistyles/app/+not-found.tsx.hbs +65 -0
- package/templates/frontend/native/unistyles/app/_layout.tsx.hbs +169 -0
- package/templates/frontend/native/unistyles/app/modal.tsx.hbs +33 -0
- package/templates/frontend/native/unistyles/app.json.hbs +49 -0
- package/templates/frontend/native/unistyles/babel.config.js.hbs +21 -0
- package/templates/frontend/native/unistyles/breakpoints.ts.hbs +9 -0
- package/templates/frontend/native/unistyles/components/container.tsx.hbs +15 -0
- package/templates/frontend/native/unistyles/components/header-button.tsx.hbs +36 -0
- package/templates/frontend/native/unistyles/components/tabbar-icon.tsx.hbs +8 -0
- package/templates/frontend/native/unistyles/index.js.hbs +2 -0
- package/templates/frontend/native/unistyles/metro.config.js.hbs +5 -0
- package/templates/frontend/native/unistyles/package.json.hbs +51 -0
- package/templates/frontend/native/unistyles/theme.ts.hbs +98 -0
- package/templates/frontend/native/unistyles/tsconfig.json.hbs +12 -0
- package/templates/frontend/native/unistyles/unistyles.ts.hbs +27 -0
- package/templates/frontend/native/uniwind/_gitignore +21 -0
- package/templates/frontend/native/uniwind/app/(drawer)/(tabs)/_layout.tsx.hbs +46 -0
- package/templates/frontend/native/uniwind/app/(drawer)/(tabs)/index.tsx.hbs +15 -0
- package/templates/frontend/native/uniwind/app/(drawer)/(tabs)/two.tsx.hbs +15 -0
- package/templates/frontend/native/uniwind/app/(drawer)/_layout.tsx.hbs +91 -0
- package/templates/frontend/native/uniwind/app/(drawer)/index.tsx.hbs +191 -0
- package/templates/frontend/native/uniwind/app/+not-found.tsx.hbs +27 -0
- package/templates/frontend/native/uniwind/app/_layout.tsx.hbs +132 -0
- package/templates/frontend/native/uniwind/app/modal.tsx.hbs +37 -0
- package/templates/frontend/native/uniwind/app.json.hbs +19 -0
- package/templates/frontend/native/uniwind/components/container.tsx.hbs +33 -0
- package/templates/frontend/native/uniwind/components/theme-toggle.tsx.hbs +35 -0
- package/templates/frontend/native/uniwind/contexts/app-theme-context.tsx.hbs +62 -0
- package/templates/frontend/native/uniwind/global.css +5 -0
- package/templates/frontend/native/uniwind/metro.config.js.hbs +13 -0
- package/templates/frontend/native/uniwind/package.json.hbs +54 -0
- package/templates/frontend/native/uniwind/tsconfig.json.hbs +14 -0
- package/templates/frontend/nuxt/_gitignore +27 -0
- package/templates/frontend/nuxt/app/app.config.ts.hbs +15 -0
- package/templates/frontend/nuxt/app/app.vue.hbs +17 -0
- package/templates/frontend/nuxt/app/assets/css/main.css +2 -0
- package/templates/frontend/nuxt/app/components/Header.vue.hbs +40 -0
- package/templates/frontend/nuxt/app/layouts/default.vue.hbs +10 -0
- package/templates/frontend/nuxt/app/pages/index.vue.hbs +97 -0
- package/templates/frontend/nuxt/nuxt.config.ts.hbs +29 -0
- package/templates/frontend/nuxt/package.json.hbs +24 -0
- package/templates/frontend/nuxt/public/favicon.ico +0 -0
- package/templates/frontend/nuxt/public/robots.txt +2 -0
- package/templates/frontend/nuxt/server/tsconfig.json +3 -0
- package/templates/frontend/nuxt/tsconfig.json.hbs +18 -0
- package/templates/frontend/react/next/next-env.d.ts.hbs +5 -0
- package/templates/frontend/react/next/next.config.ts.hbs +22 -0
- package/templates/frontend/react/next/package.json.hbs +34 -0
- package/templates/frontend/react/next/postcss.config.mjs.hbs +5 -0
- package/templates/frontend/react/next/src/app/favicon.ico +0 -0
- package/templates/frontend/react/next/src/app/layout.tsx.hbs +76 -0
- package/templates/frontend/react/next/src/app/page.tsx.hbs +79 -0
- package/templates/frontend/react/next/src/components/mode-toggle.tsx.hbs +37 -0
- package/templates/frontend/react/next/src/components/providers.tsx.hbs +89 -0
- package/templates/frontend/react/next/src/components/theme-provider.tsx.hbs +11 -0
- package/templates/frontend/react/next/tsconfig.json.hbs +41 -0
- package/templates/frontend/react/react-router/package.json.hbs +42 -0
- package/templates/frontend/react/react-router/public/favicon.ico +0 -0
- package/templates/frontend/react/react-router/react-router.config.ts +6 -0
- package/templates/frontend/react/react-router/src/components/mode-toggle.tsx.hbs +29 -0
- package/templates/frontend/react/react-router/src/components/theme-provider.tsx.hbs +11 -0
- package/templates/frontend/react/react-router/src/root.tsx.hbs +190 -0
- package/templates/frontend/react/react-router/src/routes/_index.tsx.hbs +85 -0
- package/templates/frontend/react/react-router/src/routes.ts +4 -0
- package/templates/frontend/react/react-router/tsconfig.json.hbs +27 -0
- package/templates/frontend/react/react-router/vite.config.ts.hbs +12 -0
- package/templates/frontend/react/tanstack-router/index.html.hbs +13 -0
- package/templates/frontend/react/tanstack-router/package.json.hbs +41 -0
- package/templates/frontend/react/tanstack-router/src/components/mode-toggle.tsx.hbs +29 -0
- package/templates/frontend/react/tanstack-router/src/components/theme-provider.tsx.hbs +11 -0
- package/templates/frontend/react/tanstack-router/src/main.tsx.hbs +90 -0
- package/templates/frontend/react/tanstack-router/src/routes/__root.tsx.hbs +103 -0
- package/templates/frontend/react/tanstack-router/src/routes/index.tsx.hbs +85 -0
- package/templates/frontend/react/tanstack-router/tsconfig.json.hbs +18 -0
- package/templates/frontend/react/tanstack-router/vite.config.ts.hbs +21 -0
- package/templates/frontend/react/tanstack-start/package.json.hbs +43 -0
- package/templates/frontend/react/tanstack-start/public/robots.txt +3 -0
- package/templates/frontend/react/tanstack-start/src/router.tsx.hbs +144 -0
- package/templates/frontend/react/tanstack-start/src/routes/__root.tsx.hbs +208 -0
- package/templates/frontend/react/tanstack-start/src/routes/index.tsx.hbs +85 -0
- package/templates/frontend/react/tanstack-start/tsconfig.json.hbs +28 -0
- package/templates/frontend/react/tanstack-start/vite.config.ts.hbs +22 -0
- package/templates/frontend/react/web-base/_gitignore +60 -0
- package/templates/frontend/react/web-base/components.json +24 -0
- package/templates/frontend/react/web-base/src/components/header.tsx.hbs +78 -0
- package/templates/frontend/react/web-base/src/components/loader.tsx.hbs +9 -0
- package/templates/frontend/react/web-base/src/components/ui/button.tsx.hbs +57 -0
- package/templates/frontend/react/web-base/src/components/ui/card.tsx.hbs +103 -0
- package/templates/frontend/react/web-base/src/components/ui/checkbox.tsx.hbs +26 -0
- package/templates/frontend/react/web-base/src/components/ui/dropdown-menu.tsx.hbs +262 -0
- package/templates/frontend/react/web-base/src/components/ui/input.tsx.hbs +20 -0
- package/templates/frontend/react/web-base/src/components/ui/label.tsx.hbs +20 -0
- package/templates/frontend/react/web-base/src/components/ui/skeleton.tsx.hbs +13 -0
- package/templates/frontend/react/web-base/src/components/ui/sonner.tsx.hbs +44 -0
- package/templates/frontend/react/web-base/src/index.css.hbs +131 -0
- package/templates/frontend/react/web-base/src/lib/utils.ts.hbs +6 -0
- package/templates/frontend/solid/_gitignore +11 -0
- package/templates/frontend/solid/index.html +13 -0
- package/templates/frontend/solid/package.json.hbs +24 -0
- package/templates/frontend/solid/public/robots.txt +3 -0
- package/templates/frontend/solid/src/components/header.tsx.hbs +38 -0
- package/templates/frontend/solid/src/components/loader.tsx +9 -0
- package/templates/frontend/solid/src/main.tsx.hbs +41 -0
- package/templates/frontend/solid/src/routes/__root.tsx.hbs +34 -0
- package/templates/frontend/solid/src/routes/index.tsx.hbs +72 -0
- package/templates/frontend/solid/src/styles.css +5 -0
- package/templates/frontend/solid/tsconfig.json.hbs +29 -0
- package/templates/frontend/solid/vite.config.ts.hbs +21 -0
- package/templates/frontend/svelte/_gitignore +24 -0
- package/templates/frontend/svelte/_npmrc +1 -0
- package/templates/frontend/svelte/package.json.hbs +27 -0
- package/templates/frontend/svelte/src/app.css +5 -0
- package/templates/frontend/svelte/src/app.d.ts +13 -0
- package/templates/frontend/svelte/src/app.html +12 -0
- package/templates/frontend/svelte/src/components/Header.svelte.hbs +40 -0
- package/templates/frontend/svelte/src/lib/index.ts +2 -0
- package/templates/frontend/svelte/src/routes/+layout.svelte.hbs +54 -0
- package/templates/frontend/svelte/src/routes/+page.svelte.hbs +92 -0
- package/templates/frontend/svelte/static/favicon.png +0 -0
- package/templates/frontend/svelte/svelte.config.js.hbs +18 -0
- package/templates/frontend/svelte/tsconfig.json.hbs +19 -0
- package/templates/frontend/svelte/vite.config.ts.hbs +7 -0
- package/templates/packages/config/package.json.hbs +5 -0
- package/templates/packages/config/tsconfig.base.json.hbs +33 -0
- package/templates/packages/env/env.d.ts.hbs +16 -0
- package/templates/packages/env/package.json.hbs +7 -0
- package/templates/packages/env/src/native.ts.hbs +21 -0
- package/templates/packages/env/src/server.ts.hbs +39 -0
- package/templates/packages/env/src/web.ts.hbs +98 -0
- package/templates/packages/env/tsconfig.json.hbs +3 -0
- package/templates/packages/infra/alchemy.run.ts.hbs +271 -0
- package/templates/packages/infra/package.json.hbs +10 -0
- package/templates/payments/polar/server/base/src/lib/payments.ts.hbs +7 -0
- package/templates/payments/polar/web/nuxt/app/pages/success.vue.hbs +11 -0
- package/templates/payments/polar/web/react/next/src/app/success/page.tsx.hbs +15 -0
- package/templates/payments/polar/web/react/react-router/src/routes/success.tsx.hbs +13 -0
- package/templates/payments/polar/web/react/tanstack-router/src/routes/success.tsx.hbs +19 -0
- package/templates/payments/polar/web/react/tanstack-start/src/functions/get-payment.ts.hbs +15 -0
- package/templates/payments/polar/web/react/tanstack-start/src/routes/success.tsx.hbs +19 -0
- package/templates/payments/polar/web/solid/src/routes/success.tsx.hbs +23 -0
- package/templates/payments/polar/web/svelte/src/routes/success/+page.svelte.hbs +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["files: string[]","dirs: string[]","root: VirtualDirectory","dirNode: VirtualDirectory","file: VirtualFile","basename","packagesInfo: PackageInfo[]","catalog: Record<string, string>","workspaces: string[]","deps: AvailableDependencies[]","devDeps: AvailableDependencies[]","deps: AvailableDependencies[]","devDeps: AvailableDependencies[]","deps: AvailableDependencies[]","dependencies: AvailableDependencies[]","parts: string[]","frontendMap: Record<string, string>","instructions: string[]","structure: string[]","frontendTypes: Record<string, string>","frontendFeatures: Record<string, string>","backendFeatures: Record<string, string>","addonFeatures: Record<string, string>","dbDescriptions: Record<string, string>","lines: string[]","commonDeps: AvailableDependencies[]","commonDevDeps: AvailableDependencies[]","envDevDeps: Record<string, string>","authDeps: Record<string, string>","apiPackageDeps: Record<string, string>","serverDeps: Record<string, string>","webPackageDeps: Record<string, string>","nativeDeps: Record<string, string>","processedContent: string","templateMap: Record<string, string>","EMBEDDED_TEMPLATES: Map<string, string>"],"sources":["../src/core/virtual-fs.ts","../src/core/template-processor.ts","../src/post-process/catalogs.ts","../src/post-process/package-configs.ts","../src/post-process/index.ts","../src/utils/add-deps.ts","../src/processors/addons-deps.ts","../src/processors/api-deps.ts","../src/processors/auth-deps.ts","../src/processors/backend-deps.ts","../src/processors/db-deps.ts","../src/processors/deploy-deps.ts","../src/processors/env-deps.ts","../src/processors/examples-deps.ts","../src/processors/infra-deps.ts","../src/processors/payments-deps.ts","../src/processors/readme-generator.ts","../src/processors/runtime-deps.ts","../src/processors/workspace-deps.ts","../src/processors/index.ts","../src/generator.ts","../src/templates.generated.ts"],"sourcesContent":["import type { Dirent } from \"node:fs\";\n\nimport { memfs } from \"memfs\";\nimport { dirname, basename, extname, normalize, join } from \"pathe\";\n\nimport type { VirtualDirectory, VirtualFile } from \"../types\";\n\nexport class VirtualFileSystem {\n private _fs: ReturnType<typeof memfs>[\"fs\"];\n private _vol: ReturnType<typeof memfs>[\"vol\"];\n\n constructor() {\n const { fs, vol } = memfs();\n this._fs = fs;\n this._vol = vol;\n }\n\n writeFile(filePath: string, content: string): void {\n const normalizedPath = this.normalizePath(filePath);\n const dir = dirname(normalizedPath);\n\n if (dir && dir !== \"/\" && dir !== \".\") {\n this._fs.mkdirSync(dir, { recursive: true });\n }\n\n this._fs.writeFileSync(normalizedPath, content, { encoding: \"utf-8\" });\n }\n\n readFile(filePath: string): string | undefined {\n const normalizedPath = this.normalizePath(filePath);\n try {\n return this._fs.readFileSync(normalizedPath, \"utf-8\") as string;\n } catch {\n return undefined;\n }\n }\n\n fileExists(filePath: string): boolean {\n const normalizedPath = this.normalizePath(filePath);\n try {\n const stat = this._fs.statSync(normalizedPath);\n return stat.isFile();\n } catch {\n return false;\n }\n }\n\n directoryExists(dirPath: string): boolean {\n const normalizedPath = this.normalizePath(dirPath);\n try {\n const stat = this._fs.statSync(normalizedPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n }\n\n mkdir(dirPath: string): void {\n const normalizedPath = this.normalizePath(dirPath);\n this._fs.mkdirSync(normalizedPath, { recursive: true });\n }\n\n getAllFiles(): string[] {\n const files: string[] = [];\n this.walkDir(\"/\", files, true);\n return files.sort();\n }\n\n getAllDirectories(): string[] {\n const dirs: string[] = [];\n this.walkDir(\"/\", dirs, false);\n return dirs.filter((d) => d !== \"/\").sort();\n }\n\n private walkDir(dir: string, results: string[], filesOnly: boolean): void {\n try {\n const entries = this._fs.readdirSync(dir, { withFileTypes: true }) as Dirent[];\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = fullPath.replace(/^\\//, \"\");\n\n if (entry.isDirectory()) {\n if (!filesOnly) {\n results.push(relativePath);\n }\n this.walkDir(fullPath, results, filesOnly);\n } else if (entry.isFile() && filesOnly) {\n results.push(relativePath);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n getFileCount(): number {\n return this.getAllFiles().length;\n }\n\n getDirectoryCount(): number {\n return this.getAllDirectories().length;\n }\n\n exists(path: string): boolean {\n const normalizedPath = this.normalizePath(path);\n try {\n this._fs.statSync(normalizedPath);\n return true;\n } catch {\n return false;\n }\n }\n\n readJson<T = unknown>(filePath: string): T | undefined {\n const content = this.readFile(filePath);\n if (content === undefined) return undefined;\n try {\n return JSON.parse(content) as T;\n } catch {\n return undefined;\n }\n }\n\n writeJson(filePath: string, data: unknown, spaces = 2): void {\n const content = JSON.stringify(data, null, spaces);\n this.writeFile(filePath, content);\n }\n\n deleteFile(filePath: string): boolean {\n const normalizedPath = this.normalizePath(filePath);\n try {\n this._fs.unlinkSync(normalizedPath);\n return true;\n } catch {\n return false;\n }\n }\n\n listDir(dirPath: string): string[] {\n const normalizedPath = this.normalizePath(dirPath) || \"/\";\n try {\n const entries = this._fs.readdirSync(normalizedPath) as string[];\n return entries.sort();\n } catch {\n return [];\n }\n }\n\n toTree(rootName: string = \"project\"): VirtualDirectory {\n const root: VirtualDirectory = {\n type: \"directory\",\n path: \"\",\n name: rootName,\n children: [],\n };\n\n this.buildTree(\"/\", root);\n this.sortChildren(root);\n\n return root;\n }\n\n private buildTree(dir: string, parent: VirtualDirectory): void {\n try {\n const entries = this._fs.readdirSync(dir, { withFileTypes: true }) as Dirent[];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = fullPath.replace(/^\\//, \"\");\n const name = entry.name;\n\n if (entry.isDirectory()) {\n const dirNode: VirtualDirectory = {\n type: \"directory\",\n path: relativePath,\n name,\n children: [],\n };\n parent.children.push(dirNode);\n this.buildTree(fullPath, dirNode);\n } else if (entry.isFile()) {\n const content = this._fs.readFileSync(fullPath, \"utf-8\") as string;\n const file: VirtualFile = {\n type: \"file\",\n path: relativePath,\n name,\n content,\n extension: this.getExtension(name),\n };\n parent.children.push(file);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n\n private sortChildren(node: VirtualDirectory): void {\n node.children.sort((a, b) => {\n if (a.type === \"directory\" && b.type === \"file\") return -1;\n if (a.type === \"file\" && b.type === \"directory\") return 1;\n return a.name.localeCompare(b.name);\n });\n\n for (const child of node.children) {\n if (child.type === \"directory\") {\n this.sortChildren(child);\n }\n }\n }\n\n private normalizePath(p: string): string {\n const normalized = normalize(p).replace(/^\\/+/, \"\");\n return \"/\" + normalized;\n }\n\n private getExtension(filename: string): string {\n const ext = extname(filename);\n return ext.startsWith(\".\") ? ext.slice(1) : ext;\n }\n\n clear(): void {\n const { fs, vol } = memfs();\n this._fs = fs;\n this._vol = vol;\n }\n\n getVolume(): ReturnType<typeof memfs>[\"vol\"] {\n return this._vol;\n }\n\n getFs(): ReturnType<typeof memfs>[\"fs\"] {\n return this._fs;\n }\n}\n","import type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport Handlebars from \"handlebars\";\n\n// Register Handlebars helpers (same as CLI)\nHandlebars.registerHelper(\"eq\", (a, b) => a === b);\nHandlebars.registerHelper(\"ne\", (a, b) => a !== b);\nHandlebars.registerHelper(\"and\", (...args) => {\n const values = args.slice(0, -1);\n return values.every((value) => value);\n});\nHandlebars.registerHelper(\"or\", (...args) => {\n const values = args.slice(0, -1);\n return values.some((value) => value);\n});\nHandlebars.registerHelper(\n \"includes\",\n (array, value) => Array.isArray(array) && array.includes(value),\n);\n\n/**\n * Process a Handlebars template string with the given context\n */\nexport function processTemplateString(templateContent: string, context: ProjectConfig): string {\n const template = Handlebars.compile(templateContent);\n return template(context);\n}\n\n/**\n * Determine if a file should be treated as binary (not processed by Handlebars)\n */\nexport function isBinaryFile(filePath: string): boolean {\n const binaryExtensions = new Set([\".png\", \".ico\", \".svg\", \".jpg\", \".jpeg\", \".gif\", \".webp\"]);\n const ext = filePath.slice(filePath.lastIndexOf(\".\")).toLowerCase();\n return binaryExtensions.has(ext);\n}\n\n/**\n * Transform template filename to output filename\n * - Remove .hbs extension\n * - Convert _gitignore to .gitignore\n * - Convert _npmrc to .npmrc\n */\nexport function transformFilename(filename: string): string {\n let result = filename;\n\n // Remove .hbs extension\n if (result.endsWith(\".hbs\")) {\n result = result.slice(0, -4);\n }\n\n // Transform special filenames\n const basename = result.split(\"/\").pop() || result;\n if (basename === \"_gitignore\") {\n result = result.replace(/_gitignore$/, \".gitignore\");\n } else if (basename === \"_npmrc\") {\n result = result.replace(/_npmrc$/, \".npmrc\");\n }\n\n return result;\n}\n\n/**\n * Process template content based on file type\n * - Binary files: return empty string (placeholder)\n * - .hbs files: compile with Handlebars\n * - Other files: return as-is\n */\nexport function processFileContent(\n filePath: string,\n content: string,\n context: ProjectConfig,\n): string {\n if (isBinaryFile(filePath)) {\n return \"[Binary file]\";\n }\n\n const originalPath = filePath.endsWith(\".hbs\") ? filePath : filePath + \".hbs\";\n\n // Check if this was a .hbs file (content came from .hbs source)\n if (filePath !== originalPath || filePath.includes(\".hbs\")) {\n try {\n return processTemplateString(content, context);\n } catch (error) {\n // If template processing fails, return original content\n console.warn(`Template processing failed for ${filePath}:`, error);\n return content;\n }\n }\n\n return content;\n}\n\nexport { Handlebars };\n","/**\n * Catalogs post-processor\n * Deduplicates dependencies across packages using pnpm/bun catalogs\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\ntype PackageJson = {\n name?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[]; catalog?: Record<string, string> };\n packageManager?: string;\n [key: string]: unknown;\n};\n\ntype CatalogEntry = {\n versions: Set<string>;\n packages: string[];\n};\n\ntype PackageInfo = {\n path: string;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n};\n\nconst PACKAGE_PATHS = [\n \".\",\n \"apps/server\",\n \"apps/web\",\n \"apps/native\",\n \"apps/fumadocs\",\n \"apps/docs\",\n \"packages/api\",\n \"packages/db\",\n \"packages/auth\",\n \"packages/backend\",\n \"packages/config\",\n \"packages/env\",\n \"packages/infra\",\n];\n\n/**\n * Process dependency catalogs for pnpm/bun\n */\nexport function processCatalogs(vfs: VirtualFileSystem, config: ProjectConfig): void {\n if (config.packageManager === \"npm\") return;\n\n const packagesInfo: PackageInfo[] = [];\n\n for (const pkgPath of PACKAGE_PATHS) {\n const jsonPath = pkgPath === \".\" ? \"package.json\" : `${pkgPath}/package.json`;\n const pkgJson = vfs.readJson<PackageJson>(jsonPath);\n\n if (pkgJson) {\n packagesInfo.push({\n path: pkgPath,\n dependencies: (pkgJson.dependencies || {}) as Record<string, string>,\n devDependencies: (pkgJson.devDependencies || {}) as Record<string, string>,\n });\n }\n }\n\n const catalog = findDuplicateDependencies(packagesInfo, config.projectName);\n\n if (Object.keys(catalog).length === 0) return;\n\n if (config.packageManager === \"bun\") {\n setupBunCatalogs(vfs, catalog);\n } else if (config.packageManager === \"pnpm\") {\n setupPnpmCatalogs(vfs, catalog);\n }\n\n updatePackageJsonsWithCatalogs(vfs, packagesInfo, catalog);\n}\n\nfunction findDuplicateDependencies(\n packagesInfo: PackageInfo[],\n projectName: string,\n): Record<string, string> {\n const depCount = new Map<string, CatalogEntry>();\n const projectScope = `@${projectName}/`;\n\n for (const pkg of packagesInfo) {\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n for (const [depName, version] of Object.entries(allDeps)) {\n if (depName.startsWith(projectScope)) continue;\n if (version.startsWith(\"workspace:\")) continue;\n\n const existing = depCount.get(depName);\n if (existing) {\n existing.versions.add(version);\n existing.packages.push(pkg.path);\n } else {\n depCount.set(depName, {\n versions: new Set([version]),\n packages: [pkg.path],\n });\n }\n }\n }\n\n const catalog: Record<string, string> = {};\n for (const [depName, info] of depCount.entries()) {\n if (info.packages.length > 1 && info.versions.size === 1) {\n const version = Array.from(info.versions)[0];\n if (version) {\n catalog[depName] = version;\n }\n }\n }\n\n return catalog;\n}\n\nfunction setupBunCatalogs(vfs: VirtualFileSystem, catalog: Record<string, string>): void {\n const pkgJson = vfs.readJson<PackageJson>(\"package.json\");\n if (!pkgJson) return;\n\n if (!pkgJson.workspaces) {\n pkgJson.workspaces = {};\n }\n\n if (Array.isArray(pkgJson.workspaces)) {\n pkgJson.workspaces = {\n packages: pkgJson.workspaces,\n catalog,\n };\n } else if (typeof pkgJson.workspaces === \"object\") {\n const ws = pkgJson.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n if (!ws.catalog) {\n ws.catalog = {};\n }\n ws.catalog = { ...ws.catalog, ...catalog };\n }\n\n vfs.writeJson(\"package.json\", pkgJson);\n}\n\nfunction setupPnpmCatalogs(vfs: VirtualFileSystem, catalog: Record<string, string>): void {\n const content = vfs.readFile(\"pnpm-workspace.yaml\");\n if (!content) return;\n\n // Simple YAML handling - add catalog section\n const lines = content.split(\"\\n\");\n const hasExistingCatalog = lines.some((line) => line.startsWith(\"catalog:\"));\n\n if (hasExistingCatalog) {\n // Find catalog section and append\n const catalogIndex = lines.findIndex((line) => line.startsWith(\"catalog:\"));\n const catalogEntries = Object.entries(catalog).map(\n ([name, version]) => ` ${name}: \"${version}\"`,\n );\n lines.splice(catalogIndex + 1, 0, ...catalogEntries);\n } else {\n // Add new catalog section\n lines.push(\"catalog:\");\n for (const [name, version] of Object.entries(catalog)) {\n lines.push(` ${name}: \"${version}\"`);\n }\n }\n\n vfs.writeFile(\"pnpm-workspace.yaml\", lines.join(\"\\n\"));\n}\n\nfunction updatePackageJsonsWithCatalogs(\n vfs: VirtualFileSystem,\n packagesInfo: PackageInfo[],\n catalog: Record<string, string>,\n): void {\n for (const pkg of packagesInfo) {\n const jsonPath = pkg.path === \".\" ? \"package.json\" : `${pkg.path}/package.json`;\n const pkgJson = vfs.readJson<PackageJson>(jsonPath);\n if (!pkgJson) continue;\n\n let updated = false;\n\n if (pkgJson.dependencies) {\n for (const depName of Object.keys(pkgJson.dependencies)) {\n if (catalog[depName]) {\n (pkgJson.dependencies as Record<string, string>)[depName] = \"catalog:\";\n updated = true;\n }\n }\n }\n\n if (pkgJson.devDependencies) {\n for (const depName of Object.keys(pkgJson.devDependencies)) {\n if (catalog[depName]) {\n (pkgJson.devDependencies as Record<string, string>)[depName] = \"catalog:\";\n updated = true;\n }\n }\n }\n\n if (updated) {\n vfs.writeJson(jsonPath, pkgJson);\n }\n }\n}\n","/**\n * Package.json configuration post-processor\n * Updates package names, scripts, and workspaces after template generation\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\ntype PackageJson = {\n name?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages?: string[]; catalog?: Record<string, string> };\n packageManager?: string;\n [key: string]: unknown;\n};\n\ntype PackageManagerConfig = {\n dev: string;\n build: string;\n checkTypes: string;\n filter: (workspace: string, script: string) => string;\n};\n\n/**\n * Update all package.json files with proper names, scripts, and workspaces\n */\nexport function processPackageConfigs(vfs: VirtualFileSystem, config: ProjectConfig): void {\n updateRootPackageJson(vfs, config);\n\n if (config.backend === \"convex\") {\n updateConvexPackageJson(vfs, config);\n } else if (config.backend !== \"none\") {\n updateDbPackageJson(vfs, config);\n updateAuthPackageJson(vfs, config);\n updateApiPackageJson(vfs, config);\n }\n}\n\nfunction updateRootPackageJson(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const pkgJson = vfs.readJson<PackageJson>(\"package.json\");\n if (!pkgJson) return;\n\n pkgJson.name = config.projectName;\n pkgJson.scripts = pkgJson.scripts || {};\n\n // Ensure workspaces is an array\n let workspaces: string[] = [];\n if (Array.isArray(pkgJson.workspaces)) {\n workspaces = pkgJson.workspaces;\n } else if (\n pkgJson.workspaces &&\n typeof pkgJson.workspaces === \"object\" &&\n pkgJson.workspaces.packages\n ) {\n workspaces = pkgJson.workspaces.packages;\n }\n pkgJson.workspaces = workspaces;\n\n const scripts = pkgJson.scripts;\n const { projectName, packageManager, backend, database, orm, dbSetup, serverDeploy, addons } =\n config;\n\n const backendPackageName = backend === \"convex\" ? `@${projectName}/backend` : \"server\";\n const dbPackageName = `@${projectName}/db`;\n const hasTurborepo = addons.includes(\"turborepo\");\n\n const needsDbScripts =\n backend !== \"convex\" && database !== \"none\" && orm !== \"none\" && orm !== \"mongoose\";\n const isD1Alchemy = dbSetup === \"d1\" && serverDeploy === \"cloudflare\";\n\n const pmConfig = getPackageManagerConfig(packageManager, hasTurborepo);\n\n scripts.dev = pmConfig.dev;\n scripts.build = pmConfig.build;\n scripts[\"check-types\"] = pmConfig.checkTypes;\n scripts[\"dev:native\"] = pmConfig.filter(\"native\", \"dev\");\n scripts[\"dev:web\"] = pmConfig.filter(\"web\", \"dev\");\n\n if (backend !== \"self\" && backend !== \"none\") {\n scripts[\"dev:server\"] = pmConfig.filter(backendPackageName, \"dev\");\n }\n\n if (backend === \"convex\") {\n scripts[\"dev:setup\"] = pmConfig.filter(backendPackageName, \"dev:setup\");\n }\n\n if (needsDbScripts) {\n scripts[\"db:push\"] = pmConfig.filter(dbPackageName, \"db:push\");\n\n if (!isD1Alchemy) {\n scripts[\"db:studio\"] = pmConfig.filter(dbPackageName, \"db:studio\");\n }\n\n if (orm === \"prisma\") {\n scripts[\"db:generate\"] = pmConfig.filter(dbPackageName, \"db:generate\");\n scripts[\"db:migrate\"] = pmConfig.filter(dbPackageName, \"db:migrate\");\n } else if (orm === \"drizzle\") {\n scripts[\"db:generate\"] = pmConfig.filter(dbPackageName, \"db:generate\");\n if (!isD1Alchemy) {\n scripts[\"db:migrate\"] = pmConfig.filter(dbPackageName, \"db:migrate\");\n }\n }\n }\n\n if (database === \"sqlite\" && dbSetup !== \"d1\") {\n scripts[\"db:local\"] = pmConfig.filter(dbPackageName, \"db:local\");\n }\n\n if (dbSetup === \"docker\") {\n scripts[\"db:start\"] = pmConfig.filter(dbPackageName, \"db:start\");\n scripts[\"db:watch\"] = pmConfig.filter(dbPackageName, \"db:watch\");\n scripts[\"db:stop\"] = pmConfig.filter(dbPackageName, \"db:stop\");\n scripts[\"db:down\"] = pmConfig.filter(dbPackageName, \"db:down\");\n }\n\n // Note: packageManager version is set by CLI at runtime since it requires running the actual CLI\n // For preview purposes, we just show the configured package manager\n pkgJson.packageManager = `${packageManager}@latest`;\n\n if (backend === \"convex\") {\n if (!workspaces.includes(\"packages/*\")) {\n workspaces.push(\"packages/*\");\n }\n const needsAppsDir = config.frontend.length > 0 || addons.includes(\"starlight\");\n if (needsAppsDir && !workspaces.includes(\"apps/*\")) {\n workspaces.push(\"apps/*\");\n }\n } else {\n if (!workspaces.includes(\"apps/*\")) {\n workspaces.push(\"apps/*\");\n }\n if (!workspaces.includes(\"packages/*\")) {\n workspaces.push(\"packages/*\");\n }\n }\n\n vfs.writeJson(\"package.json\", pkgJson);\n}\n\nfunction getPackageManagerConfig(\n packageManager: ProjectConfig[\"packageManager\"],\n hasTurborepo: boolean,\n): PackageManagerConfig {\n if (hasTurborepo) {\n return {\n dev: \"turbo dev\",\n build: \"turbo build\",\n checkTypes: \"turbo check-types\",\n filter: (workspace, script) => `turbo -F ${workspace} ${script}`,\n };\n }\n\n switch (packageManager) {\n case \"pnpm\":\n return {\n dev: \"pnpm -r dev\",\n build: \"pnpm -r build\",\n checkTypes: \"pnpm -r check-types\",\n filter: (workspace, script) => `pnpm --filter ${workspace} ${script}`,\n };\n case \"npm\":\n return {\n dev: \"npm run dev --workspaces\",\n build: \"npm run build --workspaces\",\n checkTypes: \"npm run check-types --workspaces\",\n filter: (workspace, script) => `npm run ${script} --workspace ${workspace}`,\n };\n case \"bun\":\n return {\n dev: \"bun run --filter '*' dev\",\n build: \"bun run --filter '*' build\",\n checkTypes: \"bun run --filter '*' check-types\",\n filter: (workspace, script) => `bun run --filter ${workspace} ${script}`,\n };\n }\n}\n\nfunction updateDbPackageJson(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const pkgJson = vfs.readJson<PackageJson>(\"packages/db/package.json\");\n if (!pkgJson) return;\n\n pkgJson.name = `@${config.projectName}/db`;\n pkgJson.scripts = pkgJson.scripts || {};\n\n const scripts = pkgJson.scripts;\n const { database, orm, dbSetup, serverDeploy } = config;\n const isD1Alchemy = dbSetup === \"d1\" && serverDeploy === \"cloudflare\";\n\n if (database !== \"none\") {\n if (database === \"sqlite\" && dbSetup !== \"d1\") {\n scripts[\"db:local\"] = \"turso dev --db-file local.db\";\n }\n\n if (orm === \"prisma\") {\n scripts[\"db:push\"] = \"prisma db push\";\n scripts[\"db:generate\"] = \"prisma generate\";\n scripts[\"db:migrate\"] = \"prisma migrate dev\";\n if (!isD1Alchemy) {\n scripts[\"db:studio\"] = \"prisma studio\";\n }\n } else if (orm === \"drizzle\") {\n scripts[\"db:push\"] = \"drizzle-kit push\";\n scripts[\"db:generate\"] = \"drizzle-kit generate\";\n if (!isD1Alchemy) {\n scripts[\"db:studio\"] = \"drizzle-kit studio\";\n scripts[\"db:migrate\"] = \"drizzle-kit migrate\";\n }\n }\n }\n\n if (dbSetup === \"docker\") {\n scripts[\"db:start\"] = \"docker compose up -d\";\n scripts[\"db:watch\"] = \"docker compose up\";\n scripts[\"db:stop\"] = \"docker compose stop\";\n scripts[\"db:down\"] = \"docker compose down\";\n }\n\n vfs.writeJson(\"packages/db/package.json\", pkgJson);\n}\n\nfunction updateAuthPackageJson(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const pkgJson = vfs.readJson<PackageJson>(\"packages/auth/package.json\");\n if (!pkgJson) return;\n\n pkgJson.name = `@${config.projectName}/auth`;\n vfs.writeJson(\"packages/auth/package.json\", pkgJson);\n}\n\nfunction updateApiPackageJson(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const pkgJson = vfs.readJson<PackageJson>(\"packages/api/package.json\");\n if (!pkgJson) return;\n\n pkgJson.name = `@${config.projectName}/api`;\n vfs.writeJson(\"packages/api/package.json\", pkgJson);\n}\n\nfunction updateConvexPackageJson(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const pkgJson = vfs.readJson<PackageJson>(\"packages/backend/package.json\");\n if (!pkgJson) return;\n\n pkgJson.name = `@${config.projectName}/backend`;\n pkgJson.scripts = pkgJson.scripts || {};\n vfs.writeJson(\"packages/backend/package.json\", pkgJson);\n}\n","/**\n * Post-processor - Orchestrates post-generation processing\n * Modifies virtual files after template generation\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { processCatalogs } from \"./catalogs\";\nimport { processPackageConfigs } from \"./package-configs\";\n\n/**\n * Run all post-processing steps on the virtual filesystem\n */\nexport function processPostGeneration(vfs: VirtualFileSystem, config: ProjectConfig): void {\n processPackageConfigs(vfs, config);\n processCatalogs(vfs, config);\n}\n\nexport { processCatalogs, processPackageConfigs };\n","/**\n * Add dependencies to a package.json in the virtual filesystem\n */\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\ntype PackageJson = {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport const dependencyVersionMap = {\n typescript: \"^5\",\n\n \"better-auth\": \"^1.4.9\",\n \"@better-auth/expo\": \"^1.4.9\",\n\n \"@clerk/nextjs\": \"^6.31.5\",\n \"@clerk/clerk-react\": \"^5.45.0\",\n \"@clerk/tanstack-react-start\": \"^0.26.3\",\n \"@clerk/clerk-expo\": \"^2.14.25\",\n\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-kit\": \"^0.31.8\",\n \"@planetscale/database\": \"^1.19.0\",\n\n \"@libsql/client\": \"0.15.15\",\n libsql: \"0.5.22\",\n\n \"@neondatabase/serverless\": \"^1.0.2\",\n pg: \"^8.16.3\",\n \"@types/pg\": \"^8.15.6\",\n \"@types/ws\": \"^8.18.1\",\n ws: \"^8.18.3\",\n\n mysql2: \"^3.14.0\",\n\n \"@prisma/client\": \"^7.1.0\",\n prisma: \"^7.1.0\",\n \"@prisma/adapter-d1\": \"^7.1.0\",\n \"@prisma/adapter-neon\": \"^7.1.0\",\n \"@prisma/adapter-mariadb\": \"^7.1.0\",\n \"@prisma/adapter-libsql\": \"^7.1.0\",\n \"@prisma/adapter-better-sqlite3\": \"^7.1.0\",\n \"@prisma/adapter-pg\": \"^7.1.0\",\n \"@prisma/adapter-planetscale\": \"^7.1.0\",\n\n mongoose: \"^8.14.0\",\n\n \"vite-plugin-pwa\": \"^1.0.1\",\n \"@vite-pwa/assets-generator\": \"^1.0.0\",\n\n \"@tauri-apps/cli\": \"^2.4.0\",\n\n \"@biomejs/biome\": \"^2.2.0\",\n\n oxlint: \"^1.34.0\",\n oxfmt: \"^0.19.0\",\n\n husky: \"^9.1.7\",\n \"lint-staged\": \"^16.1.2\",\n\n tsx: \"^4.19.2\",\n \"@types/node\": \"^22.13.14\",\n\n \"@types/bun\": \"^1.3.4\",\n\n \"@elysiajs/node\": \"^1.3.1\",\n\n \"@elysiajs/cors\": \"^1.3.3\",\n \"@elysiajs/trpc\": \"^1.1.0\",\n elysia: \"^1.3.21\",\n\n \"@hono/node-server\": \"^1.14.4\",\n \"@hono/trpc-server\": \"^0.4.0\",\n hono: \"^4.8.2\",\n\n cors: \"^2.8.5\",\n express: \"^5.1.0\",\n \"@types/express\": \"^5.0.1\",\n \"@types/cors\": \"^2.8.17\",\n\n fastify: \"^5.3.3\",\n \"@fastify/cors\": \"^11.0.1\",\n\n turbo: \"^2.6.3\",\n\n ai: \"^6.0.3\",\n \"@ai-sdk/google\": \"^3.0.1\",\n \"@ai-sdk/vue\": \"^3.0.3\",\n \"@ai-sdk/svelte\": \"^4.0.3\",\n \"@ai-sdk/react\": \"^3.0.3\",\n \"@ai-sdk/devtools\": \"^0.0.2\",\n streamdown: \"^1.6.10\",\n shiki: \"^3.20.0\",\n\n \"@orpc/server\": \"^1.12.2\",\n \"@orpc/client\": \"^1.12.2\",\n \"@orpc/openapi\": \"^1.12.2\",\n \"@orpc/zod\": \"^1.12.2\",\n \"@orpc/tanstack-query\": \"^1.12.2\",\n\n \"@trpc/tanstack-react-query\": \"^11.7.2\",\n \"@trpc/server\": \"^11.7.2\",\n \"@trpc/client\": \"^11.7.2\",\n\n next: \"^16.1.1\",\n\n convex: \"^1.31.2\",\n \"@convex-dev/react-query\": \"^0.1.0\",\n \"@convex-dev/agent\": \"^0.3.2\",\n \"convex-svelte\": \"^0.0.12\",\n \"convex-nuxt\": \"0.1.5\",\n \"convex-vue\": \"^0.1.5\",\n \"@convex-dev/better-auth\": \"^0.10.9\",\n\n \"@tanstack/svelte-query\": \"^5.85.3\",\n \"@tanstack/svelte-query-devtools\": \"^5.85.3\",\n\n \"@tanstack/vue-query-devtools\": \"^5.90.2\",\n \"@tanstack/vue-query\": \"^5.90.2\",\n\n \"@tanstack/react-query-devtools\": \"^5.91.1\",\n \"@tanstack/react-query\": \"^5.90.12\",\n \"@tanstack/react-router-ssr-query\": \"^1.142.7\",\n\n \"@tanstack/solid-query\": \"^5.87.4\",\n \"@tanstack/solid-query-devtools\": \"^5.87.4\",\n \"@tanstack/solid-router-devtools\": \"^1.131.44\",\n\n wrangler: \"^4.54.0\",\n \"@cloudflare/vite-plugin\": \"^1.17.1\",\n \"@opennextjs/cloudflare\": \"^1.14.6\",\n \"nitro-cloudflare-dev\": \"^0.2.2\",\n \"@sveltejs/adapter-cloudflare\": \"^7.2.4\",\n \"@cloudflare/workers-types\": \"^4.20251213.0\",\n\n alchemy: \"^0.82.1\",\n\n dotenv: \"^17.2.2\",\n tsdown: \"^0.16.5\",\n zod: \"^4.1.13\",\n \"@t3-oss/env-core\": \"^0.13.1\",\n \"@t3-oss/env-nextjs\": \"^0.13.1\",\n \"@t3-oss/env-nuxt\": \"^0.13.1\",\n srvx: \"0.8.15\",\n\n \"@polar-sh/better-auth\": \"^1.1.3\",\n \"@polar-sh/sdk\": \"^0.34.16\",\n} as const;\n\nexport type AvailableDependencies = keyof typeof dependencyVersionMap;\n\nexport type AddDepsOptions = {\n vfs: VirtualFileSystem;\n packagePath: string;\n dependencies?: AvailableDependencies[];\n devDependencies?: AvailableDependencies[];\n customDependencies?: Record<string, string>;\n customDevDependencies?: Record<string, string>;\n};\n\n/**\n * Add dependencies to a package.json file in the VFS\n */\nexport function addPackageDependency(options: AddDepsOptions): void {\n const {\n vfs,\n packagePath,\n dependencies = [],\n devDependencies = [],\n customDependencies = {},\n customDevDependencies = {},\n } = options;\n\n const pkgJson = vfs.readJson<PackageJson>(packagePath);\n if (!pkgJson) return;\n\n // Initialize if not present\n pkgJson.dependencies = pkgJson.dependencies || {};\n pkgJson.devDependencies = pkgJson.devDependencies || {};\n\n // Add regular dependencies\n for (const dep of dependencies) {\n if (!pkgJson.dependencies[dep]) {\n const version = dependencyVersionMap[dep as AvailableDependencies];\n if (!version) {\n throw new Error(\n `Missing version for dependency: ${dep}. Add it to dependencyVersionMap in add-deps.ts`,\n );\n }\n pkgJson.dependencies[dep] = version;\n }\n }\n\n // Add dev dependencies\n for (const dep of devDependencies) {\n if (!pkgJson.devDependencies[dep]) {\n const version = dependencyVersionMap[dep as AvailableDependencies];\n if (!version) {\n throw new Error(\n `Missing version for devDependency: ${dep}. Add it to dependencyVersionMap in add-deps.ts`,\n );\n }\n pkgJson.devDependencies[dep] = version;\n }\n }\n\n // Add custom dependencies (with specific versions)\n for (const [dep, version] of Object.entries(customDependencies)) {\n pkgJson.dependencies[dep] = version;\n }\n\n // Add custom dev dependencies (with specific versions)\n for (const [dep, version] of Object.entries(customDevDependencies)) {\n pkgJson.devDependencies[dep] = version;\n }\n\n vfs.writeJson(packagePath, pkgJson);\n}\n","/**\n * Addon dependencies processor\n * Adds dependencies for addons: turborepo, biome, husky, oxlint, pwa, tauri\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\ntype PackageJson = {\n name?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n \"lint-staged\"?: Record<string, string | string[]>;\n [key: string]: unknown;\n};\n\n/**\n * Process addon dependencies\n */\nexport function processAddonsDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n if (!config.addons || config.addons.length === 0) return;\n\n const hasReactWebFrontend =\n config.frontend.includes(\"react-router\") ||\n config.frontend.includes(\"tanstack-router\") ||\n config.frontend.includes(\"next\");\n const hasSolidFrontend = config.frontend.includes(\"solid\");\n const hasWebFrontend = hasReactWebFrontend || hasSolidFrontend;\n\n // Turborepo\n if (config.addons.includes(\"turborepo\")) {\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n devDependencies: [\"turbo\"],\n });\n }\n\n // Biome\n if (config.addons.includes(\"biome\")) {\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n devDependencies: [\"@biomejs/biome\"],\n });\n\n // Add check script\n const rootPkg = vfs.readJson<PackageJson>(\"package.json\");\n if (rootPkg) {\n rootPkg.scripts = {\n ...rootPkg.scripts,\n check: \"biome check --write .\",\n };\n vfs.writeJson(\"package.json\", rootPkg);\n }\n }\n\n // Husky\n if (config.addons.includes(\"husky\")) {\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n devDependencies: [\"husky\", \"lint-staged\"],\n });\n\n const rootPkg = vfs.readJson<PackageJson>(\"package.json\");\n if (rootPkg) {\n rootPkg.scripts = {\n ...rootPkg.scripts,\n prepare: \"husky\",\n };\n\n // Configure lint-staged based on available linters\n if (config.addons.includes(\"oxlint\")) {\n rootPkg[\"lint-staged\"] = {\n \"*\": [\"oxlint\", \"oxfmt --write\"],\n };\n } else if (config.addons.includes(\"biome\")) {\n rootPkg[\"lint-staged\"] = {\n \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}\": [\"biome check --write .\"],\n };\n } else {\n rootPkg[\"lint-staged\"] = {\n \"**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx,vue,astro,svelte}\": \"\",\n };\n }\n\n vfs.writeJson(\"package.json\", rootPkg);\n }\n }\n\n // Oxlint\n if (config.addons.includes(\"oxlint\")) {\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n devDependencies: [\"oxlint\", \"oxfmt\"],\n });\n\n const rootPkg = vfs.readJson<PackageJson>(\"package.json\");\n if (rootPkg) {\n rootPkg.scripts = {\n ...rootPkg.scripts,\n check: \"oxlint && oxfmt --write\",\n };\n vfs.writeJson(\"package.json\", rootPkg);\n }\n }\n\n // PWA (for React/Vite and Solid frontends)\n if (config.addons.includes(\"pwa\") && hasWebFrontend) {\n const webPkgPath = \"apps/web/package.json\";\n if (vfs.exists(webPkgPath)) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies: [\"vite-plugin-pwa\"],\n devDependencies: [\"@vite-pwa/assets-generator\"],\n });\n\n const webPkg = vfs.readJson<PackageJson>(webPkgPath);\n if (webPkg) {\n webPkg.scripts = {\n ...webPkg.scripts,\n \"generate-pwa-assets\": \"pwa-assets-generator\",\n };\n vfs.writeJson(webPkgPath, webPkg);\n }\n }\n }\n\n // Tauri\n if (config.addons.includes(\"tauri\")) {\n const webPkgPath = \"apps/web/package.json\";\n if (vfs.exists(webPkgPath)) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n devDependencies: [\"@tauri-apps/cli\"],\n });\n\n const webPkg = vfs.readJson<PackageJson>(webPkgPath);\n if (webPkg) {\n webPkg.scripts = {\n ...webPkg.scripts,\n tauri: \"tauri\",\n \"desktop:dev\": \"tauri dev\",\n \"desktop:build\": \"tauri build\",\n };\n vfs.writeJson(webPkgPath, webPkg);\n }\n }\n }\n}\n","/**\n * API dependencies processor\n * Adds tRPC/oRPC dependencies to appropriate packages\n */\n\nimport type { ProjectConfig, Frontend, API, Backend } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency } from \"../utils/add-deps\";\n\ntype FrontendType = {\n hasReactWeb: boolean;\n hasNuxtWeb: boolean;\n hasSvelteWeb: boolean;\n hasSolidWeb: boolean;\n hasNative: boolean;\n};\n\nfunction getFrontendType(frontend: Frontend[]): FrontendType {\n return {\n hasReactWeb: frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n ),\n hasNuxtWeb: frontend.includes(\"nuxt\"),\n hasSvelteWeb: frontend.includes(\"svelte\"),\n hasSolidWeb: frontend.includes(\"solid\"),\n hasNative: frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n ),\n };\n}\n\nexport function processApiDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { api, backend, frontend } = config;\n\n if (api === \"none\") return;\n\n const frontendType = getFrontendType(frontend);\n\n // API package deps\n if (backend !== \"convex\") {\n addApiPackageDeps(vfs, api);\n }\n\n // Server deps\n addServerDeps(vfs, api, backend);\n\n // Web client deps\n addWebClientDeps(vfs, api, backend, frontendType);\n\n // Native deps\n if (frontendType.hasNative) {\n addNativeDeps(vfs, api, backend);\n }\n\n // Query deps (React Query etc)\n addQueryDeps(vfs, frontend, backend);\n}\n\nfunction addApiPackageDeps(vfs: VirtualFileSystem, api: API): void {\n const pkgPath = \"packages/api/package.json\";\n if (!vfs.exists(pkgPath)) return;\n\n if (api === \"trpc\") {\n addPackageDependency({\n vfs,\n packagePath: pkgPath,\n dependencies: [\"@trpc/server\", \"zod\"],\n });\n } else if (api === \"orpc\") {\n addPackageDependency({\n vfs,\n packagePath: pkgPath,\n dependencies: [\"@orpc/server\", \"@orpc/zod\", \"zod\"],\n });\n }\n}\n\nfunction addServerDeps(vfs: VirtualFileSystem, api: API, backend: Backend): void {\n const serverPath = \"apps/server/package.json\";\n if (!vfs.exists(serverPath)) return;\n\n if (backend === \"convex\") return;\n\n if (api === \"trpc\") {\n addPackageDependency({\n vfs,\n packagePath: serverPath,\n dependencies: [\"@trpc/server\", \"@hono/trpc-server\"],\n });\n } else if (api === \"orpc\") {\n addPackageDependency({\n vfs,\n packagePath: serverPath,\n dependencies: [\"@orpc/server\", \"@orpc/openapi\"],\n });\n }\n}\n\nfunction addWebClientDeps(\n vfs: VirtualFileSystem,\n api: API,\n backend: Backend,\n frontendType: FrontendType,\n): void {\n const webPath = \"apps/web/package.json\";\n if (!vfs.exists(webPath)) return;\n\n if (backend === \"convex\") return;\n\n // Only add tRPC deps for React-based frontends (templates handle other frameworks)\n if (api === \"trpc\" && frontendType.hasReactWeb) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"@trpc/client\", \"@trpc/tanstack-react-query\"],\n });\n } else if (api === \"orpc\" && frontendType.hasReactWeb) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"@orpc/client\", \"@orpc/tanstack-query\"],\n });\n }\n}\n\nfunction addNativeDeps(vfs: VirtualFileSystem, api: API, backend: Backend): void {\n const nativePath = \"apps/native/package.json\";\n if (!vfs.exists(nativePath)) return;\n\n if (backend === \"convex\") return;\n\n if (api === \"trpc\") {\n addPackageDependency({\n vfs,\n packagePath: nativePath,\n dependencies: [\"@trpc/client\", \"@trpc/tanstack-react-query\"],\n });\n } else if (api === \"orpc\") {\n addPackageDependency({\n vfs,\n packagePath: nativePath,\n dependencies: [\"@orpc/client\", \"@orpc/tanstack-query\"],\n });\n }\n}\n\nfunction addQueryDeps(vfs: VirtualFileSystem, frontend: Frontend[], backend: Backend): void {\n const webPath = \"apps/web/package.json\";\n const nativePath = \"apps/native/package.json\";\n\n const frontendType = getFrontendType(frontend);\n\n // React Query for React-based frontends\n if (frontendType.hasReactWeb && vfs.exists(webPath) && backend !== \"convex\") {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"@tanstack/react-query\"],\n });\n }\n\n // Native React Query\n if (frontendType.hasNative && vfs.exists(nativePath) && backend !== \"convex\") {\n addPackageDependency({\n vfs,\n packagePath: nativePath,\n dependencies: [\"@tanstack/react-query\"],\n });\n }\n}\n","/**\n * Auth dependencies processor\n * Adds authentication dependencies based on auth choice\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency } from \"../utils/add-deps\";\n\nexport function processAuthDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { auth, backend } = config;\n\n if (!auth || auth === \"none\") return;\n\n if (backend === \"convex\") {\n processConvexAuthDeps(vfs, config);\n } else {\n processStandardAuthDeps(vfs, config);\n }\n}\n\nfunction processConvexAuthDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { auth, frontend } = config;\n const webPath = \"apps/web/package.json\";\n const nativePath = \"apps/native/package.json\";\n const backendPath = \"packages/backend/package.json\";\n\n const webExists = vfs.exists(webPath);\n const nativeExists = vfs.exists(nativePath);\n const backendExists = vfs.exists(backendPath);\n\n const hasNative = frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n const hasNextJs = frontend.includes(\"next\");\n const hasTanStackStart = frontend.includes(\"tanstack-start\");\n const hasViteReact = frontend.some((f) => [\"tanstack-router\", \"react-router\"].includes(f));\n\n if (auth === \"clerk\") {\n // Clerk for Convex\n if (webExists) {\n if (hasNextJs) {\n addPackageDependency({ vfs, packagePath: webPath, dependencies: [\"@clerk/nextjs\"] });\n } else if (hasTanStackStart) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"@clerk/tanstack-react-start\", \"srvx\"],\n });\n } else if (hasViteReact) {\n addPackageDependency({ vfs, packagePath: webPath, dependencies: [\"@clerk/clerk-react\"] });\n }\n }\n if (nativeExists && hasNative) {\n addPackageDependency({ vfs, packagePath: nativePath, dependencies: [\"@clerk/clerk-expo\"] });\n }\n } else if (auth === \"better-auth\") {\n // Better Auth for Convex\n if (backendExists) {\n addPackageDependency({\n vfs,\n packagePath: backendPath,\n dependencies: [\"better-auth\", \"@convex-dev/better-auth\"],\n customDependencies: { \"better-auth\": \"1.4.9\" },\n });\n if (hasNative) {\n addPackageDependency({\n vfs,\n packagePath: backendPath,\n dependencies: [\"@better-auth/expo\"],\n customDependencies: { \"@better-auth/expo\": \"1.4.9\" },\n });\n }\n }\n\n if (webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"better-auth\", \"@convex-dev/better-auth\"],\n customDependencies: { \"better-auth\": \"1.4.9\" },\n });\n }\n\n if (nativeExists && hasNative) {\n addPackageDependency({\n vfs,\n packagePath: nativePath,\n dependencies: [\"better-auth\", \"@better-auth/expo\", \"@convex-dev/better-auth\"],\n customDependencies: { \"better-auth\": \"1.4.9\", \"@better-auth/expo\": \"1.4.9\" },\n });\n }\n }\n}\n\nfunction processStandardAuthDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { auth, frontend } = config;\n const authPath = \"packages/auth/package.json\";\n const webPath = \"apps/web/package.json\";\n const nativePath = \"apps/native/package.json\";\n\n const authExists = vfs.exists(authPath);\n const webExists = vfs.exists(webPath);\n const nativeExists = vfs.exists(nativePath);\n\n const hasNative = frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n const hasWebFrontend = frontend.some((f) =>\n [\n \"react-router\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n ].includes(f),\n );\n\n if (auth === \"better-auth\") {\n // Auth package\n if (authExists) {\n addPackageDependency({\n vfs,\n packagePath: authPath,\n dependencies: [\"better-auth\"],\n });\n\n // Native expo plugin in auth package\n if (hasNative) {\n addPackageDependency({\n vfs,\n packagePath: authPath,\n dependencies: [\"@better-auth/expo\"],\n });\n }\n }\n\n // Web client\n if (hasWebFrontend && webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"better-auth\"],\n });\n }\n\n // Native client\n if (hasNative && nativeExists) {\n addPackageDependency({\n vfs,\n packagePath: nativePath,\n dependencies: [\"better-auth\", \"@better-auth/expo\"],\n });\n }\n }\n}\n","/**\n * Backend dependencies processor\n * Adds framework-specific deps (Hono, Elysia, Express, Fastify)\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\nexport function processBackendDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { backend, runtime, api, auth } = config;\n\n // Convex backend\n if (backend === \"convex\") {\n const convexPath = \"packages/backend/package.json\";\n if (vfs.exists(convexPath)) {\n addPackageDependency({\n vfs,\n packagePath: convexPath,\n dependencies: [\"convex\"],\n });\n }\n return;\n }\n\n // Standard server backend\n const serverPath = \"apps/server/package.json\";\n if (!vfs.exists(serverPath) || backend === \"self\" || backend === \"none\") return;\n\n const deps: AvailableDependencies[] = [];\n const devDeps: AvailableDependencies[] = [];\n\n // Framework deps\n if (backend === \"hono\") {\n deps.push(\"hono\");\n if (runtime === \"node\") {\n deps.push(\"@hono/node-server\");\n }\n } else if (backend === \"elysia\") {\n deps.push(\"elysia\", \"@elysiajs/cors\");\n if (runtime === \"node\") {\n deps.push(\"@elysiajs/node\");\n }\n } else if (backend === \"express\") {\n deps.push(\"express\", \"cors\");\n devDeps.push(\"@types/express\", \"@types/cors\");\n } else if (backend === \"fastify\") {\n deps.push(\"fastify\", \"@fastify/cors\");\n }\n\n // API deps\n if (api === \"trpc\") {\n deps.push(\"@trpc/server\");\n if (backend === \"hono\") {\n deps.push(\"@hono/trpc-server\");\n } else if (backend === \"elysia\") {\n deps.push(\"@elysiajs/trpc\");\n }\n } else if (api === \"orpc\") {\n deps.push(\"@orpc/server\", \"@orpc/openapi\", \"@orpc/zod\");\n }\n\n // Auth deps\n if (auth === \"better-auth\") {\n deps.push(\"better-auth\");\n }\n\n // Runtime deps\n if (runtime === \"node\") {\n devDeps.push(\"tsx\", \"@types/node\");\n } else if (runtime === \"bun\") {\n devDeps.push(\"@types/bun\");\n }\n\n if (deps.length > 0 || devDeps.length > 0) {\n addPackageDependency({\n vfs,\n packagePath: serverPath,\n dependencies: deps,\n devDependencies: devDeps,\n });\n }\n}\n","/**\n * Database dependencies processor\n * Adds appropriate database dependencies based on ORM, database, and setup choices\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\nexport function processDatabaseDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { database, orm, backend } = config;\n\n if (backend === \"convex\" || database === \"none\") return;\n\n const dbPkgPath = \"packages/db/package.json\";\n const webPkgPath = \"apps/web/package.json\";\n\n if (!vfs.exists(dbPkgPath)) return;\n const webExists = vfs.exists(webPkgPath);\n\n if (orm === \"prisma\") {\n processPrismaDeps(vfs, config, dbPkgPath, webPkgPath, webExists);\n } else if (orm === \"drizzle\") {\n processDrizzleDeps(vfs, config, dbPkgPath, webPkgPath, webExists);\n } else if (orm === \"mongoose\") {\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n dependencies: [\"mongoose\"],\n });\n }\n}\n\nfunction processPrismaDeps(\n vfs: VirtualFileSystem,\n config: ProjectConfig,\n dbPkgPath: string,\n webPkgPath: string,\n webExists: boolean,\n): void {\n const { database, dbSetup } = config;\n\n if (database === \"mongodb\") {\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n customDependencies: { \"@prisma/client\": \"6.19.0\" },\n customDevDependencies: { prisma: \"6.19.0\" },\n });\n if (webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n customDependencies: { \"@prisma/client\": \"6.19.0\" },\n });\n }\n return;\n }\n\n const deps: AvailableDependencies[] = [\"@prisma/client\"];\n const devDeps: AvailableDependencies[] = [\"prisma\"];\n\n // Add adapters based on database type\n if (database === \"mysql\" && dbSetup === \"planetscale\") {\n deps.push(\"@prisma/adapter-planetscale\", \"@planetscale/database\");\n } else if (database === \"mysql\") {\n deps.push(\"@prisma/adapter-mariadb\");\n } else if (database === \"sqlite\") {\n deps.push(dbSetup === \"d1\" ? \"@prisma/adapter-d1\" : \"@prisma/adapter-libsql\");\n } else if (database === \"postgres\") {\n if (dbSetup === \"neon\") {\n deps.push(\"@prisma/adapter-neon\", \"@neondatabase/serverless\", \"ws\");\n devDeps.push(\"@types/ws\");\n } else {\n deps.push(\"@prisma/adapter-pg\", \"pg\");\n devDeps.push(\"@types/pg\");\n }\n }\n\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n dependencies: deps,\n devDependencies: devDeps,\n });\n\n if (webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies: [\"@prisma/client\"],\n });\n }\n}\n\nfunction processDrizzleDeps(\n vfs: VirtualFileSystem,\n config: ProjectConfig,\n dbPkgPath: string,\n webPkgPath: string,\n webExists: boolean,\n): void {\n const { database, dbSetup } = config;\n\n if (database === \"sqlite\") {\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n dependencies: [\"drizzle-orm\", \"@libsql/client\", \"libsql\"],\n devDependencies: [\"drizzle-kit\"],\n });\n if (webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies: [\"@libsql/client\", \"libsql\"],\n });\n }\n } else if (database === \"postgres\") {\n const deps: AvailableDependencies[] = [\"drizzle-orm\"];\n const devDeps: AvailableDependencies[] = [\"drizzle-kit\"];\n\n if (dbSetup === \"neon\") {\n deps.push(\"@neondatabase/serverless\", \"ws\");\n devDeps.push(\"@types/ws\");\n } else {\n deps.push(\"pg\");\n devDeps.push(\"@types/pg\");\n }\n\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n dependencies: deps,\n devDependencies: devDeps,\n });\n } else if (database === \"mysql\") {\n addPackageDependency({\n vfs,\n packagePath: dbPkgPath,\n dependencies:\n dbSetup === \"planetscale\"\n ? [\"drizzle-orm\", \"@planetscale/database\"]\n : [\"drizzle-orm\", \"mysql2\"],\n devDependencies: [\"drizzle-kit\"],\n });\n }\n}\n","/**\n * Deployment dependencies processor\n * Adds dependencies for Cloudflare and other deploy targets\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\n/**\n * Process deployment dependencies\n */\nexport function processDeployDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { webDeploy, serverDeploy, frontend, backend } = config;\n\n const isCloudflareWeb = webDeploy === \"cloudflare\";\n const isCloudflareServer = serverDeploy === \"cloudflare\";\n const isBackendSelf = backend === \"self\";\n\n if (!isCloudflareWeb && !isCloudflareServer) return;\n\n // Root level - Cloudflare workers types\n if (isCloudflareWeb || isCloudflareServer) {\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n devDependencies: [\"@cloudflare/workers-types\"],\n });\n }\n\n // Server deploy deps\n if (isCloudflareServer && !isBackendSelf) {\n const serverPkgPath = \"apps/server/package.json\";\n if (vfs.exists(serverPkgPath)) {\n addPackageDependency({\n vfs,\n packagePath: serverPkgPath,\n devDependencies: [\"alchemy\", \"wrangler\", \"@types/node\", \"@cloudflare/workers-types\"],\n });\n }\n }\n\n // Web deploy deps (framework-specific)\n if (isCloudflareWeb) {\n const webPkgPath = \"apps/web/package.json\";\n if (!vfs.exists(webPkgPath)) return;\n\n // Next.js\n if (frontend.includes(\"next\")) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies: [\"@opennextjs/cloudflare\"],\n devDependencies: [\"alchemy\", \"wrangler\", \"@cloudflare/workers-types\"],\n });\n }\n\n // Nuxt\n else if (frontend.includes(\"nuxt\")) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n devDependencies: [\"alchemy\", \"nitro-cloudflare-dev\", \"wrangler\"],\n });\n }\n\n // SvelteKit\n else if (frontend.includes(\"svelte\")) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n devDependencies: [\"alchemy\", \"@sveltejs/adapter-cloudflare\"],\n });\n }\n\n // TanStack Start\n else if (frontend.includes(\"tanstack-start\")) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n devDependencies: [\"alchemy\", \"@cloudflare/vite-plugin\", \"wrangler\"],\n });\n }\n\n // TanStack Router / React Router / Solid (Vite-based)\n else if (\n frontend.includes(\"tanstack-router\") ||\n frontend.includes(\"react-router\") ||\n frontend.includes(\"solid\")\n ) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n devDependencies: [\"alchemy\"],\n });\n }\n }\n}\n","/**\n * Environment package dependencies processor\n * Adds T3 Env deps based on frontend/backend config\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\nexport function processEnvDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const envPath = \"packages/env/package.json\";\n if (!vfs.exists(envPath)) return;\n\n const { frontend, backend, runtime } = config;\n\n const deps: AvailableDependencies[] = [\"zod\"];\n\n // Framework-specific T3 env\n if (frontend.includes(\"next\")) {\n deps.push(\"@t3-oss/env-nextjs\");\n } else if (frontend.includes(\"nuxt\")) {\n deps.push(\"@t3-oss/env-nuxt\");\n } else {\n deps.push(\"@t3-oss/env-core\");\n }\n\n // Server env for non-convex backends\n const needsServerEnv = backend !== \"convex\" && backend !== \"none\" && runtime !== \"workers\";\n if (needsServerEnv && !deps.includes(\"@t3-oss/env-core\")) {\n deps.push(\"@t3-oss/env-core\");\n }\n\n addPackageDependency({\n vfs,\n packagePath: envPath,\n dependencies: deps,\n });\n}\n","/**\n * Examples dependencies processor\n * Adds dependencies for examples: todo, ai\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\n/**\n * Process example dependencies\n */\nexport function processExamplesDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n if (!config.examples || config.examples.length === 0 || config.examples[0] === \"none\") {\n return;\n }\n\n // Todo example\n if (\n config.examples.includes(\"todo\") &&\n config.backend !== \"convex\" &&\n config.backend !== \"none\"\n ) {\n setupTodoDependencies(vfs, config);\n }\n\n // AI example\n if (config.examples.includes(\"ai\")) {\n setupAIDependencies(vfs, config);\n }\n}\n\nfunction setupTodoDependencies(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { orm, database, backend } = config;\n\n const apiPkgPath = \"packages/api/package.json\";\n if (!vfs.exists(apiPkgPath) || backend === \"none\") {\n return;\n }\n\n if (orm === \"drizzle\") {\n const dependencies: AvailableDependencies[] = [\"drizzle-orm\"];\n if (database === \"postgres\") {\n dependencies.push(\"@types/pg\");\n }\n addPackageDependency({\n vfs,\n packagePath: apiPkgPath,\n dependencies,\n });\n } else if (orm === \"prisma\") {\n addPackageDependency({\n vfs,\n packagePath: apiPkgPath,\n dependencies: [\"@prisma/client\"],\n });\n } else if (orm === \"mongoose\") {\n addPackageDependency({\n vfs,\n packagePath: apiPkgPath,\n dependencies: [\"mongoose\"],\n });\n }\n}\n\nfunction setupAIDependencies(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { frontend, backend } = config;\n\n const webPkgPath = \"apps/web/package.json\";\n const nativePkgPath = \"apps/native/package.json\";\n const serverPkgPath = \"apps/server/package.json\";\n const convexBackendPkgPath = \"packages/backend/package.json\";\n\n const webExists = vfs.exists(webPkgPath);\n const nativeExists = vfs.exists(nativePkgPath);\n const serverExists = vfs.exists(serverPkgPath);\n const convexBackendExists = vfs.exists(convexBackendPkgPath);\n\n const hasReactWeb =\n frontend.includes(\"react-router\") ||\n frontend.includes(\"tanstack-router\") ||\n frontend.includes(\"next\") ||\n frontend.includes(\"tanstack-start\");\n const hasNuxt = frontend.includes(\"nuxt\");\n const hasSvelte = frontend.includes(\"svelte\");\n const hasReactNative =\n frontend.includes(\"native-bare\") ||\n frontend.includes(\"native-uniwind\") ||\n frontend.includes(\"native-unistyles\");\n\n // Backend AI deps\n if (backend === \"convex\" && convexBackendExists) {\n addPackageDependency({\n vfs,\n packagePath: convexBackendPkgPath,\n dependencies: [\"@convex-dev/agent\"],\n customDependencies: {\n ai: \"^5.0.117\",\n \"@ai-sdk/google\": \"^2.0.52\",\n },\n });\n } else if (backend === \"self\" && webExists) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies: [\"ai\", \"@ai-sdk/google\", \"@ai-sdk/devtools\"],\n });\n } else if (serverExists && backend !== \"none\") {\n addPackageDependency({\n vfs,\n packagePath: serverPkgPath,\n dependencies: [\"ai\", \"@ai-sdk/google\", \"@ai-sdk/devtools\"],\n });\n }\n\n // Web AI deps\n if (webExists) {\n const dependencies: AvailableDependencies[] = [];\n\n if (backend === \"convex\") {\n if (hasReactWeb) {\n dependencies.push(\"@convex-dev/agent\", \"streamdown\");\n }\n } else {\n dependencies.push(\"ai\");\n if (hasNuxt) {\n dependencies.push(\"@ai-sdk/vue\");\n } else if (hasSvelte) {\n dependencies.push(\"@ai-sdk/svelte\");\n } else if (hasReactWeb) {\n dependencies.push(\"@ai-sdk/react\", \"streamdown\");\n }\n }\n\n if (dependencies.length > 0) {\n addPackageDependency({\n vfs,\n packagePath: webPkgPath,\n dependencies,\n });\n }\n }\n\n // Native AI deps\n if (nativeExists && hasReactNative) {\n if (backend === \"convex\") {\n addPackageDependency({\n vfs,\n packagePath: nativePkgPath,\n dependencies: [\"@convex-dev/agent\"],\n });\n } else {\n addPackageDependency({\n vfs,\n packagePath: nativePkgPath,\n dependencies: [\"ai\", \"@ai-sdk/react\"],\n });\n }\n }\n}\n","/**\n * Infrastructure package dependencies processor\n * Adds Alchemy deps for Cloudflare deployments\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency } from \"../utils/add-deps\";\n\nexport function processInfraDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const infraPath = \"packages/infra/package.json\";\n if (!vfs.exists(infraPath)) return;\n\n const { serverDeploy, webDeploy } = config;\n\n // Only add alchemy for Cloudflare deployments\n if (serverDeploy === \"cloudflare\" || webDeploy === \"cloudflare\") {\n addPackageDependency({\n vfs,\n packagePath: infraPath,\n devDependencies: [\"alchemy\"],\n });\n }\n}\n","/**\n * Payments dependencies processor\n * Adds Polar SDK deps based on payments config\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency } from \"../utils/add-deps\";\n\nexport function processPaymentsDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { payments, frontend } = config;\n\n if (!payments || payments === \"none\") return;\n\n const authPath = \"packages/auth/package.json\";\n const webPath = \"apps/web/package.json\";\n\n const authExists = vfs.exists(authPath);\n const webExists = vfs.exists(webPath);\n\n if (payments === \"polar\") {\n // Polar in auth package\n if (authExists) {\n addPackageDependency({\n vfs,\n packagePath: authPath,\n dependencies: [\"@polar-sh/better-auth\", \"@polar-sh/sdk\"],\n });\n }\n\n // Polar in web client\n if (webExists) {\n const hasWebFrontend = frontend.some((f) =>\n [\n \"react-router\",\n \"tanstack-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n ].includes(f),\n );\n\n if (hasWebFrontend) {\n addPackageDependency({\n vfs,\n packagePath: webPath,\n dependencies: [\"@polar-sh/better-auth\"],\n });\n }\n }\n }\n}\n","/**\n * README generator processor\n * Generates README.md content based on project configuration\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nexport function processReadme(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const content = generateReadmeContent(config);\n vfs.writeFile(\"README.md\", content);\n}\n\nfunction generateReadmeContent(options: ProjectConfig): string {\n const {\n projectName,\n packageManager,\n database,\n auth,\n addons = [],\n orm = \"drizzle\",\n runtime = \"bun\",\n frontend = [\"tanstack-router\"],\n backend = \"hono\",\n api = \"trpc\",\n webDeploy,\n serverDeploy,\n dbSetup,\n } = options;\n\n const isConvex = backend === \"convex\";\n const hasReactRouter = frontend.includes(\"react-router\");\n const hasNative = frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n const hasSvelte = frontend.includes(\"svelte\");\n const packageManagerRunCmd = `${packageManager} run`;\n const webPort = hasReactRouter || hasSvelte ? \"5173\" : \"3001\";\n\n const stackDescription = generateStackDescription(frontend, backend, api, isConvex);\n\n return `# ${projectName}\n\nThis project was created with [Better-T-Stack](https://github.com/AmanVarshney01/create-better-t-stack), a modern TypeScript stack${\n stackDescription ? ` that combines ${stackDescription}` : \"\"\n }.\n\n## Features\n\n${generateFeaturesList(database, auth, addons, orm, runtime, frontend, backend, api)}\n\n## Getting Started\n\nFirst, install the dependencies:\n\n\\`\\`\\`bash\n${packageManager} install\n\\`\\`\\`\n${\n isConvex\n ? `\n## Convex Setup\n\nThis project uses Convex as a backend. You'll need to set up Convex before running the app:\n\n\\`\\`\\`bash\n${packageManagerRunCmd} dev:setup\n\\`\\`\\`\n\nFollow the prompts to create a new Convex project and connect it to your application.${\n auth === \"clerk\"\n ? \" See [Convex + Clerk guide](https://docs.convex.dev/auth/clerk) for auth setup.\"\n : \"\"\n }`\n : generateDatabaseSetup(database, packageManagerRunCmd, orm, dbSetup, backend)\n}\n\nThen, run the development server:\n\n\\`\\`\\`bash\n${packageManagerRunCmd} dev\n\\`\\`\\`\n\n${generateRunningInstructions(frontend, backend, webPort, hasNative, isConvex)}\n${\n addons.includes(\"pwa\") && hasReactRouter\n ? \"\\n## PWA Support with React Router v7\\n\\nThere is a known compatibility issue between VitePWA and React Router v7.\\nSee: https://github.com/vite-pwa/vite-plugin-pwa/issues/809\\n\"\n : \"\"\n}\n${generateDeploymentCommands(packageManagerRunCmd, webDeploy, serverDeploy)}\n\n## Project Structure\n\n\\`\\`\\`\n${generateProjectStructure(projectName, frontend, backend, addons, isConvex, api, auth)}\n\\`\\`\\`\n\n## Available Scripts\n\n${generateScriptsList(packageManagerRunCmd, database, orm, hasNative, addons, backend, dbSetup)}\n`;\n}\n\nfunction generateStackDescription(\n frontend: ProjectConfig[\"frontend\"],\n backend: ProjectConfig[\"backend\"],\n api: ProjectConfig[\"api\"],\n isConvex: boolean,\n): string {\n const parts: string[] = [];\n\n const frontendMap: Record<string, string> = {\n \"tanstack-router\": \"React, TanStack Router\",\n \"react-router\": \"React, React Router\",\n next: \"Next.js\",\n \"tanstack-start\": \"React, TanStack Start\",\n svelte: \"SvelteKit\",\n nuxt: \"Nuxt\",\n solid: \"SolidJS\",\n };\n\n for (const fe of frontend) {\n if (frontendMap[fe]) {\n parts.push(frontendMap[fe]);\n break;\n }\n }\n\n if (backend !== \"none\") {\n parts.push(backend[0].toUpperCase() + backend.slice(1));\n }\n\n if (!isConvex && api !== \"none\") {\n parts.push(api.toUpperCase());\n }\n\n return parts.length > 0 ? `${parts.join(\", \")}, and more` : \"\";\n}\n\nfunction generateRunningInstructions(\n frontend: ProjectConfig[\"frontend\"],\n backend: ProjectConfig[\"backend\"],\n webPort: string,\n hasNative: boolean,\n isConvex: boolean,\n): string {\n const instructions: string[] = [];\n const hasFrontend = frontend.length > 0 && !frontend.includes(\"none\");\n const isBackendSelf = backend === \"self\";\n\n if (hasFrontend) {\n const desc = isBackendSelf ? \"fullstack application\" : \"web application\";\n instructions.push(\n `Open [http://localhost:${webPort}](http://localhost:${webPort}) in your browser to see the ${desc}.`,\n );\n }\n\n if (hasNative) {\n instructions.push(\"Use the Expo Go app to run the mobile application.\");\n }\n\n if (isConvex) {\n instructions.push(\"Your app will connect to the Convex cloud backend automatically.\");\n } else if (backend !== \"none\" && !isBackendSelf) {\n instructions.push(\"The API is running at [http://localhost:3000](http://localhost:3000).\");\n }\n\n return instructions.join(\"\\n\");\n}\n\nfunction generateProjectStructure(\n projectName: string,\n frontend: ProjectConfig[\"frontend\"],\n backend: ProjectConfig[\"backend\"],\n addons: ProjectConfig[\"addons\"],\n isConvex: boolean,\n api: ProjectConfig[\"api\"],\n auth: ProjectConfig[\"auth\"],\n): string {\n const structure: string[] = [`${projectName}/`, \"├── apps/\"];\n const hasFrontend = frontend.length > 0 && !frontend.includes(\"none\");\n const isBackendSelf = backend === \"self\";\n const hasNative = frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n\n // Web app\n if (hasFrontend) {\n const frontendTypes: Record<string, string> = {\n \"tanstack-router\": \"React + TanStack Router\",\n \"react-router\": \"React + React Router\",\n next: \"Next.js\",\n \"tanstack-start\": \"React + TanStack Start\",\n svelte: \"SvelteKit\",\n nuxt: \"Nuxt\",\n solid: \"SolidJS\",\n };\n const frontendType = frontend.find((f) => frontendTypes[f])\n ? frontendTypes[frontend.find((f) => frontendTypes[f]) || \"\"]\n : \"\";\n\n const prefix = isBackendSelf ? \"└──\" : \"├──\";\n const desc = isBackendSelf ? \"Fullstack application\" : \"Frontend application\";\n structure.push(`│ ${prefix} web/ # ${desc} (${frontendType})`);\n }\n\n // Native app\n if (hasNative) {\n structure.push(\"│ ├── native/ # Mobile application (React Native, Expo)\");\n }\n\n // Docs\n if (addons.includes(\"starlight\")) {\n structure.push(\"│ ├── docs/ # Documentation site (Astro Starlight)\");\n }\n\n // Server\n if (!isBackendSelf && backend !== \"none\" && !isConvex) {\n const backendName = backend[0].toUpperCase() + backend.slice(1);\n const apiName = api !== \"none\" ? api.toUpperCase() : \"\";\n const desc = apiName ? `${backendName}, ${apiName}` : backendName;\n structure.push(`│ └── server/ # Backend API (${desc})`);\n }\n\n // Packages\n if (isConvex || backend !== \"none\") {\n structure.push(\"├── packages/\");\n\n if (isConvex) {\n structure.push(\"│ ├── backend/ # Convex backend functions and schema\");\n if (auth === \"clerk\") {\n structure.push(\n \"│ │ ├── convex/ # Convex functions and schema\",\n \"│ │ └── .env.local # Convex environment variables\",\n );\n }\n }\n\n if (!isConvex) {\n structure.push(\"│ ├── api/ # API layer / business logic\");\n if (auth !== \"none\") {\n structure.push(\"│ ├── auth/ # Authentication configuration & logic\");\n }\n if (api !== \"none\" || auth !== \"none\") {\n structure.push(\"│ └── db/ # Database schema & queries\");\n }\n }\n }\n\n return structure.join(\"\\n\");\n}\n\nfunction generateFeaturesList(\n database: ProjectConfig[\"database\"],\n auth: ProjectConfig[\"auth\"],\n addons: ProjectConfig[\"addons\"],\n orm: ProjectConfig[\"orm\"],\n runtime: ProjectConfig[\"runtime\"],\n frontend: ProjectConfig[\"frontend\"],\n backend: ProjectConfig[\"backend\"],\n api: ProjectConfig[\"api\"],\n): string {\n const isConvex = backend === \"convex\";\n const hasNative = frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n const hasFrontend = frontend.length > 0 && !frontend.includes(\"none\");\n\n const features = [\"- **TypeScript** - For type safety and improved developer experience\"];\n\n // Frontend frameworks\n const frontendFeatures: Record<string, string> = {\n \"tanstack-router\": \"- **TanStack Router** - File-based routing with full type safety\",\n \"react-router\": \"- **React Router** - Declarative routing for React\",\n next: \"- **Next.js** - Full-stack React framework\",\n \"tanstack-start\": \"- **TanStack Start** - SSR framework with TanStack Router\",\n svelte: \"- **SvelteKit** - Web framework for building Svelte apps\",\n nuxt: \"- **Nuxt** - The Intuitive Vue Framework\",\n solid: \"- **SolidJS** - Simple and performant reactivity\",\n };\n\n for (const fe of frontend) {\n if (frontendFeatures[fe]) {\n features.push(frontendFeatures[fe]);\n break;\n }\n }\n\n if (hasNative) {\n features.push(\n \"- **React Native** - Build mobile apps using React\",\n \"- **Expo** - Tools for React Native development\",\n );\n }\n\n if (hasFrontend) {\n features.push(\n \"- **TailwindCSS** - Utility-first CSS for rapid UI development\",\n \"- **shadcn/ui** - Reusable UI components\",\n );\n }\n\n // Backend\n const backendFeatures: Record<string, string> = {\n convex: \"- **Convex** - Reactive backend-as-a-service platform\",\n hono: \"- **Hono** - Lightweight, performant server framework\",\n express: \"- **Express** - Fast, unopinionated web framework\",\n fastify: \"- **Fastify** - Fast, low-overhead web framework\",\n elysia: \"- **Elysia** - Type-safe, high-performance framework\",\n };\n\n if (backendFeatures[backend]) {\n features.push(backendFeatures[backend]);\n }\n\n // API\n if (!isConvex && api === \"trpc\") {\n features.push(\"- **tRPC** - End-to-end type-safe APIs\");\n } else if (!isConvex && api === \"orpc\") {\n features.push(\"- **oRPC** - End-to-end type-safe APIs with OpenAPI integration\");\n }\n\n // Runtime\n if (!isConvex && backend !== \"none\" && runtime !== \"none\") {\n const runtimeName = runtime === \"bun\" ? \"Bun\" : runtime === \"node\" ? \"Node.js\" : runtime;\n features.push(`- **${runtimeName}** - Runtime environment`);\n }\n\n // Database\n if (database !== \"none\" && !isConvex) {\n const ormNames: Record<string, string> = {\n drizzle: \"Drizzle\",\n prisma: \"Prisma\",\n mongoose: \"Mongoose\",\n };\n const dbNames: Record<string, string> = {\n sqlite: \"SQLite/Turso\",\n postgres: \"PostgreSQL\",\n mysql: \"MySQL\",\n mongodb: \"MongoDB\",\n };\n features.push(\n `- **${ormNames[orm] || \"ORM\"}** - TypeScript-first ORM`,\n `- **${dbNames[database] || \"Database\"}** - Database engine`,\n );\n }\n\n // Auth\n if (auth !== \"none\") {\n const authLabel = auth === \"clerk\" ? \"Clerk\" : \"Better-Auth\";\n features.push(`- **Authentication** - ${authLabel}`);\n }\n\n // Addons\n const addonFeatures: Record<string, string> = {\n pwa: \"- **PWA** - Progressive Web App support\",\n tauri: \"- **Tauri** - Build native desktop applications\",\n biome: \"- **Biome** - Linting and formatting\",\n oxlint: \"- **Oxlint** - Oxlint + Oxfmt (linting & formatting)\",\n husky: \"- **Husky** - Git hooks for code quality\",\n starlight: \"- **Starlight** - Documentation site with Astro\",\n turborepo: \"- **Turborepo** - Optimized monorepo build system\",\n };\n\n for (const addon of addons) {\n if (addonFeatures[addon]) {\n features.push(addonFeatures[addon]);\n }\n }\n\n return features.join(\"\\n\");\n}\n\nfunction generateDatabaseSetup(\n database: ProjectConfig[\"database\"],\n packageManagerRunCmd: string,\n orm: ProjectConfig[\"orm\"],\n dbSetup: ProjectConfig[\"dbSetup\"],\n backend: ProjectConfig[\"backend\"],\n): string {\n if (database === \"none\") return \"\";\n\n const isBackendSelf = backend === \"self\";\n const envPath = isBackendSelf ? \"apps/web/.env\" : \"apps/server/.env\";\n const ormDesc =\n orm === \"drizzle\" ? \" with Drizzle ORM\" : orm === \"prisma\" ? \" with Prisma\" : ` with ${orm}`;\n\n let setup = \"## Database Setup\\n\\n\";\n\n const dbDescriptions: Record<string, string> = {\n sqlite: `This project uses SQLite${ormDesc}.\n\n1. Start the local SQLite database (optional):\n${\n dbSetup === \"d1\"\n ? \"D1 local development and migrations are handled automatically by Alchemy during dev and deploy.\"\n : `\\`\\`\\`bash\n${packageManagerRunCmd} db:local\n\\`\\`\\``\n}\n\n2. Update your \\`.env\\` file in the \\`${isBackendSelf ? \"apps/web\" : \"apps/server\"}\\` directory with the appropriate connection details if needed.`,\n\n postgres: `This project uses PostgreSQL${ormDesc}.\n\n1. Make sure you have a PostgreSQL database set up.\n2. Update your \\`${envPath}\\` file with your PostgreSQL connection details.`,\n\n mysql: `This project uses MySQL${ormDesc}.\n\n1. Make sure you have a MySQL database set up.\n2. Update your \\`${envPath}\\` file with your MySQL connection details.`,\n\n mongodb: `This project uses MongoDB ${ormDesc.replace(\" with \", \"with \")}.\n\n1. Make sure you have MongoDB set up.\n2. Update your \\`${envPath}\\` file with your MongoDB connection URI.`,\n };\n\n setup += dbDescriptions[database] || \"\";\n\n setup += `\n\n3. Apply the schema to your database:\n\\`\\`\\`bash\n${packageManagerRunCmd} db:push\n\\`\\`\\`\n`;\n\n return setup;\n}\n\nfunction generateScriptsList(\n packageManagerRunCmd: string,\n database: ProjectConfig[\"database\"],\n orm: ProjectConfig[\"orm\"],\n hasNative: boolean,\n addons: ProjectConfig[\"addons\"],\n backend: ProjectConfig[\"backend\"],\n dbSetup: ProjectConfig[\"dbSetup\"],\n): string {\n const isConvex = backend === \"convex\";\n const isBackendSelf = backend === \"self\";\n\n let scripts = `- \\`${packageManagerRunCmd} dev\\`: Start all applications in development mode\n- \\`${packageManagerRunCmd} build\\`: Build all applications`;\n\n if (!isBackendSelf) {\n scripts += `\\n- \\`${packageManagerRunCmd} dev:web\\`: Start only the web application`;\n }\n\n if (isConvex) {\n scripts += `\\n- \\`${packageManagerRunCmd} dev:setup\\`: Setup and configure your Convex project`;\n } else if (backend !== \"none\" && !isBackendSelf) {\n scripts += `\\n- \\`${packageManagerRunCmd} dev:server\\`: Start only the server`;\n }\n\n scripts += `\\n- \\`${packageManagerRunCmd} check-types\\`: Check TypeScript types across all apps`;\n\n if (hasNative) {\n scripts += `\\n- \\`${packageManagerRunCmd} dev:native\\`: Start the React Native/Expo development server`;\n }\n\n if (database !== \"none\" && !isConvex) {\n scripts += `\\n- \\`${packageManagerRunCmd} db:push\\`: Push schema changes to database\n- \\`${packageManagerRunCmd} db:studio\\`: Open database studio UI`;\n\n if (database === \"sqlite\" && dbSetup !== \"d1\") {\n scripts += `\\n- \\`${packageManagerRunCmd} db:local\\`: Start the local SQLite database`;\n }\n }\n\n if (addons.includes(\"biome\")) {\n scripts += `\\n- \\`${packageManagerRunCmd} check\\`: Run Biome formatting and linting`;\n }\n\n if (addons.includes(\"oxlint\")) {\n scripts += `\\n- \\`${packageManagerRunCmd} check\\`: Run Oxlint and Oxfmt`;\n }\n\n if (addons.includes(\"pwa\")) {\n scripts += `\\n- \\`cd apps/web && ${packageManagerRunCmd} generate-pwa-assets\\`: Generate PWA assets`;\n }\n\n if (addons.includes(\"tauri\")) {\n scripts += `\\n- \\`cd apps/web && ${packageManagerRunCmd} desktop:dev\\`: Start Tauri desktop app in development\n- \\`cd apps/web && ${packageManagerRunCmd} desktop:build\\`: Build Tauri desktop app`;\n }\n\n if (addons.includes(\"starlight\")) {\n scripts += `\\n- \\`cd apps/docs && ${packageManagerRunCmd} dev\\`: Start documentation site\n- \\`cd apps/docs && ${packageManagerRunCmd} build\\`: Build documentation site`;\n }\n\n return scripts;\n}\n\nfunction generateDeploymentCommands(\n packageManagerRunCmd: string,\n webDeploy: ProjectConfig[\"webDeploy\"],\n serverDeploy: ProjectConfig[\"serverDeploy\"],\n): string {\n if (webDeploy !== \"cloudflare\" && serverDeploy !== \"cloudflare\") {\n return \"\";\n }\n\n const lines: string[] = [\"## Deployment (Cloudflare via Alchemy)\"];\n\n if (webDeploy === \"cloudflare\" && serverDeploy !== \"cloudflare\") {\n lines.push(\n `- Web dev: cd apps/web && ${packageManagerRunCmd} dev`,\n `- Web deploy: cd apps/web && ${packageManagerRunCmd} deploy`,\n `- Web destroy: cd apps/web && ${packageManagerRunCmd} destroy`,\n );\n }\n\n if (serverDeploy === \"cloudflare\" && webDeploy !== \"cloudflare\") {\n lines.push(\n `- Server dev: cd apps/server && ${packageManagerRunCmd} dev`,\n `- Server deploy: cd apps/server && ${packageManagerRunCmd} deploy`,\n `- Server destroy: cd apps/server && ${packageManagerRunCmd} destroy`,\n );\n }\n\n if (webDeploy === \"cloudflare\" && serverDeploy === \"cloudflare\") {\n lines.push(\n `- Dev: ${packageManagerRunCmd} dev`,\n `- Deploy: ${packageManagerRunCmd} deploy`,\n `- Destroy: ${packageManagerRunCmd} destroy`,\n );\n }\n\n lines.push(\n \"\",\n \"For more details, see the guide on [Deploying to Cloudflare with Alchemy](https://www.better-t-stack.dev/docs/guides/cloudflare-alchemy).\",\n );\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n","/**\n * Runtime dependencies processor\n * Adds runtime-specific deps and scripts\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency } from \"../utils/add-deps\";\n\ntype PackageJson = {\n scripts?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport function processRuntimeDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const { runtime, backend } = config;\n\n if (backend === \"convex\" || backend === \"self\" || runtime === \"none\") return;\n\n const serverPath = \"apps/server/package.json\";\n if (!vfs.exists(serverPath)) return;\n\n const pkgJson = vfs.readJson<PackageJson>(serverPath);\n if (!pkgJson) return;\n\n pkgJson.scripts = pkgJson.scripts || {};\n\n if (runtime === \"bun\") {\n pkgJson.scripts.dev = \"bun run --hot src/index.ts\";\n pkgJson.scripts.start = \"bun run dist/index.js\";\n\n addPackageDependency({\n vfs,\n packagePath: serverPath,\n devDependencies: [\"@types/bun\"],\n });\n } else if (runtime === \"node\") {\n pkgJson.scripts.dev = \"tsx watch src/index.ts\";\n pkgJson.scripts.start = \"node dist/index.js\";\n\n addPackageDependency({\n vfs,\n packagePath: serverPath,\n devDependencies: [\"tsx\", \"@types/node\"],\n });\n }\n\n vfs.writeJson(serverPath, pkgJson);\n}\n","/**\n * Workspace dependencies processor\n * Adds cross-package workspace dependencies\n */\n\nimport type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { addPackageDependency, type AvailableDependencies } from \"../utils/add-deps\";\n\nexport function processWorkspaceDeps(vfs: VirtualFileSystem, config: ProjectConfig): void {\n const {\n projectName,\n packageManager,\n runtime,\n backend,\n database,\n auth,\n api,\n serverDeploy,\n webDeploy,\n } = config;\n\n const workspaceVersion = packageManager === \"npm\" ? \"*\" : \"workspace:*\";\n\n // Detect which packages exist\n const packages = {\n config: vfs.exists(\"packages/config/package.json\"),\n env: vfs.exists(\"packages/env/package.json\"),\n infra: vfs.exists(\"packages/infra/package.json\"),\n db: vfs.exists(\"packages/db/package.json\"),\n auth: vfs.exists(\"packages/auth/package.json\"),\n api: vfs.exists(\"packages/api/package.json\"),\n backend: vfs.exists(\"packages/backend/package.json\"),\n server: vfs.exists(\"apps/server/package.json\"),\n web: vfs.exists(\"apps/web/package.json\"),\n native: vfs.exists(\"apps/native/package.json\"),\n };\n\n const configDep = packages.config ? { [`@${projectName}/config`]: workspaceVersion } : {};\n const envDep = packages.env ? { [`@${projectName}/env`]: workspaceVersion } : {};\n\n const isCloudflare = serverDeploy === \"cloudflare\" || webDeploy === \"cloudflare\";\n const runtimeDevDeps = getRuntimeDevDeps(runtime, backend);\n const commonDeps: AvailableDependencies[] = [\"dotenv\", \"zod\"];\n const commonDevDeps: AvailableDependencies[] = [\"typescript\", ...runtimeDevDeps];\n\n // Root package\n addPackageDependency({\n vfs,\n packagePath: \"package.json\",\n dependencies: commonDeps,\n devDependencies: commonDevDeps,\n customDependencies: envDep,\n customDevDependencies: configDep,\n });\n\n // Env package\n if (packages.env) {\n const envDevDeps: Record<string, string> = { ...configDep };\n if (isCloudflare && packages.infra) {\n envDevDeps[`@${projectName}/infra`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"packages/env/package.json\",\n dependencies: commonDeps,\n devDependencies: commonDevDeps,\n customDevDependencies: envDevDeps,\n });\n }\n\n // Infra package\n if (packages.infra) {\n addPackageDependency({\n vfs,\n packagePath: \"packages/infra/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDevDependencies: configDep,\n });\n }\n\n // DB package\n if (packages.db) {\n addPackageDependency({\n vfs,\n packagePath: \"packages/db/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDependencies: envDep,\n customDevDependencies: configDep,\n });\n }\n\n // Auth package\n if (packages.auth) {\n const authDeps: Record<string, string> = { ...envDep };\n if (database !== \"none\" && packages.db) {\n authDeps[`@${projectName}/db`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"packages/auth/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDependencies: authDeps,\n customDevDependencies: configDep,\n });\n }\n\n // API package\n if (packages.api) {\n const apiPackageDeps: Record<string, string> = { ...envDep };\n if (auth !== \"none\" && packages.auth) {\n apiPackageDeps[`@${projectName}/auth`] = workspaceVersion;\n }\n if (database !== \"none\" && packages.db) {\n apiPackageDeps[`@${projectName}/db`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"packages/api/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDependencies: apiPackageDeps,\n customDevDependencies: configDep,\n });\n }\n\n // Backend package (Convex)\n if (packages.backend) {\n addPackageDependency({\n vfs,\n packagePath: \"packages/backend/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDevDependencies: configDep,\n });\n }\n\n // Server app\n if (packages.server) {\n const serverDeps: Record<string, string> = { ...envDep };\n if (api !== \"none\" && packages.api) {\n serverDeps[`@${projectName}/api`] = workspaceVersion;\n }\n if (auth !== \"none\" && packages.auth) {\n serverDeps[`@${projectName}/auth`] = workspaceVersion;\n }\n if (database !== \"none\" && packages.db) {\n serverDeps[`@${projectName}/db`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"apps/server/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\", \"tsdown\"],\n customDependencies: serverDeps,\n customDevDependencies: configDep,\n });\n }\n\n // Web app\n if (packages.web) {\n const webPackageDeps: Record<string, string> = { ...envDep };\n if (api !== \"none\" && packages.api) {\n webPackageDeps[`@${projectName}/api`] = workspaceVersion;\n }\n if (auth !== \"none\" && packages.auth) {\n webPackageDeps[`@${projectName}/auth`] = workspaceVersion;\n }\n if (backend === \"convex\" && packages.backend) {\n webPackageDeps[`@${projectName}/backend`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"apps/web/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDependencies: webPackageDeps,\n customDevDependencies: configDep,\n });\n }\n\n // Native app\n if (packages.native) {\n const nativeDeps: Record<string, string> = { ...envDep };\n if (api !== \"none\" && packages.api) {\n nativeDeps[`@${projectName}/api`] = workspaceVersion;\n }\n if (backend === \"convex\" && packages.backend) {\n nativeDeps[`@${projectName}/backend`] = workspaceVersion;\n }\n addPackageDependency({\n vfs,\n packagePath: \"apps/native/package.json\",\n dependencies: commonDeps,\n devDependencies: [\"typescript\"],\n customDependencies: nativeDeps,\n customDevDependencies: configDep,\n });\n }\n}\n\nfunction getRuntimeDevDeps(\n runtime: ProjectConfig[\"runtime\"],\n backend: ProjectConfig[\"backend\"],\n): AvailableDependencies[] {\n if (runtime === \"none\" && backend === \"self\") {\n return [\"@types/node\"];\n }\n if (runtime === \"node\" || runtime === \"workers\") {\n return [\"@types/node\"];\n }\n if (runtime === \"bun\") {\n return [\"@types/bun\"];\n }\n return [];\n}\n","import type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { VirtualFileSystem } from \"../core/virtual-fs\";\n\nimport { processAddonsDeps } from \"./addons-deps\";\nimport { processApiDeps } from \"./api-deps\";\nimport { processAuthDeps } from \"./auth-deps\";\nimport { processBackendDeps } from \"./backend-deps\";\nimport { processDatabaseDeps } from \"./db-deps\";\nimport { processDeployDeps } from \"./deploy-deps\";\nimport { processEnvDeps } from \"./env-deps\";\nimport { processExamplesDeps } from \"./examples-deps\";\nimport { processInfraDeps } from \"./infra-deps\";\nimport { processPaymentsDeps } from \"./payments-deps\";\nimport { processReadme } from \"./readme-generator\";\nimport { processRuntimeDeps } from \"./runtime-deps\";\nimport { processWorkspaceDeps } from \"./workspace-deps\";\n\nexport function processDependencies(vfs: VirtualFileSystem, config: ProjectConfig): void {\n processWorkspaceDeps(vfs, config);\n processEnvDeps(vfs, config);\n processInfraDeps(vfs, config);\n processDatabaseDeps(vfs, config);\n processBackendDeps(vfs, config);\n processRuntimeDeps(vfs, config);\n processApiDeps(vfs, config);\n processAuthDeps(vfs, config);\n processPaymentsDeps(vfs, config);\n processDeployDeps(vfs, config);\n processAddonsDeps(vfs, config);\n processExamplesDeps(vfs, config);\n}\n\nexport {\n processAddonsDeps,\n processApiDeps,\n processAuthDeps,\n processBackendDeps,\n processDatabaseDeps,\n processDeployDeps,\n processEnvDeps,\n processExamplesDeps,\n processInfraDeps,\n processPaymentsDeps,\n processReadme,\n processRuntimeDeps,\n processWorkspaceDeps,\n};\n","import type { ProjectConfig } from \"@better-t-stack/types\";\n\nimport type { GeneratorOptions, GeneratorResult, VirtualFileTree } from \"./types\";\n\nimport { processTemplateString, transformFilename, isBinaryFile } from \"./core/template-processor\";\nimport { VirtualFileSystem } from \"./core/virtual-fs\";\nimport { processPostGeneration } from \"./post-process\";\nimport { processDependencies, processReadme } from \"./processors\";\n\nexport type TemplateData = Map<string, string>;\nexport async function generateVirtualProject(options: GeneratorOptions): Promise<GeneratorResult> {\n try {\n const { config, templates } = options;\n\n if (!templates || templates.size === 0) {\n return {\n success: false,\n error: \"No templates provided. Templates must be passed via the templates option.\",\n };\n }\n\n const vfs = new VirtualFileSystem();\n\n // Phase 1: Process templates based on configuration\n await processBaseTemplate(vfs, templates, config);\n await processFrontendTemplates(vfs, templates, config);\n await processBackendTemplates(vfs, templates, config);\n await processDbTemplates(vfs, templates, config);\n await processApiTemplates(vfs, templates, config);\n await processConfigPackage(vfs, templates, config);\n await processEnvPackage(vfs, templates, config);\n await processAuthTemplates(vfs, templates, config);\n await processPaymentsTemplates(vfs, templates, config);\n await processAddonTemplates(vfs, templates, config);\n await processExampleTemplates(vfs, templates, config);\n await processExtrasTemplates(vfs, templates, config);\n await processDeployTemplates(vfs, templates, config);\n\n // Phase 2: Post-process package.json (scripts, naming, catalogs)\n processPostGeneration(vfs, config);\n\n // Phase 3: Add dependencies to all packages\n processDependencies(vfs, config);\n\n // Phase 4: Generate README.md\n processReadme(vfs, config);\n\n const tree: VirtualFileTree = {\n root: vfs.toTree(config.projectName),\n fileCount: vfs.getFileCount(),\n directoryCount: vfs.getDirectoryCount(),\n config,\n };\n\n return { success: true, tree };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction hasTemplatesWithPrefix(templates: TemplateData, prefix: string): boolean {\n const normalizedPrefix = prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n for (const path of templates.keys()) {\n if (path.startsWith(normalizedPrefix)) return true;\n }\n return false;\n}\n\nfunction processTemplatesFromPrefix(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n prefix: string,\n destPrefix: string,\n config: ProjectConfig,\n): void {\n const normalizedPrefix = prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n\n for (const [templatePath, content] of templates) {\n if (!templatePath.startsWith(normalizedPrefix)) continue;\n\n // Get relative path from prefix\n const relativePath = templatePath.slice(normalizedPrefix.length);\n\n // Transform filename (remove .hbs, convert _gitignore, etc.)\n const outputPath = transformFilename(relativePath);\n const destPath = destPrefix ? `${destPrefix}/${outputPath}` : outputPath;\n\n // Process content\n let processedContent: string;\n if (isBinaryFile(templatePath)) {\n processedContent = \"[Binary file]\";\n } else if (templatePath.endsWith(\".hbs\")) {\n processedContent = processTemplateString(content, config);\n } else {\n processedContent = content;\n }\n\n vfs.writeFile(destPath, processedContent);\n }\n}\n\nasync function processBaseTemplate(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n processTemplatesFromPrefix(vfs, templates, \"base\", \"\", config);\n}\n\nasync function processFrontendTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n const hasReactWeb = config.frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n const hasNuxtWeb = config.frontend.includes(\"nuxt\");\n const hasSvelteWeb = config.frontend.includes(\"svelte\");\n const hasSolidWeb = config.frontend.includes(\"solid\");\n const hasNativeBare = config.frontend.includes(\"native-bare\");\n const hasNativeUniwind = config.frontend.includes(\"native-uniwind\");\n const hasUnistyles = config.frontend.includes(\"native-unistyles\");\n const isConvex = config.backend === \"convex\";\n\n // Web frontend\n if (hasReactWeb || hasNuxtWeb || hasSvelteWeb || hasSolidWeb) {\n if (hasReactWeb) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/react/web-base\", \"apps/web\", config);\n\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `frontend/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n } else if (hasNuxtWeb) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/nuxt\", \"apps/web\", config);\n } else if (hasSvelteWeb) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/svelte\", \"apps/web\", config);\n } else if (hasSolidWeb) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/solid\", \"apps/web\", config);\n }\n }\n\n // Native frontend\n if (hasNativeBare || hasNativeUniwind || hasUnistyles) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/native/base\", \"apps/native\", config);\n\n if (hasNativeBare) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/native/bare\", \"apps/native\", config);\n } else if (hasNativeUniwind) {\n processTemplatesFromPrefix(vfs, templates, \"frontend/native/uniwind\", \"apps/native\", config);\n } else if (hasUnistyles) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"frontend/native/unistyles\",\n \"apps/native\",\n config,\n );\n }\n\n // Native API integration\n if (!isConvex && (config.api === \"trpc\" || config.api === \"orpc\")) {\n processTemplatesFromPrefix(vfs, templates, `api/${config.api}/native`, \"apps/native\", config);\n }\n }\n}\n\nasync function processBackendTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (config.backend === \"none\") return;\n\n if (config.backend === \"convex\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"backend/convex/packages/backend\",\n \"packages/backend\",\n config,\n );\n return;\n }\n\n if (config.backend === \"self\") {\n // Fullstack mode - no separate server app\n return;\n }\n\n // Standalone server\n processTemplatesFromPrefix(vfs, templates, \"backend/server/base\", \"apps/server\", config);\n processTemplatesFromPrefix(\n vfs,\n templates,\n `backend/server/${config.backend}`,\n \"apps/server\",\n config,\n );\n}\n\nasync function processDbTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (config.database === \"none\" || config.orm === \"none\") return;\n if (config.backend === \"convex\") return;\n\n processTemplatesFromPrefix(vfs, templates, \"db/base\", \"packages/db\", config);\n processTemplatesFromPrefix(vfs, templates, `db/${config.orm}/base`, \"packages/db\", config);\n processTemplatesFromPrefix(\n vfs,\n templates,\n `db/${config.orm}/${config.database}`,\n \"packages/db\",\n config,\n );\n}\n\n// API Templates\n\nasync function processApiTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (config.api === \"none\") return;\n if (config.backend === \"convex\") return;\n\n // API server package\n processTemplatesFromPrefix(vfs, templates, `api/${config.api}/server`, \"packages/api\", config);\n\n const hasReactWeb = config.frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n const hasNuxtWeb = config.frontend.includes(\"nuxt\");\n const hasSvelteWeb = config.frontend.includes(\"svelte\");\n const hasSolidWeb = config.frontend.includes(\"solid\");\n\n // Web API integration\n if (hasReactWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `api/${config.api}/web/react/base`,\n \"apps/web\",\n config,\n );\n\n // Fullstack mode\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (\n config.backend === \"self\" &&\n (reactFramework === \"next\" || reactFramework === \"tanstack-start\")\n ) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `api/${config.api}/fullstack/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n } else if (hasNuxtWeb && config.api === \"orpc\") {\n processTemplatesFromPrefix(vfs, templates, `api/${config.api}/web/nuxt`, \"apps/web\", config);\n } else if (hasSvelteWeb && config.api === \"orpc\") {\n processTemplatesFromPrefix(vfs, templates, `api/${config.api}/web/svelte`, \"apps/web\", config);\n } else if (hasSolidWeb && config.api === \"orpc\") {\n processTemplatesFromPrefix(vfs, templates, `api/${config.api}/web/solid`, \"apps/web\", config);\n }\n}\n\nasync function processConfigPackage(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n processTemplatesFromPrefix(vfs, templates, \"packages/config\", \"packages/config\", config);\n}\n\nasync function processEnvPackage(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n const hasWebFrontend = config.frontend.some((f) =>\n [\n \"tanstack-router\",\n \"react-router\",\n \"tanstack-start\",\n \"next\",\n \"nuxt\",\n \"svelte\",\n \"solid\",\n ].includes(f),\n );\n const hasNative = config.frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n\n if (!hasWebFrontend && !hasNative && config.backend === \"none\") {\n return;\n }\n\n // Copy base env package files\n processTemplatesFromPrefix(vfs, templates, \"packages/env\", \"packages/env\", config);\n}\n\nasync function processAuthTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (!config.auth || config.auth === \"none\") return;\n\n const hasReactWeb = config.frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n const hasNuxtWeb = config.frontend.includes(\"nuxt\");\n const hasSvelteWeb = config.frontend.includes(\"svelte\");\n const hasSolidWeb = config.frontend.includes(\"solid\");\n const hasNativeBare = config.frontend.includes(\"native-bare\");\n const hasUniwind = config.frontend.includes(\"native-uniwind\");\n const hasUnistyles = config.frontend.includes(\"native-unistyles\");\n const hasNative = hasNativeBare || hasUniwind || hasUnistyles;\n\n const authProvider = config.auth;\n\n // Convex + Clerk\n if (config.backend === \"convex\" && authProvider === \"clerk\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"auth/clerk/convex/backend\",\n \"packages/backend\",\n config,\n );\n\n if (hasReactWeb) {\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/clerk/convex/web/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n }\n\n if (hasNative) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"auth/clerk/convex/native/base\",\n \"apps/native\",\n config,\n );\n\n let nativeFramework = \"\";\n if (hasNativeBare) nativeFramework = \"bare\";\n else if (hasUniwind) nativeFramework = \"uniwind\";\n else if (hasUnistyles) nativeFramework = \"unistyles\";\n\n if (nativeFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/clerk/convex/native/${nativeFramework}`,\n \"apps/native\",\n config,\n );\n }\n }\n return;\n }\n\n // Convex + Better Auth\n if (config.backend === \"convex\" && authProvider === \"better-auth\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"auth/better-auth/convex/backend\",\n \"packages/backend\",\n config,\n );\n\n if (hasReactWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"auth/better-auth/convex/web/react/base\",\n \"apps/web\",\n config,\n );\n\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/better-auth/convex/web/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n }\n\n if (hasNative) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n \"auth/better-auth/convex/native/base\",\n \"apps/native\",\n config,\n );\n\n let nativeFramework = \"\";\n if (hasNativeBare) nativeFramework = \"bare\";\n else if (hasUniwind) nativeFramework = \"uniwind\";\n else if (hasUnistyles) nativeFramework = \"unistyles\";\n\n if (nativeFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/better-auth/convex/native/${nativeFramework}`,\n \"apps/native\",\n config,\n );\n }\n }\n return;\n }\n\n // Non-Convex auth - server/auth package\n if (config.backend !== \"convex\" && config.backend !== \"none\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/server/base`,\n \"packages/auth\",\n config,\n );\n\n // Auth DB integration\n if (config.orm !== \"none\" && config.database !== \"none\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/server/db/${config.orm}/${config.database}`,\n \"packages/db\",\n config,\n );\n }\n }\n\n // Auth web integration\n if (hasReactWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/web/react/base`,\n \"apps/web\",\n config,\n );\n\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/web/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n\n // Fullstack auth\n if (\n config.backend === \"self\" &&\n (reactFramework === \"next\" || reactFramework === \"tanstack-start\")\n ) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/fullstack/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n }\n } else if (hasNuxtWeb) {\n processTemplatesFromPrefix(vfs, templates, `auth/${authProvider}/web/nuxt`, \"apps/web\", config);\n } else if (hasSvelteWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/web/svelte`,\n \"apps/web\",\n config,\n );\n } else if (hasSolidWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/web/solid`,\n \"apps/web\",\n config,\n );\n }\n\n // Native auth\n if (hasNative) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/native/base`,\n \"apps/native\",\n config,\n );\n\n let nativeFramework = \"\";\n if (hasNativeBare) nativeFramework = \"bare\";\n else if (hasUniwind) nativeFramework = \"uniwind\";\n else if (hasUnistyles) nativeFramework = \"unistyles\";\n\n if (nativeFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `auth/${authProvider}/native/${nativeFramework}`,\n \"apps/native\",\n config,\n );\n }\n }\n}\n\nasync function processPaymentsTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (!config.payments || config.payments === \"none\") return;\n if (config.backend === \"convex\") return;\n\n const hasReactWeb = config.frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n const hasNuxtWeb = config.frontend.includes(\"nuxt\");\n const hasSvelteWeb = config.frontend.includes(\"svelte\");\n const hasSolidWeb = config.frontend.includes(\"solid\");\n\n // Payments server\n if (config.backend !== \"none\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `payments/${config.payments}/server/base`,\n \"packages/auth\",\n config,\n );\n }\n\n // Payments web\n if (hasReactWeb) {\n const reactFramework = config.frontend.find((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `payments/${config.payments}/web/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n } else if (hasNuxtWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `payments/${config.payments}/web/nuxt`,\n \"apps/web\",\n config,\n );\n } else if (hasSvelteWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `payments/${config.payments}/web/svelte`,\n \"apps/web\",\n config,\n );\n } else if (hasSolidWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `payments/${config.payments}/web/solid`,\n \"apps/web\",\n config,\n );\n }\n}\n\nasync function processAddonTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (!config.addons || config.addons.length === 0) return;\n\n for (const addon of config.addons) {\n if (addon === \"none\") continue;\n\n // PWA has special handling\n if (addon === \"pwa\") {\n if (config.frontend.includes(\"next\")) {\n processTemplatesFromPrefix(vfs, templates, \"addons/pwa/apps/web/next\", \"apps/web\", config);\n } else if (\n config.frontend.some((f) => [\"tanstack-router\", \"react-router\", \"solid\"].includes(f))\n ) {\n processTemplatesFromPrefix(vfs, templates, \"addons/pwa/apps/web/vite\", \"apps/web\", config);\n }\n continue;\n }\n\n // Standard addons\n processTemplatesFromPrefix(vfs, templates, `addons/${addon}`, \"\", config);\n }\n}\n\nasync function processExampleTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n if (!config.examples || config.examples.length === 0 || config.examples[0] === \"none\") return;\n\n const hasReactWeb = config.frontend.some((f) =>\n [\"tanstack-router\", \"react-router\", \"tanstack-start\", \"next\"].includes(f),\n );\n const hasNuxtWeb = config.frontend.includes(\"nuxt\");\n const hasSvelteWeb = config.frontend.includes(\"svelte\");\n const hasSolidWeb = config.frontend.includes(\"solid\");\n const hasNativeBare = config.frontend.includes(\"native-bare\");\n const hasUniwind = config.frontend.includes(\"native-uniwind\");\n const hasUnistyles = config.frontend.includes(\"native-unistyles\");\n const hasNative = hasNativeBare || hasUniwind || hasUnistyles;\n\n for (const example of config.examples) {\n if (example === \"none\") continue;\n\n // Convex examples\n if (config.backend === \"convex\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/convex/packages/backend`,\n \"packages/backend\",\n config,\n );\n } else if (config.backend !== \"none\" && config.api !== \"none\") {\n // Server-side examples\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/server/${config.orm}/base`,\n \"packages/api\",\n config,\n );\n\n if (config.orm !== \"none\" && config.database !== \"none\") {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/server/${config.orm}/${config.database}`,\n \"packages/db\",\n config,\n );\n }\n }\n\n // Web examples\n if (hasReactWeb) {\n const reactFramework = config.frontend.find((f) =>\n [\"next\", \"react-router\", \"tanstack-router\", \"tanstack-start\"].includes(f),\n );\n if (reactFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/web/react/${reactFramework}`,\n \"apps/web\",\n config,\n );\n\n // Fullstack examples\n if (\n config.backend === \"self\" &&\n (reactFramework === \"next\" || reactFramework === \"tanstack-start\")\n ) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/fullstack/${reactFramework}`,\n \"apps/web\",\n config,\n );\n }\n }\n } else if (hasNuxtWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/web/nuxt`,\n \"apps/web\",\n config,\n );\n } else if (hasSvelteWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/web/svelte`,\n \"apps/web\",\n config,\n );\n } else if (hasSolidWeb) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/web/solid`,\n \"apps/web\",\n config,\n );\n }\n\n // Native examples\n if (hasNative) {\n let nativeFramework = \"\";\n if (hasNativeBare) nativeFramework = \"bare\";\n else if (hasUniwind) nativeFramework = \"uniwind\";\n else if (hasUnistyles) nativeFramework = \"unistyles\";\n\n if (nativeFramework) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `examples/${example}/native/${nativeFramework}`,\n \"apps/native\",\n config,\n );\n }\n }\n }\n}\n\nasync function processExtrasTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n const hasNative = config.frontend.some((f) =>\n [\"native-bare\", \"native-uniwind\", \"native-unistyles\"].includes(f),\n );\n const hasNuxt = config.frontend.includes(\"nuxt\");\n\n if (config.packageManager === \"pnpm\") {\n if (hasTemplatesWithPrefix(templates, \"extras\")) {\n processTemplatesFromPrefix(vfs, templates, \"extras/pnpm-workspace.yaml\", \"\", config);\n }\n }\n\n if (config.packageManager === \"bun\") {\n processTemplatesFromPrefix(vfs, templates, \"extras/bunfig.toml\", \"\", config);\n }\n\n if (config.packageManager === \"pnpm\" && (hasNative || hasNuxt)) {\n processTemplatesFromPrefix(vfs, templates, \"extras/_npmrc\", \"\", config);\n }\n}\n\nasync function processDeployTemplates(\n vfs: VirtualFileSystem,\n templates: TemplateData,\n config: ProjectConfig,\n): Promise<void> {\n const isBackendSelf = config.backend === \"self\";\n\n // Cloudflare infra package\n if (config.webDeploy === \"cloudflare\" || config.serverDeploy === \"cloudflare\") {\n processTemplatesFromPrefix(vfs, templates, \"packages/infra\", \"packages/infra\", config);\n }\n\n // Web deploy (non-cloudflare)\n if (config.webDeploy !== \"none\" && config.webDeploy !== \"cloudflare\") {\n const templateMap: Record<string, string> = {\n \"tanstack-router\": \"react/tanstack-router\",\n \"tanstack-start\": \"react/tanstack-start\",\n \"react-router\": \"react/react-router\",\n solid: \"solid\",\n next: \"react/next\",\n nuxt: \"nuxt\",\n svelte: \"svelte\",\n };\n\n for (const f of config.frontend) {\n if (templateMap[f]) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `deploy/${config.webDeploy}/web/${templateMap[f]}`,\n \"apps/web\",\n config,\n );\n }\n }\n }\n\n // Server deploy\n if (config.serverDeploy !== \"none\" && config.serverDeploy !== \"cloudflare\" && !isBackendSelf) {\n processTemplatesFromPrefix(\n vfs,\n templates,\n `deploy/${config.serverDeploy}/server`,\n \"apps/server\",\n config,\n );\n }\n}\n","/**\n * Auto-generated embedded templates\n * DO NOT EDIT - This file is generated by scripts/generate-templates.ts\n * Run 'bun run generate-templates' to regenerate\n */\n\nexport const EMBEDDED_TEMPLATES: Map<string, string> = new Map([\n [\"base/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n}\n`],\n [\"base/package.json.hbs\", `{\n \"name\": \"better-t-stack\",\n \"private\": true,\n \"type\": \"module\",\n \"workspaces\": [\n \"apps/*\",\n \"packages/*\"\n ],\n \"scripts\": {}\n}\n`],\n [\"base/_gitignore\", `# Dependencies\nnode_modules\n.pnp\n.pnp.js\n\n# Build outputs\ndist\nbuild\n*.tsbuildinfo\n\n# Environment variables\n.env\n.env*.local\n\n# IDEs and editors\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n.idea\n*.swp\n*.swo\n*~\n.DS_Store\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n.pnpm-debug.log*\n\n# Turbo\n.turbo\n\n# Better-T-Stack\n.alchemy\n\n# Testing\ncoverage\n.nyc_output\n\n# Misc\n*.tgz\n.cache\ntmp\ntemp`],\n [\"extras/_npmrc.hbs\", `node-linker=isolated\n{{#if (includes frontend \"nuxt\")}}\nshamefully-hoist=true\nstrict-peer-dependencies=false\n{{/if}}`],\n [\"extras/pnpm-workspace.yaml\", `packages:\n - \"apps/*\"\n - \"packages/*\"\n`],\n [\"extras/bunfig.toml.hbs\", `[install]\n{{#if (or (includes frontend \"nuxt\"))}}\nlinker = \"hoisted\" # having issues with Nuxt when linker is isolated\n{{else}}\nlinker = \"isolated\"\n{{/if}}`],\n [\"db/base/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"outDir\": \"dist\",\n \"composite\": true\n }\n}`],\n [\"db/base/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/db\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {},\n \"devDependencies\": {}\n}`],\n [\"db/base/_gitignore\", `# dependencies (bun install)\nnode_modules\n\n# output\nout\ndist\n*.tgz\n/prisma/generated\n\n# code coverage\ncoverage\n*.lcov\n\n# logs\nlogs\n_.log\nreport.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json\n\n# dotenv environment variable files\n.env\n.env.development.local\n.env.test.local\n.env.production.local\n.env.local\n\n# caches\n.eslintcache\n.cache\n*.tsbuildinfo\n\n# IntelliJ based IDEs\n.idea\n\n# Finder (MacOS) folder config\n.DS_Store\n`],\n [\"addons/turborepo/turbo.json.hbs\", `{\n\t\"$schema\": \"https://turbo.build/schema.json\",\n\t\"ui\": \"tui\",\n\t\"tasks\": {\n\t\t\"build\": {\n\t\t\t\"dependsOn\": [\"^build\"],\n\t\t\t\"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n\t\t\t\"outputs\": [\"dist/**\"]\n\t\t},\n\t\t\"lint\": {\n\t\t\t\"dependsOn\": [\"^lint\"]\n\t\t},\n\t\t\"check-types\": {\n\t\t\t\"dependsOn\": [\"^check-types\"]\n\t\t},\n\t\t\"dev\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t}{{#if (eq backend \"convex\")}},\n\t\t\"dev:setup\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t}\n\t\t{{else}}{{#unless (or (eq database \"none\") (eq orm \"none\"))}},\n\t\t\"db:push\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:studio\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:migrate\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:generate\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t}\n\t\t{{/unless}}{{/if}}\n\t\t{{#if (eq dbSetup \"docker\")}},\n\t\t\"db:start\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:stop\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:watch\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t},\n\t\t\"db:down\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t}{{/if}}\n\t\t{{#if (and (eq database \"sqlite\") (ne dbSetup \"d1\"))}},\n\t\t\"db:local\": {\n\t\t\t\"cache\": false,\n\t\t\t\"persistent\": true\n\t\t}\n\t\t{{/if}}\n\t\t{{#if (or (eq webDeploy \"cloudflare\") (eq serverDeploy \"cloudflare\"))}},\n\t\t\"deploy\": {\n\t\t\t\"cache\": false\n\t\t},\n\t\t\"destroy\": {\n\t\t\t\"cache\": false\n\t\t}\n\t\t{{/if}}\n\t}\n}\n`],\n [\"addons/biome/biome.json.hbs\", `{\n \"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n\t\"vcs\": {\n\t\t\"enabled\": false,\n\t\t\"clientKind\": \"git\",\n\t\t\"useIgnoreFile\": false\n\t},\n\t\"files\": {\n\t\t\"ignoreUnknown\": false,\n\t\t\"includes\": [\n\t\t\t\"**\",\n\t\t\t\"!**/.next\",\n\t\t\t\"!**/dist\",\n\t\t\t\"!**/.turbo\",\n\t\t\t\"!**/dev-dist\",\n\t\t\t\"!**/.zed\",\n\t\t\t\"!**/.vscode\",\n\t\t\t\"!**/routeTree.gen.ts\",\n\t\t\t\"!**/src-tauri\",\n\t\t\t\"!**/.nuxt\",\n\t\t\t\"!bts.jsonc\",\n\t\t\t\"!**/.expo\",\n\t\t\t\"!**/.wrangler\",\n\t\t\t\"!**/.alchemy\",\n\t\t\t\"!**/.svelte-kit\",\n\t\t\t\"!**/wrangler.jsonc\",\n\t\t\t\"!**/.source\",\n\t\t\t\"!**/convex/_generated\"\n\t\t]\n\t},\n\t\"formatter\": {\n\t\t\"enabled\": true,\n\t\t\"indentStyle\": \"tab\"\n\t},\n\t\"assist\": { \"actions\": { \"source\": { \"organizeImports\": \"on\" } } },\n\t\"linter\": {\n\t\t\"enabled\": true,\n\t\t\"rules\": {\n\t\t\t\"recommended\": true,\n\t\t\t\"correctness\": {\n\t\t\t\t\"useExhaustiveDependencies\": \"info\"\n\t\t\t},\n\t\t\t\"nursery\": {\n\t\t\t\t\"useSortedClasses\": {\n\t\t\t\t\t\"level\": \"warn\",\n\t\t\t\t\t\"fix\": \"safe\",\n\t\t\t\t\t\"options\": {\n\t\t\t\t\t\t\"functions\": [\"clsx\", \"cva\", \"cn\"]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"style\": {\n\t\t\t\t\"noParameterAssign\": \"error\",\n\t\t\t\t\"useAsConstAssertion\": \"error\",\n\t\t\t\t\"useDefaultParameterLast\": \"error\",\n\t\t\t\t\"useEnumInitializers\": \"error\",\n\t\t\t\t\"useSelfClosingElements\": \"error\",\n\t\t\t\t\"useSingleVarDeclarator\": \"error\",\n\t\t\t\t\"noUnusedTemplateLiteral\": \"error\",\n\t\t\t\t\"useNumberNamespace\": \"error\",\n\t\t\t\t\"noInferrableTypes\": \"error\",\n\t\t\t\t\"noUselessElse\": \"error\"\n\t\t\t}\n\t\t}\n\t},\n\t\"javascript\": {\n\t\t\"formatter\": {\n\t\t\t\"quoteStyle\": \"double\"\n\t\t}\n\t},\n\t\"css\": {\n\t\t\"parser\": {\n\t\t\t\"tailwindDirectives\": true\n\t\t}\n\t}\n\t{{#if (or (includes frontend \"svelte\") (includes frontend \"nuxt\"))}}\n\t,\n\t\"overrides\": [\n\t\t{\n\t\t\t\"includes\": [\"**/*.svelte\", \"**/*.vue\"],\n\t\t\t\"linter\": {\n\t\t\t\t\"rules\": {\n\t\t\t\t\t\"style\": {\n\t\t\t\t\t\t\"useConst\": \"off\",\n\t\t\t\t\t\t\"useImportType\": \"off\"\n\t\t\t\t\t},\n\t\t\t\t\t\"correctness\": {\n\t\t\t\t\t\t\"noUnusedVariables\": \"off\",\n\t\t\t\t\t\t\"noUnusedImports\": \"off\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n\t{{/if}}\n}\n`],\n [\"addons/ultracite/biome.json.hbs\", `{\n \"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n\t\"files\": {\n\t\t\"ignoreUnknown\": false,\n\t\t\"includes\": [\n\t\t\t\"**\",\n\t\t\t\"!**/.next\",\n\t\t\t\"!**/dist\",\n\t\t\t\"!**/.turbo\",\n\t\t\t\"!**/dev-dist\",\n\t\t\t\"!**/.zed\",\n\t\t\t\"!**/.vscode\",\n\t\t\t\"!**/routeTree.gen.ts\",\n\t\t\t\"!**/src-tauri\",\n\t\t\t\"!**/.nuxt\",\n\t\t\t\"!bts.jsonc\",\n\t\t\t\"!**/.expo\",\n\t\t\t\"!**/.wrangler\",\n\t\t\t\"!**/.alchemy\",\n\t\t\t\"!**/.svelte-kit\",\n\t\t\t\"!**/wrangler.jsonc\",\n\t\t\t\"!**/.source\",\n\t\t\t\"!**/convex/_generated\"\n\t\t]\n\t}\n}\n`],\n [\"packages/env/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n}\n`],\n [\"packages/env/package.json.hbs\", `{\n\t\"name\": \"@{{projectName}}/env\",\n\t\"version\": \"0.0.0\",\n\t\"private\": true,\n\t\"type\": \"module\",\n\t\"exports\": {}\n}`],\n [\"packages/env/env.d.ts.hbs\", `import { type server } from \"@{{projectName}}/infra/alchemy.run\";\n\n// This file infers types for the cloudflare:workers environment from your Alchemy Worker.\n// @see https://alchemy.run/concepts/bindings/#type-safe-bindings\n\nexport type CloudflareEnv = typeof server.Env;\n\ndeclare global {\n type Env = CloudflareEnv;\n}\n\ndeclare module \"cloudflare:workers\" {\n namespace Cloudflare {\n export interface Env extends CloudflareEnv {}\n }\n}\n`],\n [\"packages/config/tsconfig.base.json.hbs\", `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"lib\": [\"ESNext\"],\n \"verbatimModuleSyntax\": true,\n \"strict\": true,\n \"skipLibCheck\": true,\n \"resolveJsonModule\": true,\n \"allowSyntheticDefaultImports\": true,\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n \"noUncheckedIndexedAccess\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"types\": [\n {{#if (eq runtime \"node\")}}\n \"node\"\n {{else if (eq runtime \"bun\")}}\n \"bun\"\n {{else if (eq runtime \"workers\")}}\n \"node\"\n {{else}}\n \"node\"\n {{/if}}{{#if (or (eq serverDeploy \"cloudflare\") (eq webDeploy \"cloudflare\"))}},\n \"@cloudflare/workers-types\"{{/if}}\n ]\n }\n}`],\n [\"packages/config/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/config\",\n \"version\": \"0.0.0\",\n \"private\": true\n}\n`],\n [\"packages/infra/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/infra\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"alchemy dev\",\n \"deploy\": \"alchemy deploy\",\n \"destroy\": \"alchemy destroy\"\n }\n}\n`],\n [\"packages/infra/alchemy.run.ts.hbs\", `import alchemy from \"alchemy\";\n{{#if (eq webDeploy \"cloudflare\")}}\n{{#if (includes frontend \"next\")}}\nimport { Nextjs } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"nuxt\")}}\nimport { Nuxt } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"svelte\")}}\nimport { SvelteKit } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"tanstack-start\")}}\nimport { TanStackStart } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"tanstack-router\")}}\nimport { Vite } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"react-router\")}}\nimport { ReactRouter } from \"alchemy/cloudflare\";\n{{else if (includes frontend \"solid\")}}\nimport { Vite } from \"alchemy/cloudflare\";\n{{/if}}\n{{/if}}\n{{#if (eq serverDeploy \"cloudflare\")}}\nimport { Worker } from \"alchemy/cloudflare\";\n{{/if}}\n{{#if (and (or (eq serverDeploy \"cloudflare\") (and (eq webDeploy \"cloudflare\") (eq backend \"self\"))) (eq dbSetup \"d1\"))}}\nimport { D1Database } from \"alchemy/cloudflare\";\n{{/if}}\nimport { config } from \"dotenv\";\n\n{{#if (and (eq webDeploy \"cloudflare\") (eq serverDeploy \"cloudflare\"))}}\nconfig({ path: \"./.env\" });\nconfig({ path: \"../../apps/web/.env\" });\nconfig({ path: \"../../apps/server/.env\" });\n{{else if (eq webDeploy \"cloudflare\")}}\nconfig({ path: \"./.env\" });\nconfig({ path: \"../../apps/web/.env\" });\n{{else if (eq serverDeploy \"cloudflare\")}}\nconfig({ path: \"./.env\" });\nconfig({ path: \"../../apps/server/.env\" });\n{{/if}}\n\nconst app = await alchemy(\"{{projectName}}\");\n\n{{#if (and (or (eq serverDeploy \"cloudflare\") (and (eq webDeploy \"cloudflare\") (eq backend \"self\"))) (eq dbSetup \"d1\"))}}\nconst db = await D1Database(\"database\", {\n\t{{#if (eq orm \"prisma\")}}\n\tmigrationsDir: \"../../packages/db/prisma/migrations\",\n\t{{else if (eq orm \"drizzle\")}}\n\tmigrationsDir: \"../../packages/db/src/migrations\",\n\t{{/if}}\n});\n{{/if}}\n\n{{#if (eq webDeploy \"cloudflare\")}}\n{{#if (includes frontend \"next\")}}\nexport const web = await Nextjs(\"web\", {\n cwd: \"../../apps/web\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n NEXT_PUBLIC_CONVEX_URL: alchemy.env.NEXT_PUBLIC_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n NEXT_PUBLIC_CONVEX_SITE_URL: alchemy.env.NEXT_PUBLIC_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n NEXT_PUBLIC_SERVER_URL: alchemy.env.NEXT_PUBLIC_SERVER_URL!,\n {{/if}}\n {{#if (eq dbSetup \"d1\")}}\n DB: db,\n {{else if (ne database \"none\")}}\n DATABASE_URL: alchemy.secret.env.DATABASE_URL!,\n {{/if}}\n {{#if (ne backend \"convex\")}}\n CORS_ORIGIN: alchemy.env.CORS_ORIGIN!,\n {{#if (eq auth \"better-auth\")}}\n BETTER_AUTH_SECRET: alchemy.secret.env.BETTER_AUTH_SECRET!,\n BETTER_AUTH_URL: alchemy.env.BETTER_AUTH_URL!,\n {{/if}}\n {{/if}}\n {{#if (eq auth \"clerk\")}}\n CLERK_SECRET_KEY: alchemy.secret.env.CLERK_SECRET_KEY!,\n {{/if}}\n {{#if (and (includes examples \"ai\") (ne backend \"convex\"))}}\n GOOGLE_GENERATIVE_AI_API_KEY: alchemy.secret.env.GOOGLE_GENERATIVE_AI_API_KEY!,\n {{/if}}\n {{#if (eq payments \"polar\")}}\n POLAR_ACCESS_TOKEN: alchemy.secret.env.POLAR_ACCESS_TOKEN!,\n POLAR_SUCCESS_URL: alchemy.env.POLAR_SUCCESS_URL!,\n {{/if}}\n {{#if (eq dbSetup \"turso\")}}\n DATABASE_AUTH_TOKEN: alchemy.secret.env.DATABASE_AUTH_TOKEN!,\n {{/if}}\n {{#if (eq database \"mysql\")}}\n {{#if (eq orm \"drizzle\")}}\n DATABASE_HOST: alchemy.env.DATABASE_HOST!,\n DATABASE_USERNAME: alchemy.env.DATABASE_USERNAME!,\n DATABASE_PASSWORD: alchemy.secret.env.DATABASE_PASSWORD!,\n {{/if}}\n {{/if}}\n }\n});\n{{else if (includes frontend \"nuxt\")}}\nexport const web = await Nuxt(\"web\", {\n cwd: \"../../apps/web\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n NUXT_PUBLIC_CONVEX_URL: alchemy.env.NUXT_PUBLIC_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n NUXT_PUBLIC_CONVEX_SITE_URL: alchemy.env.NUXT_PUBLIC_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n NUXT_PUBLIC_SERVER_URL: alchemy.env.NUXT_PUBLIC_SERVER_URL!,\n {{/if}}\n }\n});\n{{else if (includes frontend \"svelte\")}}\nexport const web = await SvelteKit(\"web\", {\n cwd: \"../../apps/web\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n PUBLIC_CONVEX_URL: alchemy.env.PUBLIC_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n PUBLIC_CONVEX_SITE_URL: alchemy.env.PUBLIC_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n PUBLIC_SERVER_URL: alchemy.env.PUBLIC_SERVER_URL!,\n {{/if}}\n }\n});\n{{else if (includes frontend \"tanstack-start\")}}\nexport const web = await TanStackStart(\"web\", {\n cwd: \"../../apps/web\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n VITE_CONVEX_URL: alchemy.env.VITE_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n VITE_CONVEX_SITE_URL: alchemy.env.VITE_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n VITE_SERVER_URL: alchemy.env.VITE_SERVER_URL!,\n {{/if}}\n {{#if (eq dbSetup \"d1\")}}\n DB: db,\n {{else if (ne database \"none\")}}\n DATABASE_URL: alchemy.secret.env.DATABASE_URL!,\n {{/if}}\n {{#if (ne backend \"convex\")}}\n CORS_ORIGIN: alchemy.env.CORS_ORIGIN!,\n {{#if (eq auth \"better-auth\")}}\n BETTER_AUTH_SECRET: alchemy.secret.env.BETTER_AUTH_SECRET!,\n BETTER_AUTH_URL: alchemy.env.BETTER_AUTH_URL!,\n {{/if}}\n {{/if}}\n {{#if (eq auth \"clerk\")}}\n CLERK_SECRET_KEY: alchemy.secret.env.CLERK_SECRET_KEY!,\n {{/if}}\n {{#if (and (includes examples \"ai\") (ne backend \"convex\"))}}\n GOOGLE_GENERATIVE_AI_API_KEY: alchemy.secret.env.GOOGLE_GENERATIVE_AI_API_KEY!,\n {{/if}}\n {{#if (eq payments \"polar\")}}\n POLAR_ACCESS_TOKEN: alchemy.secret.env.POLAR_ACCESS_TOKEN!,\n POLAR_SUCCESS_URL: alchemy.env.POLAR_SUCCESS_URL!,\n {{/if}}\n {{#if (eq dbSetup \"turso\")}}\n DATABASE_AUTH_TOKEN: alchemy.secret.env.DATABASE_AUTH_TOKEN!,\n {{/if}}\n {{#if (eq database \"mysql\")}}\n {{#if (eq orm \"drizzle\")}}\n DATABASE_HOST: alchemy.env.DATABASE_HOST!,\n DATABASE_USERNAME: alchemy.env.DATABASE_USERNAME!,\n DATABASE_PASSWORD: alchemy.secret.env.DATABASE_PASSWORD!,\n {{/if}}\n {{/if}}\n }\n});\n{{else if (includes frontend \"tanstack-router\")}}\nexport const web = await Vite(\"web\", {\n cwd: \"../../apps/web\",\n assets: \"dist\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n VITE_CONVEX_URL: alchemy.env.VITE_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n VITE_CONVEX_SITE_URL: alchemy.env.VITE_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n VITE_SERVER_URL: alchemy.env.VITE_SERVER_URL!,\n {{/if}}\n }\n});\n{{else if (includes frontend \"react-router\")}}\nexport const web = await ReactRouter(\"web\", {\n cwd: \"../../apps/web\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n VITE_CONVEX_URL: alchemy.env.VITE_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n VITE_CONVEX_SITE_URL: alchemy.env.VITE_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n VITE_SERVER_URL: alchemy.env.VITE_SERVER_URL!,\n {{/if}}\n }\n});\n{{else if (includes frontend \"solid\")}}\nexport const web = await Vite(\"web\", {\n cwd: \"../../apps/web\",\n assets: \"dist\",\n bindings: {\n {{#if (eq backend \"convex\")}}\n VITE_CONVEX_URL: alchemy.env.VITE_CONVEX_URL!,\n {{#if (eq auth \"better-auth\")}}\n VITE_CONVEX_SITE_URL: alchemy.env.VITE_CONVEX_SITE_URL!,\n {{/if}}\n {{else if (ne backend \"self\")}}\n VITE_SERVER_URL: alchemy.env.VITE_SERVER_URL!,\n {{/if}}\n }\n});\n{{/if}}\n{{/if}}\n\n{{#if (eq serverDeploy \"cloudflare\")}}\nexport const server = await Worker(\"server\", {\n cwd: \"../../apps/server\",\n entrypoint: \"src/index.ts\",\n compatibility: \"node\",\n bindings: {\n {{#if (eq dbSetup \"d1\")}}\n DB: db,\n {{else if (ne database \"none\")}}\n DATABASE_URL: alchemy.secret.env.DATABASE_URL!,\n {{/if}}\n CORS_ORIGIN: alchemy.env.CORS_ORIGIN!,\n {{#if (eq auth \"better-auth\")}}\n BETTER_AUTH_SECRET: alchemy.secret.env.BETTER_AUTH_SECRET!,\n BETTER_AUTH_URL: alchemy.env.BETTER_AUTH_URL!,\n {{/if}}\n {{#if (eq auth \"clerk\")}}\n CLERK_SECRET_KEY: alchemy.secret.env.CLERK_SECRET_KEY!,\n {{/if}}\n {{#if (includes examples \"ai\")}}\n GOOGLE_GENERATIVE_AI_API_KEY: alchemy.secret.env.GOOGLE_GENERATIVE_AI_API_KEY!,\n {{/if}}\n {{#if (eq payments \"polar\")}}\n POLAR_ACCESS_TOKEN: alchemy.secret.env.POLAR_ACCESS_TOKEN!,\n POLAR_SUCCESS_URL: alchemy.env.POLAR_SUCCESS_URL!,\n {{/if}}\n {{#if (eq dbSetup \"turso\")}}\n DATABASE_AUTH_TOKEN: alchemy.secret.env.DATABASE_AUTH_TOKEN!,\n {{/if}}\n {{#if (eq database \"mysql\")}}\n {{#if (eq orm \"drizzle\")}}\n DATABASE_HOST: alchemy.env.DATABASE_HOST!,\n DATABASE_USERNAME: alchemy.env.DATABASE_USERNAME!,\n DATABASE_PASSWORD: alchemy.secret.env.DATABASE_PASSWORD!,\n {{/if}}\n {{/if}}\n },\n dev: {\n\t\tport: 3000,\n\t},\n});\n{{/if}}\n\n{{#if (and (eq webDeploy \"cloudflare\") (eq serverDeploy \"cloudflare\"))}}\nconsole.log(\\`Web -> \\${web.url}\\`);\nconsole.log(\\`Server -> \\${server.url}\\`);\n{{else if (eq webDeploy \"cloudflare\")}}\nconsole.log(\\`Web -> \\${web.url}\\`);\n{{else if (eq serverDeploy \"cloudflare\")}}\nconsole.log(\\`Server -> \\${server.url}\\`);\n{{/if}}\n\nawait app.finalize();\n`],\n [\"frontend/svelte/tsconfig.json.hbs\", `{\n\t\"extends\": \"./.svelte-kit/tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"allowJs\": true,\n\t\t\"checkJs\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"sourceMap\": true,\n\t\t\"strict\": true,\n\t\t\"moduleResolution\": \"bundler\"\n\t}\n\t// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias\n\t// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files\n\t//\n\t// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes\n\t// from the referenced tsconfig.json - TypeScript does not merge them in\n}\n`],\n [\"frontend/svelte/package.json.hbs\", `{\n\t\"name\": \"web\",\n\t\"private\": true,\n\t\"version\": \"0.0.1\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"vite build\",\n\t\t\"preview\": \"vite preview\",\n\t\t\"prepare\": \"svelte-kit sync || echo ''\",\n\t\t\"check\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json\",\n\t\t\"check:watch\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@sveltejs/adapter-auto\": \"^6.1.0\",\n\t\t\"@sveltejs/kit\": \"^2.31.1\",\n\t\t\"@sveltejs/vite-plugin-svelte\": \"^6.1.2\",\n\t\t\"@tailwindcss/vite\": \"^4.1.12\",\n\t\t\"svelte\": \"^5.38.1\",\n\t\t\"svelte-check\": \"^4.3.1\",\n\t\t\"tailwindcss\": \"^4.1.12\",\n\t\t\"vite\": \"^7.1.2\"\n\t},\n\t\"dependencies\": {\n\t\t\"@tanstack/svelte-form\": \"^1.19.2\"\n\t}\n}\n`],\n [\"frontend/svelte/_gitignore\", `node_modules\n\n# Output\n.output\n.vercel\n.netlify\n.wrangler\n.alchemy\n/.svelte-kit\n/build\n\n# OS\n.DS_Store\nThumbs.db\n\n# Env\n.env\n.env.*\n!.env.example\n!.env.test\n\n# Vite\nvite.config.js.timestamp-*\nvite.config.ts.timestamp-*\n`],\n [\"frontend/svelte/svelte.config.js.hbs\", `import adapter from '@sveltejs/adapter-auto';\nimport { vitePreprocess } from '@sveltejs/vite-plugin-svelte';\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n\t// Consult https://svelte.dev/docs/kit/integrations\n\t// for more information about preprocessors\n\tpreprocess: vitePreprocess(),\n\n\tkit: {\n\t\t// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.\n\t\t// If your environment is not supported, or you settled on a specific environment, switch out the adapter.\n\t\t// See https://svelte.dev/docs/kit/adapters for more information about adapters.\n\t\tadapter: adapter()\n\t}\n};\n\nexport default config;\n`],\n [\"frontend/svelte/_npmrc\", `engine-strict=true\n`],\n [\"frontend/svelte/vite.config.ts.hbs\", `import tailwindcss from \"@tailwindcss/vite\";\nimport { sveltekit } from \"@sveltejs/kit/vite\";\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig({\n plugins: [tailwindcss(), sveltekit()],\n});\n`],\n [\"frontend/nuxt/nuxt.config.ts.hbs\", `import \"@{{projectName}}/env/web\";\n\n// https://nuxt.com/docs/api/configuration/nuxt-config\nexport default defineNuxtConfig({\n compatibilityDate: 'latest',\n devtools: { enabled: true },\n modules: [\n '@nuxt/ui'\n {{#if (eq backend \"convex\")}},\n 'convex-nuxt'\n {{/if}}\n ],\n css: ['~/assets/css/main.css'],\n devServer: {\n port: 3001\n },\n ssr: true,\n {{#if (eq backend \"convex\")}}\n convex: {\n url: process.env.NUXT_PUBLIC_CONVEX_URL,\n },\n {{else}}\n runtimeConfig: {\n public: {\n serverUrl: process.env.NUXT_PUBLIC_SERVER_URL,\n }\n },\n {{/if}}\n})\n`],\n [\"frontend/nuxt/tsconfig.json.hbs\", `{\n // https://nuxt.com/docs/guide/concepts/typescript\n \"files\": [],\n \"references\": [\n {\n \"path\": \"./.nuxt/tsconfig.app.json\"\n },\n {\n \"path\": \"./.nuxt/tsconfig.server.json\"\n },\n {\n \"path\": \"./.nuxt/tsconfig.shared.json\"\n },\n {\n \"path\": \"./.nuxt/tsconfig.node.json\"\n }\n ]\n}\n`],\n [\"frontend/nuxt/package.json.hbs\", `{\n \"name\": \"web\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"nuxt build\",\n \"dev\": \"nuxt dev\",\n \"generate\": \"nuxt generate\",\n \"preview\": \"nuxt preview\",\n \"postinstall\": \"nuxt prepare\"\n },\n \"dependencies\": {\n \"@nuxt/ui\": \"4.2.1\",\n \"@nuxt/content\": \"^3.7.1\",\n \"@nuxtjs/mdc\": \"^0.17.4\",\n \"nuxt\": \"^4.1.2\",\n \"vue\": \"^3.5.21\",\n \"vue-router\": \"^4.5.1\"\n },\n \"devDependencies\": {\n \"tailwindcss\": \"^4.1.13\",\n \"@iconify-json/lucide\": \"^1.2.57\"\n }\n}\n`],\n [\"frontend/nuxt/_gitignore\", `# Nuxt dev/build outputs\n.output\n.data\n.nuxt\n.nitro\n.cache\ndist\n.wrangler\n.alchemy\n\n# Node dependencies\nnode_modules\n\n# Logs\nlogs\n*.log\n\n# Misc\n.DS_Store\n.fleet\n.idea\n\n# Local env files\n.env\n.env.*\n!.env.example\n\n`],\n [\"frontend/solid/index.html\", `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <link rel=\"icon\" href=\"/favicon.ico\" />\n <meta name=\"theme-color\" content=\"#000000\" />\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`],\n [\"frontend/solid/tsconfig.json.hbs\", `{\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"jsx\": \"preserve\",\n \"jsxImportSource\": \"solid-js\",\n \"module\": \"ESNext\",\n \"lib\": [\"ES2022\", \"DOM\", \"DOM.Iterable\"],\n \"types\": [\"vite/client\"],\n\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"verbatimModuleSyntax\": true,\n \"noEmit\": true,\n\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedSideEffectImports\": true,\n\n \"rootDirs\": [\".\"],\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n }\n}\n`],\n [\"frontend/solid/package.json.hbs\", `{\n \"name\": \"web\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite dev\",\n \"build\": \"vite build\",\n \"serve\": \"vite preview\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@tailwindcss/vite\": \"^4.1.13\",\n \"@tanstack/router-plugin\": \"^1.131.44\",\n \"@tanstack/solid-form\": \"^1.20.0\",\n \"@tanstack/solid-router\": \"^1.131.44\",\n \"lucide-solid\": \"^0.544.0\",\n \"solid-js\": \"^1.9.9\",\n \"tailwindcss\": \"^4.1.13\"\n },\n \"devDependencies\": {\n \"vite\": \"^7.1.5\",\n \"vite-plugin-solid\": \"^2.11.8\"\n }\n}\n`],\n [\"frontend/solid/_gitignore\", `node_modules\n.DS_Store\ndist\ndist-ssr\n*.local\n.env\n.env.*\n\n.wrangler\n.alchemy\n.dev.vars*`],\n [\"frontend/solid/vite.config.ts.hbs\", `import { defineConfig } from \"vite\";\nimport { tanstackRouter } from \"@tanstack/router-plugin/vite\";\nimport solidPlugin from \"vite-plugin-solid\";\nimport tailwindcss from \"@tailwindcss/vite\";\nimport path from \"node:path\";\n\nexport default defineConfig({\n plugins: [\n tanstackRouter({ target: \"solid\", autoCodeSplitting: true }),\n solidPlugin(),\n tailwindcss(),\n ],\n resolve: {\n alias: {\n \"@\": path.resolve(__dirname, \"./src\"),\n },\n },\n server: {\n port: 3001,\n },\n});`],\n [\"db/drizzle/mysql/drizzle.config.ts.hbs\", `import { defineConfig } from \"drizzle-kit\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default defineConfig({\n schema: \"./src/schema\",\n out: \"./src/migrations\",\n dialect: \"mysql\",\n dbCredentials: {\n url: process.env.DATABASE_URL || \"\",\n },\n});\n`],\n [\"db/drizzle/sqlite/drizzle.config.ts.hbs\", `import { defineConfig } from \"drizzle-kit\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default defineConfig({\n schema: \"./src/schema\",\n out: \"./src/migrations\",\n {{#if (eq dbSetup \"d1\")}}\n // DOCS: https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\n dialect: \"sqlite\",\n driver: \"d1-http\",\n {{else}}\n dialect: \"turso\",\n dbCredentials: {\n url: process.env.DATABASE_URL || \"\",\n {{#if (eq dbSetup \"turso\")}}\n authToken: process.env.DATABASE_AUTH_TOKEN,\n {{/if}}\n },\n {{/if}}\n});\n`],\n [\"db/drizzle/postgres/drizzle.config.ts.hbs\", `import { defineConfig } from \"drizzle-kit\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default defineConfig({\n schema: \"./src/schema\",\n out: \"./src/migrations\",\n dialect: \"postgresql\",\n dbCredentials: {\n url: process.env.DATABASE_URL || \"\",\n },\n});\n`],\n [\"db/prisma/mysql/prisma.config.ts.hbs\", `import path from \"node:path\";\nimport { defineConfig, env } from \"prisma/config\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default defineConfig({\n schema: path.join(\"prisma\", \"schema\"),\n migrations: {\n path: path.join(\"prisma\", \"migrations\"),\n },\n datasource: {\n url: env(\"DATABASE_URL\"),\n },\n});`],\n [\"db/prisma/mongodb/prisma.config.ts.hbs\", `import path from \"node:path\";\nimport type { PrismaConfig } from \"prisma\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default {\n schema: path.join(\"prisma\", \"schema\"),\n migrations: {\n path: path.join(\"prisma\", \"migrations\"),\n }\n} satisfies PrismaConfig;\n`],\n [\"db/prisma/sqlite/prisma.config.ts.hbs\", `import path from \"node:path\";\nimport { defineConfig, env } from \"prisma/config\";\nimport dotenv from \"dotenv\";\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n});\n\nexport default defineConfig({\n schema: path.join(\"prisma\", \"schema\"),\n migrations: {\n path: path.join(\"prisma\", \"migrations\"),\n },\n datasource: {\n {{#if (eq dbSetup \"turso\")}}\n url: \"file:./dev.db\",\n {{else}}\n url: env(\"DATABASE_URL\"),\n {{/if}}\n },\n});`],\n [\"db/prisma/postgres/prisma.config.ts.hbs\", `import path from \"node:path\";\nimport { defineConfig, env } from 'prisma/config'\nimport dotenv from 'dotenv'\n\ndotenv.config({\n {{#if (eq backend \"self\")}}\n path: \"../../apps/web/.env\",\n {{else}}\n path: \"../../apps/server/.env\",\n {{/if}}\n})\n\nexport default defineConfig({\n schema: path.join(\"prisma\", \"schema\"),\n migrations: {\n path: path.join(\"prisma\", \"migrations\"),\n },\n datasource: {\n url: env('DATABASE_URL'),\n },\n})\n`],\n [\"api/orpc/server/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"outDir\": \"dist\",\n \"composite\": true\n }\n}`],\n [\"api/orpc/server/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/api\",\n \"exports\": {\n \".\": {\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"default\": \"./src/*.ts\"\n }\n },\n \"type\": \"module\",\n \"scripts\": {},\n \"devDependencies\": {},\n \"dependencies\": {}\n}`],\n [\"api/orpc/server/_gitignore\", `# dependencies (bun install)\nnode_modules\n\n# output\nout\ndist\n*.tgz\n\n# code coverage\ncoverage\n*.lcov\n\n# logs\nlogs\n_.log\nreport.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json\n\n# dotenv environment variable files\n.env\n.env.development.local\n.env.test.local\n.env.production.local\n.env.local\n\n# caches\n.eslintcache\n.cache\n*.tsbuildinfo\n\n# IntelliJ based IDEs\n.idea\n\n# Finder (MacOS) folder config\n.DS_Store\n`],\n [\"api/trpc/server/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"outDir\": \"dist\",\n \"composite\": true\n }\n}`],\n [\"api/trpc/server/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/api\",\n \"exports\": {\n \".\": {\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"default\": \"./src/*.ts\"\n }\n },\n \"type\": \"module\",\n \"scripts\": {},\n \"devDependencies\": {}\n}`],\n [\"api/trpc/server/_gitignore\", `# dependencies (bun install)\nnode_modules\n\n# output\nout\ndist\n*.tgz\n\n# code coverage\ncoverage\n*.lcov\n\n# logs\nlogs\n_.log\nreport.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json\n\n# dotenv environment variable files\n.env\n.env.development.local\n.env.test.local\n.env.production.local\n.env.local\n\n# caches\n.eslintcache\n.cache\n*.tsbuildinfo\n\n# IntelliJ based IDEs\n.idea\n\n# Finder (MacOS) folder config\n.DS_Store\n`],\n [\"addons/ruler/.ruler/ruler.toml.hbs\", `# Ruler Configuration File\n# See https://okigu.com/ruler for documentation.\n\n# Default agents to run when --agents is not specified\ndefault_agents = []\n\n# --- Global MCP Server Configuration ---\n[mcp]\n# Enable/disable MCP propagation globally (default: true)\nenabled = true\n# Global merge strategy: 'merge' or 'overwrite' (default: 'merge')\nmerge_strategy = \"merge\"\n\n# --- MCP Server Definitions ---\n[mcp_servers.context7]\ncommand = \"npx\"\nargs = [\"-y\", \"@upstash/context7-mcp\"]\n\n{{#if (or (eq runtime \"workers\") (eq webDeploy \"wrangler\"))}}\n[mcp_servers.cloudflare]\ncommand = \"npx\"\nargs = [\"mcp-remote\", \"https://docs.mcp.cloudflare.com/sse\"]\n{{/if}}\n\n{{#if (eq backend \"convex\")}}\n[mcp_servers.convex]\ncommand = \"npx\"\nargs = [\"-y\", \"convex@latest\", \"mcp\", \"start\"]\n{{/if}}\n\n{{#if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"tanstack-start\") (includes frontend \"next\"))}}\n[mcp_servers.shadcn]\ncommand = \"npx\"\nargs = [\"shadcn@latest\", \"mcp\"]\n{{/if}}\n\n{{#if (eq dbSetup \"planetscale\")}}\n[mcp_servers.planetscale]\ncommand = \"pscale\"\nargs = [\"mcp\", \"server\"]\n{{/if}}\n\n{{#if (eq dbSetup \"prisma-postgres\")}}\n[mcp_servers.prisma]\ncommand = \"npx\"\nargs = [\"-y\", \"prisma\", \"mcp\"]\n{{/if}}\n\n{{#if (eq dbSetup \"neon\")}}\n[mcp_servers.neon]\ncommand = \"npx\"\nargs = [\"-y\", \"mcp-remote@latest\", \"https://mcp.neon.tech/mcp\"]\n{{/if}}\n\n{{#if (eq dbSetup \"mongodb-atlas\")}}\n[mcp_servers.mongodb]\ncommand = \"npx\"\nargs = [\"-y\", \"mongodb-mcp-server\", \"--connectionString\", \"mongodb://localhost:27017/myDatabase\", \"--readOnly\"]\n{{/if}}\n\n{{#if (eq auth \"better-auth\")}}\n[mcp_servers.better-auth]\nurl = \"https://mcp.chonkie.ai/better-auth/better-auth-builder/mcp\"\n{{/if}}\n\n{{#if (includes frontend \"nuxt\")}}\n[mcp_servers.nuxt-ui]\nurl = \"https://ui.nuxt.com/mcp\"\n{{/if}}\n\n{{#if (includes frontend \"next\")}}\n[mcp_servers.next-devtools]\ncommand = \"npx\"\nargs = [\"-y\", \"next-devtools-mcp@latest\"]\n{{/if}}\n\n# --- Global .gitignore Configuration ---\n[gitignore]\n# Enable/disable automatic .gitignore updates (default: true)\nenabled = true`],\n [\"addons/ruler/.ruler/bts.md.hbs\", `# Better-T-Stack Project Rules\n\nThis is a {{projectName}} project created with Better-T-Stack CLI.\n\n## Project Structure\n\nThis is a monorepo with the following structure:\n\n{{#if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"tanstack-start\")\n(includes frontend \"next\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\n- **\\`apps/web/\\`** - {{#if (eq backend \"self\")}}Fullstack application{{else}}Frontend application{{/if}}{{#if (includes frontend \"tanstack-router\")}} (React with TanStack Router){{else\nif (includes frontend \"react-router\")}} (React with React Router){{else if (includes frontend \"next\")}} (Next.js){{else\nif (includes frontend \"nuxt\")}} (Nuxt.js){{else if (includes frontend \"svelte\")}} (SvelteKit){{else if (includes\nfrontend \"solid\")}} (SolidStart){{/if}}\n{{/if}}\n\n{{#if (ne backend \"convex\")}}\n{{#if (and (ne backend \"none\") (ne backend \"self\"))}}\n- **\\`apps/server/\\`** - Backend server{{#if (eq backend \"hono\")}} (Hono){{else if (eq backend \"express\")}}\n(Express){{else if (eq backend \"fastify\")}} (Fastify){{else if (eq backend \"elysia\")}} (Elysia){{else if (eq backend\n\"next\")}} (Next.js API){{/if}}\n{{/if}}\n{{else}}\n- **\\`packages/backend/\\`** - Convex backend functions\n{{/if}}\n\n{{#if (or (ne backend \"none\") (ne backend \"convex\"))}}\n{{#if (ne api \"none\")}}\n- **\\`packages/api/\\`** - Shared API logic and types\n{{/if}}\n{{#if (and (ne auth \"none\") (ne backend \"convex\"))}}\n- **\\`packages/auth/\\`** - Authentication logic and utilities\n{{/if}}\n{{#if (and (ne database \"none\") (ne orm \"none\") (ne backend \"convex\"))}}\n- **\\`packages/db/\\`** - Database schema and utilities\n{{/if}}\n{{/if}}\n\n{{#if (or (includes frontend \"native-nativewind\") (includes frontend \"native-unistyles\"))}}\n- **\\`apps/native/\\`** - React Native mobile app{{#if (includes frontend \"native-nativewind\")}} (with NativeWind){{else if\n(includes frontend \"native-unistyles\")}} (with Unistyles){{/if}}\n{{/if}}\n\n## Available Scripts\n\n- \\`{{packageManager}} run dev\\` - Start all apps in development mode\n{{#if (and (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"tanstack-start\")\n(includes frontend \"next\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\")) (ne backend \"self\"))}}\n- \\`{{packageManager}} run dev:web\\` - Start only the web app\n{{/if}}\n{{#if (and (ne backend \"none\") (ne backend \"convex\") (ne backend \"self\"))}}\n- \\`{{packageManager}} run dev:server\\` - Start only the server\n{{/if}}\n{{#if (or (includes frontend \"native-nativewind\") (includes frontend \"native-unistyles\"))}}\n- \\`{{packageManager}} run dev:native\\` - Start only the native app\n{{/if}}\n\n{{#if (and (ne database \"none\") (ne orm \"none\") (ne backend \"convex\"))}}\n## Database Commands\n\nAll database operations should be run from the {{#if (eq backend \"self\")}}web{{else}}server{{/if}} workspace:\n\n- \\`{{packageManager}} run db:push\\` - Push schema changes to database\n- \\`{{packageManager}} run db:studio\\` - Open database studio\n- \\`{{packageManager}} run db:generate\\` - Generate {{#if (eq orm \"drizzle\")}}Drizzle{{else if (eq orm\n\"prisma\")}}Prisma{{else}}{{orm}}{{/if}} files\n- \\`{{packageManager}} run db:migrate\\` - Run database migrations\n\n{{#if (eq orm \"drizzle\")}}\nDatabase schema files are located in {{#if (eq backend \"self\")}}\\`apps/web/src/db/schema/\\`{{else}}\\`apps/server/src/db/schema/\\`{{/if}}\n{{else if (eq orm \"prisma\")}}\nDatabase schema is located in {{#if (eq backend \"self\")}}\\`apps/web/prisma/schema.prisma\\`{{else}}\\`apps/server/prisma/schema.prisma\\`{{/if}}\n{{else if (eq orm \"mongoose\")}}\nDatabase models are located in {{#if (eq backend \"self\")}}\\`apps/web/src/db/models/\\`{{else}}\\`apps/server/src/db/models/\\`{{/if}}\n{{/if}}\n{{/if}}\n\n{{#if (ne api \"none\")}}\n## API Structure\n\n{{#if (eq api \"trpc\")}}\n- tRPC routers are in {{#if (eq backend \"self\")}}\\`packages/api/src/routers/\\`{{else}}\\`apps/server/src/routers/\\`{{/if}}\n- Client-side tRPC utils are in \\`apps/web/src/utils/trpc.ts\\`\n{{else if (eq api \"orpc\")}}\n- oRPC endpoints are in {{#if (eq backend \"self\")}}\\`packages/api/src/api/\\`{{else}}\\`apps/server/src/api/\\`{{/if}}\n- Client-side API utils are in \\`apps/web/src/utils/api.ts\\`\n{{/if}}\n{{/if}}\n\n{{#if (eq auth \"better-auth\")}}\n## Authentication\n\nAuthentication is enabled in this project:\n{{#if (ne backend \"convex\")}}\n- Server auth logic is in {{#if (eq backend \"self\")}}\\`packages/auth/src/lib/auth.ts\\`{{else}}\\`apps/server/src/lib/auth.ts\\`{{/if}}\n{{#if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"tanstack-start\")\n(includes frontend \"next\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\n- Web app auth client is in \\`apps/web/src/lib/auth-client.ts\\`\n{{/if}}\n{{#if (or (includes frontend \"native-nativewind\") (includes frontend \"native-unistyles\"))}}\n- Native app auth client is in \\`apps/native/src/lib/auth-client.ts\\`\n{{/if}}\n{{else}}\n{{/if}}\n{{/if}}\n\n## Adding More Features\n\nYou can add additional addons or deployment options to your project using:\n\n\\`\\`\\`bash\n{{#if (eq packageManager \"bun\")}}bunx{{else if (eq packageManager \"pnpm\")}}pnpx{{else}}npx{{/if}} create-better-t-stack\nadd\n\\`\\`\\`\n\nAvailable addons you can add:\n- **Documentation**: Starlight, Fumadocs\n- **Linting**: Biome, Oxlint, Ultracite\n- **Other**: Ruler, Turborepo, PWA, Tauri, Husky\n\nYou can also add web deployment configurations like Cloudflare Workers support.\n\n## Project Configuration\n\nThis project includes a \\`bts.jsonc\\` configuration file that stores your Better-T-Stack settings:\n\n- Contains your selected stack configuration (database, ORM, backend, frontend, etc.)\n- Used by the CLI to understand your project structure\n- Safe to delete if not needed\n- Updated automatically when using the \\`add\\` command\n\n## Key Points\n\n- This is a {{#if (includes addons \"turborepo\")}}Turborepo {{/if}}monorepo using {{packageManager}} workspaces\n- Each app has its own \\`package.json\\` and dependencies\n- Run commands from the root to execute across all workspaces\n- Run workspace-specific commands with \\`{{packageManager}} run command-name\\`\n{{#if (includes addons \"turborepo\")}}\n- Turborepo handles build caching and parallel execution\n{{/if}}\n- Use \\`{{#if (eq packageManager \"bun\")}}bunx{{else if (eq packageManager \"pnpm\")}}pnpx{{else}}npx{{/if}}\ncreate-better-t-stack add\\` to add more features later\n`],\n [\"addons/husky/.husky/pre-commit\", `lint-staged\n`],\n [\"backend/server/base/tsdown.config.ts.hbs\", `import { defineConfig } from 'tsdown';\n\nexport default defineConfig({\n entry: './src/index.ts',\n format: 'esm',\n outDir: './dist',\n clean: true,\n noExternal: [/@{{projectName}}\\\\/.*/]\n});\n`],\n [\"backend/server/base/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n \"compilerOptions\": {\n \"composite\": true,\n\t\t\"outDir\": \"dist\",\n\t\t\"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n },\n \"jsx\": \"react-jsx\"{{#if (eq backend \"hono\")}},\n \"jsxImportSource\": \"hono/jsx\"{{/if}}\n }\n}\n`],\n [\"backend/server/base/package.json.hbs\", `{\n\t\"name\": \"server\",\n\t\"main\": \"src/index.ts\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"tsdown\",\n\t\t\"check-types\": \"tsc -b\",\n\t\t\"compile\": \"bun build --compile --minify --sourcemap --bytecode ./src/index.ts --outfile server\"\n\t},\n\t\"dependencies\": {},\n\t{{#if (eq dbSetup 'supabase')}}\n\t\"trustedDependencies\": [\n \"supabase\"\n ],\n {{/if}}\n\t\"devDependencies\": {}\n}\n`],\n [\"backend/server/base/_gitignore\", `# prod\ndist/\n/build\n/out/\n\n# dev\n.yarn/\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n.vscode/*\n!.vscode/launch.json\n!.vscode/*.code-snippets\n.idea/workspace.xml\n.idea/usage.statistics.xml\n.idea/shelf\n.wrangler\n.alchemy\n/.next/\n.vercel\nprisma/generated/\n\n\n# deps\nnode_modules/\n/node_modules\n/.pnp\n.pnp.*\n\n# env\n.env*\n.env.production\n!.env.example\n.dev.vars\n\n# logs\nlogs/\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\n# misc\n.DS_Store\n*.pem\n\n# local db\n*.db*\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n`],\n [\"packages/env/src/native.ts.hbs\", `import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n\tclientPrefix: \"EXPO_PUBLIC_\",\n\tclient: {\n{{#if (eq backend \"convex\")}}\n\t\tEXPO_PUBLIC_CONVEX_URL: z.url(),\n{{#if (eq auth \"better-auth\")}}\n\t\tEXPO_PUBLIC_CONVEX_SITE_URL: z.url(),\n{{/if}}\n{{#if (eq auth \"clerk\")}}\n\t\tEXPO_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1),\n{{/if}}\n{{else}}\n\t\tEXPO_PUBLIC_SERVER_URL: z.url(),\n{{/if}}\n\t},\n\truntimeEnv: process.env,\n\temptyStringAsUndefined: true,\n});`],\n [\"packages/env/src/server.ts.hbs\", `{{#if (eq serverDeploy \"cloudflare\")}}\n/// <reference path=\"../env.d.ts\" />\n// For Cloudflare Workers, env is accessed via cloudflare:workers module\n// Types are defined in env.d.ts based on your alchemy.run.ts bindings\nexport { env } from \"cloudflare:workers\";\n{{else}}\nimport \"dotenv/config\";\nimport { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n\tserver: {\n{{#if (ne database \"none\")}}\n{{#if (eq dbSetup \"planetscale\")}}\n\t\tDATABASE_HOST: z.string().min(1),\n\t\tDATABASE_USERNAME: z.string().min(1),\n\t\tDATABASE_PASSWORD: z.string().min(1),\n{{else}}\n\t\tDATABASE_URL: z.string().min(1),\n{{#if (eq dbSetup \"turso\")}}\n\t\tDATABASE_AUTH_TOKEN: z.string().min(1),\n{{/if}}\n{{/if}}\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\n\t\tBETTER_AUTH_SECRET: z.string().min(32),\n\t\tBETTER_AUTH_URL: z.url(),\n{{/if}}\n{{#if (eq payments \"polar\")}}\n\t\tPOLAR_ACCESS_TOKEN: z.string().min(1),\n\t\tPOLAR_SUCCESS_URL: z.url(),\n{{/if}}\n\t\tCORS_ORIGIN: z.url(),\n\t\tNODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n\t},\n\truntimeEnv: process.env,\n\temptyStringAsUndefined: true,\n});\n{{/if}}`],\n [\"packages/env/src/web.ts.hbs\", `{{#if (includes frontend \"next\")}}\nimport { createEnv } from \"@t3-oss/env-nextjs\";\n{{else if (includes frontend \"nuxt\")}}\nimport { createEnv } from \"@t3-oss/env-nuxt\";\n{{else}}\nimport { createEnv } from \"@t3-oss/env-core\";\n{{/if}}\nimport { z } from \"zod\";\n\n{{#if (includes frontend \"nuxt\")}}\n/**\n * Nuxt env validation - validates at build time when imported in nuxt.config.ts\n * For runtime access in components/plugins, use useRuntimeConfig() instead:\n * const config = useRuntimeConfig()\n * config.public.serverUrl (NUXT_PUBLIC_SERVER_URL maps to serverUrl)\n */\n{{/if}}\nexport const env = createEnv({\n{{#if (eq backend \"convex\")}}\n{{#if (includes frontend \"next\")}}\n\tclient: {\n\t\tNEXT_PUBLIC_CONVEX_URL: z.url(),\n{{#if (eq auth \"better-auth\")}}\n\t\tNEXT_PUBLIC_CONVEX_SITE_URL: z.url(),\n{{/if}}\n{{#if (eq auth \"clerk\")}}\n\t\tNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1),\n{{/if}}\n\t},\n\truntimeEnv: {\n\t\tNEXT_PUBLIC_CONVEX_URL: process.env.NEXT_PUBLIC_CONVEX_URL,\n{{#if (eq auth \"better-auth\")}}\n\t\tNEXT_PUBLIC_CONVEX_SITE_URL: process.env.NEXT_PUBLIC_CONVEX_SITE_URL,\n{{/if}}\n{{#if (eq auth \"clerk\")}}\n\t\tNEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,\n{{/if}}\n\t},\n{{else if (includes frontend \"nuxt\")}}\n\tclient: {\n\t\tNUXT_PUBLIC_CONVEX_URL: z.url(),\n\t},\n{{else if (includes frontend \"svelte\")}}\n\tclientPrefix: \"PUBLIC_\",\n\tclient: {\n\t\tPUBLIC_CONVEX_URL: z.url(),\n\t},\n\truntimeEnv: (import.meta as any).env,\n{{else}}\n\tclientPrefix: \"VITE_\",\n\tclient: {\n\t\tVITE_CONVEX_URL: z.url(),\n{{#if (eq auth \"better-auth\")}}\n\t\tVITE_CONVEX_SITE_URL: z.url(),\n{{/if}}\n{{#if (eq auth \"clerk\")}}\n\t\tVITE_CLERK_PUBLISHABLE_KEY: z.string().min(1),\n{{/if}}\n\t},\n\truntimeEnv: (import.meta as any).env,\n{{/if}}\n{{else if (eq backend \"self\")}}\n{{#if (includes frontend \"next\")}}\n\tclient: {},\n\truntimeEnv: {},\n{{else}}\n\tclientPrefix: \"VITE_\",\n\tclient: {},\n\truntimeEnv: (import.meta as any).env,\n{{/if}}\n{{else if (ne backend \"none\")}}\n{{#if (includes frontend \"next\")}}\n\tclient: {\n\t\tNEXT_PUBLIC_SERVER_URL: z.url(),\n\t},\n\truntimeEnv: {\n\t\tNEXT_PUBLIC_SERVER_URL: process.env.NEXT_PUBLIC_SERVER_URL,\n\t},\n{{else if (includes frontend \"nuxt\")}}\n\tclient: {\n\t\tNUXT_PUBLIC_SERVER_URL: z.url(),\n\t},\n{{else if (includes frontend \"svelte\")}}\n\tclientPrefix: \"PUBLIC_\",\n\tclient: {\n\t\tPUBLIC_SERVER_URL: z.url(),\n\t},\n\truntimeEnv: (import.meta as any).env,\n{{else}}\n\tclientPrefix: \"VITE_\",\n\tclient: {\n\t\tVITE_SERVER_URL: z.url(),\n\t},\n\truntimeEnv: (import.meta as any).env,\n{{/if}}\n{{/if}}\n\temptyStringAsUndefined: true,\n});`],\n [\"db-setup/docker-compose/postgres/docker-compose.yml.hbs\", `name: {{projectName}}\n\nservices:\n postgres:\n image: postgres\n container_name: {{projectName}}-postgres\n environment:\n POSTGRES_DB: {{projectName}}\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: password\n ports:\n - \"5432:5432\"\n volumes:\n - {{projectName}}_postgres_data:/var/lib/postgresql\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n interval: 10s\n timeout: 5s\n retries: 5\n restart: unless-stopped\n\nvolumes:\n {{projectName}}_postgres_data:`],\n [\"db-setup/docker-compose/mongodb/docker-compose.yml.hbs\", `name: {{projectName}}\n\nservices:\n mongodb:\n image: mongo\n container_name: {{projectName}}-mongodb\n environment:\n MONGO_INITDB_ROOT_USERNAME: root\n MONGO_INITDB_ROOT_PASSWORD: password\n MONGO_INITDB_DATABASE: {{projectName}}\n ports:\n - \"27017:27017\"\n volumes:\n - {{projectName}}_mongodb_data:/data/db\n healthcheck:\n test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"]\n interval: 10s\n timeout: 5s\n retries: 5\n restart: unless-stopped\n\nvolumes:\n {{projectName}}_mongodb_data:`],\n [\"db-setup/docker-compose/mysql/docker-compose.yml.hbs\", `name: {{projectName}}\n\nservices:\n mysql:\n image: mysql\n container_name: {{projectName}}-mysql\n environment:\n MYSQL_ROOT_PASSWORD: password\n MYSQL_DATABASE: {{projectName}}\n MYSQL_USER: user\n MYSQL_PASSWORD: password\n ports:\n - \"3306:3306\"\n volumes:\n - {{projectName}}_mysql_data:/var/lib/mysql\n healthcheck:\n test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\n interval: 10s\n timeout: 5s\n retries: 5\n restart: unless-stopped\n\nvolumes:\n {{projectName}}_mysql_data:`],\n [\"frontend/svelte/static/favicon.png\", `[Binary file]`],\n [\"frontend/svelte/src/app.html\", `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"%sveltekit.assets%/favicon.png\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n %sveltekit.head%\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">%sveltekit.body%</div>\n </body>\n</html>\n`],\n [\"frontend/svelte/src/app.d.ts\", `// See https://svelte.dev/docs/kit/types#app.d.ts\n// for information about these interfaces\ndeclare global {\n namespace App {\n // interface Error {}\n // interface Locals {}\n // interface PageData {}\n // interface PageState {}\n // interface Platform {}\n }\n}\n\nexport {};\n`],\n [\"frontend/svelte/src/app.css\", `@import \"tailwindcss\";\n\nbody {\n @apply bg-neutral-950 text-neutral-100;\n}\n`],\n [\"frontend/react/tanstack-start/tsconfig.json.hbs\", `{\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"jsx\": \"react-jsx\",\n \"module\": \"ESNext\",\n \"lib\": [\"ES2022\", \"DOM\", \"DOM.Iterable\"],\n \"types\": [\"vite/client\"],\n\n /* Bundler mode */\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"verbatimModuleSyntax\": true,\n \"noEmit\": true,\n\n /* Linting */\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedSideEffectImports\": true,\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n }\n}\n`],\n [\"frontend/react/tanstack-start/package.json.hbs\", `{\n \"name\": \"web\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"vite build\",\n \"serve\": \"vite preview\",\n \"dev\": \"vite dev\"\n },\n \"dependencies\": {\n \"@base-ui/react\": \"^1.0.0\",\n \"shadcn\": \"^3.6.2\",\n \"@tanstack/react-form\": \"^1.23.5\",\n \"@tailwindcss/vite\": \"^4.1.8\",\n \"@tanstack/react-query\": \"^5.80.6\",\n \"@tanstack/react-router\": \"^1.141.1\",\n \"@tanstack/react-router-with-query\": \"^1.130.17\",\n \"@tanstack/react-start\": \"^1.141.1\",\n \"@tanstack/router-plugin\": \"^1.141.1\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"lucide-react\": \"^0.525.0\",\n \"next-themes\": \"^0.4.6\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"sonner\": \"^2.0.3\",\n \"tailwindcss\": \"^4.1.3\",\n \"tailwind-merge\": \"^3.3.1\",\n \"tw-animate-css\": \"^1.2.5\",\n \"vite-tsconfig-paths\": \"^5.1.4\"\n },\n \"devDependencies\": {\n \"@tanstack/react-router-devtools\": \"^1.141.1\",\n \"@testing-library/dom\": \"^10.4.0\",\n \"@testing-library/react\": \"^16.2.0\",\n \"@types/react\": \"19.2.7\",\n \"@types/react-dom\": \"19.2.3\",\n \"@vitejs/plugin-react\": \"^5.0.4\",\n \"jsdom\": \"^26.0.0\",\n \"vite\": \"^7.0.2\",\n \"web-vitals\": \"^5.0.3\"\n }\n}\n`],\n [\"frontend/react/tanstack-start/vite.config.ts.hbs\", `import { defineConfig } from \"vite\";\nimport tsconfigPaths from \"vite-tsconfig-paths\";\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\";\nimport tailwindcss from \"@tailwindcss/vite\";\nimport viteReact from \"@vitejs/plugin-react\";\n\nexport default defineConfig({\n plugins: [\n tsconfigPaths(),\n tailwindcss(),\n tanstackStart(),\n viteReact(),\n ],\n server: {\n port: 3001,\n },\n{{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n ssr: {\n noExternal: [\"@convex-dev/better-auth\"],\n },\n{{/if}}\n});\n`],\n [\"frontend/react/tanstack-router/tsconfig.json.hbs\", `{\n \"compilerOptions\": {\n \"strict\": true,\n \"esModuleInterop\": true,\n \"jsx\": \"react-jsx\",\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"verbatimModuleSyntax\": true,\n \"skipLibCheck\": true,\n \"types\": [\"vite/client\"],\n \"rootDirs\": [\".\"],\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n }\n}\n`],\n [\"frontend/react/tanstack-router/index.html.hbs\", `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>{{projectName}}</title>\n </head>\n\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`],\n [\"frontend/react/tanstack-router/package.json.hbs\", `{\n\t\"name\": \"web\",\n\t\"version\": \"0.0.0\",\n\t\"private\": true,\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"vite build\",\n\t\t\"serve\": \"vite preview\",\n\t\t\"start\": \"vite\",\n\t\t\"check-types\": \"tsc --noEmit\"\n\t},\n\t\"dependencies\": {\n \"@hookform/resolvers\": \"^5.1.1\",\n \"@base-ui/react\": \"^1.0.0\",\n \"shadcn\": \"^3.6.2\",\n \"@tanstack/react-form\": \"^1.12.3\",\n\t\t\"@tailwindcss/vite\": \"^4.0.15\",\n\t\t\"@tanstack/react-router\": \"^1.141.1\",\n\t\t\"class-variance-authority\": \"^0.7.1\",\n\t\t\"clsx\": \"^2.1.1\",\n\t\t\"lucide-react\": \"^0.473.0\",\n \"next-themes\": \"^0.4.6\",\n\t\t\"react\": \"19.2.3\",\n\t\t\"react-dom\": \"19.2.3\",\n \"sonner\": \"^2.0.5\",\n\t\t\"tailwind-merge\": \"^3.3.1\",\n\t\t\"tw-animate-css\": \"^1.2.5\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@tanstack/react-router-devtools\": \"^1.141.1\",\n\t\t\"@tanstack/router-plugin\": \"^1.141.1\",\n\t\t\"@types/node\": \"^22.13.14\",\n\t\t\"@types/react\": \"19.2.7\",\n\t\t\"@types/react-dom\": \"19.2.3\",\n\t\t\"@vitejs/plugin-react\": \"^4.3.4\",\n\t\t\"postcss\": \"^8.5.3\",\n\t\t\"tailwindcss\": \"^4.0.15\",\n\t\t\"vite\": \"^6.2.2\"\n\t}\n}\n`],\n [\"frontend/react/tanstack-router/vite.config.ts.hbs\", `import tailwindcss from \"@tailwindcss/vite\";\nimport { tanstackRouter } from \"@tanstack/router-plugin/vite\";\nimport react from \"@vitejs/plugin-react\";\nimport path from \"node:path\";\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig({\n plugins: [\n tailwindcss(),\n tanstackRouter({}),\n react(),\n ],\n resolve: {\n alias: {\n \"@\": path.resolve(__dirname, \"./src\"),\n },\n },\n server: {\n port: 3001,\n },\n});`],\n [\"frontend/react/react-router/tsconfig.json.hbs\", `{\n \"include\": [\n \"**/*\",\n \"**/.server/**/*\",\n \"**/.client/**/*\",\n \".react-router/types/**/*\"\n ],\n \"compilerOptions\": {\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n \"types\": [\"node\", \"vite/client\"],\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"moduleResolution\": \"bundler\",\n \"jsx\": \"react-jsx\",\n \"rootDirs\": [\".\", \"./.react-router/types\"],\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n },\n \"esModuleInterop\": true,\n \"verbatimModuleSyntax\": true,\n \"noEmit\": true,\n \"resolveJsonModule\": true,\n \"skipLibCheck\": true,\n \"strict\": true\n }\n}\n`],\n [\"frontend/react/react-router/package.json.hbs\", `{\n \"name\": \"web\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"react-router build\",\n \"dev\": \"react-router dev\",\n \"start\": \"react-router-serve ./build/server/index.js\",\n \"typecheck\": \"react-router typegen && tsc\"\n },\n \"dependencies\": {\n \"@base-ui/react\": \"^1.0.0\",\n \"shadcn\": \"^3.6.2\",\n \"@react-router/fs-routes\": \"^7.10.1\",\n \"@react-router/node\": \"^7.10.1\",\n \"@react-router/serve\": \"^7.10.1\",\n \"@tanstack/react-form\": \"^1.27.3\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"isbot\": \"^5.1.28\",\n \"lucide-react\": \"^0.511.0\",\n \"next-themes\": \"^0.4.6\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"react-router\": \"^7.10.1\",\n \"sonner\": \"^2.0.3\",\n \"tailwind-merge\": \"^3.3.0\",\n \"tw-animate-css\": \"^1.3.2\"\n },\n \"devDependencies\": {\n \"@react-router/dev\": \"^7.10.1\",\n \"@tailwindcss/vite\": \"^4.1.18\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"~19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n \"react-router-devtools\": \"^1.1.0\",\n \"tailwindcss\": \"^4.1.18\",\n \"typescript\": \"^5.8.3\",\n \"vite\": \"^7.2.7\",\n \"vite-tsconfig-paths\": \"^5.1.4\"\n }\n}\n`],\n [\"frontend/react/react-router/vite.config.ts.hbs\", `import { reactRouter } from \"@react-router/dev/vite\";\nimport tailwindcss from \"@tailwindcss/vite\";\nimport { defineConfig } from \"vite\";\nimport tsconfigPaths from \"vite-tsconfig-paths\";\n\nexport default defineConfig({\n plugins: [\n tailwindcss(),\n reactRouter(),\n tsconfigPaths(),\n ],\n});`],\n [\"frontend/react/react-router/react-router.config.ts\", `import type { Config } from \"@react-router/dev/config\";\n\nexport default {\n ssr: false,\n appDirectory: \"src\",\n} satisfies Config;\n`],\n [\"frontend/react/web-base/_gitignore\", `# Dependencies\n/node_modules\n/.pnp\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n\n# Testing\n/coverage\n\n# Build outputs\n/.next/\n/out/\n/build/\n/dist/\n.vinxi\n.output\n.react-router/\n.tanstack/\n.nitro/\n\n# Deployment\n.vercel\n.netlify\n.wrangler\n.alchemy\n\n# Environment & local files\n.env*\n!.env.example\n.DS_Store\n*.pem\n*.local\n\n# Logs\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n*.log*\n\n# TypeScript\n*.tsbuildinfo\nnext-env.d.ts\n\n# IDE\n.vscode/*\n!.vscode/extensions.json\n.idea\n\n# Other\ndev-dist\n\n.wrangler\n.dev.vars*\n\n.open-next\n`],\n [\"frontend/react/web-base/components.json\", `{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"base-lyra\",\n \"rsc\": false,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"src/index.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true,\n \"prefix\": \"\"\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@/components\",\n \"utils\": \"@/lib/utils\",\n \"ui\": \"@/components/ui\",\n \"lib\": \"@/lib\",\n \"hooks\": \"@/hooks\"\n },\n \"menuColor\": \"default\",\n \"menuAccent\": \"subtle\",\n \"registries\": {}\n}\n`],\n [\"frontend/react/next/postcss.config.mjs.hbs\", `const config = {\n plugins: [\"@tailwindcss/postcss\"],\n};\n\nexport default config;\n`],\n [\"frontend/react/next/tsconfig.json.hbs\", `{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"verbatimModuleSyntax\": true,\n \"jsx\": \"preserve\",\n \"incremental\": true,\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }{{#if (or (eq serverDeploy \"cloudflare\") (eq webDeploy \"cloudflare\"))}},\n \"types\": [\n \"@cloudflare/workers-types\"\n ]{{/if}}\n },\n \"include\": [\n {{#if (eq serverDeploy \"cloudflare\")}}\n \"../server/env.d.ts\",\n {{/if}}\n \"./next-env.d.ts\",\n \"./**/*.ts\",\n \"./**/*.tsx\",\n \"./.next/types/**/*.ts\"\n ],\n \"exclude\": [\n \"./node_modules\"\n ]\n}\n`],\n [\"frontend/react/next/package.json.hbs\", `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3001\",\n \"build\": \"next build\",\n \"start\": \"next start\"\n },\n \"dependencies\": {\n \"@base-ui/react\": \"^1.0.0\",\n \"shadcn\": \"^3.6.2\",\n \"@tanstack/react-form\": \"^1.27.3\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"lucide-react\": \"^0.546.0\",\n \"next\": \"^16.1.1\",\n \"next-themes\": \"^0.4.6\",\n \"react\": \"^19.2.3\",\n \"react-dom\": \"^19.2.3\",\n \"sonner\": \"^2.0.5\",\n \"tailwind-merge\": \"^3.3.1\",\n \"tw-animate-css\": \"^1.3.4\",\n \"babel-plugin-react-compiler\": \"^1.0.0\"\n },\n \"devDependencies\": {\n \"@tailwindcss/postcss\": \"^4.1.10\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n \"tailwindcss\": \"^4.1.10\",\n \"typescript\": \"^5\"\n }\n}\n`],\n [\"frontend/react/next/next.config.ts.hbs\", `import \"@{{projectName}}/env/web\";\n{{#if (eq webDeploy \"cloudflare\")}}\nimport { initOpenNextCloudflareForDev } from \"@opennextjs/cloudflare\";\n{{/if}}\nimport type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n\ttypedRoutes: true,\n\treactCompiler: true,\n\t{{#if (includes examples \"ai\")}}\n\ttranspilePackages: [\"shiki\"],\n\t{{/if}}\n\t{{#if (eq dbSetup \"turso\")}}\n\tserverExternalPackages: [\"libsql\", \"@libsql/client\"],\n\t{{/if}}\n};\n\nexport default nextConfig;\n\n{{#if (eq webDeploy \"cloudflare\")}}\ninitOpenNextCloudflareForDev();\n{{/if}}\n`],\n [\"frontend/react/next/next-env.d.ts.hbs\", `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n`],\n [\"frontend/nuxt/server/tsconfig.json\", `{\n \"extends\": \"../.nuxt/tsconfig.server.json\"\n}\n`],\n [\"frontend/nuxt/app/app.config.ts.hbs\", `export default defineAppConfig({\n // https://ui.nuxt.com/getting-started/theme#design-system\n ui: {\n colors: {\n primary: 'emerald',\n neutral: 'neutral',\n },\n button: {\n defaultVariants: {\n // Set default button color to neutral\n // color: 'neutral'\n }\n }\n }\n})\n`],\n [\"frontend/nuxt/app/app.vue.hbs\", `<script setup lang=\"ts\">\n{{#if (eq api \"orpc\")}}\nimport { VueQueryDevtools } from '@tanstack/vue-query-devtools'\n{{/if}}\n</script>\n\n<template>\n <NuxtLoadingIndicator />\n <UApp>\n <NuxtLayout>\n <NuxtPage />\n </NuxtLayout>\n </UApp>\n {{#if (eq api \"orpc\")}}\n <VueQueryDevtools />\n {{/if}}\n</template>\n`],\n [\"frontend/nuxt/public/robots.txt\", `User-Agent: *\nDisallow:\n`],\n [\"frontend/nuxt/public/favicon.ico\", `[Binary file]`],\n [\"frontend/solid/public/robots.txt\", `# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n`],\n [\"frontend/solid/src/styles.css\", `@import \"tailwindcss\";\n\nbody {\n @apply bg-neutral-950 text-neutral-100;\n}\n`],\n [\"frontend/solid/src/main.tsx.hbs\", `import { RouterProvider, createRouter } from \"@tanstack/solid-router\";\nimport { render } from \"solid-js/web\";\nimport { routeTree } from \"./routeTree.gen\";\nimport \"./styles.css\";\n{{#if (eq api \"orpc\")}}\nimport { QueryClientProvider } from \"@tanstack/solid-query\";\nimport { orpc, queryClient } from \"./utils/orpc\";\n{{/if}}\n\nconst router = createRouter({\n routeTree,\n defaultPreload: \"intent\",\n scrollRestoration: true,\n defaultPreloadStaleTime: 0,\n {{#if (eq api \"orpc\")}}\n context: { orpc, queryClient },\n {{/if}}\n});\n\ndeclare module \"@tanstack/solid-router\" {\n interface Register {\n router: typeof router;\n }\n}\n\nfunction App() {\n return (\n {{#if (eq api \"orpc\")}}\n <QueryClientProvider client={queryClient}>\n {{/if}}\n <RouterProvider router={router} />\n {{#if (eq api \"orpc\")}}\n </QueryClientProvider>\n {{/if}}\n );\n}\n\nconst rootElement = document.getElementById(\"app\");\nif (rootElement) {\n render(() => <App />, rootElement);\n}\n`],\n [\"frontend/native/uniwind/tsconfig.json.hbs\", `{\n \"extends\": \"expo/tsconfig.base\",\n \"compilerOptions\": {\n \"strict\": true,\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\n \"**/*.ts\",\n \"**/*.tsx\"\n ]\n}`],\n [\"frontend/native/uniwind/global.css\", `@import \"tailwindcss\";\n@import \"uniwind\";\n@import \"heroui-native/styles\";\n\n@source './node_modules/heroui-native/lib';\n`],\n [\"frontend/native/uniwind/package.json.hbs\", `{\n \"name\": \"native\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"main\": \"expo-router/entry\",\n \"scripts\": {\n \"start\": \"expo start\",\n \"dev\": \"expo start --clear\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"prebuild\": \"expo prebuild\",\n \"web\": \"expo start --web\"\n },\n \"dependencies\": {\n \"@expo/metro-runtime\": \"~6.1.2\",\n \"@expo/vector-icons\": \"^15.0.3\",\n \"@gorhom/bottom-sheet\": \"^5\",\n \"@react-navigation/drawer\": \"^7.3.9\",\n \"@react-navigation/elements\": \"^2.8.1\",\n {{#if (includes examples \"ai\")}}\n \"@stardazed/streams-text-encoding\": \"^1.0.2\",\n \"@ungap/structured-clone\": \"^1.3.0\",\n {{/if}}\n \"expo\": \"^54.0.23\",\n \"expo-constants\": \"~18.0.10\",\n \"expo-font\": \"~14.0.9\",\n \"expo-haptics\": \"^15.0.7\",\n \"expo-linking\": \"~8.0.8\",\n \"expo-network\": \"~8.0.7\",\n \"expo-router\": \"~6.0.14\",\n \"expo-secure-store\": \"~15.0.7\",\n \"expo-status-bar\": \"~3.0.8\",\n \"heroui-native\": \"^1.0.0-beta.9\",\n \"react\": \"19.1.0\",\n \"react-dom\": \"19.1.0\",\n \"react-native\": \"0.81.5\",\n \"react-native-gesture-handler\": \"^2.28.0\",\n \"react-native-keyboard-controller\": \"1.18.5\",\n \"react-native-reanimated\": \"~4.1.1\",\n \"react-native-safe-area-context\": \"~5.6.0\",\n \"react-native-screens\": \"~4.16.0\",\n \"react-native-svg\": \"15.12.1\",\n \"react-native-web\": \"^0.21.0\",\n \"react-native-worklets\": \"0.5.1\",\n \"tailwind-merge\": \"^3.4.0\",\n \"tailwind-variants\": \"^3.2.2\",\n \"tailwindcss\": \"^4.1.18\",\n \"uniwind\": \"^1.2.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.10.0\",\n \"@types/react\": \"~19.1.0\"\n }\n}`],\n [\"frontend/native/uniwind/_gitignore\", `node_modules/\n.expo/\ndist/\nnpm-debug.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n*.orig.*\nweb-build/\n\n# macOS\n.DS_Store\n\n# Temporary files created by Metro to check the health of the file watcher\n.metro-health-check*\n\n# UniWind generated types\nuniwind-types.d.ts\n\n`],\n [\"frontend/native/uniwind/app.json.hbs\", `{\n \"expo\": {\n \"scheme\": \"{{projectName}}\",\n \"userInterfaceStyle\": \"automatic\",\n \"orientation\": \"default\",\n \"web\": {\n \"bundler\": \"metro\"\n },\n \"name\": \"{{projectName}}\",\n \"slug\": \"{{projectName}}\",\n \"plugins\": [\n \"expo-font\"\n ],\n \"experiments\": {\n \"typedRoutes\": true,\n \"reactCompiler\": true\n }\n }\n}\n`],\n [\"frontend/native/uniwind/metro.config.js.hbs\", `const { getDefaultConfig } = require(\"expo/metro-config\");\nconst { withUniwindConfig } = require(\"uniwind/metro\");\n\n/** @type {import('expo/metro-config').MetroConfig} */\nconst config = getDefaultConfig(__dirname);\n\nconst uniwindConfig = withUniwindConfig(config, {\n cssEntryFile: \"./global.css\",\n dtsFile: \"./uniwind-types.d.ts\",\n});\n\nmodule.exports = uniwindConfig;\n\n`],\n [\"frontend/native/unistyles/babel.config.js.hbs\", `module.exports = (api) => {\n\tapi.cache(true);\n\tconst plugins = [];\n\n\tplugins.push([\n\t\t\"react-native-unistyles/plugin\",\n\t\t{\n\t\t\troot: \"src\",\n\t\t\tautoProcessRoot: \"app\",\n\t\t\tautoProcessImports: [\"@/components\"],\n\t\t},\n\t]);\n\n\tplugins.push(\"react-native-worklets/plugin\");\n\n\treturn {\n\t\tpresets: [\"babel-preset-expo\"],\n\n\t\tplugins,\n\t};\n};\n`],\n [\"frontend/native/unistyles/tsconfig.json.hbs\", `{\n \"extends\": \"expo/tsconfig.base\",\n \"compilerOptions\": {\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"*\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\", \".expo/types/**/*.ts\", \"expo-env.d.ts\"]\n}\n`],\n [\"frontend/native/unistyles/package.json.hbs\", `{\n \"name\": \"native\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"main\": \"index.js\",\n \"scripts\": {\n \"dev\": \"expo start --clear\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"web\": \"expo start --web\"\n },\n \"dependencies\": {\n \"@expo/vector-icons\": \"^15.0.2\",\n \"@react-navigation/bottom-tabs\": \"^7.3.10\",\n \"@react-navigation/drawer\": \"^7.3.9\",\n \"@react-navigation/native\": \"^7.1.6\",\n {{#if (includes examples \"ai\")}}\n \"@stardazed/streams-text-encoding\": \"^1.0.2\",\n \"@ungap/structured-clone\": \"^1.3.0\",\n {{/if}}\n \"@tanstack/react-form\": \"^1.0.5\",\n \"expo\": \"^54.0.0\",\n \"expo-constants\": \"~18.0.8\",\n \"expo-crypto\": \"~15.0.6\",\n \"expo-linking\": \"~8.0.7\",\n \"expo-router\": \"~6.0.0\",\n \"expo-secure-store\": \"~15.0.6\",\n \"expo-splash-screen\": \"~31.0.8\",\n\t\t\"expo-status-bar\": \"^3.0.7\",\n \"expo-system-ui\": \"~6.0.7\",\n\t\t\"expo-dev-client\": \"~6.0.11\",\n \"expo-web-browser\": \"~15.0.6\",\n \"react\": \"19.1.0\",\n \"react-dom\": \"19.1.0\",\n \"react-native\": \"0.81.4\",\n\t\t\"react-native-edge-to-edge\": \"^1.7.0\",\n \"react-native-gesture-handler\": \"~2.28.0\",\n\t\t\"react-native-nitro-modules\": \"^0.29.4\",\n \"react-native-reanimated\": \"~4.1.0\",\n \"react-native-safe-area-context\": \"~5.6.0\",\n \"react-native-screens\": \"~4.16.0\",\n\t\t\"react-native-unistyles\": \"^3.0.12\",\n \"react-native-web\": \"^0.21.0\",\n \"react-native-worklets\": \"^0.5.1\"\n },\n \"devDependencies\": {\n \"ajv\": \"^8.17.1\",\n \"@babel/core\": \"^7.28.0\",\n \"@types/react\": \"~19.1.10\"\n }\n}\n`],\n [\"frontend/native/unistyles/_gitignore\", `node_modules/\n.expo/\ndist/\nnpm-debug.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n*.orig.*\nweb-build/\n# expo router\nexpo-env.d.ts\n\n.env\n\nios\nandroid\n\n# macOS\n.DS_Store\n\n# Temporary files created by Metro to check the health of the file watcher\n.metro-health-check*`],\n [\"frontend/native/unistyles/breakpoints.ts.hbs\", `export const breakpoints = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n superLarge: 2000,\n tvLike: 4000,\n} as const;\n`],\n [\"frontend/native/unistyles/theme.ts.hbs\", `const sharedColors = {\n success: \"#22C55E\",\n destructive: \"#EF4444\",\n warning: \"#F59E0B\",\n info: \"#3B82F6\",\n} as const;\n\nexport const lightTheme = {\n colors: {\n ...sharedColors,\n typography: \"hsl(0 0% 0%)\",\n background: \"hsl(0 0% 100%)\",\n foreground: \"hsl(0 0% 0%)\",\n card: \"hsl(0 0% 98%)\",\n cardForeground: \"hsl(0 0% 0%)\",\n primary: \"hsl(0 0% 10%)\",\n primaryForeground: \"hsl(0 0% 100%)\",\n secondary: \"hsl(0 0% 95%)\",\n secondaryForeground: \"hsl(0 0% 0%)\",\n muted: \"hsl(0 0% 96%)\",\n mutedForeground: \"hsl(0 0% 45%)\",\n accent: \"hsl(0 0% 96%)\",\n accentForeground: \"hsl(0 0% 0%)\",\n border: \"hsl(0 0% 90%)\",\n input: \"hsl(0 0% 90%)\",\n ring: \"hsl(0 0% 20%)\",\n },\n spacing: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n xxl: 48,\n },\n borderRadius: {\n sm: 6,\n md: 8,\n lg: 12,\n xl: 16,\n },\n fontSize: {\n xs: 12,\n sm: 14,\n base: 16,\n lg: 18,\n xl: 20,\n \"2xl\": 24,\n \"3xl\": 30,\n \"4xl\": 36,\n },\n} as const;\n\nexport const darkTheme = {\n colors: {\n ...sharedColors,\n typography: \"hsl(0 0% 100%)\",\n background: \"hsl(0 0% 0%)\",\n foreground: \"hsl(0 0% 100%)\",\n card: \"hsl(0 0% 2%)\",\n cardForeground: \"hsl(0 0% 100%)\",\n primary: \"hsl(0 0% 90%)\",\n primaryForeground: \"hsl(0 0% 0%)\",\n secondary: \"hsl(0 0% 10%)\",\n secondaryForeground: \"hsl(0 0% 100%)\",\n muted: \"hsl(0 0% 8%)\",\n mutedForeground: \"hsl(0 0% 65%)\",\n accent: \"hsl(0 0% 8%)\",\n accentForeground: \"hsl(0 0% 100%)\",\n border: \"hsl(0 0% 15%)\",\n input: \"hsl(0 0% 15%)\",\n ring: \"hsl(0 0% 80%)\",\n },\n spacing: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n xxl: 48,\n },\n borderRadius: {\n sm: 6,\n md: 8,\n lg: 12,\n xl: 16,\n },\n fontSize: {\n xs: 12,\n sm: 14,\n base: 16,\n lg: 18,\n xl: 20,\n \"2xl\": 24,\n \"3xl\": 30,\n \"4xl\": 36,\n },\n} as const;\n`],\n [\"frontend/native/unistyles/app.json.hbs\", `{\n \"expo\": {\n \"name\": \"{{projectName}}\",\n \"slug\": \"{{projectName}}\",\n \"version\": \"1.0.0\",\n \"orientation\": \"portrait\",\n \"icon\": \"./assets/images/icon.png\",\n \"scheme\": \"mybettertapp\",\n \"userInterfaceStyle\": \"automatic\",\n \"newArchEnabled\": true,\n \"ios\": {\n \"supportsTablet\": true\n },\n \"android\": {\n \"adaptiveIcon\": {\n \"backgroundColor\": \"#E6F4FE\",\n \"foregroundImage\": \"./assets/images/android-icon-foreground.png\",\n \"backgroundImage\": \"./assets/images/android-icon-background.png\",\n \"monochromeImage\": \"./assets/images/android-icon-monochrome.png\"\n },\n \"edgeToEdgeEnabled\": true,\n \"predictiveBackGestureEnabled\": false,\n \"package\": \"com.anonymous.mybettertapp\"\n },\n \"web\": {\n \"output\": \"static\",\n \"favicon\": \"./assets/images/favicon.png\"\n },\n \"plugins\": [\n \"expo-router\",\n [\n \"expo-splash-screen\",\n {\n \"image\": \"./assets/images/splash-icon.png\",\n \"imageWidth\": 200,\n \"resizeMode\": \"contain\",\n \"backgroundColor\": \"#ffffff\",\n \"dark\": {\n \"backgroundColor\": \"#000000\"\n }\n }\n ]\n ],\n \"experiments\": {\n \"typedRoutes\": true,\n \"reactCompiler\": true\n }\n }\n}\n`],\n [\"frontend/native/unistyles/index.js.hbs\", `import 'expo-router/entry';\nimport './unistyles';\n`],\n [\"frontend/native/unistyles/metro.config.js.hbs\", `const { getDefaultConfig } = require(\"expo/metro-config\");\n\nconst config = getDefaultConfig(__dirname);\n\nmodule.exports = config;\n`],\n [\"frontend/native/unistyles/unistyles.ts.hbs\", `import { StyleSheet } from \"react-native-unistyles\";\n\nimport { breakpoints } from \"./breakpoints\";\nimport { darkTheme, lightTheme } from \"./theme\";\n\ntype AppBreakpoints = typeof breakpoints;\n\ntype AppThemes = {\n light: typeof lightTheme;\n dark: typeof darkTheme;\n};\n\ndeclare module \"react-native-unistyles\" {\n export interface UnistylesBreakpoints extends AppBreakpoints {}\n export interface UnistylesThemes extends AppThemes {}\n}\n\nStyleSheet.configure({\n breakpoints,\n themes: {\n light: lightTheme,\n dark: darkTheme,\n },\n settings: {\n adaptiveThemes: true,\n },\n});\n`],\n [\"frontend/native/bare/tsconfig.json.hbs\", `{\n\t\"extends\": \"expo/tsconfig.base\",\n\t\"compilerOptions\": {\n\t\t\"strict\": true,\n\t\t\"paths\": {\n\t\t\t\"@/*\": [\"./*\"]\n\t\t}\n\t},\n\t\"include\": [\"**/*.ts\", \"**/*.tsx\", \".expo/types/**/*.ts\", \"expo-env.d.ts\"]\n}\n\n`],\n [\"frontend/native/bare/package.json.hbs\", `{\n \"name\": \"native\",\n \"version\": \"1.0.0\",\n \"main\": \"expo-router/entry\",\n \"scripts\": {\n \"dev\": \"expo start --clear\",\n \"android\": \"expo run:android\",\n \"ios\": \"expo run:ios\",\n \"prebuild\": \"expo prebuild\",\n \"web\": \"expo start --web\"\n },\n \"dependencies\": {\n \"@expo/vector-icons\": \"^15.0.2\",\n \"@react-navigation/bottom-tabs\": \"^7.2.0\",\n \"@react-navigation/drawer\": \"^7.1.1\",\n \"@react-navigation/native\": \"^7.0.14\",\n \"@tanstack/react-form\": \"^1.0.5\",\n \"@tanstack/react-query\": \"^5.85.5\",\n {{#if (includes examples \"ai\")}}\n \"@stardazed/streams-text-encoding\": \"^1.0.2\",\n \"@ungap/structured-clone\": \"^1.3.0\",\n {{/if}}\n\t\t\"expo\": \"^54.0.1\",\n \"expo-constants\": \"~18.0.8\",\n \"expo-crypto\": \"~15.0.6\",\n \"expo-linking\": \"~8.0.7\",\n \"expo-navigation-bar\": \"~5.0.8\",\n \"expo-network\": \"~8.0.7\",\n \"expo-router\": \"~6.0.0\",\n \"expo-secure-store\": \"~15.0.6\",\n \"expo-splash-screen\": \"~31.0.8\",\n \"expo-status-bar\": \"~3.0.7\",\n \"expo-system-ui\": \"~6.0.7\",\n \"expo-web-browser\": \"~15.0.6\",\n \"react\": \"19.1.0\",\n \"react-dom\": \"19.1.0\",\n \"react-native\": \"0.81.4\",\n \"react-native-gesture-handler\": \"~2.28.0\",\n \"react-native-reanimated\": \"~4.1.0\",\n \"react-native-safe-area-context\": \"~5.6.0\",\n \"react-native-screens\": \"~4.16.0\",\n \"react-native-web\": \"^0.21.0\",\n \"react-native-worklets\": \"^0.5.1\"\n },\n \"devDependencies\": {\n \"@babel/core\": \"^7.26.10\",\n \"@types/react\": \"~19.1.10\"\n },\n \"private\": true\n}\n\n`],\n [\"frontend/native/bare/_gitignore\", `node_modules/\n.expo/\ndist/\nnpm-debug.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n*.orig.*\nweb-build/\n\n# macOS\n.DS_Store\n\n# Temporary files created by Metro to check the health of the file watcher\n.metro-health-check*\n\n`],\n [\"frontend/native/bare/app.json.hbs\", `{\n\t\"expo\": {\n\t\t\"name\": \"{{projectName}}\",\n\t\t\"slug\": \"{{projectName}}\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"orientation\": \"portrait\",\n\t\t\"icon\": \"./assets/images/icon.png\",\n\t\t\"scheme\": \"mybettertapp\",\n\t\t\"userInterfaceStyle\": \"automatic\",\n\t\t\"newArchEnabled\": true,\n\t\t\"ios\": {\n\t\t\t\"supportsTablet\": true\n\t\t},\n\t\t\"android\": {\n\t\t\t\"adaptiveIcon\": {\n\t\t\t\t\"backgroundColor\": \"#E6F4FE\",\n\t\t\t\t\"foregroundImage\": \"./assets/images/android-icon-foreground.png\",\n\t\t\t\t\"backgroundImage\": \"./assets/images/android-icon-background.png\",\n\t\t\t\t\"monochromeImage\": \"./assets/images/android-icon-monochrome.png\"\n\t\t\t},\n\t\t\t\"edgeToEdgeEnabled\": true,\n\t\t\t\"predictiveBackGestureEnabled\": false,\n\t\t\t\"package\": \"com.anonymous.mybettertapp\"\n\t\t},\n\t\t\"web\": {\n\t\t\t\"output\": \"static\",\n\t\t\t\"favicon\": \"./assets/images/favicon.png\"\n\t\t},\n\t\t\"plugins\": [\n\t\t\t\"expo-router\",\n\t\t\t[\n\t\t\t\t\"expo-splash-screen\",\n\t\t\t\t{\n\t\t\t\t\t\"image\": \"./assets/images/splash-icon.png\",\n\t\t\t\t\t\"imageWidth\": 200,\n\t\t\t\t\t\"resizeMode\": \"contain\",\n\t\t\t\t\t\"backgroundColor\": \"#ffffff\",\n\t\t\t\t\t\"dark\": {\n\t\t\t\t\t\t\"backgroundColor\": \"#000000\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t],\n\t\t\"experiments\": {\n\t\t\t\"typedRoutes\": true,\n\t\t\t\"reactCompiler\": true\n\t\t}\n\t}\n}\n\n`],\n [\"frontend/native/bare/metro.config.js.hbs\", `// Learn more https://docs.expo.io/guides/customizing-metro\nconst { getDefaultConfig } = require(\"expo/metro-config\");\n\nconst config = getDefaultConfig(__dirname);\n\nconfig.resolver.unstable_enablePackageExports = true;\n\nmodule.exports = config;\n\n`],\n [\"db/mongoose/mongodb/src/index.ts.hbs\", `import mongoose from \"mongoose\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nawait mongoose.connect(env.DATABASE_URL).catch((error) => {\n\tconsole.log(\"Error connecting to database:\", error);\n});\n\nconst client = mongoose.connection.getClient().db(\"myDB\");\n\nexport { client };\n`],\n [\"db/drizzle/mysql/src/index.ts.hbs\", `{{#if (or (eq runtime \"bun\") (eq runtime \"node\") (eq runtime \"none\"))}}\nimport { env } from \"@{{projectName}}/env/server\";\nimport * as schema from \"./schema\";\n\n{{#if (eq dbSetup \"planetscale\")}}\nimport { drizzle } from \"drizzle-orm/planetscale-serverless\";\n\nexport const db = drizzle({\n\tconnection: {\n\t\thost: env.DATABASE_HOST,\n\t\tusername: env.DATABASE_USERNAME,\n\t\tpassword: env.DATABASE_PASSWORD,\n\t},\n\tschema,\n});\n{{else}}\nimport { drizzle } from \"drizzle-orm/mysql2\";\n\nexport const db = drizzle({\n\tconnection: {\n\t\turi: env.DATABASE_URL,\n\t},\n\tschema,\n});\n{{/if}}\n{{/if}}\n\n{{#if (eq runtime \"workers\")}}\nimport * as schema from \"./schema\";\n\n{{#if (eq dbSetup \"planetscale\")}}\nimport { drizzle } from \"drizzle-orm/planetscale-serverless\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nexport const db = drizzle({\n\tconnection: {\n\t\thost: env.DATABASE_HOST,\n\t\tusername: env.DATABASE_USERNAME,\n\t\tpassword: env.DATABASE_PASSWORD,\n\t},\n\tschema,\n});\n{{else}}\nimport { drizzle } from \"drizzle-orm/mysql2\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nexport const db = drizzle({\n\tconnection: {\n\t\turi: env.DATABASE_URL,\n\t},\n\tschema,\n});\n{{/if}}\n{{/if}}\n`],\n [\"db/drizzle/sqlite/src/index.ts.hbs\", `{{#if (or (eq runtime \"bun\") (eq runtime \"node\") (eq runtime \"none\"))}}\nimport { env } from \"@{{projectName}}/env/server\";\nimport * as schema from \"./schema\";\nimport { drizzle } from \"drizzle-orm/libsql\";\nimport { createClient } from \"@libsql/client\";\n\nconst client = createClient({\n\turl: env.DATABASE_URL,\n{{#if (eq dbSetup \"turso\")}}\n\tauthToken: env.DATABASE_AUTH_TOKEN,\n{{/if}}\n});\n\nexport const db = drizzle({ client, schema });\n{{/if}}\n\n{{#if (eq runtime \"workers\")}}\nimport * as schema from \"./schema\";\n\n{{#if (eq dbSetup \"d1\")}}\nimport { drizzle } from \"drizzle-orm/d1\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nexport const db = drizzle(env.DB, { schema });\n{{else}}\nimport { drizzle } from \"drizzle-orm/libsql\";\nimport { env } from \"@{{projectName}}/env/server\";\nimport { createClient } from \"@libsql/client\";\n\nconst client = createClient({\n\turl: env.DATABASE_URL || \"\",\n{{#if (eq dbSetup \"turso\")}}\n\tauthToken: env.DATABASE_AUTH_TOKEN,\n{{/if}}\n});\n\nexport const db = drizzle({ client, schema });\n{{/if}}\n{{/if}}\n`],\n [\"db/drizzle/postgres/src/index.ts.hbs\", `{{#if (or (eq runtime \"bun\") (eq runtime \"node\") (eq runtime \"none\"))}}\nimport { env } from \"@{{projectName}}/env/server\";\nimport * as schema from \"./schema\";\n\n{{#if (eq dbSetup \"neon\")}}\nimport { neon, neonConfig } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\nimport ws from \"ws\";\n\nneonConfig.webSocketConstructor = ws;\n\n// To work in edge environments (Cloudflare Workers, Vercel Edge, etc.), enable querying over fetch\n// neonConfig.poolQueryViaFetch = true\n\nconst sql = neon(env.DATABASE_URL);\nexport const db = drizzle(sql, { schema });\n{{else}}\nimport { drizzle } from \"drizzle-orm/node-postgres\";\n\nexport const db = drizzle(env.DATABASE_URL, { schema });\n{{/if}}\n{{/if}}\n\n{{#if (eq runtime \"workers\")}}\nimport * as schema from \"./schema\";\n\n{{#if (eq dbSetup \"neon\")}}\nimport { neon, neonConfig } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\nimport { env } from \"@{{projectName}}/env/server\";\nimport ws from \"ws\";\n\nneonConfig.webSocketConstructor = ws;\nneonConfig.poolQueryViaFetch = true;\n\nconst sql = neon(env.DATABASE_URL || \"\");\nexport const db = drizzle(sql, { schema });\n{{else}}\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nexport const db = drizzle(env.DATABASE_URL || \"\", { schema });\n{{/if}}\n{{/if}}`],\n [\"db/prisma/mysql/src/index.ts.hbs\", `{{#if (eq runtime \"workers\")}}\nimport { PrismaClient } from \"../prisma/generated/client\";\nimport { env } from \"@{{projectName}}/env/server\";\n\n{{#if (eq dbSetup \"planetscale\")}}\nimport { PrismaPlanetScale } from \"@prisma/adapter-planetscale\";\n\nconst adapter = new PrismaPlanetScale({ url: env.DATABASE_URL });\nconst prisma = new PrismaClient({ adapter });\n{{else}}\nimport { PrismaMariaDb } from \"@prisma/adapter-mariadb\";\n\nconst databaseUrl: string = env.DATABASE_URL;\nconst url: URL = new URL(databaseUrl);\nconst connectionConfig = {\n\thost: url.hostname,\n\tport: parseInt(url.port || \"3306\"),\n\tuser: url.username,\n\tpassword: url.password,\n\tdatabase: url.pathname.slice(1),\n};\n\nconst adapter = new PrismaMariaDb(connectionConfig);\nconst prisma = new PrismaClient({ adapter });\n{{/if}}\n\nexport default prisma;\n{{else}}\nimport { PrismaClient } from \"../prisma/generated/client\";\nimport { env } from \"@{{projectName}}/env/server\";\n\n{{#if (eq dbSetup \"planetscale\")}}\nimport { PrismaPlanetScale } from \"@prisma/adapter-planetscale\";\n\nconst adapter = new PrismaPlanetScale({ url: env.DATABASE_URL });\nconst prisma = new PrismaClient({ adapter });\n{{else}}\nimport { PrismaMariaDb } from \"@prisma/adapter-mariadb\";\n\nconst databaseUrl: string = env.DATABASE_URL;\nconst url: URL = new URL(databaseUrl);\nconst connectionConfig = {\n\thost: url.hostname,\n\tport: parseInt(url.port || \"3306\"),\n\tuser: url.username,\n\tpassword: url.password,\n\tdatabase: url.pathname.slice(1),\n};\n\nconst adapter = new PrismaMariaDb(connectionConfig);\nconst prisma = new PrismaClient({ adapter });\n{{/if}}\n\nexport default prisma;\n{{/if}}`],\n [\"db/prisma/mongodb/src/index.ts.hbs\", `import { PrismaClient } from \"../prisma/generated/client\";\n\nconst prisma = new PrismaClient();\n\nexport default prisma;\n`],\n [\"db/prisma/sqlite/src/index.ts.hbs\", `import { PrismaClient } from \"../prisma/generated/client\";\n\n{{#if (eq dbSetup \"d1\")}}\nimport { PrismaD1 } from \"@prisma/adapter-d1\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nconst adapter = new PrismaD1(env.DB);\nconst prisma = new PrismaClient({ adapter });\n\nexport default prisma;\n{{else}}\nimport { PrismaLibSql } from \"@prisma/adapter-libsql\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nconst adapter = new PrismaLibSql({\n\turl: env.DATABASE_URL,\n{{#if (eq dbSetup \"turso\")}}\n\tauthToken: env.DATABASE_AUTH_TOKEN || \"\",\n{{/if}}\n});\n\nconst prisma = new PrismaClient({ adapter });\n\nexport default prisma;\n{{/if}}`],\n [\"db/prisma/postgres/src/index.ts.hbs\", `{{#if (eq runtime \"workers\")}}\nimport { PrismaClient } from \"../prisma/generated/client\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq dbSetup \"neon\")}}\nimport { PrismaNeon } from \"@prisma/adapter-neon\";\nimport { neonConfig } from \"@neondatabase/serverless\";\n\nneonConfig.poolQueryViaFetch = true;\n\nconst prisma = new PrismaClient({\n\tadapter: new PrismaNeon({\n\t\tconnectionString: env.DATABASE_URL,\n\t}),\n});\n\n{{else if (eq dbSetup \"prisma-postgres\")}}\nimport { PrismaPg } from \"@prisma/adapter-pg\";\n\nconst adapter = new PrismaPg({\n\tconnectionString: env.DATABASE_URL,\n});\n\nconst prisma = new PrismaClient({ adapter });\n\n{{else}}\nimport { PrismaPg } from \"@prisma/adapter-pg\";\n\nconst adapter = new PrismaPg({ connectionString: env.DATABASE_URL });\nconst prisma = new PrismaClient({ adapter });\n\n{{/if}}\n\nexport default prisma;\n{{else}}\nimport { PrismaClient } from \"../prisma/generated/client\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq dbSetup \"neon\")}}\nimport { PrismaNeon } from \"@prisma/adapter-neon\";\nimport { neonConfig } from \"@neondatabase/serverless\";\nimport ws from \"ws\";\n\nneonConfig.webSocketConstructor = ws;\nneonConfig.poolQueryViaFetch = true;\n\nconst adapter = new PrismaNeon({\n\tconnectionString: env.DATABASE_URL,\n});\n\nconst prisma = new PrismaClient({ adapter });\n\n{{else if (eq dbSetup \"prisma-postgres\")}}\nimport { PrismaPg } from \"@prisma/adapter-pg\";\n\nconst adapter = new PrismaPg({\n\tconnectionString: env.DATABASE_URL,\n});\n\nconst prisma = new PrismaClient({ adapter });\n\n{{else}}\nimport { PrismaPg } from \"@prisma/adapter-pg\";\n\nconst adapter = new PrismaPg({ connectionString: env.DATABASE_URL });\nconst prisma = new PrismaClient({ adapter });\n\n{{/if}}\n\nexport default prisma;\n{{/if}}`],\n [\"api/orpc/server/src/index.ts.hbs\", `import { ORPCError, os } from \"@orpc/server\";\nimport type { Context } from \"./context\";\n\nexport const o = os.$context<Context>();\n\nexport const publicProcedure = o;\n\n{{#if (eq auth \"better-auth\")}}\nconst requireAuth = o.middleware(async ({ context, next }) => {\n if (!context.session?.user) {\n throw new ORPCError(\"UNAUTHORIZED\");\n }\n return next({\n context: {\n session: context.session,\n },\n });\n});\n\nexport const protectedProcedure = publicProcedure.use(requireAuth);\n{{/if}}\n`],\n [\"api/orpc/server/src/context.ts.hbs\", `{{#if (and (eq backend 'self') (includes frontend \"next\"))}}\nimport type { NextRequest } from \"next/server\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext(req: NextRequest) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: req.headers,\n });\n return {\n session,\n };\n{{else}}\n return {}\n{{/if}}\n}\n\n{{else if (and (eq backend 'self') (includes frontend \"tanstack-start\"))}}\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext({ req }: { req: Request }) {\n{{#if (eq auth \"better-auth\")}}\n\tconst session = await auth.api.getSession({\n\t\theaders: req.headers,\n\t});\n\treturn {\n\t\tsession,\n\t};\n{{else}}\n\treturn {};\n{{/if}}\n}\n\n{{else if (eq backend 'hono')}}\nimport type { Context as HonoContext } from \"hono\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport type CreateContextOptions = {\n context: HonoContext;\n};\n\nexport async function createContext({ context }: CreateContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: context.req.raw.headers,\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else if (eq backend 'elysia')}}\nimport type { Context as ElysiaContext } from \"elysia\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport type CreateContextOptions = {\n context: ElysiaContext;\n};\n\nexport async function createContext({ context }: CreateContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: context.request.headers,\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else if (eq backend 'express')}}\nimport type { Request } from \"express\";\n{{#if (eq auth \"better-auth\")}}\nimport { fromNodeHeaders } from \"better-auth/node\";\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\ninterface CreateContextOptions {\n\treq: Request;\n}\n\nexport async function createContext(opts: CreateContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n\tconst session = await auth.api.getSession({\n\t\theaders: fromNodeHeaders(opts.req.headers),\n\t});\n\treturn {\n\t\tsession,\n\t};\n{{else}}\n // No auth configured\n\treturn {\n\t\tsession: null,\n\t};\n{{/if}}\n}\n\n{{else if (eq backend 'fastify')}}\nimport type { IncomingHttpHeaders } from \"node:http\";\n{{#if (eq auth \"better-auth\")}}\nimport { fromNodeHeaders } from \"better-auth/node\";\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext(req: IncomingHttpHeaders) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: fromNodeHeaders(req),\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else}}\nexport async function createContext() {\n return {\n session: null,\n };\n}\n{{/if}}\n\nexport type Context = Awaited<ReturnType<typeof createContext>>;\n`],\n [\"api/orpc/native/utils/orpc.ts.hbs\", `import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport { QueryCache, QueryClient } from \"@tanstack/react-query\";\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\nimport { env } from \"@{{projectName}}/env/native\";\n{{#if (eq auth \"better-auth\")}}\nimport { authClient } from \"@/lib/auth-client\";\n{{/if}}\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error) => {\n\t\t\tconsole.log(error)\n\t\t},\n\t}),\n});\n\nexport const link = new RPCLink({\n{{#if (eq backend \"self\")}}\n\turl: \\`\\${env.EXPO_PUBLIC_SERVER_URL}/api/rpc\\`,\n{{else}}\n\turl: \\`\\${env.EXPO_PUBLIC_SERVER_URL}/rpc\\`,\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\n\theaders() {\n\t\tconst headers = new Map<string, string>();\n\t\tconst cookies = authClient.getCookie();\n\t\tif (cookies) {\n\t\t\theaders.set(\"Cookie\", cookies);\n\t\t}\n\t\treturn Object.fromEntries(headers);\n\t},\n{{/if}}\n});\n\nexport const client: AppRouterClient = createORPCClient(link);\n\nexport const orpc = createTanstackQueryUtils(client);\n`],\n [\"api/trpc/server/src/index.ts.hbs\", `import { initTRPC, TRPCError } from \"@trpc/server\";\nimport type { Context } from \"./context\";\n\nexport const t = initTRPC.context<Context>().create();\n\nexport const router = t.router;\n\nexport const publicProcedure = t.procedure;\n\n{{#if (eq auth \"better-auth\")}}\nexport const protectedProcedure = t.procedure.use(({ ctx, next }) => {\n if (!ctx.session) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Authentication required\",\n cause: \"No session\",\n });\n }\n return next({\n ctx: {\n ...ctx,\n session: ctx.session,\n },\n });\n});\n{{/if}}\n`],\n [\"api/trpc/server/src/context.ts.hbs\", `{{#if (and (eq backend 'self') (includes frontend \"next\"))}}\nimport type { NextRequest } from \"next/server\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext(req: NextRequest) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: req.headers,\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else if (and (eq backend 'self') (includes frontend \"tanstack-start\"))}}\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext({ req }: { req: Request }) {\n{{#if (eq auth \"better-auth\")}}\n\tconst session = await auth.api.getSession({\n\t\theaders: req.headers,\n\t});\n\treturn {\n\t\tsession,\n\t};\n{{else}}\n\t// No auth configured\n\treturn {\n\t\tsession: null,\n\t};\n{{/if}}\n}\n\n{{else if (eq backend 'hono')}}\nimport type { Context as HonoContext } from \"hono\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport type CreateContextOptions = {\n context: HonoContext;\n};\n\nexport async function createContext({ context }: CreateContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: context.req.raw.headers,\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else if (eq backend 'elysia')}}\nimport type { Context as ElysiaContext } from \"elysia\";\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport type CreateContextOptions = {\n context: ElysiaContext;\n};\n\nexport async function createContext({ context }: CreateContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: context.request.headers,\n });\n return {\n session,\n };\n{{else}}\n // No auth configured\n return {\n session: null,\n };\n{{/if}}\n}\n\n{{else if (eq backend 'express')}}\nimport type { CreateExpressContextOptions } from \"@trpc/server/adapters/express\";\n{{#if (eq auth \"better-auth\")}}\nimport { fromNodeHeaders } from \"better-auth/node\";\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext(opts: CreateExpressContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n\tconst session = await auth.api.getSession({\n\t\theaders: fromNodeHeaders(opts.req.headers),\n\t});\n\treturn {\n\t\tsession,\n\t};\n{{else}}\n // No auth configured\n\treturn {\n\t\tsession: null,\n\t};\n{{/if}}\n}\n\n{{else if (eq backend 'fastify')}}\nimport type { CreateFastifyContextOptions } from \"@trpc/server/adapters/fastify\";\n{{#if (eq auth \"better-auth\")}}\nimport { fromNodeHeaders } from \"better-auth/node\";\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nexport async function createContext({ req, res }: CreateFastifyContextOptions) {\n{{#if (eq auth \"better-auth\")}}\n const session = await auth.api.getSession({\n headers: fromNodeHeaders(req.headers),\n });\n return { session };\n{{else}}\n // No auth configured\n\treturn {\n\t\tsession: null,\n\t};\n{{/if}}\n}\n\n{{else}}\nexport async function createContext() {\n return {\n session: null,\n };\n}\n{{/if}}\n\nexport type Context = Awaited<ReturnType<typeof createContext>>;\n`],\n [\"api/trpc/native/utils/trpc.ts.hbs\", `{{#if (eq auth \"better-auth\")}}\nimport { authClient } from \"@/lib/auth-client\";\n{{/if}}\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { createTRPCClient, httpBatchLink } from \"@trpc/client\";\nimport { createTRPCOptionsProxy } from \"@trpc/tanstack-react-query\";\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nexport const queryClient = new QueryClient();\n\nconst trpcClient = createTRPCClient<AppRouter>({\n\tlinks: [\n\t\thttpBatchLink({\n{{#if (eq backend \"self\")}}\n\t\t\turl: \\`\\${env.EXPO_PUBLIC_SERVER_URL}/api/trpc\\`,\n{{else}}\n\t\t\turl: \\`\\${env.EXPO_PUBLIC_SERVER_URL}/trpc\\`,\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\n\t\t\theaders() {\n\t\t\t\tconst headers = new Map<string, string>();\n\t\t\t\tconst cookies = authClient.getCookie();\n\t\t\t\tif (cookies) {\n\t\t\t\t\theaders.set(\"Cookie\", cookies);\n\t\t\t\t}\n\t\t\t\treturn Object.fromEntries(headers);\n\t\t\t},\n{{/if}}\n\t\t}),\n\t],\n});\n\nexport const trpc = createTRPCOptionsProxy<AppRouter>({\n\tclient: trpcClient,\n\tqueryClient,\n});\n`],\n [\"auth/better-auth/server/base/tsconfig.json.hbs\", `{\n \"extends\": \"@{{projectName}}/config/tsconfig.base.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"outDir\": \"dist\",\n \"composite\": true\n }\n}`],\n [\"auth/better-auth/server/base/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/auth\",\n \"exports\": {\n \".\": {\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"default\": \"./src/*.ts\"\n }\n },\n \"type\": \"module\",\n \"scripts\": {},\n \"devDependencies\": {}\n}`],\n [\"auth/better-auth/server/base/_gitignore\", `# dependencies (bun install)\nnode_modules\n\n# output\nout\ndist\n*.tgz\n\n# code coverage\ncoverage\n*.lcov\n\n# logs\nlogs\n_.log\nreport.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json\n\n# dotenv environment variable files\n.env\n.env.development.local\n.env.test.local\n.env.production.local\n.env.local\n\n# caches\n.eslintcache\n.cache\n*.tsbuildinfo\n\n# IntelliJ based IDEs\n.idea\n\n# Finder (MacOS) folder config\n.DS_Store\n`],\n [\"backend/server/hono/src/index.ts.hbs\", `import { env } from \"@{{projectName}}/env/server\";\n{{#if (eq api \"orpc\")}}\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { onError } from \"@orpc/server\";\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { trpcServer } from \"@hono/trpc-server\";\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\n{{#if (and (includes examples \"ai\") (or (eq runtime \"bun\") (eq runtime \"node\")))}}\nimport { streamText, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { google } from \"@ai-sdk/google\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n{{/if}}\n{{#if (and (includes examples \"ai\") (eq runtime \"workers\"))}}\nimport { streamText, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n{{/if}}\n\nconst app = new Hono();\n\napp.use(logger());\napp.use(\n\t\"/*\",\n\tcors({\n\t\torigin: env.CORS_ORIGIN,\n\t\tallowMethods: [\"GET\", \"POST\", \"OPTIONS\"],\n{{#if (eq auth \"better-auth\")}}\n\t\tallowHeaders: [\"Content-Type\", \"Authorization\"],\n\t\tcredentials: true,\n{{/if}}\n\t})\n);\n\n{{#if (eq auth \"better-auth\")}}\napp.on([\"POST\", \"GET\"], \"/api/auth/*\", (c) => auth.handler(c.req.raw));\n{{/if}}\n\n{{#if (eq api \"orpc\")}}\nexport const apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nexport const rpcHandler = new RPCHandler(appRouter, {\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\napp.use(\"/*\", async (c, next) => {\n\tconst context = await createContext({ context: c });\n\n\tconst rpcResult = await rpcHandler.handle(c.req.raw, {\n\t\tprefix: \"/rpc\",\n\t\tcontext: context,\n\t});\n\n\tif (rpcResult.matched) {\n\t\treturn c.newResponse(rpcResult.response.body, rpcResult.response);\n\t}\n\n\tconst apiResult = await apiHandler.handle(c.req.raw, {\n\t\tprefix: \"/api-reference\",\n\t\tcontext: context,\n\t});\n\n\tif (apiResult.matched) {\n\t\treturn c.newResponse(apiResult.response.body, apiResult.response);\n\t}\n\n\tawait next();\n});\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\napp.use(\n\t\"/trpc/*\",\n\ttrpcServer({\n\t\trouter: appRouter,\n\t\tcreateContext: (_opts, context) => {\n\t\t\treturn createContext({ context });\n\t\t},\n\t})\n);\n{{/if}}\n\n{{#if (and (includes examples \"ai\") (or (eq runtime \"bun\") (eq runtime \"node\")))}}\napp.post(\"/ai\", async (c) => {\n\tconst body = await c.req.json();\n\tconst uiMessages = body.messages || [];\n\tconst model = wrapLanguageModel({\n\t\tmodel: google(\"gemini-2.5-flash\"),\n\t\tmiddleware: devToolsMiddleware(),\n\t});\n\tconst result = streamText({\n\t\tmodel,\n\t\tmessages: await convertToModelMessages(uiMessages),\n\t});\n\n\treturn result.toUIMessageStreamResponse();\n});\n{{/if}}\n\n{{#if (and (includes examples \"ai\") (eq runtime \"workers\"))}}\napp.post(\"/ai\", async (c) => {\n\tconst body = await c.req.json();\n\tconst uiMessages = body.messages || [];\n\tconst google = createGoogleGenerativeAI({\n\t\tapiKey: env.GOOGLE_GENERATIVE_AI_API_KEY,\n\t});\n\tconst model = wrapLanguageModel({\n\t\tmodel: google(\"gemini-2.5-flash\"),\n\t\tmiddleware: devToolsMiddleware(),\n\t});\n\tconst result = streamText({\n\t\tmodel,\n\t\tmessages: await convertToModelMessages(uiMessages),\n\t});\n\n\treturn result.toUIMessageStreamResponse();\n});\n{{/if}}\n\napp.get(\"/\", (c) => {\n\treturn c.text(\"OK\");\n});\n\n{{#if (eq runtime \"node\")}}\nimport { serve } from \"@hono/node-server\";\n\nserve(\n\t{\n\t\tfetch: app.fetch,\n\t\tport: 3000,\n\t},\n\t(info) => {\n\t\tconsole.log(\\`Server is running on http://localhost:\\${info.port}\\`);\n\t}\n);\n{{else}}\n{{#if (eq runtime \"bun\")}}\nexport default app;\n{{/if}}\n{{#if (eq runtime \"workers\")}}\nexport default app;\n{{/if}}\n{{/if}}\n`],\n [\"backend/server/elysia/src/index.ts.hbs\", `import { env } from \"@{{projectName}}/env/server\";\n{{#if (eq runtime \"node\")}}\nimport { node } from \"@elysiajs/node\";\n{{/if}}\nimport { Elysia } from \"elysia\";\nimport { cors } from \"@elysiajs/cors\";\n{{#if (includes examples \"ai\")}}\nimport { google } from \"@ai-sdk/google\";\nimport { convertToModelMessages, streamText, wrapLanguageModel } from \"ai\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { fetchRequestHandler } from \"@trpc/server/adapters/fetch\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { onError } from \"@orpc/server\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { createContext } from \"@{{projectName}}/api/context\";\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\n{{#if (eq api \"orpc\")}}\nconst rpcHandler = new RPCHandler(appRouter, {\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\nconst apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n{{/if}}\n\n{{#if (eq runtime \"node\")}}\nconst app = new Elysia({ adapter: node() })\n{{else}}\nconst app = new Elysia()\n{{/if}}\n\t.use(\n\t\tcors({\n\t\t\torigin: env.CORS_ORIGIN,\n\t\t\tmethods: [\"GET\", \"POST\", \"OPTIONS\"],\n{{#if (eq auth \"better-auth\")}}\n\t\t\tallowedHeaders: [\"Content-Type\", \"Authorization\"],\n\t\t\tcredentials: true,\n{{/if}}\n\t\t}),\n\t)\n{{#if (eq auth \"better-auth\")}}\n\t.all(\"/api/auth/*\", async (context) => {\n\t\tconst { request, status } = context;\n\t\tif ([\"POST\", \"GET\"].includes(request.method)) {\n\t\t\treturn auth.handler(request);\n\t\t}\n\t\treturn status(405)\n\t})\n{{/if}}\n{{#if (eq api \"orpc\")}}\n\t.all('/rpc*', async (context) => {\n\t\tconst { response } = await rpcHandler.handle(context.request, {\n\t\t\tprefix: '/rpc',\n\t\t\tcontext: await createContext({ context })\n\t\t})\n\t\treturn response ?? new Response('Not Found', { status: 404 })\n\t})\n\t.all('/api*', async (context) => {\n\t\tconst { response } = await apiHandler.handle(context.request, {\n\t\t\tprefix: '/api-reference',\n\t\t\tcontext: await createContext({ context })\n\t\t})\n\t\treturn response ?? new Response('Not Found', { status: 404 })\n\t})\n{{/if}}\n{{#if (eq api \"trpc\")}}\n\t.all(\"/trpc/*\", async (context) => {\n\t\tconst res = await fetchRequestHandler({\n\t\t\tendpoint: \"/trpc\",\n\t\t\trouter: appRouter,\n\t\t\treq: context.request,\n\t\t\tcreateContext: () => createContext({ context }),\n\t\t});\n\t\treturn res;\n\t})\n{{/if}}\n{{#if (includes examples \"ai\")}}\n\t.post(\"/ai\", async (context) => {\n\t\tconst body = await context.request.json();\n\t\tconst uiMessages = body.messages || [];\n\t\tconst model = wrapLanguageModel({\n\t\t\tmodel: google(\"gemini-2.5-flash\"),\n\t\t\tmiddleware: devToolsMiddleware(),\n\t\t});\n\t\tconst result = streamText({\n\t\t\tmodel,\n\t\t\tmessages: await convertToModelMessages(uiMessages)\n\t\t});\n\n\t\treturn result.toUIMessageStreamResponse();\n\t})\n{{/if}}\n\t.get(\"/\", () => \"OK\")\n\t.listen(3000, () => {\n\t\tconsole.log(\"Server is running on http://localhost:3000\");\n\t});\n`],\n [\"backend/server/express/src/index.ts.hbs\", `import { env } from \"@{{projectName}}/env/server\";\n{{#if (eq api \"trpc\")}}\nimport { createExpressMiddleware } from \"@trpc/server/adapters/express\";\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { OpenAPIHandler } from \"@orpc/openapi/node\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/node\";\nimport { onError } from \"@orpc/server\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\n{{#if (eq auth \"better-auth\")}}\nimport { createContext } from \"@{{projectName}}/api/context\";\n{{/if}}\n{{/if}}\nimport cors from \"cors\";\nimport express from \"express\";\n{{#if (includes examples \"ai\")}}\nimport { streamText, type UIMessage, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { google } from \"@ai-sdk/google\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\nimport { toNodeHandler } from \"better-auth/node\";\n{{/if}}\n\nconst app = express();\n\napp.use(\n\tcors({\n\t\torigin: env.CORS_ORIGIN,\n\t\tmethods: [\"GET\", \"POST\", \"OPTIONS\"],\n{{#if (eq auth \"better-auth\")}}\n\t\tallowedHeaders: [\"Content-Type\", \"Authorization\"],\n\t\tcredentials: true,\n{{/if}}\n\t})\n);\n\n{{#if (eq auth \"better-auth\")}}\napp.all(\"/api/auth{/*path}\", toNodeHandler(auth));\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\napp.use(\n\t\"/trpc\",\n\tcreateExpressMiddleware({\n\t\trouter: appRouter,\n\t\tcreateContext,\n\t})\n);\n{{/if}}\n\n{{#if (eq api \"orpc\")}}\nconst rpcHandler = new RPCHandler(appRouter, {\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\nconst apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\napp.use(async (req, res, next) => {\n\tconst rpcResult = await rpcHandler.handle(req, res, {\n\t\tprefix: \"/rpc\",\n{{#if (eq auth \"better-auth\")}}\n\t\tcontext: await createContext({ req }),\n{{else}}\n\t\tcontext: {},\n{{/if}}\n\t});\n\tif (rpcResult.matched) return;\n\n\tconst apiResult = await apiHandler.handle(req, res, {\n\t\tprefix: \"/api-reference\",\n{{#if (eq auth \"better-auth\")}}\n\t\tcontext: await createContext({ req }),\n{{else}}\n\t\tcontext: {},\n{{/if}}\n\t});\n\tif (apiResult.matched) return;\n\n\tnext();\n});\n{{/if}}\n\napp.use(express.json());\n\n{{#if (includes examples \"ai\")}}\napp.post(\"/ai\", async (req, res) => {\n\tconst { messages = [] } = (req.body || {}) as { messages: UIMessage[] };\n\tconst model = wrapLanguageModel({\n\t\tmodel: google(\"gemini-2.5-flash\"),\n\t\tmiddleware: devToolsMiddleware(),\n\t});\n\tconst result = streamText({\n\t\tmodel,\n\t\tmessages: await convertToModelMessages(messages),\n\t});\n\tresult.pipeUIMessageStreamToResponse(res);\n});\n{{/if}}\n\napp.get(\"/\", (_req, res) => {\n\tres.status(200).send(\"OK\");\n});\n\napp.listen(3000, () => {\n\tconsole.log(\"Server is running on http://localhost:3000\");\n});\n`],\n [\"backend/server/fastify/src/index.ts.hbs\", `import { env } from \"@{{projectName}}/env/server\";\nimport Fastify from \"fastify\";\nimport fastifyCors from \"@fastify/cors\";\n\n{{#if (eq api \"trpc\")}}\nimport { fastifyTRPCPlugin, type FastifyTRPCPluginOptions } from \"@trpc/server/adapters/fastify\";\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter, type AppRouter } from \"@{{projectName}}/api/routers/index\";\n{{/if}}\n\n{{#if (eq api \"orpc\")}}\nimport { OpenAPIHandler } from \"@orpc/openapi/node\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/node\";\nimport { CORSPlugin } from \"@orpc/server/plugins\";\nimport { onError } from \"@orpc/server\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { createServer } from \"node:http\";\n{{#if (eq auth \"better-auth\")}}\nimport { createContext } from \"@{{projectName}}/api/context\";\n{{/if}}\n{{/if}}\n\n{{#if (includes examples \"ai\")}}\nimport { streamText, type UIMessage, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { google } from \"@ai-sdk/google\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n{{/if}}\n\n{{#if (eq auth \"better-auth\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\n\nconst baseCorsConfig = {\n\torigin: env.CORS_ORIGIN,\n\tmethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n\tallowedHeaders: [\n\t\t\"Content-Type\",\n\t\t\"Authorization\",\n\t\t\"X-Requested-With\"\n\t],\n\tcredentials: true,\n\tmaxAge: 86400,\n};\n\n{{#if (eq api \"orpc\")}}\nconst rpcHandler = new RPCHandler(appRouter, {\n\tplugins: [\n\t\tnew CORSPlugin({\n\t\t\torigin: env.CORS_ORIGIN,\n\t\t\tcredentials: true,\n\t\t\tallowHeaders: [\"Content-Type\", \"Authorization\"],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nconst apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nconst fastify = Fastify({\n\tlogger: true,\n\tserverFactory: (fastifyHandler) => {\n\t\tconst server = createServer(async (req, res) => {\n\t\t\tconst { matched } = await rpcHandler.handle(req, res, {\n\t\t\t\tcontext: await createContext(req.headers),\n\t\t\t\tprefix: \"/rpc\",\n\t\t\t});\n\n\t\t\tif (matched) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst apiResult = await apiHandler.handle(req, res, {\n\t\t\t\tcontext: await createContext(req.headers),\n\t\t\t\tprefix: \"/api-reference\",\n\t\t\t});\n\n\t\t\tif (apiResult.matched) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfastifyHandler(req, res);\n\t\t});\n\n\t\treturn server;\n\t},\n});\n{{else}}\nconst fastify = Fastify({\n\tlogger: true,\n});\n{{/if}}\n\nfastify.register(fastifyCors, baseCorsConfig);\n\n{{#if (eq auth \"better-auth\")}}\nfastify.route({\n\tmethod: [\"GET\", \"POST\"],\n\turl: \"/api/auth/*\",\n\tasync handler(request, reply) {\n\t\ttry {\n\t\t\tconst url = new URL(request.url, \\`http://\\${request.headers.host}\\`);\n\t\t\tconst headers = new Headers();\n\t\t\tObject.entries(request.headers).forEach(([key, value]) => {\n\t\t\t\tif (value) headers.append(key, value.toString());\n\t\t\t});\n\t\t\tconst req = new Request(url.toString(), {\n\t\t\t\tmethod: request.method,\n\t\t\t\theaders,\n\t\t\t\tbody: request.body ? JSON.stringify(request.body) : undefined,\n\t\t\t});\n\t\t\tconst response = await auth.handler(req);\n\t\t\treply.status(response.status);\n\t\t\tresponse.headers.forEach((value, key) => reply.header(key, value));\n\t\t\treply.send(response.body ? await response.text() : null);\n\t\t} catch (error) {\n\t\t\tfastify.log.error({ err: error }, \"Authentication Error:\");\n\t\t\treply.status(500).send({\n\t\t\t\terror: \"Internal authentication error\",\n\t\t\t\tcode: \"AUTH_FAILURE\"\n\t\t\t});\n\t\t}\n\t}\n});\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\nfastify.register(fastifyTRPCPlugin, {\n\tprefix: \"/trpc\",\n\ttrpcOptions: {\n\t\trouter: appRouter,\n\t\tcreateContext,\n\t\tonError({ path, error }) {\n\t\t\tconsole.error(\\`Error in tRPC handler on path '\\${path}':\\`, error);\n\t\t},\n\t} satisfies FastifyTRPCPluginOptions<AppRouter>[\"trpcOptions\"],\n});\n{{/if}}\n\n{{#if (includes examples \"ai\")}}\ninterface AiRequestBody {\n\tid?: string;\n\tmessages: UIMessage[];\n}\n\nfastify.post('/ai', async function (request) {\n\tconst { messages } = request.body as AiRequestBody;\n\tconst model = wrapLanguageModel({\n\t\tmodel: google('gemini-2.5-flash'),\n\t\tmiddleware: devToolsMiddleware(),\n\t});\n\tconst result = streamText({\n\t\tmodel,\n\t\tmessages: await convertToModelMessages(messages),\n\t});\n\n\treturn result.toUIMessageStreamResponse();\n});\n{{/if}}\n\nfastify.get('/', async () => {\n\treturn 'OK';\n});\n\nfastify.listen({ port: 3000 }, (err) => {\n\tif (err) {\n\t\tfastify.log.error(err);\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(\"Server running on port 3000\");\n});\n`],\n [\"backend/convex/packages/backend/package.json.hbs\", `{\n \"name\": \"@{{projectName}}/backend\",\n \"version\": \"1.0.0\",\n \"scripts\": {\n \"dev\": \"convex dev\",\n \"dev:setup\": \"convex dev --configure --until-success\"\n },\n \"author\": \"\",\n \"license\": \"ISC\",\n \"description\": \"\",\n \"devDependencies\": {\n \"@types/node\": \"^24.3.0\"\n },\n \"dependencies\": {}\n}\n`],\n [\"backend/convex/packages/backend/_gitignore\", `\n.env.local\n`],\n [\"frontend/svelte/src/components/Header.svelte.hbs\", `<script lang=\"ts\">\n\n {{#if (eq auth \"better-auth\")}}\n\timport UserMenu from './UserMenu.svelte';\n {{/if}}\n const links = [\n { to: \"/\", label: \"Home\" },\n {{#if (eq auth \"better-auth\")}}\n { to: \"/dashboard\", label: \"Dashboard\" },\n {{/if}}\n {{#if (includes examples \"todo\")}}\n { to: \"/todos\", label: \"Todos\" },\n {{/if}}\n {{#if (includes examples \"ai\")}}\n { to: \"/ai\", label: \"AI Chat\" },\n {{/if}}\n ];\n\n</script>\n\n<div>\n\t<div class=\"flex flex-row items-center justify-between px-4 py-2 md:px-6\">\n\t\t<nav class=\"flex gap-4 text-lg\">\n\t\t\t{#each links as link (link.to)}\n\t\t\t\t<a\n\t\t\t\t\thref={link.to}\n\t\t\t\t\tclass=\"hover:text-neutral-400 transition-colors\"\n\t\t\t\t>\n\t\t\t\t\t{link.label}\n\t\t\t\t</a>\n\t\t\t{/each}\n\t\t</nav>\n\t\t<div class=\"flex items-center gap-2\">\n\t\t {{#if (eq auth \"better-auth\")}}\n <UserMenu />\n {{/if}}\n\t\t</div>\n\t</div>\n\t<hr class=\"border-neutral-800\" />\n</div>\n`],\n [\"frontend/svelte/src/lib/index.ts\", `// place files you want to import through the \\`$lib\\` alias in this folder.\nexport {};\n`],\n [\"frontend/svelte/src/routes/+layout.svelte.hbs\", `{{#if (eq backend \"convex\")}}\n<script lang=\"ts\">\n\timport '../app.css';\n import Header from '../components/Header.svelte';\n import { PUBLIC_CONVEX_URL } from '$env/static/public';\n\timport { setupConvex } from 'convex-svelte';\n\n\tconst { children } = $props();\n\tsetupConvex(PUBLIC_CONVEX_URL);\n</script>\n\n<div class=\"grid h-svh grid-rows-[auto_1fr]\">\n\t<Header />\n\t<main class=\"overflow-y-auto\">\n\t\t{@render children()}\n\t</main>\n</div>\n{{else}}\n {{#if (eq api \"orpc\")}}\n<script lang=\"ts\">\n import { QueryClientProvider } from '@tanstack/svelte-query';\n import { SvelteQueryDevtools } from '@tanstack/svelte-query-devtools'\n\timport '../app.css';\n import { queryClient } from '$lib/orpc';\n import Header from '../components/Header.svelte';\n\n\tconst { children } = $props();\n</script>\n\n<QueryClientProvider client={queryClient}>\n <div class=\"grid h-svh grid-rows-[auto_1fr]\">\n\t\t<Header />\n\t\t<main class=\"overflow-y-auto\">\n\t\t\t{@render children()}\n\t\t</main>\n </div>\n <SvelteQueryDevtools />\n</QueryClientProvider>\n {{else}}\n<script lang=\"ts\">\n\timport '../app.css';\n import Header from '../components/Header.svelte';\n\n\tconst { children } = $props();\n</script>\n\n<div class=\"grid h-svh grid-rows-[auto_1fr]\">\n\t<Header />\n\t<main class=\"overflow-y-auto\">\n\t\t{@render children()}\n\t</main>\n</div>\n {{/if}}\n{{/if}}\n`],\n [\"frontend/svelte/src/routes/+page.svelte.hbs\", `{{#if (eq backend \"convex\")}}\n<script lang=\"ts\">\nimport { useQuery } from 'convex-svelte';\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n\nconst healthCheck = useQuery(api.healthCheck.get, {});\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n</script>\n\n<div class=\"container mx-auto max-w-3xl px-4 py-2\">\n\t<pre class=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n\t<div class=\"grid gap-6\">\n\t\t<section class=\"rounded-lg border p-4\">\n\t\t\t<h2 class=\"mb-2 font-medium\">API Status</h2>\n\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t<div\n\t\t\t\t\tclass={\\`h-2 w-2 rounded-full \\${healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n\t\t\t\t></div>\n\t\t\t\t<span class=\"text-muted-foreground text-sm\">\n\t\t\t\t\t{healthCheck.isLoading\n\t\t\t\t\t\t? \"Checking...\"\n\t\t\t\t\t\t: healthCheck.data\n\t\t\t\t\t\t\t? \"Connected\"\n\t\t\t\t\t\t\t: \"Disconnected\"}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</section>\n\t</div>\n</div>\n{{else}}\n<script lang=\"ts\">\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"$lib/orpc\";\nimport { createQuery } from \"@tanstack/svelte-query\";\nconst healthCheck = createQuery(orpc.healthCheck.queryOptions());\n{{/if}}\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n</script>\n\n<div class=\"container mx-auto max-w-3xl px-4 py-2\">\n\t<pre class=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n\t<div class=\"grid gap-6\">\n\t {{#if (eq api \"orpc\")}}\n\t\t<section class=\"rounded-lg border p-4\">\n\t\t\t<h2 class=\"mb-2 font-medium\">API Status</h2>\n\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t<div\n\t\t\t\t\tclass={\\`h-2 w-2 rounded-full \\${$healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n\t\t\t\t></div>\n\t\t\t\t<span class=\"text-muted-foreground text-sm\">\n\t\t\t\t\t{$healthCheck.isLoading\n\t\t\t\t\t\t? \"Checking...\"\n\t\t\t\t\t\t: $healthCheck.data\n\t\t\t\t\t\t\t? \"Connected\"\n\t\t\t\t\t\t\t: \"Disconnected\"}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</section>\n\t {{/if}}\n\t</div>\n</div>\n{{/if}}\n`],\n [\"frontend/react/tanstack-start/public/robots.txt\", `# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n`],\n [\"frontend/react/tanstack-start/src/router.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { createRouter as createTanStackRouter } from \"@tanstack/react-router\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { setupRouterSsrQueryIntegration } from \"@tanstack/react-router-ssr-query\";\nimport { ConvexQueryClient } from \"@convex-dev/react-query\";\nimport { routeTree } from \"./routeTree.gen\";\nimport Loader from \"./components/loader\";\nimport \"./index.css\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{else}}\nimport { createRouter as createTanStackRouter } from \"@tanstack/react-router\";\nimport Loader from \"./components/loader\";\nimport \"./index.css\";\nimport { routeTree } from \"./routeTree.gen\";\n{{#if (eq api \"trpc\")}}\nimport { QueryCache, QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createTRPCClient, httpBatchLink } from \"@trpc/client\";\nimport { createTRPCOptionsProxy } from \"@trpc/tanstack-react-query\";\nimport { toast } from \"sonner\";\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nimport { TRPCProvider } from \"./utils/trpc\";\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n{{else if (eq api \"orpc\")}}\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { orpc, queryClient } from \"./utils/orpc\";\n{{/if}}\n{{/if}}\n\n{{#if (eq backend \"convex\")}}\nexport function getRouter() {\n\tconst convexUrl = env.VITE_CONVEX_URL;\n\tif (!convexUrl) {\n\t\tthrow new Error(\"VITE_CONVEX_URL is not set\");\n\t}\n\n\tconst convexQueryClient = new ConvexQueryClient(convexUrl);\n\n\tconst queryClient: QueryClient = new QueryClient({\n\t\tdefaultOptions: {\n\t\t\tqueries: {\n\t\t\t\tqueryKeyHashFn: convexQueryClient.hashFn(),\n\t\t\t\tqueryFn: convexQueryClient.queryFn(),\n\t\t\t},\n\t\t},\n\t});\n\tconvexQueryClient.connect(queryClient);\n\n\tconst router = createTanStackRouter({\n\t\trouteTree,\n\t\tdefaultPreload: \"intent\",\n\t\tdefaultPendingComponent: () => <Loader />,\n\t\tdefaultNotFoundComponent: () => <div>Not Found</div>,\n\t\tcontext: { queryClient, convexQueryClient },\n\t});\n\n\tsetupRouterSsrQueryIntegration({\n\t\trouter,\n\t\tqueryClient,\n\t});\n\n\treturn router;\n}\n{{else}}\n{{#if (eq api \"trpc\")}}\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error, query) => {\n\t\t\ttoast.error(error.message, {\n\t\t\t\taction: {\n\t\t\t\t\tlabel: \"retry\",\n\t\t\t\t\tonClick: query.invalidate,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t}),\n\tdefaultOptions: { queries: { staleTime: 60 * 1000 } },\n});\n\nconst trpcClient = createTRPCClient<AppRouter>({\n\tlinks: [\n\t\thttpBatchLink({\n\t\t\turl: {{#if (eq backend \"self\")}}\"/api/trpc\"{{else}}\\`\\${env.VITE_SERVER_URL}/trpc\\`{{/if}},\n{{#if (eq auth \"better-auth\")}}\n\t\t\tfetch(url, options) {\n\t\t\t\treturn fetch(url, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t});\n\t\t\t},\n{{/if}}\n\t\t}),\n\t],\n});\n\nconst trpc = createTRPCOptionsProxy({\n\tclient: trpcClient,\n\tqueryClient: queryClient,\n});\n{{else if (eq api \"orpc\")}}\n{{/if}}\n\nexport const getRouter = () => {\n\tconst router = createTanStackRouter({\n\t\trouteTree,\n\t\tscrollRestoration: true,\n\t\tdefaultPreloadStaleTime: 0,\n{{#if (eq api \"trpc\")}}\n\t\tcontext: { trpc, queryClient },\n{{else if (eq api \"orpc\")}}\n\t\tcontext: { orpc, queryClient },\n{{else}}\n\t\tcontext: {},\n{{/if}}\n\t\tdefaultPendingComponent: () => <Loader />,\n\t\tdefaultNotFoundComponent: () => <div>Not Found</div>,\n{{#if (eq api \"trpc\")}}\n\t\tWrap: ({ children }) => (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t<TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>\n\t\t\t\t\t{children}\n\t\t\t\t</TRPCProvider>\n\t\t\t</QueryClientProvider>\n\t\t),\n{{else if (eq api \"orpc\")}}\n\t\tWrap: ({ children }) => (\n\t\t\t<QueryClientProvider client={queryClient}>\n\t\t\t\t{children}\n\t\t\t</QueryClientProvider>\n\t\t),\n{{else}}\n\t\tWrap: ({ children }) => <>{children}</>,\n{{/if}}\n\t});\n\treturn router;\n};\n{{/if}}\n\ndeclare module \"@tanstack/react-router\" {\n\tinterface Register {\n\t\trouter: ReturnType<typeof getRouter>;\n\t}\n}\n`],\n [\"frontend/react/tanstack-router/src/main.tsx.hbs\", `import { RouterProvider, createRouter } from \"@tanstack/react-router\";\nimport ReactDOM from \"react-dom/client\";\nimport Loader from \"./components/loader\";\nimport { routeTree } from \"./routeTree.gen\";\n\n{{#if (eq api \"orpc\")}}\n import { QueryClientProvider } from \"@tanstack/react-query\";\n import { orpc, queryClient } from \"./utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\n import { QueryClientProvider } from \"@tanstack/react-query\";\n import { queryClient, trpc } from \"./utils/trpc\";\n{{/if}}\n{{#if (eq backend \"convex\")}}\n import { ConvexReactClient } from \"convex/react\";\n import { env } from \"@{{projectName}}/env/web\";\n {{#if (eq auth \"clerk\")}}\n import { ClerkProvider, useAuth } from \"@clerk/clerk-react\";\n import { ConvexProviderWithClerk } from \"convex/react-clerk\";\n {{else if (eq auth \"better-auth\")}}\n import { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\n import { authClient } from \"@/lib/auth-client\";\n {{else}}\n import { ConvexProvider } from \"convex/react\";\n {{/if}}\n const convex = new ConvexReactClient(env.VITE_CONVEX_URL);\n{{/if}}\n\nconst router = createRouter({\n routeTree,\n defaultPreload: \"intent\",\n defaultPendingComponent: () => <Loader />,\n {{#if (eq api \"orpc\")}}\n context: { orpc, queryClient },\n Wrap: function WrapComponent({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n },\n {{else if (eq api \"trpc\")}}\n context: { trpc, queryClient },\n Wrap: function WrapComponent({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n },\n {{else if (eq backend \"convex\")}}\n context: {},\n Wrap: function WrapComponent({ children }: { children: React.ReactNode }) {\n {{#if (eq auth \"clerk\")}}\n return (\n <ClerkProvider\n publishableKey={env.VITE_CLERK_PUBLISHABLE_KEY}\n >\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n {children}\n </ConvexProviderWithClerk>\n </ClerkProvider>\n );\n {{else if (eq auth \"better-auth\")}}\n return <ConvexBetterAuthProvider client={convex} authClient={authClient}>{children}</ConvexBetterAuthProvider>;\n {{else}}\n return <ConvexProvider client={convex}>{children}</ConvexProvider>;\n {{/if}}\n },\n {{else}}\n context: {},\n {{/if}}\n});\n\ndeclare module \"@tanstack/react-router\" {\n interface Register {\n router: typeof router;\n }\n}\n\nconst rootElement = document.getElementById(\"app\");\n\nif (!rootElement) {\n throw new Error(\"Root element not found\");\n}\n\nif (!rootElement.innerHTML) {\n const root = ReactDOM.createRoot(rootElement);\n root.render(<RouterProvider router={router} />);\n}\n`],\n [\"frontend/react/react-router/public/favicon.ico\", `[Binary file]`],\n [\"frontend/react/react-router/src/routes.ts\", `import { type RouteConfig } from \"@react-router/dev/routes\";\nimport { flatRoutes } from \"@react-router/fs-routes\";\n\nexport default flatRoutes() satisfies RouteConfig;\n`],\n [\"frontend/react/react-router/src/root.tsx.hbs\", `import {\n isRouteErrorResponse,\n Links,\n Meta,\n Outlet,\n Scripts,\n ScrollRestoration,\n} from \"react-router\";\nimport type { Route } from \"./+types/root\";\nimport \"./index.css\";\nimport Header from \"./components/header\";\nimport { ThemeProvider } from \"./components/theme-provider\";\nimport { Toaster } from \"./components/ui/sonner\";\n\n{{#if (eq backend \"convex\")}}\nimport { ConvexReactClient } from \"convex/react\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{#if (eq auth \"clerk\")}}\nimport { ClerkProvider, useAuth } from \"@clerk/clerk-react\";\nimport { ConvexProviderWithClerk } from \"convex/react-clerk\";\n{{else}}\nimport { ConvexProvider } from \"convex/react\";\n{{/if}}\n{{else}}\n {{#unless (eq api \"none\")}}\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\n {{#if (eq api \"orpc\")}}\nimport { queryClient } from \"./utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\nimport { queryClient } from \"./utils/trpc\";\n {{/if}}\n {{/unless}}\n{{/if}}\n\nexport const links: Route.LinksFunction = () => [\n { rel: \"preconnect\", href: \"https://fonts.googleapis.com\" },\n { rel: \"preconnect\", href: \"https://fonts.gstatic.com\", crossOrigin: \"anonymous\" },\n {\n rel: \"stylesheet\",\n href:\n \"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap\",\n },\n];\n\nexport function Layout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <Meta />\n <Links />\n </head>\n <body>\n {children}\n <ScrollRestoration />\n <Scripts />\n </body>\n </html>\n );\n}\n\n{{#if (eq backend \"convex\")}}\nexport default function App() {\n const convex = new ConvexReactClient(env.VITE_CONVEX_URL);\n {{#if (eq auth \"clerk\")}}\n return (\n <ClerkProvider publishableKey={env.VITE_CLERK_PUBLISHABLE_KEY}>\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n </ConvexProviderWithClerk>\n </ClerkProvider>\n );\n {{else}}\n return (\n <ConvexProvider client={convex}>\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n </ConvexProvider>\n );\n {{/if}}\n}\n{{else if (eq api \"orpc\")}}\nexport default function App() {\n return (\n <QueryClientProvider client={queryClient}>\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n <ReactQueryDevtools position=\"bottom\" buttonPosition=\"bottom-right\" />\n </QueryClientProvider>\n );\n}\n{{else if (eq api \"trpc\")}}\nexport default function App() {\n return (\n <QueryClientProvider client={queryClient}>\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n <ReactQueryDevtools position=\"bottom\" buttonPosition=\"bottom-right\" />\n </QueryClientProvider>\n );\n}\n{{else}}\nexport default function App() {\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n );\n}\n{{/if}}\n\nexport function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {\n let message = \"Oops!\";\n let details = \"An unexpected error occurred.\";\n let stack: string | undefined;\n if (isRouteErrorResponse(error)) {\n message = error.status === 404 ? \"404\" : \"Error\";\n details =\n error.status === 404\n ? \"The requested page could not be found.\"\n : error.statusText || details;\n } else if (import.meta.env.DEV && error && error instanceof Error) {\n details = error.message;\n stack = error.stack;\n }\n return (\n <main className=\"pt-16 p-4 container mx-auto\">\n <h1>{message}</h1>\n <p>{details}</p>\n {stack && (\n <pre className=\"w-full p-4 overflow-x-auto\">\n <code>{stack}</code>\n </pre>\n )}\n </main>\n );\n}\n`],\n [\"frontend/react/web-base/src/index.css.hbs\", `@import 'tailwindcss';\n@import 'tw-animate-css';\n@import 'shadcn/tailwind.css';\n{{#if (includes examples \"ai\")}}\n@source \"../node_modules/streamdown/dist/*.js\";\n{{/if}}\n\n@custom-variant dark (&:is(.dark *));\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.58 0.22 27);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.809 0.105 251.813);\n --chart-2: oklch(0.623 0.214 259.815);\n --chart-3: oklch(0.546 0.245 262.881);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.424 0.199 265.638);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.87 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.371 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.809 0.105 251.813);\n --chart-2: oklch(0.623 0.214 259.815);\n --chart-3: oklch(0.546 0.245 262.881);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.424 0.199 265.638);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.556 0 0);\n}\n\n@theme inline {\n --font-sans: 'Inter Variable', sans-serif;\n --color-sidebar-ring: var(--sidebar-ring);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar: var(--sidebar);\n --color-chart-5: var(--chart-5);\n --color-chart-4: var(--chart-4);\n --color-chart-3: var(--chart-3);\n --color-chart-2: var(--chart-2);\n --color-chart-1: var(--chart-1);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --color-foreground: var(--foreground);\n --color-background: var(--background);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n --radius-2xl: calc(var(--radius) + 8px);\n --radius-3xl: calc(var(--radius) + 12px);\n --radius-4xl: calc(var(--radius) + 16px);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply font-sans bg-background text-foreground;\n }\n html {\n @apply font-sans;\n }\n}\n`],\n [\"frontend/nuxt/app/pages/index.vue.hbs\", `<script setup lang=\"ts\">\n{{#if (eq backend \"convex\")}}\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport { useConvexQuery } from \"convex-vue\";\n{{else}}\n {{#unless (eq api \"none\")}}\nconst { $orpc } = useNuxtApp()\nimport { useQuery } from '@tanstack/vue-query'\n {{/unless}}\n{{/if}}\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\n{{#if (eq backend \"convex\")}}\nconst healthCheck = useConvexQuery(api.healthCheck.get, {});\n{{else}}\n {{#unless (eq api \"none\")}}\nconst healthCheck = useQuery($orpc.healthCheck.queryOptions())\n {{/unless}}\n{{/if}}\n</script>\n\n<template>\n <UContainer class=\"py-8\">\n <pre class=\"overflow-x-auto font-mono text-sm whitespace-pre-wrap\">\\\\{{ TITLE_TEXT }}</pre>\n\n <div class=\"grid gap-6 mt-6\">\n <UCard>\n <template #header>\n <div class=\"font-medium\">API Status</div>\n </template>\n\n {{#if (eq backend \"convex\")}}\n <div class=\"flex items-center gap-2\">\n <UIcon\n :name=\"healthCheck === undefined ? 'i-lucide-loader-2' : healthCheck.data.value === 'OK' ? 'i-lucide-check-circle' : 'i-lucide-x-circle'\"\n :class=\"[\n healthCheck === undefined ? 'animate-spin text-muted' : '',\n healthCheck?.data.value === 'OK' ? 'text-success' : 'text-error'\n ]\"\n />\n <span class=\"text-sm\">\n \\\\{{\n healthCheck === undefined\n ? \"Checking...\"\n : healthCheck.data.value === \"OK\"\n ? \"Connected\"\n : \"Error\"\n }}\n </span>\n </div>\n {{else}}\n {{#unless (eq api \"none\")}}\n <div class=\"flex items-center gap-2\">\n <UIcon\n :name=\"healthCheck.isLoading.value ? 'i-lucide-loader-2' : healthCheck.isSuccess.value ? 'i-lucide-check-circle' : 'i-lucide-x-circle'\"\n :class=\"[\n healthCheck.isLoading.value ? 'animate-spin text-muted' : '',\n healthCheck.isSuccess.value ? 'text-success' : '',\n healthCheck.isError.value ? 'text-error' : ''\n ]\"\n />\n <span class=\"text-sm\">\n <template v-if=\"healthCheck.isLoading.value\">\n Checking...\n </template>\n <template v-else-if=\"healthCheck.isSuccess.value\">\n Connected (\\\\{{ healthCheck.data.value }})\n </template>\n <template v-else-if=\"healthCheck.isError.value\">\n Error: \\\\{{ healthCheck.error.value?.message || 'Failed to connect' }}\n </template>\n <template v-else>\n Idle\n </template>\n </span>\n </div>\n {{/unless}}\n {{/if}}\n </UCard>\n </div>\n </UContainer>\n</template>\n`],\n [\"frontend/nuxt/app/components/Header.vue.hbs\", `<script setup lang=\"ts\">\nimport type { NavigationMenuItem } from '@nuxt/ui'\n{{#if (eq auth \"better-auth\")}}\nimport UserMenu from './UserMenu.vue'\n{{/if}}\n\nconst route = useRoute()\n\nconst items = computed<NavigationMenuItem[]>(() => [\n { label: \"Home\", to: \"/\", active: route.path === \"/\" },\n {{#if (or (eq auth \"better-auth\") (eq auth \"clerk\"))}}\n { label: \"Dashboard\", to: \"/dashboard\", active: route.path.startsWith(\"/dashboard\") },\n {{/if}}\n {{#if (includes examples \"todo\")}}\n { label: \"Todos\", to: \"/todos\", active: route.path.startsWith(\"/todos\") },\n {{/if}}\n {{#if (includes examples \"ai\")}}\n { label: \"AI Chat\", to: \"/ai\", active: route.path.startsWith(\"/ai\") },\n {{/if}}\n])\n</script>\n\n<template>\n <UHeader>\n <template #left>\n <UNavigationMenu :items=\"items\" />\n </template>\n\n <template #right>\n <UColorModeButton />\n {{#if (eq auth \"better-auth\")}}\n <UserMenu />\n {{/if}}\n </template>\n\n <template #body>\n <UNavigationMenu :items=\"items\" orientation=\"vertical\" class=\"-mx-2.5\" />\n </template>\n </UHeader>\n</template>\n`],\n [\"frontend/nuxt/app/layouts/default.vue.hbs\", `<script setup></script>\n\n<template>\n <div class=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <UMain>\n <slot />\n </UMain>\n </div>\n</template>\n`],\n [\"frontend/solid/src/components/header.tsx.hbs\", `import { Link } from \"@tanstack/solid-router\";\n{{#if (eq auth \"better-auth\")}}\nimport UserMenu from \"./user-menu\";\n{{/if}}\nimport { For } from \"solid-js\";\n\nexport default function Header() {\n const links = [\n { to: \"/\", label: \"Home\" },\n {{#if (eq auth \"better-auth\")}}\n { to: \"/dashboard\", label: \"Dashboard\" },\n {{/if}}\n {{#if (includes examples \"todo\")}}\n { to: \"/todos\", label: \"Todos\" },\n {{/if}}\n {{#if (includes examples \"ai\")}}\n { to: \"/ai\", label: \"AI Chat\" },\n {{/if}}\n ];\n\n return (\n <div>\n <div class=\"flex flex-row items-center justify-between px-2 py-1\">\n <nav class=\"flex gap-4 text-lg\">\n <For each={links}>\n {(link) => <Link to={link.to}>{link.label}</Link>}\n </For>\n </nav>\n <div class=\"flex items-center gap-2\">\n {{#if (eq auth \"better-auth\")}}\n <UserMenu />\n {{/if}}\n </div>\n </div>\n <hr />\n </div>\n );\n}\n`],\n [\"frontend/solid/src/components/loader.tsx\", `import { Loader2 } from \"lucide-solid\";\n\nexport default function Loader() {\n return (\n <div class=\"flex h-full items-center justify-center pt-8\">\n <Loader2 class=\"animate-spin\" />\n </div>\n );\n}\n`],\n [\"frontend/solid/src/routes/index.tsx.hbs\", `import { createFileRoute } from \"@tanstack/solid-router\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/solid-query\";\nimport { orpc } from \"../utils/orpc\";\nimport { Match, Switch } from \"solid-js\";\n{{else}}\n{{/if}}\n\nexport const Route = createFileRoute(\"/\")({\n component: App,\n});\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\nfunction App() {\n {{#if (eq api \"orpc\")}}\n const healthCheck = useQuery(() => orpc.healthCheck.queryOptions());\n {{/if}}\n\n return (\n <div class=\"container mx-auto max-w-3xl px-4 py-2\">\n <pre class=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n <div class=\"grid gap-6\">\n {{#if (eq api \"orpc\")}}\n <section class=\"rounded-lg border p-4\">\n <h2 class=\"mb-2 font-medium\">API Status</h2>\n <Switch>\n <Match when={healthCheck.isPending}>\n <div class=\"flex items-center gap-2\">\n <div class=\"h-2 w-2 rounded-full bg-gray-500 animate-pulse\" />{\" \"}\n <span class=\"text-sm text-muted-foreground\">Checking...</span>\n </div>\n </Match>\n <Match when={healthCheck.isError}>\n <div class=\"flex items-center gap-2\">\n <div class=\"h-2 w-2 rounded-full bg-red-500\" />\n <span class=\"text-sm text-muted-foreground\">Disconnected</span>\n </div>\n </Match>\n <Match when={healthCheck.isSuccess}>\n <div class=\"flex items-center gap-2\">\n <div\n class={\\`h-2 w-2 rounded-full \\${healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n />\n <span class=\"text-sm text-muted-foreground\">\n {healthCheck.data\n ? \"Connected\"\n : \"Disconnected\"}\n </span>\n </div>\n </Match>\n </Switch>\n </section>\n {{/if}}\n </div>\n </div>\n );\n}\n`],\n [\"frontend/solid/src/routes/__root.tsx.hbs\", `import Header from \"@/components/header\";\nimport { Outlet, createRootRouteWithContext } from \"@tanstack/solid-router\";\nimport { TanStackRouterDevtools } from \"@tanstack/solid-router-devtools\";\n{{#if (eq api \"orpc\")}}\nimport { SolidQueryDevtools } from \"@tanstack/solid-query-devtools\";\nimport type { QueryClient } from \"@tanstack/solid-query\";\nimport type { orpc } from \"../utils/orpc\";\n\nexport interface RouterContext {\n orpc: typeof orpc;\n queryClient: QueryClient;\n}\n{{else}}\nexport interface RouterContext {}\n{{/if}}\n\nexport const Route = createRootRouteWithContext<RouterContext>()({\n component: RootComponent,\n});\n\nfunction RootComponent() {\n return (\n <>\n <div class=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n {{#if (eq api \"orpc\")}}\n <SolidQueryDevtools />\n {{/if}}\n <TanStackRouterDevtools />\n </>\n );\n}\n`],\n [\"frontend/native/uniwind/components/container.tsx.hbs\", `import { cn } from \"heroui-native\";\nimport { type PropsWithChildren } from \"react\";\nimport { ScrollView, View, type ViewProps } from \"react-native\";\nimport Animated, { type AnimatedProps } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nconst AnimatedView = Animated.createAnimatedComponent(View);\n\ntype Props = AnimatedProps<ViewProps> & {\n\tclassName?: string;\n};\n\nexport function Container({\n\tchildren,\n\tclassName,\n\t...props\n}: PropsWithChildren<Props>) {\n\tconst insets = useSafeAreaInsets();\n\n\treturn (\n\t\t<AnimatedView\n\t\t\tclassName={cn(\"flex-1 bg-background\", className)}\n\t\t\tstyle=\\\\{{\n\t\t\t\tpaddingBottom: insets.bottom,\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollView contentContainerStyle=\\\\{{ flexGrow: 1 }}>\n\t\t\t\t{children}\n\t\t\t</ScrollView>\n\t\t</AnimatedView>\n\t);\n}\n`],\n [\"frontend/native/uniwind/components/theme-toggle.tsx.hbs\", `import { Ionicons } from '@expo/vector-icons';\nimport * as Haptics from 'expo-haptics';\nimport { Platform, Pressable } from 'react-native';\nimport Animated, { FadeOut, ZoomIn } from 'react-native-reanimated';\nimport { withUniwind } from 'uniwind';\nimport { useAppTheme } from '@/contexts/app-theme-context';\n\nconst StyledIonicons = withUniwind(Ionicons);\n\nexport function ThemeToggle() {\n\tconst { toggleTheme, isLight } = useAppTheme();\n\n\treturn (\n\t\t<Pressable\n\t\t\tonPress={() => {\n\t\t\t\tif (Platform.OS === 'ios') {\n\t\t\t\t\tHaptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n\t\t\t\t}\n\t\t\t\ttoggleTheme();\n\t\t\t}}\n\t\t\tclassName=\"px-2.5\"\n\t\t>\n\t\t\t{isLight ? (\n\t\t\t\t<Animated.View key=\"moon\" entering={ZoomIn} exiting={FadeOut}>\n\t\t\t\t\t<StyledIonicons name=\"moon\" size={20} className=\"text-foreground\" />\n\t\t\t\t</Animated.View>\n\t\t\t) : (\n\t\t\t\t<Animated.View key=\"sun\" entering={ZoomIn} exiting={FadeOut}>\n\t\t\t\t\t<StyledIonicons name=\"sunny\" size={20} className=\"text-foreground\" />\n\t\t\t\t</Animated.View>\n\t\t\t)}\n\t\t</Pressable>\n\t);\n}\n\n`],\n [\"frontend/native/uniwind/app/_layout.tsx.hbs\", `{{#if (includes examples \"ai\")}}\nimport \"@/polyfills\";\n{{/if}}\n\nimport \"@/global.css\";\n\n{{#if (eq backend \"convex\")}}\n {{#if (eq auth \"better-auth\")}}\n import { ConvexReactClient } from \"convex/react\";\n import { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\n import { authClient } from \"@/lib/auth-client\";\n import { env } from \"@{{projectName}}/env/native\";\n {{else}}\n import { ConvexProvider, ConvexReactClient } from \"convex/react\";\n import { env } from \"@{{projectName}}/env/native\";\n {{/if}}\n\n {{#if (eq auth \"clerk\")}}\n import { ClerkProvider, useAuth } from \"@clerk/clerk-expo\";\n import { ConvexProviderWithClerk } from \"convex/react-clerk\";\n import { tokenCache } from \"@clerk/clerk-expo/token-cache\";\n {{/if}}\n{{else}}\n {{#unless (eq api \"none\")}}\n import { QueryClientProvider } from \"@tanstack/react-query\";\n {{/unless}}\n{{/if}}\n\nimport { Stack } from \"expo-router\";\nimport { HeroUINativeProvider } from \"heroui-native\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { KeyboardProvider } from \"react-native-keyboard-controller\";\nimport { AppThemeProvider } from \"@/contexts/app-theme-context\";\n\n{{#if (eq api \"trpc\")}}\n import { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\n import { queryClient } from \"@/utils/orpc\";\n{{/if}}\n\nexport const unstable_settings = {\n initialRouteName: \"(drawer)\",\n};\n\n{{#if (eq backend \"convex\")}}\n const convex = new ConvexReactClient(env.EXPO_PUBLIC_CONVEX_URL, {\n unsavedChangesWarning: false,\n });\n{{/if}}\n\nfunction StackLayout() {\n return (\n <Stack screenOptions=\\\\{{}}>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n {{#if (eq auth \"clerk\")}}\n <Stack.Screen name=\"(auth)\" options=\\\\{{ headerShown: false }} />\n {{/if}}\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n );\n}\n\nexport default function Layout() {\n return (\n {{#if (eq backend \"convex\")}}\n {{#if (eq auth \"clerk\")}}\n <ClerkProvider tokenCache={tokenCache} publishableKey={env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY}>\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <KeyboardProvider>\n <AppThemeProvider>\n <HeroUINativeProvider>\n <StackLayout />\n </HeroUINativeProvider>\n </AppThemeProvider>\n </KeyboardProvider>\n </GestureHandlerRootView>\n </ConvexProviderWithClerk>\n </ClerkProvider>\n {{else if (eq auth \"better-auth\")}}\n <ConvexBetterAuthProvider client={convex} authClient={authClient}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <KeyboardProvider>\n <AppThemeProvider>\n <HeroUINativeProvider>\n <StackLayout />\n </HeroUINativeProvider>\n </AppThemeProvider>\n </KeyboardProvider>\n </GestureHandlerRootView>\n </ConvexBetterAuthProvider>\n {{else}}\n <ConvexProvider client={convex}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <KeyboardProvider>\n <AppThemeProvider>\n <HeroUINativeProvider>\n <StackLayout />\n </HeroUINativeProvider>\n </AppThemeProvider>\n </KeyboardProvider>\n </GestureHandlerRootView>\n </ConvexProvider>\n {{/if}}\n {{else}}\n {{#unless (eq api \"none\")}}\n <QueryClientProvider client={queryClient}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <KeyboardProvider>\n <AppThemeProvider>\n <HeroUINativeProvider>\n <StackLayout />\n </HeroUINativeProvider>\n </AppThemeProvider>\n </KeyboardProvider>\n </GestureHandlerRootView>\n </QueryClientProvider>\n {{else}}\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <KeyboardProvider>\n <AppThemeProvider>\n <HeroUINativeProvider>\n <StackLayout />\n </HeroUINativeProvider>\n </AppThemeProvider>\n </KeyboardProvider>\n </GestureHandlerRootView>\n {{/unless}}\n {{/if}}\n );\n}`],\n [\"frontend/native/uniwind/app/modal.tsx.hbs\", `import { Ionicons } from \"@expo/vector-icons\";\nimport { router } from \"expo-router\";\nimport { Button, Surface, useThemeColor } from \"heroui-native\";\nimport { Text, View } from \"react-native\";\n\nimport { Container } from \"@/components/container\";\n\nfunction Modal() {\n\tconst accentForegroundColor = useThemeColor(\"accent-foreground\");\n\n\tfunction handleClose() {\n\t\trouter.back();\n\t}\n\n\treturn (\n\t\t<Container>\n\t\t\t<View className=\"flex-1 justify-center items-center p-4\">\n\t\t\t\t<Surface variant=\"secondary\" className=\"p-5 w-full max-w-sm rounded-lg\">\n\t\t\t\t\t<View className=\"items-center\">\n\t\t\t\t\t\t<View className=\"w-12 h-12 bg-accent rounded-lg items-center justify-center mb-3\">\n\t\t\t\t\t\t\t<Ionicons name=\"checkmark\" size={24} color={accentForegroundColor} />\n\t\t\t\t\t\t</View>\n\t\t\t\t\t\t<Text className=\"text-foreground font-medium text-lg mb-1\">Modal Screen</Text>\n\t\t\t\t\t\t<Text className=\"text-muted text-sm text-center mb-4\">\n\t\t\t\t\t\t\tThis is an example modal screen for dialogs and confirmations.\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</View>\n\t\t\t\t\t<Button onPress={handleClose} className=\"w-full\" size=\"sm\">\n\t\t\t\t\t\t<Button.Label>Close</Button.Label>\n\t\t\t\t\t</Button>\n\t\t\t\t</Surface>\n\t\t\t</View>\n\t\t</Container>\n\t);\n}\n\nexport default Modal;\n`],\n [\"frontend/native/uniwind/app/+not-found.tsx.hbs\", `import { Link, Stack } from \"expo-router\";\nimport { Button, Surface } from \"heroui-native\";\nimport { Text, View } from \"react-native\";\n\nimport { Container } from \"@/components/container\";\n\nexport default function NotFoundScreen() {\n\treturn (\n\t\t<>\n\t\t\t<Stack.Screen options=\\\\{{ title: \"Not Found\" }} />\n\t\t\t<Container>\n\t\t\t\t<View className=\"flex-1 justify-center items-center p-4\">\n\t\t\t\t\t<Surface variant=\"secondary\" className=\"items-center p-6 max-w-sm rounded-lg\">\n\t\t\t\t\t\t<Text className=\"text-4xl mb-3\">🤔</Text>\n\t\t\t\t\t\t<Text className=\"text-foreground font-medium text-lg mb-1\">Page Not Found</Text>\n\t\t\t\t\t\t<Text className=\"text-muted text-sm text-center mb-4\">\n\t\t\t\t\t\t\tThe page you're looking for doesn't exist.\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Link href=\"/\" asChild>\n\t\t\t\t\t\t\t<Button size=\"sm\">Go Home</Button>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</Surface>\n\t\t\t\t</View>\n\t\t\t</Container>\n\t\t</>\n\t);\n}\n`],\n [\"frontend/native/uniwind/contexts/app-theme-context.tsx.hbs\", `import React, { createContext, useCallback, useContext, useMemo } from 'react';\nimport { Uniwind, useUniwind } from 'uniwind';\n\ntype ThemeName = 'light' | 'dark';\n\ntype AppThemeContextType = {\n currentTheme: string;\n isLight: boolean;\n isDark: boolean;\n setTheme: (theme: ThemeName) => void;\n toggleTheme: () => void;\n}\n\nconst AppThemeContext = createContext<AppThemeContextType | undefined>(\n undefined\n);\n\nexport const AppThemeProvider = ({ children }: { children: React.ReactNode }) => {\n const { theme } = useUniwind();\n\n const isLight = useMemo(() => {\n return theme === 'light';\n }, [theme]);\n\n const isDark = useMemo(() => {\n return theme === 'dark';\n }, [theme]);\n\n const setTheme = useCallback((newTheme: ThemeName) => {\n Uniwind.setTheme(newTheme);\n }, []);\n\n const toggleTheme = useCallback(() => {\n Uniwind.setTheme(theme === 'light' ? 'dark' : 'light');\n }, [theme]);\n\n const value = useMemo(\n () => ({\n currentTheme: theme,\n isLight,\n isDark,\n setTheme,\n toggleTheme,\n }),\n [theme, isLight, isDark, setTheme, toggleTheme]\n );\n\n return (\n <AppThemeContext.Provider value={value}>\n {children}\n </AppThemeContext.Provider>\n );\n};\n\nexport function useAppTheme() {\n const context = useContext(AppThemeContext);\n if (!context) {\n throw new Error('useAppTheme must be used within AppThemeProvider');\n }\n return context;\n}\n\n`],\n [\"frontend/native/unistyles/components/container.tsx.hbs\", `import React from \"react\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport const Container = ({ children }: { children: React.ReactNode }) => {\n return <SafeAreaView style={styles.container}>{children}</SafeAreaView>;\n};\n\nconst styles = StyleSheet.create((theme, rt) => ({\n container: {\n flex: 1,\n backgroundColor: theme.colors.background,\n paddingBottom: rt.insets.bottom,\n },\n}));\n`],\n [\"frontend/native/unistyles/components/header-button.tsx.hbs\", `import FontAwesome from \"@expo/vector-icons/FontAwesome\";\nimport { forwardRef } from \"react\";\nimport { Pressable } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport const HeaderButton = forwardRef<\n typeof Pressable,\n { onPress?: () => void }\n>(({ onPress }, ref) => {\n return (\n <Pressable onPress={onPress} style={styles.button}>\n {({ pressed }) => (\n <FontAwesome\n name=\"info-circle\"\n size={20}\n color={styles.icon.color}\n style=\\\\{{\n opacity: pressed ? 0.7 : 1,\n }}\n />\n )}\n </Pressable>\n );\n});\n\nconst styles = StyleSheet.create((theme) => ({\n button: {\n padding: theme.spacing.sm,\n marginRight: theme.spacing.sm,\n borderRadius: theme.borderRadius.lg,\n backgroundColor: \\`\\${theme.colors.secondary}80\\`, // 50% opacity\n },\n icon: {\n color: theme.colors.secondaryForeground,\n },\n}));\n`],\n [\"frontend/native/unistyles/components/tabbar-icon.tsx.hbs\", `import FontAwesome from \"@expo/vector-icons/FontAwesome\";\n\nexport const TabBarIcon = (props: {\n name: React.ComponentProps<typeof FontAwesome>[\"name\"];\n color: string;\n}) => {\n return <FontAwesome size={24} style=\\\\{{ marginBottom: -3 }} {...props} />;\n};\n`],\n [\"frontend/native/unistyles/app/_layout.tsx.hbs\", `{{#if (includes examples \"ai\")}}\nimport \"@/polyfills\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq backend \"convex\")}}\n{{#if (eq auth \"better-auth\")}}\nimport { ConvexReactClient } from \"convex/react\";\nimport { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { env } from \"@{{projectName}}/env/native\";\n{{else}}\nimport { ConvexProvider, ConvexReactClient } from \"convex/react\";\nimport { env } from \"@{{projectName}}/env/native\";\n{{/if}}\n{{#if (eq auth \"clerk\")}}\nimport { ClerkProvider, useAuth } from \"@clerk/clerk-expo\";\nimport { ConvexProviderWithClerk } from \"convex/react-clerk\";\nimport { tokenCache } from \"@clerk/clerk-expo/token-cache\";\n{{/if}}\n{{else}}\n {{#unless (eq api \"none\")}}\nimport { QueryClientProvider } from \"@tanstack/react-query\";\n {{/unless}}\n{{/if}}\nimport { Stack } from \"expo-router\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { useUnistyles } from \"react-native-unistyles\";\nimport { StatusBar } from \"expo-status-bar\";\n\nexport const unstable_settings = {\n initialRouteName: \"(drawer)\",\n};\n\n{{#if (eq backend \"convex\")}}\nconst convex = new ConvexReactClient(env.EXPO_PUBLIC_CONVEX_URL, {\n unsavedChangesWarning: false,\n});\n{{/if}}\n\nexport default function RootLayout() {\n const { theme } = useUnistyles();\n\n return (\n {{#if (eq backend \"convex\")}}\n {{#if (eq auth \"clerk\")}}\n <ClerkProvider\n tokenCache={tokenCache}\n publishableKey={env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY}\n >\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <Stack\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n }}\n >\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"(auth)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen\n name=\"modal\"\n options=\\\\{{ title: \"Modal\", presentation: \"modal\" }}\n />\n </Stack>\n </GestureHandlerRootView>\n </ConvexProviderWithClerk>\n </ClerkProvider>\n {{else if (eq auth \"better-auth\")}}\n <ConvexBetterAuthProvider client={convex} authClient={authClient}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <Stack\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n }}\n >\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen\n name=\"modal\"\n options=\\\\{{ title: \"Modal\", presentation: \"modal\" }}\n />\n </Stack>\n </GestureHandlerRootView>\n </ConvexBetterAuthProvider>\n {{else}}\n <ConvexProvider client={convex}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <Stack\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n }}\n >\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen\n name=\"modal\"\n options=\\\\{{ title: \"Modal\", presentation: \"modal\" }}\n />\n </Stack>\n </GestureHandlerRootView>\n </ConvexProvider>\n {{/if}}\n {{else}}\n {{#unless (eq api \"none\")}}\n <QueryClientProvider client={queryClient}>\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <Stack\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n }}\n >\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen\n name=\"modal\"\n options=\\\\{{ title: \"Modal\", presentation: \"modal\" }}\n />\n </Stack>\n </GestureHandlerRootView>\n </QueryClientProvider>\n {{else}}\n <GestureHandlerRootView style=\\\\{{ flex: 1 }}>\n <Stack\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n }}\n >\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen\n name=\"modal\"\n options=\\\\{{ title: \"Modal\", presentation: \"modal\" }}\n />\n </Stack>\n </GestureHandlerRootView>\n {{/unless}}\n {{/if}}\n );\n}\n`],\n [\"frontend/native/unistyles/app/modal.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { Text, View } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport default function Modal() {\n return (\n <Container>\n <View style={styles.container}>\n <View style={styles.header}>\n <Text style={styles.title}>Modal</Text>\n </View>\n </View>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n flex: 1,\n padding: theme.spacing.lg,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: theme.spacing.xl,\n },\n title: {\n fontSize: theme.fontSize[\"2xl\"],\n fontWeight: \"bold\",\n color: theme.colors.foreground,\n },\n}));\n`],\n [\"frontend/native/unistyles/app/+not-found.tsx.hbs\", `import { Link, Stack } from \"expo-router\";\nimport { Text, View } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\nimport { Container } from \"@/components/container\";\n\nexport default function NotFoundScreen() {\n return (\n <>\n <Stack.Screen options=\\\\{{ title: \"Oops!\" }} />\n <Container>\n <View style={styles.container}>\n <View style={styles.content}>\n <Text style={styles.emoji}>🤔</Text>\n <Text style={styles.title}>Page Not Found</Text>\n <Text style={styles.description}>\n Sorry, the page you're looking for doesn't exist.\n </Text>\n <Link href=\"/\" style={styles.button}>\n <Text style={styles.buttonText}>Go to Home</Text>\n </Link>\n </View>\n </View>\n </Container>\n </>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: theme.spacing.lg,\n },\n content: {\n alignItems: \"center\",\n },\n emoji: {\n fontSize: 64,\n marginBottom: theme.spacing.md,\n },\n title: {\n fontSize: theme.fontSize[\"2xl\"],\n fontWeight: \"bold\",\n color: theme.colors.foreground,\n marginBottom: theme.spacing.sm,\n textAlign: \"center\",\n },\n description: {\n color: theme.colors.mutedForeground,\n textAlign: \"center\",\n marginBottom: theme.spacing.xl,\n maxWidth: 280,\n },\n button: {\n backgroundColor: \\`\\${theme.colors.primary}1A\\`, // 10% opacity\n paddingHorizontal: theme.spacing.lg,\n paddingVertical: theme.spacing.sm + 4,\n borderRadius: theme.borderRadius.lg,\n },\n buttonText: {\n color: theme.colors.primary,\n fontWeight: \"500\",\n },\n}));\n`],\n [\"frontend/native/bare/components/container.tsx.hbs\", `import React from \"react\";\nimport { SafeAreaView } from \"react-native-safe-area-context\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\nimport { StyleSheet } from \"react-native\";\n\nexport function Container({ children }: { children: React.ReactNode }) {\n const { colorScheme } = useColorScheme();\n const backgroundColor = colorScheme === \"dark\" \n ? NAV_THEME.dark.background \n : NAV_THEME.light.background;\n\n return (\n <SafeAreaView style={[styles.container, { backgroundColor }]}>\n {children}\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n\n`],\n [\"frontend/native/bare/components/header-button.tsx.hbs\", `import FontAwesome from \"@expo/vector-icons/FontAwesome\";\nimport { forwardRef } from \"react\";\nimport { Pressable, StyleSheet, View } from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport const HeaderButton = forwardRef<\n View,\n { onPress?: () => void }\n>(({ onPress }, ref) => {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Pressable\n ref={ref}\n onPress={onPress}\n style={({ pressed }) => [\n styles.button,\n {\n backgroundColor: pressed \n ? theme.background \n : theme.card,\n },\n ]}\n >\n {({ pressed }) => (\n <FontAwesome\n name=\"info-circle\"\n size={20}\n color={theme.text}\n style=\\\\{{\n opacity: pressed ? 0.7 : 1,\n }}\n />\n )}\n </Pressable>\n );\n});\n\nconst styles = StyleSheet.create({\n button: {\n padding: 8,\n marginRight: 8,\n },\n});\n\n`],\n [\"frontend/native/bare/components/tabbar-icon.tsx.hbs\", `import FontAwesome from \"@expo/vector-icons/FontAwesome\";\n\nexport const TabBarIcon = (props: {\n name: React.ComponentProps<typeof FontAwesome>[\"name\"];\n color: string;\n}) => {\n return <FontAwesome size={24} style=\\\\{{ marginBottom: -3 }} {...props} />;\n};\n\n`],\n [\"frontend/native/bare/lib/constants.ts.hbs\", `export const NAV_THEME = {\n light: {\n background: \"hsl(0 0% 100%)\",\n border: \"hsl(220 13% 91%)\",\n card: \"hsl(0 0% 100%)\",\n notification: \"hsl(0 84.2% 60.2%)\",\n primary: \"hsl(221.2 83.2% 53.3%)\",\n text: \"hsl(222.2 84% 4.9%)\",\n },\n dark: {\n background: \"hsl(222.2 84% 4.9%)\",\n border: \"hsl(217.2 32.6% 17.5%)\",\n card: \"hsl(222.2 84% 4.9%)\",\n notification: \"hsl(0 72% 51%)\",\n primary: \"hsl(217.2 91.2% 59.8%)\",\n text: \"hsl(210 40% 98%)\",\n },\n};\n\n`],\n [\"frontend/native/bare/lib/use-color-scheme.ts.hbs\", `import { useColorScheme as useRNColorScheme } from \"react-native\";\n\nexport function useColorScheme() {\n const systemColorScheme = useRNColorScheme();\n const colorScheme = systemColorScheme ?? \"light\";\n \n return {\n colorScheme: colorScheme as \"light\" | \"dark\",\n isDarkColorScheme: colorScheme === \"dark\",\n setColorScheme: () => {\n // Color scheme is managed by the system in bare mode\n console.warn(\"setColorScheme is not available in bare mode. Color scheme is managed by the system.\");\n },\n toggleColorScheme: () => {\n // Color scheme is managed by the system in bare mode\n console.warn(\"toggleColorScheme is not available in bare mode. Color scheme is managed by the system.\");\n },\n };\n}\n\n`],\n [\"frontend/native/bare/lib/android-navigation-bar.tsx.hbs\", `import * as NavigationBar from \"expo-navigation-bar\";\nimport { Platform } from \"react-native\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport async function setAndroidNavigationBar(theme: \"light\" | \"dark\") {\n if (Platform.OS !== \"android\") return;\n await NavigationBar.setButtonStyleAsync(theme === \"dark\" ? \"light\" : \"dark\");\n await NavigationBar.setBackgroundColorAsync(\n theme === \"dark\" ? NAV_THEME.dark.background : NAV_THEME.light.background,\n );\n}\n\n`],\n [\"frontend/native/bare/app/_layout.tsx.hbs\", `{{#if (includes examples \"ai\")}}\nimport \"@/polyfills\";\n{{/if}}\n\n{{#if (eq backend \"convex\")}}\n {{#if (eq auth \"better-auth\")}}\n import { ConvexReactClient } from \"convex/react\";\n import { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\n import { authClient } from \"@/lib/auth-client\";\n import { env } from \"@{{projectName}}/env/native\";\n {{else}}\n import { ConvexProvider, ConvexReactClient } from \"convex/react\";\n import { env } from \"@{{projectName}}/env/native\";\n {{/if}}\n {{#if (eq auth \"clerk\")}}\n import { ClerkProvider, useAuth } from \"@clerk/clerk-expo\";\n import { ConvexProviderWithClerk } from \"convex/react-clerk\";\n import { tokenCache } from \"@clerk/clerk-expo/token-cache\";\n {{/if}}\n{{else}}\n {{#unless (eq api \"none\")}}\n import { QueryClientProvider } from \"@tanstack/react-query\";\n {{/unless}}\n{{/if}}\n\nimport { Stack } from \"expo-router\";\nimport {\n DarkTheme,\n DefaultTheme,\n type Theme,\n ThemeProvider,\n} from \"@react-navigation/native\";\nimport { StatusBar } from \"expo-status-bar\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { NAV_THEME } from \"@/lib/constants\";\nimport React, { useRef } from \"react\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { Platform, StyleSheet } from \"react-native\";\nimport { setAndroidNavigationBar } from \"@/lib/android-navigation-bar\";\n\nconst LIGHT_THEME: Theme = {\n ...DefaultTheme,\n colors: NAV_THEME.light,\n};\nconst DARK_THEME: Theme = {\n ...DarkTheme,\n colors: NAV_THEME.dark,\n};\n\nexport const unstable_settings = {\n initialRouteName: \"(drawer)\",\n};\n\n{{#if (eq backend \"convex\")}}\nconst convex = new ConvexReactClient(env.EXPO_PUBLIC_CONVEX_URL, {\n unsavedChangesWarning: false,\n});\n{{/if}}\n\nconst useIsomorphicLayoutEffect =\n Platform.OS === \"web\" && typeof window === \"undefined\"\n ? React.useEffect\n : React.useLayoutEffect;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n\nexport default function RootLayout() {\n const hasMounted = useRef(false);\n const { colorScheme, isDarkColorScheme } = useColorScheme();\n const [isColorSchemeLoaded, setIsColorSchemeLoaded] = React.useState(false);\n\n useIsomorphicLayoutEffect(() => {\n if (hasMounted.current) {\n return;\n }\n setAndroidNavigationBar(colorScheme);\n setIsColorSchemeLoaded(true);\n hasMounted.current = true;\n }, []);\n\n if (!isColorSchemeLoaded) {\n return null;\n }\n\n return (\n <>\n {{#if (eq backend \"convex\")}}\n {{#if (eq auth \"clerk\")}}\n <ClerkProvider tokenCache={tokenCache} publishableKey={env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY}>\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n <ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>\n <StatusBar style={isDarkColorScheme ? \"light\" : \"dark\"} />\n <GestureHandlerRootView style={styles.container}>\n <Stack>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"(auth)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n </GestureHandlerRootView>\n </ThemeProvider>\n </ConvexProviderWithClerk>\n </ClerkProvider>\n {{else if (eq auth \"better-auth\")}}\n <ConvexBetterAuthProvider client={convex} authClient={authClient}>\n <ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>\n <StatusBar style={isDarkColorScheme ? \"light\" : \"dark\"} />\n <GestureHandlerRootView style={styles.container}>\n <Stack>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n </GestureHandlerRootView>\n </ThemeProvider>\n </ConvexBetterAuthProvider>\n {{else}}\n <ConvexProvider client={convex}>\n <ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>\n <StatusBar style={isDarkColorScheme ? \"light\" : \"dark\"} />\n <GestureHandlerRootView style={styles.container}>\n <Stack>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n </GestureHandlerRootView>\n </ThemeProvider>\n </ConvexProvider>\n {{/if}}\n {{else}}\n {{#unless (eq api \"none\")}}\n <QueryClientProvider client={queryClient}>\n <ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>\n <StatusBar style={isDarkColorScheme ? \"light\" : \"dark\"} />\n <GestureHandlerRootView style={styles.container}>\n <Stack>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n </GestureHandlerRootView>\n </ThemeProvider>\n </QueryClientProvider>\n {{else}}\n <ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>\n <StatusBar style={isDarkColorScheme ? \"light\" : \"dark\"} />\n <GestureHandlerRootView style={styles.container}>\n <Stack>\n <Stack.Screen name=\"(drawer)\" options=\\\\{{ headerShown: false }} />\n <Stack.Screen name=\"modal\" options=\\\\{{ title: \"Modal\", presentation: \"modal\" }} />\n </Stack>\n </GestureHandlerRootView>\n </ThemeProvider>\n {{/unless}}\n {{/if}}\n </>\n );\n}`],\n [\"frontend/native/bare/app/modal.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { Text, View, StyleSheet } from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport default function Modal() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Container>\n <View style={styles.container}>\n <View style={styles.header}>\n <Text style={[styles.title, { color: theme.text }]}>Modal</Text>\n </View>\n </View>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n padding: 16,\n },\n header: {\n marginBottom: 16,\n },\n title: {\n fontSize: 20,\n fontWeight: \"bold\",\n },\n});\n\n`],\n [\"frontend/native/bare/app/+not-found.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { Link, Stack } from \"expo-router\";\nimport { Text, View, StyleSheet } from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport default function NotFoundScreen() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <>\n <Stack.Screen options=\\\\{{ title: \"Oops!\" }} />\n <Container>\n <View style={styles.container}>\n <View style={styles.content}>\n <Text style={styles.emoji}>🤔</Text>\n <Text style={[styles.title, { color: theme.text }]}>\n Page Not Found\n </Text>\n <Text style={[styles.subtitle, { color: theme.text, opacity: 0.7 }]}>\n Sorry, the page you're looking for doesn't exist.\n </Text>\n <Link href=\"/\" asChild>\n <Text style={[styles.link, { color: theme.primary, backgroundColor: \\`\\${theme.primary}1a\\` }]}>\n Go to Home\n </Text>\n </Link>\n </View>\n </View>\n </Container>\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 16,\n },\n content: {\n alignItems: \"center\",\n },\n emoji: {\n fontSize: 48,\n marginBottom: 16,\n },\n title: {\n fontSize: 20,\n fontWeight: \"bold\",\n marginBottom: 8,\n textAlign: \"center\",\n },\n subtitle: {\n fontSize: 14,\n textAlign: \"center\",\n marginBottom: 24,\n },\n link: {\n padding: 12,\n },\n});\n\n`],\n [\"db/prisma/mysql/prisma/schema/schema.prisma.hbs\", `generator client {\n provider = \"prisma-client\"\n output = \"../generated\"\n moduleFormat = \"esm\"\n {{#if (eq runtime \"bun\")}}\n runtime = \"bun\"\n {{/if}}\n {{#if (eq runtime \"node\")}}\n runtime = \"nodejs\"\n {{/if}}\n {{#if (or (eq runtime \"workers\") (and (eq backend \"self\") (eq webDeploy \"cloudflare\")))}}\n runtime = \"workerd\"\n {{/if}}\n}\n\ndatasource db {\n provider = \"mysql\"\n {{#if (eq dbSetup \"planetscale\")}}\n relationMode = \"prisma\"\n {{/if}}\n}`],\n [\"db/drizzle/base/src/schema/index.ts.hbs\", `{{#if (eq auth \"better-auth\")}}\nexport * from \"./auth\";\n{{/if}}\n{{#if (includes examples \"todo\")}}\nexport * from \"./todo\";\n{{/if}}\nexport {};`],\n [\"db/prisma/mongodb/prisma/schema/schema.prisma.hbs\", `generator client {\n provider = \"prisma-client\"\n output = \"../generated\"\n moduleFormat = \"esm\"\n {{#if (eq runtime \"bun\")}}\n runtime = \"bun\"\n {{/if}}\n {{#if (eq runtime \"node\")}}\n runtime = \"nodejs\"\n {{/if}}\n {{#if (or (eq runtime \"workers\") (and (eq backend \"self\") (eq webDeploy \"cloudflare\")))}}\n runtime = \"workerd\"\n {{/if}}\n}\n\ndatasource db {\n provider = \"mongodb\"\n url = env(\"DATABASE_URL\")\n}\n`],\n [\"db/prisma/sqlite/prisma/schema/schema.prisma.hbs\", `generator client {\n provider = \"prisma-client\"\n output = \"../generated\"\n moduleFormat = \"esm\"\n {{#if (eq runtime \"bun\")}}\n runtime = \"bun\"\n {{/if}}\n {{#if (eq runtime \"node\")}}\n runtime = \"nodejs\"\n {{/if}}\n {{#if (or (eq runtime \"workers\") (and (eq backend \"self\") (eq webDeploy \"cloudflare\")))}}\n runtime = \"workerd\"\n {{/if}}\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n`],\n [\"db/prisma/postgres/prisma/schema/schema.prisma.hbs\", `generator client {\n provider = \"prisma-client\"\n output = \"../generated\"\n moduleFormat = \"esm\"\n {{#if (eq runtime \"bun\")}}\n runtime = \"bun\"\n {{/if}}\n {{#if (eq runtime \"node\")}}\n runtime = \"nodejs\"\n {{/if}}\n {{#if (or (eq runtime \"workers\") (and (eq backend \"self\") (eq webDeploy \"cloudflare\")))}}\n runtime = \"workerd\"\n {{/if}}\n}\n\ndatasource db {\n provider = \"postgresql\"\n {{#if (eq dbSetup \"planetscale\")}}\n relationMode = \"prisma\"\n {{/if}}\n}\n`],\n [\"api/orpc/server/src/routers/index.ts.hbs\", `{{#if (eq api \"orpc\")}}\nimport { {{#if (eq auth \"better-auth\")}}protectedProcedure, {{/if}}publicProcedure } from \"../index\";\nimport type { RouterClient } from \"@orpc/server\";\n{{#if (includes examples \"todo\")}}\nimport { todoRouter } from \"./todo\";\n{{/if}}\n\nexport const appRouter = {\n healthCheck: publicProcedure.handler(() => {\n return \"OK\";\n }),\n {{#if (eq auth \"better-auth\")}}\n privateData: protectedProcedure.handler(({ context }) => {\n return {\n message: \"This is private\",\n user: context.session?.user,\n };\n }),\n {{/if}}\n {{#if (includes examples \"todo\")}}\n todo: todoRouter,\n {{/if}}\n};\nexport type AppRouter = typeof appRouter;\nexport type AppRouterClient = RouterClient<typeof appRouter>;\n{{else if (eq api \"trpc\")}}\nimport {\n {{#if (eq auth \"better-auth\")}}protectedProcedure, {{/if}}publicProcedure,\n router,\n} from \"../index\";\n{{#if (includes examples \"todo\")}}\nimport { todoRouter } from \"./todo\";\n{{/if}}\n\nexport const appRouter = router({\n healthCheck: publicProcedure.query(() => {\n return \"OK\";\n }),\n {{#if (eq auth \"better-auth\")}}\n privateData: protectedProcedure.query(({ ctx }) => {\n return {\n message: \"This is private\",\n user: ctx.session.user,\n };\n }),\n {{/if}}\n {{#if (includes examples \"todo\")}}\n todo: todoRouter,\n {{/if}}\n});\nexport type AppRouter = typeof appRouter;\n{{else}}\nexport const appRouter = {};\nexport type AppRouter = typeof appRouter;\n{{/if}}\n`],\n [\"examples/ai/native/uniwind/polyfills.js\", `import structuredClone from \"@ungap/structured-clone\";\nimport { Platform } from \"react-native\";\n\nif (Platform.OS !== \"web\") {\n const setupPolyfills = async () => {\n const { polyfillGlobal } = await import(\"react-native/Libraries/Utilities/PolyfillFunctions\");\n\n const { TextEncoderStream, TextDecoderStream } =\n await import(\"@stardazed/streams-text-encoding\");\n\n if (!(\"structuredClone\" in global)) {\n polyfillGlobal(\"structuredClone\", () => structuredClone);\n }\n\n polyfillGlobal(\"TextEncoderStream\", () => TextEncoderStream);\n polyfillGlobal(\"TextDecoderStream\", () => TextDecoderStream);\n };\n\n setupPolyfills();\n}\n\nexport {};\n`],\n [\"api/trpc/server/src/routers/index.ts.hbs\", `{{#if (eq api \"orpc\")}}\nimport { {{#if (eq auth \"better-auth\")}}protectedProcedure, {{/if}}publicProcedure } from \"../index\";\nimport type { RouterClient } from \"@orpc/server\";\n{{#if (includes examples \"todo\")}}\nimport { todoRouter } from \"./todo\";\n{{/if}}\n\nexport const appRouter = {\n healthCheck: publicProcedure.handler(() => {\n return \"OK\";\n }),\n {{#if (eq auth \"better-auth\")}}\n privateData: protectedProcedure.handler(({ context }) => {\n return {\n message: \"This is private\",\n user: context.session?.user,\n };\n }),\n {{/if}}\n {{#if (includes examples \"todo\")}}\n todo: todoRouter,\n {{/if}}\n};\nexport type AppRouter = typeof appRouter;\nexport type AppRouterClient = RouterClient<typeof appRouter>;\n{{else if (eq api \"trpc\")}}\nimport {\n {{#if (eq auth \"better-auth\")}}protectedProcedure, {{/if}}publicProcedure,\n router,\n} from \"../index\";\n{{#if (includes examples \"todo\")}}\nimport { todoRouter } from \"./todo\";\n{{/if}}\n\nexport const appRouter = router({\n healthCheck: publicProcedure.query(() => {\n return \"OK\";\n }),\n {{#if (eq auth \"better-auth\")}}\n privateData: protectedProcedure.query(({ ctx }) => {\n return {\n message: \"This is private\",\n user: ctx.session.user,\n };\n }),\n {{/if}}\n {{#if (includes examples \"todo\")}}\n todo: todoRouter,\n {{/if}}\n});\nexport type AppRouter = typeof appRouter;\n{{else}}\nexport const appRouter = {};\nexport type AppRouter = typeof appRouter;\n{{/if}}\n`],\n [\"examples/ai/native/bare/polyfills.js\", `import structuredClone from \"@ungap/structured-clone\";\nimport { Platform } from \"react-native\";\n\nif (Platform.OS !== \"web\") {\n const setupPolyfills = async () => {\n const { polyfillGlobal } = await import(\"react-native/Libraries/Utilities/PolyfillFunctions\");\n\n const { TextEncoderStream, TextDecoderStream } =\n await import(\"@stardazed/streams-text-encoding\");\n\n if (!(\"structuredClone\" in global)) {\n polyfillGlobal(\"structuredClone\", () => structuredClone);\n }\n\n polyfillGlobal(\"TextEncoderStream\", () => TextEncoderStream);\n polyfillGlobal(\"TextDecoderStream\", () => TextDecoderStream);\n };\n\n setupPolyfills();\n}\n\nexport {};\n`],\n [\"examples/ai/native/unistyles/polyfills.js\", `import structuredClone from \"@ungap/structured-clone\";\nimport { Platform } from \"react-native\";\n\nif (Platform.OS !== \"web\") {\n const setupPolyfills = async () => {\n const { polyfillGlobal } = await import(\"react-native/Libraries/Utilities/PolyfillFunctions\");\n\n const { TextEncoderStream, TextDecoderStream } =\n await import(\"@stardazed/streams-text-encoding\");\n\n if (!(\"structuredClone\" in global)) {\n polyfillGlobal(\"structuredClone\", () => structuredClone);\n }\n\n polyfillGlobal(\"TextEncoderStream\", () => TextEncoderStream);\n polyfillGlobal(\"TextDecoderStream\", () => TextDecoderStream);\n };\n\n setupPolyfills();\n}\n\nexport {};\n`],\n [\"auth/better-auth/native/uniwind/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport { Text, View } from \"react-native\";\nimport { Button, ErrorView, Spinner, Surface, TextField } from \"heroui-native\";\n\nfunction SignIn() {\nconst [email, setEmail] = useState(\"\");\nconst [password, setPassword] = useState(\"\");\nconst [isLoading, setIsLoading] = useState(false);\nconst [error, setError] = useState<string | null>(null);\n\n async function handleLogin() {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email,\n password,\n },\n {\n onError(error) {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess() {\n setEmail(\"\");\n setPassword(\"\");\n {{#if (eq api \"orpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n },\n onFinished() {\n setIsLoading(false);\n },\n }\n );\n }\n\n return (\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <Text className=\"text-foreground font-medium mb-4\">Sign In</Text>\n\n <ErrorView isInvalid={!!error} className=\"mb-3\">\n {error}\n </ErrorView>\n\n <View className=\"gap-3\">\n <TextField>\n <TextField.Label>Email</TextField.Label>\n <TextField.Input\n value={email}\n onChangeText={setEmail}\n placeholder=\"email@example.com\"\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n </TextField>\n\n <TextField>\n <TextField.Label>Password</TextField.Label>\n <TextField.Input\n value={password}\n onChangeText={setPassword}\n placeholder=\"••••••••\"\n secureTextEntry\n />\n </TextField>\n\n <Button onPress={handleLogin} isDisabled={isLoading} className=\"mt-1\">\n {isLoading ? <Spinner size=\"sm\" color=\"default\" /> : <Button.Label>Sign In</Button.Label>}\n </Button>\n </View>\n </Surface>\n );\n }\n\n export { SignIn };`],\n [\"auth/better-auth/native/uniwind/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport { Text, View } from \"react-native\";\nimport { Button, ErrorView, Spinner, Surface, TextField } from \"heroui-native\";\n\nfunction signUpHandler({\nname,\nemail,\npassword,\nsetError,\nsetIsLoading,\nsetName,\nsetEmail,\nsetPassword,\n}: {\n name: string;\n email: string;\n password: string;\n setError: (error: string | null) => void;\n setIsLoading: (loading: boolean) => void;\n setName: (name: string) => void;\n setEmail: (email: string) => void;\n setPassword: (password: string) => void;\n}) {\nsetIsLoading(true);\nsetError(null);\n\nauthClient.signUp.email(\n{\nname,\nemail,\npassword,\n},\n{\nonError(error) {\nsetError(error.error?.message || \"Failed to sign up\");\nsetIsLoading(false);\n},\nonSuccess() {\nsetName(\"\");\nsetEmail(\"\");\nsetPassword(\"\");\n{{#if (eq api \"orpc\")}}\nqueryClient.refetchQueries();\n{{/if}}\n{{#if (eq api \"trpc\")}}\nqueryClient.refetchQueries();\n{{/if}}\n},\nonFinished() {\nsetIsLoading(false);\n},\n}\n);\n}\n\nexport function SignUp() {\nconst [name, setName] = useState(\"\");\nconst [email, setEmail] = useState(\"\");\nconst [password, setPassword] = useState(\"\");\nconst [isLoading, setIsLoading] = useState(false);\nconst [error, setError] = useState<string | null>(null);\n\n function handlePress() {\n signUpHandler({\n name,\n email,\n password,\n setError,\n setIsLoading,\n setName,\n setEmail,\n setPassword,\n });\n }\n\n return (\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <Text className=\"text-foreground font-medium mb-4\">Create Account</Text>\n\n <ErrorView isInvalid={!!error} className=\"mb-3\">\n {error}\n </ErrorView>\n\n <View className=\"gap-3\">\n <TextField>\n <TextField.Label>Name</TextField.Label>\n <TextField.Input value={name} onChangeText={setName} placeholder=\"John Doe\" />\n </TextField>\n\n <TextField>\n <TextField.Label>Email</TextField.Label>\n <TextField.Input\n value={email}\n onChangeText={setEmail}\n placeholder=\"email@example.com\"\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n </TextField>\n\n <TextField>\n <TextField.Label>Password</TextField.Label>\n <TextField.Input\n value={password}\n onChangeText={setPassword}\n placeholder=\"••••••••\"\n secureTextEntry\n />\n </TextField>\n\n <Button onPress={handlePress} isDisabled={isLoading} className=\"mt-1\">\n {isLoading ? (\n <Spinner size=\"sm\" color=\"default\" />\n ) : (\n <Button.Label>Create Account</Button.Label>\n )}\n </Button>\n </View>\n </Surface>\n );\n }`],\n [\"auth/better-auth/native/unistyles/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport function SignIn() {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleLogin = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setEmail(\"\");\n setPassword(\"\");\n {{#if (eq api \"orpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>Sign In</Text>\n\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n )}\n\n <TextInput\n style={styles.input}\n placeholder=\"Email\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={styles.input}\n placeholder=\"Password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleLogin}\n disabled={isLoading}\n style={styles.button}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#fff\" />\n ) : (\n <Text style={styles.buttonText}>Sign In</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n marginTop: 24,\n padding: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n color: theme.colors.typography,\n marginBottom: 16,\n },\n errorContainer: {\n marginBottom: 16,\n padding: 12,\n borderRadius: 6,\n },\n errorText: {\n color: theme.colors.destructive,\n fontSize: 14,\n },\n input: {\n marginBottom: 12,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n button: {\n backgroundColor: theme.colors.primary,\n padding: 16,\n borderRadius: 6,\n flexDirection: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n buttonText: {\n fontWeight: \"500\",\n },\n}));\n`],\n [\"auth/better-auth/native/unistyles/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport function SignUp() {\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSignUp = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signUp.email(\n {\n name,\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign up\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setName(\"\");\n setEmail(\"\");\n setPassword(\"\");\n {{#if (eq api \"orpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>Create Account</Text>\n\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n )}\n\n <TextInput\n style={styles.input}\n placeholder=\"Name\"\n value={name}\n onChangeText={setName}\n />\n\n <TextInput\n style={styles.input}\n placeholder=\"Email\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={styles.inputLast}\n placeholder=\"Password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n disabled={isLoading}\n style={styles.button}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#fff\" />\n ) : (\n <Text style={styles.buttonText}>Sign Up</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n marginTop: 24,\n padding: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n color: theme.colors.typography,\n marginBottom: 16,\n },\n errorContainer: {\n marginBottom: 16,\n padding: 12,\n borderRadius: 6,\n },\n errorText: {\n color: theme.colors.destructive,\n fontSize: 14,\n },\n input: {\n marginBottom: 12,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n inputLast: {\n marginBottom: 16,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n button: {\n backgroundColor: theme.colors.primary,\n padding: 16,\n borderRadius: 6,\n flexDirection: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n buttonText: {\n fontWeight: \"500\",\n },\n}));\n`],\n [\"auth/better-auth/native/base/lib/auth-client.ts.hbs\", `import { expoClient } from \"@better-auth/expo/client\";\nimport { createAuthClient } from \"better-auth/react\";\nimport * as SecureStore from \"expo-secure-store\";\nimport Constants from \"expo-constants\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nexport const authClient = createAuthClient({\n\tbaseURL: env.EXPO_PUBLIC_SERVER_URL,\n\tplugins: [\n\t\texpoClient({\n\t\t\tscheme: Constants.expoConfig?.scheme as string,\n\t\t\tstoragePrefix: Constants.expoConfig?.scheme as string,\n\t\t\tstorage: SecureStore,\n\t\t}),\n\t],\n});\n`],\n [\"addons/pwa/apps/web/vite/pwa-assets.config.ts.hbs\", `import {\n defineConfig,\n minimal2023Preset as preset,\n} from \"@vite-pwa/assets-generator/config\";\n\nexport default defineConfig({\n headLinkOptions: {\n preset: \"2023\",\n },\n preset,\n images: [\"public/logo.png\"],\n});\n`],\n [\"auth/better-auth/server/base/src/index.ts.hbs\", `{{#if (eq orm \"prisma\")}}\nimport { betterAuth } from \"better-auth\";\nimport { prismaAdapter } from \"better-auth/adapters/prisma\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq payments \"polar\")}}\nimport { polar, checkout, portal } from \"@polar-sh/better-auth\";\nimport { polarClient } from \"./lib/payments\";\n{{/if}}\nimport prisma from \"@{{projectName}}/db\";\n\nexport const auth = betterAuth({\n\tdatabase: prismaAdapter(prisma, {\n{{#if (eq database \"postgres\")}}provider: \"postgresql\",{{/if}}\n{{#if (eq database \"sqlite\")}}provider: \"sqlite\",{{/if}}\n{{#if (eq database \"mysql\")}}provider: \"mysql\",{{/if}}\n{{#if (eq database \"mongodb\")}}provider: \"mongodb\",{{/if}}\n\t}),\n\ttrustedOrigins: [\n\t\tenv.CORS_ORIGIN,\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n\t\t\"mybettertapp://\", \"exp://\"\n{{/if}}\n\t],\n\temailAndPassword: {\n\t\tenabled: true,\n\t},\n{{#if (ne backend \"self\")}}\n\tadvanced: {\n\t\tdefaultCookieAttributes: {\n\t\t\tsameSite: \"none\",\n\t\t\tsecure: true,\n\t\t\thttpOnly: true,\n\t\t},\n\t},\n{{/if}}\n{{#if (eq payments \"polar\")}}\n\tplugins: [\n\t\tpolar({\n\t\t\tclient: polarClient,\n\t\t\tcreateCustomerOnSignUp: true,\n\t\t\tenableCustomerPortal: true,\n\t\t\tuse: [\n\t\t\t\tcheckout({\n\t\t\t\t\tproducts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproductId: \"your-product-id\",\n\t\t\t\t\t\t\tslug: \"pro\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsuccessUrl: env.POLAR_SUCCESS_URL,\n\t\t\t\t\tauthenticatedUsersOnly: true,\n\t\t\t\t}),\n\t\t\t\tportal(),\n\t\t\t],\n\t\t}),\n\t],\n{{/if}}\n});\n{{/if}}\n\n{{#if (eq orm \"drizzle\")}}\n{{#if (or (eq runtime \"bun\") (eq runtime \"node\") (eq runtime \"none\"))}}\nimport { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq payments \"polar\")}}\nimport { polar, checkout, portal } from \"@polar-sh/better-auth\";\nimport { polarClient } from \"./lib/payments\";\n{{/if}}\nimport { db } from \"@{{projectName}}/db\";\nimport * as schema from \"@{{projectName}}/db/schema/auth\";\n\nexport const auth = betterAuth({\n\tdatabase: drizzleAdapter(db, {\n{{#if (eq database \"postgres\")}}provider: \"pg\",{{/if}}\n{{#if (eq database \"sqlite\")}}provider: \"sqlite\",{{/if}}\n{{#if (eq database \"mysql\")}}provider: \"mysql\",{{/if}}\n\t\tschema: schema,\n\t}),\n\ttrustedOrigins: [\n\t\tenv.CORS_ORIGIN,\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n\t\t\"mybettertapp://\", \"exp://\"\n{{/if}}\n\t],\n\temailAndPassword: {\n\t\tenabled: true,\n\t},\n{{#if (ne backend \"self\")}}\n\tadvanced: {\n\t\tdefaultCookieAttributes: {\n\t\t\tsameSite: \"none\",\n\t\t\tsecure: true,\n\t\t\thttpOnly: true,\n\t\t},\n\t},\n{{/if}}\n{{#if (eq payments \"polar\")}}\n\tplugins: [\n\t\tpolar({\n\t\t\tclient: polarClient,\n\t\t\tcreateCustomerOnSignUp: true,\n\t\t\tenableCustomerPortal: true,\n\t\t\tuse: [\n\t\t\t\tcheckout({\n\t\t\t\t\tproducts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproductId: \"your-product-id\",\n\t\t\t\t\t\t\tslug: \"pro\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsuccessUrl: env.POLAR_SUCCESS_URL,\n\t\t\t\t\tauthenticatedUsersOnly: true,\n\t\t\t\t}),\n\t\t\t\tportal(),\n\t\t\t],\n\t\t}),\n\t],\n{{/if}}\n});\n{{/if}}\n\n{{#if (eq runtime \"workers\")}}\nimport { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq payments \"polar\")}}\nimport { polar, checkout, portal } from \"@polar-sh/better-auth\";\nimport { polarClient } from \"./lib/payments\";\n{{/if}}\nimport { db } from \"@{{projectName}}/db\";\nimport * as schema from \"@{{projectName}}/db/schema/auth\";\n\nexport const auth = betterAuth({\n\tdatabase: drizzleAdapter(db, {\n{{#if (eq database \"postgres\")}}provider: \"pg\",{{/if}}\n{{#if (eq database \"sqlite\")}}provider: \"sqlite\",{{/if}}\n{{#if (eq database \"mysql\")}}provider: \"mysql\",{{/if}}\n\t\tschema: schema,\n\t}),\n\ttrustedOrigins: [\n\t\tenv.CORS_ORIGIN,\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n\t\t\"mybettertapp://\", \"exp://\"\n{{/if}}\n\t],\n\temailAndPassword: {\n\t\tenabled: true,\n\t},\n\t// uncomment cookieCache setting when ready to deploy to Cloudflare using *.workers.dev domains\n\t// session: {\n\t// cookieCache: {\n\t// enabled: true,\n\t// maxAge: 60,\n\t// },\n\t// },\n\tsecret: env.BETTER_AUTH_SECRET,\n\tbaseURL: env.BETTER_AUTH_URL,\n\tadvanced: {\n\t\tdefaultCookieAttributes: {\n\t\t\tsameSite: \"none\",\n\t\t\tsecure: true,\n\t\t\thttpOnly: true,\n\t\t},\n\t\t// uncomment crossSubDomainCookies setting when ready to deploy and replace <your-workers-subdomain> with your actual workers subdomain\n\t\t// https://developers.cloudflare.com/workers/wrangler/configuration/#workersdev\n\t\t// crossSubDomainCookies: {\n\t\t// enabled: true,\n\t\t// domain: \"<your-workers-subdomain>\",\n\t\t// },\n\t},\n{{#if (eq payments \"polar\")}}\n\tplugins: [\n\t\tpolar({\n\t\t\tclient: polarClient,\n\t\t\tcreateCustomerOnSignUp: true,\n\t\t\tenableCustomerPortal: true,\n\t\t\tuse: [\n\t\t\t\tcheckout({\n\t\t\t\t\tproducts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproductId: \"your-product-id\",\n\t\t\t\t\t\t\tslug: \"pro\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsuccessUrl: env.POLAR_SUCCESS_URL,\n\t\t\t\t\tauthenticatedUsersOnly: true,\n\t\t\t\t}),\n\t\t\t\tportal(),\n\t\t\t],\n\t\t}),\n\t],\n{{/if}}\n});\n{{/if}}\n{{/if}}\n\n{{#if (eq orm \"mongoose\")}}\nimport { betterAuth } from \"better-auth\";\nimport { mongodbAdapter } from \"better-auth/adapters/mongodb\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq payments \"polar\")}}\nimport { polar, checkout, portal } from \"@polar-sh/better-auth\";\nimport { polarClient } from \"./lib/payments\";\n{{/if}}\nimport { client } from \"@{{projectName}}/db\";\n\nexport const auth = betterAuth({\n\tdatabase: mongodbAdapter(client),\n\ttrustedOrigins: [\n\t\tenv.CORS_ORIGIN,\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n\t\t\"mybettertapp://\", \"exp://\"\n{{/if}}\n\t],\n\temailAndPassword: {\n\t\tenabled: true,\n\t},\n{{#if (ne backend \"self\")}}\n\tadvanced: {\n\t\tdefaultCookieAttributes: {\n\t\t\tsameSite: \"none\",\n\t\t\tsecure: true,\n\t\t\thttpOnly: true,\n\t\t},\n\t},\n{{/if}}\n{{#if (eq payments \"polar\")}}\n\tplugins: [\n\t\tpolar({\n\t\t\tclient: polarClient,\n\t\t\tcreateCustomerOnSignUp: true,\n\t\t\tenableCustomerPortal: true,\n\t\t\tuse: [\n\t\t\t\tcheckout({\n\t\t\t\t\tproducts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproductId: \"your-product-id\",\n\t\t\t\t\t\t\tslug: \"pro\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsuccessUrl: env.POLAR_SUCCESS_URL,\n\t\t\t\t\tauthenticatedUsersOnly: true,\n\t\t\t\t}),\n\t\t\t\tportal(),\n\t\t\t],\n\t\t}),\n\t],\n{{/if}}\n});\n{{/if}}\n\n{{#if (eq orm \"none\")}}\nimport { betterAuth } from \"better-auth\";\nimport { env } from \"@{{projectName}}/env/server\";\n{{#if (eq payments \"polar\")}}\nimport { polar, checkout, portal } from \"@polar-sh/better-auth\";\nimport { polarClient } from \"./lib/payments\";\n{{/if}}\n\nexport const auth = betterAuth({\n\tdatabase: \"\", // Invalid configuration\n\ttrustedOrigins: [\n\t\tenv.CORS_ORIGIN,\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n\t\t\"mybettertapp://\", \"exp://\"\n{{/if}}\n\t],\n\temailAndPassword: {\n\t\tenabled: true,\n\t},\n{{#if (ne backend \"self\")}}\n\tadvanced: {\n\t\tdefaultCookieAttributes: {\n\t\t\tsameSite: \"none\",\n\t\t\tsecure: true,\n\t\t\thttpOnly: true,\n\t\t},\n\t},\n{{/if}}\n{{#if (eq payments \"polar\")}}\n\tplugins: [\n\t\tpolar({\n\t\t\tclient: polarClient,\n\t\t\tcreateCustomerOnSignUp: true,\n\t\t\tenableCustomerPortal: true,\n\t\t\tuse: [\n\t\t\t\tcheckout({\n\t\t\t\t\tproducts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproductId: \"your-product-id\",\n\t\t\t\t\t\t\tslug: \"pro\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tsuccessUrl: env.POLAR_SUCCESS_URL,\n\t\t\t\t\tauthenticatedUsersOnly: true,\n\t\t\t\t}),\n\t\t\t\tportal(),\n\t\t\t],\n\t\t}),\n\t],\n{{/if}}\n});\n{{/if}}`],\n [\"auth/better-auth/convex/backend/convex/auth.ts.hbs\", `import { createClient, type GenericCtx } from \"@convex-dev/better-auth\";\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\nimport { convex } from \"@convex-dev/better-auth/plugins\";\nimport { expo } from \"@better-auth/expo\";\n{{else if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\nimport { convex, crossDomain } from \"@convex-dev/better-auth/plugins\";\n{{else}}\nimport { convex } from \"@convex-dev/better-auth/plugins\";\n{{/if}}\nimport { components } from \"./_generated/api\";\nimport type { DataModel } from \"./_generated/dataModel\";\nimport { query } from \"./_generated/server\";\nimport { betterAuth } from \"better-auth\";\nimport authConfig from \"./auth.config\";\n\n{{#if (or (includes frontend \"tanstack-start\") (includes frontend \"next\"))}}\nconst siteUrl = process.env.SITE_URL!;\n{{else if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\nconst siteUrl = process.env.SITE_URL!;\n{{/if}}\n{{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\nconst nativeAppUrl = process.env.NATIVE_APP_URL || \"mybettertapp://\";\n{{/if}}\n\nexport const authComponent = createClient<DataModel>(components.betterAuth);\n\nfunction createAuth(ctx: GenericCtx<DataModel>) {\n return betterAuth({\n {{#if (and (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\")) (or (includes frontend \"tanstack-start\") (includes frontend \"next\")))}}\n baseURL: siteUrl,\n trustedOrigins: [siteUrl, nativeAppUrl],\n {{else if (and (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\")) (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\")))}}\n trustedOrigins: [siteUrl, nativeAppUrl],\n {{else if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n trustedOrigins: [nativeAppUrl],\n {{else if (or (includes frontend \"tanstack-start\") (includes frontend \"next\"))}}\n baseURL: siteUrl,\n trustedOrigins: [siteUrl],\n {{else if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\n trustedOrigins: [siteUrl],\n {{/if}}\n database: authComponent.adapter(ctx),\n emailAndPassword: {\n enabled: true,\n requireEmailVerification: false,\n },\n plugins: [\n {{#if (or (includes frontend \"native-bare\") (includes frontend \"native-uniwind\") (includes frontend \"native-unistyles\"))}}\n expo(),\n {{else if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\n crossDomain({ siteUrl }),\n {{/if}}\n convex({\n authConfig,\n jwksRotateOnTokenGenerationError: true,\n }),\n ],\n });\n}\n\nexport { createAuth };\n\nexport const getCurrentUser = query({\n args: {},\n handler: async (ctx) => {\n return await authComponent.safeGetAuthUser(ctx);\n },\n});\n`],\n [\"auth/better-auth/convex/backend/convex/http.ts.hbs\", `import { httpRouter } from \"convex/server\";\nimport { authComponent, createAuth } from \"./auth\";\n\nconst http = httpRouter();\n\n{{#if (or (includes frontend \"tanstack-router\") (includes frontend \"react-router\") (includes frontend \"nuxt\") (includes frontend \"svelte\") (includes frontend \"solid\"))}}\nauthComponent.registerRoutes(http, createAuth, { cors: true });\n{{else}}\nauthComponent.registerRoutes(http, createAuth);\n{{/if}}\n\nexport default http;\n`],\n [\"auth/better-auth/convex/backend/convex/auth.config.ts.hbs\", `import { getAuthConfigProvider } from \"@convex-dev/better-auth/auth-config\";\nimport type { AuthConfig } from \"convex/server\";\n\nexport default {\n providers: [getAuthConfigProvider()],\n} satisfies AuthConfig;\n`],\n [\"auth/better-auth/convex/backend/convex/privateData.ts.hbs\", `import { query } from \"./_generated/server\";\nimport { authComponent } from \"./auth\";\n\nexport const get = query({\n args: {},\n handler: async (ctx) => {\n const authUser = await authComponent.safeGetAuthUser(ctx);\n if (!authUser) {\n return {\n message: \"Not authenticated\",\n };\n }\n return {\n message: \"This is private\",\n };\n },\n});\n`],\n [\"auth/clerk/convex/backend/convex/auth.config.ts.hbs\", `export default {\n\tproviders: [\n\t\t{\n\t\t\t// Replace with your own Clerk Issuer URL from your \"convex\" JWT template\n\t\t\t// or with \\`process.env.CLERK_JWT_ISSUER_DOMAIN\\`\n\t\t\t// and configure CLERK_JWT_ISSUER_DOMAIN on the Convex Dashboard\n\t\t\t// See https://docs.convex.dev/auth/clerk#configuring-dev-and-prod-instances\n\t\t\tdomain: process.env.CLERK_JWT_ISSUER_DOMAIN,\n\t\t\tapplicationID: \"convex\",\n\t\t},\n\t],\n};\n`],\n [\"auth/clerk/convex/backend/convex/privateData.ts.hbs\", `import { query } from \"./_generated/server\";\n\nexport const get = query({\n\targs: {},\n\thandler: async (ctx) => {\n\t\tconst identity = await ctx.auth.getUserIdentity();\n\t\tif (identity === null) {\n\t\t\treturn {\n\t\t\t\tmessage: \"Not authenticated\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tmessage: \"This is private\",\n\t\t};\n\t},\n});\n`],\n [\"auth/better-auth/native/bare/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport {\nActivityIndicator,\nText,\nTextInput,\nTouchableOpacity,\nView,\nStyleSheet,\n} from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nfunction SignIn() {\nconst { colorScheme } = useColorScheme();\nconst theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\nconst [form, setForm] = useState({ email: \"\", password: \"\" });\nconst [isLoading, setIsLoading] = useState(false);\nconst [error, setError] = useState<string | null>(null);\n\n function handleFormChange(field: \"email\" | \"password\", value: string) {\n setForm(prev => ({ ...prev, [field]: value }));\n }\n\n async function handleLogin() {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email: form.email,\n password: form.password,\n },\n {\n onError(error) {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess() {\n setForm({ email: \"\", password: \"\" });\n {{#if (eq api \"orpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n },\n onFinished() {\n setIsLoading(false);\n },\n }\n );\n }\n\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.title, { color: theme.text }]}>Sign In</Text>\n\n {error ? (\n <View style={[styles.errorContainer, { backgroundColor: theme.notification + \"20\" }]}>\n <Text style={[styles.errorText, { color: theme.notification }]}>{error}</Text>\n </View>\n ) : null}\n\n <TextInput style={[ styles.input, { color: theme.text, borderColor: theme.border, backgroundColor:\n theme.background }, ]} placeholder=\"Email\" placeholderTextColor={theme.text} value={form.email}\n onChangeText={value=> handleFormChange(\"email\", value)}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput style={[ styles.input, { color: theme.text, borderColor: theme.border, backgroundColor:\n theme.background }, ]} placeholder=\"Password\" placeholderTextColor={theme.text} value={form.password}\n onChangeText={value=> handleFormChange(\"password\", value)}\n secureTextEntry\n />\n\n <TouchableOpacity onPress={handleLogin} disabled={isLoading} style={[ styles.button, { backgroundColor:\n theme.primary, opacity: isLoading ? 0.5 : 1 }, ]}>\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Text style={styles.buttonText}>Sign In</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n }\n\n const styles = StyleSheet.create({\n card: {\n marginTop: 16,\n padding: 16,\n borderWidth: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: \"bold\",\n marginBottom: 12,\n },\n errorContainer: {\n marginBottom: 12,\n padding: 8,\n },\n errorText: {\n fontSize: 14,\n },\n input: {\n borderWidth: 1,\n padding: 12,\n fontSize: 16,\n marginBottom: 12,\n },\n button: {\n padding: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n buttonText: {\n color: \"#ffffff\",\n fontSize: 16,\n },\n });\n\n export { SignIn };`],\n [\"auth/better-auth/native/bare/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n StyleSheet,\n} from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nfunction SignUp() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function handleSignUp() {\n setIsLoading(true);\n setError(null);\n\n await authClient.signUp.email(\n {\n name,\n email,\n password,\n },\n {\n onError(error) {\n setError(error.error?.message || \"Failed to sign up\");\n setIsLoading(false);\n },\n onSuccess() {\n setName(\"\");\n setEmail(\"\");\n setPassword(\"\");\n {{#if (eq api \"orpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.refetchQueries();\n {{/if}}\n },\n onFinished() {\n setIsLoading(false);\n },\n }\n );\n }\n\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.title, { color: theme.text }]}>Create Account</Text>\n\n {error ? (\n <View style={[styles.errorContainer, { backgroundColor: theme.notification + \"20\" }]}>\n <Text style={[styles.errorText, { color: theme.notification }]}>{error}</Text>\n </View>\n ) : null}\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Name\"\n placeholderTextColor={theme.text}\n value={name}\n onChangeText={setName}\n />\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Email\"\n placeholderTextColor={theme.text}\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Password\"\n placeholderTextColor={theme.text}\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n disabled={isLoading}\n style={[styles.button, { backgroundColor: theme.primary, opacity: isLoading ? 0.5 : 1 }]}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Text style={styles.buttonText}>Sign Up</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n marginTop: 16,\n padding: 16,\n borderWidth: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: \"bold\",\n marginBottom: 12,\n },\n errorContainer: {\n marginBottom: 12,\n padding: 8,\n },\n errorText: {\n fontSize: 14,\n },\n input: {\n borderWidth: 1,\n padding: 12,\n fontSize: 16,\n marginBottom: 12,\n },\n button: {\n padding: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n buttonText: {\n color: \"#ffffff\",\n fontSize: 16,\n },\n});\n\nexport { SignUp };\n\n`],\n [\"backend/convex/packages/backend/convex/healthCheck.ts.hbs\", `import { query } from \"./_generated/server\";\n\nexport const get = query({\n handler: async () => {\n return \"OK\";\n },\n});\n`],\n [\"backend/convex/packages/backend/convex/tsconfig.json.hbs\", `{\n /* This TypeScript project config describes the environment that\n * Convex functions run in and is used to typecheck them.\n * You can modify it, but some settings are required to use Convex.\n */\n \"compilerOptions\": {\n /* These settings are not required by Convex and can be modified. */\n \"allowJs\": true,\n \"strict\": true,\n \"moduleResolution\": \"Bundler\",\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"allowSyntheticDefaultImports\": true,\n\n /* These compiler options are required by Convex */\n \"target\": \"ESNext\",\n \"lib\": [\"ES2021\", \"dom\"],\n \"forceConsistentCasingInFileNames\": true,\n \"module\": \"ESNext\",\n \"isolatedModules\": true,\n \"noEmit\": true\n },\n \"include\": [\"./**/*\"],\n \"exclude\": [\"./_generated\"]\n}\n`],\n [\"backend/convex/packages/backend/convex/README.md\", `# Welcome to your Convex functions directory!\n\nWrite your Convex functions here.\nSee https://docs.convex.dev/functions for more.\n\nA query function that takes two arguments looks like:\n\n\\`\\`\\`ts\n// convex/myFunctions.ts\nimport { query } from \"./_generated/server\";\nimport { v } from \"convex/values\";\n\nexport const myQueryFunction = query({\n // Validators for arguments.\n args: {\n first: v.number(),\n second: v.string(),\n },\n\n // Function implementation.\n handler: async (ctx, args) => {\n // Read the database as many times as you need here.\n // See https://docs.convex.dev/database/reading-data.\n const documents = await ctx.db.query(\"tablename\").collect();\n\n // Arguments passed from the client are properties of the args object.\n console.log(args.first, args.second);\n\n // Write arbitrary JavaScript here: filter, aggregate, build derived data,\n // remove non-public properties, or create new objects.\n return documents;\n },\n});\n\\`\\`\\`\n\nUsing this query function in a React component looks like:\n\n\\`\\`\\`ts\nconst data = useQuery(api.myFunctions.myQueryFunction, {\n first: 10,\n second: \"hello\",\n});\n\\`\\`\\`\n\nA mutation function looks like:\n\n\\`\\`\\`ts\n// convex/myFunctions.ts\nimport { mutation } from \"./_generated/server\";\nimport { v } from \"convex/values\";\n\nexport const myMutationFunction = mutation({\n // Validators for arguments.\n args: {\n first: v.string(),\n second: v.string(),\n },\n\n // Function implementation.\n handler: async (ctx, args) => {\n // Insert or modify documents in the database here.\n // Mutations can also read from the database like queries.\n // See https://docs.convex.dev/database/writing-data.\n const message = { body: args.first, author: args.second };\n const id = await ctx.db.insert(\"messages\", message);\n\n // Optionally, return a value from your mutation.\n return await ctx.db.get(\"messages\", id);\n },\n});\n\\`\\`\\`\n\nUsing this mutation function in a React component looks like:\n\n\\`\\`\\`ts\nconst mutation = useMutation(api.myFunctions.myMutationFunction);\nfunction handleButtonPress() {\n // fire and forget, the most common way to use mutations\n mutation({ first: \"Hello!\", second: \"me\" });\n // OR\n // use the result once the mutation has completed\n mutation({ first: \"Hello!\", second: \"me\" }).then((result) =>\n console.log(result),\n );\n}\n\\`\\`\\`\n\nUse the Convex CLI to push your functions to a deployment. See everything\nthe Convex CLI can do by running \\`npx convex -h\\` in your project root\ndirectory. To learn more, launch the docs with \\`npx convex docs\\`.\n`],\n [\"backend/convex/packages/backend/convex/schema.ts.hbs\", `import { defineSchema, defineTable } from \"convex/server\";\nimport { v } from \"convex/values\";\n\nexport default defineSchema({\n{{#if (includes examples \"todo\")}}\n todos: defineTable({\n text: v.string(),\n completed: v.boolean(),\n }),\n{{/if}}\n});\n`],\n [\"backend/convex/packages/backend/convex/convex.config.ts.hbs\", `import { defineApp } from \"convex/server\";\n{{#if (eq auth \"better-auth\")}}\nimport betterAuth from \"@convex-dev/better-auth/convex.config\";\n{{/if}}\n{{#if (includes examples \"ai\")}}\nimport agent from \"@convex-dev/agent/convex.config\";\n{{/if}}\n\nconst app = defineApp();\n{{#if (eq auth \"better-auth\")}}\napp.use(betterAuth);\n{{/if}}\n{{#if (includes examples \"ai\")}}\napp.use(agent);\n{{/if}}\n\nexport default app;\n`],\n [\"frontend/react/tanstack-start/src/routes/index.tsx.hbs\", `import { createFileRoute } from \"@tanstack/react-router\";\n{{#if (eq backend \"convex\")}}\nimport { convexQuery } from \"@convex-dev/react-query\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n{{else if (or (eq api \"trpc\") (eq api \"orpc\"))}}\nimport { useQuery } from \"@tanstack/react-query\";\n {{#if (eq api \"trpc\")}}\nimport { useTRPC } from \"@/utils/trpc\";\n {{/if}}\n {{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n {{/if}}\n{{/if}}\n\nexport const Route = createFileRoute(\"/\")({\n component: HomeComponent,\n});\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\nfunction HomeComponent() {\n {{#if (eq backend \"convex\")}}\n const healthCheck = useQuery(convexQuery(api.healthCheck.get, {}));\n {{else if (eq api \"trpc\")}}\n const trpc = useTRPC();\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n {{else if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n {{/if}}\n\n return (\n <div className=\"container mx-auto max-w-3xl px-4 py-2\">\n <pre className=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n <div className=\"grid gap-6\">\n <section className=\"rounded-lg border p-4\">\n <h2 className=\"mb-2 font-medium\">API Status</h2>\n {{#if (eq backend \"convex\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck.data === \"OK\" ? \"bg-green-500\" : healthCheck.isLoading ? \"bg-orange-400\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-muted-foreground text-sm\">\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data === \"OK\"\n ? \"Connected\"\n : \"Error\"}\n </span>\n </div>\n {{else}}\n {{#unless (eq api \"none\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-muted-foreground text-sm\">\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data\n ? \"Connected\"\n : \"Disconnected\"}\n </span>\n </div>\n {{/unless}}\n {{/if}}\n </section>\n </div>\n </div>\n );\n}\n`],\n [\"frontend/react/tanstack-start/src/routes/__root.tsx.hbs\", `import { Toaster } from \"@/components/ui/sonner\";\n{{#unless (eq backend \"convex\")}} {{#unless (eq api \"none\")}}\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\n{{/unless}} {{/unless}}\nimport {\n HeadContent,\n Outlet,\n Scripts,\n createRootRouteWithContext,\n{{#if (and (eq backend \"convex\") (or (eq auth \"clerk\") (eq auth \"better-auth\")))}}\n useRouteContext,\n{{/if}}\n} from \"@tanstack/react-router\";\nimport { TanStackRouterDevtools } from \"@tanstack/react-router-devtools\";\nimport Header from \"../components/header\";\nimport appCss from \"../index.css?url\";\n{{#if (eq backend \"convex\")}}\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { ConvexQueryClient } from \"@convex-dev/react-query\";\n{{else}}\n{{#if (or (eq api \"trpc\") (eq api \"orpc\"))}}\nimport type { QueryClient } from \"@tanstack/react-query\";\n{{/if}}\n{{/if}}\n\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nimport { ClerkProvider, useAuth } from \"@clerk/tanstack-react-start\";\nimport { auth } from \"@clerk/tanstack-react-start/server\";\nimport { createServerFn } from \"@tanstack/react-start\";\nimport { ConvexProviderWithClerk } from \"convex/react-clerk\";\n\nconst fetchClerkAuth = createServerFn({ method: \"GET\" }).handler(async () => {\n const clerkAuth = await auth();\n const token = await clerkAuth.getToken({ template: \"convex\" });\n return { userId: clerkAuth.userId, token };\n});\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nimport { createServerFn } from \"@tanstack/react-start\";\nimport { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { getToken } from \"@/lib/auth-server\";\n\nconst getAuth = createServerFn({ method: \"GET\" }).handler(async () => {\n return await getToken();\n});\n{{else if (eq backend \"convex\")}}\nimport { ConvexProvider } from \"convex/react\";\n{{/if}}\n\n{{#if (eq backend \"convex\")}}\nexport interface RouterAppContext {\n queryClient: QueryClient;\n convexQueryClient: ConvexQueryClient;\n}\n{{else}}\n {{#if (eq api \"trpc\")}}\nimport type { TRPCOptionsProxy } from \"@trpc/tanstack-react-query\";\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nexport interface RouterAppContext {\n trpc: TRPCOptionsProxy<AppRouter>;\n queryClient: QueryClient;\n}\n {{else if (eq api \"orpc\")}}\nimport type { orpc } from \"@/utils/orpc\";\nexport interface RouterAppContext {\n orpc: typeof orpc;\n queryClient: QueryClient;\n}\n {{else}}\nexport interface RouterAppContext {\n}\n {{/if}}\n{{/if}}\n\nexport const Route = createRootRouteWithContext<RouterAppContext>()({\n head: () => ({\n meta: [\n {\n charSet: \"utf-8\",\n },\n {\n name: \"viewport\",\n content: \"width=device-width, initial-scale=1\",\n },\n {\n title: \"My App\",\n },\n ],\n links: [\n {\n rel: \"stylesheet\",\n href: appCss,\n },\n ],\n }),\n\n component: RootDocument,\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n beforeLoad: async (ctx) => {\n const { userId, token } = await fetchClerkAuth();\n if (token) {\n ctx.context.convexQueryClient.serverHttpClient?.setAuth(token);\n }\n return { userId, token };\n },\n {{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n beforeLoad: async (ctx) => {\n const token = await getAuth();\n if (token) {\n ctx.context.convexQueryClient.serverHttpClient?.setAuth(token);\n }\n return {\n isAuthenticated: !!token,\n token,\n };\n },\n {{/if}}\n});\n\nfunction RootDocument() {\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n const context = useRouteContext({ from: Route.id });\n return (\n <ClerkProvider>\n <ConvexProviderWithClerk client={context.convexQueryClient.convexClient} useAuth={useAuth}>\n <html lang=\"en\" className=\"dark\">\n <head>\n <HeadContent />\n </head>\n <body>\n <div className=\"grid h-svh grid-rows-[auto_1fr]\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n <TanStackRouterDevtools position=\"bottom-left\" />\n <Scripts />\n </body>\n </html>\n </ConvexProviderWithClerk>\n </ClerkProvider>\n );\n {{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n const context = useRouteContext({ from: Route.id });\n return (\n <ConvexBetterAuthProvider\n client={context.convexQueryClient.convexClient}\n authClient={authClient}\n initialToken={context.token}\n >\n <html lang=\"en\" className=\"dark\">\n <head>\n <HeadContent />\n </head>\n <body>\n <div className=\"grid h-svh grid-rows-[auto_1fr]\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n <TanStackRouterDevtools position=\"bottom-left\" />\n <Scripts />\n </body>\n </html>\n </ConvexBetterAuthProvider>\n );\n {{else if (eq backend \"convex\")}}\n const { convexQueryClient } = Route.useRouteContext();\n return (\n <ConvexProvider client={convexQueryClient.convexClient}>\n <html lang=\"en\" className=\"dark\">\n <head>\n <HeadContent />\n </head>\n <body>\n <div className=\"grid h-svh grid-rows-[auto_1fr]\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n <TanStackRouterDevtools position=\"bottom-left\" />\n <Scripts />\n </body>\n </html>\n </ConvexProvider>\n );\n {{else}}\n return (\n <html lang=\"en\" className=\"dark\">\n <head>\n <HeadContent />\n </head>\n <body>\n <div className=\"grid h-svh grid-rows-[auto_1fr]\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n <TanStackRouterDevtools position=\"bottom-left\" />\n {{#unless (eq api \"none\")}}\n <ReactQueryDevtools position=\"bottom\" buttonPosition=\"bottom-right\" />\n {{/unless}}\n <Scripts />\n </body>\n </html>\n );\n {{/if}}\n}\n`],\n [\"frontend/react/tanstack-router/src/routes/index.tsx.hbs\", `import { createFileRoute } from \"@tanstack/react-router\";\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\n{{#if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\n{{/if}}\n\nexport const Route = createFileRoute(\"/\")({\n component: HomeComponent,\n});\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\nfunction HomeComponent() {\n {{#if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n {{/if}}\n {{#if (eq backend \"convex\")}}\n const healthCheck = useQuery(api.healthCheck.get);\n {{/if}}\n\n return (\n <div className=\"container mx-auto max-w-3xl px-4 py-2\">\n <pre className=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n <div className=\"grid gap-6\">\n <section className=\"rounded-lg border p-4\">\n <h2 className=\"mb-2 font-medium\">API Status</h2>\n {{#if (eq backend \"convex\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck === \"OK\" ? \"bg-green-500\" : healthCheck === undefined ? \"bg-orange-400\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected\"\n : \"Error\"}\n </span>\n </div>\n {{else}}\n {{#unless (eq api \"none\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data\n ? \"Connected\"\n : \"Disconnected\"}\n </span>\n </div>\n {{/unless}}\n {{/if}}\n </section>\n </div>\n </div>\n );\n}\n`],\n [\"frontend/react/tanstack-router/src/routes/__root.tsx.hbs\", `import Header from \"@/components/header\";\nimport { ThemeProvider } from \"@/components/theme-provider\";\nimport { Toaster } from \"@/components/ui/sonner\";\n{{#if (eq api \"orpc\")}}\nimport { link, orpc } from \"@/utils/orpc\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\nimport { useState } from \"react\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\nimport { createORPCClient } from \"@orpc/client\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport type { trpc } from \"@/utils/trpc\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\n{{/if}}\nimport {\n HeadContent,\n Outlet,\n createRootRouteWithContext,\n} from \"@tanstack/react-router\";\nimport { TanStackRouterDevtools } from \"@tanstack/react-router-devtools\";\nimport \"../index.css\";\n\n{{#if (eq api \"orpc\")}}\nexport interface RouterAppContext {\n orpc: typeof orpc;\n queryClient: QueryClient;\n}\n{{else if (eq api \"trpc\")}}\nexport interface RouterAppContext {\n trpc: typeof trpc;\n queryClient: QueryClient;\n}\n{{else}}\nexport interface RouterAppContext {}\n{{/if}}\n\nexport const Route = createRootRouteWithContext<RouterAppContext>()({\n component: RootComponent,\n head: () => ({\n meta: [\n {\n title: \"{{projectName}}\",\n },\n {\n name: \"description\",\n content: \"{{projectName}} is a web application\",\n },\n ],\n links: [\n {\n rel: \"icon\",\n href: \"/favicon.ico\",\n },\n ],\n }),\n});\n\nfunction RootComponent() {\n {{#if (eq api \"orpc\")}}\n const [client] = useState<AppRouterClient>(() => createORPCClient(link));\n const [orpcUtils] = useState(() => createTanstackQueryUtils(client));\n {{/if}}\n\n return (\n <>\n <HeadContent />\n {{#if (eq api \"orpc\")}}\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n {{else}}\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"dark\"\n disableTransitionOnChange\n storageKey=\"vite-ui-theme\"\n >\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n <Outlet />\n </div>\n <Toaster richColors />\n </ThemeProvider>\n {{/if}}\n <TanStackRouterDevtools position=\"bottom-left\" />\n {{#if (or (eq api \"orpc\") (eq api \"trpc\"))}}\n <ReactQueryDevtools position=\"bottom\" buttonPosition=\"bottom-right\" />\n {{/if}}\n </>\n );\n}\n`],\n [\"frontend/react/tanstack-router/src/components/mode-toggle.tsx.hbs\", `import { Moon, Sun } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { useTheme } from \"@/components/theme-provider\";\n\nexport function ModeToggle() {\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" size=\"icon\" />}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>Light</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>Dark</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>System</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"frontend/react/tanstack-router/src/components/theme-provider.tsx.hbs\", `import * as React from \"react\";\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\n\nexport function ThemeProvider({\n children,\n ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>;\n}\n\nexport { useTheme } from \"next-themes\";\n`],\n [\"frontend/react/react-router/src/components/mode-toggle.tsx.hbs\", `import { Moon, Sun } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { useTheme } from \"@/components/theme-provider\";\n\nexport function ModeToggle() {\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" size=\"icon\" />}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>Light</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>Dark</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>System</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"frontend/react/react-router/src/components/theme-provider.tsx.hbs\", `import * as React from \"react\";\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\n\nexport function ThemeProvider({\n children,\n ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>;\n}\n\nexport { useTheme } from \"next-themes\";\n`],\n [\"frontend/react/react-router/src/routes/_index.tsx.hbs\", `import type { Route } from \"./+types/_index\";\n{{#if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n{{else if (or (eq api \"orpc\") (eq api \"trpc\"))}}\nimport { useQuery } from \"@tanstack/react-query\";\n {{#if (eq api \"orpc\")}}\n import { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\n import { trpc } from \"@/utils/trpc\";\n {{/if}}\n{{/if}}\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\nexport function meta({}: Route.MetaArgs) {\n return [{ title: \"{{projectName}}\" }, { name: \"description\", content: \"{{projectName}} is a web application\" }];\n}\n\nexport default function Home() {\n {{#if (eq backend \"convex\")}}\n const healthCheck = useQuery(api.healthCheck.get);\n {{else if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n {{else if (eq api \"trpc\")}}\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n {{/if}}\n\n return (\n <div className=\"container mx-auto max-w-3xl px-4 py-2\">\n <pre className=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n <div className=\"grid gap-6\">\n <section className=\"rounded-lg border p-4\">\n <h2 className=\"mb-2 font-medium\">API Status</h2>\n {{#if (eq backend \"convex\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck === \"OK\" ? \"bg-green-500\" : healthCheck === undefined ? \"bg-orange-400\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected\"\n : \"Error\"}\n </span>\n </div>\n {{else}}\n {{#unless (eq api \"none\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${\n healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"\n }\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data\n ? \"Connected\"\n : \"Disconnected\"}\n </span>\n </div>\n {{/unless}}\n {{/if}}\n </section>\n </div>\n </div>\n );\n}\n`],\n [\"frontend/react/web-base/src/components/header.tsx.hbs\", `{{#if (includes frontend \"next\")}}\n\"use client\";\nimport Link from \"next/link\";\n{{else if (includes frontend \"react-router\")}}\nimport { NavLink } from \"react-router\";\n{{else if (or (includes frontend \"tanstack-router\") (includes frontend \"tanstack-start\"))}}\nimport { Link } from \"@tanstack/react-router\";\n{{/if}}\n{{#unless (includes frontend \"tanstack-start\")}}\nimport { ModeToggle } from \"./mode-toggle\";\n{{/unless}}\n{{#if (and (eq auth \"better-auth\") (ne backend \"convex\"))}}\nimport UserMenu from \"./user-menu\";\n{{/if}}\n\nexport default function Header() {\n const links = [\n { to: \"/\", label: \"Home\" },\n {{#if (or (eq auth \"better-auth\") (eq auth \"clerk\"))}}\n { to: \"/dashboard\", label: \"Dashboard\" },\n {{/if}}\n {{#if (includes examples \"todo\")}}\n { to: \"/todos\", label: \"Todos\" },\n {{/if}}\n {{#if (includes examples \"ai\")}}\n { to: \"/ai\", label: \"AI Chat\" },\n {{/if}}\n ] as const;\n\n return (\n <div>\n <div className=\"flex flex-row items-center justify-between px-2 py-1\">\n <nav className=\"flex gap-4 text-lg\">\n {links.map(({ to, label }) => {\n {{#if (includes frontend \"next\")}}\n return (\n <Link key={to} href={to}>\n {label}\n </Link>\n );\n {{else if (includes frontend \"react-router\")}}\n return (\n <NavLink\n key={to}\n to={to}\n className={({ isActive }) => isActive ? \"font-bold\" : \"\"}\n end\n >\n {label}\n </NavLink>\n );\n {{else if (or (includes frontend \"tanstack-router\") (includes frontend \"tanstack-start\"))}}\n return (\n <Link\n key={to}\n to={to}\n >\n {label}\n </Link>\n );\n {{else}}\n return null;\n {{/if}}\n })}\n </nav>\n <div className=\"flex items-center gap-2\">\n {{#unless (includes frontend \"tanstack-start\")}}\n <ModeToggle />\n {{/unless}}\n {{#if (and (eq auth \"better-auth\") (ne backend \"convex\"))}}\n <UserMenu />\n {{/if}}\n </div>\n </div>\n <hr />\n </div>\n );\n}\n`],\n [\"frontend/react/web-base/src/components/loader.tsx.hbs\", `import { Loader2 } from \"lucide-react\";\n\nexport default function Loader() {\n return (\n <div className=\"flex h-full items-center justify-center pt-8\">\n <Loader2 className=\"animate-spin\" />\n </div>\n );\n}\n`],\n [\"frontend/react/next/src/components/providers.tsx.hbs\", `\"use client\";\n\n{{#if (eq backend \"convex\")}}\n{{#if (eq auth \"clerk\")}}\nimport { useAuth } from \"@clerk/nextjs\";\nimport { ConvexReactClient } from \"convex/react\";\nimport { ConvexProviderWithClerk } from \"convex/react-clerk\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{else if (eq auth \"better-auth\")}}\nimport { ConvexReactClient } from \"convex/react\";\nimport { ConvexBetterAuthProvider } from \"@convex-dev/better-auth/react\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{else}}\nimport { ConvexProvider, ConvexReactClient } from \"convex/react\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{/if}}\n{{else}}\n{{#unless (eq api \"none\")}}\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\";\n{{#if (eq api \"orpc\")}}\nimport { queryClient } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { queryClient } from \"@/utils/trpc\";\n{{/if}}\n{{/unless}}\n{{/if}}\nimport { ThemeProvider } from \"./theme-provider\";\nimport { Toaster } from \"./ui/sonner\";\n\n{{#if (eq backend \"convex\")}}\nconst convex = new ConvexReactClient(env.NEXT_PUBLIC_CONVEX_URL);\n{{/if}}\n\nexport default function Providers({\n children,\n{{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n initialToken,\n{{/if}}\n}: {\n children: React.ReactNode;\n{{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n initialToken?: string | null;\n{{/if}}\n}) {\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"system\"\n enableSystem\n disableTransitionOnChange\n >\n {{#if (eq backend \"convex\")}}\n {{#if (eq auth \"clerk\")}}\n <ConvexProviderWithClerk client={convex} useAuth={useAuth}>\n {children}\n </ConvexProviderWithClerk>\n {{else if (eq auth \"better-auth\")}}\n <ConvexBetterAuthProvider\n client={convex}\n authClient={authClient}\n initialToken={initialToken}\n >\n {children}\n </ConvexBetterAuthProvider>\n {{else}}\n <ConvexProvider client={convex}>{children}</ConvexProvider>\n {{/if}}\n {{else}}\n {{#unless (eq api \"none\")}}\n <QueryClientProvider client={queryClient}>\n {{#if (eq api \"orpc\")}}\n {children}\n {{/if}}\n {{#if (eq api \"trpc\")}}\n {children}\n {{/if}}\n <ReactQueryDevtools />\n </QueryClientProvider>\n {{else}}\n {children}\n {{/unless}}\n {{/if}}\n <Toaster richColors />\n </ThemeProvider>\n );\n}\n`],\n [\"frontend/react/next/src/components/mode-toggle.tsx.hbs\", `\"use client\"\n\nimport * as React from \"react\"\nimport { Moon, Sun } from \"lucide-react\"\nimport { useTheme } from \"next-themes\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\n\nexport function ModeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" size=\"icon\" />}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Toggle theme</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n Light\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n Dark\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n System\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n`],\n [\"frontend/react/next/src/components/theme-provider.tsx.hbs\", `\"use client\"\n\nimport * as React from \"react\"\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\"\n\nexport function ThemeProvider({\n children,\n ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>\n}\n`],\n [\"frontend/react/web-base/src/lib/utils.ts.hbs\", `import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n`],\n [\"frontend/react/next/src/app/layout.tsx.hbs\", `import type { Metadata } from \"next\";\nimport { Geist, Geist_Mono } from \"next/font/google\";\nimport \"../index.css\";\n{{#if (eq auth \"clerk\")}}{{#if (eq backend \"convex\")}}import { ClerkProvider } from \"@clerk/nextjs\";\n{{/if}}{{/if}}{{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nimport { getToken } from \"@/lib/auth-server\";\n{{/if}}\nimport Providers from \"@/components/providers\";\nimport Header from \"@/components/header\";\n\nconst geistSans = Geist({\n variable: \"--font-geist-sans\",\n subsets: [\"latin\"],\n});\n\nconst geistMono = Geist_Mono({\n variable: \"--font-geist-mono\",\n subsets: [\"latin\"],\n});\n\nexport const metadata: Metadata = {\n title: \"{{projectName}}\",\n description: \"{{projectName}}\",\n};\n\n{{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nexport default async function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n const token = await getToken();\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body\n className={\\`\\${geistSans.variable} \\${geistMono.variable} antialiased\\`}\n >\n <Providers initialToken={token}>\n <div className=\"grid grid-rows-[auto_1fr] h-svh\">\n <Header />\n {children}\n </div>\n </Providers>\n </body>\n </html>\n );\n}\n{{else}}\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n \treturn (\n\t\t<html lang=\"en\" suppressHydrationWarning>\n\t\t\t<body\n\t\t\t\tclassName={\\`\\${geistSans.variable} \\${geistMono.variable} antialiased\\`}\n\t\t\t>\n\t\t\t\t{{#if (and (eq auth \"clerk\") (eq backend \"convex\"))}}<ClerkProvider>\n\t\t\t\t\t<Providers>\n\t\t\t\t\t\t<div className=\"grid grid-rows-[auto_1fr] h-svh\">\n\t\t\t\t\t\t\t<Header />\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Providers>\n\t\t\t\t</ClerkProvider>{{else}}<Providers>\n\t\t\t\t\t<div className=\"grid grid-rows-[auto_1fr] h-svh\">\n\t\t\t\t\t\t<Header />\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</Providers>{{/if}}\n\t\t\t</body>\n\t\t</html>\n\t);\n}\n{{/if}}\n`],\n [\"frontend/react/next/src/app/page.tsx.hbs\", `\"use client\"\n{{#if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n{{else if (or (eq api \"orpc\") (eq api \"trpc\"))}}\nimport { useQuery } from \"@tanstack/react-query\";\n {{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n {{/if}}\n{{/if}}\n\nconst TITLE_TEXT = \\`\n ██████╗ ███████╗████████╗████████╗███████╗██████╗\n ██╔══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗\n ██████╔╝█████╗ ██║ ██║ █████╗ ██████╔╝\n ██╔══██╗██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗\n ██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║\n ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝\n\n ████████╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗\n ╚══██╔══╝ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝\n ██║ ███████╗ ██║ ███████║██║ █████╔╝\n ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗\n ██║ ███████║ ██║ ██║ ██║╚██████╗██║ ██╗\n ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝\n \\`;\n\nexport default function Home() {\n {{#if (eq backend \"convex\")}}\n const healthCheck = useQuery(api.healthCheck.get);\n {{else if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n {{else if (eq api \"trpc\")}}\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n {{/if}}\n\n return (\n <div className=\"container mx-auto max-w-3xl px-4 py-2\">\n <pre className=\"overflow-x-auto font-mono text-sm\">{TITLE_TEXT}</pre>\n <div className=\"grid gap-6\">\n <section className=\"rounded-lg border p-4\">\n <h2 className=\"mb-2 font-medium\">API Status</h2>\n {{#if (eq backend \"convex\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck === \"OK\" ? \"bg-green-500\" : healthCheck === undefined ? \"bg-orange-400\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected\"\n : \"Error\"}\n </span>\n </div>\n {{else}}\n {{#unless (eq api \"none\")}}\n <div className=\"flex items-center gap-2\">\n <div\n className={\\`h-2 w-2 rounded-full \\${healthCheck.data ? \"bg-green-500\" : \"bg-red-500\"}\\`}\n />\n <span className=\"text-sm text-muted-foreground\">\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data\n ? \"Connected\"\n : \"Disconnected\"}\n </span>\n </div>\n {{/unless}}\n {{/if}}\n </section>\n </div>\n </div>\n );\n}\n`],\n [\"frontend/react/next/src/app/favicon.ico\", `[Binary file]`],\n [\"frontend/nuxt/app/assets/css/main.css\", `@import \"tailwindcss\";\n@import \"@nuxt/ui\";\n`],\n [\"frontend/native/uniwind/app/(drawer)/_layout.tsx.hbs\", `import React, { useCallback } from \"react\";\nimport { Ionicons, MaterialIcons } from \"@expo/vector-icons\";\nimport { Link } from \"expo-router\";\nimport { Drawer } from \"expo-router/drawer\";\nimport { useThemeColor } from \"heroui-native\";\nimport { Pressable, Text } from \"react-native\";\nimport { ThemeToggle } from \"@/components/theme-toggle\";\n\nfunction DrawerLayout() {\n const themeColorForeground = useThemeColor(\"foreground\");\n const themeColorBackground = useThemeColor(\"background\");\n\n const renderThemeToggle = useCallback(() => <ThemeToggle />, []);\n\n return (\n <Drawer\n screenOptions=\\\\{{\n headerTintColor: themeColorForeground,\n headerStyle: { backgroundColor: themeColorBackground },\n headerTitleStyle: {\n fontWeight: \"600\",\n color: themeColorForeground,\n },\n headerRight: renderThemeToggle,\n drawerStyle: { backgroundColor: themeColorBackground },\n }}\n >\n <Drawer.Screen\n name=\"index\"\n options=\\\\{{\n headerTitle: \"Home\",\n drawerLabel: ({ color, focused }) => (\n <Text style=\\\\{{ color: focused ? color : themeColorForeground }}>Home</Text>\n ),\n drawerIcon: ({ size, color, focused }) => (\n <Ionicons name=\"home-outline\" size={size} color={focused ? color : themeColorForeground} />\n ),\n }}\n />\n <Drawer.Screen\n name=\"(tabs)\"\n options=\\\\{{\n headerTitle: \"Tabs\",\n drawerLabel: ({ color, focused }) => (\n <Text style=\\\\{{ color: focused ? color : themeColorForeground }}>Tabs</Text>\n ),\n drawerIcon: ({ size, color, focused }) => (\n <MaterialIcons name=\"border-bottom\" size={size} color={focused ? color : themeColorForeground} />\n ),\n headerRight: () => (\n <Link href=\"/modal\" asChild>\n <Pressable className=\"mr-4\">\n <Ionicons name=\"add-outline\" size={24} color={themeColorForeground} />\n </Pressable>\n </Link>\n ),\n }}\n />\n {{#if (includes examples \"todo\")}}\n <Drawer.Screen\n name=\"todos\"\n options=\\\\{{\n headerTitle: \"Todos\",\n drawerLabel: ({ color, focused }) => (\n <Text style=\\\\{{ color: focused ? color : themeColorForeground }}>Todos</Text>\n ),\n drawerIcon: ({ size, color, focused }) => (\n <Ionicons name=\"checkbox-outline\" size={size} color={focused ? color : themeColorForeground} />\n ),\n }}\n />\n {{/if}}\n {{#if (includes examples \"ai\")}}\n <Drawer.Screen\n name=\"ai\"\n options=\\\\{{\n headerTitle: \"AI\",\n drawerLabel: ({ color, focused }) => (\n <Text style=\\\\{{ color: focused ? color : themeColorForeground }}>AI</Text>\n ),\n drawerIcon: ({ size, color, focused }) => (\n <Ionicons name=\"chatbubble-ellipses-outline\" size={size} color={focused ? color : themeColorForeground} />\n ),\n }}\n />\n {{/if}}\n </Drawer>\n );\n}\n\nexport default DrawerLayout;`],\n [\"frontend/native/uniwind/app/(drawer)/index.tsx.hbs\", `import { Text, View } from \"react-native\";\nimport { Container } from \"@/components/container\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nimport { Link } from \"expo-router\";\nimport { Authenticated, AuthLoading, Unauthenticated, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { useUser } from \"@clerk/clerk-expo\";\nimport { SignOutButton } from \"@/components/sign-out-button\";\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nimport { useConvexAuth, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{else if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n{{/if}}\n{{#unless (or (eq backend \"none\") (and (eq backend \"convex\") (eq auth \"better-auth\")))}}\nimport { Ionicons } from \"@expo/vector-icons\";\n{{/unless}}\nimport { Button, Chip, Divider, Spinner, Surface, useThemeColor } from \"heroui-native\";\n\nexport default function Home() {\n{{#if (eq api \"orpc\")}}\nconst healthCheck = useQuery(orpc.healthCheck.queryOptions());\n{{/if}}\n{{#if (eq api \"trpc\")}}\nconst healthCheck = useQuery(trpc.healthCheck.queryOptions());\n{{/if}}\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nconst { user } = useUser();\nconst healthCheck = useQuery(api.healthCheck.get);\nconst privateData = useQuery(api.privateData.get);\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nconst healthCheck = useQuery(api.healthCheck.get);\nconst { isAuthenticated } = useConvexAuth();\nconst user = useQuery(api.auth.getCurrentUser, isAuthenticated ? {} : \"skip\");\n{{else if (eq backend \"convex\")}}\nconst healthCheck = useQuery(api.healthCheck.get);\n{{/if}}\n{{#unless (eq backend \"none\")}}\nconst successColor = useThemeColor(\"success\");\nconst dangerColor = useThemeColor(\"danger\");\n\n{{#if (eq backend \"convex\")}}\nconst isConnected = healthCheck === \"OK\";\nconst isLoading = healthCheck === undefined;\n{{else}}\n{{#unless (eq api \"none\")}}\nconst isConnected = healthCheck?.data === \"OK\";\nconst isLoading = healthCheck?.isLoading;\n{{/unless}}\n{{/if}}\n{{/unless}}\n\nreturn (\n<Container className=\"p-4\">\n <View className=\"py-6 mb-4\">\n <Text className=\"text-3xl font-semibold text-foreground tracking-tight\">\n Better T Stack\n </Text>\n <Text className=\"text-muted text-sm mt-1\">Full-stack TypeScript starter</Text>\n </View>\n\n {{#unless (or (eq backend \"none\") (and (eq backend \"convex\") (eq auth \"better-auth\")))}}\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <View className=\"flex-row items-center justify-between mb-3\">\n <Text className=\"text-foreground font-medium\">System Status</Text>\n <Chip variant=\"secondary\" color={isConnected ? \"success\" : \"danger\" } size=\"sm\">\n <Chip.Label>\n {isConnected ? \"LIVE\" : \"OFFLINE\"}\n </Chip.Label>\n </Chip>\n </View>\n\n <Divider className=\"mb-3\" />\n\n <Surface variant=\"tertiary\" className=\"p-3 rounded-md\">\n <View className=\"flex-row items-center\">\n <View className={\\`w-2 h-2 rounded-full mr-3 \\${ isConnected ? \"bg-success\" : \"bg-muted\" }\\`} />\n <View className=\"flex-1\">\n <Text className=\"text-foreground text-sm font-medium\">\n {{#if (eq backend \"convex\")}}\n Convex Backend\n {{else}}\n {{#unless (eq api \"none\")}}\n {{#if (eq api \"orpc\")}}ORPC{{else}}TRPC{{/if}} Backend\n {{/unless}}\n {{/if}}\n </Text>\n <Text className=\"text-muted text-xs mt-0.5\">\n {isLoading\n ? \"Checking connection...\"\n : isConnected\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n {isLoading && <Spinner size=\"sm\" />}\n {!isLoading && isConnected && (\n <Ionicons name=\"checkmark-circle\" size={18} color={successColor} />\n )}\n {!isLoading && !isConnected && (\n <Ionicons name=\"close-circle\" size={18} color={dangerColor} />\n )}\n </View>\n </Surface>\n </Surface>\n {{/unless}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n <Authenticated>\n <Surface variant=\"secondary\" className=\"mt-4 p-4 rounded-lg\">\n <View className=\"flex-row items-center justify-between\">\n <View className=\"flex-1\">\n <Text className=\"text-foreground font-medium\">{user?.emailAddresses[0].emailAddress}</Text>\n <Text className=\"text-muted text-xs mt-0.5\">Private: {privateData?.message}</Text>\n </View>\n <SignOutButton />\n </View>\n </Surface>\n </Authenticated>\n <Unauthenticated>\n <View className=\"mt-4 gap-3\">\n <Link href=\"/(auth)/sign-in\" asChild>\n <Button variant=\"secondary\"><Button.Label>Sign In</Button.Label></Button>\n </Link>\n <Link href=\"/(auth)/sign-up\" asChild>\n <Button variant=\"ghost\"><Button.Label>Sign Up</Button.Label></Button>\n </Link>\n </View>\n </Unauthenticated>\n <AuthLoading>\n <View className=\"mt-4 items-center\">\n <Spinner size=\"sm\" />\n </View>\n </AuthLoading>\n {{/if}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n {user ? (\n <Surface variant=\"secondary\" className=\"mb-4 p-4 rounded-lg\">\n <View className=\"flex-row items-center justify-between\">\n <View className=\"flex-1\">\n <Text className=\"text-foreground font-medium\">{user.name}</Text>\n <Text className=\"text-muted text-xs mt-0.5\">{user.email}</Text>\n </View>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onPress={() => {\n authClient.signOut();\n }}\n >\n Sign Out\n </Button>\n </View>\n </Surface>\n ) : null}\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <Text className=\"text-foreground font-medium mb-2\">API Status</Text>\n <View className=\"flex-row items-center gap-2\">\n <View className={\\`w-2 h-2 rounded-full \\${healthCheck===\"OK\" ? \"bg-success\" : \"bg-danger\" }\\`} />\n <Text className=\"text-muted text-xs\">\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </Surface>\n {!user && (\n <View className=\"mt-4 gap-4\">\n <SignIn />\n <SignUp />\n </View>\n )}\n {{/if}}\n</Container>\n);\n}`],\n [\"frontend/native/base/assets/images/android-icon-background.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/react-logo@2x.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/icon.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/partial-react-logo.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/favicon.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/react-logo.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/android-icon-foreground.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/react-logo@3x.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/android-icon-monochrome.png\", `[Binary file]`],\n [\"frontend/native/base/assets/images/splash-icon.png\", `[Binary file]`],\n [\"frontend/native/unistyles/app/(drawer)/_layout.tsx.hbs\", `import { Ionicons, MaterialIcons } from \"@expo/vector-icons\";\nimport { Link } from \"expo-router\";\nimport { Drawer } from \"expo-router/drawer\";\nimport { useUnistyles } from \"react-native-unistyles\";\n\nimport { HeaderButton } from \"../../components/header-button\";\n\nconst DrawerLayout = () => {\n const { theme } = useUnistyles();\n\n return (\n <Drawer\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.colors.background,\n },\n headerTitleStyle: {\n color: theme.colors.foreground,\n },\n headerTintColor: theme.colors.foreground,\n drawerStyle: {\n backgroundColor: theme.colors.background,\n },\n drawerLabelStyle: {\n color: theme.colors.foreground,\n },\n drawerInactiveTintColor: theme.colors.mutedForeground,\n }}\n >\n <Drawer.Screen\n name=\"index\"\n options=\\\\{{\n headerTitle: \"Home\",\n drawerLabel: \"Home\",\n drawerIcon: ({ size, color }) => (\n <Ionicons name=\"home-outline\" size={size} color={color} />\n ),\n }}\n />\n <Drawer.Screen\n name=\"(tabs)\"\n options=\\\\{{\n headerTitle: \"Tabs\",\n drawerLabel: \"Tabs\",\n drawerIcon: ({ size, color }) => (\n <MaterialIcons name=\"border-bottom\" size={size} color={color} />\n ),\n headerRight: () => (\n <Link href=\"/modal\" asChild>\n <HeaderButton />\n </Link>\n ),\n }}\n />\n {{#if (includes examples \"todo\")}}\n <Drawer.Screen\n name=\"todos\"\n options=\\\\{{\n headerTitle: \"Todos\",\n drawerLabel: \"Todos\",\n drawerIcon: ({ size, color }) => (\n <Ionicons name=\"checkbox-outline\" size={size} color={color} />\n ),\n }}\n />\n {{/if}}\n {{#if (includes examples \"ai\")}}\n <Drawer.Screen\n name=\"ai\"\n options=\\\\{{\n headerTitle: \"AI\",\n drawerLabel: \"AI\",\n drawerIcon: ({ size, color }) => (\n <Ionicons\n name=\"chatbubble-ellipses-outline\"\n size={size}\n color={color}\n />\n ),\n }}\n />\n {{/if}}\n </Drawer>\n );\n};\n\nexport default DrawerLayout;\n`],\n [\"frontend/native/unistyles/app/(drawer)/index.tsx.hbs\", `import { ScrollView, Text, View, TouchableOpacity } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\nimport { Container } from \"@/components/container\";\n\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nimport { Link } from \"expo-router\";\nimport { Authenticated, AuthLoading, Unauthenticated, useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport { useUser } from \"@clerk/clerk-expo\";\nimport { SignOutButton } from \"@/components/sign-out-button\";\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nimport { useConvexAuth, useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{else if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\n{{/if}}\n\nexport default function Home() {\n {{#if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n {{/if}}\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n const { user } = useUser();\n const healthCheck = useQuery(api.healthCheck.get);\n const privateData = useQuery(api.privateData.get);\n {{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n const healthCheck = useQuery(api.healthCheck.get);\n const { isAuthenticated } = useConvexAuth();\n const user = useQuery(api.auth.getCurrentUser, isAuthenticated ? {} : \"skip\");\n {{else if (eq backend \"convex\")}}\n const healthCheck = useQuery(api.healthCheck.get);\n {{/if}}\n\n return (\n <Container>\n <ScrollView\n contentContainerStyle={styles.container}\n showsVerticalScrollIndicator={false}\n >\n <Text style={styles.heroTitle}>\n BETTER T STACK\n </Text>\n\n {{#unless (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n <View style={styles.statusCard}>\n <View style={styles.statusHeader}>\n <Text style={styles.statusTitle}>System Status</Text>\n <View style={styles.statusBadge}>\n <Text style={styles.statusBadgeText}>LIVE</Text>\n </View>\n </View>\n {{#if (eq backend \"convex\")}}\n {{#unless (eq auth \"better-auth\")}}\n <View style={styles.statusRow}>\n <View\n style={[\n styles.statusDot,\n healthCheck === \"OK\"\n ? styles.statusDotSuccess\n : styles.statusDotWarning,\n ]}\n />\n <View style={styles.statusContent}>\n <Text style={styles.statusLabel}>Convex</Text>\n <Text style={styles.statusDescription}>\n {healthCheck === undefined\n ? \"Checking connection...\"\n : healthCheck === \"OK\"\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n {{/unless}}\n {{else}}\n {{#unless (eq api \"none\")}}\n <View style={styles.statusRow}>\n <View\n style={[\n styles.statusDot,\n healthCheck.data\n ? styles.statusDotSuccess\n : styles.statusDotWarning,\n ]}\n />\n <View style={styles.statusContent}>\n <Text style={styles.statusLabel}>\n {{#if (eq api \"orpc\")}}ORPC{{/if}}\n {{#if (eq api \"trpc\")}}TRPC{{/if}}\n </Text>\n <Text style={styles.statusDescription}>\n {healthCheck.isLoading\n ? \"Checking connection...\"\n : healthCheck.data\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n {{/unless}}\n {{/if}}\n </View>\n {{/unless}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n <Authenticated>\n <Text>\n Hello {user?.emailAddresses[0].emailAddress}\n </Text>\n <Text>\n Private Data: {privateData?.message}\n </Text>\n <SignOutButton />\n </Authenticated>\n <Unauthenticated>\n <Link href=\"/(auth)/sign-in\">\n <Text>Sign in</Text>\n </Link>\n <Link href=\"/(auth)/sign-up\">\n <Text>Sign up</Text>\n </Link>\n </Unauthenticated>\n <AuthLoading>\n <Text>Loading...</Text>\n </AuthLoading>\n {{/if}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n {user ? (\n <View style={styles.userCard}>\n <View style={styles.userHeader}>\n <Text style={styles.userWelcome}>\n Welcome,{\" \"}\n <Text style={styles.userName}>{user.name}</Text>\n </Text>\n </View>\n <Text style={styles.userEmail}>{user.email}</Text>\n <TouchableOpacity\n style={styles.signOutButton}\n onPress={() => {\n authClient.signOut();\n }}\n >\n <Text style={styles.signOutText}>Sign Out</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n <View style={styles.apiStatusCard}>\n <Text style={styles.apiStatusTitle}>API Status</Text>\n <View style={styles.apiStatusRow}>\n <View\n style={[\n styles.statusDot,\n healthCheck === \"OK\"\n ? styles.statusDotSuccess\n : styles.statusDotWarning,\n ]}\n />\n <Text style={styles.apiStatusText}>\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n {!user && (\n <>\n <SignIn />\n <SignUp />\n </>\n )}\n {{/if}}\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n paddingHorizontal: theme.spacing.md,\n },\n heroSection: {\n paddingVertical: theme.spacing.xl,\n },\n heroTitle: {\n fontSize: theme.fontSize[\"4xl\"],\n fontWeight: \"bold\",\n color: theme.colors.foreground,\n marginBottom: theme.spacing.sm,\n },\n heroSubtitle: {\n fontSize: theme.fontSize.lg,\n color: theme.colors.mutedForeground,\n lineHeight: 28,\n },\n statusCard: {\n backgroundColor: theme.colors.card,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.xl,\n padding: theme.spacing.lg,\n marginBottom: theme.spacing.lg,\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.05,\n shadowRadius: 3,\n elevation: 2,\n },\n statusHeader: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: theme.spacing.md,\n },\n statusTitle: {\n fontSize: theme.fontSize.lg,\n fontWeight: \"600\",\n color: theme.colors.cardForeground,\n },\n statusBadge: {\n backgroundColor: theme.colors.secondary,\n paddingHorizontal: theme.spacing.sm + 4,\n paddingVertical: theme.spacing.xs,\n borderRadius: 9999,\n },\n statusBadgeText: {\n fontSize: theme.fontSize.xs,\n fontWeight: \"500\",\n color: theme.colors.secondaryForeground,\n },\n statusRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: theme.spacing.sm + 4,\n },\n statusDot: {\n height: 12,\n width: 12,\n borderRadius: 6,\n },\n statusDotSuccess: {\n backgroundColor: theme.colors.success,\n },\n statusDotWarning: {\n backgroundColor: \"#F59E0B\",\n },\n statusContent: {\n flex: 1,\n },\n statusLabel: {\n fontSize: theme.fontSize.sm,\n fontWeight: \"500\",\n color: theme.colors.cardForeground,\n },\n statusDescription: {\n fontSize: theme.fontSize.xs,\n color: theme.colors.mutedForeground,\n },\n userCard: {\n backgroundColor: theme.colors.card,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.lg,\n padding: theme.spacing.md,\n marginBottom: theme.spacing.md,\n },\n userHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: theme.spacing.xs,\n },\n userWelcome: {\n fontSize: theme.fontSize.base,\n color: theme.colors.foreground,\n },\n userName: {\n fontWeight: \"500\",\n },\n userEmail: {\n fontSize: theme.fontSize.sm,\n color: theme.colors.mutedForeground,\n marginBottom: theme.spacing.md,\n },\n signOutButton: {\n backgroundColor: theme.colors.destructive,\n paddingVertical: theme.spacing.sm,\n paddingHorizontal: theme.spacing.md,\n borderRadius: theme.borderRadius.md,\n alignSelf: \"flex-start\",\n },\n signOutText: {\n color: theme.colors.destructiveForeground,\n fontWeight: \"500\",\n },\n apiStatusCard: {\n marginBottom: theme.spacing.md,\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderColor: theme.colors.border,\n padding: theme.spacing.md,\n },\n apiStatusTitle: {\n marginBottom: theme.spacing.sm,\n fontWeight: \"500\",\n color: theme.colors.foreground,\n },\n apiStatusRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: theme.spacing.xs,\n },\n apiStatusText: {\n color: theme.colors.mutedForeground,\n },\n}));`],\n [\"frontend/native/bare/app/(drawer)/_layout.tsx.hbs\", `import { Ionicons, MaterialIcons } from \"@expo/vector-icons\";\nimport { Link } from \"expo-router\";\nimport { Drawer } from \"expo-router/drawer\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nimport { HeaderButton } from \"@/components/header-button\";\n\nconst DrawerLayout = () => {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Drawer\n screenOptions=\\\\{{\n headerStyle: {\n backgroundColor: theme.background,\n },\n headerTitleStyle: {\n color: theme.text,\n },\n headerTintColor: theme.text,\n drawerStyle: {\n backgroundColor: theme.background,\n },\n drawerLabelStyle: {\n color: theme.text,\n },\n drawerInactiveTintColor: theme.text,\n }}\n >\n <Drawer.Screen\n name=\"index\"\n options=\\\\{{\n headerTitle: \"Home\",\n drawerLabel: \"Home\",\n drawerIcon: ({ size, color }) => (\n <Ionicons name=\"home-outline\" size={size} color={color} />\n ),\n }}\n />\n <Drawer.Screen\n name=\"(tabs)\"\n options=\\\\{{\n headerTitle: \"Tabs\",\n drawerLabel: \"Tabs\",\n drawerIcon: ({ size, color }) => (\n <MaterialIcons name=\"border-bottom\" size={size} color={color} />\n ),\n headerRight: () => (\n <Link href=\"/modal\" asChild>\n <HeaderButton />\n </Link>\n ),\n }}\n />\n {{#if (includes examples \"todo\")}}\n <Drawer.Screen\n name=\"todos\"\n options=\\\\{{\n headerTitle: \"Todos\",\n drawerLabel: \"Todos\",\n drawerIcon: ({ size, color }) => (\n <Ionicons name=\"checkbox-outline\" size={size} color={color} />\n ),\n }}\n />\n {{/if}}\n {{#if (includes examples \"ai\")}}\n <Drawer.Screen\n name=\"ai\"\n options=\\\\{{\n headerTitle: \"AI\",\n drawerLabel: \"AI\",\n drawerIcon: ({ size, color }) => (\n <Ionicons\n name=\"chatbubble-ellipses-outline\"\n size={size}\n color={color}\n />\n ),\n }}\n />\n {{/if}}\n </Drawer>\n );\n};\n\nexport default DrawerLayout;\n\n`],\n [\"frontend/native/bare/app/(drawer)/index.tsx.hbs\", `import { View, Text, ScrollView, TouchableOpacity, StyleSheet } from \"react-native\";\nimport { Container } from \"@/components/container\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nimport { Link } from \"expo-router\";\nimport { Authenticated, AuthLoading, Unauthenticated, useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport { useUser } from \"@clerk/clerk-expo\";\nimport { SignOutButton } from \"@/components/sign-out-button\";\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nimport { useConvexAuth, useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{else if (eq backend \"convex\")}}\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\n{{/if}}\n\nexport default function Home() {\nconst { colorScheme } = useColorScheme();\nconst theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n{{#if (eq api \"orpc\")}}\nconst healthCheck = useQuery(orpc.healthCheck.queryOptions());\n{{/if}}\n{{#if (eq api \"trpc\")}}\nconst healthCheck = useQuery(trpc.healthCheck.queryOptions());\n{{/if}}\n{{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\nconst { user } = useUser();\nconst healthCheck = useQuery(api.healthCheck.get);\nconst privateData = useQuery(api.privateData.get);\n{{else if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\nconst healthCheck = useQuery(api.healthCheck.get);\nconst { isAuthenticated } = useConvexAuth();\nconst user = useQuery(api.auth.getCurrentUser, isAuthenticated ? {} : \"skip\");\n{{else if (eq backend \"convex\")}}\nconst healthCheck = useQuery(api.healthCheck.get);\n{{/if}}\n\nreturn (\n<Container>\n <ScrollView style={styles.scrollView}>\n <View style={styles.content}>\n <Text style={[styles.title, { color: theme.text }]}>\n BETTER T STACK\n </Text>\n\n {{#unless (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n {{#if (eq backend \"convex\")}}\n <View style={styles.statusRow}>\n <View style={[styles.statusIndicator, { backgroundColor: healthCheck ? \"#10b981\" : \"#f59e0b\" }]} />\n <View style={styles.statusContent}>\n <Text style={[styles.statusTitle, { color: theme.text }]}>\n Convex\n </Text>\n <Text style={[styles.statusText, { color: theme.text, opacity: 0.7 }]}>\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n {{else}}\n {{#unless (eq api \"none\")}}\n <View style={styles.statusRow}>\n <View style={[styles.statusIndicator, { backgroundColor: healthCheck.data ? \"#10b981\" : \"#f59e0b\" }]} />\n <View style={styles.statusContent}>\n <Text style={[styles.statusTitle, { color: theme.text }]}>\n {{#if (eq api \"orpc\")}}ORPC{{else}}TRPC{{/if}}\n </Text>\n <Text style={[styles.statusText, { color: theme.text, opacity: 0.7 }]}>\n {healthCheck.isLoading\n ? \"Checking connection...\"\n : healthCheck.data\n ? \"All systems operational\"\n : \"Service unavailable\"}\n </Text>\n </View>\n </View>\n {{/unless}}\n {{/if}}\n </View>\n {{/unless}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"clerk\"))}}\n <Authenticated>\n <Text style=\\\\{{ color: theme.text }}>Hello {user?.emailAddresses[0].emailAddress}</Text>\n <Text style=\\\\{{ color: theme.text }}>Private Data: {privateData?.message}</Text>\n <SignOutButton />\n </Authenticated>\n <Unauthenticated>\n <Link href=\"/(auth)/sign-in\">\n <Text style=\\\\{{ color: theme.primary }}>Sign in</Text>\n </Link>\n <Link href=\"/(auth)/sign-up\">\n <Text style=\\\\{{ color: theme.primary }}>Sign up</Text>\n </Link>\n </Unauthenticated>\n <AuthLoading>\n <Text style=\\\\{{ color: theme.text }}>Loading...</Text>\n </AuthLoading>\n {{/if}}\n\n {{#if (and (eq backend \"convex\") (eq auth \"better-auth\"))}}\n {user ? (\n <View style={[styles.userCard, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <View style={styles.userHeader}>\n <Text style={[styles.userText, { color: theme.text }]}>\n Welcome, <Text style={styles.userName}>{user.name}</Text>\n </Text>\n </View>\n <Text style={[styles.userEmail, { color: theme.text, opacity: 0.7 }]}>\n {user.email}\n </Text>\n <TouchableOpacity style={[styles.signOutButton, { backgroundColor: theme.notification }]} onPress={()=> {\n authClient.signOut();\n }}\n >\n <Text style={styles.signOutText}>Sign Out</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n <View style={[styles.statusCard, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.statusCardTitle, { color: theme.text }]}>\n API Status\n </Text>\n <View style={styles.statusRow}>\n <View style={[styles.statusIndicator, { backgroundColor: healthCheck ? \"#10b981\" : \"#ef4444\" }]} />\n <Text style={[styles.statusText, { color: theme.text, opacity: 0.7 }]}>\n {healthCheck === undefined\n ? \"Checking...\"\n : healthCheck === \"OK\"\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n {!user && (\n <>\n <SignIn />\n <SignUp />\n </>\n )}\n {{/if}}\n </View>\n </ScrollView>\n</Container>\n);\n}\n\nconst styles = StyleSheet.create({\nscrollView: {\nflex: 1,\n},\ncontent: {\npadding: 16,\n},\ntitle: {\nfontSize: 24,\nfontWeight: \"bold\",\nmarginBottom: 16,\n},\ncard: {\npadding: 16,\nmarginBottom: 16,\nborderWidth: 1,\n},\nstatusRow: {\nflexDirection: \"row\",\nalignItems: \"center\",\ngap: 8,\n},\nstatusIndicator: {\nheight: 8,\nwidth: 8,\n},\nstatusContent: {\nflex: 1,\n},\nstatusTitle: {\nfontSize: 14,\nfontWeight: \"bold\",\n},\nstatusText: {\nfontSize: 12,\n},\nuserCard: {\nmarginBottom: 16,\npadding: 16,\nborderWidth: 1,\n},\nuserHeader: {\nmarginBottom: 8,\n},\nuserText: {\nfontSize: 16,\n},\nuserName: {\nfontWeight: \"bold\",\n},\nuserEmail: {\nfontSize: 14,\nmarginBottom: 12,\n},\nsignOutButton: {\npadding: 12,\n},\nsignOutText: {\ncolor: \"#ffffff\",\n},\nstatusCard: {\nmarginBottom: 16,\npadding: 16,\nborderWidth: 1,\n},\nstatusCardTitle: {\nmarginBottom: 8,\nfontWeight: \"bold\",\n},\n});`],\n [\"api/orpc/web/nuxt/app/plugins/vue-query.ts.hbs\", `import type {\n DehydratedState,\n VueQueryPluginOptions,\n} from '@tanstack/vue-query'\nimport {\n dehydrate,\n hydrate,\n QueryCache,\n QueryClient,\n VueQueryPlugin,\n} from '@tanstack/vue-query'\n\nexport default defineNuxtPlugin((nuxt) => {\n const vueQueryState = useState<DehydratedState | null>('vue-query')\n\n const toast = useToast()\n\n const queryClient = new QueryClient({\n queryCache: new QueryCache({\n onError: (error) => {\n console.log(error)\n toast.add({\n title: 'Error',\n description: error?.message || 'An unexpected error occurred.',\n })\n },\n }),\n })\n const options: VueQueryPluginOptions = { queryClient }\n\n nuxt.vueApp.use(VueQueryPlugin, options)\n\n if (import.meta.server) {\n nuxt.hooks.hook('app:rendered', () => {\n vueQueryState.value = dehydrate(queryClient)\n })\n }\n\n if (import.meta.client) {\n nuxt.hooks.hook('app:created', () => {\n hydrate(queryClient, vueQueryState.value)\n })\n }\n})\n`],\n [\"api/orpc/web/nuxt/app/plugins/orpc.ts.hbs\", `import { defineNuxtPlugin } from '#app'\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\nimport { createORPCClient } from '@orpc/client'\nimport { RPCLink } from '@orpc/client/fetch'\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\n\nexport default defineNuxtPlugin(() => {\n const config = useRuntimeConfig();\n const rpcUrl = \\`\\${config.public.serverUrl}/rpc\\`;\n\n const rpcLink = new RPCLink({\n url: rpcUrl,\n {{#if (eq auth \"better-auth\")}}\n fetch(url, options) {\n return fetch(url, {\n ...options,\n credentials: \"include\",\n });\n },\n {{/if}}\n })\n\n\n const client: AppRouterClient = createORPCClient(rpcLink)\n const orpcUtils = createTanstackQueryUtils(client)\n\n return {\n provide: {\n orpc: orpcUtils\n }\n }\n})\n`],\n [\"api/orpc/web/svelte/src/lib/orpc.ts.hbs\", `import { PUBLIC_SERVER_URL } from \"$env/static/public\";\nimport { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport { QueryCache, QueryClient } from \"@tanstack/svelte-query\";\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error) => {\n\t\t\tconsole.error(\\`Error: \\${error.message}\\`);\n\t\t},\n\t}),\n});\n\nexport const link = new RPCLink({\n\turl: \\`\\${PUBLIC_SERVER_URL}/rpc\\`,\n\t{{#if (eq auth \"better-auth\")}}\n\tfetch(url, options) {\n\t\treturn fetch(url, {\n\t\t\t...options,\n\t\t\tcredentials: \"include\",\n\t\t});\n\t},\n\t{{/if}}\n});\n\nexport const client: AppRouterClient = createORPCClient(link);\n\nexport const orpc = createTanstackQueryUtils(client);\n`],\n [\"api/orpc/web/solid/src/utils/orpc.ts.hbs\", `import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport { QueryCache, QueryClient } from \"@tanstack/solid-query\";\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error) => {\n\t\t\tconsole.error(\\`Error: \\${error.message}\\`);\n\t\t},\n\t}),\n});\n\nexport const link = new RPCLink({\n\turl: \\`\\${env.VITE_SERVER_URL}/rpc\\`,\n{{#if (eq auth \"better-auth\")}}\n\tfetch(url, options) {\n\t\treturn fetch(url, {\n\t\t\t...options,\n\t\t\tcredentials: \"include\",\n\t\t});\n\t},\n{{/if}}\n});\n\nexport const client: AppRouterClient = createORPCClient(link);\n\nexport const orpc = createTanstackQueryUtils(client);\n`],\n [\"auth/better-auth/native/uniwind/app/(drawer)/index.tsx.hbs\", `import { Text, View, Pressable } from \"react-native\";\nimport { Container } from \"@/components/container\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { Card, Chip, useThemeColor } from \"heroui-native\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, trpc } from \"@/utils/trpc\";\n{{/if}}\n\nexport default function Home() {\n{{#if (eq api \"orpc\")}}\nconst healthCheck = useQuery(orpc.healthCheck.queryOptions());\nconst privateData = useQuery(orpc.privateData.queryOptions());\nconst isConnected = healthCheck?.data === \"OK\";\nconst isLoading = healthCheck?.isLoading;\n{{/if}}\n{{#if (eq api \"trpc\")}}\nconst healthCheck = useQuery(trpc.healthCheck.queryOptions());\nconst privateData = useQuery(trpc.privateData.queryOptions());\nconst isConnected = healthCheck?.data === \"OK\";\nconst isLoading = healthCheck?.isLoading;\n{{/if}}\nconst { data: session } = authClient.useSession();\n\nconst mutedColor = useThemeColor(\"muted\");\nconst successColor = useThemeColor(\"success\");\nconst dangerColor = useThemeColor(\"danger\");\nconst foregroundColor = useThemeColor(\"foreground\");\n\nreturn (\n<Container className=\"p-6\">\n <View className=\"py-4 mb-6\">\n <Text className=\"text-4xl font-bold text-foreground mb-2\">\n BETTER T STACK\n </Text>\n </View>\n\n {session?.user ? (\n <Card variant=\"secondary\" className=\"mb-6 p-4\">\n <Text className=\"text-foreground text-base mb-2\">\n Welcome, <Text className=\"font-medium\">{session.user.name}</Text>\n </Text>\n <Text className=\"text-muted text-sm mb-4\">\n {session.user.email}\n </Text>\n <Pressable className=\"bg-danger py-3 px-4 rounded-lg self-start active:opacity-70\" onPress={()=> {\n authClient.signOut();\n {{#if (eq api \"orpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n }}\n >\n <Text className=\"text-foreground font-medium\">Sign Out</Text>\n </Pressable>\n </Card>\n ) : null}\n\n {{#unless (eq api \"none\")}}\n <Card variant=\"secondary\" className=\"p-6\">\n <View className=\"flex-row items-center justify-between mb-4\">\n <Card.Title>System Status</Card.Title>\n <Chip variant=\"secondary\" color={isConnected ? \"success\" : \"danger\" } size=\"sm\">\n <Chip.Label>{isConnected ? \"LIVE\" : \"OFFLINE\"}</Chip.Label>\n </Chip>\n </View>\n\n <Card className=\"p-4\">\n <View className=\"flex-row items-center\">\n <View className={\\`w-3 h-3 rounded-full mr-3 \\${isConnected ? \"bg-success\" : \"bg-muted\" }\\`} />\n <View className=\"flex-1\">\n <Text className=\"text-foreground font-medium mb-1\">\n {{#if (eq api \"orpc\")}}ORPC{{else}}TRPC{{/if}} Backend\n </Text>\n <Card.Description>\n {isLoading\n ? \"Checking connection...\"\n : isConnected\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Card.Description>\n </View>\n {isLoading && (\n <Ionicons name=\"hourglass-outline\" size={20} color={mutedColor} />\n )}\n {!isLoading && isConnected && (\n <Ionicons name=\"checkmark-circle\" size={20} color={successColor} />\n )}\n {!isLoading && !isConnected && (\n <Ionicons name=\"close-circle\" size={20} color={dangerColor} />\n )}\n </View>\n </Card>\n </Card>\n\n <Card variant=\"secondary\" className=\"mt-6 p-4\">\n <Card.Title className=\"mb-3\">Private Data</Card.Title>\n {privateData && (\n <Card.Description>\n {privateData.data?.message}\n </Card.Description>\n )}\n </Card>\n {{/unless}}\n\n {!session?.user && (\n <>\n <SignIn />\n <SignUp />\n </>\n )}\n</Container>\n);\n}`],\n [\"auth/better-auth/native/unistyles/app/(drawer)/index.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { ScrollView, Text, TouchableOpacity, View } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nimport { Container } from \"@/components/container\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, trpc } from \"@/utils/trpc\";\n{{/if}}\n\nexport default function Home() {\n {{#if (eq api \"orpc\")}}\n const healthCheck = useQuery(orpc.healthCheck.queryOptions());\n const privateData = useQuery(orpc.privateData.queryOptions());\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const healthCheck = useQuery(trpc.healthCheck.queryOptions());\n const privateData = useQuery(trpc.privateData.queryOptions());\n {{/if}}\n const { data: session } = authClient.useSession();\n\n return (\n <Container>\n <ScrollView>\n <View style={styles.pageContainer}>\n <Text style={styles.headerTitle}>BETTER T STACK</Text>\n {session?.user ? (\n <View style={styles.sessionInfoCard}>\n <View style={styles.sessionUserRow}>\n <Text style={styles.welcomeText}>\n Welcome,{\" \"}\n <Text style={styles.userNameText}>{session.user.name}</Text>\n </Text>\n </View>\n <Text style={styles.emailText}>{session.user.email}</Text>\n\n <TouchableOpacity\n style={styles.signOutButton}\n onPress={() => {\n authClient.signOut();\n {{#if (eq api \"orpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n }}\n >\n <Text style={styles.signOutButtonText}>Sign Out</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n {{#unless (eq api \"none\")}}\n <View style={styles.apiStatusCard}>\n <Text style={styles.cardTitle}>API Status</Text>\n <View style={styles.apiStatusRow}>\n <View\n style={[\n styles.statusIndicatorDot,\n healthCheck.data\n ? styles.statusIndicatorGreen\n : styles.statusIndicatorRed,\n ]}\n />\n <Text style={styles.mutedText}>\n {healthCheck.isLoading\n ? \"Checking...\"\n : healthCheck.data\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n <View style={styles.privateDataCard}>\n <Text style={styles.cardTitle}>Private Data</Text>\n {privateData && (\n <View>\n <Text style={styles.mutedText}>\n {privateData.data?.message}\n </Text>\n </View>\n )}\n </View>\n {{/unless}}\n {!session?.user && (\n <>\n <SignIn />\n <SignUp />\n </>\n )}\n </View>\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n pageContainer: {\n paddingHorizontal: 8,\n },\n headerTitle: {\n color: theme?.colors?.typography,\n fontSize: 30,\n fontWeight: \"bold\",\n marginBottom: 16,\n },\n sessionInfoCard: {\n marginBottom: 24,\n padding: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme?.colors?.border,\n },\n sessionUserRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 8,\n },\n welcomeText: {\n color: theme?.colors?.typography,\n fontSize: 16,\n },\n userNameText: {\n fontWeight: \"500\",\n color: theme?.colors?.typography,\n },\n emailText: {\n color: theme?.colors?.typography,\n fontSize: 14,\n marginBottom: 16,\n },\n signOutButton: {\n backgroundColor: theme?.colors?.destructive,\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n alignSelf: \"flex-start\",\n },\n signOutButtonText: {\n fontWeight: \"500\",\n },\n apiStatusCard: {\n marginBottom: 24,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme?.colors?.border,\n padding: 16,\n },\n cardTitle: {\n marginBottom: 12,\n fontWeight: \"500\",\n color: theme?.colors?.typography,\n },\n apiStatusRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n },\n statusIndicatorDot: {\n height: 12,\n width: 12,\n borderRadius: 9999,\n },\n statusIndicatorGreen: {\n backgroundColor: theme.colors.success,\n },\n statusIndicatorRed: {\n backgroundColor: theme.colors.destructive,\n },\n mutedText: {\n color: theme?.colors?.typography,\n },\n privateDataCard: {\n marginBottom: 24,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme?.colors?.border,\n padding: 16,\n },\n}));\n`],\n [\"auth/better-auth/web/nuxt/app/middleware/auth.ts.hbs\", `export default defineNuxtRouteMiddleware(async (to, from) => {\n if (import.meta.server) return;\n\n const { $authClient } = useNuxtApp();\n const session = $authClient.useSession();\n\n if (session.value.isPending) {\n return;\n }\n\n if (!session.value.data) {\n return navigateTo(\"/login\");\n }\n});\n`],\n [\"auth/better-auth/web/nuxt/app/plugins/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/vue\";\n{{#if (eq payments \"polar\")}}\nimport { polarClient } from \"@polar-sh/better-auth\";\n{{/if}}\n\nexport default defineNuxtPlugin(() => {\n const config = useRuntimeConfig();\n\n const authClient = createAuthClient({\n baseURL: config.public.serverUrl,\n {{#if (eq payments \"polar\")}}\n plugins: [polarClient()],\n {{/if}}\n });\n\n return {\n provide: {\n authClient: authClient,\n },\n };\n});\n`],\n [\"auth/better-auth/web/nuxt/app/components/SignUpForm.vue.hbs\", `<script setup lang=\"ts\">\nimport * as z from 'zod'\nimport type { FormSubmitEvent, AuthFormField } from '@nuxt/ui'\n\nconst { $authClient } = useNuxtApp()\n\nconst emit = defineEmits(['switchToSignIn'])\n\nconst toast = useToast()\nconst loading = ref(false)\n\nconst fields: AuthFormField[] = [\n {\n name: 'name',\n type: 'text',\n label: 'Name',\n placeholder: 'Enter your name',\n required: true\n },\n {\n name: 'email',\n type: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n required: true\n },\n {\n name: 'password',\n type: 'password',\n label: 'Password',\n placeholder: 'Enter your password',\n required: true\n }\n]\n\nconst schema = z.object({\n name: z.string().min(2, 'Name must be at least 2 characters'),\n email: z.email('Invalid email address'),\n password: z.string().min(8, 'Password must be at least 8 characters'),\n})\n\ntype Schema = z.output<typeof schema>\n\nasync function onSubmit(event: FormSubmitEvent<Schema>) {\n loading.value = true\n try {\n await $authClient.signUp.email(\n {\n name: event.data.name,\n email: event.data.email,\n password: event.data.password,\n },\n {\n onSuccess: () => {\n toast.add({ title: 'Sign up successful' })\n navigateTo('/dashboard', { replace: true })\n },\n onError: (error) => {\n toast.add({ title: 'Sign up failed', description: error.error.message })\n },\n },\n )\n } catch (error: any) {\n toast.add({ title: 'An unexpected error occurred', description: error.message || 'Please try again.' })\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col items-center justify-center gap-4 p-4\">\n <UPageCard class=\"w-full max-w-md\">\n <UAuthForm\n :schema=\"schema\"\n :fields=\"fields\"\n title=\"Create Account\"\n icon=\"i-lucide-user-plus\"\n :submit=\"{ label: 'Sign Up', loading }\"\n @submit=\"onSubmit\"\n >\n <template #description>\n Already have an account?\n <ULink class=\"text-primary font-medium\" @click=\"$emit('switchToSignIn')\">\n Sign In\n </ULink>\n </template>\n </UAuthForm>\n </UPageCard>\n </div>\n</template>\n`],\n [\"auth/better-auth/web/nuxt/app/components/UserMenu.vue.hbs\", `<script setup lang=\"ts\">\n\nconst {$authClient} = useNuxtApp()\nconst session = $authClient.useSession()\nconst toast = useToast()\n\nconst handleSignOut = async () => {\n try {\n await $authClient.signOut({\n fetchOptions: {\n onSuccess: async () => {\n toast.add({ title: 'Signed out successfully' })\n await navigateTo('/', { replace: true, external: true })\n },\n onError: (error) => {\n toast.add({ title: 'Sign out failed', description: error?.error?.message || 'Unknown error'})\n }\n },\n })\n } catch (error: any) {\n toast.add({ title: 'An unexpected error occurred during sign out', description: error.message || 'Please try again.'})\n }\n}\n</script>\n\n<template>\n <div>\n <USkeleton v-if=\"session.isPending\" class=\"h-9 w-24\" />\n\n <UButton v-else-if=\"!session.data\" variant=\"outline\" to=\"/login\">\n Sign In\n </UButton>\n\n <UButton\n v-else\n variant=\"solid\"\n icon=\"i-lucide-log-out\"\n label=\"Sign out\"\n @click=\"handleSignOut()\"\n />\n </div>\n</template>\n`],\n [\"auth/better-auth/web/nuxt/app/components/SignInForm.vue.hbs\", `<script setup lang=\"ts\">\nimport * as z from 'zod'\nimport type { FormSubmitEvent, AuthFormField } from '@nuxt/ui'\n\nconst { $authClient } = useNuxtApp()\n\nconst emit = defineEmits(['switchToSignUp'])\n\nconst toast = useToast()\nconst loading = ref(false)\n\nconst fields: AuthFormField[] = [\n {\n name: 'email',\n type: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n required: true\n },\n {\n name: 'password',\n type: 'password',\n label: 'Password',\n placeholder: 'Enter your password',\n required: true\n }\n]\n\nconst schema = z.object({\n email: z.email('Invalid email address'),\n password: z.string().min(8, 'Password must be at least 8 characters'),\n})\n\ntype Schema = z.output<typeof schema>\n\nasync function onSubmit(event: FormSubmitEvent<Schema>) {\n loading.value = true\n try {\n await $authClient.signIn.email(\n {\n email: event.data.email,\n password: event.data.password,\n },\n {\n onSuccess: () => {\n toast.add({ title: 'Sign in successful' })\n navigateTo('/dashboard', { replace: true })\n },\n onError: (error) => {\n toast.add({ title: 'Sign in failed', description: error.error.message })\n },\n },\n )\n } catch (error: any) {\n toast.add({ title: 'An unexpected error occurred', description: error.message || 'Please try again.' })\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col items-center justify-center gap-4 p-4\">\n <UPageCard class=\"w-full max-w-md\">\n <UAuthForm\n :schema=\"schema\"\n :fields=\"fields\"\n title=\"Welcome Back\"\n icon=\"i-lucide-log-in\"\n :submit=\"{ label: 'Sign In', loading }\"\n @submit=\"onSubmit\"\n >\n <template #description>\n Need an account?\n <ULink class=\"text-primary font-medium\" @click=\"$emit('switchToSignUp')\">\n Sign Up\n </ULink>\n </template>\n </UAuthForm>\n </UPageCard>\n </div>\n</template>\n`],\n [\"auth/better-auth/web/nuxt/app/pages/dashboard.vue.hbs\", `<script setup lang=\"ts\">\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from '@tanstack/vue-query'\n{{/if}}\n\nconst { $authClient, $orpc } = useNuxtApp()\n\ndefinePageMeta({\n middleware: ['auth']\n})\n\nconst session = $authClient.useSession()\n\n{{#if (eq payments \"polar\")}}\nconst customerState = ref<any>(null)\n{{/if}}\n\n{{#if (eq api \"orpc\")}}\nconst privateData = useQuery({\n ...$orpc.privateData.queryOptions(),\n enabled: computed(() => !!session.value?.data?.user)\n})\n{{/if}}\n\n{{#if (eq payments \"polar\")}}\nonMounted(async () => {\n if (session.value?.data) {\n const { data } = await $authClient.customer.state()\n customerState.value = data\n }\n})\n\nconst hasProSubscription = computed(() => \n customerState.value?.activeSubscriptions?.length! > 0\n)\n{{/if}}\n</script>\n\n<template>\n <UContainer class=\"py-8\">\n <UPageHeader\n title=\"Dashboard\"\n :description=\"session?.data?.user ? \\`Welcome back, \\${session.data.user.name}!\\` : 'Loading...'\"\n />\n\n <div class=\"mt-6 space-y-4\">\n {{#if (eq api \"orpc\")}}\n <UCard>\n <template #header>\n <div class=\"font-medium\">Private Data</div>\n </template>\n\n <USkeleton v-if=\"privateData.status.value === 'pending'\" class=\"h-6 w-48\" />\n\n <UAlert\n v-else-if=\"privateData.status.value === 'error'\"\n color=\"error\"\n icon=\"i-lucide-alert-circle\"\n title=\"Error loading data\"\n :description=\"privateData.error.value?.message || 'Failed to load private data'\"\n />\n\n <div v-else-if=\"privateData.data.value\" class=\"flex items-center gap-2\">\n <UIcon name=\"i-lucide-check-circle\" class=\"text-success\" />\n <span>\\\\{{ privateData.data.value.message }}</span>\n </div>\n </UCard>\n {{/if}}\n\n {{#if (eq payments \"polar\")}}\n <UCard>\n <template #header>\n <div class=\"font-medium\">Subscription</div>\n </template>\n\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-2\">\n <UIcon :name=\"hasProSubscription ? 'i-lucide-crown' : 'i-lucide-user'\" :class=\"hasProSubscription ? 'text-warning' : 'text-muted'\" />\n <span>Plan: \\\\{{ hasProSubscription ? \"Pro\" : \"Free\" }}</span>\n </div>\n <UButton \n v-if=\"hasProSubscription\"\n variant=\"outline\"\n @click=\"() => { $authClient.customer.portal() }\"\n >\n Manage Subscription\n </UButton>\n <UButton \n v-else\n @click=\"() => { $authClient.checkout({ slug: 'pro' }) }\"\n >\n Upgrade to Pro\n </UButton>\n </div>\n </UCard>\n {{/if}}\n </div>\n </UContainer>\n</template>\n`],\n [\"auth/better-auth/web/nuxt/app/pages/login.vue.hbs\", `<script setup lang=\"ts\">\nconst { $authClient } = useNuxtApp();\nimport SignInForm from \"~/components/SignInForm.vue\";\nimport SignUpForm from \"~/components/SignUpForm.vue\";\n\nconst session = $authClient.useSession();\nconst showSignIn = ref(true);\n\nwatchEffect(() => {\n if (!session?.value.isPending && session?.value.data) {\n navigateTo(\"/dashboard\", { replace: true });\n }\n});\n</script>\n\n<template>\n <UContainer class=\"py-8\">\n <div v-if=\"session.isPending\" class=\"flex flex-col items-center justify-center gap-4 py-12\">\n <UIcon name=\"i-lucide-loader-2\" class=\"animate-spin text-4xl text-primary\" />\n <span class=\"text-muted\">Loading...</span>\n </div>\n <div v-else-if=\"!session.data\">\n <SignInForm v-if=\"showSignIn\" @switch-to-sign-up=\"showSignIn = false\" />\n <SignUpForm v-else @switch-to-sign-in=\"showSignIn = true\" />\n </div>\n </UContainer>\n</template>\n`],\n [\"payments/polar/web/nuxt/app/pages/success.vue.hbs\", `<script setup lang=\"ts\">\nconst route = useRoute()\nconst checkout_id = route.query.checkout_id as string\n</script>\n\n<template>\n <div class=\"container mx-auto px-4 py-8\">\n <h1 class=\"text-2xl font-bold mb-4\">Payment Successful!</h1>\n <p v-if=\"checkout_id\">Checkout ID: \\\\{{ checkout_id }}</p>\n </div>\n</template>\n`],\n [\"auth/better-auth/web/svelte/src/lib/auth-client.ts.hbs\", `import { PUBLIC_SERVER_URL } from \"$env/static/public\";\nimport { createAuthClient } from \"better-auth/svelte\";\n{{#if (eq payments \"polar\")}}\nimport { polarClient } from \"@polar-sh/better-auth\";\n{{/if}}\n\nexport const authClient = createAuthClient({\n\tbaseURL: PUBLIC_SERVER_URL,\n{{#if (eq payments \"polar\")}}\n\tplugins: [polarClient()]\n{{/if}}\n});\n`],\n [\"auth/better-auth/web/svelte/src/components/UserMenu.svelte.hbs\", `<script lang=\"ts\">\n\timport { authClient } from '$lib/auth-client';\n\timport { goto } from '$app/navigation';\n\n\tconst sessionQuery = authClient.useSession();\n\n\tasync function handleSignOut() {\n\t\tawait authClient.signOut({\n\t\tfetchOptions: {\n\t\t\tonSuccess: () => {\n\t\t\t\tgoto('/');\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error('Sign out failed:', error);\n\t\t\t}\n\t\t}\n\t\t});\n\t}\n\n\tfunction goToLogin() {\n\t\tgoto('/login');\n\t}\n\n</script>\n\n<div class=\"relative\">\n\t{#if $sessionQuery.isPending}\n\t\t<div class=\"h-8 w-24 animate-pulse rounded bg-neutral-700\"></div>\n\t{:else if $sessionQuery.data?.user}\n\t\t{@const user = $sessionQuery.data.user}\n\t\t<div class=\"flex items-center gap-3\">\n\t\t\t<span class=\"text-sm text-neutral-300 hidden sm:inline\" title={user.email}>\n\t\t\t\t{user.name || user.email?.split('@')[0] || 'User'}\n\t\t\t</span>\n\t\t\t<button\n\t\t\t\tonclick={handleSignOut}\n\t\t\t\tclass=\"rounded px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white transition-colors\"\n\t\t\t>\n\t\t\t\tSign Out\n\t\t\t</button>\n\t\t</div>\n\t{:else}\n\t\t<div class=\"flex items-center gap-2\">\n\t\t\t<button\n\t\t\t\tonclick={goToLogin}\n\t\t\t\tclass=\"rounded px-3 py-1 text-sm bg-indigo-600 hover:bg-indigo-700 text-white transition-colors\"\n\t\t\t>\n\t\t\t\tSign In\n\t\t\t</button>\n\t\t</div>\n\t{/if}\n</div>\n`],\n [\"auth/better-auth/web/svelte/src/components/SignInForm.svelte.hbs\", `<script lang=\"ts\">\n\timport { createForm } from '@tanstack/svelte-form';\n\timport { z } from 'zod';\n\timport { authClient } from '$lib/auth-client';\n\timport { goto } from '$app/navigation';\n\n\tlet { switchToSignUp } = $props<{ switchToSignUp: () => void }>();\n\n\tconst validationSchema = z.object({\n\t\temail: z.email('Invalid email address'),\n\t\tpassword: z.string().min(1, 'Password is required'),\n\t});\n\n\tconst form = createForm(() => ({\n\t\tdefaultValues: { email: '', password: '' },\n\t\tonSubmit: async ({ value }) => {\n\t\t\t\tawait authClient.signIn.email(\n\t\t\t\t\t{ email: value.email, password: value.password },\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => goto('/dashboard'),\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconsole.log(error.error.message || 'Sign in failed. Please try again.');\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t},\n\t\tvalidators: {\n\t\t\tonSubmit: validationSchema,\n\t\t},\n\t}));\n</script>\n\n<div class=\"mx-auto mt-10 w-full max-w-md p-6\">\n\t<h1 class=\"mb-6 text-center font-bold text-3xl\">Welcome Back</h1>\n\n\t<form\n\t\tclass=\"space-y-4\"\n\t\tonsubmit={(e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tform.handleSubmit();\n\t\t}}\n\t>\n\t\t<form.Field name=\"email\">\n\t\t\t{#snippet children(field)}\n\t\t\t\t<div class=\"space-y-1\">\n\t\t\t\t\t<label for={field.name}>Email</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\tclass=\"w-full border\"\n\t\t\t\t\t\tonblur={field.handleBlur}\n\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\toninput={(e: Event) => {\n\t\t\t\t\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\t\t\t\t\tfield.handleChange(target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if field.state.meta.isTouched}\n\t\t\t\t\t\t{#each field.state.meta.errors as error}\n\t\t\t\t\t\t\t<p class=\"text-sm text-red-500\" role=\"alert\">{error}</p>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/snippet}\n\t\t</form.Field>\n\n\t\t<form.Field name=\"password\">\n\t\t\t{#snippet children(field)}\n\t\t\t\t<div class=\"space-y-1\">\n\t\t\t\t\t<label for={field.name}>Password</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tclass=\"w-full border\"\n\t\t\t\t\t\tonblur={field.handleBlur}\n\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\toninput={(e: Event) => {\n\t\t\t\t\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\t\t\t\t\tfield.handleChange(target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if field.state.meta.isTouched}\n\t\t\t\t\t\t{#each field.state.meta.errors as error}\n\t\t\t\t\t\t\t<p class=\"text-sm text-red-500\" role=\"alert\">{error}</p>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/snippet}\n\t\t</form.Field>\n\n\t\t<form.Subscribe selector={(state) => ({ canSubmit: state.canSubmit, isSubmitting: state.isSubmitting })}>\n\t\t\t{#snippet children(state)}\n\t\t\t\t<button type=\"submit\" class=\"w-full\" disabled={!state.canSubmit || state.isSubmitting}>\n\t\t\t\t\t{state.isSubmitting ? 'Submitting...' : 'Sign In'}\n\t\t\t\t</button>\n\t\t\t{/snippet}\n\t\t</form.Subscribe>\n\t</form>\n\n\t<div class=\"mt-4 text-center\">\n\t\t<button type=\"button\" class=\"text-indigo-600 hover:text-indigo-800\" onclick={switchToSignUp}>\n\t\t\tNeed an account? Sign Up\n\t\t</button>\n\t</div>\n</div>\n`],\n [\"auth/better-auth/web/svelte/src/components/SignUpForm.svelte.hbs\", `<script lang=\"ts\">\n\timport { createForm } from '@tanstack/svelte-form';\n\timport { z } from 'zod';\n\timport { authClient } from '$lib/auth-client';\n\timport { goto } from '$app/navigation';\n\n\tlet { switchToSignIn } = $props<{ switchToSignIn: () => void }>();\n\n\tconst validationSchema = z.object({\n\t\tname: z.string().min(2, 'Name must be at least 2 characters'),\n\t\temail: z.email('Invalid email address'),\n\t\tpassword: z.string().min(8, 'Password must be at least 8 characters'),\n\t});\n\n\n\tconst form = createForm(() => ({\n\t\tdefaultValues: { name: '', email: '', password: '' },\n\t\tonSubmit: async ({ value }) => {\n\t\t\t\tawait authClient.signUp.email(\n\t\t\t\t\t{\n\t\t\t\t\t\temail: value.email,\n\t\t\t\t\t\tpassword: value.password,\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\tgoto('/dashboard');\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconsole.log(error.error.message || 'Sign up failed. Please try again.');\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t},\n\t\tvalidators: {\n\t\t\tonSubmit: validationSchema,\n\t\t},\n\t}));\n</script>\n\n<div class=\"mx-auto mt-10 w-full max-w-md p-6\">\n\t<h1 class=\"mb-6 text-center font-bold text-3xl\">Create Account</h1>\n\n\t<form\n\t\tid=\"form\"\n\t\tclass=\"space-y-4\"\n\t\tonsubmit={(e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tform.handleSubmit();\n\t\t}}\n\t>\n\t\t<form.Field name=\"name\">\n\t\t\t{#snippet children(field)}\n\t\t\t\t<div class=\"space-y-1\">\n\t\t\t\t\t<label for={field.name}>Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\tclass=\"w-full border\"\n\t\t\t\t\t\tonblur={field.handleBlur}\n\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\toninput={(e: Event) => {\n\t\t\t\t\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\t\t\t\t\tfield.handleChange(target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if field.state.meta.isTouched}\n\t\t\t\t\t\t{#each field.state.meta.errors as error}\n\t\t\t\t\t\t\t<p class=\"text-sm text-red-500\" role=\"alert\">{error}</p>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/snippet}\n\t\t</form.Field>\n\n\t\t<form.Field name=\"email\">\n\t\t\t{#snippet children(field)}\n\t\t\t\t<div class=\"space-y-1\">\n\t\t\t\t\t<label for={field.name}>Email</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\tclass=\"w-full border\"\n\t\t\t\t\t\tonblur={field.handleBlur}\n\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\toninput={(e: Event) => {\n\t\t\t\t\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\t\t\t\t\tfield.handleChange(target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if field.state.meta.isTouched}\n\t\t\t\t\t\t{#each field.state.meta.errors as error}\n\t\t\t\t\t\t\t<p class=\"text-sm text-red-500\" role=\"alert\">{error}</p>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/snippet}\n\t\t</form.Field>\n\n\t\t<form.Field name=\"password\">\n\t\t\t{#snippet children(field)}\n\t\t\t\t<div class=\"space-y-1\">\n\t\t\t\t\t<label for={field.name}>Password</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tclass=\"w-full border\"\n\t\t\t\t\t\tonblur={field.handleBlur}\n\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\toninput={(e: Event) => {\n\t\t\t\t\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\t\t\t\t\tfield.handleChange(target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{#if field.state.meta.isTouched}\n\t\t\t\t\t\t{#each field.state.meta.errors as error}\n\t\t\t\t\t\t\t<p class=\"text-sm text-red-500\" role=\"alert\">{error}</p>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t{/snippet}\n\t\t</form.Field>\n\n\t\t<form.Subscribe selector={(state) => ({ canSubmit: state.canSubmit, isSubmitting: state.isSubmitting })}>\n\t\t\t{#snippet children(state)}\n\t\t\t\t<button type=\"submit\" class=\"w-full\" disabled={!state.canSubmit || state.isSubmitting}>\n\t\t\t\t\t{state.isSubmitting ? 'Submitting...' : 'Sign Up'}\n\t\t\t\t</button>\n\t\t\t{/snippet}\n\t\t</form.Subscribe>\n\t</form>\n\n\t<div class=\"mt-4 text-center\">\n\t\t<button type=\"button\" class=\"text-indigo-600 hover:text-indigo-800\" onclick={switchToSignIn}>\n\t\t\tAlready have an account? Sign In\n\t\t</button>\n\t</div>\n</div>\n`],\n [\"payments/polar/web/solid/src/routes/success.tsx.hbs\", `import { createFileRoute } from \"@tanstack/solid-router\";\nimport { Show } from \"solid-js\";\n\nexport const Route = createFileRoute(\"/success\")({\n\tcomponent: SuccessPage,\n\tvalidateSearch: (search) => ({\n\t\tcheckout_id: search.checkout_id as string,\n\t}),\n});\n\nfunction SuccessPage() {\n\tconst searchParams = Route.useSearch();\n\tconst checkout_id = searchParams().checkout_id;\n\n\treturn (\n\t\t<div class=\"container mx-auto px-4 py-8\">\n\t\t\t<h1>Payment Successful!</h1>\n\t\t\t<Show when={checkout_id}>\n\t\t\t\t<p>Checkout ID: {checkout_id}</p>\n\t\t\t</Show>\n\t\t</div>\n\t);\n}\n`],\n [\"addons/pwa/apps/web/vite/public/logo.png\", `[Binary file]`],\n [\"auth/better-auth/convex/native/bare/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n StyleSheet,\n} from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nfunction SignIn() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function handleLogin() {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email,\n password,\n },\n {\n onError(error) {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess() {\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished() {\n setIsLoading(false);\n },\n }\n );\n }\n\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.title, { color: theme.text }]}>Sign In</Text>\n\n {error ? (\n <View style={[styles.errorContainer, { backgroundColor: theme.notification + \"20\" }]}>\n <Text style={[styles.errorText, { color: theme.notification }]}>{error}</Text>\n </View>\n ) : null}\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Email\"\n placeholderTextColor={theme.text}\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Password\"\n placeholderTextColor={theme.text}\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleLogin}\n disabled={isLoading}\n style={[styles.button, { backgroundColor: theme.primary, opacity: isLoading ? 0.5 : 1 }]}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Text style={styles.buttonText}>Sign In</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n marginTop: 16,\n padding: 16,\n borderWidth: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: \"bold\",\n marginBottom: 12,\n },\n errorContainer: {\n marginBottom: 12,\n padding: 8,\n },\n errorText: {\n fontSize: 14,\n },\n input: {\n borderWidth: 1,\n padding: 12,\n fontSize: 16,\n marginBottom: 12,\n },\n button: {\n padding: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n buttonText: {\n color: \"#ffffff\",\n fontSize: 16,\n },\n});\n\nexport { SignIn };\n\n`],\n [\"auth/better-auth/convex/native/bare/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n StyleSheet,\n} from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nfunction SignUp() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function handleSignUp() {\n setIsLoading(true);\n setError(null);\n\n await authClient.signUp.email(\n {\n name,\n email,\n password,\n },\n {\n onError(error) {\n setError(error.error?.message || \"Failed to sign up\");\n setIsLoading(false);\n },\n onSuccess() {\n setName(\"\");\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished() {\n setIsLoading(false);\n },\n }\n );\n }\n\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.title, { color: theme.text }]}>Create Account</Text>\n\n {error ? (\n <View style={[styles.errorContainer, { backgroundColor: theme.notification + \"20\" }]}>\n <Text style={[styles.errorText, { color: theme.notification }]}>{error}</Text>\n </View>\n ) : null}\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Name\"\n placeholderTextColor={theme.text}\n value={name}\n onChangeText={setName}\n />\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Email\"\n placeholderTextColor={theme.text}\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={[styles.input, { color: theme.text, borderColor: theme.border, backgroundColor: theme.background }]}\n placeholder=\"Password\"\n placeholderTextColor={theme.text}\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n disabled={isLoading}\n style={[styles.button, { backgroundColor: theme.primary, opacity: isLoading ? 0.5 : 1 }]}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Text style={styles.buttonText}>Sign Up</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n marginTop: 16,\n padding: 16,\n borderWidth: 1,\n },\n title: {\n fontSize: 18,\n fontWeight: \"bold\",\n marginBottom: 12,\n },\n errorContainer: {\n marginBottom: 12,\n padding: 8,\n },\n errorText: {\n fontSize: 14,\n },\n input: {\n borderWidth: 1,\n padding: 12,\n fontSize: 16,\n marginBottom: 12,\n },\n button: {\n padding: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n buttonText: {\n color: \"#ffffff\",\n fontSize: 16,\n },\n});\n\nexport { SignUp };\n\n`],\n [\"auth/better-auth/convex/native/base/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/react\";\nimport { convexClient } from \"@convex-dev/better-auth/client/plugins\";\nimport { expoClient } from \"@better-auth/expo/client\";\nimport Constants from \"expo-constants\";\nimport * as SecureStore from \"expo-secure-store\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nexport const authClient = createAuthClient({\n\tbaseURL: env.EXPO_PUBLIC_CONVEX_SITE_URL,\n\tplugins: [\n\t\texpoClient({\n\t\t\tscheme: Constants.expoConfig?.scheme as string,\n\t\t\tstoragePrefix: Constants.expoConfig?.scheme as string,\n\t\t\tstorage: SecureStore,\n\t\t}),\n\t\tconvexClient(),\n\t],\n});\n`],\n [\"auth/better-auth/convex/native/unistyles/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport function SignIn() {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleLogin = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>Sign In</Text>\n\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n )}\n\n <TextInput\n style={styles.input}\n placeholder=\"Email\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={styles.input}\n placeholder=\"Password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleLogin}\n disabled={isLoading}\n style={styles.button}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#fff\" />\n ) : (\n <Text style={styles.buttonText}>Sign In</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n marginTop: 24,\n padding: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n color: theme.colors.typography,\n marginBottom: 16,\n },\n errorContainer: {\n marginBottom: 16,\n padding: 12,\n borderRadius: 6,\n },\n errorText: {\n color: theme.colors.destructive,\n fontSize: 14,\n },\n input: {\n marginBottom: 12,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n button: {\n backgroundColor: theme.colors.primary,\n padding: 16,\n borderRadius: 6,\n flexDirection: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n buttonText: {\n fontWeight: \"500\",\n },\n}));\n`],\n [\"auth/better-auth/convex/native/unistyles/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport {\n ActivityIndicator,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n} from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport function SignUp() {\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSignUp = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signUp.email(\n {\n name,\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign up\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setName(\"\");\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>Create Account</Text>\n\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n )}\n\n <TextInput\n style={styles.input}\n placeholder=\"Name\"\n value={name}\n onChangeText={setName}\n />\n\n <TextInput\n style={styles.input}\n placeholder=\"Email\"\n value={email}\n onChangeText={setEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n\n <TextInput\n style={styles.inputLast}\n placeholder=\"Password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n disabled={isLoading}\n style={styles.button}\n >\n {isLoading ? (\n <ActivityIndicator size=\"small\" color=\"#fff\" />\n ) : (\n <Text style={styles.buttonText}>Sign Up</Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n marginTop: 24,\n padding: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n color: theme.colors.typography,\n marginBottom: 16,\n },\n errorContainer: {\n marginBottom: 16,\n padding: 12,\n borderRadius: 6,\n },\n errorText: {\n color: theme.colors.destructive,\n fontSize: 14,\n },\n input: {\n marginBottom: 12,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n inputLast: {\n marginBottom: 16,\n padding: 16,\n borderRadius: 6,\n color: theme.colors.typography,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n button: {\n backgroundColor: theme.colors.primary,\n padding: 16,\n borderRadius: 6,\n flexDirection: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n buttonText: {\n fontWeight: \"500\",\n },\n}));\n`],\n [\"auth/better-auth/convex/native/uniwind/components/sign-in.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport { Text, View } from \"react-native\";\nimport { Button, ErrorView, Spinner, Surface, TextField } from \"heroui-native\";\n\nexport function SignIn() {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleLogin = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signIn.email(\n {\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign in\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <Text className=\"text-foreground font-medium mb-4\">Sign In</Text>\n\n <ErrorView isInvalid={!!error} className=\"mb-3\">\n {error}\n </ErrorView>\n\n <View className=\"gap-3\">\n <TextField>\n <TextField.Label>Email</TextField.Label>\n <TextField.Input\n value={email}\n onChangeText={setEmail}\n placeholder=\"email@example.com\"\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n </TextField>\n\n <TextField>\n <TextField.Label>Password</TextField.Label>\n <TextField.Input\n value={password}\n onChangeText={setPassword}\n placeholder=\"••••••••\"\n secureTextEntry\n />\n </TextField>\n\n <Button onPress={handleLogin} isDisabled={isLoading} className=\"mt-1\">\n {isLoading ? <Spinner size=\"sm\" color=\"default\" /> : <Button.Label>Sign In</Button.Label>}\n </Button>\n </View>\n </Surface>\n );\n}\n`],\n [\"auth/better-auth/convex/native/uniwind/components/sign-up.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useState } from \"react\";\nimport { Text, View } from \"react-native\";\nimport { Button, ErrorView, Spinner, Surface, TextField } from \"heroui-native\";\n\nexport function SignUp() {\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSignUp = async () => {\n setIsLoading(true);\n setError(null);\n\n await authClient.signUp.email(\n {\n name,\n email,\n password,\n },\n {\n onError: (error) => {\n setError(error.error?.message || \"Failed to sign up\");\n setIsLoading(false);\n },\n onSuccess: () => {\n setName(\"\");\n setEmail(\"\");\n setPassword(\"\");\n },\n onFinished: () => {\n setIsLoading(false);\n },\n },\n );\n };\n\n return (\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <Text className=\"text-foreground font-medium mb-4\">Create Account</Text>\n\n <ErrorView isInvalid={!!error} className=\"mb-3\">\n {error}\n </ErrorView>\n\n <View className=\"gap-3\">\n <TextField>\n <TextField.Label>Name</TextField.Label>\n <TextField.Input value={name} onChangeText={setName} placeholder=\"John Doe\" />\n </TextField>\n\n <TextField>\n <TextField.Label>Email</TextField.Label>\n <TextField.Input\n value={email}\n onChangeText={setEmail}\n placeholder=\"email@example.com\"\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n />\n </TextField>\n\n <TextField>\n <TextField.Label>Password</TextField.Label>\n <TextField.Input\n value={password}\n onChangeText={setPassword}\n placeholder=\"••••••••\"\n secureTextEntry\n />\n </TextField>\n\n <Button onPress={handleSignUp} isDisabled={isLoading} className=\"mt-1\">\n {isLoading ? (\n <Spinner size=\"sm\" color=\"default\" />\n ) : (\n <Button.Label>Create Account</Button.Label>\n )}\n </Button>\n </View>\n </Surface>\n );\n}\n`],\n [\"auth/clerk/convex/native/base/components/sign-out-button.tsx.hbs\", `import { useClerk } from \"@clerk/clerk-expo\";\nimport { useRouter } from \"expo-router\";\nimport { Text, TouchableOpacity } from \"react-native\";\n\nexport const SignOutButton = () => {\n // Use \\`useClerk()\\` to access the \\`signOut()\\` function\n const { signOut } = useClerk();\n const router = useRouter();\n\n const handleSignOut = async () => {\n try {\n await signOut();\n // Redirect to your desired page\n router.replace(\"/\");\n } catch (err) {\n // See https://clerk.com/docs/custom-flows/error-handling\n // for more info on error handling\n console.error(JSON.stringify(err, null, 2));\n }\n };\n\n return (\n <TouchableOpacity onPress={handleSignOut}>\n <Text>Sign out</Text>\n </TouchableOpacity>\n );\n};\n`],\n [\"auth/better-auth/native/bare/app/(drawer)/index.tsx.hbs\", `import { View, Text, ScrollView, TouchableOpacity, StyleSheet } from \"react-native\";\nimport { Container } from \"@/components/container\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { SignIn } from \"@/components/sign-in\";\nimport { SignUp } from \"@/components/sign-up\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { queryClient, trpc } from \"@/utils/trpc\";\n{{/if}}\n\nexport default function Home() {\nconst { colorScheme } = useColorScheme();\nconst theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n{{#if (eq api \"orpc\")}}\nconst healthCheck = useQuery(orpc.healthCheck.queryOptions());\nconst privateData = useQuery(orpc.privateData.queryOptions());\nconst isConnected = healthCheck?.data === \"OK\";\nconst isLoading = healthCheck?.isLoading;\n{{/if}}\n{{#if (eq api \"trpc\")}}\nconst healthCheck = useQuery(trpc.healthCheck.queryOptions());\nconst privateData = useQuery(trpc.privateData.queryOptions());\nconst isConnected = healthCheck?.data === \"OK\";\nconst isLoading = healthCheck?.isLoading;\n{{/if}}\nconst { data: session } = authClient.useSession();\n\nreturn (\n<Container>\n <ScrollView style={styles.scrollView}>\n <View style={styles.content}>\n <Text style={[styles.title, { color: theme.text }]}>\n BETTER T STACK\n </Text>\n\n {session?.user ? (\n <View style={[styles.userCard, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <View style={styles.userHeader}>\n <Text style={[styles.userText, { color: theme.text }]}>\n Welcome, <Text style={styles.userName}>{session.user.name}</Text>\n </Text>\n </View>\n <Text style={[styles.userEmail, { color: theme.text, opacity: 0.7 }]}>\n {session.user.email}\n </Text>\n <TouchableOpacity style={[styles.signOutButton, { backgroundColor: theme.notification }]} onPress={()=> {\n authClient.signOut();\n {{#if (eq api \"orpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n {{#if (eq api \"trpc\")}}\n queryClient.invalidateQueries();\n {{/if}}\n }}\n >\n <Text style={styles.signOutText}>Sign Out</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n\n {{#unless (eq api \"none\")}}\n <View style={[styles.statusCard, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.cardTitle, { color: theme.text }]}>\n System Status\n </Text>\n <View style={styles.statusRow}>\n <View style={[styles.statusIndicator, { backgroundColor: isConnected ? \"#10b981\" : \"#ef4444\" }]} />\n <View style={styles.statusContent}>\n <Text style={[styles.statusTitle, { color: theme.text }]}>\n {{#if (eq api \"orpc\")}}ORPC{{else}}TRPC{{/if}} Backend\n </Text>\n <Text style={[styles.statusText, { color: theme.text, opacity: 0.7 }]}>\n {isLoading\n ? \"Checking connection...\"\n : isConnected\n ? \"Connected to API\"\n : \"API Disconnected\"}\n </Text>\n </View>\n </View>\n </View>\n\n <View style={[styles.privateDataCard, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.cardTitle, { color: theme.text }]}>\n Private Data\n </Text>\n {privateData && (\n <Text style={[styles.privateDataText, { color: theme.text, opacity: 0.7 }]}>\n {privateData.data?.message}\n </Text>\n )}\n </View>\n {{/unless}}\n\n {!session?.user && (\n <>\n <SignIn />\n <SignUp />\n </>\n )}\n </View>\n </ScrollView>\n</Container>\n);\n}\n\nconst styles = StyleSheet.create({\nscrollView: {\nflex: 1,\n},\ncontent: {\npadding: 16,\n},\ntitle: {\nfontSize: 24,\nfontWeight: \"bold\",\nmarginBottom: 16,\n},\nuserCard: {\nmarginBottom: 16,\npadding: 16,\nborderWidth: 1,\n},\nuserHeader: {\nmarginBottom: 8,\n},\nuserText: {\nfontSize: 16,\n},\nuserName: {\nfontWeight: \"bold\",\n},\nuserEmail: {\nfontSize: 14,\nmarginBottom: 12,\n},\nsignOutButton: {\npadding: 12,\n},\nsignOutText: {\ncolor: \"#ffffff\",\n},\nstatusCard: {\nmarginBottom: 16,\npadding: 16,\nborderWidth: 1,\n},\ncardTitle: {\nfontSize: 16,\nfontWeight: \"bold\",\nmarginBottom: 12,\n},\nstatusRow: {\nflexDirection: \"row\",\nalignItems: \"center\",\ngap: 8,\n},\nstatusIndicator: {\nheight: 8,\nwidth: 8,\n},\nstatusContent: {\nflex: 1,\n},\nstatusTitle: {\nfontSize: 14,\nfontWeight: \"bold\",\n},\nstatusText: {\nfontSize: 12,\n},\nprivateDataCard: {\nmarginBottom: 16,\npadding: 16,\nborderWidth: 1,\n},\nprivateDataText: {\nfontSize: 14,\n},\n});`],\n [\"auth/better-auth/web/solid/src/components/user-menu.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useNavigate, Link } from \"@tanstack/solid-router\";\nimport { createSignal, Show } from \"solid-js\";\n\nexport default function UserMenu() {\n const navigate = useNavigate();\n const session = authClient.useSession();\n const [isMenuOpen, setIsMenuOpen] = createSignal(false);\n\n return (\n <div class=\"relative inline-block text-left\">\n <Show when={session().isPending}>\n <div class=\"h-9 w-24 animate-pulse rounded\" />\n </Show>\n\n <Show when={!session().isPending && !session().data}>\n <Link to=\"/login\" class=\"inline-block border rounded px-4 text-sm\">\n Sign In\n </Link>\n </Show>\n\n <Show when={!session().isPending && session().data}>\n <button\n type=\"button\"\n class=\"inline-block border rounded px-4 text-sm\"\n onClick={() => setIsMenuOpen(!isMenuOpen())}\n >\n {session().data?.user.name}\n </button>\n\n <Show when={isMenuOpen()}>\n <div class=\"absolute right-0 mt-2 w-56 rounded p-1 shadow-sm\">\n <div class=\"px-4 text-sm\">{session().data?.user.email}</div>\n <button\n type=\"button\"\n class=\"mt-1 w-full border rounded px-4 text-center text-sm\"\n onClick={() => {\n setIsMenuOpen(false);\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n navigate({ to: \"/\" });\n },\n },\n });\n }}\n >\n Sign Out\n </button>\n </div>\n </Show>\n </Show>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/solid/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { createForm } from \"@tanstack/solid-form\";\nimport { useNavigate } from \"@tanstack/solid-router\";\nimport z from \"zod\";\nimport { For } from \"solid-js\";\n\nexport default function SignUpForm({ onSwitchToSignIn }: { onSwitchToSignIn: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = createForm(() => ({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n console.log(\"Sign up successful\");\n },\n onError: (error) => {\n console.error(error.error.message);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n }));\n\n return (\n <div class=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 class=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n class=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div class=\"space-y-2\">\n <label for={field().name}>Name</label>\n <input\n id={field().name}\n name={field().name}\n value={field().state.value}\n onBlur={field().handleBlur}\n onInput={(e) => field().handleChange(e.currentTarget.value)}\n class=\"w-full rounded border p-2\"\n />\n <For each={field().state.meta.errors}>\n {(error) => <p class=\"text-sm text-red-600\">{error?.message}</p>}\n </For>\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div class=\"space-y-2\">\n <label for={field().name}>Email</label>\n <input\n id={field().name}\n name={field().name}\n type=\"email\"\n value={field().state.value}\n onBlur={field().handleBlur}\n onInput={(e) => field().handleChange(e.currentTarget.value)}\n class=\"w-full rounded border p-2\"\n />\n <For each={field().state.meta.errors}>\n {(error) => <p class=\"text-sm text-red-600\">{error?.message}</p>}\n </For>\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div class=\"space-y-2\">\n <label for={field().name}>Password</label>\n <input\n id={field().name}\n name={field().name}\n type=\"password\"\n value={field().state.value}\n onBlur={field().handleBlur}\n onInput={(e) => field().handleChange(e.currentTarget.value)}\n class=\"w-full rounded border p-2\"\n />\n <For each={field().state.meta.errors}>\n {(error) => <p class=\"text-sm text-red-600\">{error?.message}</p>}\n </For>\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <button\n type=\"submit\"\n class=\"w-full rounded bg-indigo-600 p-2 text-white hover:bg-indigo-700 disabled:opacity-50\"\n disabled={!state().canSubmit || state().isSubmitting}\n >\n {state().isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </button>\n )}\n </form.Subscribe>\n </form>\n\n <div class=\"mt-4 text-center\">\n <button\n type=\"button\"\n onClick={onSwitchToSignIn}\n class=\"text-sm text-indigo-600 hover:text-indigo-800 hover:underline\"\n >\n Already have an account? Sign In\n </button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/solid/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { createForm } from \"@tanstack/solid-form\";\nimport { useNavigate } from \"@tanstack/solid-router\";\nimport z from \"zod\";\nimport { For } from \"solid-js\";\n\nexport default function SignInForm({ onSwitchToSignUp }: { onSwitchToSignUp: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = createForm(() => ({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n console.log(\"Sign in successful\");\n },\n onError: (error) => {\n console.error(error.error.message);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n }));\n\n return (\n <div class=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 class=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n class=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div class=\"space-y-2\">\n <label for={field().name}>Email</label>\n <input\n id={field().name}\n name={field().name}\n type=\"email\"\n value={field().state.value}\n onBlur={field().handleBlur}\n onInput={(e) => field().handleChange(e.currentTarget.value)}\n class=\"w-full rounded border p-2\"\n />\n <For each={field().state.meta.errors}>\n {(error) => <p class=\"text-sm text-red-600\">{error?.message}</p>}\n </For>\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div class=\"space-y-2\">\n <label for={field().name}>Password</label>\n <input\n id={field().name}\n name={field().name}\n type=\"password\"\n value={field().state.value}\n onBlur={field().handleBlur}\n onInput={(e) => field().handleChange(e.currentTarget.value)}\n class=\"w-full rounded border p-2\"\n />\n <For each={field().state.meta.errors}>\n {(error) => <p class=\"text-sm text-red-600\">{error?.message}</p>}\n </For>\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <button\n type=\"submit\"\n class=\"w-full rounded bg-indigo-600 p-2 text-white hover:bg-indigo-700 disabled:opacity-50\"\n disabled={!state().canSubmit || state().isSubmitting}\n >\n {state().isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </button>\n )}\n </form.Subscribe>\n </form>\n\n <div class=\"mt-4 text-center\">\n <button\n type=\"button\"\n onClick={onSwitchToSignUp}\n class=\"text-sm text-indigo-600 hover:text-indigo-800 hover:underline\"\n >\n Need an account? Sign Up\n </button>\n </div>\n </div>\n );\n}\n`],\n [\"payments/polar/server/base/src/lib/payments.ts.hbs\", `import { Polar } from \"@polar-sh/sdk\";\nimport { env } from \"@{{projectName}}/env/server\";\n\nexport const polarClient = new Polar({\n\taccessToken: env.POLAR_ACCESS_TOKEN,\n\tserver: \"sandbox\",\n});\n`],\n [\"auth/better-auth/web/solid/src/routes/dashboard.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\nimport { useQuery } from \"@tanstack/solid-query\";\n{{/if}}\nimport { createFileRoute, redirect } from \"@tanstack/solid-router\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n\tcomponent: RouteComponent,\n\tbeforeLoad: async () => {\n\t\tconst session = await authClient.getSession();\n\t\tif (!session.data) {\n\t\t\tredirect({\n\t\t\t\tto: \"/login\",\n\t\t\t\tthrow: true,\n\t\t\t});\n\t\t}\n\t\t{{#if (eq payments \"polar\")}}\n\t\tconst { data: customerState } = await authClient.customer.state();\n\t\treturn { session, customerState };\n\t\t{{else}}\n\t\treturn { session };\n\t\t{{/if}}\n\t},\n});\n\nfunction RouteComponent() {\n\tconst context = Route.useRouteContext();\n\n\tconst session = context().session;\n\t{{#if (eq payments \"polar\")}}\n\tconst customerState = context().customerState;\n\t{{/if}}\n\n\t{{#if (eq api \"orpc\")}}\n\tconst privateData = useQuery(() => orpc.privateData.queryOptions());\n\t{{/if}}\n\n\t{{#if (eq payments \"polar\")}}\n\tconst hasProSubscription = () =>\n\t\tcustomerState?.activeSubscriptions?.length! > 0;\n\t{{/if}}\n\n\treturn (\n\t\t<div>\n\t\t\t<h1>Dashboard</h1>\n\t\t\t<p>Welcome {session.data?.user.name}</p>\n\t\t\t{{#if (eq api \"orpc\")}}\n\t\t\t<p>API: {privateData.data?.message}</p>\n\t\t\t{{/if}}\n\t\t\t{{#if (eq payments \"polar\")}}\n\t\t\t<p>Plan: {hasProSubscription() ? \"Pro\" : \"Free\"}</p>\n\t\t\t{hasProSubscription() ? (\n\t\t\t\t<button onClick={async () => await authClient.customer.portal()}>\n\t\t\t\t\tManage Subscription\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\tonClick={async () => await authClient.checkout({ slug: \"pro\" })}\n\t\t\t\t>\n\t\t\t\t\tUpgrade to Pro\n\t\t\t\t</button>\n\t\t\t)}\n\t\t\t{{/if}}\n\t\t</div>\n\t);\n}\n`],\n [\"auth/better-auth/web/solid/src/routes/login.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport { createFileRoute } from \"@tanstack/solid-router\";\nimport { createSignal, Match, Switch } from \"solid-js\";\n\nexport const Route = createFileRoute(\"/login\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [showSignIn, setShowSignIn] = createSignal(false);\n\n return (\n <Switch>\n <Match when={showSignIn()}>\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n </Match>\n <Match when={!showSignIn()}>\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n </Match>\n </Switch>\n );\n}\n`],\n [\"auth/better-auth/web/solid/src/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/solid\";\n{{#if (eq payments \"polar\")}}\nimport { polarClient } from \"@polar-sh/better-auth\";\n{{/if}}\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const authClient = createAuthClient({\n\tbaseURL: env.VITE_SERVER_URL,\n{{#if (eq payments \"polar\")}}\n\tplugins: [polarClient()]\n{{/if}}\n});\n`],\n [\"frontend/react/web-base/src/components/ui/button.tsx.hbs\", `import { Button as ButtonPrimitive } from '@base-ui/react/button'\nimport { cva } from 'class-variance-authority'\nimport type {VariantProps} from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-none border border-transparent bg-clip-padding text-xs font-medium focus-visible:ring-1 aria-invalid:ring-1 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',\n outline:\n 'border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n ghost:\n 'hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n destructive:\n 'bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default:\n 'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n xs: \"h-6 gap-1 rounded-none px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-none px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3',\n icon: 'size-8',\n 'icon-xs': \"size-6 rounded-none [&_svg:not([class*='size-'])]:size-3\",\n 'icon-sm': 'size-7 rounded-none',\n 'icon-lg': 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n`],\n [\"frontend/react/web-base/src/components/ui/label.tsx.hbs\", `'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Label({ className, ...props }: React.ComponentProps<'label'>) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n 'gap-2 text-xs leading-none group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n`],\n [\"frontend/react/web-base/src/components/ui/checkbox.tsx.hbs\", `import { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'\n\nimport { CheckIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nfunction Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'border-input dark:bg-input/30 data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary data-checked:border-primary aria-invalid:aria-checked:border-primary aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 flex size-4 items-center justify-center rounded-none border transition-colors group-has-disabled/field:opacity-50 focus-visible:ring-1 aria-invalid:ring-1 peer relative shrink-0 outline-none after:absolute after:-inset-x-3 after:-inset-y-2 disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"[&>svg]:size-3.5 grid place-content-center text-current transition-none\"\n >\n <CheckIcon />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n`],\n [\"frontend/react/web-base/src/components/ui/card.tsx.hbs\", `import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Card({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<'div'> & { size?: 'default' | 'sm' }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n 'ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-none py-4 text-xs/relaxed ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-2 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none group/card flex flex-col',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'gap-1 rounded-none px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n 'text-sm font-medium group-data-[size=sm]/card:text-sm',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn('text-muted-foreground text-xs/relaxed', className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n 'col-start-2 row-span-2 row-start-1 self-start justify-self-end',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn('px-4 group-data-[size=sm]/card:px-3', className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n 'rounded-none border-t p-4 group-data-[size=sm]/card:p-3 flex items-center',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n`],\n [\"frontend/react/web-base/src/components/ui/sonner.tsx.hbs\", `import { useTheme } from 'next-themes'\nimport { Toaster as Sonner } from 'sonner'\nimport {\n CircleCheckIcon,\n InfoIcon,\n Loader2Icon,\n OctagonXIcon,\n TriangleAlertIcon,\n} from 'lucide-react'\nimport type {ToasterProps} from 'sonner';\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = 'system' } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps['theme']}\n className=\"toaster group\"\n icons=\\\\{{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n '--border-radius': 'var(--radius)',\n } as React.CSSProperties\n }\n toastOptions=\\\\{{\n classNames: {\n toast: 'cn-toast',\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n`],\n [\"frontend/react/web-base/src/components/ui/skeleton.tsx.hbs\", `import { cn } from \"@/lib/utils\";\n\nfunction Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-none animate-pulse\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n`],\n [\"frontend/react/web-base/src/components/ui/input.tsx.hbs\", `import * as React from 'react'\nimport { Input as InputPrimitive } from '@base-ui/react/input'\n\nimport { cn } from '@/lib/utils'\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n 'dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-8 rounded-none border bg-transparent px-2.5 py-1 text-xs transition-colors file:h-6 file:text-xs file:font-medium focus-visible:ring-1 aria-invalid:ring-1 md:text-xs file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n`],\n [\"frontend/react/web-base/src/components/ui/dropdown-menu.tsx.hbs\", `import * as React from 'react'\nimport { Menu as MenuPrimitive } from '@base-ui/react/menu'\n\nimport { CheckIcon, ChevronRightIcon } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuContent({\n align = 'start',\n alignOffset = 0,\n side = 'bottom',\n sideOffset = 4,\n className,\n ...props\n}: MenuPrimitive.Popup.Props &\n Pick<\n MenuPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'side' | 'sideOffset'\n >) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-none shadow-md ring-1 duration-100 z-50 max-h-(--available-height) w-(--anchor-width) origin-(--transform-origin) overflow-x-hidden overflow-y-auto outline-none data-closed:overflow-hidden',\n className,\n )}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n 'text-muted-foreground px-2 py-2 text-xs data-[inset]:pl-8',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-none px-2 py-2 text-xs [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-none px-2 py-2 text-xs [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n align = 'start',\n alignOffset = -3,\n side = 'right',\n sideOffset = 0,\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-none shadow-lg ring-1 duration-100 w-auto',\n className,\n )}\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: MenuPrimitive.CheckboxItem.Props) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-none py-2 pr-8 pl-2 text-xs [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n return (\n <MenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-none py-2 pr-8 pl-2 text-xs [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n 'text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n`],\n [\"frontend/native/uniwind/app/(drawer)/(tabs)/_layout.tsx.hbs\", `import { Tabs } from \"expo-router\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { useThemeColor } from \"heroui-native\";\n\nexport default function TabLayout() {\n\tconst themeColorForeground = useThemeColor(\"foreground\");\n\tconst themeColorBackground = useThemeColor(\"background\");\n\n\treturn (\n\t\t<Tabs\n\t\t\tscreenOptions=\\\\{{\n\t\t\t\theaderShown: false,\n\t\t\t\theaderStyle: {\n\t\t\t\t\tbackgroundColor: themeColorBackground,\n\t\t\t\t},\n\t\t\t\theaderTintColor: themeColorForeground,\n\t\t\t\theaderTitleStyle: {\n\t\t\t\t\tcolor: themeColorForeground,\n\t\t\t\t\tfontWeight: \"600\",\n\t\t\t\t},\n\t\t\t\ttabBarStyle: {\n\t\t\t\t\tbackgroundColor: themeColorBackground,\n\t\t\t\t},\n\t\t\t}}\n\t\t>\n\t\t\t<Tabs.Screen\n\t\t\t\tname=\"index\"\n\t\t\t\toptions=\\\\{{\n\t\t\t\t\ttitle: \"Home\",\n\t\t\t\t\ttabBarIcon: ({ color, size }: { color: string; size: number }) => (\n\t\t\t\t\t\t<Ionicons name=\"home\" size={size} color={color} />\n\t\t\t\t\t),\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<Tabs.Screen\n\t\t\t\tname=\"two\"\n\t\t\t\toptions=\\\\{{\n\t\t\t\t\ttitle: \"Explore\",\n\t\t\t\t\ttabBarIcon: ({ color, size }: { color: string; size: number }) => (\n\t\t\t\t\t\t<Ionicons name=\"compass\" size={size} color={color} />\n\t\t\t\t\t),\n\t\t\t\t}}\n\t\t\t/>\n\t\t</Tabs>\n\t);\n}\n`],\n [\"frontend/native/uniwind/app/(drawer)/(tabs)/index.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { Text, View } from \"react-native\";\nimport { Card } from \"heroui-native\";\n\nexport default function Home() {\n\treturn (\n\t\t<Container className=\"p-6\">\n\t\t\t<View className=\"flex-1 justify-center items-center\">\n\t\t\t\t<Card variant=\"secondary\" className=\"p-8 items-center\">\n\t\t\t\t\t<Card.Title className=\"text-3xl mb-2\">Tab One</Card.Title>\n\t\t\t\t</Card>\n\t\t\t</View>\n\t\t</Container>\n\t);\n}\n`],\n [\"frontend/native/uniwind/app/(drawer)/(tabs)/two.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { Text, View } from \"react-native\";\nimport { Card } from \"heroui-native\";\n\nexport default function TabTwo() {\n\treturn (\n\t\t<Container className=\"p-6\">\n\t\t\t<View className=\"flex-1 justify-center items-center\">\n\t\t\t\t<Card variant=\"secondary\" className=\"p-8 items-center\">\n\t\t\t\t\t<Card.Title className=\"text-3xl mb-2\">TabTwo</Card.Title>\n\t\t\t\t</Card>\n\t\t\t</View>\n\t\t</Container>\n\t);\n}\n`],\n [\"frontend/native/unistyles/app/(drawer)/(tabs)/_layout.tsx.hbs\", `import { Tabs } from \"expo-router\";\nimport { useUnistyles } from \"react-native-unistyles\";\n\nimport { TabBarIcon } from \"@/components/tabbar-icon\";\n\nexport default function TabLayout() {\n const { theme } = useUnistyles();\n\n return (\n <Tabs\n screenOptions=\\\\{{\n headerShown: false,\n tabBarActiveTintColor: theme.colors.primary,\n tabBarInactiveTintColor: theme.colors.mutedForeground,\n tabBarStyle: {\n backgroundColor: theme.colors.background,\n borderTopColor: theme.colors.border,\n },\n }}\n >\n <Tabs.Screen\n name=\"index\"\n options=\\\\{{\n title: \"Home\",\n tabBarIcon: ({ color }) => <TabBarIcon name=\"home\" color={color} />,\n }}\n />\n <Tabs.Screen\n name=\"two\"\n options=\\\\{{\n title: \"Explore\",\n tabBarIcon: ({ color }) => (\n <TabBarIcon name=\"compass\" color={color} />\n ),\n }}\n />\n </Tabs>\n );\n}\n`],\n [\"frontend/native/unistyles/app/(drawer)/(tabs)/index.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { ScrollView, Text, View } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport default function Home() {\n return (\n <Container>\n <ScrollView contentContainerStyle={styles.container}>\n <View style={styles.headerSection}>\n <Text style={styles.title}>Tab One</Text>\n <Text style={styles.subtitle}>\n Explore the first section of your app\n </Text>\n </View>\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n padding: theme.spacing.lg,\n },\n headerSection: {\n paddingVertical: theme.spacing.xl,\n },\n title: {\n fontSize: theme.fontSize[\"3xl\"],\n fontWeight: \"bold\",\n color: theme.colors.foreground,\n marginBottom: theme.spacing.sm,\n },\n subtitle: {\n fontSize: theme.fontSize.lg,\n color: theme.colors.mutedForeground,\n },\n}));\n`],\n [\"frontend/native/unistyles/app/(drawer)/(tabs)/two.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { ScrollView, Text, View } from \"react-native\";\nimport { StyleSheet } from \"react-native-unistyles\";\n\nexport default function TabTwo() {\n return (\n <Container>\n <ScrollView contentContainerStyle={styles.container}>\n <View style={styles.headerSection}>\n <Text style={styles.title}>Tab Two</Text>\n <Text style={styles.subtitle}>\n Discover more features and content\n </Text>\n </View>\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n padding: theme.spacing.lg,\n },\n headerSection: {\n paddingVertical: theme.spacing.xl,\n },\n title: {\n fontSize: theme.fontSize[\"3xl\"],\n fontWeight: \"bold\",\n color: theme.colors.foreground,\n marginBottom: theme.spacing.sm,\n },\n subtitle: {\n fontSize: theme.fontSize.lg,\n color: theme.colors.mutedForeground,\n },\n}));\n`],\n [\"frontend/native/bare/app/(drawer)/(tabs)/_layout.tsx.hbs\", `import { TabBarIcon } from \"@/components/tabbar-icon\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { Tabs } from \"expo-router\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport default function TabLayout() {\n const { isDarkColorScheme } = useColorScheme();\n const theme = isDarkColorScheme ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Tabs\n screenOptions=\\\\{{\n headerShown: false,\n tabBarActiveTintColor: theme.primary,\n tabBarInactiveTintColor: theme.text,\n tabBarStyle: {\n backgroundColor: theme.background,\n borderTopColor: theme.border,\n },\n }}\n >\n <Tabs.Screen\n name=\"index\"\n options=\\\\{{\n title: \"Home\",\n tabBarIcon: ({ color }) => <TabBarIcon name=\"home\" color={color} />,\n }}\n />\n <Tabs.Screen\n name=\"two\"\n options=\\\\{{\n title: \"Explore\",\n tabBarIcon: ({ color }) => (\n <TabBarIcon name=\"compass\" color={color} />\n ),\n }}\n />\n </Tabs>\n );\n}\n\n`],\n [\"frontend/native/bare/app/(drawer)/(tabs)/index.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { ScrollView, Text, View, StyleSheet } from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport default function TabOne() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Container>\n <ScrollView style={styles.scrollView}>\n <View style={styles.content}>\n <Text style={[styles.title, { color: theme.text }]}>\n Tab One\n </Text>\n <Text style={[styles.subtitle, { color: theme.text, opacity: 0.7 }]}>\n Explore the first section of your app\n </Text>\n </View>\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n scrollView: {\n flex: 1,\n padding: 16,\n },\n content: {\n paddingVertical: 16,\n },\n title: {\n fontSize: 24,\n fontWeight: \"bold\",\n marginBottom: 8,\n },\n subtitle: {\n fontSize: 16,\n },\n});\n\n`],\n [\"frontend/native/bare/app/(drawer)/(tabs)/two.tsx.hbs\", `import { Container } from \"@/components/container\";\nimport { ScrollView, Text, View, StyleSheet } from \"react-native\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nexport default function TabTwo() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n\n return (\n <Container>\n <ScrollView style={styles.scrollView}>\n <View style={styles.content}>\n <Text style={[styles.title, { color: theme.text }]}>\n Tab Two\n </Text>\n <Text style={[styles.subtitle, { color: theme.text, opacity: 0.7 }]}>\n Discover more features and content\n </Text>\n </View>\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n scrollView: {\n flex: 1,\n padding: 16,\n },\n content: {\n paddingVertical: 16,\n },\n title: {\n fontSize: 24,\n fontWeight: \"bold\",\n marginBottom: 8,\n },\n subtitle: {\n fontSize: 16,\n },\n});\n\n`],\n [\"api/orpc/web/react/base/src/utils/orpc.ts.hbs\", `import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport { QueryCache, QueryClient } from \"@tanstack/react-query\";\nimport { toast } from \"sonner\";\n{{#if (and (includes frontend \"tanstack-start\") (eq backend \"self\"))}}\nimport { createRouterClient } from \"@orpc/server\";\nimport type { RouterClient } from \"@orpc/server\";\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { createContext } from \"@{{projectName}}/api/context\";\n{{else if (includes frontend \"tanstack-start\")}}\nimport type { RouterClient } from \"@orpc/server\";\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nimport { env } from \"@{{projectName}}/env/web\";\n{{else}}\nimport type { AppRouterClient } from \"@{{projectName}}/api/routers/index\";\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n{{/if}}\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error, query) => {\n\t\t\ttoast.error(\\`Error: \\${error.message}\\`, {\n\t\t\t\taction: {\n\t\t\t\t\tlabel: \"retry\",\n\t\t\t\t\tonClick: query.invalidate,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t}),\n});\n\n{{#if (and (includes frontend \"tanstack-start\") (eq backend \"self\"))}}\nconst getORPCClient = createIsomorphicFn()\n\t.server(() =>\n\t\tcreateRouterClient(appRouter, {\n\t\t\tcontext: async ({ req }) => {\n\t\t\t\treturn createContext({ req });\n\t\t\t},\n\t\t}),\n\t)\n\t.client((): RouterClient<typeof appRouter> => {\n\t\t\tconst link = new RPCLink({\n\t\t\turl: \\`\\${window.location.origin}/api/rpc\\`,\n{{#if (eq auth \"better-auth\")}}\n\t\t\tfetch(url, options) {\n\t\t\t\treturn fetch(url, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t});\n\t\t\t},\n{{/if}}\n\t\t});\n\n\t\treturn createORPCClient(link);\n\t});\n\nexport const client: RouterClient<typeof appRouter> = getORPCClient();\n{{else if (includes frontend \"tanstack-start\")}}\nconst link = new RPCLink({\n\turl: \\`\\${env.VITE_SERVER_URL}/rpc\\`,\n{{#if (eq auth \"better-auth\")}}\n\tfetch(url, options) {\n\t\treturn fetch(url, {\n\t\t\t...options,\n\t\t\tcredentials: \"include\",\n\t\t});\n\t},\n{{/if}}\n});\n\nconst getORPCClient = () => {\n\treturn createORPCClient(link) as RouterClient<AppRouter>;\n};\n\nexport const client: RouterClient<AppRouter> = getORPCClient();\n{{else}}\nexport const link = new RPCLink({\n{{#if (and (eq backend \"self\") (includes frontend \"next\"))}}\n\turl: \\`\\${typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3001\"}/api/rpc\\`,\n{{else if (includes frontend \"next\")}}\n\turl: \\`\\${env.NEXT_PUBLIC_SERVER_URL}/rpc\\`,\n{{else}}\n\turl: \\`\\${env.VITE_SERVER_URL}/rpc\\`,\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\n\tfetch(url, options) {\n\t\treturn fetch(url, {\n\t\t\t...options,\n\t\t\tcredentials: \"include\",\n\t\t});\n\t},\n{{#if (includes frontend \"next\")}}\n\theaders: async () => {\n\t\tif (typeof window !== \"undefined\") {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst { headers } = await import(\"next/headers\")\n\t\treturn Object.fromEntries(await headers())\n\t},\n{{/if}}\n{{/if}}\n});\n\nexport const client: AppRouterClient = createORPCClient(link)\n{{/if}}\n\nexport const orpc = createTanstackQueryUtils(client)\n\n`],\n [\"examples/ai/convex/packages/backend/convex/agent.ts.hbs\", `import { Agent } from \"@convex-dev/agent\";\nimport { google } from \"@ai-sdk/google\";\nimport { components } from \"./_generated/api\";\n\nexport const chatAgent = new Agent(components.agent, {\n name: \"Chat Agent\",\n languageModel: google(\"gemini-2.5-flash\"),\n instructions: \"You are a helpful AI assistant. Be concise and friendly in your responses.\",\n});\n`],\n [\"examples/ai/convex/packages/backend/convex/chat.ts.hbs\", `import {\n createThread,\n listUIMessages,\n saveMessage,\n syncStreams,\n vStreamArgs,\n} from \"@convex-dev/agent\";\nimport { paginationOptsValidator } from \"convex/server\";\nimport { v } from \"convex/values\";\n\nimport { components, internal } from \"./_generated/api\";\nimport { internalAction, mutation, query } from \"./_generated/server\";\nimport { chatAgent } from \"./agent\";\n\nexport const createNewThread = mutation({\n args: {},\n handler: async (ctx) => {\n const threadId = await createThread(ctx, components.agent, {});\n return threadId;\n },\n});\n\nexport const listMessages = query({\n args: {\n threadId: v.string(),\n paginationOpts: paginationOptsValidator,\n streamArgs: vStreamArgs,\n },\n handler: async (ctx, args) => {\n const paginated = await listUIMessages(ctx, components.agent, args);\n const streams = await syncStreams(ctx, components.agent, args);\n return { ...paginated, streams };\n },\n});\n\nexport const sendMessage = mutation({\n args: {\n threadId: v.string(),\n prompt: v.string(),\n },\n handler: async (ctx, { threadId, prompt }) => {\n const { messageId } = await saveMessage(ctx, components.agent, {\n threadId,\n prompt,\n });\n await ctx.scheduler.runAfter(0, internal.chat.generateResponseAsync, {\n threadId,\n promptMessageId: messageId,\n });\n return messageId;\n },\n});\n\nexport const generateResponseAsync = internalAction({\n args: {\n threadId: v.string(),\n promptMessageId: v.string(),\n },\n handler: async (ctx, { threadId, promptMessageId }) => {\n await chatAgent.streamText(\n ctx,\n { threadId },\n { promptMessageId },\n { saveStreamDeltas: true },\n );\n },\n});\n`],\n [\"examples/ai/web/nuxt/app/pages/ai.vue.hbs\", `<script setup lang=\"ts\">\nimport { Chat } from '@ai-sdk/vue'\nimport type { UIMessage } from 'ai'\nimport { getTextFromMessage } from '@nuxt/ui/utils/ai'\nimport { DefaultChatTransport } from 'ai'\nimport { ref } from 'vue'\n\nconst config = useRuntimeConfig()\nconst messages: UIMessage[] = []\nconst input = ref('')\n\nconst chat = new Chat({\n messages,\n transport: new DefaultChatTransport({\n api: \\`\\${config.public.serverUrl}/ai\\`,\n }),\n onError(error) {\n console.error('Chat error:', error)\n }\n})\n\nasync function handleSubmit(e: Event) {\n e.preventDefault()\n const userInput = input.value\n input.value = ''\n\n if (!userInput.trim()) return\n\n chat.sendMessage({ text: userInput })\n}\n</script>\n\n<template>\n <UContainer class=\"h-full flex flex-col overflow-hidden py-4\">\n <div class=\"flex-1 min-h-0 overflow-y-auto\">\n <UChatMessages :messages=\"chat.messages\" :status=\"chat.status\">\n <template #content=\"{ message }\">\n <div class=\"whitespace-pre-wrap\">\\\\{{ getTextFromMessage(message) }}</div>\n </template>\n </UChatMessages>\n </div>\n\n <div class=\"shrink-0 pt-4 border-t border-gray-200 dark:border-gray-800\">\n <UChatPrompt\n v-model=\"input\"\n :error=\"chat.error\"\n @submit=\"handleSubmit\"\n placeholder=\"Type your message...\"\n >\n <UChatPromptSubmit :status=\"chat.status\" @stop=\"() => chat.stop()\" @reload=\"() => chat.regenerate()\" />\n </UChatPrompt>\n </div>\n </UContainer>\n</template>`],\n [\"examples/ai/native/uniwind/app/(drawer)/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { Ionicons } from \"@expo/vector-icons\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { useMutation } from \"convex/react\";\nimport { Button, Divider, Spinner, Surface, TextField, useThemeColor } from \"heroui-native\";\nimport { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\n\nimport { Container } from \"@/components/container\";\n\nfunction MessageContent({\n text,\n isStreaming,\n}: {\n text: string;\n isStreaming: boolean;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Text className=\"text-foreground text-sm leading-relaxed\">{visibleText}</Text>;\n}\n\nexport default function AIScreen() {\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const scrollViewRef = useRef<ScrollView>(null);\n const mutedColor = useThemeColor(\"muted\");\n const foregroundColor = useThemeColor(\"foreground\");\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n const onSubmit = async () => {\n const value = input.trim();\n if (!value || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: value });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Container>\n <KeyboardAvoidingView\n className=\"flex-1\"\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View className=\"flex-1 px-4 py-4\">\n <View className=\"py-4 mb-4\">\n <Text className=\"text-2xl font-semibold text-foreground tracking-tight\">AI Chat</Text>\n <Text className=\"text-muted text-sm mt-1\">Chat with our AI assistant</Text>\n </View>\n\n <ScrollView\n ref={scrollViewRef}\n className=\"flex-1 mb-4\"\n showsVerticalScrollIndicator={false}\n >\n {!messages || messages.length === 0 ? (\n <View className=\"flex-1 justify-center items-center py-10\">\n <Ionicons name=\"chatbubble-ellipses-outline\" size={32} color={mutedColor} />\n <Text className=\"text-muted text-sm mt-3\">Ask me anything to get started</Text>\n </View>\n ) : (\n <View className=\"gap-2\">\n {messages.map((message: UIMessage) => (\n <Surface\n key={message.key}\n variant={message.role === \"user\" ? \"tertiary\" : \"secondary\"}\n className={\\`p-3 rounded-lg \\${message.role === \"user\" ? \"ml-10\" : \"mr-10\"}\\`}\n >\n <Text className=\"text-xs font-medium mb-1 text-muted\">\n {message.role === \"user\" ? \"You\" : \"AI\"}\n </Text>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n />\n </Surface>\n ))}\n {isLoading && !hasStreamingMessage && (\n <Surface variant=\"secondary\" className=\"p-3 mr-10 rounded-lg\">\n <Text className=\"text-xs font-medium mb-1 text-muted\">AI</Text>\n <View className=\"flex-row items-center gap-2\">\n <Spinner size=\"sm\" />\n <Text className=\"text-muted text-sm\">Thinking...</Text>\n </View>\n </Surface>\n )}\n </View>\n )}\n </ScrollView>\n\n <Divider className=\"mb-3\" />\n\n <View className=\"flex-row items-center gap-2\">\n <View className=\"flex-1\">\n <TextField>\n <TextField.Input\n value={input}\n onChangeText={setInput}\n placeholder=\"Type a message...\"\n onSubmitEditing={onSubmit}\n editable={!isLoading}\n autoFocus\n />\n </TextField>\n </View>\n <Button\n isIconOnly\n variant={input.trim() && !isLoading ? \"primary\" : \"secondary\"}\n onPress={onSubmit}\n isDisabled={!input.trim() || isLoading}\n size=\"sm\"\n >\n <Ionicons\n name=\"arrow-up\"\n size={18}\n color={input.trim() && !isLoading ? foregroundColor : mutedColor}\n />\n </Button>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n{{else}}\nimport { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { fetch as expoFetch } from \"expo/fetch\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { Container } from \"@/components/container\";\nimport { Button, Divider, ErrorView, Spinner, Surface, TextField, useThemeColor } from \"heroui-native\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nconst generateAPIUrl = (relativePath: string) => {\n const serverUrl = env.EXPO_PUBLIC_SERVER_URL;\n if (!serverUrl) {\n throw new Error(\n \"EXPO_PUBLIC_SERVER_URL environment variable is not defined\"\n );\n }\n const path = relativePath.startsWith(\"/\") ? relativePath : \\`/\\${relativePath}\\`;\n return serverUrl.concat(path);\n};\n\nexport default function AIScreen() {\n const [input, setInput] = useState(\"\");\n const { messages, error, sendMessage } = useChat({\n transport: new DefaultChatTransport({\n fetch: expoFetch as unknown as typeof globalThis.fetch,\n api: generateAPIUrl(\"/ai\"),\n }),\n onError: (error) => console.error(error, \"AI Chat Error\"),\n });\n const scrollViewRef = useRef<ScrollView>(null);\n const foregroundColor = useThemeColor(\"foreground\");\n const mutedColor = useThemeColor(\"muted\");\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n const onSubmit = () => {\n const value = input.trim();\n if (value) {\n sendMessage({ text: value });\n setInput(\"\");\n }\n };\n\n if (error) {\n return (\n <Container>\n <View className=\"flex-1 justify-center items-center px-4\">\n <Surface variant=\"secondary\" className=\"p-4 rounded-lg\">\n <ErrorView isInvalid>\n <Text className=\"text-danger text-center font-medium mb-1\">\n {error.message}\n </Text>\n <Text className=\"text-muted text-center text-xs\">\n Please check your connection and try again.\n </Text>\n </ErrorView>\n </Surface>\n </View>\n </Container>\n );\n }\n\n return (\n <Container>\n <KeyboardAvoidingView\n className=\"flex-1\"\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View className=\"flex-1 px-4 py-4\">\n <View className=\"py-4 mb-4\">\n <Text className=\"text-2xl font-semibold text-foreground tracking-tight\">AI Chat</Text>\n <Text className=\"text-muted text-sm mt-1\">Chat with our AI assistant</Text>\n </View>\n\n <ScrollView\n ref={scrollViewRef}\n className=\"flex-1 mb-4\"\n showsVerticalScrollIndicator={false}\n >\n {messages.length === 0 ? (\n <View className=\"flex-1 justify-center items-center py-10\">\n <Ionicons name=\"chatbubble-ellipses-outline\" size={32} color={mutedColor} />\n <Text className=\"text-muted text-sm mt-3\">Ask me anything to get started</Text>\n </View>\n ) : (\n <View className=\"gap-2\">\n {messages.map((message) => (\n <Surface\n key={message.id}\n variant={message.role === \"user\" ? \"tertiary\" : \"secondary\"}\n className={\\`p-3 rounded-lg \\${message.role === \"user\" ? \"ml-10\" : \"mr-10\"}\\`}\n >\n <Text className=\"text-xs font-medium mb-1 text-muted\">\n {message.role === \"user\" ? \"You\" : \"AI\"}\n </Text>\n <View className=\"gap-1\">\n {message.parts.map((part, i) =>\n part.type === \"text\" ? (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n className=\"text-foreground text-sm leading-relaxed\"\n >\n {part.text}\n </Text>\n ) : (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n className=\"text-foreground text-sm leading-relaxed\"\n >\n {JSON.stringify(part)}\n </Text>\n )\n )}\n </View>\n </Surface>\n ))}\n </View>\n )}\n </ScrollView>\n\n <Divider className=\"mb-3\" />\n\n <View className=\"flex-row items-center gap-2\">\n <View className=\"flex-1\">\n <TextField>\n <TextField.Input\n value={input}\n onChangeText={setInput}\n placeholder=\"Type a message...\"\n onSubmitEditing={onSubmit}\n autoFocus\n />\n </TextField>\n </View>\n <Button\n isIconOnly\n variant={input.trim() ? \"primary\" : \"secondary\"}\n onPress={onSubmit}\n isDisabled={!input.trim()}\n size=\"sm\"\n >\n <Ionicons\n name=\"arrow-up\"\n size={18}\n color={input.trim() ? foregroundColor : mutedColor}\n />\n </Button>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n{{/if}}\n`],\n [\"examples/todo/native/unistyles/app/(drawer)/todos.tsx.hbs\", `import { useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ScrollView,\n ActivityIndicator,\n Alert,\n} from \"react-native\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { StyleSheet, useUnistyles } from \"react-native-unistyles\";\n\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\n\nimport { Container } from \"@/components/container\";\n{{#unless (eq backend \"convex\")}}\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{/unless}}\n\nexport default function TodosScreen() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n const { theme } = useUnistyles();\n\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodoMutation = useMutation(api.todos.create);\n const toggleTodoMutation = useMutation(api.todos.toggle);\n const deleteTodoMutation = useMutation(api.todos.deleteTodo);\n\n const handleAddTodo = async () => {\n const text = newTodoText.trim();\n if (!text) return;\n await createTodoMutation({ text });\n setNewTodoText(\"\");\n };\n\n const handleToggleTodo = (id: Id<\"todos\">, currentCompleted: boolean) => {\n toggleTodoMutation({ id, completed: !currentCompleted });\n };\n\n const handleDeleteTodo = (id: Id<\"todos\">) => {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteTodoMutation({ id }),\n },\n ]);\n };\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n {{/if}}\n\n const handleAddTodo = () => {\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteMutation.mutate({ id }),\n },\n ]);\n };\n {{/if}}\n\n const isLoading = {{#if (eq backend \"convex\")}}!todos{{else}}todos.isLoading{{/if}};\n const isCreating = {{#if (eq backend \"convex\")}}false{{else}}createMutation.isPending{{/if}};\n const primaryButtonTextColor = theme.colors.background;\n\n return (\n <Container>\n <ScrollView style={styles.scrollView}>\n <View style={styles.headerContainer}>\n <Text style={styles.headerTitle}>Todo List</Text>\n <Text style={styles.headerSubtitle}>\n Manage your tasks efficiently\n </Text>\n\n <View style={styles.inputContainer}>\n <TextInput\n value={newTodoText}\n onChangeText={setNewTodoText}\n placeholder=\"Add a new task...\"\n placeholderTextColor={theme.colors.border}\n editable={!isCreating}\n style={styles.textInput}\n onSubmitEditing={handleAddTodo}\n returnKeyType=\"done\"\n />\n <TouchableOpacity\n onPress={handleAddTodo}\n disabled={isCreating || !newTodoText.trim()}\n style={[\n styles.addButton,\n (isCreating || !newTodoText.trim()) && styles.addButtonDisabled,\n ]}\n >\n {isCreating ? (\n <ActivityIndicator size=\"small\" color={primaryButtonTextColor} />\n ) : (\n <Ionicons\n name=\"add\"\n size={24}\n color={primaryButtonTextColor}\n />\n )}\n </TouchableOpacity>\n </View>\n </View>\n\n {isLoading && (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"large\" color={theme.colors.primary} />\n <Text style={styles.loadingText}>Loading todos...</Text>\n </View>\n )}\n\n {{#if (eq backend \"convex\")}}\n {todos && todos.length === 0 && !isLoading && (\n <Text style={styles.emptyText}>No todos yet. Add one!</Text>\n )}\n {todos?.map((todo) => (\n <View key={todo._id} style={styles.todoItem}>\n <TouchableOpacity\n onPress={() => handleToggleTodo(todo._id, todo.completed)}\n style={styles.todoContent}\n >\n <Ionicons\n name={todo.completed ? \"checkbox\" : \"square-outline\"}\n size={24}\n color={todo.completed ? theme.colors.primary : theme.colors.typography}\n style={styles.checkbox}\n />\n <Text\n style={[\n styles.todoText,\n todo.completed && styles.todoTextCompleted,\n ]}\n >\n {todo.text}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity onPress={() => handleDeleteTodo(todo._id)}>\n <Ionicons name=\"trash-outline\" size={24} color={theme.colors.destructive} />\n </TouchableOpacity>\n </View>\n ))}\n {{else}}\n {todos.data && todos.data.length === 0 && !isLoading && (\n <Text style={styles.emptyText}>No todos yet. Add one!</Text>\n )}\n {todos.data?.map((todo: { id: number; text: string; completed: boolean }) => (\n <View key={todo.id} style={styles.todoItem}>\n <TouchableOpacity\n onPress={() => handleToggleTodo(todo.id, todo.completed)}\n style={styles.todoContent}\n >\n <Ionicons\n name={todo.completed ? \"checkbox\" : \"square-outline\"}\n size={24}\n color={todo.completed ? theme.colors.primary : theme.colors.typography}\n style={styles.checkbox}\n />\n <Text\n style={[\n styles.todoText,\n todo.completed && styles.todoTextCompleted,\n ]}\n >\n {todo.text}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity onPress={() => handleDeleteTodo(todo.id)}>\n <Ionicons name=\"trash-outline\" size={24} color={theme.colors.destructive} />\n </TouchableOpacity>\n </View>\n ))}\n {{/if}}\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n scrollView: {\n flex: 1,\n },\n headerContainer: {\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.lg,\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.border,\n backgroundColor: theme.colors.background,\n },\n headerTitle: {\n fontSize: 28,\n fontWeight: \"bold\",\n color: theme.colors.typography,\n marginBottom: theme.spacing.sm,\n },\n headerSubtitle: {\n fontSize: 16,\n color: theme.colors.typography,\n marginBottom: theme.spacing.md,\n },\n inputContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n marginBottom: theme.spacing.md,\n },\n textInput: {\n flex: 1,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: 8,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.sm,\n color: theme.colors.typography,\n backgroundColor: theme.colors.background,\n marginRight: theme.spacing.sm,\n fontSize: 16,\n },\n addButton: {\n backgroundColor: theme.colors.primary,\n padding: theme.spacing.sm,\n borderRadius: 8,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n addButtonDisabled: {\n backgroundColor: theme.colors.border,\n },\n loadingContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: theme.spacing.lg,\n },\n loadingText: {\n marginTop: theme.spacing.sm,\n fontSize: 16,\n color: theme.colors.typography,\n },\n emptyText: {\n textAlign: \"center\",\n marginTop: theme.spacing.xl,\n fontSize: 16,\n color: theme.colors.typography,\n },\n todoItem: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n paddingVertical: theme.spacing.md,\n paddingHorizontal: theme.spacing.md,\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.border,\n backgroundColor: theme.colors.background,\n },\n todoContent: {\n flexDirection: \"row\",\n alignItems: \"center\",\n flex: 1,\n },\n checkbox: {\n marginRight: theme.spacing.md,\n },\n todoText: {\n fontSize: 16,\n color: theme.colors.typography,\n flex: 1,\n },\n todoTextCompleted: {\n textDecorationLine: \"line-through\",\n color: theme.colors.border,\n },\n}));\n`],\n [\"examples/todo/convex/packages/backend/convex/todos.ts.hbs\", `import { query, mutation } from \"./_generated/server\";\nimport { v } from \"convex/values\";\n\nexport const getAll = query({\n handler: async (ctx) => {\n return await ctx.db.query(\"todos\").collect();\n },\n});\n\nexport const create = mutation({\n args: {\n text: v.string(),\n },\n handler: async (ctx, args) => {\n const newTodoId = await ctx.db.insert(\"todos\", {\n text: args.text,\n completed: false,\n });\n return await ctx.db.get(\"todos\", newTodoId);\n },\n});\n\nexport const toggle = mutation({\n args: {\n id: v.id(\"todos\"),\n completed: v.boolean(),\n },\n handler: async (ctx, args) => {\n await ctx.db.patch(\"todos\", args.id, { completed: args.completed });\n return { success: true };\n },\n});\n\nexport const deleteTodo = mutation({\n args: {\n id: v.id(\"todos\"),\n },\n handler: async (ctx, args) => {\n await ctx.db.delete(\"todos\", args.id);\n return { success: true };\n },\n});`],\n [\"examples/todo/native/bare/app/(drawer)/todos.tsx.hbs\", `import { useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n ScrollView,\n ActivityIndicator,\n Alert,\n TouchableOpacity,\n StyleSheet,\n} from \"react-native\";\nimport { Ionicons } from \"@expo/vector-icons\";\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\nimport { Container } from \"@/components/container\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n{{#unless (eq backend \"convex\")}}\n {{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n {{/if}}\n{{/unless}}\n\nexport default function TodosScreen() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [newTodoText, setNewTodoText] = useState(\"\");\n\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodoMutation = useMutation(api.todos.create);\n const toggleTodoMutation = useMutation(api.todos.toggle);\n const deleteTodoMutation = useMutation(api.todos.deleteTodo);\n\n async function handleAddTodo() {\n const text = newTodoText.trim();\n if (!text) return;\n await createTodoMutation({ text });\n setNewTodoText(\"\");\n }\n\n function handleToggleTodo(id: Id<\"todos\">, currentCompleted: boolean) {\n toggleTodoMutation({ id, completed: !currentCompleted });\n }\n\n function handleDeleteTodo(id: Id<\"todos\">) {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteTodoMutation({ id }),\n },\n ]);\n }\n\n const isLoading = !todos;\n const completedCount = todos?.filter((t) => t.completed).length || 0;\n const totalCount = todos?.length || 0;\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n })\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n })\n );\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n })\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n })\n );\n {{/if}}\n\n function handleAddTodo() {\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n }\n\n function handleToggleTodo(id: number, completed: boolean) {\n toggleMutation.mutate({ id, completed: !completed });\n }\n\n function handleDeleteTodo(id: number) {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteMutation.mutate({ id }),\n },\n ]);\n }\n\n const isLoading = todos?.isLoading;\n const completedCount = todos?.data?.filter((t) => t.completed).length || 0;\n const totalCount = todos?.data?.length || 0;\n {{/if}}\n\n return (\n <Container>\n <ScrollView\n style={styles.scrollView}\n contentContainerStyle={styles.contentContainer}\n >\n <View style={styles.header}>\n <View style={styles.headerRow}>\n <Text style={[styles.title, { color: theme.text }]}>\n Todo List\n </Text>\n {totalCount > 0 && (\n <View style={[styles.badge, { backgroundColor: theme.primary }]}>\n <Text style={styles.badgeText}>\n {completedCount}/{totalCount}\n </Text>\n </View>\n )}\n </View>\n </View>\n <View\n style={[\n styles.inputCard,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.inputRow}>\n <View style={styles.inputContainer}>\n <TextInput\n value={newTodoText}\n onChangeText={setNewTodoText}\n placeholder=\"Add a new task...\"\n placeholderTextColor={theme.text}\n {{#unless (eq backend \"convex\")}}\n editable={!createMutation.isPending}\n {{/unless}}\n onSubmitEditing={handleAddTodo}\n returnKeyType=\"done\"\n style={[\n styles.input,\n {\n color: theme.text,\n borderColor: theme.border,\n backgroundColor: theme.background,\n },\n ]}\n />\n </View>\n <TouchableOpacity\n onPress={handleAddTodo}\n {{#if (eq backend \"convex\")}}\n disabled={!newTodoText.trim()}\n style={[\n styles.addButton,\n {\n backgroundColor: !newTodoText.trim()\n ? theme.border\n : theme.primary,\n opacity: !newTodoText.trim() ? 0.5 : 1,\n },\n ]}\n >\n <Ionicons\n name=\"add\"\n size={24}\n color={newTodoText.trim() ? \"#ffffff\" : theme.text}\n />\n {{else}}\n disabled={createMutation.isPending || !newTodoText.trim()}\n style={[\n styles.addButton,\n {\n backgroundColor:\n createMutation.isPending || !newTodoText.trim()\n ? theme.border\n : theme.primary,\n opacity:\n createMutation.isPending || !newTodoText.trim() ? 0.5 : 1,\n },\n ]}\n >\n {createMutation.isPending ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Ionicons name=\"add\" size={24} color=\"#ffffff\" />\n )}\n {{/if}}\n </TouchableOpacity>\n </View>\n </View>\n\n {{#if (eq backend \"convex\")}}\n {isLoading && (\n <View style={styles.centerContainer}>\n <ActivityIndicator size=\"large\" color={theme.primary} />\n <Text\n style={[styles.loadingText, { color: theme.text, opacity: 0.7 }]}\n >\n Loading todos...\n </Text>\n </View>\n )}\n\n {todos && todos.length === 0 && !isLoading && (\n <View\n style={[\n styles.emptyCard,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Ionicons\n name=\"checkbox-outline\"\n size={64}\n color={theme.text}\n style=\\\\{{ opacity: 0.5, marginBottom: 16 }}\n />\n <Text style={[styles.emptyTitle, { color: theme.text }]}>\n No todos yet\n </Text>\n <Text\n style={[styles.emptyText, { color: theme.text, opacity: 0.7 }]}\n >\n Add your first task to get started!\n </Text>\n </View>\n )}\n\n {todos && todos.length > 0 && (\n <View style={styles.todosList}>\n {todos.map((todo) => (\n <View\n key={todo._id}\n style={[\n styles.todoCard,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.todoRow}>\n <TouchableOpacity\n onPress={() => handleToggleTodo(todo._id, todo.completed)}\n style={[styles.checkbox, { borderColor: theme.border }]}\n >\n {todo.completed && (\n <Ionicons\n name=\"checkmark\"\n size={16}\n color={theme.primary}\n />\n )}\n </TouchableOpacity>\n <View style={styles.todoTextContainer}>\n <Text\n style={[\n styles.todoText,\n { color: theme.text },\n todo.completed && {\n textDecorationLine: \"line-through\",\n opacity: 0.5,\n },\n ]}\n >\n {todo.text}\n </Text>\n </View>\n <TouchableOpacity\n onPress={() => handleDeleteTodo(todo._id)}\n style={styles.deleteButton}\n >\n <Ionicons\n name=\"trash-outline\"\n size={24}\n color={theme.notification}\n />\n </TouchableOpacity>\n </View>\n </View>\n ))}\n </View>\n )}\n {{else}}\n {isLoading && (\n <View style={styles.centerContainer}>\n <ActivityIndicator size=\"large\" color={theme.primary} />\n <Text\n style={[styles.loadingText, { color: theme.text, opacity: 0.7 }]}\n >\n Loading todos...\n </Text>\n </View>\n )}\n\n {todos?.data && todos.data.length === 0 && !isLoading && (\n <View\n style={[\n styles.emptyCard,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Ionicons\n name=\"checkbox-outline\"\n size={64}\n color={theme.text}\n style=\\\\{{ opacity: 0.5, marginBottom: 16 }}\n />\n <Text style={[styles.emptyTitle, { color: theme.text }]}>\n No todos yet\n </Text>\n <Text\n style={[styles.emptyText, { color: theme.text, opacity: 0.7 }]}\n >\n Add your first task to get started!\n </Text>\n </View>\n )}\n\n {todos?.data && todos.data.length > 0 && (\n <View style={styles.todosList}>\n {todos.data.map((todo) => (\n <View\n key={todo.id}\n style={[\n styles.todoCard,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.todoRow}>\n <TouchableOpacity\n onPress={() => handleToggleTodo(todo.id, todo.completed)}\n style={[styles.checkbox, { borderColor: theme.border }]}\n >\n {todo.completed && (\n <Ionicons\n name=\"checkmark\"\n size={16}\n color={theme.primary}\n />\n )}\n </TouchableOpacity>\n <View style={styles.todoTextContainer}>\n <Text\n style={[\n styles.todoText,\n { color: theme.text },\n todo.completed && {\n textDecorationLine: \"line-through\",\n opacity: 0.5,\n },\n ]}\n >\n {todo.text}\n </Text>\n </View>\n <TouchableOpacity\n onPress={() => handleDeleteTodo(todo.id)}\n style={styles.deleteButton}\n >\n <Ionicons\n name=\"trash-outline\"\n size={24}\n color={theme.notification}\n />\n </TouchableOpacity>\n </View>\n </View>\n ))}\n </View>\n )}\n {{/if}}\n </ScrollView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n scrollView: {\n flex: 1,\n },\n contentContainer: {\n padding: 16,\n },\n header: {\n marginBottom: 16,\n },\n headerRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n },\n title: {\n fontSize: 24,\n fontWeight: \"bold\",\n },\n badge: {\n paddingHorizontal: 8,\n paddingVertical: 4,\n },\n badgeText: {\n color: \"#ffffff\",\n fontSize: 12,\n },\n inputCard: {\n borderWidth: 1,\n padding: 12,\n marginBottom: 16,\n },\n inputRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n },\n inputContainer: {\n flex: 1,\n },\n input: {\n borderWidth: 1,\n padding: 12,\n fontSize: 16,\n },\n addButton: {\n padding: 12,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n centerContainer: {\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingVertical: 32,\n },\n loadingText: {\n marginTop: 16,\n fontSize: 14,\n },\n emptyCard: {\n borderWidth: 1,\n padding: 32,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n emptyTitle: {\n fontSize: 16,\n fontWeight: \"bold\",\n marginBottom: 8,\n },\n emptyText: {\n fontSize: 14,\n textAlign: \"center\",\n },\n todosList: {\n gap: 8,\n },\n todoCard: {\n borderWidth: 1,\n padding: 12,\n },\n todoRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 12,\n },\n checkbox: {\n width: 20,\n height: 20,\n borderWidth: 2,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n todoTextContainer: {\n flex: 1,\n },\n todoText: {\n fontSize: 16,\n },\n deleteButton: {\n padding: 8,\n },\n});`],\n [\"examples/todo/native/uniwind/app/(drawer)/todos.tsx.hbs\", `import { useState } from \"react\";\nimport { View, Text, ScrollView, Alert } from \"react-native\";\nimport { Ionicons } from \"@expo/vector-icons\";\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\nimport { Container } from \"@/components/container\";\n{{#unless (eq backend \"convex\")}}\n {{#if (eq api \"orpc\")}}\n import { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\n import { trpc } from \"@/utils/trpc\";\n {{/if}}\n{{/unless}}\nimport { Button, Checkbox, Chip, Spinner, Surface, TextField, useThemeColor } from \"heroui-native\";\n\nexport default function TodosScreen() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodoMutation = useMutation(api.todos.create);\n const toggleTodoMutation = useMutation(api.todos.toggle);\n const deleteTodoMutation = useMutation(api.todos.deleteTodo);\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }));\n const toggleMutation = useMutation(orpc.todo.toggle.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n }));\n const deleteMutation = useMutation(orpc.todo.delete.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n }));\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }));\n const toggleMutation = useMutation(trpc.todo.toggle.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n }));\n const deleteMutation = useMutation(trpc.todo.delete.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n },\n }));\n {{/if}}\n {{/if}}\n\n const mutedColor = useThemeColor(\"muted\");\n const dangerColor = useThemeColor(\"danger\");\n const foregroundColor = useThemeColor(\"foreground\");\n\n {{#if (eq backend \"convex\")}}\n const handleAddTodo = async () => {\n const text = newTodoText.trim();\n if (!text) return;\n await createTodoMutation({ text });\n setNewTodoText(\"\");\n };\n\n const handleToggleTodo = (id: Id<\"todos\">, currentCompleted: boolean) => {\n toggleTodoMutation({ id, completed: !currentCompleted });\n };\n\n const handleDeleteTodo = (id: Id<\"todos\">) => {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteTodoMutation({ id }),\n },\n ]);\n };\n\n const isLoading = !todos;\n const completedCount = todos?.filter((t) => t.completed).length || 0;\n const totalCount = todos?.length || 0;\n {{else}}\n const handleAddTodo = () => {\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n Alert.alert(\"Delete Todo\", \"Are you sure you want to delete this todo?\", [\n { text: \"Cancel\", style: \"cancel\" },\n {\n text: \"Delete\",\n style: \"destructive\",\n onPress: () => deleteMutation.mutate({ id }),\n },\n ]);\n };\n\n const isLoading = todos?.isLoading;\n const completedCount = todos?.data?.filter((t) => t.completed).length || 0;\n const totalCount = todos?.data?.length || 0;\n {{/if}}\n\n return (\n <Container>\n <ScrollView className=\"flex-1\" contentContainerClassName=\"p-4\">\n <View className=\"py-4 mb-4\">\n <View className=\"flex-row items-center justify-between\">\n <Text className=\"text-2xl font-semibold text-foreground tracking-tight\">Tasks</Text>\n {totalCount > 0 && (\n <Chip variant=\"secondary\" color=\"accent\" size=\"sm\">\n <Chip.Label>\n {completedCount}/{totalCount}\n </Chip.Label>\n </Chip>\n )}\n </View>\n </View>\n\n <Surface variant=\"secondary\" className=\"mb-4 p-3 rounded-lg\">\n <View className=\"flex-row items-center gap-2\">\n <View className=\"flex-1\">\n <TextField>\n <TextField.Input\n value={newTodoText}\n onChangeText={setNewTodoText}\n placeholder=\"Add a new task...\"\n {{#unless (eq backend \"convex\")}}\n editable={!createMutation.isPending}\n {{/unless}}\n onSubmitEditing={handleAddTodo}\n returnKeyType=\"done\"\n />\n </TextField>\n </View>\n <Button\n isIconOnly\n {{#if (eq backend \"convex\")}}\n variant={!newTodoText.trim() ? \"secondary\" : \"primary\"}\n isDisabled={!newTodoText.trim()}\n {{else}}\n variant={createMutation.isPending || !newTodoText.trim() ? \"secondary\" : \"primary\"}\n isDisabled={createMutation.isPending || !newTodoText.trim()}\n {{/if}}\n onPress={handleAddTodo}\n size=\"sm\"\n >\n {{#if (eq backend \"convex\")}}\n <Ionicons\n name=\"add\"\n size={20}\n color={newTodoText.trim() ? foregroundColor : mutedColor}\n />\n {{else}}\n {createMutation.isPending ? (\n <Spinner size=\"sm\" color=\"default\" />\n ) : (\n <Ionicons\n name=\"add\"\n size={20}\n color={(createMutation.isPending || !newTodoText.trim()) ? mutedColor : foregroundColor}\n />\n )}\n {{/if}}\n </Button>\n </View>\n </Surface>\n\n {{#if (eq backend \"convex\")}}\n {isLoading && (\n <View className=\"items-center justify-center py-12\">\n <Spinner size=\"lg\" />\n <Text className=\"text-muted text-sm mt-3\">Loading tasks...</Text>\n </View>\n )}\n\n {todos && todos.length === 0 && !isLoading && (\n <Surface variant=\"secondary\" className=\"items-center justify-center py-10 rounded-lg\">\n <Ionicons name=\"checkbox-outline\" size={40} color={mutedColor} />\n <Text className=\"text-foreground font-medium mt-3\">No tasks yet</Text>\n <Text className=\"text-muted text-xs mt-1\">Add your first task to get started</Text>\n </Surface>\n )}\n\n {todos && todos.length > 0 && (\n <View className=\"gap-2\">\n {todos.map((todo) => (\n <Surface key={todo._id} variant=\"secondary\" className=\"p-3 rounded-lg\">\n <View className=\"flex-row items-center gap-3\">\n <Checkbox\n isSelected={todo.completed}\n onSelectedChange={() => handleToggleTodo(todo._id, todo.completed)}\n />\n <View className=\"flex-1\">\n <Text className={\\`text-sm \\${todo.completed ? \"text-muted line-through\" : \"text-foreground\"}\\`}>\n {todo.text}\n </Text>\n </View>\n <Button\n isIconOnly\n variant=\"ghost\"\n onPress={() => handleDeleteTodo(todo._id)}\n size=\"sm\"\n >\n <Ionicons name=\"trash-outline\" size={16} color={dangerColor} />\n </Button>\n </View>\n </Surface>\n ))}\n </View>\n )}\n {{else}}\n {isLoading && (\n <View className=\"items-center justify-center py-12\">\n <Spinner size=\"lg\" />\n <Text className=\"text-muted text-sm mt-3\">Loading tasks...</Text>\n </View>\n )}\n\n {todos?.data && todos.data.length === 0 && !isLoading && (\n <Surface variant=\"secondary\" className=\"items-center justify-center py-10 rounded-lg\">\n <Ionicons name=\"checkbox-outline\" size={40} color={mutedColor} />\n <Text className=\"text-foreground font-medium mt-3\">No tasks yet</Text>\n <Text className=\"text-muted text-xs mt-1\">Add your first task to get started</Text>\n </Surface>\n )}\n\n {todos?.data && todos.data.length > 0 && (\n <View className=\"gap-2\">\n {todos.data.map((todo) => (\n <Surface key={todo.id} variant=\"secondary\" className=\"p-3 rounded-lg\">\n <View className=\"flex-row items-center gap-3\">\n <Checkbox\n isSelected={todo.completed}\n onSelectedChange={() => handleToggleTodo(todo.id, todo.completed)}\n />\n <View className=\"flex-1\">\n <Text className={\\`text-sm \\${todo.completed ? \"text-muted line-through\" : \"text-foreground\"}\\`}>\n {todo.text}\n </Text>\n </View>\n <Button\n isIconOnly\n variant=\"ghost\"\n onPress={() => handleDeleteTodo(todo.id)}\n size=\"sm\"\n >\n <Ionicons name=\"trash-outline\" size={16} color={dangerColor} />\n </Button>\n </View>\n </Surface>\n ))}\n </View>\n )}\n {{/if}}\n </ScrollView>\n </Container>\n );\n}`],\n [\"examples/todo/web/solid/src/routes/todos.tsx.hbs\", `import { createFileRoute } from \"@tanstack/solid-router\";\nimport { Loader2, Trash2 } from \"lucide-solid\";\nimport { createSignal, For, Show } from \"solid-js\";\nimport { orpc } from \"@/utils/orpc\";\nimport { useQuery, useMutation } from \"@tanstack/solid-query\";\n\nexport const Route = createFileRoute(\"/todos\")({\n component: TodosRoute,\n});\n\nfunction TodosRoute() {\n const [newTodoText, setNewTodoText] = createSignal(\"\");\n\n const todos = useQuery(() => orpc.todo.getAll.queryOptions());\n\n const createMutation = useMutation(() =>\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n\n const toggleMutation = useMutation(() =>\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n\n const deleteMutation = useMutation(() =>\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n\n const handleAddTodo = (e: Event) => {\n e.preventDefault();\n if (newTodoText().trim()) {\n createMutation.mutate({ text: newTodoText() });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n deleteMutation.mutate({ id });\n };\n\n return (\n <div class=\"mx-auto w-full max-w-md py-10\">\n <div class=\"rounded-lg border p-6 shadow-sm\">\n <div class=\"mb-4\">\n <h2 class=\"text-xl font-semibold\">Todo List</h2>\n <p class=\"text-sm\">Manage your tasks efficiently</p>\n </div>\n <div>\n <form\n onSubmit={handleAddTodo}\n class=\"mb-6 flex items-center space-x-2\"\n >\n <input\n type=\"text\"\n value={newTodoText()}\n onInput={(e) => setNewTodoText(e.currentTarget.value)}\n placeholder=\"Add a new task...\"\n disabled={createMutation.isPending}\n class=\"w-full rounded-md border p-2 text-sm\"\n />\n <button\n type=\"submit\"\n disabled={createMutation.isPending || !newTodoText().trim()}\n class=\"rounded-md bg-blue-600 px-4 py-2 text-sm text-white disabled:opacity-50\"\n >\n <Show when={createMutation.isPending} fallback=\"Add\">\n <Loader2 class=\"h-4 w-4 animate-spin\" />\n </Show>\n </button>\n </form>\n\n <Show when={todos.isLoading}>\n <div class=\"flex justify-center py-4\">\n <Loader2 class=\"h-6 w-6 animate-spin\" />\n </div>\n </Show>\n\n <Show when={!todos.isLoading && todos.data?.length === 0}>\n <p class=\"py-4 text-center\">No todos yet. Add one above!</p>\n </Show>\n\n <Show when={!todos.isLoading}>\n <ul class=\"space-y-2\">\n <For each={todos.data}>\n {(todo) => (\n <li class=\"flex items-center justify-between rounded-md border p-2\">\n <div class=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={todo.completed}\n onChange={() =>\n handleToggleTodo(todo.id, todo.completed)\n }\n id={\\`todo-\\${todo.id}\\`}\n class=\"h-4 w-4\"\n />\n <label\n for={\\`todo-\\${todo.id}\\`}\n class={todo.completed ? \"line-through\" : \"\"}\n >\n {todo.text}\n </label>\n </div>\n <button\n type=\"button\"\n onClick={() => handleDeleteTodo(todo.id)}\n aria-label=\"Delete todo\"\n class=\"ml-2 rounded-md p-1\"\n >\n <Trash2 class=\"h-4 w-4\" />\n </button>\n </li>\n )}\n </For>\n </ul>\n </Show>\n </div>\n </div>\n </div>\n );\n}\n`],\n [\"examples/todo/web/nuxt/app/pages/todos.vue.hbs\", `<script setup lang=\"ts\">\nimport { ref } from 'vue'\n{{#if (eq backend \"convex\")}}\nimport { api } from \"@{{ projectName }}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{ projectName }}/backend/convex/_generated/dataModel\";\nimport { useConvexMutation, useConvexQuery } from \"convex-vue\";\n\nconst { data, error, isPending } = useConvexQuery(api.todos.getAll, {});\n\nconst newTodoText = ref(\"\");\nconst { mutate: createTodo, isPending: isCreatePending } = useConvexMutation(api.todos.create);\n\nconst { mutate: toggleTodo } = useConvexMutation(api.todos.toggle);\nconst { mutate: deleteTodo, error: deleteError } = useConvexMutation(\n api.todos.deleteTodo,\n);\n\nfunction handleAddTodo() {\n const text = newTodoText.value.trim();\n if (!text) return;\n\n createTodo({ text });\n newTodoText.value = \"\";\n}\n\nfunction handleToggleTodo(id: Id<\"todos\">, completed: boolean) {\n toggleTodo({ id, completed: !completed });\n}\n\nfunction handleDeleteTodo(id: Id<\"todos\">) {\n deleteTodo({ id });\n}\n{{else}}\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/vue-query'\n\nconst { $orpc } = useNuxtApp()\n\nconst newTodoText = ref('')\nconst queryClient = useQueryClient()\n\nconst todos = useQuery($orpc.todo.getAll.queryOptions())\n\nconst createMutation = useMutation($orpc.todo.create.mutationOptions({\n onSuccess: () => {\n queryClient.invalidateQueries()\n newTodoText.value = ''\n }\n}))\n\nconst toggleMutation = useMutation($orpc.todo.toggle.mutationOptions({\n onSuccess: () => queryClient.invalidateQueries()\n}))\n\nconst deleteMutation = useMutation($orpc.todo.delete.mutationOptions({\n onSuccess: () => queryClient.invalidateQueries()\n}))\n\nfunction handleAddTodo() {\n if (newTodoText.value.trim()) {\n createMutation.mutate({ text: newTodoText.value })\n }\n}\n\nfunction handleToggleTodo(id: number, completed: boolean) {\n toggleMutation.mutate({ id, completed: !completed })\n}\n\nfunction handleDeleteTodo(id: number) {\n deleteMutation.mutate({ id })\n}\n{{/if}}\n</script>\n\n<template>\n <UContainer class=\"py-8 max-w-md\">\n <UCard>\n <template #header>\n <div>\n <div class=\"text-xl font-bold\">Todo List</div>\n <div class=\"text-muted text-sm\">Manage your tasks efficiently</div>\n </div>\n </template>\n\n <form @submit.prevent=\"handleAddTodo\" class=\"mb-6 flex items-center gap-2\">\n <UInput\n v-model=\"newTodoText\"\n placeholder=\"Add a new task...\"\n autocomplete=\"off\"\n class=\"flex-1\"\n {{#if (eq backend \"convex\")}}\n :disabled=\"isCreatePending\"\n {{/if}}\n />\n <UButton\n type=\"submit\"\n {{#if (eq backend \"convex\")}}\n :loading=\"isCreatePending\"\n :disabled=\"!newTodoText.trim()\"\n {{else}}\n :loading=\"createMutation.isPending.value\"\n {{/if}}\n >\n Add\n </UButton>\n </form>\n\n {{#if (eq backend \"convex\")}}\n <!-- Loading State -->\n <div v-if=\"isPending\" class=\"space-y-2\">\n <USkeleton v-for=\"i in 3\" :key=\"i\" class=\"h-12 w-full\" />\n </div>\n\n <!-- Error State -->\n <UAlert\n v-else-if=\"error || deleteError\"\n color=\"error\"\n icon=\"i-lucide-alert-circle\"\n title=\"Error\"\n :description=\"error?.message || deleteError?.message\"\n />\n\n <!-- Empty State -->\n <UEmpty\n v-else-if=\"data?.length === 0\"\n icon=\"i-lucide-clipboard-list\"\n title=\"No todos yet\"\n description=\"Add your first task above!\"\n />\n\n <!-- Todo List -->\n <ul v-else-if=\"data\" class=\"space-y-2\">\n <li\n v-for=\"todo in data\"\n :key=\"todo._id\"\n class=\"flex items-center justify-between rounded-md border p-3\"\n >\n <div class=\"flex items-center gap-3\">\n <UCheckbox\n :model-value=\"todo.completed\"\n @update:model-value=\"() => handleToggleTodo(todo._id, todo.completed)\"\n :id=\"\\`todo-\\${todo._id}\\`\"\n />\n <label\n :for=\"\\`todo-\\${todo._id}\\`\"\n :class=\"{ 'line-through text-muted': todo.completed }\"\n class=\"cursor-pointer\"\n >\n \\\\{{ todo.text }}\n </label>\n </div>\n <UButton\n color=\"error\"\n variant=\"ghost\"\n size=\"sm\"\n square\n @click=\"handleDeleteTodo(todo._id)\"\n aria-label=\"Delete todo\"\n icon=\"i-lucide-trash-2\"\n />\n </li>\n </ul>\n {{else}}\n <!-- Loading State -->\n <div v-if=\"todos.status.value === 'pending'\" class=\"space-y-2\">\n <USkeleton v-for=\"i in 3\" :key=\"i\" class=\"h-12 w-full\" />\n </div>\n\n <!-- Error State -->\n <UAlert\n v-else-if=\"todos.status.value === 'error'\"\n color=\"error\"\n icon=\"i-lucide-alert-circle\"\n title=\"Failed to load todos\"\n :description=\"todos.error.value?.message\"\n />\n\n <!-- Empty State -->\n <UEmpty\n v-else-if=\"todos.data.value?.length === 0\"\n icon=\"i-lucide-clipboard-list\"\n title=\"No todos yet\"\n description=\"Add your first task above!\"\n />\n\n <!-- Todo List -->\n <ul v-else class=\"space-y-2\">\n <li\n v-for=\"todo in todos.data.value\"\n :key=\"todo.id\"\n class=\"flex items-center justify-between rounded-md border p-3\"\n >\n <div class=\"flex items-center gap-3\">\n <UCheckbox\n :model-value=\"todo.completed\"\n @update:model-value=\"() => handleToggleTodo(todo.id, todo.completed)\"\n :id=\"\\`todo-\\${todo.id}\\`\"\n />\n <label\n :for=\"\\`todo-\\${todo.id}\\`\"\n :class=\"{ 'line-through text-muted': todo.completed }\"\n class=\"cursor-pointer\"\n >\n \\\\{{ todo.text }}\n </label>\n </div>\n <UButton\n color=\"error\"\n variant=\"ghost\"\n size=\"sm\"\n square\n @click=\"handleDeleteTodo(todo.id)\"\n aria-label=\"Delete todo\"\n icon=\"i-lucide-trash-2\"\n />\n </li>\n </ul>\n {{/if}}\n </UCard>\n </UContainer>\n</template>\n`],\n [\"examples/ai/native/unistyles/app/(drawer)/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { Ionicons } from \"@expo/vector-icons\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { useMutation } from \"convex/react\";\nimport React, { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n ActivityIndicator,\n} from \"react-native\";\nimport { StyleSheet, useUnistyles } from \"react-native-unistyles\";\n\nimport { Container } from \"@/components/container\";\n\nfunction MessageContent({\n text,\n isStreaming,\n style,\n}: {\n text: string;\n isStreaming: boolean;\n style: object;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Text style={style}>{visibleText}</Text>;\n}\n\nexport default function AIScreen() {\n const { theme } = useUnistyles();\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const scrollViewRef = useRef<ScrollView>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n const onSubmit = async () => {\n const value = input.trim();\n if (!value || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: value });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Container>\n <KeyboardAvoidingView\n style={styles.container}\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View style={styles.content}>\n <View style={styles.header}>\n <Text style={styles.headerTitle}>AI Chat</Text>\n <Text style={styles.headerSubtitle}>\n Chat with our AI assistant\n </Text>\n </View>\n\n <ScrollView\n ref={scrollViewRef}\n style={styles.messagesContainer}\n showsVerticalScrollIndicator={false}\n >\n {!messages || messages.length === 0 ? (\n <View style={styles.emptyContainer}>\n <Text style={styles.emptyText}>\n Ask me anything to get started!\n </Text>\n </View>\n ) : (\n <View style={styles.messagesWrapper}>\n {messages.map((message: UIMessage) => (\n <View\n key={message.key}\n style={[\n styles.messageContainer,\n message.role === \"user\"\n ? styles.userMessage\n : styles.assistantMessage,\n ]}\n >\n <Text style={styles.messageRole}>\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </Text>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n style={styles.messageContent}\n />\n </View>\n ))}\n {isLoading && !hasStreamingMessage && (\n <View style={[styles.messageContainer, styles.assistantMessage]}>\n <Text style={styles.messageRole}>AI Assistant</Text>\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"small\" color={theme.colors.primary} />\n <Text style={styles.loadingText}>Thinking...</Text>\n </View>\n </View>\n )}\n </View>\n )}\n </ScrollView>\n\n <View style={styles.inputSection}>\n <View style={styles.inputContainer}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder=\"Type your message...\"\n placeholderTextColor={theme.colors.border}\n style={styles.textInput}\n onSubmitEditing={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n editable={!isLoading}\n autoFocus={true}\n />\n <TouchableOpacity\n onPress={onSubmit}\n disabled={!input.trim() || isLoading}\n style={[\n styles.sendButton,\n (!input.trim() || isLoading) && styles.sendButtonDisabled,\n ]}\n >\n <Ionicons\n name=\"send\"\n size={20}\n color={\n input.trim() && !isLoading\n ? theme.colors.background\n : theme.colors.border\n }\n />\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n flex: 1,\n },\n content: {\n flex: 1,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.lg,\n },\n header: {\n marginBottom: theme.spacing.lg,\n },\n headerTitle: {\n fontSize: 28,\n fontWeight: \"bold\",\n color: theme.colors.typography,\n marginBottom: theme.spacing.sm,\n },\n headerSubtitle: {\n fontSize: 16,\n color: theme.colors.typography,\n },\n messagesContainer: {\n flex: 1,\n marginBottom: theme.spacing.md,\n },\n emptyContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n emptyText: {\n textAlign: \"center\",\n color: theme.colors.typography,\n fontSize: 18,\n },\n messagesWrapper: {\n gap: theme.spacing.md,\n },\n messageContainer: {\n padding: theme.spacing.md,\n borderRadius: 8,\n },\n userMessage: {\n backgroundColor: theme.colors.primary + \"20\",\n marginLeft: theme.spacing.xl,\n alignSelf: \"flex-end\",\n },\n assistantMessage: {\n backgroundColor: theme.colors.background,\n marginRight: theme.spacing.xl,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n messageRole: {\n fontSize: 14,\n fontWeight: \"600\",\n marginBottom: theme.spacing.sm,\n color: theme.colors.typography,\n },\n messageContent: {\n color: theme.colors.typography,\n lineHeight: 20,\n },\n loadingContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: theme.spacing.sm,\n },\n loadingText: {\n color: theme.colors.typography,\n opacity: 0.7,\n },\n inputSection: {\n borderTopWidth: 1,\n borderTopColor: theme.colors.border,\n paddingTop: theme.spacing.md,\n },\n inputContainer: {\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: theme.spacing.sm,\n },\n textInput: {\n flex: 1,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: 8,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.sm,\n color: theme.colors.typography,\n backgroundColor: theme.colors.background,\n fontSize: 16,\n minHeight: 40,\n maxHeight: 120,\n },\n sendButton: {\n backgroundColor: theme.colors.primary,\n padding: theme.spacing.sm,\n borderRadius: 8,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n sendButtonDisabled: {\n backgroundColor: theme.colors.border,\n },\n}));\n{{else}}\nimport React, { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n} from \"react-native\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { fetch as expoFetch } from \"expo/fetch\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { StyleSheet, useUnistyles } from \"react-native-unistyles\";\nimport { Container } from \"@/components/container\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nconst generateAPIUrl = (relativePath: string) => {\n const serverUrl = env.EXPO_PUBLIC_SERVER_URL;\n if (!serverUrl) {\n throw new Error(\n \"EXPO_PUBLIC_SERVER_URL environment variable is not defined\"\n );\n }\n const path = relativePath.startsWith(\"/\") ? relativePath : \\`/\\${relativePath}\\`;\n return serverUrl.concat(path);\n};\n\nexport default function AIScreen() {\n const { theme } = useUnistyles();\n const [input, setInput] = useState(\"\");\n const { messages, error, sendMessage } = useChat({\n transport: new DefaultChatTransport({\n fetch: expoFetch as unknown as typeof globalThis.fetch,\n api: generateAPIUrl(\"/ai\"),\n }),\n onError: (error) => console.error(error, \"AI Chat Error\"),\n });\n\n const scrollViewRef = useRef<ScrollView>(null);\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n const onSubmit = () => {\n const value = input.trim();\n if (value) {\n sendMessage({ text: value });\n setInput(\"\");\n }\n };\n\n if (error) {\n return (\n <Container>\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>Error: {error.message}</Text>\n <Text style={styles.errorSubtext}>\n Please check your connection and try again.\n </Text>\n </View>\n </Container>\n );\n }\n\n return (\n <Container>\n <KeyboardAvoidingView\n style={styles.container}\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View style={styles.content}>\n <View style={styles.header}>\n <Text style={styles.headerTitle}>AI Chat</Text>\n <Text style={styles.headerSubtitle}>\n Chat with our AI assistant\n </Text>\n </View>\n\n <ScrollView\n ref={scrollViewRef}\n style={styles.messagesContainer}\n showsVerticalScrollIndicator={false}\n >\n {messages.length === 0 ? (\n <View style={styles.emptyContainer}>\n <Text style={styles.emptyText}>\n Ask me anything to get started!\n </Text>\n </View>\n ) : (\n <View style={styles.messagesWrapper}>\n {messages.map((message) => (\n <View\n key={message.id}\n style={[\n styles.messageContainer,\n message.role === \"user\"\n ? styles.userMessage\n : styles.assistantMessage,\n ]}\n >\n <Text style={styles.messageRole}>\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </Text>\n <View style={styles.messageContentWrapper}>\n {message.parts.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n style={styles.messageContent}\n >\n {part.text}\n </Text>\n );\n }\n return (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n style={styles.messageContent}\n >\n {JSON.stringify(part)}\n </Text>\n );\n })}\n </View>\n </View>\n ))}\n </View>\n )}\n </ScrollView>\n\n <View style={styles.inputSection}>\n <View style={styles.inputContainer}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder=\"Type your message...\"\n placeholderTextColor={theme.colors.border}\n style={styles.textInput}\n onSubmitEditing={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n autoFocus={true}\n />\n <TouchableOpacity\n onPress={onSubmit}\n disabled={!input.trim()}\n style={[\n styles.sendButton,\n !input.trim() && styles.sendButtonDisabled,\n ]}\n >\n <Ionicons\n name=\"send\"\n size={20}\n color={\n input.trim()\n ? theme.colors.background\n : theme.colors.border\n }\n />\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n container: {\n flex: 1,\n },\n content: {\n flex: 1,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.lg,\n },\n errorContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingHorizontal: theme.spacing.md,\n },\n errorText: {\n color: theme.colors.destructive,\n textAlign: \"center\",\n fontSize: 18,\n marginBottom: theme.spacing.md,\n },\n errorSubtext: {\n color: theme.colors.typography,\n textAlign: \"center\",\n fontSize: 16,\n },\n header: {\n marginBottom: theme.spacing.lg,\n },\n headerTitle: {\n fontSize: 28,\n fontWeight: \"bold\",\n color: theme.colors.typography,\n marginBottom: theme.spacing.sm,\n },\n headerSubtitle: {\n fontSize: 16,\n color: theme.colors.typography,\n },\n messagesContainer: {\n flex: 1,\n marginBottom: theme.spacing.md,\n },\n emptyContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n emptyText: {\n textAlign: \"center\",\n color: theme.colors.typography,\n fontSize: 18,\n },\n messagesWrapper: {\n gap: theme.spacing.md,\n },\n messageContainer: {\n padding: theme.spacing.md,\n borderRadius: 8,\n },\n userMessage: {\n backgroundColor: theme.colors.primary + \"20\",\n marginLeft: theme.spacing.xl,\n alignSelf: \"flex-end\",\n },\n assistantMessage: {\n backgroundColor: theme.colors.background,\n marginRight: theme.spacing.xl,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n messageRole: {\n fontSize: 14,\n fontWeight: \"600\",\n marginBottom: theme.spacing.sm,\n color: theme.colors.typography,\n },\n messageContentWrapper: {\n gap: theme.spacing.xs,\n },\n messageContent: {\n color: theme.colors.typography,\n lineHeight: 20,\n },\n inputSection: {\n borderTopWidth: 1,\n borderTopColor: theme.colors.border,\n paddingTop: theme.spacing.md,\n },\n inputContainer: {\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: theme.spacing.sm,\n },\n textInput: {\n flex: 1,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: 8,\n paddingHorizontal: theme.spacing.md,\n paddingVertical: theme.spacing.sm,\n color: theme.colors.typography,\n backgroundColor: theme.colors.background,\n fontSize: 16,\n minHeight: 40,\n maxHeight: 120,\n },\n sendButton: {\n backgroundColor: theme.colors.primary,\n padding: theme.spacing.sm,\n borderRadius: 8,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n sendButtonDisabled: {\n backgroundColor: theme.colors.border,\n },\n}));\n{{/if}}\n`],\n [\"examples/ai/native/bare/app/(drawer)/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { Ionicons } from \"@expo/vector-icons\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { useMutation } from \"convex/react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n StyleSheet,\n ActivityIndicator,\n} from \"react-native\";\n\nimport { Container } from \"@/components/container\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\n\nfunction MessageContent({\n text,\n isStreaming,\n textColor,\n}: {\n text: string;\n isStreaming: boolean;\n textColor: string;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Text style={[styles.messageText, { color: textColor }]}>{visibleText}</Text>;\n}\n\nexport default function AIScreen() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const scrollViewRef = useRef<ScrollView>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n async function onSubmit() {\n const value = input.trim();\n if (!value || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: value });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return (\n <Container>\n <KeyboardAvoidingView\n style={styles.container}\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View style={styles.content}>\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: theme.text }]}>\n AI Chat\n </Text>\n <Text style={[styles.headerSubtitle, { color: theme.text, opacity: 0.7 }]}>\n Chat with our AI assistant\n </Text>\n </View>\n <ScrollView\n ref={scrollViewRef}\n style={styles.scrollView}\n showsVerticalScrollIndicator={false}\n >\n {!messages || messages.length === 0 ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: theme.text, opacity: 0.7 }]}>\n Ask me anything to get started!\n </Text>\n </View>\n ) : (\n <View style={styles.messagesList}>\n {messages.map((message: UIMessage) => (\n <View\n key={message.key}\n style={[\n styles.messageCard,\n {\n backgroundColor: message.role === \"user\"\n ? theme.primary + \"20\"\n : theme.card,\n borderColor: theme.border,\n alignSelf: message.role === \"user\" ? \"flex-end\" : \"flex-start\",\n marginLeft: message.role === \"user\" ? 32 : 0,\n marginRight: message.role === \"user\" ? 0 : 32,\n },\n ]}\n >\n <Text style={[styles.messageRole, { color: theme.text }]}>\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </Text>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n textColor={theme.text}\n />\n </View>\n ))}\n {isLoading && !hasStreamingMessage && (\n <View\n style={[\n styles.messageCard,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n alignSelf: \"flex-start\",\n marginRight: 32,\n },\n ]}\n >\n <Text style={[styles.messageRole, { color: theme.text }]}>\n AI Assistant\n </Text>\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"small\" color={theme.primary} />\n <Text style={[styles.loadingText, { color: theme.text, opacity: 0.7 }]}>\n Thinking...\n </Text>\n </View>\n </View>\n )}\n </View>\n )}\n </ScrollView>\n <View style={[styles.inputContainer, { borderTopColor: theme.border }]}>\n <View style={styles.inputRow}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder=\"Type your message...\"\n placeholderTextColor={theme.text}\n style={[\n styles.input,\n {\n color: theme.text,\n borderColor: theme.border,\n backgroundColor: theme.background,\n },\n ]}\n onSubmitEditing={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n editable={!isLoading}\n autoFocus={true}\n multiline\n />\n <TouchableOpacity\n onPress={onSubmit}\n disabled={!input.trim() || isLoading}\n style={[\n styles.sendButton,\n {\n backgroundColor: input.trim() && !isLoading ? theme.primary : theme.border,\n opacity: input.trim() && !isLoading ? 1 : 0.5,\n },\n ]}\n >\n <Ionicons\n name=\"send\"\n size={20}\n color=\"#ffffff\"\n />\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n content: {\n flex: 1,\n padding: 16,\n },\n header: {\n marginBottom: 16,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: \"bold\",\n marginBottom: 4,\n },\n headerSubtitle: {\n fontSize: 14,\n },\n scrollView: {\n flex: 1,\n marginBottom: 16,\n },\n emptyContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n emptyText: {\n fontSize: 16,\n textAlign: \"center\",\n },\n messagesList: {\n gap: 8,\n paddingBottom: 16,\n },\n messageCard: {\n borderWidth: 1,\n padding: 12,\n maxWidth: \"80%\",\n },\n messageRole: {\n fontSize: 12,\n fontWeight: \"bold\",\n marginBottom: 4,\n },\n messageText: {\n fontSize: 14,\n lineHeight: 20,\n },\n loadingContainer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n },\n loadingText: {\n fontSize: 14,\n },\n inputContainer: {\n borderTopWidth: 1,\n paddingTop: 12,\n },\n inputRow: {\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n },\n input: {\n flex: 1,\n borderWidth: 1,\n padding: 8,\n fontSize: 14,\n minHeight: 36,\n maxHeight: 100,\n },\n sendButton: {\n padding: 8,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n});\n{{else}}\nimport { useRef, useEffect, useState } from \"react\";\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ScrollView,\n KeyboardAvoidingView,\n Platform,\n StyleSheet,\n} from \"react-native\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { fetch as expoFetch } from \"expo/fetch\";\nimport { Ionicons } from \"@expo/vector-icons\";\nimport { Container } from \"@/components/container\";\nimport { useColorScheme } from \"@/lib/use-color-scheme\";\nimport { NAV_THEME } from \"@/lib/constants\";\nimport { env } from \"@{{projectName}}/env/native\";\n\nconst generateAPIUrl = (relativePath: string) => {\n const serverUrl = env.EXPO_PUBLIC_SERVER_URL;\n if (!serverUrl) {\n throw new Error(\n \"EXPO_PUBLIC_SERVER_URL environment variable is not defined\"\n );\n }\n const path = relativePath.startsWith(\"/\") ? relativePath : \\`/\\${relativePath}\\`;\n return serverUrl.concat(path);\n};\n\nexport default function AIScreen() {\n const { colorScheme } = useColorScheme();\n const theme = colorScheme === \"dark\" ? NAV_THEME.dark : NAV_THEME.light;\n const [input, setInput] = useState(\"\");\n const { messages, error, sendMessage } = useChat({\n transport: new DefaultChatTransport({\n fetch: expoFetch as unknown as typeof globalThis.fetch,\n api: generateAPIUrl(\"/ai\"),\n }),\n onError: (error) => console.error(error, \"AI Chat Error\"),\n });\n const scrollViewRef = useRef<ScrollView>(null);\n\n useEffect(() => {\n scrollViewRef.current?.scrollToEnd({ animated: true });\n }, [messages]);\n\n function onSubmit() {\n const value = input.trim();\n if (value) {\n sendMessage({ text: value });\n setInput(\"\");\n }\n }\n\n if (error) {\n return (\n <Container>\n <View style={styles.errorContainer}>\n <View style={[styles.errorCard, { backgroundColor: theme.notification + \"20\", borderColor: theme.notification }]}>\n <Text style={[styles.errorTitle, { color: theme.notification }]}>\n Error: {error.message}\n </Text>\n <Text style={[styles.errorText, { color: theme.text, opacity: 0.7 }]}>\n Please check your connection and try again.\n </Text>\n </View>\n </View>\n </Container>\n );\n }\n\n return (\n <Container>\n <KeyboardAvoidingView\n style={styles.container}\n behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n >\n <View style={styles.content}>\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: theme.text }]}>\n AI Chat\n </Text>\n <Text style={[styles.headerSubtitle, { color: theme.text, opacity: 0.7 }]}>\n Chat with our AI assistant\n </Text>\n </View>\n <ScrollView\n ref={scrollViewRef}\n style={styles.scrollView}\n showsVerticalScrollIndicator={false}\n >\n {messages.length === 0 ? (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: theme.text, opacity: 0.7 }]}>\n Ask me anything to get started!\n </Text>\n </View>\n ) : (\n <View style={styles.messagesList}>\n {messages.map((message) => (\n <View\n key={message.id}\n style={[\n styles.messageCard,\n {\n backgroundColor: message.role === \"user\"\n ? theme.primary + \"20\"\n : theme.card,\n borderColor: theme.border,\n alignSelf: message.role === \"user\" ? \"flex-end\" : \"flex-start\",\n marginLeft: message.role === \"user\" ? 32 : 0,\n marginRight: message.role === \"user\" ? 0 : 32,\n },\n ]}\n >\n <Text style={[styles.messageRole, { color: theme.text }]}>\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </Text>\n <View style={styles.messageParts}>\n {message.parts.map((part, i) =>\n part.type === \"text\" ? (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n style={[styles.messageText, { color: theme.text }]}\n >\n {part.text}\n </Text>\n ) : (\n <Text\n key={\\`\\${message.id}-\\${i}\\`}\n style={[styles.messageText, { color: theme.text }]}\n >\n {JSON.stringify(part)}\n </Text>\n )\n )}\n </View>\n </View>\n ))}\n </View>\n )}\n </ScrollView>\n <View style={[styles.inputContainer, { borderTopColor: theme.border }]}>\n <View style={styles.inputRow}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder=\"Type your message...\"\n placeholderTextColor={theme.text}\n style={[\n styles.input,\n {\n color: theme.text,\n borderColor: theme.border,\n backgroundColor: theme.background,\n },\n ]}\n onSubmitEditing={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n autoFocus={true}\n multiline\n />\n <TouchableOpacity\n onPress={onSubmit}\n disabled={!input.trim()}\n style={[\n styles.sendButton,\n {\n backgroundColor: input.trim() ? theme.primary : theme.border,\n opacity: input.trim() ? 1 : 0.5,\n },\n ]}\n >\n <Ionicons\n name=\"send\"\n size={20}\n color=\"#ffffff\"\n />\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Container>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n content: {\n flex: 1,\n padding: 16,\n },\n header: {\n marginBottom: 16,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: \"bold\",\n marginBottom: 4,\n },\n headerSubtitle: {\n fontSize: 14,\n },\n scrollView: {\n flex: 1,\n marginBottom: 16,\n },\n emptyContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n emptyText: {\n fontSize: 16,\n textAlign: \"center\",\n },\n messagesList: {\n gap: 8,\n paddingBottom: 16,\n },\n messageCard: {\n borderWidth: 1,\n padding: 12,\n maxWidth: \"80%\",\n },\n messageRole: {\n fontSize: 12,\n fontWeight: \"bold\",\n marginBottom: 4,\n },\n messageParts: {\n gap: 4,\n },\n messageText: {\n fontSize: 14,\n lineHeight: 20,\n },\n inputContainer: {\n borderTopWidth: 1,\n paddingTop: 12,\n },\n inputRow: {\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n },\n input: {\n flex: 1,\n borderWidth: 1,\n padding: 8,\n fontSize: 14,\n minHeight: 36,\n maxHeight: 100,\n },\n sendButton: {\n padding: 8,\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n errorContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 16,\n },\n errorCard: {\n borderWidth: 1,\n padding: 16,\n },\n errorTitle: {\n fontSize: 16,\n fontWeight: \"bold\",\n marginBottom: 8,\n textAlign: \"center\",\n },\n errorText: {\n fontSize: 14,\n textAlign: \"center\",\n },\n});\n{{/if}}\n`],\n [\"api/trpc/web/react/base/src/utils/trpc.ts.hbs\", `{{#if (includes frontend 'next')}}\nimport { QueryCache, QueryClient } from '@tanstack/react-query';\nimport { createTRPCClient, httpBatchLink } from '@trpc/client';\nimport { createTRPCOptionsProxy } from '@trpc/tanstack-react-query';\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nimport { toast } from 'sonner';\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error, query) => {\n\t\t\ttoast.error(error.message, {\n\t\t\t\taction: {\n\t\t\t\t\tlabel: \"retry\",\n\t\t\t\t\tonClick: query.invalidate,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t}),\n});\n\nconst trpcClient = createTRPCClient<AppRouter>({\n\tlinks: [\n\t\thttpBatchLink({\n{{#if (eq backend \"self\")}}\n\t\t\turl: \"/api/trpc\",\n{{else}}\n\t\t\turl: \\`\\${env.NEXT_PUBLIC_SERVER_URL}/trpc\\`,\n{{/if}}\n{{#if (eq auth \"better-auth\")}}\n\t\t\tfetch(url, options) {\n\t\t\t\treturn fetch(url, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t});\n\t\t\t},\n{{/if}}\n\t\t}),\n\t],\n})\n\nexport const trpc = createTRPCOptionsProxy<AppRouter>({\n\tclient: trpcClient,\n\tqueryClient,\n});\n\n{{else if (includes frontend 'tanstack-start')}}\nimport { createTRPCContext } from \"@trpc/tanstack-react-query\";\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\n\nexport const { TRPCProvider, useTRPC, useTRPCClient } =\n\tcreateTRPCContext<AppRouter>();\n\n{{else}}\nimport type { AppRouter } from \"@{{projectName}}/api/routers/index\";\nimport { QueryCache, QueryClient } from \"@tanstack/react-query\";\nimport { createTRPCClient, httpBatchLink } from \"@trpc/client\";\nimport { createTRPCOptionsProxy } from \"@trpc/tanstack-react-query\";\nimport { toast } from \"sonner\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const queryClient = new QueryClient({\n\tqueryCache: new QueryCache({\n\t\tonError: (error, query) => {\n\t\t\ttoast.error(error.message, {\n\t\t\t\taction: {\n\t\t\t\t\tlabel: \"retry\",\n\t\t\t\t\tonClick: query.invalidate,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t}),\n});\n\nexport const trpcClient = createTRPCClient<AppRouter>({\n\tlinks: [\n\t\thttpBatchLink({\n\t\t\turl: \\`\\${env.VITE_SERVER_URL}/trpc\\`,\n{{#if (eq auth \"better-auth\")}}\n\t\t\tfetch(url, options) {\n\t\t\t\treturn fetch(url, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t});\n\t\t\t},\n{{/if}}\n\t\t}),\n\t],\n});\n\nexport const trpc = createTRPCOptionsProxy<AppRouter>({\n\tclient: trpcClient,\n\tqueryClient,\n});\n{{/if}}\n`],\n [\"auth/better-auth/web/react/tanstack-router/src/components/user-menu.tsx.hbs\", `import { Link, useNavigate } from \"@tanstack/react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\n\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\nexport default function UserMenu() {\n const navigate = useNavigate();\n const { data: session, isPending } = authClient.useSession();\n\n if (isPending) {\n return <Skeleton className=\"h-9 w-24\" />;\n }\n\n if (!session) {\n return (\n <Link to=\"/login\">\n <Button variant=\"outline\">Sign In</Button>\n </Link>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {session.user.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{session.user.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n navigate({\n to: \"/\",\n });\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-router/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignUpForm({ onSwitchToSignIn }: { onSwitchToSignIn: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-router/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignInForm({ onSwitchToSignUp }: { onSwitchToSignUp: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-router/src/routes/dashboard.tsx.hbs\", `{{#if (eq payments \"polar\")}}\nimport { Button } from \"@/components/ui/button\";\n{{/if}}\nimport { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{#if ( or (eq api \"orpc\") (eq api \"trpc\"))}}\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\nimport { createFileRoute, redirect } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n\tcomponent: RouteComponent,\n\tbeforeLoad: async () => {\n\t\tconst session = await authClient.getSession();\n\t\tif (!session.data) {\n\t\t\tredirect({\n\t\t\t\tto: \"/login\",\n\t\t\t\tthrow: true\n\t\t\t});\n\t\t}\n\t\t{{#if (eq payments \"polar\")}}\n\t\tconst {data: customerState} = await authClient.customer.state()\n\t\treturn { session, customerState };\n\t\t{{else}}\n\t\treturn { session };\n\t\t{{/if}}\n\t}\n});\n\nfunction RouteComponent() {\n\tconst { session{{#if (eq payments \"polar\")}}, customerState{{/if}} } = Route.useRouteContext();\n\n\t{{#if (eq api \"orpc\")}}\n\tconst privateData = useQuery(orpc.privateData.queryOptions());\n\t{{/if}}\n\t{{#if (eq api \"trpc\")}}\n\tconst privateData = useQuery(trpc.privateData.queryOptions());\n\t{{/if}}\n\n\t{{#if (eq payments \"polar\")}}\n\tconst hasProSubscription = customerState?.activeSubscriptions?.length! > 0\n console.log(\"Active subscriptions:\", customerState?.activeSubscriptions)\n\t{{/if}}\n\n\treturn (\n\t\t<div>\n\t\t\t<h1>Dashboard</h1>\n\t\t\t<p>Welcome {session.data?.user.name}</p>\n\t\t\t{{#if ( or (eq api \"orpc\") (eq api \"trpc\"))}}\n\t\t\t<p>API: {privateData.data?.message}</p>\n\t\t\t{{/if}}\n\t\t\t{{#if (eq payments \"polar\")}}\n\t\t\t<p>Plan: {hasProSubscription ? \"Pro\" : \"Free\"}</p>\n\t\t\t{hasProSubscription ? (\n\t\t\t\t<Button onClick={async () => await authClient.customer.portal()}>\n\t\t\t\t\tManage Subscription\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<Button onClick={async () => await authClient.checkout({ slug: \"pro\" })}>\n\t\t\t\t\tUpgrade to Pro\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t\t{{/if}}\n\t\t</div>\n\t);\n}\n`],\n [\"auth/better-auth/web/react/tanstack-router/src/routes/login.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useState } from \"react\";\n\nexport const Route = createFileRoute(\"/login\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [showSignIn, setShowSignIn] = useState(false);\n\n return showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n );\n}\n`],\n [\"auth/better-auth/web/react/base/src/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/react\";\n{{#if (eq payments \"polar\")}}\nimport { polarClient } from \"@polar-sh/better-auth\";\n{{/if}}\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n\nexport const authClient = createAuthClient({\n{{#unless (eq backend \"self\")}}\n\tbaseURL: env.{{#if (includes frontend \"next\")}}NEXT_PUBLIC_SERVER_URL{{else}}VITE_SERVER_URL{{/if}},\n{{/unless}}\n{{#if (eq payments \"polar\")}}\n\tplugins: [polarClient()]\n{{/if}}\n});\n`],\n [\"auth/better-auth/web/svelte/src/routes/dashboard/+page.svelte.hbs\", `<script lang=\"ts\">\n\timport { goto } from '$app/navigation';\n\timport { authClient } from '$lib/auth-client';\n\t{{#if (eq api \"orpc\")}}\n\timport { orpc } from '$lib/orpc';\n\timport { createQuery } from '@tanstack/svelte-query';\n\t{{/if}}\n\t{{#if (eq payments \"polar\")}}\n\tlet customerState = $state<{ activeSubscriptions?: unknown[] } | null>(null);\n\t{{/if}}\n\n\tconst sessionQuery = authClient.useSession();\n\n\t{{#if (eq api \"orpc\")}}\n\tconst privateDataQuery = createQuery(orpc.privateData.queryOptions());\n\t{{/if}}\n\n\t$effect(() => {\n\t\tif (!$sessionQuery.isPending && !$sessionQuery.data) {\n\t\t\tgoto('/login');\n\t\t}\n\t});\n\n\t{{#if (eq payments \"polar\")}}\n\t$effect(() => {\n\t\tif ($sessionQuery.data) {\n\t\t\tauthClient.customer.state().then(({ data }) => {\n\t\t\t\tcustomerState = data;\n\t\t\t});\n\t\t}\n\t});\n\t{{/if}}\n</script>\n\n{#if $sessionQuery.isPending}\n\t<div>Loading...</div>\n{:else if !$sessionQuery.data}\n\t<div>Redirecting to login...</div>\n{:else}\n\t<div>\n\t\t<h1>Dashboard</h1>\n\t\t<p>Welcome {$sessionQuery.data.user.name}</p>\n\t\t{{#if (eq api \"orpc\")}}\n\t\t<p>API: {$privateDataQuery.data?.message}</p>\n\t\t{{/if}}\n\t\t{{#if (eq payments \"polar\")}}\n\t\t<p>Plan: {customerState?.activeSubscriptions?.length > 0 ? \"Pro\" : \"Free\"}</p>\n\t\t{#if customerState?.activeSubscriptions?.length > 0}\n\t\t\t<button onclick={async () => await authClient.customer.portal()}>\n\t\t\t\tManage Subscription\n\t\t\t</button>\n\t\t{:else}\n\t\t\t<button onclick={async () => await authClient.checkout({ slug: \"pro\" })}>\n\t\t\t\tUpgrade to Pro\n\t\t\t</button>\n\t\t{/if}\n\t\t{{/if}}\n\t</div>\n{/if}\n`],\n [\"auth/better-auth/web/svelte/src/routes/login/+page.svelte.hbs\", `<script lang=\"ts\">\n\timport SignInForm from '../../components/SignInForm.svelte';\n\timport SignUpForm from '../../components/SignUpForm.svelte';\n\n\tlet showSignIn = $state(true);\n</script>\n\n{#if showSignIn}\n\t<SignInForm switchToSignUp={() => showSignIn = false} />\n{:else}\n\t<SignUpForm switchToSignIn={() => showSignIn = true} />\n{/if}\n`],\n [\"auth/better-auth/web/react/next/src/components/user-menu.tsx.hbs\", `import Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\n\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\nexport default function UserMenu() {\n const router = useRouter();\n const { data: session, isPending } = authClient.useSession();\n\n if (isPending) {\n return <Skeleton className=\"h-9 w-24\" />;\n }\n\n if (!session) {\n return (\n <Link href=\"/login\">\n <Button variant=\"outline\">Sign In</Button>\n </Link>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {session.user.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{session.user.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n router.push(\"/\");\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/web/react/next/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { useRouter } from \"next/navigation\";\n\nexport default function SignUpForm({\n onSwitchToSignIn,\n}: {\n onSwitchToSignIn: () => void;\n}) {\n const router = useRouter();\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n router.push(\"/dashboard\");\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/next/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { useRouter } from \"next/navigation\";\n\nexport default function SignInForm({\n onSwitchToSignUp,\n}: {\n onSwitchToSignUp: () => void;\n}) {\n const router = useRouter()\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n router.push(\"/dashboard\")\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/react-router/src/components/user-menu.tsx.hbs\", `import { Link, useNavigate } from \"react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\n\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\nexport default function UserMenu() {\n const navigate = useNavigate();\n const { data: session, isPending } = authClient.useSession();\n\n if (isPending) {\n return <Skeleton className=\"h-9 w-24\" />;\n }\n\n if (!session) {\n return (\n <Link to=\"/login\">\n <Button variant=\"outline\">Sign In</Button>\n </Link>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {session.user.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{session.user.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n navigate(\"/\");\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/web/react/react-router/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignUpForm({\n onSwitchToSignIn,\n}: {\n onSwitchToSignIn: () => void;\n}) {\n const navigate = useNavigate();\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate(\"/dashboard\");\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n }\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/react-router/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignInForm({\n onSwitchToSignUp,\n}: {\n onSwitchToSignUp: () => void;\n}) {\n const navigate = useNavigate();\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate(\"/dashboard\");\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n }\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"payments/polar/web/svelte/src/routes/success/+page.svelte.hbs\", `<script lang=\"ts\">\n\timport { page } from '$app/state';\n\t\n\tconst checkout_id = $derived(page.url.searchParams.get('checkout_id'));\n</script>\n\n<div class=\"container mx-auto px-4 py-8\">\n\t<h1>Payment Successful!</h1>\n\t{#if checkout_id}\n\t\t<p>Checkout ID: {checkout_id}</p>\n\t{/if}\n</div>\n`],\n [\"addons/pwa/apps/web/next/src/app/manifest.ts.hbs\", `import type { MetadataRoute } from \"next\";\n\nexport default function manifest(): MetadataRoute.Manifest {\n\treturn {\n\t\tname: \"{{projectName}}\",\n\t\tshort_name: \"{{projectName}}\",\n\t\tdescription:\n\t\t\t\"my pwa app\",\n\t\tstart_url: \"/new\",\n\t\tdisplay: \"standalone\",\n\t\tbackground_color: \"#ffffff\",\n\t\ttheme_color: \"#000000\",\n\t\ticons: [\n\t\t\t{\n\t\t\t\tsrc: \"/favicon/web-app-manifest-192x192.png\",\n\t\t\t\tsizes: \"192x192\",\n\t\t\t\ttype: \"image/png\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tsrc: \"/favicon/web-app-manifest-512x512.png\",\n\t\t\t\tsizes: \"512x512\",\n\t\t\t\ttype: \"image/png\",\n\t\t\t},\n\t\t],\n\t};\n}\n`],\n [\"auth/better-auth/web/react/react-router/src/routes/dashboard.tsx.hbs\", `{{#if (eq payments \"polar\")}}\nimport { Button } from \"@/components/ui/button\";\n{{/if}}\nimport { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n{{#if ( or (eq api \"orpc\") (eq api \"trpc\"))}}\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\nimport { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nexport default function Dashboard() {\n const { data: session, isPending } = authClient.useSession();\n const navigate = useNavigate();\n {{#if (eq payments \"polar\")}}\n const [customerState, setCustomerState] = useState<any>(null);\n {{/if}}\n\n {{#if (eq api \"orpc\")}}\n const privateData = useQuery(orpc.privateData.queryOptions());\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const privateData = useQuery(trpc.privateData.queryOptions());\n {{/if}}\n\n useEffect(() => {\n if (!session && !isPending) {\n navigate(\"/login\");\n }\n }, [session, isPending, navigate]);\n\n {{#if (eq payments \"polar\")}}\n useEffect(() => {\n async function fetchCustomerState() {\n if (session) {\n const { data } = await authClient.customer.state();\n setCustomerState(data);\n }\n }\n\n fetchCustomerState();\n }, [session]);\n {{/if}}\n\n if (isPending) {\n return <div>Loading...</div>;\n }\n\n {{#if (eq payments \"polar\")}}\n const hasProSubscription = customerState?.activeSubscriptions?.length! > 0;\n console.log(\"Active subscriptions:\", customerState?.activeSubscriptions);\n {{/if}}\n\n return (\n <div>\n <h1>Dashboard</h1>\n <p>Welcome {session?.user.name}</p>\n {{#if ( or (eq api \"orpc\") (eq api \"trpc\"))}}\n <p>API: {privateData.data?.message}</p>\n {{/if}}\n {{#if (eq payments \"polar\")}}\n <p>Plan: {hasProSubscription ? \"Pro\" : \"Free\"}</p>\n {hasProSubscription ? (\n <Button onClick={async () => await authClient.customer.portal()}>\n Manage Subscription\n </Button>\n ) : (\n <Button onClick={async () => await authClient.checkout({ slug: \"pro\" })}>\n Upgrade to Pro\n </Button>\n )}\n {{/if}}\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/react-router/src/routes/login.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport { useState } from \"react\";\n\nexport default function Login() {\n const [showSignIn, setShowSignIn] = useState(false);\n\n return showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n );\n}\n`],\n [\"addons/pwa/apps/web/next/public/favicon/favicon-96x96.png\", `[Binary file]`],\n [\"addons/pwa/apps/web/next/public/favicon/web-app-manifest-512x512.png\", `[Binary file]`],\n [\"addons/pwa/apps/web/next/public/favicon/web-app-manifest-192x192.png\", `[Binary file]`],\n [\"addons/pwa/apps/web/next/public/favicon/favicon.svg\", `[Binary file]`],\n [\"addons/pwa/apps/web/next/public/favicon/apple-touch-icon.png\", `[Binary file]`],\n [\"addons/pwa/apps/web/next/public/favicon/site.webmanifest.hbs\", `{\n\t\"name\": \"{{projectName}}\",\n\t\"short_name\": \"{{projectName}}\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"/web-app-manifest-192x192.png\",\n\t\t\t\"sizes\": \"192x192\",\n\t\t\t\"type\": \"image/png\",\n\t\t\t\"purpose\": \"maskable\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"/web-app-manifest-512x512.png\",\n\t\t\t\"sizes\": \"512x512\",\n\t\t\t\"type\": \"image/png\",\n\t\t\t\"purpose\": \"maskable\"\n\t\t}\n\t],\n\t\"theme_color\": \"#ffffff\",\n\t\"background_color\": \"#ffffff\",\n\t\"display\": \"standalone\"\n}\n`],\n [\"payments/polar/web/react/tanstack-start/src/routes/success.tsx.hbs\", `import { createFileRoute, useSearch } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/success\")({\n\tcomponent: SuccessPage,\n\tvalidateSearch: (search) => ({\n\t\tcheckout_id: search.checkout_id as string,\n\t}),\n});\n\nfunction SuccessPage() {\n\tconst { checkout_id } = useSearch({ from: \"/success\" });\n\n\treturn (\n\t\t<div className=\"container mx-auto px-4 py-8\">\n\t\t\t<h1>Payment Successful!</h1>\n\t\t\t{checkout_id && <p>Checkout ID: {checkout_id}</p>}\n\t\t</div>\n\t);\n}\n`],\n [\"payments/polar/web/react/tanstack-start/src/functions/get-payment.ts.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { authMiddleware } from \"@/middleware/auth\";\nimport { createServerFn } from \"@tanstack/react-start\";\nimport { getRequestHeaders } from \"@tanstack/react-start/server\";\n\nexport const getPayment = createServerFn({ method: \"GET\" })\n .middleware([authMiddleware])\n .handler(async () => {\n const { data: customerState } = await authClient.customer.state({\n fetchOptions: {\n headers: getRequestHeaders()\n }\n });\n return customerState;\n });\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/middleware/auth.ts.hbs\", `{{#if (eq backend \"self\")}}\nimport { auth } from \"@{{projectName}}/auth\";\nimport { createMiddleware } from \"@tanstack/react-start\";\n\n\nexport const authMiddleware = createMiddleware().server(async ({ next, request }) => {\n const session = await auth.api.getSession({\n headers: request.headers,\n })\n return next({\n context: { session }\n })\n})\n{{else}}\nimport { authClient } from \"@/lib/auth-client\";\nimport { createMiddleware } from \"@tanstack/react-start\";\n\nexport const authMiddleware = createMiddleware().server(\n\tasync ({ next, request }) => {\n\t\tconst session = await authClient.getSession({\n\t\t\tfetchOptions: {\n\t\t\t\theaders: request.headers,\n\t\t\t\tthrow: true\n\t\t\t}\n\t\t})\n\t\treturn next({\n\t\t\tcontext: { session },\n\t\t});\n\t},\n);\n{{/if}}\n`],\n [\"payments/polar/web/react/react-router/src/routes/success.tsx.hbs\", `import { useSearchParams } from \"react-router\";\n\nexport default function SuccessPage() {\n const [searchParams] = useSearchParams();\n const checkout_id = searchParams.get(\"checkout_id\");\n\n return (\n <div className=\"container mx-auto px-4 py-8\">\n <h1>Payment Successful!</h1>\n {checkout_id && <p>Checkout ID: {checkout_id}</p>}\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/components/user-menu.tsx.hbs\", `import { Link, useNavigate } from \"@tanstack/react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\n\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\nexport default function UserMenu() {\n const navigate = useNavigate();\n const { data: session, isPending } = authClient.useSession();\n\n if (isPending) {\n return <Skeleton className=\"h-9 w-24\" />;\n }\n\n if (!session) {\n return (\n <Link to=\"/login\">\n <Button variant=\"outline\">Sign In</Button>\n </Link>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {session.user.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{session.user.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n navigate({\n to: \"/\",\n });\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignUpForm({ onSwitchToSignIn }: { onSwitchToSignIn: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport Loader from \"./loader\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignInForm({ onSwitchToSignUp }: { onSwitchToSignUp: () => void }) {\n const navigate = useNavigate({\n from: \"/\",\n });\n const { isPending } = authClient.useSession();\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n if (isPending) {\n return <Loader />;\n }\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/routes/dashboard.tsx.hbs\", `import { getUser } from \"@/functions/get-user\";\n{{#if (eq payments \"polar\") }}\nimport { Button } from \"@/components/ui/button\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { getPayment } from \"@/functions/get-payment\";\n{{/if}}\n{{#if (eq api \"trpc\") }}\nimport { useTRPC } from \"@/utils/trpc\";\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\n{{#if (eq api \"orpc\") }}\nimport { orpc } from \"@/utils/orpc\";\nimport { useQuery } from \"@tanstack/react-query\";\n{{/if}}\nimport { createFileRoute, redirect } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n component: RouteComponent,\n beforeLoad: async () => {\n const session = await getUser();\n {{#if (eq payments \"polar\") }}\n const customerState = await getPayment();\n return { session, customerState };\n {{else}}\n return { session };\n {{/if}}\n },\n loader: async ({ context }) => {\n if (!context.session) {\n throw redirect({\n to: \"/login\",\n });\n }\n },\n});\n\nfunction RouteComponent() {\n const { session{{#if (eq payments \"polar\") }}, customerState{{/if}} } = Route.useRouteContext();\n\n {{#if (eq api \"trpc\") }}\n const trpc = useTRPC();\n const privateData = useQuery(trpc.privateData.queryOptions());\n {{/if}}\n {{#if (eq api \"orpc\") }}\n const privateData = useQuery(orpc.privateData.queryOptions());\n {{/if}}\n\n {{#if (eq payments \"polar\") }}\n const hasProSubscription = (customerState?.activeSubscriptions?.length ?? 0) > 0;\n // For debugging: console.log(\"Active subscriptions:\", customerState?.activeSubscriptions);\n {{/if}}\n\n return (\n <div>\n <h1>Dashboard</h1>\n <p>Welcome {session?.user.name}</p>\n {{#if (eq api \"trpc\") }}\n <p>API: {privateData.data?.message}</p>\n {{else if (eq api \"orpc\") }}\n <p>API: {privateData.data?.message}</p>\n {{/if}}\n {{#if (eq payments \"polar\") }}\n <p>Plan: {hasProSubscription ? \"Pro\" : \"Free\"}</p>\n {hasProSubscription ? (\n <Button\n onClick={async function handlePortal() {\n await authClient.customer.portal();\n }}\n >\n Manage Subscription\n </Button>\n ) : (\n <Button\n onClick={async function handleUpgrade() {\n await authClient.checkout({ slug: \"pro\" });\n }}\n >\n Upgrade to Pro\n </Button>\n )}\n {{/if}}\n </div>\n );\n}`],\n [\"auth/better-auth/web/react/tanstack-start/src/routes/login.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useState } from \"react\";\n\nexport const Route = createFileRoute(\"/login\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [showSignIn, setShowSignIn] = useState(false);\n\n return showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n );\n}\n`],\n [\"auth/better-auth/web/react/tanstack-start/src/functions/get-user.ts.hbs\", `import { authMiddleware } from \"@/middleware/auth\";\nimport { createServerFn } from \"@tanstack/react-start\";\n\nexport const getUser = createServerFn({ method: \"GET\" }).middleware([authMiddleware]).handler(async ({ context }) => {\n return context.session\n})`],\n [\"payments/polar/web/react/tanstack-router/src/routes/success.tsx.hbs\", `import { createFileRoute, useSearch } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/success\")({\n\tcomponent: SuccessPage,\n\tvalidateSearch: (search) => ({\n\t\tcheckout_id: search.checkout_id as string,\n\t}),\n});\n\nfunction SuccessPage() {\n\tconst { checkout_id } = useSearch({ from: \"/success\" });\n\n\treturn (\n\t\t<div className=\"container mx-auto px-4 py-8\">\n\t\t\t<h1>Payment Successful!</h1>\n\t\t\t{checkout_id && <p>Checkout ID: {checkout_id}</p>}\n\t\t</div>\n\t);\n}\n`],\n [\"auth/clerk/convex/web/react/next/src/middleware.ts.hbs\", `import { clerkMiddleware } from \"@clerk/nextjs/server\";\n\nexport default clerkMiddleware();\n\nexport const config = {\n\tmatcher: [\n\t\t// Skip Next.js internals and all static files, unless found in search params\n\t\t\"/((?!_next|[^?]*\\\\\\\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)\",\n\t\t// Always run for API routes\n\t\t\"/(api|trpc)(.*)\",\n\t],\n};\n`],\n [\"auth/clerk/convex/web/react/tanstack-start/src/start.ts.hbs\", `import { clerkMiddleware } from '@clerk/tanstack-react-start/server'\nimport { createStart } from '@tanstack/react-start'\n\nexport const startInstance = createStart(() => {\n\treturn {\n\t\trequestMiddleware: [clerkMiddleware()],\n\t}\n})`],\n [\"auth/clerk/convex/native/base/app/(auth)/_layout.tsx.hbs\", `import { Redirect, Stack } from \"expo-router\";\nimport { useAuth } from \"@clerk/clerk-expo\";\n\nexport default function AuthRoutesLayout() {\n const { isSignedIn } = useAuth();\n\n if (isSignedIn) {\n return <Redirect href={\"/\"} />;\n }\n\n return <Stack />;\n}\n`],\n [\"auth/clerk/convex/native/base/app/(auth)/sign-in.tsx.hbs\", `import { useSignIn } from \"@clerk/clerk-expo\";\nimport { Link, useRouter } from \"expo-router\";\nimport { Text, TextInput, TouchableOpacity, View } from \"react-native\";\nimport React from \"react\";\n\nexport default function Page() {\n const { signIn, setActive, isLoaded } = useSignIn();\n const router = useRouter();\n\n const [emailAddress, setEmailAddress] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n\n // Handle the submission of the sign-in form\n const onSignInPress = async () => {\n if (!isLoaded) return;\n\n // Start the sign-in process using the email and password provided\n try {\n const signInAttempt = await signIn.create({\n identifier: emailAddress,\n password,\n });\n\n // If sign-in process is complete, set the created session as active\n // and redirect the user\n if (signInAttempt.status === \"complete\") {\n await setActive({ session: signInAttempt.createdSessionId });\n router.replace(\"/\");\n } else {\n // If the status isn't complete, check why. User might need to\n // complete further steps.\n console.error(JSON.stringify(signInAttempt, null, 2));\n }\n } catch (err) {\n // See https://clerk.com/docs/custom-flows/error-handling\n // for more info on error handling\n console.error(JSON.stringify(err, null, 2));\n }\n };\n\n return (\n <View>\n <Text>Sign in</Text>\n <TextInput\n autoCapitalize=\"none\"\n value={emailAddress}\n placeholder=\"Enter email\"\n onChangeText={(emailAddress) => setEmailAddress(emailAddress)}\n />\n <TextInput\n value={password}\n placeholder=\"Enter password\"\n secureTextEntry={true}\n onChangeText={(password) => setPassword(password)}\n />\n <TouchableOpacity onPress={onSignInPress}>\n <Text>Continue</Text>\n </TouchableOpacity>\n <View style=\\\\{{ display: \"flex\", flexDirection: \"row\", gap: 3 }}>\n <Text>Don't have an account?</Text>\n <Link href=\"/sign-up\">\n <Text>Sign up</Text>\n </Link>\n </View>\n </View>\n );\n}\n`],\n [\"auth/clerk/convex/native/base/app/(auth)/sign-up.tsx.hbs\", `import * as React from \"react\";\nimport { Text, TextInput, TouchableOpacity, View } from \"react-native\";\nimport { useSignUp } from \"@clerk/clerk-expo\";\nimport { Link, useRouter } from \"expo-router\";\n\nexport default function SignUpScreen() {\n const { isLoaded, signUp, setActive } = useSignUp();\n const router = useRouter();\n\n const [emailAddress, setEmailAddress] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [pendingVerification, setPendingVerification] = React.useState(false);\n const [code, setCode] = React.useState(\"\");\n\n // Handle submission of sign-up form\n const onSignUpPress = async () => {\n if (!isLoaded) return;\n\n console.log(emailAddress, password);\n\n // Start sign-up process using email and password provided\n try {\n await signUp.create({\n emailAddress,\n password,\n });\n\n // Send user an email with verification code\n await signUp.prepareEmailAddressVerification({ strategy: \"email_code\" });\n\n // Set 'pendingVerification' to true to display second form\n // and capture OTP code\n setPendingVerification(true);\n } catch (err) {\n // See https://clerk.com/docs/custom-flows/error-handling\n // for more info on error handling\n console.error(JSON.stringify(err, null, 2));\n }\n };\n\n // Handle submission of verification form\n const onVerifyPress = async () => {\n if (!isLoaded) return;\n\n try {\n // Use the code the user provided to attempt verification\n const signUpAttempt = await signUp.attemptEmailAddressVerification({\n code,\n });\n\n // If verification was completed, set the session to active\n // and redirect the user\n if (signUpAttempt.status === \"complete\") {\n await setActive({ session: signUpAttempt.createdSessionId });\n router.replace(\"/\");\n } else {\n // If the status is not complete, check why. User may need to\n // complete further steps.\n console.error(JSON.stringify(signUpAttempt, null, 2));\n }\n } catch (err) {\n // See https://clerk.com/docs/custom-flows/error-handling\n // for more info on error handling\n console.error(JSON.stringify(err, null, 2));\n }\n };\n\n if (pendingVerification) {\n return (\n <>\n <Text>Verify your email</Text>\n <TextInput\n value={code}\n placeholder=\"Enter your verification code\"\n onChangeText={(code) => setCode(code)}\n />\n <TouchableOpacity onPress={onVerifyPress}>\n <Text>Verify</Text>\n </TouchableOpacity>\n </>\n );\n }\n\n return (\n <View>\n <Text>Sign up</Text>\n <TextInput\n autoCapitalize=\"none\"\n value={emailAddress}\n placeholder=\"Enter email\"\n onChangeText={(email) => setEmailAddress(email)}\n />\n <TextInput\n value={password}\n placeholder=\"Enter password\"\n secureTextEntry={true}\n onChangeText={(password) => setPassword(password)}\n />\n <TouchableOpacity onPress={onSignUpPress}>\n <Text>Continue</Text>\n </TouchableOpacity>\n <View style=\\\\{{ display: \"flex\", flexDirection: \"row\", gap: 3 }}>\n <Text>Already have an account?</Text>\n <Link href=\"/sign-in\">\n <Text>Sign in</Text>\n </Link>\n </View>\n </View>\n );\n}\n`],\n [\"api/orpc/fullstack/tanstack-start/src/routes/api/rpc/$.ts.hbs\", `import { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { onError } from \"@orpc/server\";\nimport { createFileRoute } from \"@tanstack/react-router\";\n\nconst rpcHandler = new RPCHandler(appRouter, {\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nconst apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nasync function handle({ request }: { request: Request }) {\n\tconst rpcResult = await rpcHandler.handle(request, {\n\t\tprefix: \"/api/rpc\",\n\t\tcontext: await createContext({ req: request }),\n\t});\n\tif (rpcResult.response) return rpcResult.response;\n\n\tconst apiResult = await apiHandler.handle(request, {\n\t\tprefix: \"/api/rpc/api-reference\",\n\t\tcontext: await createContext({ req: request }),\n\t});\n\tif (apiResult.response) return apiResult.response;\n\n\treturn new Response(\"Not found\", { status: 404 });\n}\n\nexport const Route = createFileRoute('/api/rpc/$')({\n server: {\n handlers: {\n HEAD: handle,\n GET: handle,\n POST: handle,\n PUT: handle,\n PATCH: handle,\n DELETE: handle,\n },\n },\n})`],\n [\"examples/ai/web/react/tanstack-start/src/routes/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useMutation } from \"convex/react\";\nimport { Send, Loader2 } from \"lucide-react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const Route = createFileRoute(\"/ai\")({\n component: RouteComponent,\n});\n\nfunction MessageContent({\n text,\n isStreaming,\n}: {\n text: string;\n isStreaming: boolean;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Streamdown>{visibleText}</Streamdown>;\n}\n\nfunction RouteComponent() {\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: text });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {!messages || messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message: UIMessage) => (\n <div\n key={message.key}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n />\n </div>\n ))\n )}\n {isLoading && !hasStreamingMessage && (\n <div className=\"p-3 rounded-lg bg-secondary/20 mr-8\">\n <p className=\"text-sm font-semibold mb-1\">AI Assistant</p>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Thinking...</span>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n disabled={isLoading}\n />\n <Button type=\"submit\" size=\"icon\" disabled={isLoading || !input.trim()}>\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </Button>\n </form>\n </div>\n );\n}\n{{else}}\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { Send } from \"lucide-react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const Route = createFileRoute(\"/ai\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [input, setInput] = useState(\"\");\n const { messages, sendMessage, status } = useChat({\n transport: new DefaultChatTransport({\n api: {{#if (eq backend \"self\")}}\"/api/ai\"{{else}}\\`\\${env.VITE_SERVER_URL}/ai\\`{{/if}},\n }),\n });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text) return;\n sendMessage({ text });\n setInput(\"\");\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n {message.parts?.map((part, index) => {\n if (part.type === \"text\") {\n return (\n <Streamdown\n key={index}\n isAnimating={status === \"streaming\" && message.role === \"assistant\"}\n >\n {part.text}\n </Streamdown>\n );\n }\n return null;\n })}\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n />\n <Button type=\"submit\" size=\"icon\">\n <Send size={18} />\n </Button>\n </form>\n </div>\n );\n}\n{{/if}}\n`],\n [\"examples/ai/web/svelte/src/routes/ai/+page.svelte.hbs\", `<script lang=\"ts\">\n\timport { PUBLIC_SERVER_URL } from \"$env/static/public\";\n\timport { Chat } from \"@ai-sdk/svelte\";\n\timport { DefaultChatTransport } from \"ai\";\n\n\tlet input = $state(\"\");\n\tconst chat = new Chat({\n\t\ttransport: new DefaultChatTransport({\n\t\t\tapi: \\`\\${PUBLIC_SERVER_URL}/ai\\`,\n\t\t}),\n\t});\n\n\tlet messagesEndElement: HTMLDivElement | null = $state(null);\n\n\t$effect(() => {\n\t\tif (chat.messages.length > 0) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesEndElement?.scrollIntoView({ behavior: \"smooth\" });\n\t\t\t}, 0);\n\t\t}\n\t});\n\n\tfunction handleSubmit(e: Event) {\n\t\te.preventDefault();\n\t\tconst text = input.trim();\n\t\tif (!text) return;\n\t\tchat.sendMessage({ text });\n\t\tinput = \"\";\n\t}\n</script>\n\n<div\n\tclass=\"mx-auto grid h-full w-full max-w-2xl grid-rows-[1fr_auto] overflow-hidden p-4\"\n>\n\t<div class=\"mb-4 space-y-4 overflow-y-auto pb-4\">\n\t\t{#if chat.messages.length === 0}\n\t\t\t<div class=\"mt-8 text-center text-neutral-500\">\n\t\t\t\tAsk me anything to get started!\n\t\t\t</div>\n\t\t{/if}\n\n\t\t{#each chat.messages as message (message.id)}\n\t\t\t<div\n\t\t\t\tclass=\"p-3 rounded-lg w-fit max-w-[85%] text-sm md:text-base\"\n\t\t\t\tclass:ml-auto={message.role === \"user\"}\n\t\t\t\tclass:bg-primary={message.role === \"user\"}\n\t\t\t\tclass:bg-secondary={message.role === \"assistant\"}\n\t\t\t>\n\t\t\t\t<p\n\t\t\t\t\tclass=\"mb-1 text-sm font-semibold\"\n\t\t\t\t\tclass:text-indigo-600={message.role === \"user\"}\n\t\t\t\t\tclass:text-neutral-400={message.role === \"assistant\"}\n\t\t\t\t>\n\t\t\t\t\t{message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n\t\t\t\t</p>\n\t\t\t\t<div class=\"whitespace-pre-wrap break-words\">\n\t\t\t\t\t{#each message.parts as part, partIndex (partIndex)}\n\t\t\t\t\t\t{#if part.type === \"text\"}\n\t\t\t\t\t\t\t{part.text}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{/each}\n\t\t<div bind:this={messagesEndElement}></div>\n\t</div>\n\n\t<form\n\t\tonsubmit={handleSubmit}\n\t\tclass=\"w-full flex items-center space-x-2 pt-2 border-t\"\n\t>\n\t\t<input\n\t\t\tname=\"prompt\"\n\t\t\tbind:value={input}\n\t\t\tplaceholder=\"Type your message...\"\n\t\t\tclass=\"flex-1 rounded border border-neutral-600 bg-neutral-800 px-3 py-2 text-neutral-100 placeholder-neutral-500 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 disabled:opacity-50\"\n\t\t\tautocomplete=\"off\"\n\t\t\tonkeydown={(e) => {\n\t\t\t\tif (e.key === \"Enter\" && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleSubmit(e);\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\tdisabled={!input.trim()}\n\t\t\tclass=\"inline-flex h-10 w-10 items-center justify-center rounded bg-indigo-600 text-white hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:ring-offset-neutral-900 disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\taria-label=\"Send message\"\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\twidth=\"18\"\n\t\t\t\theight=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t>\n\t\t\t\t<path d=\"m22 2-7 20-4-9-9-4Z\" />\n\t\t\t\t<path d=\"M22 2 11 13\" />\n\t\t\t</svg>\n\t\t</button>\n\t</form>\n</div>\n`],\n [\"examples/ai/web/react/react-router/src/routes/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { useMutation } from \"convex/react\";\nimport { Send, Loader2 } from \"lucide-react\";\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nfunction MessageContent({\n text,\n isStreaming,\n}: {\n text: string;\n isStreaming: boolean;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Streamdown>{visibleText}</Streamdown>;\n}\n\nconst AI: React.FC = () => {\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: text });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {!messages || messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message: UIMessage) => (\n <div\n key={message.key}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n />\n </div>\n ))\n )}\n {isLoading && !hasStreamingMessage && (\n <div className=\"p-3 rounded-lg bg-secondary/20 mr-8\">\n <p className=\"text-sm font-semibold mb-1\">AI Assistant</p>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Thinking...</span>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n disabled={isLoading}\n />\n <Button type=\"submit\" size=\"icon\" disabled={isLoading || !input.trim()}>\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </Button>\n </form>\n </div>\n );\n};\n\nexport default AI;\n{{else}}\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { Send } from \"lucide-react\";\nimport { Streamdown } from \"streamdown\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nconst AI: React.FC = () => {\n const [input, setInput] = useState(\"\");\n const { messages, sendMessage, status } = useChat({\n transport: new DefaultChatTransport({\n api: \\`\\${env.VITE_SERVER_URL}/ai\\`,\n }),\n });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text) return;\n sendMessage({ text });\n setInput(\"\");\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n {message.parts?.map((part, index) => {\n if (part.type === \"text\") {\n return (\n <Streamdown\n key={index}\n isAnimating={status === \"streaming\" && message.role === \"assistant\"}\n >\n {part.text}\n </Streamdown>\n );\n }\n return null;\n })}\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n />\n <Button type=\"submit\" size=\"icon\">\n <Send size={18} />\n </Button>\n </form>\n </div>\n );\n};\n\nexport default AI;\n{{/if}}\n`],\n [\"examples/ai/web/react/tanstack-router/src/routes/ai.tsx.hbs\", `{{#if (eq backend \"convex\")}}\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useMutation } from \"convex/react\";\nimport { Send, Loader2 } from \"lucide-react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const Route = createFileRoute(\"/ai\")({\n component: RouteComponent,\n});\n\nfunction MessageContent({\n text,\n isStreaming,\n}: {\n text: string;\n isStreaming: boolean;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Streamdown>{visibleText}</Streamdown>;\n}\n\nfunction RouteComponent() {\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: text });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {!messages || messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message: UIMessage) => (\n <div\n key={message.key}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n />\n </div>\n ))\n )}\n {isLoading && !hasStreamingMessage && (\n <div className=\"p-3 rounded-lg bg-secondary/20 mr-8\">\n <p className=\"text-sm font-semibold mb-1\">AI Assistant</p>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Thinking...</span>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n disabled={isLoading}\n />\n <Button type=\"submit\" size=\"icon\" disabled={isLoading || !input.trim()}>\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </Button>\n </form>\n </div>\n );\n}\n{{else}}\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Send } from \"lucide-react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n{{#unless (eq backend \"self\")}}\nimport { env } from \"@{{projectName}}/env/web\";\n{{/unless}}\n\nexport const Route = createFileRoute(\"/ai\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [input, setInput] = useState(\"\");\n const { messages, sendMessage, status } = useChat({\n transport: new DefaultChatTransport({\n api: {{#if (eq backend \"self\")}}\"/api/ai\"{{else}}\\`\\${env.VITE_SERVER_URL}/ai\\`{{/if}},\n }),\n });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text) return;\n sendMessage({ text });\n setInput(\"\");\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n {message.parts?.map((part, index) => {\n if (part.type === \"text\") {\n return (\n <Streamdown\n key={index}\n isAnimating={status === \"streaming\" && message.role === \"assistant\"}\n >\n {part.text}\n </Streamdown>\n );\n }\n return null;\n })}\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n />\n <Button type=\"submit\" size=\"icon\">\n <Send size={18} />\n </Button>\n </form>\n </div>\n );\n}\n{{/if}}\n`],\n [\"api/trpc/fullstack/tanstack-start/src/routes/api/trpc/$.ts.hbs\", `import { fetchRequestHandler } from '@trpc/server/adapters/fetch'\nimport { appRouter } from '@{{projectName}}/api/routers/index'\nimport { createContext } from '@{{projectName}}/api/context'\nimport { createFileRoute } from '@tanstack/react-router'\n\nfunction handler({ request }: { request: Request }) {\n return fetchRequestHandler({\n req: request,\n router: appRouter,\n createContext,\n endpoint: '/api/trpc',\n })\n}\n\nexport const Route = createFileRoute('/api/trpc/$')({\n server: {\n handlers: {\n GET: handler,\n POST: handler,\n },\n },\n})\n`],\n [\"examples/todo/server/prisma/mysql/prisma/schema/todo.prisma.hbs\", `model Todo {\n id Int @id @default(autoincrement())\n text String\n completed Boolean @default(false)\n\n @@map(\"todo\")\n}\n`],\n [\"examples/todo/server/prisma/postgres/prisma/schema/todo.prisma.hbs\", `model Todo {\n id Int @id @default(autoincrement())\n text String\n completed Boolean @default(false)\n\n @@map(\"todo\")\n}\n`],\n [\"examples/todo/server/prisma/sqlite/prisma/schema/todo.prisma.hbs\", `model Todo {\n id Int @id @default(autoincrement())\n text String\n completed Boolean @default(false)\n\n @@map(\"todo\")\n}\n`],\n [\"examples/todo/server/prisma/base/src/routers/todo.ts.hbs\", `{{#if (eq api \"orpc\")}}\nimport z from \"zod\";\nimport prisma from \"@{{projectName}}/db\";\nimport { publicProcedure } from \"../index\";\n\nexport const todoRouter = {\n getAll: publicProcedure.handler(async () => {\n return await prisma.todo.findMany({\n orderBy: {\n id: \"asc\",\n },\n });\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .handler(async ({ input }) => {\n return await prisma.todo.create({\n data: {\n text: input.text,\n },\n });\n }),\n\n toggle: publicProcedure\n {{#if (eq database \"mongodb\")}}\n .input(z.object({ id: z.string(), completed: z.boolean() }))\n {{else}}\n .input(z.object({ id: z.number(), completed: z.boolean() }))\n {{/if}}\n .handler(async ({ input }) => {\n return await prisma.todo.update({\n where: { id: input.id },\n data: { completed: input.completed },\n });\n }),\n\n delete: publicProcedure\n {{#if (eq database \"mongodb\")}}\n .input(z.object({ id: z.string() }))\n {{else}}\n .input(z.object({ id: z.number() }))\n {{/if}}\n .handler(async ({ input }) => {\n return await prisma.todo.delete({\n where: { id: input.id },\n });\n }),\n};\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\nimport { TRPCError } from \"@trpc/server\";\nimport z from \"zod\";\nimport prisma from \"@{{projectName}}/db\";\nimport { publicProcedure, router } from \"../index\";\n\nexport const todoRouter = router({\n getAll: publicProcedure.query(async () => {\n return await prisma.todo.findMany({\n orderBy: {\n id: \"asc\"\n }\n });\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .mutation(async ({ input }) => {\n return await prisma.todo.create({\n data: {\n text: input.text,\n },\n });\n }),\n\n toggle: publicProcedure\n {{#if (eq database \"mongodb\")}}\n .input(z.object({ id: z.string(), completed: z.boolean() }))\n {{else}}\n .input(z.object({ id: z.number(), completed: z.boolean() }))\n {{/if}}\n .mutation(async ({ input }) => {\n try {\n return await prisma.todo.update({\n where: { id: input.id },\n data: { completed: input.completed },\n });\n } catch (error) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Todo not found\",\n });\n }\n }),\n\n delete: publicProcedure\n {{#if (eq database \"mongodb\")}}\n .input(z.object({ id: z.string() }))\n {{else}}\n .input(z.object({ id: z.number() }))\n {{/if}}\n .mutation(async ({ input }) => {\n try {\n return await prisma.todo.delete({\n where: { id: input.id },\n });\n } catch (error) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Todo not found\",\n });\n }\n }),\n});\n{{/if}}\n`],\n [\"examples/todo/server/drizzle/mysql/src/schema/todo.ts\", `import { mysqlTable, varchar, int, boolean } from \"drizzle-orm/mysql-core\";\n\nexport const todo = mysqlTable(\"todo\", {\n id: int(\"id\").primaryKey().autoincrement(),\n text: varchar(\"text\", { length: 255 }).notNull(),\n completed: boolean(\"completed\").default(false).notNull(),\n});\n`],\n [\"examples/todo/server/prisma/mongodb/prisma/schema/todo.prisma.hbs\", `model Todo {\n id String @id @default(auto()) @map(\"_id\") @db.ObjectId\n text String\n completed Boolean @default(false)\n\n @@map(\"todo\")\n}\n`],\n [\"examples/todo/server/mongoose/base/src/routers/todo.ts.hbs\", `{{#if (eq api \"orpc\")}}\nimport z from \"zod\";\nimport { publicProcedure } from \"../index\";\nimport { Todo } from \"@{{projectName}}/db/models/todo.model\";\n\nexport const todoRouter = {\n getAll: publicProcedure.handler(async () => {\n return await Todo.find().lean();\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .handler(async ({ input }) => {\n const newTodo = await Todo.create({ text: input.text });\n return newTodo.toObject();\n }),\n\n toggle: publicProcedure\n .input(z.object({ id: z.string(), completed: z.boolean() }))\n .handler(async ({ input }) => {\n await Todo.updateOne({ id: input.id }, { completed: input.completed });\n return { success: true };\n }),\n\n delete: publicProcedure\n .input(z.object({ id: z.string() }))\n .handler(async ({ input }) => {\n await Todo.deleteOne({ id: input.id });\n return { success: true };\n }),\n};\n\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\nimport z from \"zod\";\nimport { router, publicProcedure } from \"../index\";\nimport { Todo } from \"@{{projectName}}/db/models/todo.model\";\n\nexport const todoRouter = router({\n getAll: publicProcedure.query(async () => {\n return await Todo.find().lean();\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .mutation(async ({ input }) => {\n const newTodo = await Todo.create({ text: input.text });\n return newTodo.toObject();\n }),\n\n toggle: publicProcedure\n .input(z.object({ id: z.string(), completed: z.boolean() }))\n .mutation(async ({ input }) => {\n await Todo.updateOne({ id: input.id }, { completed: input.completed });\n return { success: true };\n }),\n\n delete: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ input }) => {\n await Todo.deleteOne({ id: input.id });\n return { success: true };\n }),\n});\n{{/if}}\n`],\n [\"examples/todo/server/drizzle/base/src/routers/todo.ts.hbs\", `{{#if (eq api \"orpc\")}}\nimport { eq } from \"drizzle-orm\";\nimport z from \"zod\";\nimport { db } from \"@{{projectName}}/db\";\nimport { todo } from \"@{{projectName}}/db/schema/todo\";\nimport { publicProcedure } from \"../index\";\n\nexport const todoRouter = {\n getAll: publicProcedure.handler(async () => {\n return await db.select().from(todo);\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .handler(async ({ input }) => {\n return await db\n .insert(todo)\n .values({\n text: input.text,\n });\n }),\n\n toggle: publicProcedure\n .input(z.object({ id: z.number(), completed: z.boolean() }))\n .handler(async ({ input }) => {\n return await db\n .update(todo)\n .set({ completed: input.completed })\n .where(eq(todo.id, input.id));\n }),\n\n delete: publicProcedure\n .input(z.object({ id: z.number() }))\n .handler(async ({ input }) => {\n return await db.delete(todo).where(eq(todo.id, input.id));\n }),\n};\n{{/if}}\n\n{{#if (eq api \"trpc\")}}\nimport z from \"zod\";\nimport { router, publicProcedure } from \"../index\";\nimport { todo } from \"@{{projectName}}/db/schema/todo\";\nimport { eq } from \"drizzle-orm\";\nimport { db } from \"@{{projectName}}/db\";\n\nexport const todoRouter = router({\n getAll: publicProcedure.query(async () => {\n return await db.select().from(todo);\n }),\n\n create: publicProcedure\n .input(z.object({ text: z.string().min(1) }))\n .mutation(async ({ input }) => {\n return await db.insert(todo).values({\n text: input.text,\n });\n }),\n\n toggle: publicProcedure\n .input(z.object({ id: z.number(), completed: z.boolean() }))\n .mutation(async ({ input }) => {\n return await db\n .update(todo)\n .set({ completed: input.completed })\n .where(eq(todo.id, input.id));\n }),\n\n delete: publicProcedure\n .input(z.object({ id: z.number() }))\n .mutation(async ({ input }) => {\n return await db.delete(todo).where(eq(todo.id, input.id));\n }),\n});\n{{/if}}\n`],\n [\"examples/todo/server/mongoose/mongodb/src/models/todo.model.ts.hbs\", `import mongoose from 'mongoose';\n\nconst { Schema, model } = mongoose;\n\nconst todoSchema = new Schema({\n id: {\n type: mongoose.Schema.Types.ObjectId,\n auto: true,\n },\n text: {\n type: String,\n required: true,\n },\n completed: {\n type: Boolean,\n default: false,\n },\n}, {\n collection: 'todo'\n});\n\nconst Todo = model('Todo', todoSchema);\n\nexport { Todo };\n`],\n [\"examples/todo/server/drizzle/sqlite/src/schema/todo.ts\", `import { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\";\n\nexport const todo = sqliteTable(\"todo\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n text: text(\"text\").notNull(),\n completed: integer(\"completed\", { mode: \"boolean\" }).default(false).notNull(),\n});\n`],\n [\"examples/todo/server/drizzle/postgres/src/schema/todo.ts\", `import { pgTable, text, boolean, serial } from \"drizzle-orm/pg-core\";\n\nexport const todo = pgTable(\"todo\", {\n id: serial(\"id\").primaryKey(),\n text: text(\"text\").notNull(),\n completed: boolean(\"completed\").default(false).notNull(),\n});\n`],\n [\"examples/todo/web/react/tanstack-start/src/routes/todos.tsx.hbs\", `import { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Input } from \"@/components/ui/input\";\nimport { createFileRoute } from \"@tanstack/react-router\";\n{{#if (eq backend \"convex\")}}\nimport { Trash2 } from \"lucide-react\";\n{{else}}\nimport { Loader2, Trash2 } from \"lucide-react\";\n{{/if}}\nimport { useState } from \"react\";\n\n{{#if (eq backend \"convex\")}}\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { convexQuery } from \"@convex-dev/react-query\";\nimport { useMutation } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\n{{#if (eq api \"trpc\")}}\nimport { useTRPC } from \"@/utils/trpc\";\n{{/if}}\n{{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\n\nexport const Route = createFileRoute(\"/todos\")({\n component: TodosRoute,\n});\n\nfunction TodosRoute() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n\n {{#if (eq backend \"convex\")}}\n const todosQuery = useSuspenseQuery(convexQuery(api.todos.getAll, {}));\n const todos = todosQuery.data;\n\n const createTodo = useMutation(api.todos.create);\n const toggleTodo = useMutation(api.todos.toggle);\n const removeTodo = useMutation(api.todos.deleteTodo);\n\n const handleAddTodo = async (e: React.FormEvent) => {\n e.preventDefault();\n const text = newTodoText.trim();\n if (text) {\n setNewTodoText(\"\");\n try {\n await createTodo({ text });\n } catch (error) {\n console.error(\"Failed to add todo:\", error);\n setNewTodoText(text);\n }\n }\n };\n\n const handleToggleTodo = async (id: Id<\"todos\">, completed: boolean) => {\n try {\n await toggleTodo({ id, completed: !completed });\n } catch (error) {\n console.error(\"Failed to toggle todo:\", error);\n }\n };\n\n const handleDeleteTodo = async (id: Id<\"todos\">) => {\n try {\n await removeTodo({ id });\n } catch (error) {\n console.error(\"Failed to delete todo:\", error);\n }\n };\n {{else}}\n {{#if (eq api \"trpc\")}}\n const trpc = useTRPC();\n {{/if}}\n {{#if (eq api \"orpc\")}}\n {{/if}}\n\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n\n const handleAddTodo = (e: React.FormEvent) => {\n e.preventDefault();\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n deleteMutation.mutate({ id });\n };\n {{/if}}\n\n return (\n <div className=\"mx-auto w-full max-w-md py-10\">\n <Card>\n <CardHeader>\n <CardTitle>Todo List{{#if (eq backend \"convex\")}} (Convex){{/if}}</CardTitle>\n <CardDescription>Manage your tasks efficiently</CardDescription>\n </CardHeader>\n <CardContent>\n <form\n onSubmit={handleAddTodo}\n className=\"mb-6 flex items-center space-x-2\"\n >\n <Input\n value={newTodoText}\n onChange={(e) => setNewTodoText(e.target.value)}\n placeholder=\"Add a new task...\"\n {{#unless (eq backend \"convex\")}}\n disabled={createMutation.isPending}\n {{/unless}}\n />\n <Button\n type=\"submit\"\n {{#unless (eq backend \"convex\")}}\n disabled={createMutation.isPending || !newTodoText.trim()}\n {{else}}\n disabled={!newTodoText.trim()}\n {{/unless}}\n >\n {{#unless (eq backend \"convex\")}}\n {createMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n \"Add\"\n )}\n {{else}}\n Add\n {{/unless}}\n </Button>\n </form>\n\n {{#if (eq backend \"convex\")}}\n {todos?.length === 0 ? (\n <p className=\"py-4 text-center\">No todos yet. Add one above!</p>\n ) : (\n <ul className=\"space-y-2\">\n {todos?.map((todo) => (\n <li\n key={todo._id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo._id, todo.completed)\n }\n id={\\`todo-\\${todo._id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo._id}\\`}\n className={\\`\\${\n todo.completed\n ? \"text-muted-foreground line-through\"\n : \"\"\n }\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo._id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{else}}\n {todos.isLoading ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.data?.length === 0 ? (\n <p className=\"py-4 text-center\">No todos yet. Add one above!</p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.data?.map((todo) => (\n <li\n key={todo.id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo.id, todo.completed)\n }\n id={\\`todo-\\${todo.id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo.id}\\`}\n className={\\`\\${todo.completed ? \"line-through\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo.id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{/if}}\n </CardContent>\n </Card>\n </div>\n );\n}\n`],\n [\"examples/todo/web/svelte/src/routes/todos/+page.svelte.hbs\", `{{#if (eq backend \"convex\")}}\n<script lang=\"ts\">\n\timport { useQuery, useConvexClient } from 'convex-svelte';\n\timport { api } from '@{{projectName}}/backend/convex/_generated/api';\n\timport type { Id } from '@{{projectName}}/backend/convex/_generated/dataModel';\n\n\tlet newTodoText = $state('');\n\tlet isAdding = $state(false);\n\tlet addError = $state<Error | null>(null);\n\tlet togglingId = $state<Id<'todos'> | null>(null);\n\tlet toggleError = $state<Error | null>(null);\n\tlet deletingId = $state<Id<'todos'> | null>(null);\n\tlet deleteError = $state<Error | null>(null);\n\n\tconst client = useConvexClient();\n\n\tconst todosQuery = useQuery(api.todos.getAll, {});\n\n\tasync function handleAddTodo(event: SubmitEvent) {\n\t\tevent.preventDefault();\n\t\tconst text = newTodoText.trim();\n\t\tif (!text || isAdding) return;\n\n\t\tisAdding = true;\n\t\taddError = null;\n\t\ttry {\n\t\t\tawait client.mutation(api.todos.create, { text });\n\t\t\tnewTodoText = '';\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to add todo:', err);\n\t\t\taddError = err instanceof Error ? err : new Error(String(err));\n\t\t} finally {\n\t\t\tisAdding = false;\n\t\t}\n\t}\n\n\tasync function handleToggleTodo(id: Id<'todos'>, completed: boolean) {\n\t\tif (togglingId === id || deletingId === id) return;\n\n\t\ttogglingId = id;\n\t\ttoggleError = null;\n\t\ttry {\n\t\t\tawait client.mutation(api.todos.toggle, { id, completed: !completed });\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to toggle todo:', err);\n\t\t\ttoggleError = err instanceof Error ? err : new Error(String(err));\n\t\t} finally {\n\t\t\tif (togglingId === id) {\n\t\t\t\ttogglingId = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function handleDeleteTodo(id: Id<'todos'>) {\n\t\tif (togglingId === id || deletingId === id) return;\n\n\t\tdeletingId = id;\n\t\tdeleteError = null;\n\t\ttry {\n\t\t\tawait client.mutation(api.todos.deleteTodo, { id });\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to delete todo:', err);\n\t\t\tdeleteError = err instanceof Error ? err : new Error(String(err));\n\t\t} finally {\n\t\t\tif (deletingId === id) {\n\t\t\t\tdeletingId = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst canAdd = $derived(!isAdding && newTodoText.trim().length > 0);\n\tconst isLoadingTodos = $derived(todosQuery.isLoading);\n\tconst todos = $derived(todosQuery.data ?? []);\n\tconst hasTodos = $derived(todos.length > 0);\n\n</script>\n\n<div class=\"p-4\">\n\t<h1 class=\"text-xl mb-4\">Todos (Convex)</h1>\n\n\t<form onsubmit={handleAddTodo} class=\"flex gap-2 mb-4\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tbind:value={newTodoText}\n\t\t\tplaceholder=\"New task...\"\n\t\t\tdisabled={isAdding}\n\t\t\tclass=\"p-1 flex-grow\"\n\t\t/>\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\tdisabled={!canAdd}\n\t\t\tclass=\"bg-blue-500 text-white px-3 py-1 rounded disabled:opacity-50\"\n\t\t>\n\t\t\t{#if isAdding}Adding...{:else}Add{/if}\n\t\t</button>\n\t</form>\n\n\t{#if isLoadingTodos}\n\t\t<p>Loading...</p>\n\t{:else if !hasTodos}\n\t\t<p>No todos yet.</p>\n\t{:else}\n\t\t<ul class=\"space-y-1\">\n\t\t\t{#each todos as todo (todo._id)}\n\t\t\t\t{@const isTogglingThis = togglingId === todo._id}\n\t\t\t\t{@const isDeletingThis = deletingId === todo._id}\n\t\t\t\t{@const isDisabled = isTogglingThis || isDeletingThis}\n\t\t\t\t<li\n\t\t\t\t\tclass=\"flex items-center justify-between p-2\"\n\t\t\t\t\tclass:opacity-50={isDisabled}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tid={\\`todo-\\${todo._id}\\`}\n\t\t\t\t\t\t\tchecked={todo.completed}\n\t\t\t\t\t\t\tonchange={() => handleToggleTodo(todo._id, todo.completed)}\n\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tfor={\\`todo-\\${todo._id}\\`}\n\t\t\t\t\t\t\tclass:line-through={todo.completed}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{todo.text}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => handleDeleteTodo(todo._id)}\n\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\taria-label=\"Delete todo\"\n\t\t\t\t\t\tclass=\"text-red-500 px-1 disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#if isDeletingThis}Deleting...{:else}X{/if}\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t{/each}\n\t\t</ul>\n\t{/if}\n\n\t{#if todosQuery.error}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError loading: {todosQuery.error?.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if addError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError adding: {addError.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if toggleError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError updating: {toggleError.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if deleteError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError deleting: {deleteError.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n</div>\n{{else}}\n<script lang=\"ts\">\n\t{{#if (eq api \"orpc\")}}\n\timport { orpc } from '$lib/orpc';\n\t{{/if}}\n\timport { createQuery, createMutation } from '@tanstack/svelte-query';\n\n\tlet newTodoText = $state('');\n\n\t{{#if (eq api \"orpc\")}}\n\tconst todosQuery = createQuery(orpc.todo.getAll.queryOptions());\n\n\tconst addMutation = createMutation(\n\t\torpc.todo.create.mutationOptions({\n\t\t\tonSuccess: () => {\n\t\t\t\t$todosQuery.refetch();\n\t\t\t\tnewTodoText = '';\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error('Failed to create todo:', error?.message ?? error);\n\t\t\t},\n\t\t})\n\t);\n\n\tconst toggleMutation = createMutation(\n\t\torpc.todo.toggle.mutationOptions({\n\t\t\tonSuccess: () => {\n\t\t\t\t$todosQuery.refetch();\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error('Failed to toggle todo:', error?.message ?? error);\n\t\t\t},\n\t\t})\n\t);\n\n\tconst deleteMutation = createMutation(\n\t\torpc.todo.delete.mutationOptions({\n\t\t\tonSuccess: () => {\n\t\t\t\t$todosQuery.refetch();\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error('Failed to delete todo:', error?.message ?? error);\n\t\t\t},\n\t\t})\n\t);\n\t{{/if}}\n\n\tfunction handleAddTodo(event: SubmitEvent) {\n\t\tevent.preventDefault();\n\t\tconst text = newTodoText.trim();\n\t\tif (text) {\n\t\t\t$addMutation.mutate({ text });\n\t\t}\n\t}\n\n\tfunction handleToggleTodo(id: number, completed: boolean) {\n\t\t$toggleMutation.mutate({ id, completed: !completed });\n\t}\n\n\tfunction handleDeleteTodo(id: number) {\n\t\t$deleteMutation.mutate({ id });\n\t}\n\n\tconst isAdding = $derived($addMutation.isPending);\n\tconst canAdd = $derived(!isAdding && newTodoText.trim().length > 0);\n\tconst isLoadingTodos = $derived($todosQuery.isLoading);\n\tconst todos = $derived($todosQuery.data ?? []);\n\tconst hasTodos = $derived(todos.length > 0);\n\n</script>\n\n<div class=\"p-4\">\n\t<h1 class=\"text-xl mb-4\">Todos{{#if (eq api \"orpc\")}} (oRPC){{/if}}</h1>\n\n\t<form onsubmit={handleAddTodo} class=\"flex gap-2 mb-4\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tbind:value={newTodoText}\n\t\t\tplaceholder=\"New task...\"\n\t\t\tdisabled={isAdding}\n\t\t\tclass=\" p-1 flex-grow\"\n\t\t/>\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\tdisabled={!canAdd}\n\t\t\tclass=\"bg-blue-500 text-white px-3 py-1 rounded disabled:opacity-50\"\n\t\t>\n\t\t\t{#if isAdding}Adding...{:else}Add{/if}\n\t\t</button>\n\t</form>\n\n\t{#if isLoadingTodos}\n\t\t<p>Loading...</p>\n\t{:else if !hasTodos}\n\t\t<p>No todos yet.</p>\n\t{:else}\n\t\t<ul class=\"space-y-1\">\n\t\t\t{#each todos as todo (todo.id)}\n\t\t\t\t{@const isToggling = $toggleMutation.isPending && $toggleMutation.variables?.id === todo.id}\n\t\t\t\t{@const isDeleting = $deleteMutation.isPending && $deleteMutation.variables?.id === todo.id}\n\t\t\t\t{@const isDisabled = isToggling || isDeleting}\n\t\t\t\t<li\n\t\t\t\t\tclass=\"flex items-center justify-between p-2 \"\n\t\t\t\t\tclass:opacity-50={isDisabled}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tid={\\`todo-\\${todo.id}\\`}\n\t\t\t\t\t\t\tchecked={todo.completed}\n\t\t\t\t\t\t\tonchange={() => handleToggleTodo(todo.id, todo.completed)}\n\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tfor={\\`todo-\\${todo.id}\\`}\n\t\t\t\t\t\t\tclass:line-through={todo.completed}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{todo.text}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonclick={() => handleDeleteTodo(todo.id)}\n\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\taria-label=\"Delete todo\"\n\t\t\t\t\t\tclass=\"text-red-500 px-1 disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#if isDeleting}Deleting...{:else}X{/if}\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t{/each}\n\t\t</ul>\n\t{/if}\n\n\t{#if $todosQuery.isError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError loading: {$todosQuery.error?.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if $addMutation.isError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError adding: {$addMutation.error?.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if $toggleMutation.isError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError updating: {$toggleMutation.error?.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n\t{#if $deleteMutation.isError}\n\t\t<p class=\"mt-4 text-red-500\">\n\t\t\tError deleting: {$deleteMutation.error?.message ?? 'Unknown error'}\n\t\t</p>\n\t{/if}\n</div>\n{{/if}}\n`],\n [\"examples/todo/web/react/tanstack-router/src/routes/todos.tsx.hbs\", `import { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Input } from \"@/components/ui/input\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { Loader2, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\n\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\n {{#if (eq api \"orpc\")}}\n import { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\n import { trpc } from \"@/utils/trpc\";\n {{/if}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\n\nexport const Route = createFileRoute(\"/todos\")({\n component: TodosRoute,\n});\n\nfunction TodosRoute() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodo = useMutation(api.todos.create);\n const toggleTodo = useMutation(api.todos.toggle);\n const deleteTodo = useMutation(api.todos.deleteTodo);\n\n const handleAddTodo = async (e: React.FormEvent) => {\n e.preventDefault();\n const text = newTodoText.trim();\n if (!text) return;\n await createTodo({ text });\n setNewTodoText(\"\");\n };\n\n const handleToggleTodo = (id: Id<\"todos\">, currentCompleted: boolean) => {\n toggleTodo({ id, completed: !currentCompleted });\n };\n\n const handleDeleteTodo = (id: Id<\"todos\">) => {\n deleteTodo({ id });\n };\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n\n const handleAddTodo = (e: React.FormEvent) => {\n e.preventDefault();\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n deleteMutation.mutate({ id });\n };\n {{/if}}\n\n return (\n <div className=\"mx-auto w-full max-w-md py-10\">\n <Card>\n <CardHeader>\n <CardTitle>Todo List</CardTitle>\n <CardDescription>Manage your tasks efficiently</CardDescription>\n </CardHeader>\n <CardContent>\n <form\n onSubmit={handleAddTodo}\n className=\"mb-6 flex items-center space-x-2\"\n >\n <Input\n value={newTodoText}\n onChange={(e) => setNewTodoText(e.target.value)}\n placeholder=\"Add a new task...\"\n {{#if (eq backend \"convex\")}}\n {{else}}\n disabled={createMutation.isPending}\n {{/if}}\n />\n <Button\n type=\"submit\"\n {{#if (eq backend \"convex\")}}\n disabled={!newTodoText.trim()}\n {{else}}\n disabled={createMutation.isPending || !newTodoText.trim()}\n {{/if}}\n >\n {{#if (eq backend \"convex\")}}\n Add\n {{else}}\n {createMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n \"Add\"\n )}\n {{/if}}\n </Button>\n </form>\n\n {{#if (eq backend \"convex\")}}\n {todos === undefined ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.length === 0 ? (\n <p className=\"py-4 text-center\">No todos yet. Add one above!</p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.map((todo) => (\n <li\n key={todo._id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo._id, todo.completed)\n }\n id={\\`todo-\\${todo._id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo._id}\\`}\n className={\\`\\${todo.completed ? \"line-through text-muted-foreground\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo._id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{else}}\n {todos.isLoading ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.data?.length === 0 ? (\n <p className=\"py-4 text-center\">\n No todos yet. Add one above!\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.data?.map((todo) => (\n <li\n key={todo.id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo.id, todo.completed)\n }\n id={\\`todo-\\${todo.id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo.id}\\`}\n className={\\`\\${todo.completed ? \"line-through\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo.id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{/if}}\n </CardContent>\n </Card>\n </div>\n );\n}\n`],\n [\"examples/todo/web/react/react-router/src/routes/todos.tsx.hbs\", `import { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Input } from \"@/components/ui/input\";\nimport { Loader2, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\n\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\n {{#if (eq api \"orpc\")}}\n import { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\n import { trpc } from \"@/utils/trpc\";\n {{/if}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n{{/if}}\n\nexport default function Todos() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodo = useMutation(api.todos.create);\n const toggleTodo = useMutation(api.todos.toggle);\n const deleteTodo = useMutation(api.todos.deleteTodo);\n\n const handleAddTodo = async (e: React.FormEvent) => {\n e.preventDefault();\n const text = newTodoText.trim();\n if (!text) return;\n await createTodo({ text });\n setNewTodoText(\"\");\n };\n\n const handleToggleTodo = (id: Id<\"todos\">, currentCompleted: boolean) => {\n toggleTodo({ id, completed: !currentCompleted });\n };\n\n const handleDeleteTodo = (id: Id<\"todos\">) => {\n deleteTodo({ id });\n };\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n })\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n })\n );\n {{/if}}\n\n const handleAddTodo = (e: React.FormEvent) => {\n e.preventDefault();\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n deleteMutation.mutate({ id });\n };\n {{/if}}\n\n return (\n <div className=\"w-full mx-auto max-w-md py-10\">\n <Card>\n <CardHeader>\n <CardTitle>Todo List</CardTitle>\n <CardDescription>Manage your tasks efficiently</CardDescription>\n </CardHeader>\n <CardContent>\n <form\n onSubmit={handleAddTodo}\n className=\"mb-6 flex items-center space-x-2\"\n >\n <Input\n value={newTodoText}\n onChange={(e) => setNewTodoText(e.target.value)}\n placeholder=\"Add a new task...\"\n {{#if (eq backend \"convex\")}}\n {{else}}\n disabled={createMutation.isPending}\n {{/if}}\n />\n <Button\n type=\"submit\"\n {{#if (eq backend \"convex\")}}\n disabled={!newTodoText.trim()}\n {{else}}\n disabled={createMutation.isPending || !newTodoText.trim()}\n {{/if}}\n >\n {{#if (eq backend \"convex\")}}\n Add\n {{else}}\n {createMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n \"Add\"\n )}\n {{/if}}\n </Button>\n </form>\n\n {{#if (eq backend \"convex\")}}\n {todos === undefined ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.length === 0 ? (\n <p className=\"py-4 text-center\">No todos yet. Add one above!</p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.map((todo) => (\n <li\n key={todo._id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo._id, todo.completed)\n }\n id={\\`todo-\\${todo._id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo._id}\\`}\n className={\\`\\${todo.completed ? \"line-through text-muted-foreground\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo._id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{else}}\n {todos.isLoading ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.data?.length === 0 ? (\n <p className=\"py-4 text-center\">\n No todos yet. Add one above!\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.data?.map((todo) => (\n <li\n key={todo.id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo.id, todo.completed)\n }\n id={\\`todo-\\${todo.id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo.id}\\`}\n className={\\`\\${todo.completed ? \"line-through\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo.id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{/if}}\n </CardContent>\n </Card>\n </div>\n );\n}\n`],\n [\"auth/better-auth/web/react/next/src/app/dashboard/dashboard.tsx.hbs\", `\"use client\";\n{{#if (eq payments \"polar\")}}\nimport { Button } from \"@/components/ui/button\";\n{{/if}}\nimport { authClient } from \"@/lib/auth-client\";\n{{#if (eq api \"orpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { orpc } from \"@/utils/orpc\";\n{{/if}}\n{{#if (eq api \"trpc\")}}\nimport { useQuery } from \"@tanstack/react-query\";\nimport { trpc } from \"@/utils/trpc\";\n{{/if}}\n\nexport default function Dashboard({\n\t{{#if (eq payments \"polar\")}}\n\tcustomerState,\n\t{{/if}}\n\tsession\n}: {\n\t{{#if (eq payments \"polar\")}}\n\tcustomerState: ReturnType<typeof authClient.customer.state>;\n\t{{/if}}\n\tsession: typeof authClient.$Infer.Session;\n}) {\n\t{{#if (eq api \"orpc\")}}\n\tconst privateData = useQuery(orpc.privateData.queryOptions());\n\t{{/if}}\n\t{{#if (eq api \"trpc\")}}\n\tconst privateData = useQuery(trpc.privateData.queryOptions());\n\t{{/if}}\n\n\t{{#if (eq payments \"polar\")}}\n\tconst hasProSubscription = customerState?.activeSubscriptions?.length! > 0;\n\tconsole.log(\"Active subscriptions:\", customerState?.activeSubscriptions);\n\t{{/if}}\n\n\treturn (\n\t\t<>\n\t\t\t{{#if (eq api \"orpc\")}}\n\t\t\t<p>API: {privateData.data?.message}</p>\n\t\t\t{{/if}}\n\t\t\t{{#if (eq api \"trpc\")}}\n\t\t\t<p>API: {privateData.data?.message}</p>\n\t\t\t{{/if}}\n\t\t\t{{#if (eq payments \"polar\")}}\n\t\t\t<p>Plan: {hasProSubscription ? \"Pro\" : \"Free\"}</p>\n\t\t\t{hasProSubscription ? (\n\t\t\t\t<Button onClick={async () => await authClient.customer.portal()}>\n\t\t\t\t\tManage Subscription\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<Button onClick={async () => await authClient.checkout({ slug: \"pro\" })}>\n\t\t\t\t\tUpgrade to Pro\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t\t{{/if}}\n\t\t</>\n\t);\n}\n`],\n [\"auth/better-auth/web/react/next/src/app/dashboard/page.tsx.hbs\", `import { redirect } from \"next/navigation\";\nimport Dashboard from \"./dashboard\";\nimport { headers } from \"next/headers\";\n{{#if (eq backend \"self\")}}\nimport { auth } from \"@{{projectName}}/auth\";\n{{/if}}\nimport { authClient } from \"@/lib/auth-client\";\n\nexport default async function DashboardPage() {\n\t{{#if (eq backend \"self\")}}\n\tconst session = await auth.api.getSession({\n\t\theaders: await headers(),\n\t});\n\t{{else}}\n\tconst session = await authClient.getSession({\n\t\tfetchOptions: {\n\t\t\theaders: await headers(),\n\t\t\tthrow: true\n\t\t}\n\t});\n\t{{/if}}\n\n\tif (!session?.user) {\n\t\tredirect(\"/login\");\n\t}\n\n\t{{#if (eq payments \"polar\")}}\n\tconst { data: customerState } = await authClient.customer.state({\n\t\tfetchOptions: {\n\t\t\theaders: await headers(),\n\t\t},\n\t});\n\t{{/if}}\n\n\treturn (\n\t\t<div>\n\t\t\t<h1>Dashboard</h1>\n\t\t\t<p>Welcome {session.user.name}</p>\n\t\t\t<Dashboard session={session} {{#if (eq payments \"polar\")}}customerState={customerState}{{/if}} />\n\t\t</div>\n\t);\n}\n`],\n [\"auth/better-auth/web/react/next/src/app/login/page.tsx.hbs\", `\"use client\"\n\nimport SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport { useState } from \"react\";\n\n\nexport default function LoginPage() {\n const [showSignIn, setShowSignIn] = useState(false);\n\n return showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n );\n}\n`],\n [\"payments/polar/web/react/next/src/app/success/page.tsx.hbs\", `export default async function SuccessPage({\n searchParams,\n}: {\n searchParams: Promise<{ checkout_id: string }>\n}) {\n const params = await searchParams;\n const checkout_id = params.checkout_id;\n\n return (\n <div className=\"px-4 py-8\">\n <h1>Payment Successful!</h1>\n {checkout_id && <p>Checkout ID: {checkout_id}</p>}\n </div>\n );\n}\n`],\n [\"auth/clerk/convex/web/react/tanstack-router/src/routes/dashboard.tsx.hbs\", `import { SignInButton, UserButton, useUser } from \"@clerk/clerk-react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport {\n\tAuthenticated,\n\tAuthLoading,\n\tUnauthenticated,\n\tuseQuery,\n} from \"convex/react\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\tconst privateData = useQuery(api.privateData.get);\n\tconst user = useUser()\n\n\treturn (\n\t\t<>\n\t\t\t<Authenticated>\n\t\t\t\t<div>\n\t\t\t\t\t<h1>Dashboard</h1>\n\t\t\t\t\t<p>Welcome {user.user?.fullName}</p>\n\t\t\t\t\t<p>privateData: {privateData?.message}</p>\n\t\t\t\t\t<UserButton />\n\t\t\t\t</div>\n\t\t\t</Authenticated>\n\t\t\t<Unauthenticated>\n\t\t\t\t<SignInButton />\n\t\t\t</Unauthenticated>\n\t\t\t<AuthLoading>\n\t\t\t\t<div>Loading...</div>\n\t\t\t</AuthLoading>\n\t\t</>\n\t);\n}\n`],\n [\"auth/better-auth/fullstack/tanstack-start/src/routes/api/auth/$.ts.hbs\", `import { auth } from '@{{projectName}}/auth'\nimport { createFileRoute } from '@tanstack/react-router'\n\nexport const Route = createFileRoute('/api/auth/$')({\n server: {\n handlers: {\n GET: ({ request }) => {\n return auth.handler(request)\n },\n POST: ({ request }) => {\n return auth.handler(request)\n },\n },\n },\n})\n`],\n [\"auth/clerk/convex/web/react/react-router/src/routes/dashboard.tsx.hbs\", `import { SignInButton, UserButton, useUser } from \"@clerk/clerk-react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n\tAuthenticated,\n\tAuthLoading,\n\tUnauthenticated,\n\tuseQuery,\n} from \"convex/react\";\n\nexport default function Dashboard() {\n\tconst privateData = useQuery(api.privateData.get);\n\tconst user = useUser();\n\n\treturn (\n\t\t<>\n\t\t\t<Authenticated>\n\t\t\t\t<div>\n\t\t\t\t\t<h1>Dashboard</h1>\n\t\t\t\t\t<p>Welcome {user.user?.fullName}</p>\n\t\t\t\t\t<p>privateData: {privateData?.message}</p>\n\t\t\t\t\t<UserButton />\n\t\t\t\t</div>\n\t\t\t</Authenticated>\n\t\t\t<Unauthenticated>\n\t\t\t\t<SignInButton />\n\t\t\t</Unauthenticated>\n\t\t\t<AuthLoading>\n\t\t\t\t<div>Loading...</div>\n\t\t\t</AuthLoading>\n\t\t</>\n\t);\n}\n`],\n [\"auth/clerk/convex/web/react/tanstack-start/src/routes/dashboard.tsx.hbs\", `import { SignInButton, UserButton, useUser } from \"@clerk/tanstack-react-start\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport {\n\tAuthenticated,\n\tAuthLoading,\n\tUnauthenticated,\n\tuseQuery,\n} from \"convex/react\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\tconst privateData = useQuery(api.privateData.get);\n\tconst user = useUser();\n\n\treturn (\n\t\t<>\n\t\t\t<Authenticated>\n\t\t\t\t<div>\n\t\t\t\t\t<h1>Dashboard</h1>\n\t\t\t\t\t<p>Welcome {user.user?.fullName}</p>\n\t\t\t\t\t<p>privateData: {privateData?.message}</p>\n\t\t\t\t\t<UserButton />\n\t\t\t\t</div>\n\t\t\t</Authenticated>\n\t\t\t<Unauthenticated>\n\t\t\t\t<SignInButton />\n\t\t\t</Unauthenticated>\n\t\t\t<AuthLoading>\n\t\t\t\t<div>Loading...</div>\n\t\t\t</AuthLoading>\n\t\t</>\n\t);\n}\n`],\n [\"auth/better-auth/server/db/prisma/mysql/prisma/schema/auth.prisma.hbs\", `model User {\n id String @id\n name String @db.Text\n email String\n emailVerified Boolean @default(false)\n image String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String? @db.Text\n userAgent String? @db.Text\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId(length: 191)])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String @db.Text\n providerId String @db.Text\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String? @db.Text\n refreshToken String? @db.Text\n idToken String? @db.Text\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String? @db.Text\n password String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId(length: 191)])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id\n identifier String @db.Text\n value String @db.Text\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier(length: 191)])\n @@map(\"verification\")\n}\n`],\n [\"auth/better-auth/server/db/prisma/postgres/prisma/schema/auth.prisma.hbs\", `model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n`],\n [\"auth/better-auth/server/db/drizzle/mysql/src/schema/auth.ts.hbs\", `import { relations } from \"drizzle-orm\";\nimport {\n mysqlTable,\n varchar,\n text,\n timestamp,\n boolean,\n index,\n} from \"drizzle-orm/mysql-core\";\n\nexport const user = mysqlTable(\"user\", {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n name: varchar(\"name\", { length: 255 }).notNull(),\n email: varchar(\"email\", { length: 255 }).notNull().unique(),\n emailVerified: boolean(\"email_verified\").default(false).notNull(),\n image: text(\"image\"),\n createdAt: timestamp(\"created_at\", { fsp: 3 }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { fsp: 3 })\n .defaultNow()\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n});\n\nexport const session = mysqlTable(\n \"session\",\n {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n expiresAt: timestamp(\"expires_at\", { fsp: 3 }).notNull(),\n token: varchar(\"token\", { length: 255 }).notNull().unique(),\n createdAt: timestamp(\"created_at\", { fsp: 3 }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { fsp: 3 })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: varchar(\"user_id\", { length: 36 })\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n },\n (table) => [index(\"session_userId_idx\").on(table.userId)],\n);\n\nexport const account = mysqlTable(\n \"account\",\n {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: varchar(\"user_id\", { length: 36 })\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\", { fsp: 3 }),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { fsp: 3 }),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: timestamp(\"created_at\", { fsp: 3 }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { fsp: 3 })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"account_userId_idx\").on(table.userId)],\n);\n\nexport const verification = mysqlTable(\n \"verification\",\n {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n identifier: varchar(\"identifier\", { length: 255 }).notNull(),\n value: text(\"value\").notNull(),\n expiresAt: timestamp(\"expires_at\", { fsp: 3 }).notNull(),\n createdAt: timestamp(\"created_at\", { fsp: 3 }).defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\", { fsp: 3 })\n .defaultNow()\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"verification_identifier_idx\").on(table.identifier)],\n);\n\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/components/user-menu.tsx.hbs\", `import {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n\nimport { Button } from \"./ui/button\";\n\nexport default function UserMenu() {\n const user = useQuery(api.auth.getCurrentUser)\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {user?.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{user?.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n location.reload();\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignUpForm({\n onSwitchToSignIn,\n}: {\n onSwitchToSignIn: () => void;\n}) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignInForm({\n onSwitchToSignUp,\n}: {\n onSwitchToSignUp: () => void;\n}) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/react\";\nimport { convexClient } from \"@convex-dev/better-auth/client/plugins\";\n\nexport const authClient = createAuthClient({\n plugins: [convexClient()],\n});`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/lib/auth-server.ts.hbs\", `import { convexBetterAuthReactStart } from \"@convex-dev/better-auth/react-start\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const {\n\thandler,\n\tgetToken,\n\tfetchAuthQuery,\n\tfetchAuthMutation,\n\tfetchAuthAction,\n} = convexBetterAuthReactStart({\n\tconvexUrl: env.VITE_CONVEX_URL,\n\tconvexSiteUrl: env.VITE_CONVEX_SITE_URL,\n});\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/routes/dashboard.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport UserMenu from \"@/components/user-menu\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport {\n Authenticated,\n AuthLoading,\n Unauthenticated,\n useQuery,\n} from \"convex/react\";\nimport { useState } from \"react\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [showSignIn, setShowSignIn] = useState(false);\n const privateData = useQuery(api.privateData.get);\n\n return (\n <>\n <Authenticated>\n <div>\n <h1>Dashboard</h1>\n <p>privateData: {privateData?.message}</p>\n <UserMenu />\n </div>\n </Authenticated>\n <Unauthenticated>\n {showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n )}\n </Unauthenticated>\n <AuthLoading>\n <div>Loading...</div>\n </AuthLoading>\n </>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/next/src/components/user-menu.tsx.hbs\", `import {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { Button } from \"./ui/button\";\nimport { useRouter } from \"next/navigation\";\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n\nexport default function UserMenu() {\n\tconst router = useRouter();\n\tconst user = useQuery(api.auth.getCurrentUser)\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n\t\t\t\t{user?.name}\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"bg-card\">\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t<DropdownMenuLabel>My Account</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t<DropdownMenuItem>{user?.email}</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tauthClient.signOut({\n\t\t\t\t\t\t\t\tfetchOptions: {\n\t\t\t\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\t\t\t\trouter.push(\"/dashboard\");\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tSign Out\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n`],\n [\"auth/better-auth/convex/web/react/next/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { useRouter } from \"next/navigation\";\n\nexport default function SignUpForm({\n\tonSwitchToSignIn,\n}: {\n\tonSwitchToSignIn: () => void;\n}) {\n\tconst router = useRouter();\n\n\tconst form = useForm({\n\t\tdefaultValues: {\n\t\t\temail: \"\",\n\t\t\tpassword: \"\",\n\t\t\tname: \"\",\n\t\t},\n\t\tonSubmit: async ({ value }) => {\n\t\t\tawait authClient.signUp.email(\n\t\t\t\t{\n\t\t\t\t\temail: value.email,\n\t\t\t\t\tpassword: value.password,\n\t\t\t\t\tname: value.name,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\trouter.push(\"/dashboard\");\n\t\t\t\t\t\ttoast.success(\"Sign up successful\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.error.message || error.error.statusText);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tvalidators: {\n\t\t\tonSubmit: z.object({\n\t\t\t\tname: z.string().min(2, \"Name must be at least 2 characters\"),\n\t\t\t\temail: z.email(\"Invalid email address\"),\n\t\t\t\tpassword: z.string().min(8, \"Password must be at least 8 characters\"),\n\t\t\t}),\n\t\t},\n\t});\n\n\treturn (\n\t\t<div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n\t\t\t<h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n\t\t\t<form\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tform.handleSubmit();\n\t\t\t\t}}\n\t\t\t\tclassName=\"space-y-4\"\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t<form.Field name=\"name\">\n\t\t\t\t\t\t{(field) => (\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<Label htmlFor={field.name}>Name</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\t\t\t\tonBlur={field.handleBlur}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.handleChange(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{field.state.meta.errors.map((error) => (\n\t\t\t\t\t\t\t\t\t<p key={error?.message} className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t{error?.message}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</form.Field>\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<form.Field name=\"email\">\n\t\t\t\t\t\t{(field) => (\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<Label htmlFor={field.name}>Email</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\t\t\t\tonBlur={field.handleBlur}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.handleChange(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{field.state.meta.errors.map((error) => (\n\t\t\t\t\t\t\t\t\t<p key={error?.message} className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t{error?.message}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</form.Field>\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<form.Field name=\"password\">\n\t\t\t\t\t\t{(field) => (\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<Label htmlFor={field.name}>Password</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\t\t\t\tonBlur={field.handleBlur}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.handleChange(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{field.state.meta.errors.map((error) => (\n\t\t\t\t\t\t\t\t\t<p key={error?.message} className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t{error?.message}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</form.Field>\n\t\t\t\t</div>\n\n\t\t\t\t<form.Subscribe>\n\t\t\t\t\t{(state) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\tdisabled={!state.canSubmit || state.isSubmitting}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</form.Subscribe>\n\t\t\t</form>\n\n\t\t\t<div className=\"mt-4 text-center\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"link\"\n\t\t\t\t\tonClick={onSwitchToSignIn}\n\t\t\t\t\tclassName=\"text-indigo-600 hover:text-indigo-800\"\n\t\t\t\t>\n\t\t\t\t\tAlready have an account? Sign In\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n`],\n [\"auth/better-auth/convex/web/react/next/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { useRouter } from \"next/navigation\";\n\nexport default function SignInForm({\n\tonSwitchToSignUp,\n}: {\n\tonSwitchToSignUp: () => void;\n}) {\n\tconst router = useRouter();\n\n\tconst form = useForm({\n\t\tdefaultValues: {\n\t\t\temail: \"\",\n\t\t\tpassword: \"\",\n\t\t},\n\t\tonSubmit: async ({ value }) => {\n\t\t\tawait authClient.signIn.email(\n\t\t\t\t{\n\t\t\t\t\temail: value.email,\n\t\t\t\t\tpassword: value.password,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\trouter.push(\"/dashboard\");\n\t\t\t\t\t\ttoast.success(\"Sign in successful\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.error.message || error.error.statusText);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tvalidators: {\n\t\t\tonSubmit: z.object({\n\t\t\t\temail: z.email(\"Invalid email address\"),\n\t\t\t\tpassword: z.string().min(8, \"Password must be at least 8 characters\"),\n\t\t\t}),\n\t\t},\n\t});\n\n\treturn (\n\t\t<div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n\t\t\t<h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n\t\t\t<form\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tform.handleSubmit();\n\t\t\t\t}}\n\t\t\t\tclassName=\"space-y-4\"\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t<form.Field name=\"email\">\n\t\t\t\t\t\t{(field) => (\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<Label htmlFor={field.name}>Email</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\t\t\t\tonBlur={field.handleBlur}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.handleChange(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{field.state.meta.errors.map((error) => (\n\t\t\t\t\t\t\t\t\t<p key={error?.message} className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t{error?.message}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</form.Field>\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t<form.Field name=\"password\">\n\t\t\t\t\t\t{(field) => (\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<Label htmlFor={field.name}>Password</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tid={field.name}\n\t\t\t\t\t\t\t\t\tname={field.name}\n\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\tvalue={field.state.value}\n\t\t\t\t\t\t\t\t\tonBlur={field.handleBlur}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.handleChange(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{field.state.meta.errors.map((error) => (\n\t\t\t\t\t\t\t\t\t<p key={error?.message} className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t{error?.message}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</form.Field>\n\t\t\t\t</div>\n\n\t\t\t\t<form.Subscribe>\n\t\t\t\t\t{(state) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\tdisabled={!state.canSubmit || state.isSubmitting}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</form.Subscribe>\n\t\t\t</form>\n\n\t\t\t<div className=\"mt-4 text-center\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"link\"\n\t\t\t\t\tonClick={onSwitchToSignUp}\n\t\t\t\t\tclassName=\"text-indigo-600 hover:text-indigo-800\"\n\t\t\t\t>\n\t\t\t\t\tNeed an account? Sign Up\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n`],\n [\"auth/better-auth/convex/web/react/next/src/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/react\";\nimport { convexClient } from \"@convex-dev/better-auth/client/plugins\";\n\nexport const authClient = createAuthClient({\n plugins: [convexClient()],\n});\n`],\n [\"auth/better-auth/convex/web/react/next/src/lib/auth-server.ts.hbs\", `import { convexBetterAuthNextJs } from \"@convex-dev/better-auth/nextjs\";\nimport { isAuthError } from \"@/lib/utils\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const {\n\thandler,\n\tpreloadAuthQuery,\n\tisAuthenticated,\n\tgetToken,\n\tfetchAuthQuery,\n\tfetchAuthMutation,\n\tfetchAuthAction,\n} = convexBetterAuthNextJs({\n\tconvexUrl: env.NEXT_PUBLIC_CONVEX_URL,\n\tconvexSiteUrl: env.NEXT_PUBLIC_CONVEX_SITE_URL,\n});\n`],\n [\"auth/better-auth/server/db/mongoose/mongodb/src/models/auth.model.ts.hbs\", `import mongoose from 'mongoose';\n\nconst { Schema, model } = mongoose;\n\nconst userSchema = new Schema(\n {\n _id: { type: String },\n name: { type: String, required: true },\n email: { type: String, required: true, unique: true },\n emailVerified: { type: Boolean, required: true },\n image: { type: String },\n createdAt: { type: Date, required: true },\n updatedAt: { type: Date, required: true },\n },\n { collection: 'user' }\n);\n\nconst sessionSchema = new Schema(\n {\n _id: { type: String },\n expiresAt: { type: Date, required: true },\n token: { type: String, required: true, unique: true },\n createdAt: { type: Date, required: true },\n updatedAt: { type: Date, required: true },\n ipAddress: { type: String },\n userAgent: { type: String },\n userId: { type: String, ref: 'User', required: true },\n },\n { collection: 'session' }\n);\n\nconst accountSchema = new Schema(\n {\n _id: { type: String },\n accountId: { type: String, required: true },\n providerId: { type: String, required: true },\n userId: { type: String, ref: 'User', required: true },\n accessToken: { type: String },\n refreshToken: { type: String },\n idToken: { type: String },\n accessTokenExpiresAt: { type: Date },\n refreshTokenExpiresAt: { type: Date },\n scope: { type: String },\n password: { type: String },\n createdAt: { type: Date, required: true },\n updatedAt: { type: Date, required: true },\n },\n { collection: 'account' }\n);\n\nconst verificationSchema = new Schema(\n {\n _id: { type: String },\n identifier: { type: String, required: true },\n value: { type: String, required: true },\n expiresAt: { type: Date, required: true },\n createdAt: { type: Date },\n updatedAt: { type: Date },\n },\n { collection: 'verification' }\n);\n\nconst User = model('User', userSchema);\nconst Session = model('Session', sessionSchema);\nconst Account = model('Account', accountSchema);\nconst Verification = model('Verification', verificationSchema);\n\nexport { User, Session, Account, Verification };\n`],\n [\"auth/better-auth/server/db/prisma/mongodb/prisma/schema/auth.prisma.hbs\", `model User {\n id String @id @map(\"_id\")\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id @map(\"_id\")\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id @map(\"_id\")\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id @map(\"_id\")\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-router/src/components/user-menu.tsx.hbs\", `import { useNavigate } from \"@tanstack/react-router\";\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { authClient } from \"@/lib/auth-client\";\nimport { useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\n\nimport { Button } from \"./ui/button\";\n\nexport default function UserMenu() {\n const navigate = useNavigate();\n const user = useQuery(api.auth.getCurrentUser)\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\" />}>\n {user?.name}\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-card\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>{user?.email}</DropdownMenuItem>\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={() => {\n authClient.signOut({\n fetchOptions: {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n },\n },\n });\n }}\n >\n Sign Out\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-router/src/components/sign-up-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignUpForm({\n onSwitchToSignIn,\n}: {\n onSwitchToSignIn: () => void;\n}) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n name: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signUp.email(\n {\n email: value.email,\n password: value.password,\n name: value.name,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign up successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n name: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Create Account</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Name</Label>\n <Input\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign Up\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignIn}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Already have an account? Sign In\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-router/src/components/sign-in-form.tsx.hbs\", `import { authClient } from \"@/lib/auth-client\";\nimport { useForm } from \"@tanstack/react-form\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport z from \"zod\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport default function SignInForm({\n onSwitchToSignUp,\n}: {\n onSwitchToSignUp: () => void;\n}) {\n const navigate = useNavigate({\n from: \"/\",\n });\n\n const form = useForm({\n defaultValues: {\n email: \"\",\n password: \"\",\n },\n onSubmit: async ({ value }) => {\n await authClient.signIn.email(\n {\n email: value.email,\n password: value.password,\n },\n {\n onSuccess: () => {\n navigate({\n to: \"/dashboard\",\n });\n toast.success(\"Sign in successful\");\n },\n onError: (error) => {\n toast.error(error.error.message || error.error.statusText);\n },\n },\n );\n },\n validators: {\n onSubmit: z.object({\n email: z.email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n }),\n },\n });\n\n return (\n <div className=\"mx-auto w-full mt-10 max-w-md p-6\">\n <h1 className=\"mb-6 text-center text-3xl font-bold\">Welcome Back</h1>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n <div>\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Email</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"email\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <div>\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-2\">\n <Label htmlFor={field.name}>Password</Label>\n <Input\n id={field.name}\n name={field.name}\n type=\"password\"\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n />\n {field.state.meta.errors.map((error) => (\n <p key={error?.message} className=\"text-red-500\">\n {error?.message}\n </p>\n ))}\n </div>\n )}\n </form.Field>\n </div>\n\n <form.Subscribe>\n {(state) => (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!state.canSubmit || state.isSubmitting}\n >\n {state.isSubmitting ? \"Submitting...\" : \"Sign In\"}\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n <div className=\"mt-4 text-center\">\n <Button\n variant=\"link\"\n onClick={onSwitchToSignUp}\n className=\"text-indigo-600 hover:text-indigo-800\"\n >\n Need an account? Sign Up\n </Button>\n </div>\n </div>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-router/src/lib/auth-client.ts.hbs\", `import { createAuthClient } from \"better-auth/react\";\nimport {\n\tconvexClient,\n\tcrossDomainClient,\n} from \"@convex-dev/better-auth/client/plugins\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport const authClient = createAuthClient({\n\tbaseURL: env.VITE_CONVEX_SITE_URL,\n\tplugins: [convexClient(), crossDomainClient()],\n});`],\n [\"auth/better-auth/server/db/prisma/sqlite/prisma/schema/auth.prisma.hbs\", `model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n`],\n [\"auth/better-auth/server/db/drizzle/sqlite/src/schema/auth.ts.hbs\", `import { relations, sql } from \"drizzle-orm\";\nimport { sqliteTable, text, integer, index } from \"drizzle-orm/sqlite-core\";\n\nexport const user = sqliteTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: integer(\"email_verified\", { mode: \"boolean\" })\n .default(false)\n .notNull(),\n image: text(\"image\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n});\n\nexport const session = sqliteTable(\n \"session\",\n {\n id: text(\"id\").primaryKey(),\n expiresAt: integer(\"expires_at\", { mode: \"timestamp_ms\" }).notNull(),\n token: text(\"token\").notNull().unique(),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n },\n (table) => [index(\"session_userId_idx\").on(table.userId)],\n);\n\nexport const account = sqliteTable(\n \"account\",\n {\n id: text(\"id\").primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: integer(\"access_token_expires_at\", {\n mode: \"timestamp_ms\",\n }),\n refreshTokenExpiresAt: integer(\"refresh_token_expires_at\", {\n mode: \"timestamp_ms\",\n }),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"account_userId_idx\").on(table.userId)],\n);\n\nexport const verification = sqliteTable(\n \"verification\",\n {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: integer(\"expires_at\", { mode: \"timestamp_ms\" }).notNull(),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"verification_identifier_idx\").on(table.identifier)],\n);\n\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n`],\n [\"auth/better-auth/server/db/drizzle/postgres/src/schema/auth.ts.hbs\", `import { relations } from \"drizzle-orm\";\nimport { pgTable, text, timestamp, boolean, index } from \"drizzle-orm/pg-core\";\n\nexport const user = pgTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"email_verified\").default(false).notNull(),\n image: text(\"image\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\")\n .defaultNow()\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n});\n\nexport const session = pgTable(\n \"session\",\n {\n id: text(\"id\").primaryKey(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n token: text(\"token\").notNull().unique(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\")\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n },\n (table) => [index(\"session_userId_idx\").on(table.userId)],\n);\n\nexport const account = pgTable(\n \"account\",\n {\n id: text(\"id\").primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\"),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\"),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\")\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"account_userId_idx\").on(table.userId)],\n);\n\nexport const verification = pgTable(\n \"verification\",\n {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\")\n .defaultNow()\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"verification_identifier_idx\").on(table.identifier)],\n);\n\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n`],\n [\"auth/better-auth/convex/web/react/tanstack-router/src/routes/dashboard.tsx.hbs\", `import SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport UserMenu from \"@/components/user-menu\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport {\n Authenticated,\n AuthLoading,\n Unauthenticated,\n useQuery,\n} from \"convex/react\";\nimport { useState } from \"react\";\n\nexport const Route = createFileRoute(\"/dashboard\")({\n component: RouteComponent,\n});\n\nfunction RouteComponent() {\n const [showSignIn, setShowSignIn] = useState(false);\n const privateData = useQuery(api.privateData.get);\n\n return (\n <>\n <Authenticated>\n <div>\n <h1>Dashboard</h1>\n <p>privateData: {privateData?.message}</p>\n <UserMenu />\n </div>\n </Authenticated>\n <Unauthenticated>\n {showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n )}\n </Unauthenticated>\n <AuthLoading>\n <div>Loading...</div>\n </AuthLoading>\n </>\n );\n}\n`],\n [\"examples/ai/fullstack/next/src/app/api/ai/route.ts.hbs\", `import { google } from \"@ai-sdk/google\";\nimport { streamText, type UIMessage, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n\nexport const maxDuration = 30;\n\nexport async function POST(req: Request) {\n\tconst { messages }: { messages: UIMessage[] } = await req.json();\n\n\tconst model = wrapLanguageModel({\n\t\tmodel: google(\"gemini-2.5-flash\"),\n\t\tmiddleware: devToolsMiddleware(),\n\t});\n\tconst result = streamText({\n\t\tmodel,\n\t\tmessages: await convertToModelMessages(messages),\n\t});\n\n\treturn result.toUIMessageStreamResponse();\n}\n`],\n [\"examples/ai/fullstack/tanstack-start/src/routes/api/ai/$.ts.hbs\", `import { createFileRoute } from \"@tanstack/react-router\";\nimport { google } from \"@ai-sdk/google\";\nimport { streamText, type UIMessage, convertToModelMessages, wrapLanguageModel } from \"ai\";\nimport { devToolsMiddleware } from \"@ai-sdk/devtools\";\n\nexport const Route = createFileRoute(\"/api/ai/$\")({\n server: {\n handlers: {\n POST: async ({ request }) => {\n try {\n const { messages }: { messages: UIMessage[] } = await request.json();\n\n const model = wrapLanguageModel({\n model: google(\"gemini-2.5-flash\"),\n middleware: devToolsMiddleware(),\n });\n const result = streamText({\n model,\n messages: await convertToModelMessages(messages),\n });\n\n return result.toUIMessageStreamResponse();\n } catch (error) {\n console.error(\"AI API error:\", error);\n return new Response(\n JSON.stringify({ error: \"Failed to process AI request\" }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n },\n },\n },\n});\n`],\n [\"api/orpc/fullstack/next/src/app/api/rpc/[[...rest]]/route.ts.hbs\", `import { createContext } from \"@{{projectName}}/api/context\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { onError } from \"@orpc/server\";\nimport { NextRequest } from \"next/server\";\n\nconst rpcHandler = new RPCHandler(appRouter, {\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\nconst apiHandler = new OpenAPIHandler(appRouter, {\n\tplugins: [\n\t\tnew OpenAPIReferencePlugin({\n\t\t\tschemaConverters: [new ZodToJsonSchemaConverter()],\n\t\t}),\n\t],\n\tinterceptors: [\n\t\tonError((error) => {\n\t\t\tconsole.error(error);\n\t\t}),\n\t],\n});\n\nasync function handleRequest(req: NextRequest) {\n\tconst rpcResult = await rpcHandler.handle(req, {\n\t\tprefix: \"/api/rpc\",\n\t\tcontext: await createContext(req),\n\t});\n\tif (rpcResult.response) return rpcResult.response;\n\n\tconst apiResult = await apiHandler.handle(req, {\n\t\tprefix: \"/api/rpc/api-reference\",\n\t\tcontext: await createContext(req),\n\t});\n\tif (apiResult.response) return apiResult.response;\n\n\treturn new Response(\"Not found\", { status: 404 });\n}\n\nexport const GET = handleRequest;\nexport const POST = handleRequest;\nexport const PUT = handleRequest;\nexport const PATCH = handleRequest;\nexport const DELETE = handleRequest;`],\n [\"examples/ai/web/react/next/src/app/ai/page.tsx.hbs\", `{{#if (eq backend \"convex\")}}\n\"use client\";\n\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n useUIMessages,\n useSmoothText,\n type UIMessage,\n} from \"@convex-dev/agent/react\";\nimport { useMutation } from \"convex/react\";\nimport { Send, Loader2 } from \"lucide-react\";\n{{#if (eq webDeploy \"cloudflare\")}}\nimport dynamic from \"next/dynamic\";\n\nconst Streamdown = dynamic(\n () => import(\"streamdown\").then((mod) => ({ default: mod.Streamdown })),\n {\n loading: () => (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"text-muted-foreground\">Loading response...</div>\n </div>\n ),\n ssr: false,\n }\n);\n{{else}}\nimport { Streamdown } from \"streamdown\";\n{{/if}}\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\nfunction MessageContent({\n text,\n isStreaming,\n}: {\n text: string;\n isStreaming: boolean;\n}) {\n const [visibleText] = useSmoothText(text, {\n startStreaming: isStreaming,\n });\n return <Streamdown>{visibleText}</Streamdown>;\n}\n\nexport default function AIPage() {\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const createThread = useMutation(api.chat.createNewThread);\n const sendMessage = useMutation(api.chat.sendMessage);\n\n const { results: messages } = useUIMessages(\n api.chat.listMessages,\n threadId ? { threadId } : \"skip\",\n { initialNumItems: 50, stream: true },\n );\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const hasStreamingMessage = messages?.some(\n (m: UIMessage) => m.status === \"streaming\",\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text || isLoading) return;\n\n setIsLoading(true);\n setInput(\"\");\n\n try {\n let currentThreadId = threadId;\n if (!currentThreadId) {\n currentThreadId = await createThread();\n setThreadId(currentThreadId);\n }\n\n await sendMessage({ threadId: currentThreadId, prompt: text });\n } catch (error) {\n console.error(\"Failed to send message:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {!messages || messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message: UIMessage) => (\n <div\n key={message.key}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n <MessageContent\n text={message.text ?? \"\"}\n isStreaming={message.status === \"streaming\"}\n />\n </div>\n ))\n )}\n {isLoading && !hasStreamingMessage && (\n <div className=\"p-3 rounded-lg bg-secondary/20 mr-8\">\n <p className=\"text-sm font-semibold mb-1\">AI Assistant</p>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Thinking...</span>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n disabled={isLoading}\n />\n <Button type=\"submit\" size=\"icon\" disabled={isLoading || !input.trim()}>\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </Button>\n </form>\n </div>\n );\n}\n{{else}}\n\"use client\";\n\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { Send } from \"lucide-react\";\n{{#if (eq webDeploy \"cloudflare\")}}\nimport dynamic from \"next/dynamic\";\n\nconst Streamdown = dynamic(\n () => import(\"streamdown\").then((mod) => ({ default: mod.Streamdown })),\n {\n loading: () => (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"text-muted-foreground\">Loading response...</div>\n </div>\n ),\n ssr: false,\n }\n);\n{{else}}\nimport { Streamdown } from \"streamdown\";\n{{/if}}\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { env } from \"@{{projectName}}/env/web\";\n\nexport default function AIPage() {\n const [input, setInput] = useState(\"\");\n const { messages, sendMessage, status } = useChat({\n transport: new DefaultChatTransport({\n api: {{#if (eq backend \"self\")}}\"/api/ai\"{{else}}\\`\\${env.NEXT_PUBLIC_SERVER_URL}/ai\\`{{/if}},\n }),\n });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const text = input.trim();\n if (!text) return;\n sendMessage({ text });\n setInput(\"\");\n };\n\n return (\n <div className=\"grid grid-rows-[1fr_auto] overflow-hidden w-full mx-auto p-4\">\n <div className=\"overflow-y-auto space-y-4 pb-4\">\n {messages.length === 0 ? (\n <div className=\"text-center text-muted-foreground mt-8\">\n Ask me anything to get started!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n className={\\`p-3 rounded-lg \\${\n message.role === \"user\"\n ? \"bg-primary/10 ml-8\"\n : \"bg-secondary/20 mr-8\"\n }\\`}\n >\n <p className=\"text-sm font-semibold mb-1\">\n {message.role === \"user\" ? \"You\" : \"AI Assistant\"}\n </p>\n {message.parts?.map((part, index) => {\n if (part.type === \"text\") {\n return (\n <Streamdown\n key={index}\n isAnimating={status === \"streaming\" && message.role === \"assistant\"}\n >\n {part.text}\n </Streamdown>\n );\n }\n return null;\n })}\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"w-full flex items-center space-x-2 pt-2 border-t\"\n >\n <Input\n name=\"prompt\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type your message...\"\n className=\"flex-1\"\n autoComplete=\"off\"\n autoFocus\n />\n <Button type=\"submit\" size=\"icon\">\n <Send size={18} />\n </Button>\n </form>\n </div>\n );\n}\n{{/if}}\n`],\n [\"api/trpc/fullstack/next/src/app/api/trpc/[trpc]/route.ts.hbs\", `import { fetchRequestHandler } from \"@trpc/server/adapters/fetch\";\nimport { appRouter } from \"@{{projectName}}/api/routers/index\";\nimport { createContext } from \"@{{projectName}}/api/context\";\nimport { NextRequest } from \"next/server\";\n\nfunction handler(req: NextRequest) {\n\treturn fetchRequestHandler({\n\t\tendpoint: \"/api/trpc\",\n\t\treq,\n\t\trouter: appRouter,\n\t\tcreateContext: () => createContext(req),\n\t});\n}\nexport { handler as GET, handler as POST };\n`],\n [\"examples/todo/web/react/next/src/app/todos/page.tsx.hbs\", `\"use client\"\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Input } from \"@/components/ui/input\";\nimport { Loader2, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\n\n{{#if (eq backend \"convex\")}}\nimport { useMutation, useQuery } from \"convex/react\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport type { Id } from \"@{{projectName}}/backend/convex/_generated/dataModel\";\n{{else}}\nimport { useMutation, useQuery } from \"@tanstack/react-query\";\n {{#if (eq api \"orpc\")}}\nimport { orpc } from \"@/utils/orpc\";\n {{/if}}\n {{#if (eq api \"trpc\")}}\nimport { trpc } from \"@/utils/trpc\";\n {{/if}}\n{{/if}}\n\n\nexport default function TodosPage() {\n const [newTodoText, setNewTodoText] = useState(\"\");\n\n {{#if (eq backend \"convex\")}}\n const todos = useQuery(api.todos.getAll);\n const createTodoMutation = useMutation(api.todos.create);\n const toggleTodoMutation = useMutation(api.todos.toggle);\n const deleteTodoMutation = useMutation(api.todos.deleteTodo);\n\n const handleAddTodo = async (e: React.FormEvent) => {\n e.preventDefault();\n const text = newTodoText.trim();\n if (!text) return;\n await createTodoMutation({ text });\n setNewTodoText(\"\");\n };\n\n const handleToggleTodo = (id: Id<\"todos\">, currentCompleted: boolean) => {\n toggleTodoMutation({ id, completed: !currentCompleted });\n };\n\n const handleDeleteTodo = (id: Id<\"todos\">) => {\n deleteTodoMutation({ id });\n };\n {{else}}\n {{#if (eq api \"orpc\")}}\n const todos = useQuery(orpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n orpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n orpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n orpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n {{#if (eq api \"trpc\")}}\n const todos = useQuery(trpc.todo.getAll.queryOptions());\n const createMutation = useMutation(\n trpc.todo.create.mutationOptions({\n onSuccess: () => {\n todos.refetch();\n setNewTodoText(\"\");\n },\n }),\n );\n const toggleMutation = useMutation(\n trpc.todo.toggle.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n const deleteMutation = useMutation(\n trpc.todo.delete.mutationOptions({\n onSuccess: () => { todos.refetch() },\n }),\n );\n {{/if}}\n\n const handleAddTodo = (e: React.FormEvent) => {\n e.preventDefault();\n if (newTodoText.trim()) {\n createMutation.mutate({ text: newTodoText });\n }\n };\n\n const handleToggleTodo = (id: number, completed: boolean) => {\n toggleMutation.mutate({ id, completed: !completed });\n };\n\n const handleDeleteTodo = (id: number) => {\n deleteMutation.mutate({ id });\n };\n {{/if}}\n\n return (\n <div className=\"mx-auto w-full max-w-md py-10\">\n <Card>\n <CardHeader>\n <CardTitle>Todo List</CardTitle>\n <CardDescription>Manage your tasks efficiently</CardDescription>\n </CardHeader>\n <CardContent>\n <form\n onSubmit={handleAddTodo}\n className=\"mb-6 flex items-center space-x-2\"\n >\n <Input\n value={newTodoText}\n onChange={(e) => setNewTodoText(e.target.value)}\n placeholder=\"Add a new task...\"\n {{#if (eq backend \"convex\")}}\n {{else}}\n disabled={createMutation.isPending}\n {{/if}}\n />\n <Button\n type=\"submit\"\n {{#if (eq backend \"convex\")}}\n disabled={!newTodoText.trim()}\n {{else}}\n disabled={createMutation.isPending || !newTodoText.trim()}\n {{/if}}\n >\n {{#if (eq backend \"convex\")}}\n Add\n {{else}}\n {createMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n \"Add\"\n )}\n {{/if}}\n </Button>\n </form>\n\n {{#if (eq backend \"convex\")}}\n {todos === undefined ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.length === 0 ? (\n <p className=\"py-4 text-center\">No todos yet. Add one above!</p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.map((todo) => (\n <li\n key={todo._id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo._id, todo.completed)\n }\n id={\\`todo-\\${todo._id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo._id}\\`}\n className={\\`\\${todo.completed ? \"line-through text-muted-foreground\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo._id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{else}}\n {todos.isLoading ? (\n <div className=\"flex justify-center py-4\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : todos.data?.length === 0 ? (\n <p className=\"py-4 text-center\">\n No todos yet. Add one above!\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {todos.data?.map((todo) => (\n <li\n key={todo.id}\n className=\"flex items-center justify-between rounded-md border p-2\"\n >\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={todo.completed}\n onCheckedChange={() =>\n handleToggleTodo(todo.id, todo.completed)\n }\n id={\\`todo-\\${todo.id}\\`}\n />\n <label\n htmlFor={\\`todo-\\${todo.id}\\`}\n className={\\`\\${todo.completed ? \"line-through text-muted-foreground\" : \"\"}\\`}\n >\n {todo.text}\n </label>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteTodo(todo.id)}\n aria-label=\"Delete todo\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {{/if}}\n </CardContent>\n </Card>\n </div>\n );\n}\n`],\n [\"auth/better-auth/fullstack/next/src/app/api/auth/[...all]/route.ts.hbs\", `import { auth } from \"@{{projectName}}/auth\";\nimport { toNextJsHandler } from \"better-auth/next-js\";\n\nexport const { GET, POST } = toNextJsHandler(auth.handler);\n`],\n [\"auth/clerk/convex/web/react/next/src/app/dashboard/page.tsx.hbs\", `\"use client\";\n\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport { SignInButton, UserButton, useUser } from \"@clerk/nextjs\";\nimport { Authenticated, AuthLoading, Unauthenticated, useQuery } from \"convex/react\";\n\nexport default function Dashboard() {\n const user = useUser();\n const privateData = useQuery(api.privateData.get);\n\n return (\n <>\n <Authenticated>\n <div>\n <h1>Dashboard</h1>\n <p>Welcome {user.user?.fullName}</p>\n <p>privateData: {privateData?.message}</p>\n <UserButton />\n </div>\n </Authenticated>\n <Unauthenticated>\n <SignInButton />\n </Unauthenticated>\n <AuthLoading>\n <div>Loading...</div>\n </AuthLoading>\n </>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/next/src/app/dashboard/page.tsx.hbs\", `\"use client\"\n\nimport SignInForm from \"@/components/sign-in-form\";\nimport SignUpForm from \"@/components/sign-up-form\";\nimport UserMenu from \"@/components/user-menu\";\nimport { api } from \"@{{projectName}}/backend/convex/_generated/api\";\nimport {\n Authenticated,\n AuthLoading,\n Unauthenticated,\n useQuery,\n} from \"convex/react\";\nimport { useState } from \"react\";\n\nexport default function DashboardPage() {\n const [showSignIn, setShowSignIn] = useState(false);\n const privateData = useQuery(api.privateData.get);\n\n return (\n <>\n <Authenticated>\n <div>\n <h1>Dashboard</h1>\n <p>privateData: {privateData?.message}</p>\n <UserMenu />\n </div>\n </Authenticated>\n <Unauthenticated>\n {showSignIn ? (\n <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />\n ) : (\n <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />\n )}\n </Unauthenticated>\n <AuthLoading>\n <div>Loading...</div>\n </AuthLoading>\n </>\n );\n}\n`],\n [\"auth/better-auth/convex/web/react/tanstack-start/src/routes/api/auth/$.ts.hbs\", `import { createFileRoute } from \"@tanstack/react-router\";\nimport { handler } from \"@/lib/auth-server\";\n\nexport const Route = createFileRoute(\"/api/auth/$\")({\n server: {\n handlers: {\n GET: ({ request }) => handler(request),\n POST: ({ request }) => handler(request),\n },\n },\n});\n`],\n [\"auth/better-auth/convex/web/react/next/src/app/api/auth/[...all]/route.ts.hbs\", `import { handler } from \"@/lib/auth-server\";\n\nexport const { GET, POST } = handler;\n`]\n]);\n\nexport const TEMPLATE_COUNT = 409;\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoV9D;CACA,CAAC,6DAA6D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyC3D;CACH,CAAC,wDAAwD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwgBtD;CACH,CAAC,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|