create-better-t-stack 3.7.1 → 3.7.3-canary.1bf365d5

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 (49) hide show
  1. package/package.json +7 -11
  2. package/src/cli.ts +3 -0
  3. package/templates/api/orpc/server/package.json.hbs +0 -3
  4. package/templates/api/trpc/server/package.json.hbs +1 -4
  5. package/templates/auth/better-auth/convex/native/base/lib/auth-client.ts.hbs +0 -2
  6. package/templates/auth/better-auth/server/base/package.json.hbs +1 -4
  7. package/templates/auth/better-auth/web/react/base/src/lib/auth-client.ts.hbs +6 -2
  8. package/templates/auth/better-auth/web/react/tanstack-router/src/components/sign-in-form.tsx +117 -121
  9. package/templates/auth/better-auth/web/react/tanstack-router/src/components/sign-up-form.tsx +141 -145
  10. package/templates/auth/better-auth/web/react/tanstack-start/src/components/sign-in-form.tsx +117 -121
  11. package/templates/auth/better-auth/web/react/tanstack-start/src/components/sign-up-form.tsx +141 -145
  12. package/templates/auth/better-auth/web/solid/src/components/sign-in-form.tsx +3 -11
  13. package/templates/auth/better-auth/web/solid/src/components/sign-up-form.tsx +4 -14
  14. package/templates/backend/convex/packages/backend/convex/healthCheck.ts +2 -2
  15. package/templates/backend/convex/packages/backend/package.json.hbs +1 -2
  16. package/templates/backend/server/base/package.json.hbs +1 -3
  17. package/templates/db/base/package.json.hbs +1 -4
  18. package/templates/examples/ai/native/bare/polyfills.js +3 -7
  19. package/templates/examples/ai/native/unistyles/polyfills.js +3 -6
  20. package/templates/examples/ai/native/uniwind/polyfills.js +3 -7
  21. package/templates/examples/todo/server/drizzle/postgres/src/schema/todo.ts +1 -1
  22. package/templates/frontend/native/bare/package.json.hbs +1 -2
  23. package/templates/frontend/native/unistyles/package.json.hbs +1 -2
  24. package/templates/frontend/native/uniwind/package.json.hbs +1 -2
  25. package/templates/frontend/nuxt/package.json.hbs +1 -3
  26. package/templates/frontend/react/next/package.json.hbs +1 -3
  27. package/templates/frontend/react/react-router/package.json.hbs +1 -3
  28. package/templates/frontend/react/react-router/src/components/mode-toggle.tsx +3 -9
  29. package/templates/frontend/react/tanstack-router/package.json.hbs +1 -3
  30. package/templates/frontend/react/tanstack-router/src/components/mode-toggle.tsx +3 -9
  31. package/templates/frontend/react/tanstack-start/package.json.hbs +1 -3
  32. package/templates/frontend/react/web-base/src/components/ui/button.tsx +13 -16
  33. package/templates/frontend/react/web-base/src/components/ui/card.tsx +13 -30
  34. package/templates/frontend/react/web-base/src/components/ui/checkbox.tsx +8 -11
  35. package/templates/frontend/react/web-base/src/components/ui/dropdown-menu.tsx +37 -66
  36. package/templates/frontend/react/web-base/src/components/ui/input.tsx +5 -5
  37. package/templates/frontend/react/web-base/src/components/ui/label.tsx +7 -10
  38. package/templates/frontend/react/web-base/src/components/ui/skeleton.tsx +3 -3
  39. package/templates/frontend/react/web-base/src/lib/utils.ts +3 -3
  40. package/templates/frontend/solid/package.json.hbs +1 -3
  41. package/templates/frontend/svelte/package.json.hbs +1 -3
  42. package/templates/frontend/svelte/src/app.d.ts +7 -7
  43. package/templates/frontend/svelte/src/lib/index.ts +1 -0
  44. package/templates/frontend/svelte/vite.config.ts +4 -4
  45. package/dist/cli.d.ts +0 -1
  46. package/dist/cli.js +0 -8
  47. package/dist/index.d.ts +0 -489
  48. package/dist/index.js +0 -4
  49. package/dist/src-BmyCNYPk.js +0 -7240
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "create-better-t-stack",
3
- "version": "3.7.1",
3
+ "version": "3.7.3-canary.1bf365d5",
4
4
  "description": "A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Aman Varshney",
8
8
  "bin": {
9
- "create-better-t-stack": "dist/cli.js"
9
+ "create-better-t-stack": "src/cli.ts"
10
10
  },
11
11
  "files": [
12
12
  "templates",
@@ -48,21 +48,16 @@
48
48
  },
49
49
  "homepage": "https://better-t-stack.dev/",
50
50
  "scripts": {
51
- "build": "tsdown --publint",
52
- "dev": "tsdown --watch",
53
51
  "check-types": "tsc --noEmit",
54
- "check": "biome check --write .",
55
52
  "test": "bun run build && vitest run; rm -rf .smoke || true",
56
- "test:ui": "bun run build && vitest --ui",
57
- "prepublishOnly": "npm run build"
53
+ "test:ui": "bun run build && vitest --ui"
58
54
  },
59
55
  "exports": {
60
56
  ".": {
61
- "types": "./dist/index.d.ts",
62
- "import": "./dist/index.js"
57
+ "import": "./src/index.ts"
63
58
  },
64
59
  "./cli": {
65
- "import": "./dist/cli.js"
60
+ "import": "./src/cli.ts"
66
61
  }
67
62
  },
68
63
  "dependencies": {
@@ -81,9 +76,10 @@
81
76
  "trpc-cli": "^0.12.0",
82
77
  "ts-morph": "^27.0.2",
83
78
  "yaml": "^2.8.1",
84
- "zod": "^4.1.12"
79
+ "zod": "^4.1.13"
85
80
  },
86
81
  "devDependencies": {
82
+ "@create-better-t-stack/types": "1.0.0",
87
83
  "@types/fs-extra": "^11.0.4",
88
84
  "@types/node": "^24.9.1",
89
85
  "@vitest/ui": "^3.2.4",
package/src/cli.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { createBtsCli } from "./index";
2
+
3
+ createBtsCli().run();
@@ -11,8 +11,5 @@
11
11
  "type": "module",
12
12
  "scripts": {},
13
13
  "devDependencies": {},
14
- "peerDependencies": {
15
- "typescript": "^5"
16
- },
17
14
  "dependencies": {}
18
15
  }
@@ -10,8 +10,5 @@
10
10
  },
11
11
  "type": "module",
12
12
  "scripts": {},
13
- "devDependencies": {},
14
- "peerDependencies": {
15
- "typescript": "^5"
16
- }
13
+ "devDependencies": {}
17
14
  }
@@ -1,5 +1,4 @@
1
1
  import { createAuthClient } from "better-auth/react";
2
- import { anonymousClient } from "better-auth/client/plugins";
3
2
  import { convexClient } from "@convex-dev/better-auth/client/plugins";
4
3
  import { expoClient } from "@better-auth/expo/client";
5
4
  import Constants from "expo-constants";
@@ -8,7 +7,6 @@ import * as SecureStore from "expo-secure-store";
8
7
  export const authClient = createAuthClient({
9
8
  baseURL: process.env.EXPO_PUBLIC_CONVEX_SITE_URL,
10
9
  plugins: [
11
- anonymousClient(),
12
10
  expoClient({
13
11
  scheme: Constants.expoConfig?.scheme as string,
14
12
  storagePrefix: Constants.expoConfig?.scheme as string,
@@ -10,8 +10,5 @@
10
10
  },
11
11
  "type": "module",
12
12
  "scripts": {},
13
- "devDependencies": {},
14
- "peerDependencies": {
15
- "typescript": "^5"
16
- }
13
+ "devDependencies": {}
17
14
  }
@@ -1,6 +1,8 @@
1
1
  import type { auth } from "@{{projectName}}/auth";
2
2
  import { createAuthClient } from "better-auth/react";
3
- import { inferAdditionalFields } from "better-auth/client/plugins";
3
+ {{#if (eq payments "polar")}}
4
+ import { polarClient } from "@polar-sh/better-auth";
5
+ {{/if}}
4
6
 
5
7
  export const authClient = createAuthClient({
6
8
  {{#unless (eq backend "self")}}
@@ -11,5 +13,7 @@ export const authClient = createAuthClient({
11
13
  import.meta.env.VITE_SERVER_URL,
12
14
  {{/if}}
13
15
  {{/unless}}
14
- plugins: [inferAdditionalFields<typeof auth>()],
16
+ {{#if (eq payments "polar")}}
17
+ plugins: [polarClient()]
18
+ {{/if}}
15
19
  });
@@ -8,132 +8,128 @@ import { Button } from "./ui/button";
8
8
  import { Input } from "./ui/input";
9
9
  import { Label } from "./ui/label";
10
10
 
11
- export default function SignInForm({
12
- onSwitchToSignUp,
13
- }: {
14
- onSwitchToSignUp: () => void;
15
- }) {
16
- const navigate = useNavigate({
17
- from: "/",
18
- });
19
- const { isPending } = authClient.useSession();
11
+ export default function SignInForm({ onSwitchToSignUp }: { onSwitchToSignUp: () => void }) {
12
+ const navigate = useNavigate({
13
+ from: "/",
14
+ });
15
+ const { isPending } = authClient.useSession();
20
16
 
21
- const form = useForm({
22
- defaultValues: {
23
- email: "",
24
- password: "",
25
- },
26
- onSubmit: async ({ value }) => {
27
- await authClient.signIn.email(
28
- {
29
- email: value.email,
30
- password: value.password,
31
- },
32
- {
33
- onSuccess: () => {
34
- navigate({
35
- to: "/dashboard",
36
- });
37
- toast.success("Sign in successful");
38
- },
39
- onError: (error) => {
40
- toast.error(error.error.message || error.error.statusText);
41
- },
42
- },
43
- );
44
- },
45
- validators: {
46
- onSubmit: z.object({
47
- email: z.email("Invalid email address"),
48
- password: z.string().min(8, "Password must be at least 8 characters"),
49
- }),
50
- },
51
- });
17
+ const form = useForm({
18
+ defaultValues: {
19
+ email: "",
20
+ password: "",
21
+ },
22
+ onSubmit: async ({ value }) => {
23
+ await authClient.signIn.email(
24
+ {
25
+ email: value.email,
26
+ password: value.password,
27
+ },
28
+ {
29
+ onSuccess: () => {
30
+ navigate({
31
+ to: "/dashboard",
32
+ });
33
+ toast.success("Sign in successful");
34
+ },
35
+ onError: (error) => {
36
+ toast.error(error.error.message || error.error.statusText);
37
+ },
38
+ },
39
+ );
40
+ },
41
+ validators: {
42
+ onSubmit: z.object({
43
+ email: z.email("Invalid email address"),
44
+ password: z.string().min(8, "Password must be at least 8 characters"),
45
+ }),
46
+ },
47
+ });
52
48
 
53
- if (isPending) {
54
- return <Loader />;
55
- }
49
+ if (isPending) {
50
+ return <Loader />;
51
+ }
56
52
 
57
- return (
58
- <div className="mx-auto w-full mt-10 max-w-md p-6">
59
- <h1 className="mb-6 text-center text-3xl font-bold">Welcome Back</h1>
53
+ return (
54
+ <div className="mx-auto w-full mt-10 max-w-md p-6">
55
+ <h1 className="mb-6 text-center text-3xl font-bold">Welcome Back</h1>
60
56
 
61
- <form
62
- onSubmit={(e) => {
63
- e.preventDefault();
64
- e.stopPropagation();
65
- form.handleSubmit();
66
- }}
67
- className="space-y-4"
68
- >
69
- <div>
70
- <form.Field name="email">
71
- {(field) => (
72
- <div className="space-y-2">
73
- <Label htmlFor={field.name}>Email</Label>
74
- <Input
75
- id={field.name}
76
- name={field.name}
77
- type="email"
78
- value={field.state.value}
79
- onBlur={field.handleBlur}
80
- onChange={(e) => field.handleChange(e.target.value)}
81
- />
82
- {field.state.meta.errors.map((error) => (
83
- <p key={error?.message} className="text-red-500">
84
- {error?.message}
85
- </p>
86
- ))}
87
- </div>
88
- )}
89
- </form.Field>
90
- </div>
57
+ <form
58
+ onSubmit={(e) => {
59
+ e.preventDefault();
60
+ e.stopPropagation();
61
+ form.handleSubmit();
62
+ }}
63
+ className="space-y-4"
64
+ >
65
+ <div>
66
+ <form.Field name="email">
67
+ {(field) => (
68
+ <div className="space-y-2">
69
+ <Label htmlFor={field.name}>Email</Label>
70
+ <Input
71
+ id={field.name}
72
+ name={field.name}
73
+ type="email"
74
+ value={field.state.value}
75
+ onBlur={field.handleBlur}
76
+ onChange={(e) => field.handleChange(e.target.value)}
77
+ />
78
+ {field.state.meta.errors.map((error) => (
79
+ <p key={error?.message} className="text-red-500">
80
+ {error?.message}
81
+ </p>
82
+ ))}
83
+ </div>
84
+ )}
85
+ </form.Field>
86
+ </div>
91
87
 
92
- <div>
93
- <form.Field name="password">
94
- {(field) => (
95
- <div className="space-y-2">
96
- <Label htmlFor={field.name}>Password</Label>
97
- <Input
98
- id={field.name}
99
- name={field.name}
100
- type="password"
101
- value={field.state.value}
102
- onBlur={field.handleBlur}
103
- onChange={(e) => field.handleChange(e.target.value)}
104
- />
105
- {field.state.meta.errors.map((error) => (
106
- <p key={error?.message} className="text-red-500">
107
- {error?.message}
108
- </p>
109
- ))}
110
- </div>
111
- )}
112
- </form.Field>
113
- </div>
88
+ <div>
89
+ <form.Field name="password">
90
+ {(field) => (
91
+ <div className="space-y-2">
92
+ <Label htmlFor={field.name}>Password</Label>
93
+ <Input
94
+ id={field.name}
95
+ name={field.name}
96
+ type="password"
97
+ value={field.state.value}
98
+ onBlur={field.handleBlur}
99
+ onChange={(e) => field.handleChange(e.target.value)}
100
+ />
101
+ {field.state.meta.errors.map((error) => (
102
+ <p key={error?.message} className="text-red-500">
103
+ {error?.message}
104
+ </p>
105
+ ))}
106
+ </div>
107
+ )}
108
+ </form.Field>
109
+ </div>
114
110
 
115
- <form.Subscribe>
116
- {(state) => (
117
- <Button
118
- type="submit"
119
- className="w-full"
120
- disabled={!state.canSubmit || state.isSubmitting}
121
- >
122
- {state.isSubmitting ? "Submitting..." : "Sign In"}
123
- </Button>
124
- )}
125
- </form.Subscribe>
126
- </form>
111
+ <form.Subscribe>
112
+ {(state) => (
113
+ <Button
114
+ type="submit"
115
+ className="w-full"
116
+ disabled={!state.canSubmit || state.isSubmitting}
117
+ >
118
+ {state.isSubmitting ? "Submitting..." : "Sign In"}
119
+ </Button>
120
+ )}
121
+ </form.Subscribe>
122
+ </form>
127
123
 
128
- <div className="mt-4 text-center">
129
- <Button
130
- variant="link"
131
- onClick={onSwitchToSignUp}
132
- className="text-indigo-600 hover:text-indigo-800"
133
- >
134
- Need an account? Sign Up
135
- </Button>
136
- </div>
137
- </div>
138
- );
124
+ <div className="mt-4 text-center">
125
+ <Button
126
+ variant="link"
127
+ onClick={onSwitchToSignUp}
128
+ className="text-indigo-600 hover:text-indigo-800"
129
+ >
130
+ Need an account? Sign Up
131
+ </Button>
132
+ </div>
133
+ </div>
134
+ );
139
135
  }