create-better-t-stack 1.7.0 → 1.8.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 (34) hide show
  1. package/README.md +6 -4
  2. package/dist/index.js +106 -102
  3. package/package.json +4 -6
  4. package/template/base/apps/web-base/src/index.css +1 -1
  5. package/template/base/apps/web-tanstack-router/src/components/mode-toggle.tsx +37 -0
  6. package/template/base/apps/web-tanstack-router/src/components/theme-provider.tsx +73 -0
  7. package/template/base/apps/web-tanstack-router/src/routes/__root.tsx +1 -2
  8. package/template/base/apps/web-tanstack-start/app.config.ts +17 -0
  9. package/template/base/apps/web-tanstack-start/package.json +52 -0
  10. package/template/base/apps/web-tanstack-start/public/robots.txt +3 -0
  11. package/template/base/apps/web-tanstack-start/src/api.ts +6 -0
  12. package/template/base/apps/web-tanstack-start/src/client.tsx +8 -0
  13. package/template/base/apps/web-tanstack-start/src/components/header.tsx +27 -0
  14. package/template/base/apps/web-tanstack-start/src/index.css +135 -0
  15. package/template/base/apps/web-tanstack-start/src/router.tsx +70 -0
  16. package/template/base/apps/web-tanstack-start/src/routes/__root.tsx +68 -0
  17. package/template/base/apps/web-tanstack-start/src/routes/index.tsx +88 -0
  18. package/template/base/apps/web-tanstack-start/src/ssr.tsx +12 -0
  19. package/template/base/apps/web-tanstack-start/src/utils/trpc.ts +5 -0
  20. package/template/base/apps/web-tanstack-start/tsconfig.json +28 -0
  21. package/template/examples/ai/apps/web-tanstack-start/src/routes/ai.tsx +69 -0
  22. package/template/examples/todo/apps/web-tanstack-start/src/routes/todos.tsx +135 -0
  23. package/template/with-auth/apps/web-tanstack-router/src/utils/trpc.ts +39 -0
  24. package/template/with-auth/apps/web-tanstack-start/src/components/header.tsx +32 -0
  25. package/template/with-auth/apps/web-tanstack-start/src/components/sign-in-form.tsx +139 -0
  26. package/template/with-auth/apps/web-tanstack-start/src/components/sign-up-form.tsx +164 -0
  27. package/template/with-auth/apps/web-tanstack-start/src/components/user-menu.tsx +62 -0
  28. package/template/with-auth/apps/web-tanstack-start/src/router.tsx +76 -0
  29. package/template/with-auth/apps/web-tanstack-start/src/routes/dashboard.tsx +37 -0
  30. package/template/with-auth/apps/web-tanstack-start/src/routes/login.tsx +18 -0
  31. package/template/with-drizzle-sqlite/apps/server/src/db/schema/auth.ts +0 -6
  32. /package/template/base/apps/{web-base → web-react-router}/src/components/mode-toggle.tsx +0 -0
  33. /package/template/base/apps/{web-base → web-react-router}/src/components/theme-provider.tsx +0 -0
  34. /package/template/with-auth/apps/{web-base → web-react-router}/src/utils/trpc.ts +0 -0
@@ -0,0 +1,76 @@
1
+ import {
2
+ QueryCache,
3
+ QueryClient,
4
+ QueryClientProvider,
5
+ } from "@tanstack/react-query";
6
+ import { createRouter as createTanstackRouter } from "@tanstack/react-router";
7
+ import { createTRPCClient, httpBatchLink } from "@trpc/client";
8
+ import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query";
9
+ import { toast } from "sonner";
10
+ import type { AppRouter } from "../../server/src/routers";
11
+ import Loader from "./components/loader";
12
+ import "./index.css";
13
+ import { routeTree } from "./routeTree.gen";
14
+ import { TRPCProvider } from "./utils/trpc";
15
+
16
+ export const queryClient = new QueryClient({
17
+ queryCache: new QueryCache({
18
+ onError: (error) => {
19
+ toast.error(error.message, {
20
+ action: {
21
+ label: "retry",
22
+ onClick: () => {
23
+ queryClient.invalidateQueries();
24
+ },
25
+ },
26
+ });
27
+ },
28
+ }),
29
+ defaultOptions: { queries: { staleTime: 60 * 1000 } },
30
+ });
31
+
32
+ const trpcClient = createTRPCClient<AppRouter>({
33
+ links: [
34
+ httpBatchLink({
35
+ url: `${import.meta.env.VITE_SERVER_URL}/trpc`,
36
+ fetch(url, options) {
37
+ return fetch(url, {
38
+ ...options,
39
+ credentials: "include",
40
+ });
41
+ },
42
+ }),
43
+ ],
44
+ });
45
+
46
+ const trpc = createTRPCOptionsProxy({
47
+ client: trpcClient,
48
+ queryClient: queryClient,
49
+ });
50
+
51
+ export const createRouter = () => {
52
+ const router = createTanstackRouter({
53
+ routeTree,
54
+ scrollRestoration: true,
55
+ defaultPreloadStaleTime: 0,
56
+ context: { trpc, queryClient },
57
+ defaultPendingComponent: () => <Loader />,
58
+ defaultNotFoundComponent: () => <div>Not Found</div>,
59
+ Wrap: ({ children }) => (
60
+ <QueryClientProvider client={queryClient}>
61
+ <TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>
62
+ {children}
63
+ </TRPCProvider>
64
+ </QueryClientProvider>
65
+ ),
66
+ });
67
+
68
+ return router;
69
+ };
70
+
71
+ // Register the router instance for type safety
72
+ declare module "@tanstack/react-router" {
73
+ interface Register {
74
+ router: ReturnType<typeof createRouter>;
75
+ }
76
+ }
@@ -0,0 +1,37 @@
1
+ import { authClient } from "@/lib/auth-client";
2
+ import { useTRPC } from "@/utils/trpc";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { createFileRoute } from "@tanstack/react-router";
5
+ import { useEffect } from "react";
6
+
7
+ export const Route = createFileRoute("/dashboard")({
8
+ component: RouteComponent,
9
+ });
10
+
11
+ function RouteComponent() {
12
+ const navigate = Route.useNavigate();
13
+ const trpc = useTRPC();
14
+ const { data: session, isPending } = authClient.useSession();
15
+
16
+ const privateData = useQuery(trpc.privateData.queryOptions());
17
+
18
+ useEffect(() => {
19
+ if (!session && !isPending) {
20
+ navigate({
21
+ to: "/login",
22
+ });
23
+ }
24
+ }, [session, isPending]);
25
+
26
+ if (isPending) {
27
+ return <div>Loading...</div>;
28
+ }
29
+
30
+ return (
31
+ <div>
32
+ <h1>Dashboard</h1>
33
+ <p>Welcome {session?.user.name}</p>
34
+ <p>privateData: {privateData.data?.message}</p>
35
+ </div>
36
+ );
37
+ }
@@ -0,0 +1,18 @@
1
+ import SignInForm from "@/components/sign-in-form";
2
+ import SignUpForm from "@/components/sign-up-form";
3
+ import { createFileRoute } from "@tanstack/react-router";
4
+ import { useState } from "react";
5
+
6
+ export const Route = createFileRoute("/login")({
7
+ component: RouteComponent,
8
+ });
9
+
10
+ function RouteComponent() {
11
+ const [showSignIn, setShowSignIn] = useState(false);
12
+
13
+ return showSignIn ? (
14
+ <SignInForm onSwitchToSignUp={() => setShowSignIn(false)} />
15
+ ) : (
16
+ <SignUpForm onSwitchToSignIn={() => setShowSignIn(true)} />
17
+ );
18
+ }
@@ -1,11 +1,5 @@
1
1
  import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
2
2
 
3
- export const todo = sqliteTable("todo", {
4
- id: integer("id").primaryKey({ autoIncrement: true }),
5
- text: text("text").notNull(),
6
- completed: integer("completed", { mode: "boolean" }).default(false).notNull()
7
- });
8
-
9
3
  export const user = sqliteTable("user", {
10
4
  id: text("id").primaryKey(),
11
5
  name: text("name").notNull(),