-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Expand file tree
/
Copy pathbetterAuth.ts
More file actions
134 lines (117 loc) · 3.66 KB
/
Copy pathbetterAuth.ts
File metadata and controls
134 lines (117 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import path from "path";
import fs from "fs-extra";
import { PKG_ROOT } from "~/consts.js";
import { type AvailableDependencies } from "~/installers/dependencyVersionMap.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";
export const betterAuthInstaller: Installer = ({
projectDir,
packages,
databaseProvider,
appRouter,
}) => {
const usingPrisma = packages?.prisma.inUse;
const usingDrizzle = packages?.drizzle.inUse;
const deps: AvailableDependencies[] = ["better-auth"];
if (usingPrisma) deps.push("@auth/prisma-adapter");
if (usingDrizzle) deps.push("@better-auth/drizzle-adapter");
addPackageDependency({
projectDir,
dependencies: deps,
devMode: false,
});
const extrasDir = path.join(PKG_ROOT, "template/extras");
const isAppRouter = appRouter ?? true; // Default to app router if not specified
const apiHandlerFile = isAppRouter
? "src/app/api/auth/[...all]/route.ts"
: "src/pages/api/auth/[...all].ts";
const apiHandlerSrc = path.join(extrasDir, apiHandlerFile);
const apiHandlerDest = path.join(projectDir, apiHandlerFile);
const authConfigSrc = path.join(
extrasDir,
"src/server/better-auth/config",
usingPrisma
? "with-prisma.ts"
: usingDrizzle
? "with-drizzle.ts"
: "base.ts"
);
const authConfigDest = path.join(
projectDir,
"src/server/better-auth/config.ts"
);
const authIndexSrc = path.join(extrasDir, "src/server/better-auth/index.ts");
const authIndexDest = path.join(
projectDir,
"src/server/better-auth/index.ts"
);
// Better Auth client and server helpers
const betterAuthClientSrc = path.join(
extrasDir,
"src/server/better-auth/client.ts"
);
const betterAuthClientDest = path.join(
projectDir,
"src/server/better-auth/client.ts"
);
const betterAuthServerSrc = path.join(
extrasDir,
"src/server/better-auth/server.ts"
);
const betterAuthServerDest = path.join(
projectDir,
"src/server/better-auth/server.ts"
);
fs.copySync(apiHandlerSrc, apiHandlerDest);
fs.copySync(authConfigSrc, authConfigDest);
fs.copySync(authIndexSrc, authIndexDest);
fs.copySync(betterAuthClientSrc, betterAuthClientDest);
fs.copySync(betterAuthServerSrc, betterAuthServerDest);
// Update Better Auth adapter provider according to selected DB
try {
if (fs.pathExistsSync(authConfigDest)) {
const content = fs.readFileSync(authConfigDest, "utf8");
// Map CLI database provider to adapter provider strings
const providerForDrizzle = (db: string) => {
switch (db) {
case "postgres":
return "pg";
case "mysql":
case "planetscale":
return "mysql";
case "sqlite":
return "sqlite";
default:
return "pg";
}
};
const providerForPrisma = (db: string) => {
switch (db) {
case "postgres":
return "postgresql";
case "mysql":
case "planetscale":
return "mysql";
case "sqlite":
return "sqlite";
default:
return "postgresql";
}
};
const providerValue = usingPrisma
? providerForPrisma(databaseProvider)
: usingDrizzle
? providerForDrizzle(databaseProvider)
: undefined;
if (providerValue) {
const updated = content.replace(
/(provider:\s*")[^"]+("\s*,?)/,
`$1${providerValue}$2`
);
fs.writeFileSync(authConfigDest, updated, "utf8");
}
}
} catch {
// Non-fatal: leave default provider from template
}
};