@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.
Files changed (2) hide show
  1. package/lib/index.js +76 -13
  2. 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
- ...runtime === "node" && { "@hono/node-server": "^1.13.0" }
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
- await import_fs_extra.default.writeFile(import_node_path.default.join(apiDir, "src", "index.ts"), `import { createKozo } from '@kozojs/core';
1363
- import { registerRoutes } from './routes';
1364
-
1365
- const app = createKozo({ port: 3000 });
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kozojs/cli",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "CLI to scaffold new Kozo Framework projects - The next-gen TypeScript Backend Framework",
5
5
  "bin": {
6
6
  "create-kozo": "./lib/index.js",