Skip to content

Commit 3172b5b

Browse files
Refactor package dependency management and environment setup
1 parent 938ddda commit 3172b5b

File tree

6 files changed

+92
-112
lines changed

6 files changed

+92
-112
lines changed

apps/cli/src/helpers/auth-setup.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,10 @@ export async function setupAuth(
2727
}
2828
addPackageDependency({
2929
dependencies: ["better-auth"],
30-
devDependencies: false,
3130
projectDir: serverDir,
3231
});
3332
addPackageDependency({
3433
dependencies: ["better-auth"],
35-
devDependencies: false,
3634
projectDir: clientDir,
3735
});
3836
} catch (error) {

apps/cli/src/helpers/create-project.ts

Lines changed: 56 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -62,64 +62,7 @@ export async function createProject(options: ProjectConfig): Promise<string> {
6262
await setupAddons(projectDir, options.addons);
6363
}
6464

65-
const rootPackageJsonPath = path.join(projectDir, "package.json");
66-
if (await fs.pathExists(rootPackageJsonPath)) {
67-
const packageJson = await fs.readJson(rootPackageJsonPath);
68-
packageJson.name = options.projectName;
69-
70-
if (options.packageManager !== "bun") {
71-
packageJson.packageManager =
72-
options.packageManager === "npm"
73-
? "npm@10.9.2"
74-
: options.packageManager === "pnpm"
75-
? "pnpm@10.6.4"
76-
: options.packageManager === "yarn"
77-
? "yarn@4.1.0"
78-
: "bun@1.2.5";
79-
}
80-
81-
await fs.writeJson(rootPackageJsonPath, packageJson, { spaces: 2 });
82-
}
83-
84-
const serverPackageJsonPath = path.join(
85-
projectDir,
86-
"packages/server/package.json",
87-
);
88-
if (await fs.pathExists(serverPackageJsonPath)) {
89-
const serverPackageJson = await fs.readJson(serverPackageJsonPath);
90-
91-
if (options.database !== "none") {
92-
if (options.database === "sqlite") {
93-
serverPackageJson.scripts["db:local"] =
94-
"turso dev --db-file local.db";
95-
}
96-
97-
if (options.auth) {
98-
serverPackageJson.scripts["auth:generate"] =
99-
"npx @better-auth/cli generate --output ./src/db/auth-schema.ts";
100-
101-
if (options.orm === "prisma") {
102-
serverPackageJson.scripts["db:push"] = "prisma db push";
103-
serverPackageJson.scripts["db:studio"] = "prisma studio";
104-
} else if (options.orm === "drizzle") {
105-
serverPackageJson.scripts["db:push"] = "drizzle-kit push";
106-
serverPackageJson.scripts["db:studio"] = "drizzle-kit studio";
107-
}
108-
} else {
109-
if (options.orm === "prisma") {
110-
serverPackageJson.scripts["db:push"] = "prisma db push";
111-
serverPackageJson.scripts["db:studio"] = "prisma studio";
112-
} else if (options.orm === "drizzle") {
113-
serverPackageJson.scripts["db:push"] = "drizzle-kit push";
114-
serverPackageJson.scripts["db:studio"] = "drizzle-kit studio";
115-
}
116-
}
117-
}
118-
119-
await fs.writeJson(serverPackageJsonPath, serverPackageJson, {
120-
spaces: 2,
121-
});
122-
}
65+
await updatePackageConfigurations(projectDir, options);
12366

12467
await createReadme(projectDir, options);
12568

@@ -142,6 +85,61 @@ export async function createProject(options: ProjectConfig): Promise<string> {
14285
}
14386
}
14487

88+
async function updatePackageConfigurations(
89+
projectDir: string,
90+
options: ProjectConfig,
91+
) {
92+
const rootPackageJsonPath = path.join(projectDir, "package.json");
93+
if (await fs.pathExists(rootPackageJsonPath)) {
94+
const packageJson = await fs.readJson(rootPackageJsonPath);
95+
packageJson.name = options.projectName;
96+
97+
if (options.packageManager !== "bun") {
98+
packageJson.packageManager =
99+
options.packageManager === "npm"
100+
? "npm@10.9.2"
101+
: options.packageManager === "pnpm"
102+
? "pnpm@10.6.4"
103+
: options.packageManager === "yarn"
104+
? "yarn@4.1.0"
105+
: "bun@1.2.5";
106+
}
107+
108+
await fs.writeJson(rootPackageJsonPath, packageJson, { spaces: 2 });
109+
}
110+
111+
const serverPackageJsonPath = path.join(
112+
projectDir,
113+
"packages/server/package.json",
114+
);
115+
if (await fs.pathExists(serverPackageJsonPath)) {
116+
const serverPackageJson = await fs.readJson(serverPackageJsonPath);
117+
118+
if (options.database !== "none") {
119+
if (options.database === "sqlite") {
120+
serverPackageJson.scripts["db:local"] = "turso dev --db-file local.db";
121+
}
122+
123+
if (options.auth) {
124+
serverPackageJson.scripts["auth:generate"] =
125+
"npx @better-auth/cli generate --output ./src/db/auth-schema.ts";
126+
}
127+
128+
if (options.orm === "prisma") {
129+
serverPackageJson.scripts["db:push"] = "prisma db push";
130+
serverPackageJson.scripts["db:studio"] = "prisma studio";
131+
} else if (options.orm === "drizzle") {
132+
serverPackageJson.scripts["db:push"] = "drizzle-kit push";
133+
serverPackageJson.scripts["db:studio"] = "drizzle-kit studio";
134+
}
135+
}
136+
137+
await fs.writeJson(serverPackageJsonPath, serverPackageJson, {
138+
spaces: 2,
139+
});
140+
}
141+
}
142+
145143
function getOrmTemplateDir(orm: ProjectOrm, database: ProjectDatabase): string {
146144
if (orm === "drizzle") {
147145
return database === "sqlite"

apps/cli/src/helpers/create-readme.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ ${generateScriptsList(packageManagerRunCmd, database, orm, auth)}
6969
}
7070

7171
function generateFeaturesList(
72-
database: string,
72+
database: ProjectDatabase,
7373
auth: boolean,
7474
features: string[],
75-
orm: string,
75+
orm: ProjectOrm,
7676
): string {
7777
const featuresList = [
7878
"- **TypeScript** - For type safety and improved developer experience",

apps/cli/src/helpers/db-setup.ts

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import path from "node:path";
22
import { log, spinner } from "@clack/prompts";
33
import fs from "fs-extra";
44
import pc from "picocolors";
5+
import type { ProjectDatabase, ProjectOrm } from "../types";
56
import { addPackageDependency } from "../utils/add-package-deps";
67
import { setupTurso } from "./turso-setup";
78

89
export async function setupDatabase(
910
projectDir: string,
10-
databaseType: string,
11-
orm: string,
11+
databaseType: ProjectDatabase,
12+
orm: ProjectOrm,
1213
setupTursoDb = true,
1314
): Promise<void> {
1415
const s = spinner();
@@ -23,49 +24,32 @@ export async function setupDatabase(
2324
if (databaseType === "sqlite") {
2425
if (orm === "drizzle") {
2526
addPackageDependency({
26-
dependencies: ["drizzle-orm", "drizzle-kit", "@libsql/client"],
27-
devDependencies: false,
27+
dependencies: ["drizzle-orm", "@libsql/client"],
28+
devDependencies: ["drizzle-kit"],
2829
projectDir: serverDir,
2930
});
30-
if (setupTursoDb) {
31-
await setupTurso(projectDir, true);
32-
}
3331
} else if (orm === "prisma") {
3432
addPackageDependency({
3533
dependencies: ["@prisma/client"],
36-
devDependencies: false,
34+
devDependencies: ["prisma"],
3735
projectDir: serverDir,
3836
});
39-
addPackageDependency({
40-
dependencies: ["prisma"],
41-
devDependencies: true,
42-
projectDir: serverDir,
43-
});
44-
if (setupTursoDb) {
45-
await setupTurso(projectDir, true);
46-
}
37+
}
38+
39+
if (setupTursoDb) {
40+
await setupTurso(projectDir, true);
4741
}
4842
} else if (databaseType === "postgres") {
4943
if (orm === "drizzle") {
5044
addPackageDependency({
5145
dependencies: ["drizzle-orm", "postgres"],
52-
devDependencies: false,
53-
projectDir: serverDir,
54-
});
55-
addPackageDependency({
56-
dependencies: ["drizzle-kit"],
57-
devDependencies: true,
46+
devDependencies: ["drizzle-kit"],
5847
projectDir: serverDir,
5948
});
6049
} else if (orm === "prisma") {
6150
addPackageDependency({
6251
dependencies: ["@prisma/client"],
63-
devDependencies: false,
64-
projectDir: serverDir,
65-
});
66-
addPackageDependency({
67-
dependencies: ["prisma"],
68-
devDependencies: true,
52+
devDependencies: ["prisma"],
6953
projectDir: serverDir,
7054
});
7155
}

apps/cli/src/helpers/env-setup.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ export async function setupEnvironmentVariables(
2929
if (!envContent.includes("CORS_ORIGIN")) {
3030
envContent += "\nCORS_ORIGIN=http://localhost:3001";
3131
}
32+
33+
const clientEnvPath = path.join(clientDir, ".env");
34+
if (!(await fs.pathExists(clientEnvPath))) {
35+
const clientEnvContent = "VITE_SERVER_URL=http://localhost:3000\n";
36+
await fs.writeFile(clientEnvPath, clientEnvContent);
37+
}
3238
}
3339

3440
if (options.database !== "none") {
@@ -40,22 +46,12 @@ export async function setupEnvironmentVariables(
4046
envContent += databaseUrlLine;
4147
}
4248

43-
if (options.database === "sqlite") {
49+
if (options.database === "sqlite" && !options.turso) {
4450
if (!envContent.includes("TURSO_CONNECTION_URL")) {
45-
if (!options.turso) {
46-
envContent += "\nTURSO_CONNECTION_URL=http://127.0.0.1:8080";
47-
}
51+
envContent += "\nTURSO_CONNECTION_URL=http://127.0.0.1:8080";
4852
}
4953
}
5054
}
5155

5256
await fs.writeFile(envPath, envContent.trim());
53-
54-
if (options.auth) {
55-
const clientEnvPath = path.join(clientDir, ".env");
56-
if (!(await fs.pathExists(clientEnvPath))) {
57-
const clientEnvContent = "VITE_SERVER_URL=http://localhost:3000\n";
58-
await fs.writeFile(clientEnvPath, clientEnvContent);
59-
}
60-
}
6157
}

apps/cli/src/utils/add-package-deps.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,29 @@ import fs from "fs-extra";
44
import { type AvailableDependencies, dependencyVersionMap } from "../constants";
55

66
export const addPackageDependency = (opts: {
7-
dependencies: AvailableDependencies[];
8-
devDependencies: boolean;
7+
dependencies?: AvailableDependencies[];
8+
devDependencies?: AvailableDependencies[];
99
projectDir: string;
1010
}) => {
11-
const { dependencies, devDependencies, projectDir } = opts;
11+
const { dependencies = [], devDependencies = [], projectDir } = opts;
1212

13-
const pkgJson = fs.readJSONSync(path.join(projectDir, "package.json"));
13+
const pkgJsonPath = path.join(projectDir, "package.json");
14+
const pkgJson = fs.readJSONSync(pkgJsonPath);
15+
16+
if (!pkgJson.dependencies) pkgJson.dependencies = {};
17+
if (!pkgJson.devDependencies) pkgJson.devDependencies = {};
1418

1519
for (const pkgName of dependencies) {
1620
const version = dependencyVersionMap[pkgName];
21+
pkgJson.dependencies[pkgName] = version;
22+
}
1723

18-
if (devDependencies && pkgJson.devDependencies) {
19-
pkgJson.devDependencies[pkgName] = version;
20-
} else if (pkgJson.dependencies) {
21-
pkgJson.dependencies[pkgName] = version;
22-
}
24+
for (const pkgName of devDependencies) {
25+
const version = dependencyVersionMap[pkgName];
26+
pkgJson.devDependencies[pkgName] = version;
2327
}
2428

25-
fs.writeJSONSync(path.join(projectDir, "package.json"), pkgJson, {
29+
fs.writeJSONSync(pkgJsonPath, pkgJson, {
2630
spaces: 2,
2731
});
2832
};

0 commit comments

Comments
 (0)