create-better-t-stack 3.7.3-canary.8e4d5716 → 3.7.3-canary.98ba1e7a

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 (104) hide show
  1. package/dist/cli.d.ts +1 -0
  2. package/dist/cli.js +8 -0
  3. package/dist/index.d.ts +347 -0
  4. package/dist/index.js +4 -0
  5. package/dist/src-yXf02Wox.js +7077 -0
  6. package/package.json +11 -7
  7. package/src/cli.ts +0 -3
  8. package/src/constants.ts +0 -188
  9. package/src/helpers/addons/addons-setup.ts +0 -226
  10. package/src/helpers/addons/examples-setup.ts +0 -104
  11. package/src/helpers/addons/fumadocs-setup.ts +0 -103
  12. package/src/helpers/addons/ruler-setup.ts +0 -139
  13. package/src/helpers/addons/starlight-setup.ts +0 -51
  14. package/src/helpers/addons/tauri-setup.ts +0 -96
  15. package/src/helpers/addons/ultracite-setup.ts +0 -232
  16. package/src/helpers/addons/vite-pwa-setup.ts +0 -59
  17. package/src/helpers/core/add-addons.ts +0 -85
  18. package/src/helpers/core/add-deployment.ts +0 -102
  19. package/src/helpers/core/api-setup.ts +0 -280
  20. package/src/helpers/core/auth-setup.ts +0 -203
  21. package/src/helpers/core/backend-setup.ts +0 -73
  22. package/src/helpers/core/command-handlers.ts +0 -354
  23. package/src/helpers/core/convex-codegen.ts +0 -14
  24. package/src/helpers/core/create-project.ts +0 -133
  25. package/src/helpers/core/create-readme.ts +0 -687
  26. package/src/helpers/core/db-setup.ts +0 -184
  27. package/src/helpers/core/detect-project-config.ts +0 -41
  28. package/src/helpers/core/env-setup.ts +0 -449
  29. package/src/helpers/core/git.ts +0 -31
  30. package/src/helpers/core/install-dependencies.ts +0 -32
  31. package/src/helpers/core/payments-setup.ts +0 -48
  32. package/src/helpers/core/post-installation.ts +0 -383
  33. package/src/helpers/core/project-config.ts +0 -246
  34. package/src/helpers/core/runtime-setup.ts +0 -76
  35. package/src/helpers/core/template-manager.ts +0 -917
  36. package/src/helpers/core/workspace-setup.ts +0 -184
  37. package/src/helpers/database-providers/d1-setup.ts +0 -28
  38. package/src/helpers/database-providers/docker-compose-setup.ts +0 -50
  39. package/src/helpers/database-providers/mongodb-atlas-setup.ts +0 -186
  40. package/src/helpers/database-providers/neon-setup.ts +0 -243
  41. package/src/helpers/database-providers/planetscale-setup.ts +0 -78
  42. package/src/helpers/database-providers/prisma-postgres-setup.ts +0 -196
  43. package/src/helpers/database-providers/supabase-setup.ts +0 -218
  44. package/src/helpers/database-providers/turso-setup.ts +0 -309
  45. package/src/helpers/deployment/alchemy/alchemy-combined-setup.ts +0 -80
  46. package/src/helpers/deployment/alchemy/alchemy-next-setup.ts +0 -51
  47. package/src/helpers/deployment/alchemy/alchemy-nuxt-setup.ts +0 -104
  48. package/src/helpers/deployment/alchemy/alchemy-react-router-setup.ts +0 -32
  49. package/src/helpers/deployment/alchemy/alchemy-solid-setup.ts +0 -32
  50. package/src/helpers/deployment/alchemy/alchemy-svelte-setup.ts +0 -98
  51. package/src/helpers/deployment/alchemy/alchemy-tanstack-router-setup.ts +0 -33
  52. package/src/helpers/deployment/alchemy/alchemy-tanstack-start-setup.ts +0 -98
  53. package/src/helpers/deployment/alchemy/env-dts-setup.ts +0 -76
  54. package/src/helpers/deployment/alchemy/index.ts +0 -7
  55. package/src/helpers/deployment/server-deploy-setup.ts +0 -55
  56. package/src/helpers/deployment/web-deploy-setup.ts +0 -58
  57. package/src/index.ts +0 -253
  58. package/src/prompts/addons.ts +0 -178
  59. package/src/prompts/api.ts +0 -49
  60. package/src/prompts/auth.ts +0 -84
  61. package/src/prompts/backend.ts +0 -83
  62. package/src/prompts/config-prompts.ts +0 -138
  63. package/src/prompts/database-setup.ts +0 -112
  64. package/src/prompts/database.ts +0 -57
  65. package/src/prompts/examples.ts +0 -64
  66. package/src/prompts/frontend.ts +0 -118
  67. package/src/prompts/git.ts +0 -16
  68. package/src/prompts/install.ts +0 -16
  69. package/src/prompts/orm.ts +0 -53
  70. package/src/prompts/package-manager.ts +0 -32
  71. package/src/prompts/payments.ts +0 -50
  72. package/src/prompts/project-name.ts +0 -86
  73. package/src/prompts/runtime.ts +0 -47
  74. package/src/prompts/server-deploy.ts +0 -91
  75. package/src/prompts/web-deploy.ts +0 -107
  76. package/src/types.ts +0 -2
  77. package/src/utils/add-package-deps.ts +0 -57
  78. package/src/utils/analytics.ts +0 -39
  79. package/src/utils/better-auth-plugin-setup.ts +0 -71
  80. package/src/utils/biome-formatter.ts +0 -82
  81. package/src/utils/bts-config.ts +0 -122
  82. package/src/utils/command-exists.ts +0 -16
  83. package/src/utils/compatibility-rules.ts +0 -319
  84. package/src/utils/compatibility.ts +0 -11
  85. package/src/utils/config-processing.ts +0 -130
  86. package/src/utils/config-validation.ts +0 -470
  87. package/src/utils/display-config.ts +0 -96
  88. package/src/utils/docker-utils.ts +0 -70
  89. package/src/utils/errors.ts +0 -32
  90. package/src/utils/generate-reproducible-command.ts +0 -53
  91. package/src/utils/get-latest-cli-version.ts +0 -11
  92. package/src/utils/get-package-manager.ts +0 -13
  93. package/src/utils/open-url.ts +0 -25
  94. package/src/utils/package-runner.ts +0 -23
  95. package/src/utils/project-directory.ts +0 -102
  96. package/src/utils/project-name-validation.ts +0 -43
  97. package/src/utils/render-title.ts +0 -48
  98. package/src/utils/setup-catalogs.ts +0 -192
  99. package/src/utils/sponsors.ts +0 -101
  100. package/src/utils/telemetry.ts +0 -19
  101. package/src/utils/template-processor.ts +0 -64
  102. package/src/utils/templates.ts +0 -94
  103. package/src/utils/ts-morph.ts +0 -26
  104. package/src/validation.ts +0 -117
@@ -1,102 +0,0 @@
1
- import path from "node:path";
2
- import { log } from "@clack/prompts";
3
- import pc from "picocolors";
4
- import type { AddInput, ProjectConfig, ServerDeploy, WebDeploy } from "../../types";
5
- import { updateBtsConfig } from "../../utils/bts-config";
6
- import { exitWithError } from "../../utils/errors";
7
- import { setupServerDeploy } from "../deployment/server-deploy-setup";
8
- import { setupWebDeploy } from "../deployment/web-deploy-setup";
9
- import { detectProjectConfig, isBetterTStackProject } from "./detect-project-config";
10
- import { installDependencies } from "./install-dependencies";
11
- import { setupDeploymentTemplates } from "./template-manager";
12
-
13
- export async function addDeploymentToProject(
14
- input: AddInput & {
15
- webDeploy?: WebDeploy;
16
- serverDeploy?: ServerDeploy;
17
- suppressInstallMessage?: boolean;
18
- },
19
- ) {
20
- try {
21
- const projectDir = input.projectDir || process.cwd();
22
-
23
- const isBetterTStack = await isBetterTStackProject(projectDir);
24
- if (!isBetterTStack) {
25
- exitWithError(
26
- "This doesn't appear to be a Better-T-Stack project. Please run this command from the root of a Better-T-Stack project.",
27
- );
28
- }
29
-
30
- const detectedConfig = await detectProjectConfig(projectDir);
31
- if (!detectedConfig) {
32
- exitWithError(
33
- "Could not detect the project configuration. Please ensure this is a valid Better-T-Stack project.",
34
- );
35
- }
36
-
37
- if (input.webDeploy && detectedConfig.webDeploy === input.webDeploy) {
38
- exitWithError(`${input.webDeploy} web deployment is already configured for this project.`);
39
- }
40
-
41
- if (input.serverDeploy && detectedConfig.serverDeploy === input.serverDeploy) {
42
- exitWithError(
43
- `${input.serverDeploy} server deployment is already configured for this project.`,
44
- );
45
- }
46
-
47
- const config: ProjectConfig = {
48
- projectName: detectedConfig.projectName || path.basename(projectDir),
49
- projectDir,
50
- relativePath: ".",
51
- database: detectedConfig.database || "none",
52
- orm: detectedConfig.orm || "none",
53
- backend: detectedConfig.backend || "none",
54
- runtime: detectedConfig.runtime || "none",
55
- frontend: detectedConfig.frontend || [],
56
- addons: detectedConfig.addons || [],
57
- examples: detectedConfig.examples || [],
58
- auth: detectedConfig.auth || "none",
59
- payments: detectedConfig.payments || "none",
60
- git: false,
61
- packageManager: input.packageManager || detectedConfig.packageManager || "npm",
62
- install: input.install || false,
63
- dbSetup: detectedConfig.dbSetup || "none",
64
- api: detectedConfig.api || "none",
65
- webDeploy: input.webDeploy || detectedConfig.webDeploy || "none",
66
- serverDeploy: input.serverDeploy || detectedConfig.serverDeploy || "none",
67
- };
68
-
69
- if (input.webDeploy && input.webDeploy !== "none") {
70
- log.info(
71
- pc.green(`Adding ${input.webDeploy} web deployment to ${config.frontend.join("/")}`),
72
- );
73
- }
74
-
75
- if (input.serverDeploy && input.serverDeploy !== "none") {
76
- log.info(pc.green(`Adding ${input.serverDeploy} server deployment`));
77
- }
78
-
79
- await setupDeploymentTemplates(projectDir, config);
80
- await setupWebDeploy(config);
81
- await setupServerDeploy(config);
82
-
83
- await updateBtsConfig(projectDir, {
84
- webDeploy: input.webDeploy || config.webDeploy,
85
- serverDeploy: input.serverDeploy || config.serverDeploy,
86
- });
87
-
88
- if (config.install) {
89
- await installDependencies({
90
- projectDir,
91
- packageManager: config.packageManager,
92
- });
93
- } else if (!input.suppressInstallMessage) {
94
- log.info(
95
- pc.yellow(`Run ${pc.bold(`${config.packageManager} install`)} to install dependencies`),
96
- );
97
- }
98
- } catch (error) {
99
- const message = error instanceof Error ? error.message : String(error);
100
- exitWithError(`Error adding deployment: ${message}`);
101
- }
102
- }
@@ -1,280 +0,0 @@
1
- import path from "node:path";
2
- import fs from "fs-extra";
3
- import type { AvailableDependencies } from "../../constants";
4
- import type { API, Backend, Frontend, ProjectConfig } from "../../types";
5
- import { addPackageDependency } from "../../utils/add-package-deps";
6
-
7
- function getFrontendType(frontend: Frontend[]): {
8
- hasReactWeb: boolean;
9
- hasNuxtWeb: boolean;
10
- hasSvelteWeb: boolean;
11
- hasSolidWeb: boolean;
12
- hasNative: boolean;
13
- } {
14
- const reactBasedFrontends = ["tanstack-router", "react-router", "tanstack-start", "next"];
15
- const nativeFrontends = ["native-bare", "native-uniwind", "native-unistyles"];
16
-
17
- return {
18
- hasReactWeb: frontend.some((f) => reactBasedFrontends.includes(f)),
19
- hasNuxtWeb: frontend.includes("nuxt"),
20
- hasSvelteWeb: frontend.includes("svelte"),
21
- hasSolidWeb: frontend.includes("solid"),
22
- hasNative: frontend.some((f) => nativeFrontends.includes(f)),
23
- };
24
- }
25
-
26
- function getApiDependencies(
27
- api: API,
28
- frontendType: ReturnType<typeof getFrontendType>,
29
- backend: Backend,
30
- ) {
31
- const deps: Record<string, { dependencies: string[]; devDependencies?: string[] }> = {};
32
-
33
- if (api === "orpc") {
34
- deps.server = {
35
- dependencies: ["@orpc/server", "@orpc/client", "@orpc/openapi", "@orpc/zod"],
36
- };
37
- } else if (api === "trpc") {
38
- deps.server = { dependencies: ["@trpc/server", "@trpc/client"] };
39
- }
40
-
41
- if (backend !== "self" && backend !== "convex" && backend !== "none") {
42
- if (!deps.server) {
43
- deps.server = { dependencies: [] };
44
- }
45
-
46
- if (backend === "hono") {
47
- deps.server.dependencies.push("hono");
48
- } else if (backend === "elysia") {
49
- deps.server.dependencies.push("elysia");
50
- }
51
- }
52
-
53
- if (frontendType.hasReactWeb) {
54
- if (api === "orpc") {
55
- deps.web = {
56
- dependencies: ["@orpc/tanstack-query", "@orpc/client", "@orpc/server"],
57
- };
58
- } else if (api === "trpc") {
59
- deps.web = {
60
- dependencies: ["@trpc/tanstack-react-query", "@trpc/client", "@trpc/server"],
61
- };
62
- }
63
- } else if (frontendType.hasNuxtWeb && api === "orpc") {
64
- deps.web = {
65
- dependencies: ["@tanstack/vue-query", "@orpc/tanstack-query", "@orpc/client", "@orpc/server"],
66
- devDependencies: ["@tanstack/vue-query-devtools"],
67
- };
68
- } else if (frontendType.hasSvelteWeb && api === "orpc") {
69
- deps.web = {
70
- dependencies: [
71
- "@orpc/tanstack-query",
72
- "@orpc/client",
73
- "@orpc/server",
74
- "@tanstack/svelte-query",
75
- ],
76
- devDependencies: ["@tanstack/svelte-query-devtools"],
77
- };
78
- } else if (frontendType.hasSolidWeb && api === "orpc") {
79
- deps.web = {
80
- dependencies: [
81
- "@orpc/tanstack-query",
82
- "@orpc/client",
83
- "@orpc/server",
84
- "@tanstack/solid-query",
85
- ],
86
- devDependencies: ["@tanstack/solid-query-devtools", "@tanstack/solid-router-devtools"],
87
- };
88
- }
89
-
90
- if (api === "trpc") {
91
- deps.native = {
92
- dependencies: ["@trpc/tanstack-react-query", "@trpc/client", "@trpc/server"],
93
- };
94
- } else if (api === "orpc") {
95
- deps.native = { dependencies: ["@orpc/tanstack-query", "@orpc/client"] };
96
- }
97
-
98
- return deps;
99
- }
100
-
101
- function getQueryDependencies(frontend: Frontend[]) {
102
- const reactBasedFrontends: Frontend[] = [
103
- "react-router",
104
- "tanstack-router",
105
- "tanstack-start",
106
- "next",
107
- "native-bare",
108
- "native-uniwind",
109
- "native-unistyles",
110
- ];
111
-
112
- const deps: Record<string, { dependencies: string[]; devDependencies?: string[] }> = {};
113
-
114
- const needsReactQuery = frontend.some((f) => reactBasedFrontends.includes(f));
115
- if (needsReactQuery) {
116
- const hasReactWeb = frontend.some(
117
- (f) =>
118
- f !== "native-bare" &&
119
- f !== "native-uniwind" &&
120
- f !== "native-unistyles" &&
121
- reactBasedFrontends.includes(f),
122
- );
123
- const hasNative =
124
- frontend.includes("native-bare") ||
125
- frontend.includes("native-uniwind") ||
126
- frontend.includes("native-unistyles");
127
-
128
- if (hasReactWeb) {
129
- deps.web = {
130
- dependencies: ["@tanstack/react-query"],
131
- devDependencies: ["@tanstack/react-query-devtools"],
132
- };
133
- }
134
- if (hasNative) {
135
- deps.native = { dependencies: ["@tanstack/react-query"] };
136
- }
137
- }
138
-
139
- if (frontend.includes("solid")) {
140
- deps.web = {
141
- dependencies: ["@tanstack/solid-query"],
142
- devDependencies: ["@tanstack/solid-query-devtools", "@tanstack/solid-router-devtools"],
143
- };
144
- }
145
-
146
- return deps;
147
- }
148
-
149
- function getConvexDependencies(frontend: Frontend[]) {
150
- const deps: Record<string, { dependencies: string[] }> = {
151
- web: { dependencies: ["convex"] },
152
- native: { dependencies: ["convex"] },
153
- };
154
-
155
- if (frontend.includes("tanstack-start")) {
156
- deps.web.dependencies.push("@convex-dev/react-query");
157
- }
158
- if (frontend.includes("svelte")) {
159
- deps.web.dependencies.push("convex-svelte");
160
- }
161
- if (frontend.includes("nuxt")) {
162
- deps.web.dependencies.push("convex-nuxt", "convex-vue");
163
- }
164
-
165
- return deps;
166
- }
167
-
168
- export async function setupApi(config: ProjectConfig) {
169
- const { api, frontend, backend, projectDir } = config;
170
- const isConvex = backend === "convex";
171
-
172
- const webDir = path.join(projectDir, "apps/web");
173
- const nativeDir = path.join(projectDir, "apps/native");
174
- const serverDir = path.join(projectDir, "apps/server");
175
-
176
- const webDirExists = await fs.pathExists(webDir);
177
- const nativeDirExists = await fs.pathExists(nativeDir);
178
- const _serverDirExists = await fs.pathExists(serverDir);
179
-
180
- const frontendType = getFrontendType(frontend);
181
-
182
- if (!isConvex && api !== "none") {
183
- const apiDeps = getApiDependencies(api, frontendType, backend);
184
- const apiPackageDir = path.join(projectDir, "packages/api");
185
-
186
- if (apiDeps.server) {
187
- await addPackageDependency({
188
- dependencies: apiDeps.server.dependencies as AvailableDependencies[],
189
- projectDir: apiPackageDir,
190
- });
191
-
192
- if (backend === "self" && webDirExists) {
193
- await addPackageDependency({
194
- dependencies: apiDeps.server.dependencies as AvailableDependencies[],
195
- projectDir: webDir,
196
- });
197
- }
198
-
199
- if (backend === "self") {
200
- const frameworkDeps: AvailableDependencies[] = [];
201
- if (frontend.includes("next")) {
202
- frameworkDeps.push("next");
203
- }
204
-
205
- if (frameworkDeps.length > 0) {
206
- await addPackageDependency({
207
- dependencies: frameworkDeps,
208
- projectDir: apiPackageDir,
209
- });
210
- }
211
- }
212
- }
213
-
214
- if (config.auth === "better-auth" && (backend === "express" || backend === "fastify")) {
215
- await addPackageDependency({
216
- dependencies: ["better-auth"],
217
- projectDir: apiPackageDir,
218
- });
219
- }
220
-
221
- if (backend === "express") {
222
- await addPackageDependency({
223
- devDependencies: ["@types/express"],
224
- projectDir: apiPackageDir,
225
- });
226
- }
227
-
228
- if (webDirExists && apiDeps.web) {
229
- await addPackageDependency({
230
- dependencies: apiDeps.web.dependencies as AvailableDependencies[],
231
- devDependencies: apiDeps.web.devDependencies as AvailableDependencies[],
232
- projectDir: webDir,
233
- });
234
- }
235
-
236
- if (nativeDirExists && apiDeps.native) {
237
- await addPackageDependency({
238
- dependencies: apiDeps.native.dependencies as AvailableDependencies[],
239
- projectDir: nativeDir,
240
- });
241
- }
242
- }
243
-
244
- if (!isConvex) {
245
- const queryDeps = getQueryDependencies(frontend);
246
-
247
- if (webDirExists && queryDeps.web) {
248
- await addPackageDependency({
249
- dependencies: queryDeps.web.dependencies as AvailableDependencies[],
250
- devDependencies: queryDeps.web.devDependencies as AvailableDependencies[],
251
- projectDir: webDir,
252
- });
253
- }
254
-
255
- if (nativeDirExists && queryDeps.native) {
256
- await addPackageDependency({
257
- dependencies: queryDeps.native.dependencies as AvailableDependencies[],
258
- projectDir: nativeDir,
259
- });
260
- }
261
- }
262
-
263
- if (isConvex) {
264
- const convexDeps = getConvexDependencies(frontend);
265
-
266
- if (webDirExists) {
267
- await addPackageDependency({
268
- dependencies: convexDeps.web.dependencies as AvailableDependencies[],
269
- projectDir: webDir,
270
- });
271
- }
272
-
273
- if (nativeDirExists) {
274
- await addPackageDependency({
275
- dependencies: convexDeps.native.dependencies as AvailableDependencies[],
276
- projectDir: nativeDir,
277
- });
278
- }
279
- }
280
- }
@@ -1,203 +0,0 @@
1
- import path from "node:path";
2
- import consola from "consola";
3
- import fs from "fs-extra";
4
- import pc from "picocolors";
5
- import type { ProjectConfig } from "../../types";
6
- import { addPackageDependency } from "../../utils/add-package-deps";
7
- import { setupBetterAuthPlugins } from "../../utils/better-auth-plugin-setup";
8
-
9
- export async function setupAuth(config: ProjectConfig) {
10
- const { auth, frontend, backend, projectDir } = config;
11
- if (!auth || auth === "none") {
12
- return;
13
- }
14
-
15
- const serverDir = path.join(projectDir, "apps/server");
16
- const clientDir = path.join(projectDir, "apps/web");
17
- const nativeDir = path.join(projectDir, "apps/native");
18
-
19
- const clientDirExists = await fs.pathExists(clientDir);
20
- const nativeDirExists = await fs.pathExists(nativeDir);
21
- const _serverDirExists = await fs.pathExists(serverDir);
22
-
23
- try {
24
- if (backend === "convex") {
25
- if (auth === "clerk" && clientDirExists) {
26
- const hasNextJs = frontend.includes("next");
27
- const hasTanStackStart = frontend.includes("tanstack-start");
28
- const hasViteReactOther = frontend.some((f) =>
29
- ["tanstack-router", "react-router"].includes(f),
30
- );
31
-
32
- if (hasNextJs) {
33
- await addPackageDependency({
34
- dependencies: ["@clerk/nextjs"],
35
- projectDir: clientDir,
36
- });
37
- } else if (hasTanStackStart) {
38
- await addPackageDependency({
39
- dependencies: ["@clerk/tanstack-react-start", "srvx"],
40
- projectDir: clientDir,
41
- });
42
- } else if (hasViteReactOther) {
43
- await addPackageDependency({
44
- dependencies: ["@clerk/clerk-react"],
45
- projectDir: clientDir,
46
- });
47
- }
48
- }
49
-
50
- if (auth === "better-auth") {
51
- const convexBackendDir = path.join(projectDir, "packages/backend");
52
- const convexBackendDirExists = await fs.pathExists(convexBackendDir);
53
-
54
- const hasNativeForBA =
55
- frontend.includes("native-bare") ||
56
- frontend.includes("native-uniwind") ||
57
- frontend.includes("native-unistyles");
58
-
59
- if (convexBackendDirExists) {
60
- await addPackageDependency({
61
- dependencies: ["better-auth", "@convex-dev/better-auth"],
62
- customDependencies: { "better-auth": "1.3.34" },
63
- projectDir: convexBackendDir,
64
- });
65
- if (hasNativeForBA) {
66
- await addPackageDependency({
67
- dependencies: ["@better-auth/expo"],
68
- customDependencies: { "@better-auth/expo": "1.3.34" },
69
- projectDir: convexBackendDir,
70
- });
71
- }
72
- }
73
-
74
- if (clientDirExists) {
75
- const hasNextJs = frontend.includes("next");
76
- const hasTanStackStart = frontend.includes("tanstack-start");
77
- const hasViteReactOther = frontend.some((f) =>
78
- ["tanstack-router", "react-router"].includes(f),
79
- );
80
-
81
- if (hasNextJs) {
82
- await addPackageDependency({
83
- dependencies: ["better-auth", "@convex-dev/better-auth"],
84
- customDependencies: { "better-auth": "1.3.34" },
85
- projectDir: clientDir,
86
- });
87
- } else if (hasTanStackStart) {
88
- await addPackageDependency({
89
- dependencies: ["better-auth", "@convex-dev/better-auth"],
90
- customDependencies: { "better-auth": "1.3.34" },
91
- projectDir: clientDir,
92
- });
93
- } else if (hasViteReactOther) {
94
- await addPackageDependency({
95
- dependencies: ["better-auth", "@convex-dev/better-auth"],
96
- customDependencies: { "better-auth": "1.3.34" },
97
- projectDir: clientDir,
98
- });
99
- }
100
- }
101
-
102
- const hasNativeBare = frontend.includes("native-bare");
103
- const hasNativeUniwind = frontend.includes("native-uniwind");
104
- const hasUnistyles = frontend.includes("native-unistyles");
105
- if (nativeDirExists && (hasNativeBare || hasNativeUniwind || hasUnistyles)) {
106
- await addPackageDependency({
107
- dependencies: ["better-auth", "@better-auth/expo", "@convex-dev/better-auth"],
108
- customDependencies: {
109
- "better-auth": "1.3.34",
110
- "@better-auth/expo": "1.3.34",
111
- },
112
- projectDir: nativeDir,
113
- });
114
- }
115
- }
116
-
117
- const hasNativeBare = frontend.includes("native-bare");
118
- const hasNativeUniwind = frontend.includes("native-uniwind");
119
- const hasUnistyles = frontend.includes("native-unistyles");
120
- if (
121
- auth === "clerk" &&
122
- nativeDirExists &&
123
- (hasNativeBare || hasNativeUniwind || hasUnistyles)
124
- ) {
125
- await addPackageDependency({
126
- dependencies: ["@clerk/clerk-expo"],
127
- projectDir: nativeDir,
128
- });
129
- }
130
- return;
131
- }
132
-
133
- const authPackageDir = path.join(projectDir, "packages/auth");
134
- const authPackageDirExists = await fs.pathExists(authPackageDir);
135
-
136
- if (authPackageDirExists && auth === "better-auth") {
137
- await addPackageDependency({
138
- dependencies: ["better-auth"],
139
- projectDir: authPackageDir,
140
- });
141
- }
142
-
143
- const hasWebFrontend = frontend.some((f) =>
144
- [
145
- "react-router",
146
- "tanstack-router",
147
- "tanstack-start",
148
- "next",
149
- "nuxt",
150
- "svelte",
151
- "solid",
152
- ].includes(f),
153
- );
154
-
155
- if (hasWebFrontend && clientDirExists) {
156
- if (auth === "better-auth") {
157
- await addPackageDependency({
158
- dependencies: ["better-auth"],
159
- projectDir: clientDir,
160
- });
161
- }
162
- }
163
-
164
- if (
165
- (frontend.includes("native-bare") ||
166
- frontend.includes("native-uniwind") ||
167
- frontend.includes("native-unistyles")) &&
168
- nativeDirExists
169
- ) {
170
- if (auth === "better-auth") {
171
- await addPackageDependency({
172
- dependencies: ["better-auth", "@better-auth/expo"],
173
- projectDir: nativeDir,
174
- });
175
- if (authPackageDirExists) {
176
- await addPackageDependency({
177
- dependencies: ["@better-auth/expo"],
178
- projectDir: authPackageDir,
179
- });
180
- }
181
- }
182
- }
183
-
184
- if (authPackageDirExists && auth === "better-auth") {
185
- await setupBetterAuthPlugins(projectDir, config);
186
- }
187
- } catch (error) {
188
- consola.error(pc.red("Failed to configure authentication dependencies"));
189
- if (error instanceof Error) {
190
- consola.error(pc.red(error.message));
191
- }
192
- }
193
- }
194
-
195
- export function generateAuthSecret(length = 32) {
196
- const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
197
- let result = "";
198
- const charactersLength = characters.length;
199
- for (let i = 0; i < length; i++) {
200
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
201
- }
202
- return result;
203
- }
@@ -1,73 +0,0 @@
1
- import path from "node:path";
2
- import type { AvailableDependencies } from "../../constants";
3
- import type { ProjectConfig } from "../../types";
4
- import { addPackageDependency } from "../../utils/add-package-deps";
5
-
6
- export async function setupBackendDependencies(config: ProjectConfig) {
7
- const { backend, runtime, api, auth, examples, projectDir } = config;
8
-
9
- if (backend === "convex") {
10
- const convexBackendDir = path.join(projectDir, "packages/backend");
11
- await addPackageDependency({
12
- dependencies: ["convex"],
13
- projectDir: convexBackendDir,
14
- });
15
- return;
16
- }
17
-
18
- const framework = backend;
19
- const serverDir = path.join(projectDir, "apps/server");
20
-
21
- const dependencies: AvailableDependencies[] = [];
22
- const devDependencies: AvailableDependencies[] = [];
23
-
24
- if (framework === "hono") {
25
- dependencies.push("hono");
26
- if (runtime === "node") {
27
- dependencies.push("@hono/node-server");
28
- }
29
- } else if (framework === "elysia") {
30
- dependencies.push("elysia", "@elysiajs/cors");
31
- if (runtime === "node") {
32
- dependencies.push("@elysiajs/node");
33
- }
34
- } else if (framework === "express") {
35
- dependencies.push("express", "cors");
36
- devDependencies.push("@types/express", "@types/cors");
37
- } else if (framework === "fastify") {
38
- dependencies.push("fastify", "@fastify/cors");
39
- }
40
-
41
- if (api === "trpc") {
42
- dependencies.push("@trpc/server");
43
- if (framework === "hono") {
44
- dependencies.push("@hono/trpc-server");
45
- } else if (framework === "elysia") {
46
- dependencies.push("@elysiajs/trpc");
47
- }
48
- } else if (api === "orpc") {
49
- dependencies.push("@orpc/server", "@orpc/openapi", "@orpc/zod");
50
- }
51
-
52
- if (auth === "better-auth") {
53
- dependencies.push("better-auth");
54
- }
55
-
56
- if (examples.includes("ai")) {
57
- dependencies.push("ai", "@ai-sdk/google");
58
- }
59
-
60
- if (runtime === "node") {
61
- devDependencies.push("tsx", "@types/node");
62
- } else if (runtime === "bun") {
63
- devDependencies.push("@types/bun");
64
- }
65
-
66
- if (dependencies.length > 0 || devDependencies.length > 0) {
67
- await addPackageDependency({
68
- dependencies,
69
- devDependencies,
70
- projectDir: serverDir,
71
- });
72
- }
73
- }