@kozojs/cli 0.1.11 → 0.1.12
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.
- package/lib/index.js +76 -13
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -39,7 +39,7 @@ async function scaffoldProject(options) {
|
|
|
39
39
|
const projectDir = import_node_path.default.resolve(process.cwd(), projectName);
|
|
40
40
|
const kozoCoreDep = packageSource === "local" ? "workspace:*" : "^0.2.0";
|
|
41
41
|
if (frontend !== "none") {
|
|
42
|
-
await scaffoldFullstackProject(projectDir, projectName, kozoCoreDep, runtime, database, frontend, extras, template);
|
|
42
|
+
await scaffoldFullstackProject(projectDir, projectName, kozoCoreDep, runtime, database, dbPort, auth, frontend, extras, template);
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
if (template === "complete") {
|
|
@@ -1297,9 +1297,11 @@ jobs:
|
|
|
1297
1297
|
`;
|
|
1298
1298
|
await import_fs_extra.default.writeFile(import_node_path.default.join(projectDir, ".github", "workflows", "ci.yml"), workflow);
|
|
1299
1299
|
}
|
|
1300
|
-
async function scaffoldFullstackProject(projectDir, projectName, kozoCoreDep, runtime, database, frontend, extras, template) {
|
|
1300
|
+
async function scaffoldFullstackProject(projectDir, projectName, kozoCoreDep, runtime, database, dbPort, auth, frontend, extras, template) {
|
|
1301
|
+
const hasDb = database !== "none";
|
|
1301
1302
|
await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, "apps", "api", "src", "routes"));
|
|
1302
|
-
await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, "apps", "api", "src", "data"));
|
|
1303
|
+
if (!hasDb) await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, "apps", "api", "src", "data"));
|
|
1304
|
+
if (hasDb) await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, "apps", "api", "src", "db"));
|
|
1303
1305
|
await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, "apps", "web", "src", "lib"));
|
|
1304
1306
|
await import_fs_extra.default.ensureDir(import_node_path.default.join(projectDir, ".vscode"));
|
|
1305
1307
|
const rootPackageJson = {
|
|
@@ -1315,32 +1317,81 @@ async function scaffoldFullstackProject(projectDir, projectName, kozoCoreDep, ru
|
|
|
1315
1317
|
- 'apps/*'
|
|
1316
1318
|
`);
|
|
1317
1319
|
await import_fs_extra.default.writeFile(import_node_path.default.join(projectDir, ".gitignore"), "node_modules/\ndist/\n.env\n*.log\n");
|
|
1318
|
-
await scaffoldFullstackApi(projectDir, projectName, kozoCoreDep, runtime);
|
|
1320
|
+
await scaffoldFullstackApi(projectDir, projectName, kozoCoreDep, runtime, database, dbPort, auth);
|
|
1319
1321
|
await scaffoldFullstackWeb(projectDir, projectName, frontend);
|
|
1320
1322
|
await scaffoldFullstackReadme(projectDir, projectName);
|
|
1321
1323
|
if (extras.includes("docker")) await createDockerfile(import_node_path.default.join(projectDir, "apps", "api"), runtime);
|
|
1322
1324
|
if (extras.includes("github-actions")) await createGitHubActions(projectDir);
|
|
1323
1325
|
}
|
|
1324
|
-
async function scaffoldFullstackApi(projectDir, projectName, kozoCoreDep, runtime) {
|
|
1326
|
+
async function scaffoldFullstackApi(projectDir, projectName, kozoCoreDep, runtime, database = "none", dbPort, auth = true) {
|
|
1325
1327
|
const apiDir = import_node_path.default.join(projectDir, "apps", "api");
|
|
1328
|
+
const hasDb = database !== "none";
|
|
1329
|
+
if (hasDb) {
|
|
1330
|
+
await import_fs_extra.default.ensureDir(import_node_path.default.join(apiDir, "src", "db"));
|
|
1331
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "src", "db", "schema.ts"), getDatabaseSchema(database));
|
|
1332
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "src", "db", "index.ts"), getDatabaseIndex(database));
|
|
1333
|
+
if (database === "sqlite") {
|
|
1334
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "src", "db", "seed.ts"), getSQLiteSeed());
|
|
1335
|
+
}
|
|
1336
|
+
const dialect = database === "postgresql" ? "postgresql" : database === "mysql" ? "mysql" : "sqlite";
|
|
1337
|
+
const pgPort = dbPort ?? 5436;
|
|
1338
|
+
const dbUrl = database === "postgresql" ? `postgresql://postgres:postgres@localhost:${pgPort}/${projectName}` : database === "mysql" ? `mysql://root:root@localhost:3306/${projectName}` : void 0;
|
|
1339
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "drizzle.config.ts"), `import { defineConfig } from 'drizzle-kit';
|
|
1340
|
+
import 'dotenv/config';
|
|
1341
|
+
|
|
1342
|
+
export default defineConfig({
|
|
1343
|
+
schema: './src/db/schema.ts',
|
|
1344
|
+
out: './drizzle',
|
|
1345
|
+
dialect: '${dialect}',
|
|
1346
|
+
dbCredentials: {
|
|
1347
|
+
${database === "sqlite" ? "url: './data.db'" : "url: process.env.DATABASE_URL!"}
|
|
1348
|
+
},
|
|
1349
|
+
});
|
|
1350
|
+
`);
|
|
1351
|
+
const envContent = `PORT=3000
|
|
1352
|
+
NODE_ENV=development
|
|
1353
|
+
${dbUrl ? `DATABASE_URL=${dbUrl}
|
|
1354
|
+
` : ""}${auth ? "JWT_SECRET=change-me-to-a-random-secret-at-least-32-chars\n" : ""}`;
|
|
1355
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, ".env"), envContent);
|
|
1356
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, ".env.example"), envContent);
|
|
1357
|
+
} else {
|
|
1358
|
+
const envContent = `PORT=3000
|
|
1359
|
+
NODE_ENV=development
|
|
1360
|
+
${auth ? "JWT_SECRET=change-me-to-a-random-secret-at-least-32-chars\n" : ""}`;
|
|
1361
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, ".env"), envContent);
|
|
1362
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, ".env.example"), envContent);
|
|
1363
|
+
}
|
|
1326
1364
|
const apiPackageJson = {
|
|
1327
1365
|
name: `@${projectName}/api`,
|
|
1328
1366
|
version: "1.0.0",
|
|
1329
1367
|
type: "module",
|
|
1330
1368
|
scripts: {
|
|
1331
1369
|
dev: runtime === "bun" ? "bun --watch src/index.ts" : "tsx watch src/index.ts",
|
|
1332
|
-
build: "tsc"
|
|
1370
|
+
build: "tsc",
|
|
1371
|
+
...hasDb && {
|
|
1372
|
+
"db:generate": "drizzle-kit generate",
|
|
1373
|
+
"db:push": "drizzle-kit push",
|
|
1374
|
+
"db:studio": "drizzle-kit studio"
|
|
1375
|
+
}
|
|
1333
1376
|
},
|
|
1334
1377
|
dependencies: {
|
|
1335
1378
|
"@kozojs/core": kozoCoreDep,
|
|
1379
|
+
...auth && { "@kozojs/auth": kozoCoreDep },
|
|
1336
1380
|
hono: "^4.6.0",
|
|
1337
1381
|
zod: "^3.23.0",
|
|
1338
|
-
|
|
1382
|
+
dotenv: "^16.4.0",
|
|
1383
|
+
...runtime === "node" && { "@hono/node-server": "^1.13.0" },
|
|
1384
|
+
...hasDb && { "drizzle-orm": "^0.36.0" },
|
|
1385
|
+
...database === "postgresql" && { postgres: "^3.4.0" },
|
|
1386
|
+
...database === "mysql" && { mysql2: "^3.11.0" },
|
|
1387
|
+
...database === "sqlite" && { "better-sqlite3": "^11.0.0" }
|
|
1339
1388
|
},
|
|
1340
1389
|
devDependencies: {
|
|
1341
1390
|
"@types/node": "^22.0.0",
|
|
1342
1391
|
...runtime !== "bun" && { tsx: "^4.19.0" },
|
|
1343
|
-
typescript: "^5.6.0"
|
|
1392
|
+
typescript: "^5.6.0",
|
|
1393
|
+
...hasDb && { "drizzle-kit": "^0.28.0" },
|
|
1394
|
+
...database === "sqlite" && { "@types/better-sqlite3": "^7.6.0" }
|
|
1344
1395
|
}
|
|
1345
1396
|
};
|
|
1346
1397
|
await import_fs_extra.default.writeJSON(import_node_path.default.join(apiDir, "package.json"), apiPackageJson, { spaces: 2 });
|
|
@@ -1359,11 +1410,23 @@ async function scaffoldFullstackApi(projectDir, projectName, kozoCoreDep, runtim
|
|
|
1359
1410
|
exclude: ["node_modules", "dist"]
|
|
1360
1411
|
};
|
|
1361
1412
|
await import_fs_extra.default.writeJSON(import_node_path.default.join(apiDir, "tsconfig.json"), tsconfig, { spaces: 2 });
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1413
|
+
const dbImport = hasDb ? `import { createDb } from './db/index.js';
|
|
1414
|
+
` : "";
|
|
1415
|
+
const authImport = auth ? `import { authenticateJWT } from '@kozojs/auth';
|
|
1416
|
+
` : "";
|
|
1417
|
+
const servicesSetup = hasDb ? `
|
|
1418
|
+
const db = await createDb();
|
|
1419
|
+
const services = { db };
|
|
1420
|
+
` : "\nconst services = {};\n";
|
|
1421
|
+
const authMiddleware = auth ? `
|
|
1422
|
+
app.use('*', authenticateJWT({ secret: process.env.JWT_SECRET || 'change-me' }));
|
|
1423
|
+
` : "";
|
|
1424
|
+
await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "src", "index.ts"), `import 'dotenv/config';
|
|
1425
|
+
import { createKozo } from '@kozojs/core';
|
|
1426
|
+
${dbImport}${authImport}import { registerRoutes } from './routes/index.js';
|
|
1427
|
+
${servicesSetup}
|
|
1428
|
+
const app = createKozo({ port: 3000, services });
|
|
1429
|
+
${authMiddleware}
|
|
1367
1430
|
registerRoutes(app);
|
|
1368
1431
|
|
|
1369
1432
|
export type AppType = typeof app;
|