tvi-cli 0.1.4

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.
Files changed (306) hide show
  1. package/README.md +147 -0
  2. package/dist/index.js +4315 -0
  3. package/package.json +75 -0
  4. package/templates/addons/biome/biome.json.hbs +83 -0
  5. package/templates/addons/husky/.husky/pre-commit +1 -0
  6. package/templates/addons/pwa/apps/web/next/public/favicon/apple-touch-icon.png +0 -0
  7. package/templates/addons/pwa/apps/web/next/public/favicon/favicon-96x96.png +0 -0
  8. package/templates/addons/pwa/apps/web/next/public/favicon/favicon.svg +6 -0
  9. package/templates/addons/pwa/apps/web/next/public/favicon/site.webmanifest.hbs +21 -0
  10. package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-192x192.png +0 -0
  11. package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-512x512.png +0 -0
  12. package/templates/addons/pwa/apps/web/next/src/app/manifest.ts.hbs +26 -0
  13. package/templates/addons/pwa/apps/web/vite/public/logo.png +0 -0
  14. package/templates/addons/pwa/apps/web/vite/pwa-assets.config.ts.hbs +12 -0
  15. package/templates/addons/turborepo/turbo.json.hbs +43 -0
  16. package/templates/api/orpc/native/utils/orpc.ts.hbs +35 -0
  17. package/templates/api/orpc/server/base/src/lib/context.ts.hbs +125 -0
  18. package/templates/api/orpc/server/base/src/lib/orpc.ts.hbs +21 -0
  19. package/templates/api/orpc/server/next/src/app/rpc/[...all]/route.ts.hbs +23 -0
  20. package/templates/api/orpc/web/nuxt/app/plugins/orpc.ts.hbs +35 -0
  21. package/templates/api/orpc/web/react/base/src/utils/orpc.ts.hbs +42 -0
  22. package/templates/api/orpc/web/solid/src/utils/orpc.ts.hbs +30 -0
  23. package/templates/api/orpc/web/svelte/src/lib/orpc.ts.hbs +31 -0
  24. package/templates/api/trpc/native/utils/trpc.ts.hbs +32 -0
  25. package/templates/api/trpc/server/base/src/lib/context.ts.hbs +127 -0
  26. package/templates/api/trpc/server/base/src/lib/trpc.ts.hbs +26 -0
  27. package/templates/api/trpc/server/next/src/app/trpc/[trpc]/route.ts +14 -0
  28. package/templates/api/trpc/web/react/base/src/utils/trpc.ts.hbs +97 -0
  29. package/templates/auth/native/native-base/lib/auth-client.ts.hbs +13 -0
  30. package/templates/auth/native/nativewind/app/(drawer)/index.tsx.hbs +95 -0
  31. package/templates/auth/native/nativewind/components/sign-in.tsx.hbs +93 -0
  32. package/templates/auth/native/nativewind/components/sign-up.tsx.hbs +104 -0
  33. package/templates/auth/native/unistyles/app/(drawer)/index.tsx.hbs +179 -0
  34. package/templates/auth/native/unistyles/components/sign-in.tsx.hbs +134 -0
  35. package/templates/auth/native/unistyles/components/sign-up.tsx.hbs +152 -0
  36. package/templates/auth/server/base/src/lib/auth.ts.hbs +141 -0
  37. package/templates/auth/server/db/drizzle/mysql/src/db/schema/auth.ts +58 -0
  38. package/templates/auth/server/db/drizzle/postgres/src/db/schema/auth.ts +47 -0
  39. package/templates/auth/server/db/drizzle/sqlite/src/db/schema/auth.ts +55 -0
  40. package/templates/auth/server/db/mongoose/mongodb/src/db/models/auth.model.ts +68 -0
  41. package/templates/auth/server/db/prisma/mongodb/prisma/schema/auth.prisma +59 -0
  42. package/templates/auth/server/db/prisma/mysql/prisma/schema/auth.prisma +59 -0
  43. package/templates/auth/server/db/prisma/postgres/prisma/schema/auth.prisma +59 -0
  44. package/templates/auth/server/db/prisma/sqlite/prisma/schema/auth.prisma +59 -0
  45. package/templates/auth/server/next/src/app/api/auth/[...all]/route.ts +4 -0
  46. package/templates/auth/web/nuxt/app/components/SignInForm.vue +77 -0
  47. package/templates/auth/web/nuxt/app/components/SignUpForm.vue +84 -0
  48. package/templates/auth/web/nuxt/app/components/UserMenu.vue +42 -0
  49. package/templates/auth/web/nuxt/app/middleware/auth.ts +12 -0
  50. package/templates/auth/web/nuxt/app/pages/dashboard.vue +27 -0
  51. package/templates/auth/web/nuxt/app/pages/login.vue +24 -0
  52. package/templates/auth/web/nuxt/app/plugins/auth-client.ts +16 -0
  53. package/templates/auth/web/react/base/src/lib/auth-client.ts.hbs +10 -0
  54. package/templates/auth/web/react/next/src/app/dashboard/page.tsx.hbs +47 -0
  55. package/templates/auth/web/react/next/src/app/login/page.tsx +16 -0
  56. package/templates/auth/web/react/next/src/components/sign-in-form.tsx +135 -0
  57. package/templates/auth/web/react/next/src/components/sign-up-form.tsx +160 -0
  58. package/templates/auth/web/react/next/src/components/theme-provider.tsx +11 -0
  59. package/templates/auth/web/react/next/src/components/user-menu.tsx +60 -0
  60. package/templates/auth/web/react/react-router/src/components/sign-in-form.tsx +135 -0
  61. package/templates/auth/web/react/react-router/src/components/sign-up-form.tsx +160 -0
  62. package/templates/auth/web/react/react-router/src/components/user-menu.tsx +60 -0
  63. package/templates/auth/web/react/react-router/src/routes/dashboard.tsx.hbs +40 -0
  64. package/templates/auth/web/react/react-router/src/routes/login.tsx +13 -0
  65. package/templates/auth/web/react/tanstack-router/src/components/sign-in-form.tsx +139 -0
  66. package/templates/auth/web/react/tanstack-router/src/components/sign-up-form.tsx +164 -0
  67. package/templates/auth/web/react/tanstack-router/src/components/user-menu.tsx +62 -0
  68. package/templates/auth/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +47 -0
  69. package/templates/auth/web/react/tanstack-router/src/routes/login.tsx +18 -0
  70. package/templates/auth/web/react/tanstack-start/src/components/sign-in-form.tsx +139 -0
  71. package/templates/auth/web/react/tanstack-start/src/components/sign-up-form.tsx +164 -0
  72. package/templates/auth/web/react/tanstack-start/src/components/user-menu.tsx +62 -0
  73. package/templates/auth/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +51 -0
  74. package/templates/auth/web/react/tanstack-start/src/routes/login.tsx +18 -0
  75. package/templates/auth/web/solid/src/components/sign-in-form.tsx +132 -0
  76. package/templates/auth/web/solid/src/components/sign-up-form.tsx +158 -0
  77. package/templates/auth/web/solid/src/components/user-menu.tsx.hbs +55 -0
  78. package/templates/auth/web/solid/src/lib/auth-client.ts +5 -0
  79. package/templates/auth/web/solid/src/routes/dashboard.tsx +38 -0
  80. package/templates/auth/web/solid/src/routes/login.tsx +23 -0
  81. package/templates/auth/web/svelte/src/components/SignInForm.svelte +108 -0
  82. package/templates/auth/web/svelte/src/components/SignUpForm.svelte +142 -0
  83. package/templates/auth/web/svelte/src/components/UserMenu.svelte +54 -0
  84. package/templates/auth/web/svelte/src/lib/auth-client.ts +6 -0
  85. package/templates/auth/web/svelte/src/routes/dashboard/+page.svelte +31 -0
  86. package/templates/auth/web/svelte/src/routes/login/+page.svelte +12 -0
  87. package/templates/backend/convex/packages/backend/_gitignore +2 -0
  88. package/templates/backend/convex/packages/backend/convex/README.md +90 -0
  89. package/templates/backend/convex/packages/backend/convex/healthCheck.ts +7 -0
  90. package/templates/backend/convex/packages/backend/convex/schema.ts +9 -0
  91. package/templates/backend/convex/packages/backend/convex/todos.ts +42 -0
  92. package/templates/backend/convex/packages/backend/convex/tsconfig.json +25 -0
  93. package/templates/backend/convex/packages/backend/package.json.hbs +17 -0
  94. package/templates/backend/server/elysia/src/index.ts.hbs +72 -0
  95. package/templates/backend/server/express/src/index.ts.hbs +88 -0
  96. package/templates/backend/server/fastify/src/index.ts.hbs +155 -0
  97. package/templates/backend/server/hono/src/index.ts.hbs +133 -0
  98. package/templates/backend/server/next/next-env.d.ts +5 -0
  99. package/templates/backend/server/next/next.config.ts +7 -0
  100. package/templates/backend/server/next/package.json.hbs +24 -0
  101. package/templates/backend/server/next/src/app/route.ts +5 -0
  102. package/templates/backend/server/next/src/middleware.ts +19 -0
  103. package/templates/backend/server/next/tsconfig.json.hbs +33 -0
  104. package/templates/backend/server/server-base/_gitignore +52 -0
  105. package/templates/backend/server/server-base/package.json.hbs +28 -0
  106. package/templates/backend/server/server-base/src/routers/index.ts.hbs +53 -0
  107. package/templates/backend/server/server-base/tsconfig.json.hbs +39 -0
  108. package/templates/base/_gitignore +2 -0
  109. package/templates/base/package.json.hbs +11 -0
  110. package/templates/db/drizzle/mysql/drizzle.config.ts.hbs +10 -0
  111. package/templates/db/drizzle/mysql/src/db/index.ts.hbs +20 -0
  112. package/templates/db/drizzle/postgres/drizzle.config.ts.hbs +10 -0
  113. package/templates/db/drizzle/postgres/src/db/index.ts.hbs +12 -0
  114. package/templates/db/drizzle/sqlite/drizzle.config.ts.hbs +24 -0
  115. package/templates/db/drizzle/sqlite/src/db/index.ts.hbs +35 -0
  116. package/templates/db/mongoose/mongodb/src/db/index.ts.hbs +9 -0
  117. package/templates/db/prisma/mongodb/prisma/index.ts.hbs +5 -0
  118. package/templates/db/prisma/mongodb/prisma/schema/schema.prisma +10 -0
  119. package/templates/db/prisma/mongodb/prisma.config.ts.hbs +8 -0
  120. package/templates/db/prisma/mysql/prisma/index.ts +5 -0
  121. package/templates/db/prisma/mysql/prisma/schema/schema.prisma +10 -0
  122. package/templates/db/prisma/mysql/prisma.config.ts +8 -0
  123. package/templates/db/prisma/postgres/prisma/index.ts +5 -0
  124. package/templates/db/prisma/postgres/prisma/schema/schema.prisma.hbs +13 -0
  125. package/templates/db/prisma/postgres/prisma.config.ts.hbs +12 -0
  126. package/templates/db/prisma/sqlite/prisma/index.ts +5 -0
  127. package/templates/db/prisma/sqlite/prisma/schema/schema.prisma +10 -0
  128. package/templates/db/prisma/sqlite/prisma.config.ts +8 -0
  129. package/templates/examples/ai/native/nativewind/app/(drawer)/ai.tsx.hbs +155 -0
  130. package/templates/examples/ai/native/nativewind/polyfills.js +25 -0
  131. package/templates/examples/ai/native/unistyles/app/(drawer)/ai.tsx.hbs +279 -0
  132. package/templates/examples/ai/native/unistyles/polyfills.js +25 -0
  133. package/templates/examples/ai/server/next/src/app/ai/route.ts +15 -0
  134. package/templates/examples/ai/web/nuxt/app/pages/ai.vue +63 -0
  135. package/templates/examples/ai/web/react/next/src/app/ai/page.tsx +67 -0
  136. package/templates/examples/ai/web/react/react-router/src/routes/ai.tsx +64 -0
  137. package/templates/examples/ai/web/react/tanstack-router/src/routes/ai.tsx +69 -0
  138. package/templates/examples/ai/web/react/tanstack-start/src/routes/ai.tsx +69 -0
  139. package/templates/examples/ai/web/svelte/src/routes/ai/+page.svelte +98 -0
  140. package/templates/examples/todo/native/nativewind/app/(drawer)/todos.tsx.hbs +295 -0
  141. package/templates/examples/todo/native/unistyles/app/(drawer)/todos.tsx.hbs +340 -0
  142. package/templates/examples/todo/server/drizzle/base/src/routers/todo.ts.hbs +79 -0
  143. package/templates/examples/todo/server/drizzle/mysql/src/db/schema/todo.ts +7 -0
  144. package/templates/examples/todo/server/drizzle/postgres/src/db/schema/todo.ts +7 -0
  145. package/templates/examples/todo/server/drizzle/sqlite/src/db/schema/todo.ts +7 -0
  146. package/templates/examples/todo/server/mongoose/base/src/routers/todo.ts.hbs +66 -0
  147. package/templates/examples/todo/server/mongoose/mongodb/src/db/models/todo.model.ts +24 -0
  148. package/templates/examples/todo/server/prisma/base/src/routers/todo.ts.hbs +118 -0
  149. package/templates/examples/todo/server/prisma/mongodb/prisma/schema/todo.prisma +7 -0
  150. package/templates/examples/todo/server/prisma/mysql/prisma/schema/todo.prisma +7 -0
  151. package/templates/examples/todo/server/prisma/postgres/prisma/schema/todo.prisma +7 -0
  152. package/templates/examples/todo/server/prisma/sqlite/prisma/schema/todo.prisma +7 -0
  153. package/templates/examples/todo/web/nuxt/app/pages/todos.vue +108 -0
  154. package/templates/examples/todo/web/react/next/src/app/todos/page.tsx.hbs +245 -0
  155. package/templates/examples/todo/web/react/react-router/src/routes/todos.tsx.hbs +242 -0
  156. package/templates/examples/todo/web/react/tanstack-router/src/routes/todos.tsx.hbs +247 -0
  157. package/templates/examples/todo/web/react/tanstack-start/src/routes/todos.tsx.hbs +268 -0
  158. package/templates/examples/todo/web/solid/src/routes/todos.tsx.hbs +132 -0
  159. package/templates/examples/todo/web/svelte/src/routes/todos/+page.svelte.hbs +317 -0
  160. package/templates/extras/_npmrc.hbs +5 -0
  161. package/templates/extras/pnpm-workspace.yaml +3 -0
  162. package/templates/frontend/native/native-base/assets/adaptive-icon.png +0 -0
  163. package/templates/frontend/native/native-base/assets/favicon.png +0 -0
  164. package/templates/frontend/native/native-base/assets/icon.png +0 -0
  165. package/templates/frontend/native/native-base/assets/splash.png +0 -0
  166. package/templates/frontend/native/nativewind/_gitignore +25 -0
  167. package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/_layout.tsx +46 -0
  168. package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/index.tsx +19 -0
  169. package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/two.tsx +19 -0
  170. package/templates/frontend/native/nativewind/app/(drawer)/_layout.tsx.hbs +67 -0
  171. package/templates/frontend/native/nativewind/app/(drawer)/index.tsx.hbs +95 -0
  172. package/templates/frontend/native/nativewind/app/+html.tsx +47 -0
  173. package/templates/frontend/native/nativewind/app/+not-found.tsx +29 -0
  174. package/templates/frontend/native/nativewind/app/_layout.tsx.hbs +126 -0
  175. package/templates/frontend/native/nativewind/app/modal.tsx +14 -0
  176. package/templates/frontend/native/nativewind/app-env.d.ts +2 -0
  177. package/templates/frontend/native/nativewind/app.json +46 -0
  178. package/templates/frontend/native/nativewind/babel.config.js +11 -0
  179. package/templates/frontend/native/nativewind/components/container.tsx +8 -0
  180. package/templates/frontend/native/nativewind/components/header-button.tsx +26 -0
  181. package/templates/frontend/native/nativewind/components/tabbar-icon.tsx +8 -0
  182. package/templates/frontend/native/nativewind/global.css +50 -0
  183. package/templates/frontend/native/nativewind/lib/android-navigation-bar.tsx +11 -0
  184. package/templates/frontend/native/nativewind/lib/constants.ts +18 -0
  185. package/templates/frontend/native/nativewind/lib/use-color-scheme.ts +12 -0
  186. package/templates/frontend/native/nativewind/metro.config.js +59 -0
  187. package/templates/frontend/native/nativewind/package.json.hbs +49 -0
  188. package/templates/frontend/native/nativewind/tailwind.config.js +59 -0
  189. package/templates/frontend/native/nativewind/tsconfig.json.hbs +23 -0
  190. package/templates/frontend/native/unistyles/_gitignore +24 -0
  191. package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/_layout.tsx +39 -0
  192. package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/index.tsx +37 -0
  193. package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/two.tsx +37 -0
  194. package/templates/frontend/native/unistyles/app/(drawer)/_layout.tsx.hbs +87 -0
  195. package/templates/frontend/native/unistyles/app/(drawer)/index.tsx.hbs +194 -0
  196. package/templates/frontend/native/unistyles/app/+html.tsx +48 -0
  197. package/templates/frontend/native/unistyles/app/+not-found.tsx +65 -0
  198. package/templates/frontend/native/unistyles/app/_layout.tsx.hbs +104 -0
  199. package/templates/frontend/native/unistyles/app/modal.tsx +33 -0
  200. package/templates/frontend/native/unistyles/app.json +44 -0
  201. package/templates/frontend/native/unistyles/babel.config.js +20 -0
  202. package/templates/frontend/native/unistyles/breakpoints.ts +9 -0
  203. package/templates/frontend/native/unistyles/components/container.tsx +15 -0
  204. package/templates/frontend/native/unistyles/components/header-button.tsx +36 -0
  205. package/templates/frontend/native/unistyles/components/tabbar-icon.tsx +8 -0
  206. package/templates/frontend/native/unistyles/expo-env.d.ts +3 -0
  207. package/templates/frontend/native/unistyles/index.js +2 -0
  208. package/templates/frontend/native/unistyles/metro.config.js +20 -0
  209. package/templates/frontend/native/unistyles/package.json.hbs +50 -0
  210. package/templates/frontend/native/unistyles/theme.ts +98 -0
  211. package/templates/frontend/native/unistyles/tsconfig.json.hbs +17 -0
  212. package/templates/frontend/native/unistyles/unistyles.ts +27 -0
  213. package/templates/frontend/nuxt/_gitignore +24 -0
  214. package/templates/frontend/nuxt/app/app.config.ts +15 -0
  215. package/templates/frontend/nuxt/app/app.vue +13 -0
  216. package/templates/frontend/nuxt/app/assets/css/main.css +2 -0
  217. package/templates/frontend/nuxt/app/components/Header.vue.hbs +45 -0
  218. package/templates/frontend/nuxt/app/components/Loader.vue +5 -0
  219. package/templates/frontend/nuxt/app/components/ModeToggle.vue +23 -0
  220. package/templates/frontend/nuxt/app/layouts/default.vue.hbs +11 -0
  221. package/templates/frontend/nuxt/app/pages/index.vue.hbs +57 -0
  222. package/templates/frontend/nuxt/app/plugins/vue-query.ts.hbs +44 -0
  223. package/templates/frontend/nuxt/nuxt.config.ts.hbs +19 -0
  224. package/templates/frontend/nuxt/package.json.hbs +25 -0
  225. package/templates/frontend/nuxt/public/favicon.ico +0 -0
  226. package/templates/frontend/nuxt/public/robots.txt +2 -0
  227. package/templates/frontend/nuxt/server/tsconfig.json +3 -0
  228. package/templates/frontend/nuxt/tsconfig.json.hbs +9 -0
  229. package/templates/frontend/react/next/next-env.d.ts.hbs +5 -0
  230. package/templates/frontend/react/next/next.config.ts.hbs +5 -0
  231. package/templates/frontend/react/next/package.json.hbs +34 -0
  232. package/templates/frontend/react/next/postcss.config.mjs.hbs +5 -0
  233. package/templates/frontend/react/next/src/app/favicon.ico +0 -0
  234. package/templates/frontend/react/next/src/app/layout.tsx.hbs +41 -0
  235. package/templates/frontend/react/next/src/app/page.tsx.hbs +68 -0
  236. package/templates/frontend/react/next/src/components/mode-toggle.tsx.hbs +39 -0
  237. package/templates/frontend/react/next/src/components/providers.tsx.hbs +56 -0
  238. package/templates/frontend/react/next/src/components/theme-provider.tsx.hbs +11 -0
  239. package/templates/frontend/react/next/tsconfig.json.hbs +33 -0
  240. package/templates/frontend/react/react-router/package.json.hbs +42 -0
  241. package/templates/frontend/react/react-router/public/favicon.ico +0 -0
  242. package/templates/frontend/react/react-router/react-router.config.ts +6 -0
  243. package/templates/frontend/react/react-router/src/components/mode-toggle.tsx +37 -0
  244. package/templates/frontend/react/react-router/src/components/theme-provider.tsx +73 -0
  245. package/templates/frontend/react/react-router/src/root.tsx.hbs +152 -0
  246. package/templates/frontend/react/react-router/src/routes/_index.tsx.hbs +74 -0
  247. package/templates/frontend/react/react-router/src/routes.ts +4 -0
  248. package/templates/frontend/react/react-router/tsconfig.json.hbs +32 -0
  249. package/templates/frontend/react/react-router/vite.config.ts.hbs +33 -0
  250. package/templates/frontend/react/tanstack-router/index.html +12 -0
  251. package/templates/frontend/react/tanstack-router/package.json.hbs +41 -0
  252. package/templates/frontend/react/tanstack-router/src/components/mode-toggle.tsx +37 -0
  253. package/templates/frontend/react/tanstack-router/src/components/theme-provider.tsx +73 -0
  254. package/templates/frontend/react/tanstack-router/src/main.tsx.hbs +66 -0
  255. package/templates/frontend/react/tanstack-router/src/routes/__root.tsx.hbs +100 -0
  256. package/templates/frontend/react/tanstack-router/src/routes/index.tsx.hbs +74 -0
  257. package/templates/frontend/react/tanstack-router/tsconfig.json.hbs +23 -0
  258. package/templates/frontend/react/tanstack-router/vite.config.ts.hbs +39 -0
  259. package/templates/frontend/react/tanstack-start/package.json.hbs +44 -0
  260. package/templates/frontend/react/tanstack-start/public/robots.txt +3 -0
  261. package/templates/frontend/react/tanstack-start/src/router.tsx.hbs +144 -0
  262. package/templates/frontend/react/tanstack-start/src/routes/__root.tsx.hbs +97 -0
  263. package/templates/frontend/react/tanstack-start/src/routes/index.tsx.hbs +74 -0
  264. package/templates/frontend/react/tanstack-start/tsconfig.json.hbs +33 -0
  265. package/templates/frontend/react/tanstack-start/vite.config.ts +8 -0
  266. package/templates/frontend/react/web-base/_gitignore +52 -0
  267. package/templates/frontend/react/web-base/components.json +21 -0
  268. package/templates/frontend/react/web-base/src/components/header.tsx.hbs +79 -0
  269. package/templates/frontend/react/web-base/src/components/loader.tsx +9 -0
  270. package/templates/frontend/react/web-base/src/components/ui/button.tsx +59 -0
  271. package/templates/frontend/react/web-base/src/components/ui/card.tsx +92 -0
  272. package/templates/frontend/react/web-base/src/components/ui/checkbox.tsx +30 -0
  273. package/templates/frontend/react/web-base/src/components/ui/dropdown-menu.tsx +257 -0
  274. package/templates/frontend/react/web-base/src/components/ui/input.tsx +21 -0
  275. package/templates/frontend/react/web-base/src/components/ui/label.tsx +22 -0
  276. package/templates/frontend/react/web-base/src/components/ui/skeleton.tsx +13 -0
  277. package/templates/frontend/react/web-base/src/components/ui/sonner.tsx +25 -0
  278. package/templates/frontend/react/web-base/src/index.css +134 -0
  279. package/templates/frontend/react/web-base/src/lib/utils.ts +6 -0
  280. package/templates/frontend/solid/_gitignore +7 -0
  281. package/templates/frontend/solid/index.html +13 -0
  282. package/templates/frontend/solid/package.json.hbs +27 -0
  283. package/templates/frontend/solid/public/robots.txt +3 -0
  284. package/templates/frontend/solid/src/components/header.tsx.hbs +38 -0
  285. package/templates/frontend/solid/src/components/loader.tsx +9 -0
  286. package/templates/frontend/solid/src/main.tsx.hbs +38 -0
  287. package/templates/frontend/solid/src/routes/__root.tsx.hbs +34 -0
  288. package/templates/frontend/solid/src/routes/index.tsx.hbs +61 -0
  289. package/templates/frontend/solid/src/styles.css +5 -0
  290. package/templates/frontend/solid/tsconfig.json.hbs +34 -0
  291. package/templates/frontend/solid/vite.config.js.hbs +39 -0
  292. package/templates/frontend/svelte/_gitignore +23 -0
  293. package/templates/frontend/svelte/_npmrc +1 -0
  294. package/templates/frontend/svelte/package.json.hbs +31 -0
  295. package/templates/frontend/svelte/src/app.css +5 -0
  296. package/templates/frontend/svelte/src/app.d.ts +13 -0
  297. package/templates/frontend/svelte/src/app.html +12 -0
  298. package/templates/frontend/svelte/src/components/Header.svelte.hbs +40 -0
  299. package/templates/frontend/svelte/src/lib/index.ts +1 -0
  300. package/templates/frontend/svelte/src/routes/+layout.svelte.hbs +54 -0
  301. package/templates/frontend/svelte/src/routes/+page.svelte.hbs +72 -0
  302. package/templates/frontend/svelte/static/favicon.png +0 -0
  303. package/templates/frontend/svelte/svelte.config.js +18 -0
  304. package/templates/frontend/svelte/tsconfig.json.hbs +24 -0
  305. package/templates/frontend/svelte/vite.config.ts +7 -0
  306. package/templates/runtime/workers/apps/server/wrangler.jsonc.hbs +34 -0
@@ -0,0 +1,20 @@
1
+ // Learn more https://docs.expo.io/guides/customizing-metro
2
+ const { getDefaultConfig } = require("expo/metro-config");
3
+ const path = require("path");
4
+
5
+ const workspaceRoot = path.resolve(__dirname, "../..");
6
+ const projectRoot = __dirname;
7
+
8
+ const config = getDefaultConfig(projectRoot);
9
+
10
+ // 1. Watch all files within the monorepo
11
+ config.watchFolders = [workspaceRoot];
12
+ // 2. Let Metro know where to resolve packages, and in what order
13
+ config.resolver.nodeModulesPaths = [
14
+ path.resolve(projectRoot, "node_modules"),
15
+ path.resolve(workspaceRoot, "node_modules"),
16
+ ];
17
+ // 3. Force Metro to resolve (sub)dependencies only from the `nodeModulesPaths`
18
+ config.resolver.disableHierarchicalLookup = true;
19
+
20
+ module.exports = config;
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "native",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "dev": "expo start --clear",
7
+ "android": "expo run:android",
8
+ "ios": "expo run:ios",
9
+ "web": "expo start --web"
10
+ },
11
+ "dependencies": {
12
+ "@expo/vector-icons": "^14.0.0",
13
+ "@react-navigation/bottom-tabs": "^7.0.5",
14
+ "@react-navigation/drawer": "^7.0.0",
15
+ "@react-navigation/native": "^7.0.3",
16
+ {{#if (includes examples "ai")}}
17
+ "@stardazed/streams-text-encoding": "^1.0.2",
18
+ "@ungap/structured-clone": "^1.3.0",
19
+ {{/if}}
20
+ "@tanstack/react-form": "^1.0.5",
21
+ "babel-plugin-react-compiler": "^19.0.0-beta-af1b7da-20250417",
22
+ "expo": "^53.0.8",
23
+ "expo-constants": "~17.1.4",
24
+ "expo-linking": "~7.1.4",
25
+ "expo-router": "~5.0.3",
26
+ "expo-secure-store": "~14.2.3",
27
+ "expo-status-bar": "~2.2.3",
28
+ "expo-system-ui": "~5.0.6",
29
+ "expo-dev-client": "~5.1.8",
30
+ "expo-web-browser": "~14.1.6",
31
+ "react": "19.0.0",
32
+ "react-dom": "19.0.0",
33
+ "react-native": "0.79.2",
34
+ "react-native-edge-to-edge": "1.6.0",
35
+ "react-native-gesture-handler": "~2.24.0",
36
+ "react-native-nitro-modules": "0.25.2",
37
+ "react-native-reanimated": "~3.17.4",
38
+ "react-native-safe-area-context": "5.4.0",
39
+ "react-native-screens": "~4.10.0",
40
+ "react-native-unistyles": "^3.0.0-rc.4",
41
+ "react-native-web": "^0.20.0"
42
+ },
43
+ "devDependencies": {
44
+ "ajv": "^8.12.0",
45
+ "@babel/core": "^7.20.0",
46
+ "@types/react": "~19.0.10",
47
+ "typescript": "~5.8.3"
48
+ },
49
+ "private": true
50
+ }
@@ -0,0 +1,98 @@
1
+ const sharedColors = {
2
+ success: "#22C55E",
3
+ destructive: "#EF4444",
4
+ warning: "#F59E0B",
5
+ info: "#3B82F6",
6
+ } as const;
7
+
8
+ export const lightTheme = {
9
+ colors: {
10
+ ...sharedColors,
11
+ typography: "hsl(222.2 84% 4.9%)",
12
+ background: "hsl(0 0% 100%)",
13
+ foreground: "hsl(222.2 84% 4.9%)",
14
+ card: "hsl(0 0% 100%)",
15
+ cardForeground: "hsl(222.2 84% 4.9%)",
16
+ primary: "hsl(221.2 83.2% 53.3%)",
17
+ primaryForeground: "hsl(210 40% 98%)",
18
+ secondary: "hsl(210 40% 96%)",
19
+ secondaryForeground: "hsl(222.2 84% 4.9%)",
20
+ muted: "hsl(210 40% 96%)",
21
+ mutedForeground: "hsl(215.4 16.3% 46.9%)",
22
+ accent: "hsl(210 40% 96%)",
23
+ accentForeground: "hsl(222.2 84% 4.9%)",
24
+ border: "hsl(214.3 31.8% 91.4%)",
25
+ input: "hsl(214.3 31.8% 91.4%)",
26
+ ring: "hsl(221.2 83.2% 53.3%)",
27
+ },
28
+ spacing: {
29
+ xs: 4,
30
+ sm: 8,
31
+ md: 16,
32
+ lg: 24,
33
+ xl: 32,
34
+ xxl: 48,
35
+ },
36
+ borderRadius: {
37
+ sm: 6,
38
+ md: 8,
39
+ lg: 12,
40
+ xl: 16,
41
+ },
42
+ fontSize: {
43
+ xs: 12,
44
+ sm: 14,
45
+ base: 16,
46
+ lg: 18,
47
+ xl: 20,
48
+ "2xl": 24,
49
+ "3xl": 30,
50
+ "4xl": 36,
51
+ },
52
+ } as const;
53
+
54
+ export const darkTheme = {
55
+ colors: {
56
+ ...sharedColors,
57
+ typography: "hsl(210 40% 98%)",
58
+ background: "hsl(222.2 84% 4.9%)",
59
+ foreground: "hsl(210 40% 98%)",
60
+ card: "hsl(222.2 84% 4.9%)",
61
+ cardForeground: "hsl(210 40% 98%)",
62
+ primary: "hsl(217.2 91.2% 59.8%)",
63
+ primaryForeground: "hsl(222.2 84% 4.9%)",
64
+ secondary: "hsl(217.2 32.6% 17.5%)",
65
+ secondaryForeground: "hsl(210 40% 98%)",
66
+ muted: "hsl(217.2 32.6% 17.5%)",
67
+ mutedForeground: "hsl(215 20.2% 65.1%)",
68
+ accent: "hsl(217.2 32.6% 17.5%)",
69
+ accentForeground: "hsl(210 40% 98%)",
70
+ border: "hsl(217.2 32.6% 17.5%)",
71
+ input: "hsl(217.2 32.6% 17.5%)",
72
+ ring: "hsl(224.3 76.3% 94.1%)",
73
+ },
74
+ spacing: {
75
+ xs: 4,
76
+ sm: 8,
77
+ md: 16,
78
+ lg: 24,
79
+ xl: 32,
80
+ xxl: 48,
81
+ },
82
+ borderRadius: {
83
+ sm: 6,
84
+ md: 8,
85
+ lg: 12,
86
+ xl: 16,
87
+ },
88
+ fontSize: {
89
+ xs: 12,
90
+ sm: 14,
91
+ base: 16,
92
+ lg: 18,
93
+ xl: 20,
94
+ "2xl": 24,
95
+ "3xl": 30,
96
+ "4xl": 36,
97
+ },
98
+ } as const;
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "expo/tsconfig.base",
3
+ "compilerOptions": {
4
+ "strict": true,
5
+ "jsx": "react-jsx",
6
+ "baseUrl": ".",
7
+ "paths": {
8
+ "@/*": ["*"]
9
+ }
10
+ },
11
+ "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts"],
12
+ {{#unless (or (eq backend "convex") (eq backend "none"))}}
13
+ "references": [{
14
+ "path": "../server"
15
+ }]
16
+ {{/unless}}
17
+ }
@@ -0,0 +1,27 @@
1
+ import { StyleSheet } from "react-native-unistyles";
2
+
3
+ import { breakpoints } from "./breakpoints";
4
+ import { darkTheme, lightTheme } from "./theme";
5
+
6
+ type AppBreakpoints = typeof breakpoints;
7
+
8
+ type AppThemes = {
9
+ light: typeof lightTheme;
10
+ dark: typeof darkTheme;
11
+ };
12
+
13
+ declare module "react-native-unistyles" {
14
+ export interface UnistylesBreakpoints extends AppBreakpoints {}
15
+ export interface UnistylesThemes extends AppThemes {}
16
+ }
17
+
18
+ StyleSheet.configure({
19
+ breakpoints,
20
+ themes: {
21
+ light: lightTheme,
22
+ dark: darkTheme,
23
+ },
24
+ settings: {
25
+ adaptiveThemes: true,
26
+ },
27
+ });
@@ -0,0 +1,24 @@
1
+ # Nuxt dev/build outputs
2
+ .output
3
+ .data
4
+ .nuxt
5
+ .nitro
6
+ .cache
7
+ dist
8
+
9
+ # Node dependencies
10
+ node_modules
11
+
12
+ # Logs
13
+ logs
14
+ *.log
15
+
16
+ # Misc
17
+ .DS_Store
18
+ .fleet
19
+ .idea
20
+
21
+ # Local env files
22
+ .env
23
+ .env.*
24
+ !.env.example
@@ -0,0 +1,15 @@
1
+ export default defineAppConfig({
2
+ // https://ui.nuxt.com/getting-started/theme#design-system
3
+ ui: {
4
+ colors: {
5
+ primary: 'emerald',
6
+ neutral: 'slate',
7
+ },
8
+ button: {
9
+ defaultVariants: {
10
+ // Set default button color to neutral
11
+ // color: 'neutral'
12
+ }
13
+ }
14
+ }
15
+ })
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { VueQueryDevtools } from '@tanstack/vue-query-devtools'
3
+ </script>
4
+
5
+ <template>
6
+ <NuxtLoadingIndicator />
7
+ <UApp>
8
+ <NuxtLayout>
9
+ <NuxtPage />
10
+ </NuxtLayout>
11
+ </UApp>
12
+ <VueQueryDevtools />
13
+ </template>
@@ -0,0 +1,2 @@
1
+ @import "tailwindcss";
2
+ @import "@nuxt/ui";
@@ -0,0 +1,45 @@
1
+ <script setup lang="ts">
2
+ import { USeparator } from '#components';
3
+ import ModeToggle from './ModeToggle.vue'
4
+ {{#if auth}}
5
+ import UserMenu from './UserMenu.vue'
6
+ {{/if}}
7
+
8
+ const links = [
9
+ { to: "/", label: "Home" },
10
+ {{#if auth}}
11
+ { to: "/dashboard", label: "Dashboard" },
12
+ {{/if}}
13
+ {{#if (includes examples "todo")}}
14
+ { to: "/todos", label: "Todos" },
15
+ {{/if}}
16
+ {{#if (includes examples "ai")}}
17
+ { to: "/ai", label: "AI Chat" },
18
+ {{/if}}
19
+ ];
20
+ </script>
21
+
22
+ <template>
23
+ <div>
24
+ <div class="flex flex-row items-center justify-between px-2 py-1">
25
+ <nav class="flex gap-4 text-lg">
26
+ <NuxtLink
27
+ v-for="link in links"
28
+ :key="link.to"
29
+ :to="link.to"
30
+ class="text-foreground hover:text-primary"
31
+ active-class="text-primary font-semibold"
32
+ >
33
+ \{{ link.label }}
34
+ </NuxtLink>
35
+ </nav>
36
+ <div class="flex items-center gap-2">
37
+ <ModeToggle />
38
+ {{#if auth}}
39
+ <UserMenu />
40
+ {{/if}}
41
+ </div>
42
+ </div>
43
+ <USeparator />
44
+ </div>
45
+ </template>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <div class="flex h-full items-center justify-center pt-8">
3
+ <UIcon name="i-lucide-loader-2" class="animate-spin text-2xl" />
4
+ </div>
5
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ const colorMode = useColorMode()
3
+
4
+ const isDark = computed({
5
+ get () {
6
+ return colorMode.value === 'dark'
7
+ },
8
+ set (value) {
9
+ colorMode.preference = value ? 'dark' : 'light'
10
+ }
11
+ })
12
+ </script>
13
+
14
+ <template>
15
+ <div class="flex items-center">
16
+ <USwitch
17
+ v-model="isDark"
18
+ :checked-icon="isDark ? 'i-lucide-moon' : ''"
19
+ :unchecked-icon="!isDark ? 'i-lucide-sun' : ''"
20
+ class="mr-2"
21
+ />
22
+ </div>
23
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup>
2
+ </script>
3
+
4
+ <template>
5
+ <div class="grid grid-rows-[auto_1fr] h-full">
6
+ <Header />
7
+ <main class="overflow-y-auto">
8
+ <slot />
9
+ </main>
10
+ </div>
11
+ </template>
@@ -0,0 +1,57 @@
1
+ <script setup lang="ts">
2
+ {{#unless (eq api "none")}}
3
+ const { $orpc } = useNuxtApp()
4
+ import { useQuery } from '@tanstack/vue-query'
5
+ {{/unless}}
6
+
7
+ const TITLE_TEXT = `
8
+ TVI TypeScript Initializer
9
+ A CLI tool to quickly scaffold TypeScript projects with popular frameworks and libraries.
10
+ `;
11
+
12
+ {{#unless (eq api "none")}}
13
+ const healthCheck = useQuery($orpc.healthCheck.queryOptions())
14
+ {{/unless}}
15
+ </script>
16
+
17
+ <template>
18
+ <div class="container mx-auto max-w-3xl px-4 py-2">
19
+ <pre class="overflow-x-auto font-mono text-sm whitespace-pre-wrap">\{{ TITLE_TEXT }}</pre>
20
+ <div class="grid gap-6 mt-4">
21
+ {{#unless (eq api "none")}}
22
+ <section class="rounded-lg border p-4">
23
+ <h2 class="mb-2 font-medium">API Status</h2>
24
+ <div class="flex items-center gap-2">
25
+ <div class="flex items-center gap-2">
26
+ <div
27
+ class="w-2 h-2 rounded-full"
28
+ :class="{
29
+ 'bg-yellow-500 animate-pulse': healthCheck.status.value === 'pending',
30
+ 'bg-green-500': healthCheck.status.value === 'success',
31
+ 'bg-red-500': healthCheck.status.value === 'error',
32
+ 'bg-gray-400': healthCheck.status.value !== 'pending' &&
33
+ healthCheck.status.value !== 'success' &&
34
+ healthCheck.status.value !== 'error'
35
+ }"
36
+ ></div>
37
+ <span class="text-sm text-muted-foreground">
38
+ <template v-if="healthCheck.status.value === 'pending'">
39
+ Checking...
40
+ </template>
41
+ <template v-else-if="healthCheck.status.value === 'success'">
42
+ Connected (\{{ healthCheck.data.value }})
43
+ </template>
44
+ <template v-else-if="healthCheck.status.value === 'error'">
45
+ Error: \{{ healthCheck.error.value?.message || 'Failed to connect' }}
46
+ </template>
47
+ <template v-else>
48
+ Idle
49
+ </template>
50
+ </span>
51
+ </div>
52
+ </div>
53
+ </section>
54
+ {{/unless}}
55
+ </div>
56
+ </div>
57
+ </template>
@@ -0,0 +1,44 @@
1
+ import type {
2
+ DehydratedState,
3
+ VueQueryPluginOptions,
4
+ } from '@tanstack/vue-query'
5
+ import {
6
+ dehydrate,
7
+ hydrate,
8
+ QueryCache,
9
+ QueryClient,
10
+ VueQueryPlugin,
11
+ } from '@tanstack/vue-query'
12
+
13
+ export default defineNuxtPlugin((nuxt) => {
14
+ const vueQueryState = useState<DehydratedState | null>('vue-query')
15
+
16
+ const toast = useToast()
17
+
18
+ const queryClient = new QueryClient({
19
+ queryCache: new QueryCache({
20
+ onError: (error) => {
21
+ console.log(error)
22
+ toast.add({
23
+ title: 'Error',
24
+ description: error?.message || 'An unexpected error occurred.',
25
+ })
26
+ },
27
+ }),
28
+ })
29
+ const options: VueQueryPluginOptions = { queryClient }
30
+
31
+ nuxt.vueApp.use(VueQueryPlugin, options)
32
+
33
+ if (import.meta.server) {
34
+ nuxt.hooks.hook('app:rendered', () => {
35
+ vueQueryState.value = dehydrate(queryClient)
36
+ })
37
+ }
38
+
39
+ if (import.meta.client) {
40
+ nuxt.hooks.hook('app:created', () => {
41
+ hydrate(queryClient, vueQueryState.value)
42
+ })
43
+ }
44
+ })
@@ -0,0 +1,19 @@
1
+ // https://nuxt.com/docs/api/configuration/nuxt-config
2
+ export default defineNuxtConfig({
3
+ compatibilityDate: '2024-11-01',
4
+ future: {
5
+ compatibilityVersion: 4
6
+ },
7
+ devtools: { enabled: true },
8
+ modules: ['@nuxt/ui'],
9
+ css: ['~/assets/css/main.css'],
10
+ devServer: {
11
+ port: 3001
12
+ },
13
+ ssr: false,
14
+ runtimeConfig: {
15
+ public: {
16
+ serverURL: process.env.NUXT_PUBLIC_SERVER_URL,
17
+ }
18
+ }
19
+ })
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "web",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "build": "nuxt build",
7
+ "dev": "nuxt dev",
8
+ "generate": "nuxt generate",
9
+ "preview": "nuxt preview",
10
+ "postinstall": "nuxt prepare"
11
+ },
12
+ "dependencies": {
13
+ "@nuxt/ui": "3.0.2",
14
+ "@tanstack/vue-query": "^5.74.5",
15
+ "nuxt": "^3.16.2",
16
+ "typescript": "^5.6.3",
17
+ "vue": "^3.5.13",
18
+ "vue-router": "^4.5.0",
19
+ "zod": "^3.25.16"
20
+ },
21
+ "devDependencies": {
22
+ "@tanstack/vue-query-devtools": "^5.74.5",
23
+ "@iconify-json/lucide": "^1.2.38"
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ User-Agent: *
2
+ Disallow:
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../.nuxt/tsconfig.server.json"
3
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ // https://nuxt.com/docs/guide/concepts/typescript
3
+ "extends": "./.nuxt/tsconfig.json",
4
+ {{#unless (or (eq backend "convex") (eq backend "none"))}}
5
+ "references": [{
6
+ "path": "../server"
7
+ }]
8
+ {{/unless}}
9
+ }
@@ -0,0 +1,5 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+
4
+ // NOTE: This file should not be edited
5
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -0,0 +1,5 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {};
4
+
5
+ export default nextConfig;
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "web",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev --turbopack --port=3001",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "radix-ui": "^1.4.2",
13
+ "@tanstack/react-form": "^1.12.3",
14
+ "class-variance-authority": "^0.7.1",
15
+ "clsx": "^2.1.1",
16
+ "lucide-react": "^0.487.0",
17
+ "next": "15.3.0",
18
+ "next-themes": "^0.4.6",
19
+ "react": "^19.0.0",
20
+ "react-dom": "^19.0.0",
21
+ "sonner": "^2.0.5",
22
+ "tailwind-merge": "^3.3.1",
23
+ "tw-animate-css": "^1.3.4",
24
+ "zod": "^3.25.67"
25
+ },
26
+ "devDependencies": {
27
+ "@tailwindcss/postcss": "^4.1.10",
28
+ "@types/node": "^20",
29
+ "@types/react": "^19",
30
+ "@types/react-dom": "^19",
31
+ "tailwindcss": "^4.1.10",
32
+ "typescript": "^5"
33
+ }
34
+ }
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ plugins: ["@tailwindcss/postcss"],
3
+ };
4
+
5
+ export default config;
@@ -0,0 +1,41 @@
1
+ import type { Metadata } from "next";
2
+ import { Geist, Geist_Mono } from "next/font/google";
3
+ import "../index.css";
4
+ import Providers from "@/components/providers";
5
+ import Header from "@/components/header";
6
+
7
+ const geistSans = Geist({
8
+ variable: "--font-geist-sans",
9
+ subsets: ["latin"],
10
+ });
11
+
12
+ const geistMono = Geist_Mono({
13
+ variable: "--font-geist-mono",
14
+ subsets: ["latin"],
15
+ });
16
+
17
+ export const metadata: Metadata = {
18
+ title: "{{projectName}}",
19
+ description: "{{projectName}}",
20
+ };
21
+
22
+ export default function RootLayout({
23
+ children,
24
+ }: Readonly<{
25
+ children: React.ReactNode;
26
+ }>) {
27
+ return (
28
+ <html lang="en" suppressHydrationWarning>
29
+ <body
30
+ className={`${geistSans.variable} ${geistMono.variable} antialiased`}
31
+ >
32
+ <Providers>
33
+ <div className="grid grid-rows-[auto_1fr] h-svh">
34
+ <Header />
35
+ {children}
36
+ </div>
37
+ </Providers>
38
+ </body>
39
+ </html>
40
+ );
41
+ }