create-better-t-stack 2.37.0 → 2.38.0

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 (111) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/index.d.ts +11 -5
  3. package/dist/index.js +1 -1
  4. package/dist/{src-CGVrE3la.js → src-BR5HLmM2.js} +266 -104
  5. package/package.json +1 -1
  6. package/templates/addons/ruler/.ruler/bts.md.hbs +2 -2
  7. package/templates/api/orpc/native/utils/orpc.ts.hbs +2 -2
  8. package/templates/api/orpc/server/base/src/lib/context.ts.hbs +10 -10
  9. package/templates/api/orpc/server/base/src/lib/orpc.ts.hbs +1 -1
  10. package/templates/api/orpc/server/next/src/app/rpc/[...all]/route.ts.hbs +2 -2
  11. package/templates/api/orpc/web/nuxt/app/plugins/orpc.ts.hbs +1 -1
  12. package/templates/api/orpc/web/react/base/src/utils/orpc.ts.hbs +11 -1
  13. package/templates/api/orpc/web/solid/src/utils/orpc.ts.hbs +1 -1
  14. package/templates/api/orpc/web/svelte/src/lib/orpc.ts.hbs +1 -1
  15. package/templates/api/trpc/native/utils/trpc.ts.hbs +2 -2
  16. package/templates/api/trpc/server/base/src/lib/context.ts.hbs +10 -10
  17. package/templates/api/trpc/server/base/src/lib/trpc.ts.hbs +1 -1
  18. package/templates/api/trpc/web/react/base/src/utils/trpc.ts.hbs +2 -2
  19. package/templates/auth/clerk/convex/backend/convex/auth.config.ts.hbs +12 -0
  20. package/templates/auth/clerk/convex/backend/convex/privateData.ts.hbs +16 -0
  21. package/templates/auth/clerk/convex/native/base/app/(auth)/_layout.tsx.hbs +12 -0
  22. package/templates/auth/clerk/convex/native/base/app/(auth)/sign-in.tsx.hbs +67 -0
  23. package/templates/auth/clerk/convex/native/base/app/(auth)/sign-out.tsx.hbs +110 -0
  24. package/templates/auth/clerk/convex/native/base/components/sign-out-button.tsx.hbs +27 -0
  25. package/templates/auth/clerk/convex/web/react/next/src/app/dashboard/page.tsx.hbs +29 -0
  26. package/templates/auth/clerk/convex/web/react/next/src/middleware.ts.hbs +12 -0
  27. package/templates/auth/clerk/convex/web/react/react-router/src/routes/dashboard.tsx.hbs +32 -0
  28. package/templates/auth/clerk/convex/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +37 -0
  29. package/templates/auth/clerk/convex/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +37 -0
  30. package/templates/auth/clerk/convex/web/react/tanstack-start/src/server.ts.hbs +18 -0
  31. package/templates/backend/convex/packages/backend/package.json.hbs +1 -0
  32. package/templates/backend/server/elysia/src/index.ts.hbs +3 -3
  33. package/templates/backend/server/express/src/index.ts.hbs +6 -6
  34. package/templates/backend/server/fastify/src/index.ts.hbs +4 -4
  35. package/templates/backend/server/hono/src/index.ts.hbs +4 -4
  36. package/templates/backend/server/server-base/src/routers/index.ts.hbs +4 -4
  37. package/templates/deploy/alchemy/alchemy.run.ts.hbs +2 -2
  38. package/templates/frontend/native/nativewind/app/(drawer)/index.tsx.hbs +35 -3
  39. package/templates/frontend/native/nativewind/app/_layout.tsx.hbs +28 -0
  40. package/templates/frontend/native/nativewind/package.json.hbs +1 -0
  41. package/templates/frontend/native/unistyles/app/(drawer)/index.tsx.hbs +32 -0
  42. package/templates/frontend/native/unistyles/app/_layout.tsx.hbs +35 -0
  43. package/templates/frontend/native/unistyles/package.json.hbs +1 -0
  44. package/templates/frontend/nuxt/app/components/Header.vue.hbs +3 -3
  45. package/templates/frontend/react/next/src/app/layout.tsx.hbs +23 -15
  46. package/templates/frontend/react/next/src/components/providers.tsx.hbs +12 -0
  47. package/templates/frontend/react/react-router/src/root.tsx.hbs +28 -1
  48. package/templates/frontend/react/tanstack-router/src/main.tsx.hbs +19 -1
  49. package/templates/frontend/react/tanstack-start/src/router.tsx.hbs +8 -4
  50. package/templates/frontend/react/tanstack-start/src/routes/__root.tsx.hbs +52 -5
  51. package/templates/frontend/react/web-base/src/components/header.tsx.hbs +3 -3
  52. package/templates/frontend/solid/src/components/header.tsx.hbs +3 -3
  53. package/templates/frontend/svelte/src/components/Header.svelte.hbs +3 -3
  54. /package/templates/auth/{native → better-auth/native}/native-base/lib/auth-client.ts.hbs +0 -0
  55. /package/templates/auth/{native → better-auth/native}/nativewind/app/(drawer)/index.tsx.hbs +0 -0
  56. /package/templates/auth/{native → better-auth/native}/nativewind/components/sign-in.tsx.hbs +0 -0
  57. /package/templates/auth/{native → better-auth/native}/nativewind/components/sign-up.tsx.hbs +0 -0
  58. /package/templates/auth/{native → better-auth/native}/unistyles/app/(drawer)/index.tsx.hbs +0 -0
  59. /package/templates/auth/{native → better-auth/native}/unistyles/components/sign-in.tsx.hbs +0 -0
  60. /package/templates/auth/{native → better-auth/native}/unistyles/components/sign-up.tsx.hbs +0 -0
  61. /package/templates/auth/{server → better-auth/server}/base/src/lib/auth.ts.hbs +0 -0
  62. /package/templates/auth/{server → better-auth/server}/db/drizzle/mysql/src/db/schema/auth.ts +0 -0
  63. /package/templates/auth/{server → better-auth/server}/db/drizzle/postgres/src/db/schema/auth.ts +0 -0
  64. /package/templates/auth/{server → better-auth/server}/db/drizzle/sqlite/src/db/schema/auth.ts +0 -0
  65. /package/templates/auth/{server → better-auth/server}/db/mongoose/mongodb/src/db/models/auth.model.ts +0 -0
  66. /package/templates/auth/{server → better-auth/server}/db/prisma/mongodb/prisma/schema/auth.prisma +0 -0
  67. /package/templates/auth/{server → better-auth/server}/db/prisma/mysql/prisma/schema/auth.prisma +0 -0
  68. /package/templates/auth/{server → better-auth/server}/db/prisma/postgres/prisma/schema/auth.prisma +0 -0
  69. /package/templates/auth/{server → better-auth/server}/db/prisma/sqlite/prisma/schema/auth.prisma +0 -0
  70. /package/templates/auth/{server → better-auth/server}/next/src/app/api/auth/[...all]/route.ts +0 -0
  71. /package/templates/auth/{web → better-auth/web}/nuxt/app/components/SignInForm.vue +0 -0
  72. /package/templates/auth/{web → better-auth/web}/nuxt/app/components/SignUpForm.vue +0 -0
  73. /package/templates/auth/{web → better-auth/web}/nuxt/app/components/UserMenu.vue +0 -0
  74. /package/templates/auth/{web → better-auth/web}/nuxt/app/middleware/auth.ts +0 -0
  75. /package/templates/auth/{web → better-auth/web}/nuxt/app/pages/dashboard.vue.hbs +0 -0
  76. /package/templates/auth/{web → better-auth/web}/nuxt/app/pages/login.vue +0 -0
  77. /package/templates/auth/{web → better-auth/web}/nuxt/app/plugins/auth-client.ts +0 -0
  78. /package/templates/auth/{web → better-auth/web}/react/base/src/lib/auth-client.ts.hbs +0 -0
  79. /package/templates/auth/{web → better-auth/web}/react/next/src/app/dashboard/page.tsx.hbs +0 -0
  80. /package/templates/auth/{web → better-auth/web}/react/next/src/app/login/page.tsx +0 -0
  81. /package/templates/auth/{web → better-auth/web}/react/next/src/components/sign-in-form.tsx +0 -0
  82. /package/templates/auth/{web → better-auth/web}/react/next/src/components/sign-up-form.tsx +0 -0
  83. /package/templates/auth/{web → better-auth/web}/react/next/src/components/theme-provider.tsx +0 -0
  84. /package/templates/auth/{web → better-auth/web}/react/next/src/components/user-menu.tsx +0 -0
  85. /package/templates/auth/{web → better-auth/web}/react/react-router/src/components/sign-in-form.tsx +0 -0
  86. /package/templates/auth/{web → better-auth/web}/react/react-router/src/components/sign-up-form.tsx +0 -0
  87. /package/templates/auth/{web → better-auth/web}/react/react-router/src/components/user-menu.tsx +0 -0
  88. /package/templates/auth/{web → better-auth/web}/react/react-router/src/routes/dashboard.tsx.hbs +0 -0
  89. /package/templates/auth/{web → better-auth/web}/react/react-router/src/routes/login.tsx +0 -0
  90. /package/templates/auth/{web → better-auth/web}/react/tanstack-router/src/components/sign-in-form.tsx +0 -0
  91. /package/templates/auth/{web → better-auth/web}/react/tanstack-router/src/components/sign-up-form.tsx +0 -0
  92. /package/templates/auth/{web → better-auth/web}/react/tanstack-router/src/components/user-menu.tsx +0 -0
  93. /package/templates/auth/{web → better-auth/web}/react/tanstack-router/src/routes/dashboard.tsx.hbs +0 -0
  94. /package/templates/auth/{web → better-auth/web}/react/tanstack-router/src/routes/login.tsx +0 -0
  95. /package/templates/auth/{web → better-auth/web}/react/tanstack-start/src/components/sign-in-form.tsx +0 -0
  96. /package/templates/auth/{web → better-auth/web}/react/tanstack-start/src/components/sign-up-form.tsx +0 -0
  97. /package/templates/auth/{web → better-auth/web}/react/tanstack-start/src/components/user-menu.tsx +0 -0
  98. /package/templates/auth/{web → better-auth/web}/react/tanstack-start/src/routes/dashboard.tsx.hbs +0 -0
  99. /package/templates/auth/{web → better-auth/web}/react/tanstack-start/src/routes/login.tsx +0 -0
  100. /package/templates/auth/{web → better-auth/web}/solid/src/components/sign-in-form.tsx +0 -0
  101. /package/templates/auth/{web → better-auth/web}/solid/src/components/sign-up-form.tsx +0 -0
  102. /package/templates/auth/{web → better-auth/web}/solid/src/components/user-menu.tsx.hbs +0 -0
  103. /package/templates/auth/{web → better-auth/web}/solid/src/lib/auth-client.ts +0 -0
  104. /package/templates/auth/{web → better-auth/web}/solid/src/routes/dashboard.tsx.hbs +0 -0
  105. /package/templates/auth/{web → better-auth/web}/solid/src/routes/login.tsx +0 -0
  106. /package/templates/auth/{web → better-auth/web}/svelte/src/components/SignInForm.svelte +0 -0
  107. /package/templates/auth/{web → better-auth/web}/svelte/src/components/SignUpForm.svelte +0 -0
  108. /package/templates/auth/{web → better-auth/web}/svelte/src/components/UserMenu.svelte +0 -0
  109. /package/templates/auth/{web → better-auth/web}/svelte/src/lib/auth-client.ts +0 -0
  110. /package/templates/auth/{web → better-auth/web}/svelte/src/routes/dashboard/+page.svelte.hbs +0 -0
  111. /package/templates/auth/{web → better-auth/web}/svelte/src/routes/login/+page.svelte +0 -0
@@ -13,7 +13,13 @@ import { ThemeProvider } from "./components/theme-provider";
13
13
  import { Toaster } from "./components/ui/sonner";
14
14
 
15
15
  {{#if (eq backend "convex")}}
16
- import { ConvexProvider, ConvexReactClient } from "convex/react";
16
+ import { ConvexReactClient } from "convex/react";
17
+ {{#if (eq auth "clerk")}}
18
+ import { ClerkProvider, useAuth } from "@clerk/clerk-react";
19
+ import { ConvexProviderWithClerk } from "convex/react-clerk";
20
+ {{else}}
21
+ import { ConvexProvider } from "convex/react";
22
+ {{/if}}
17
23
  {{else}}
18
24
  {{#unless (eq api "none")}}
19
25
  import { QueryClientProvider } from "@tanstack/react-query";
@@ -60,6 +66,26 @@ export default function App() {
60
66
  const convex = new ConvexReactClient(
61
67
  import.meta.env.VITE_CONVEX_URL as string,
62
68
  );
69
+ {{#if (eq auth "clerk")}}
70
+ return (
71
+ <ClerkProvider publishableKey={import.meta.env.VITE_CLERK_PUBLISHABLE_KEY}>
72
+ <ConvexProviderWithClerk client={convex} useAuth={useAuth}>
73
+ <ThemeProvider
74
+ attribute="class"
75
+ defaultTheme="dark"
76
+ disableTransitionOnChange
77
+ storageKey="vite-ui-theme"
78
+ >
79
+ <div className="grid grid-rows-[auto_1fr] h-svh">
80
+ <Header />
81
+ <Outlet />
82
+ </div>
83
+ <Toaster richColors />
84
+ </ThemeProvider>
85
+ </ConvexProviderWithClerk>
86
+ </ClerkProvider>
87
+ );
88
+ {{else}}
63
89
  return (
64
90
  <ConvexProvider client={convex}>
65
91
  <ThemeProvider
@@ -76,6 +102,7 @@ export default function App() {
76
102
  </ThemeProvider>
77
103
  </ConvexProvider>
78
104
  );
105
+ {{/if}}
79
106
  }
80
107
  {{else if (eq api "orpc")}}
81
108
  export default function App() {
@@ -12,7 +12,13 @@ import { routeTree } from "./routeTree.gen";
12
12
  import { queryClient, trpc } from "./utils/trpc";
13
13
  {{/if}}
14
14
  {{#if (eq backend "convex")}}
15
- import { ConvexProvider, ConvexReactClient } from "convex/react";
15
+ import { ConvexReactClient } from "convex/react";
16
+ {{#if (eq auth "clerk")}}
17
+ import { ClerkProvider, useAuth } from "@clerk/clerk-react";
18
+ import { ConvexProviderWithClerk } from "convex/react-clerk";
19
+ {{else}}
20
+ import { ConvexProvider } from "convex/react";
21
+ {{/if}}
16
22
  const convex = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL as string);
17
23
  {{/if}}
18
24
 
@@ -41,7 +47,19 @@ const router = createRouter({
41
47
  {{else if (eq backend "convex")}}
42
48
  context: {},
43
49
  Wrap: function WrapComponent({ children }: { children: React.ReactNode }) {
50
+ {{#if (eq auth "clerk")}}
51
+ return (
52
+ <ClerkProvider
53
+ publishableKey={import.meta.env.VITE_CLERK_PUBLISHABLE_KEY}
54
+ >
55
+ <ConvexProviderWithClerk client={convex} useAuth={useAuth}>
56
+ {children}
57
+ </ConvexProviderWithClerk>
58
+ </ClerkProvider>
59
+ );
60
+ {{else}}
44
61
  return <ConvexProvider client={convex}>{children}</ConvexProvider>;
62
+ {{/if}}
45
63
  },
46
64
  {{else}}
47
65
  context: {},
@@ -3,7 +3,7 @@ import { createRouter as createTanStackRouter } from "@tanstack/react-router";
3
3
  import { QueryClient } from "@tanstack/react-query";
4
4
  import { routerWithQueryClient } from "@tanstack/react-router-with-query";
5
5
  import { ConvexQueryClient } from "@convex-dev/react-query";
6
- import { ConvexProvider } from "convex/react";
6
+ import { ConvexProvider, ConvexReactClient } from "convex/react";
7
7
  import { routeTree } from "./routeTree.gen";
8
8
  import Loader from "./components/loader";
9
9
  import "./index.css";
@@ -31,7 +31,11 @@ export function createRouter() {
31
31
  if (!CONVEX_URL) {
32
32
  console.error("missing envar VITE_CONVEX_URL");
33
33
  }
34
- const convexQueryClient = new ConvexQueryClient(CONVEX_URL);
34
+ const convex = new ConvexReactClient(CONVEX_URL, {
35
+ unsavedChangesWarning: false,
36
+ });
37
+
38
+ const convexQueryClient = new ConvexQueryClient(convex);
35
39
 
36
40
  const queryClient: QueryClient = new QueryClient({
37
41
  defaultOptions: {
@@ -49,7 +53,7 @@ export function createRouter() {
49
53
  defaultPreload: "intent",
50
54
  defaultPendingComponent: () => <Loader />,
51
55
  defaultNotFoundComponent: () => <div>Not Found</div>,
52
- context: { queryClient },
56
+ context: { queryClient, convexClient: convex, convexQueryClient },
53
57
  Wrap: ({ children }) => (
54
58
  <ConvexProvider client={convexQueryClient.convexClient}>
55
59
  {children}
@@ -82,7 +86,7 @@ const trpcClient = createTRPCClient<AppRouter>({
82
86
  links: [
83
87
  httpBatchLink({
84
88
  url: `${import.meta.env.VITE_SERVER_URL}/trpc`,
85
- {{#if auth}}
89
+ {{#if (eq auth "better-auth")}}
86
90
  fetch(url, options) {
87
91
  return fetch(url, {
88
92
  ...options,
@@ -8,22 +8,37 @@ import {
8
8
  Scripts,
9
9
  createRootRouteWithContext,
10
10
  useRouterState,
11
+ useRouteContext,
11
12
  } from "@tanstack/react-router";
12
13
  import { TanStackRouterDevtools } from "@tanstack/react-router-devtools";
13
14
  import Header from "../components/header";
14
15
  import appCss from "../index.css?url";
15
16
  {{#if (eq backend "convex")}}
16
17
  import type { QueryClient } from "@tanstack/react-query";
17
- {{else}}
18
- {{#unless (eq api "none")}}
19
- import type { QueryClient } from "@tanstack/react-query";
20
- {{/unless}}
18
+ import type { ConvexQueryClient } from "@convex-dev/react-query";
19
+ import type { ConvexReactClient } from "convex/react";
21
20
  {{/if}}
22
21
  import Loader from "@/components/loader";
23
22
 
23
+ {{#if (and (eq backend "convex") (eq auth "clerk"))}}
24
+ import { ClerkProvider, useAuth } from "@clerk/tanstack-react-start";
25
+ import { getAuth } from "@clerk/tanstack-react-start/server";
26
+ import { createServerFn } from "@tanstack/react-start";
27
+ import { getWebRequest } from "@tanstack/react-start/server";
28
+ import { ConvexProviderWithClerk } from "convex/react-clerk";
29
+
30
+ const fetchClerkAuth = createServerFn({ method: "GET" }).handler(async () => {
31
+ const auth = await getAuth(getWebRequest());
32
+ const token = await auth.getToken({ template: "convex" });
33
+ return { userId: auth.userId, token };
34
+ });
35
+ {{/if}}
36
+
24
37
  {{#if (eq backend "convex")}}
25
38
  export interface RouterAppContext {
26
39
  queryClient: QueryClient;
40
+ convexClient: ConvexReactClient;
41
+ convexQueryClient: ConvexQueryClient;
27
42
  }
28
43
  {{else}}
29
44
  {{#if (eq api "trpc")}}
@@ -68,11 +83,42 @@ export const Route = createRootRouteWithContext<RouterAppContext>()({
68
83
  }),
69
84
 
70
85
  component: RootDocument,
86
+ {{#if (and (eq backend "convex") (eq auth "clerk"))}}
87
+ beforeLoad: async (ctx) => {
88
+ const { userId, token } = await fetchClerkAuth();
89
+ if (token) {
90
+ ctx.context.convexQueryClient.serverHttpClient?.setAuth(token);
91
+ }
92
+ return { userId, token };
93
+ },
94
+ {{/if}}
71
95
  });
72
96
 
73
97
  function RootDocument() {
74
98
  const isFetching = useRouterState({ select: (s) => s.isLoading });
75
-
99
+ {{#if (and (eq backend "convex") (eq auth "clerk"))}}
100
+ const context = useRouteContext({ from: Route.id });
101
+ return (
102
+ <ClerkProvider>
103
+ <ConvexProviderWithClerk client={context.convexClient} useAuth={useAuth}>
104
+ <html lang="en" className="dark">
105
+ <head>
106
+ <HeadContent />
107
+ </head>
108
+ <body>
109
+ <div className="grid h-svh grid-rows-[auto_1fr]">
110
+ <Header />
111
+ {isFetching ? <Loader /> : <Outlet />}
112
+ </div>
113
+ <Toaster richColors />
114
+ <TanStackRouterDevtools position="bottom-left" />
115
+ <Scripts />
116
+ </body>
117
+ </html>
118
+ </ConvexProviderWithClerk>
119
+ </ClerkProvider>
120
+ );
121
+ {{else}}
76
122
  return (
77
123
  <html lang="en" className="dark">
78
124
  <head>
@@ -94,4 +140,5 @@ function RootDocument() {
94
140
  </body>
95
141
  </html>
96
142
  );
143
+ {{/if}}
97
144
  }
@@ -9,14 +9,14 @@ import { Link } from "@tanstack/react-router";
9
9
  {{#unless (includes frontend "tanstack-start")}}
10
10
  import { ModeToggle } from "./mode-toggle";
11
11
  {{/unless}}
12
- {{#if auth}}
12
+ {{#if (eq auth "better-auth")}}
13
13
  import UserMenu from "./user-menu";
14
14
  {{/if}}
15
15
 
16
16
  export default function Header() {
17
17
  const links = [
18
18
  { to: "/", label: "Home" },
19
- {{#if auth}}
19
+ {{#if (or (eq auth "better-auth") (eq auth "clerk"))}}
20
20
  { to: "/dashboard", label: "Dashboard" },
21
21
  {{/if}}
22
22
  {{#if (includes examples "todo")}}
@@ -67,7 +67,7 @@ export default function Header() {
67
67
  {{#unless (includes frontend "tanstack-start")}}
68
68
  <ModeToggle />
69
69
  {{/unless}}
70
- {{#if auth}}
70
+ {{#if (eq auth "better-auth")}}
71
71
  <UserMenu />
72
72
  {{/if}}
73
73
  </div>
@@ -1,5 +1,5 @@
1
1
  import { Link } from "@tanstack/solid-router";
2
- {{#if auth}}
2
+ {{#if (eq auth "better-auth")}}
3
3
  import UserMenu from "./user-menu";
4
4
  {{/if}}
5
5
  import { For } from "solid-js";
@@ -7,7 +7,7 @@ import { For } from "solid-js";
7
7
  export default function Header() {
8
8
  const links = [
9
9
  { to: "/", label: "Home" },
10
- {{#if auth}}
10
+ {{#if (eq auth "better-auth")}}
11
11
  { to: "/dashboard", label: "Dashboard" },
12
12
  {{/if}}
13
13
  {{#if (includes examples "todo")}}
@@ -27,7 +27,7 @@ export default function Header() {
27
27
  </For>
28
28
  </nav>
29
29
  <div class="flex items-center gap-2">
30
- {{#if auth}}
30
+ {{#if (eq auth "better-auth")}}
31
31
  <UserMenu />
32
32
  {{/if}}
33
33
  </div>
@@ -1,11 +1,11 @@
1
1
  <script lang="ts">
2
2
 
3
- {{#if auth}}
3
+ {{#if (eq auth "better-auth")}}
4
4
  import UserMenu from './UserMenu.svelte';
5
5
  {{/if}}
6
6
  const links = [
7
7
  { to: "/", label: "Home" },
8
- {{#if auth}}
8
+ {{#if (eq auth "better-auth")}}
9
9
  { to: "/dashboard", label: "Dashboard" },
10
10
  {{/if}}
11
11
  {{#if (includes examples "todo")}}
@@ -31,7 +31,7 @@
31
31
  {/each}
32
32
  </nav>
33
33
  <div class="flex items-center gap-2">
34
- {{#if auth}}
34
+ {{#if (eq auth "better-auth")}}
35
35
  <UserMenu />
36
36
  {{/if}}
37
37
  </div>