lapeh 2.6.17 → 3.0.2

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 (67) hide show
  1. package/.env.example +1 -6
  2. package/README.md +19 -85
  3. package/bin/index.js +84 -180
  4. package/dist/lib/bootstrap.d.ts.map +1 -1
  5. package/dist/lib/bootstrap.js +17 -16
  6. package/dist/lib/core/store.d.ts +55 -0
  7. package/dist/lib/core/store.d.ts.map +1 -0
  8. package/dist/lib/core/store.js +66 -0
  9. package/dist/lib/middleware/error.d.ts.map +1 -1
  10. package/dist/lib/middleware/error.js +1 -20
  11. package/dist/lib/utils/validator.d.ts.map +1 -1
  12. package/dist/lib/utils/validator.js +3 -32
  13. package/dist/src/modules/Auth/auth.controller.d.ts.map +1 -1
  14. package/dist/src/modules/Auth/auth.controller.js +118 -105
  15. package/dist/src/modules/Rbac/rbac.controller.d.ts.map +1 -1
  16. package/dist/src/modules/Rbac/rbac.controller.js +141 -140
  17. package/dist/src/routes/index.d.ts.map +1 -1
  18. package/dist/src/routes/index.js +0 -5
  19. package/doc/en/CHEATSHEET.md +3 -7
  20. package/doc/en/CLI.md +16 -41
  21. package/doc/en/DEPLOYMENT.md +171 -245
  22. package/doc/en/GETTING_STARTED.md +1 -25
  23. package/doc/en/PACKAGES.md +2 -3
  24. package/doc/en/STRUCTURE.md +1 -11
  25. package/doc/en/TUTORIAL.md +61 -119
  26. package/doc/id/CHANGELOG.md +16 -0
  27. package/doc/id/CHEATSHEET.md +0 -4
  28. package/doc/id/CLI.md +19 -54
  29. package/doc/id/DEPLOYMENT.md +171 -245
  30. package/doc/id/GETTING_STARTED.md +91 -115
  31. package/doc/id/PACKAGES.md +0 -1
  32. package/doc/id/STRUCTURE.md +1 -11
  33. package/doc/id/TUTORIAL.md +51 -109
  34. package/gitignore.template +0 -10
  35. package/lib/bootstrap.ts +39 -38
  36. package/lib/core/store.ts +116 -0
  37. package/lib/middleware/error.ts +1 -21
  38. package/lib/utils/validator.ts +3 -39
  39. package/package.json +4 -18
  40. package/scripts/init-project.js +2 -108
  41. package/scripts/make-module.js +1 -12
  42. package/scripts/seed-json.js +158 -0
  43. package/src/modules/Auth/auth.controller.ts +156 -106
  44. package/src/modules/Rbac/rbac.controller.ts +193 -138
  45. package/src/routes/index.ts +0 -3
  46. package/src/routes/rbac.ts +42 -42
  47. package/storage/logs/.0337f5062fe676994d1dc340156e089444e3d6e0-audit.json +5 -10
  48. package/storage/logs/lapeh-2025-12-30.log +1093 -0
  49. package/tsconfig.build.json +1 -3
  50. package/tsconfig.json +0 -1
  51. package/lib/core/database.ts +0 -5
  52. package/prisma/base.prisma.template +0 -8
  53. package/prisma/migrations/20251225163737_init/migration.sql +0 -236
  54. package/prisma/migrations/20251226000329_create_pets_table/migration.sql +0 -11
  55. package/prisma/migrations/20251226001249_create_pets_table/migration.sql +0 -82
  56. package/prisma/migrations/20251226001717_restore_core_models/migration.sql +0 -236
  57. package/prisma/migrations/migration_lock.toml +0 -3
  58. package/prisma/schema.prisma +0 -197
  59. package/prisma/seed.ts +0 -411
  60. package/scripts/compile-schema.js +0 -64
  61. package/src/modules/Auth/auth.prisma +0 -106
  62. package/src/modules/Pets/pets.controller.ts +0 -238
  63. package/src/modules/Pets/pets.prisma +0 -9
  64. package/src/modules/Rbac/rbac.prisma +0 -68
  65. package/src/routes/pets.ts +0 -13
  66. package/storage/logs/lapeh-2025-12-26.log +0 -88
  67. package/storage/logs/lapeh-2025-12-27.log +0 -217
@@ -14,7 +14,7 @@ exports.assignPermissionToRole = assignPermissionToRole;
14
14
  exports.removePermissionFromRole = removePermissionFromRole;
15
15
  exports.assignPermissionToUser = assignPermissionToUser;
16
16
  exports.removePermissionFromUser = removePermissionFromUser;
17
- const database_1 = require("../../../lib/core/database");
17
+ const store_1 = require("../../../lib/core/store");
18
18
  const response_1 = require("../../../lib/utils/response");
19
19
  const validator_1 = require("../../../lib/utils/validator");
20
20
  const zod_1 = require("zod");
@@ -59,16 +59,21 @@ async function createRole(req, res) {
59
59
  return;
60
60
  }
61
61
  const { name, slug, description } = await validator.validated();
62
- // Manual unique check removed as it is handled by validator
63
- const role = await database_1.prisma.roles.create({
64
- data: {
65
- name,
66
- slug,
67
- description: description || null,
68
- created_at: new Date(),
69
- updated_at: new Date(),
70
- },
71
- });
62
+ // Manual unique check
63
+ if (store_1.roles.find((r) => r.slug === slug)) {
64
+ (0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
65
+ return;
66
+ }
67
+ const role = {
68
+ id: (0, store_1.generateId)(),
69
+ name,
70
+ slug,
71
+ description: description || null,
72
+ created_at: new Date(),
73
+ updated_at: new Date(),
74
+ };
75
+ store_1.roles.push(role);
76
+ (0, store_1.saveStore)();
72
77
  (0, response_1.sendFastSuccess)(res, 201, roleSerializer, {
73
78
  status: "success",
74
79
  message: "Role created",
@@ -76,10 +81,7 @@ async function createRole(req, res) {
76
81
  });
77
82
  }
78
83
  async function listRoles(_req, res) {
79
- const roles = await database_1.prisma.roles.findMany({
80
- orderBy: { id: "asc" },
81
- });
82
- const serialized = roles.map((r) => ({ ...r, id: r.id.toString() }));
84
+ const serialized = store_1.roles.map((r) => ({ ...r, id: r.id.toString() }));
83
85
  (0, response_1.sendFastSuccess)(res, 200, roleListSerializer, {
84
86
  status: "success",
85
87
  message: "Roles list",
@@ -99,21 +101,27 @@ async function updateRole(req, res) {
99
101
  return;
100
102
  }
101
103
  const { name, slug, description } = await validator.validated();
102
- const role = await database_1.prisma.roles.findUnique({ where: { id: roleId } });
103
- if (!role) {
104
+ const roleIndex = store_1.roles.findIndex((r) => r.id === roleId);
105
+ if (roleIndex === -1) {
104
106
  (0, response_1.sendError)(res, 404, "Role not found");
105
107
  return;
106
108
  }
107
- // Manual unique check removed as it is handled by validator
108
- const updated = await database_1.prisma.roles.update({
109
- where: { id: roleId },
110
- data: {
111
- name: name ?? role.name,
112
- slug: slug ?? role.slug,
113
- description: description ?? role.description,
114
- updated_at: new Date(),
115
- },
116
- });
109
+ // Manual unique check for update
110
+ if (slug &&
111
+ slug !== store_1.roles[roleIndex].slug &&
112
+ store_1.roles.find((r) => r.slug === slug)) {
113
+ (0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
114
+ return;
115
+ }
116
+ store_1.roles[roleIndex] = {
117
+ ...store_1.roles[roleIndex],
118
+ name: name ?? store_1.roles[roleIndex].name,
119
+ slug: slug ?? store_1.roles[roleIndex].slug,
120
+ description: description ?? store_1.roles[roleIndex].description,
121
+ updated_at: new Date(),
122
+ };
123
+ (0, store_1.saveStore)();
124
+ const updated = store_1.roles[roleIndex];
117
125
  (0, response_1.sendFastSuccess)(res, 200, roleSerializer, {
118
126
  status: "success",
119
127
  message: "Role updated",
@@ -123,14 +131,25 @@ async function updateRole(req, res) {
123
131
  async function deleteRole(req, res) {
124
132
  const { id } = req.params;
125
133
  const roleId = id;
126
- const role = await database_1.prisma.roles.findUnique({ where: { id: roleId } });
127
- if (!role) {
134
+ const roleIndex = store_1.roles.findIndex((r) => r.id === roleId);
135
+ if (roleIndex === -1) {
128
136
  (0, response_1.sendError)(res, 404, "Role not found");
129
137
  return;
130
138
  }
131
- await database_1.prisma.role_permissions.deleteMany({ where: { role_id: roleId } });
132
- await database_1.prisma.user_roles.deleteMany({ where: { role_id: roleId } });
133
- await database_1.prisma.roles.delete({ where: { id: roleId } });
139
+ // Clean up relationships
140
+ // Remove from role_permissions
141
+ for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
142
+ if (store_1.role_permissions[i].role_id === roleId) {
143
+ store_1.role_permissions.splice(i, 1);
144
+ }
145
+ }
146
+ // Remove from user_roles
147
+ for (let i = store_1.user_roles.length - 1; i >= 0; i--) {
148
+ if (store_1.user_roles[i].role_id === roleId) {
149
+ store_1.user_roles.splice(i, 1);
150
+ }
151
+ }
152
+ store_1.roles.splice(roleIndex, 1);
134
153
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
135
154
  status: "success",
136
155
  message: "Role deleted",
@@ -148,16 +167,21 @@ async function createPermission(req, res) {
148
167
  return;
149
168
  }
150
169
  const { name, slug, description } = await validator.validated();
151
- // Manual unique check removed as it is handled by validator
152
- const permission = await database_1.prisma.permissions.create({
153
- data: {
154
- name,
155
- slug,
156
- description: description || null,
157
- created_at: new Date(),
158
- updated_at: new Date(),
159
- },
160
- });
170
+ // Manual unique check
171
+ if (store_1.permissions.find((p) => p.slug === slug)) {
172
+ (0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
173
+ return;
174
+ }
175
+ const permission = {
176
+ id: (0, store_1.generateId)(),
177
+ name,
178
+ slug,
179
+ description: description || null,
180
+ created_at: new Date(),
181
+ updated_at: new Date(),
182
+ };
183
+ store_1.permissions.push(permission);
184
+ (0, store_1.saveStore)();
161
185
  (0, response_1.sendFastSuccess)(res, 201, permissionSerializer, {
162
186
  status: "success",
163
187
  message: "Permission created",
@@ -165,10 +189,7 @@ async function createPermission(req, res) {
165
189
  });
166
190
  }
167
191
  async function listPermissions(_req, res) {
168
- const permissions = await database_1.prisma.permissions.findMany({
169
- orderBy: { id: "asc" },
170
- });
171
- const serialized = permissions.map((p) => ({
192
+ const serialized = store_1.permissions.map((p) => ({
172
193
  ...p,
173
194
  id: p.id.toString(),
174
195
  }));
@@ -191,23 +212,26 @@ async function updatePermission(req, res) {
191
212
  return;
192
213
  }
193
214
  const { name, slug, description } = await validator.validated();
194
- const permission = await database_1.prisma.permissions.findUnique({
195
- where: { id: permissionId },
196
- });
197
- if (!permission) {
215
+ const permIndex = store_1.permissions.findIndex((p) => p.id === permissionId);
216
+ if (permIndex === -1) {
198
217
  (0, response_1.sendError)(res, 404, "Permission not found");
199
218
  return;
200
219
  }
201
- // Manual unique check removed as it is handled by validator
202
- const updated = await database_1.prisma.permissions.update({
203
- where: { id: permissionId },
204
- data: {
205
- name: name ?? permission.name,
206
- slug: slug ?? permission.slug,
207
- description: description ?? permission.description,
208
- updated_at: new Date(),
209
- },
210
- });
220
+ if (slug &&
221
+ slug !== store_1.permissions[permIndex].slug &&
222
+ store_1.permissions.find((p) => p.slug === slug)) {
223
+ (0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
224
+ return;
225
+ }
226
+ store_1.permissions[permIndex] = {
227
+ ...store_1.permissions[permIndex],
228
+ name: name ?? store_1.permissions[permIndex].name,
229
+ slug: slug ?? store_1.permissions[permIndex].slug,
230
+ description: description ?? store_1.permissions[permIndex].description,
231
+ updated_at: new Date(),
232
+ };
233
+ (0, store_1.saveStore)();
234
+ const updated = store_1.permissions[permIndex];
211
235
  (0, response_1.sendFastSuccess)(res, 200, permissionSerializer, {
212
236
  status: "success",
213
237
  message: "Permission updated",
@@ -217,20 +241,24 @@ async function updatePermission(req, res) {
217
241
  async function deletePermission(req, res) {
218
242
  const { id } = req.params;
219
243
  const permissionId = id;
220
- const permission = await database_1.prisma.permissions.findUnique({
221
- where: { id: permissionId },
222
- });
223
- if (!permission) {
244
+ const permIndex = store_1.permissions.findIndex((p) => p.id === permissionId);
245
+ if (permIndex === -1) {
224
246
  (0, response_1.sendError)(res, 404, "Permission not found");
225
247
  return;
226
248
  }
227
- await database_1.prisma.role_permissions.deleteMany({
228
- where: { permission_id: permissionId },
229
- });
230
- await database_1.prisma.user_permissions.deleteMany({
231
- where: { permission_id: permissionId },
232
- });
233
- await database_1.prisma.permissions.delete({ where: { id: permissionId } });
249
+ // Clean up relationships
250
+ for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
251
+ if (store_1.role_permissions[i].permission_id === permissionId) {
252
+ store_1.role_permissions.splice(i, 1);
253
+ }
254
+ }
255
+ for (let i = store_1.user_permissions.length - 1; i >= 0; i--) {
256
+ if (store_1.user_permissions[i].permission_id === permissionId) {
257
+ store_1.user_permissions.splice(i, 1);
258
+ }
259
+ }
260
+ store_1.permissions.splice(permIndex, 1);
261
+ (0, store_1.saveStore)();
234
262
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
235
263
  status: "success",
236
264
  message: "Permission deleted",
@@ -247,34 +275,26 @@ async function assignRoleToUser(req, res) {
247
275
  return;
248
276
  }
249
277
  const { userId, roleId } = await validator.validated();
250
- const user = await database_1.prisma.users.findUnique({
251
- where: { id: userId },
252
- });
278
+ const user = store_1.users.find((u) => u.id === userId);
253
279
  if (!user) {
254
280
  (0, response_1.sendError)(res, 404, "User not found");
255
281
  return;
256
282
  }
257
- const role = await database_1.prisma.roles.findUnique({
258
- where: { id: roleId },
259
- });
283
+ const role = store_1.roles.find((r) => r.id === roleId);
260
284
  if (!role) {
261
285
  (0, response_1.sendError)(res, 404, "Role not found");
262
286
  return;
263
287
  }
264
- await database_1.prisma.user_roles.upsert({
265
- where: {
266
- user_id_role_id: {
267
- user_id: userId,
268
- role_id: roleId,
269
- },
270
- },
271
- create: {
288
+ const exists = store_1.user_roles.find((ur) => ur.user_id === userId && ur.role_id === roleId);
289
+ if (!exists) {
290
+ store_1.user_roles.push({
291
+ id: (0, store_1.generateId)(),
272
292
  user_id: userId,
273
293
  role_id: roleId,
274
294
  created_at: new Date(),
275
- },
276
- update: {},
277
- });
295
+ });
296
+ (0, store_1.saveStore)();
297
+ }
278
298
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
279
299
  status: "success",
280
300
  message: "Role assigned to user",
@@ -291,12 +311,11 @@ async function removeRoleFromUser(req, res) {
291
311
  return;
292
312
  }
293
313
  const { userId, roleId } = await validator.validated();
294
- await database_1.prisma.user_roles.deleteMany({
295
- where: {
296
- user_id: userId,
297
- role_id: roleId,
298
- },
299
- });
314
+ for (let i = store_1.user_roles.length - 1; i >= 0; i--) {
315
+ if (store_1.user_roles[i].user_id === userId && store_1.user_roles[i].role_id === roleId) {
316
+ store_1.user_roles.splice(i, 1);
317
+ }
318
+ }
300
319
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
301
320
  status: "success",
302
321
  message: "Role removed from user",
@@ -313,34 +332,26 @@ async function assignPermissionToRole(req, res) {
313
332
  return;
314
333
  }
315
334
  const { roleId, permissionId } = await validator.validated();
316
- const role = await database_1.prisma.roles.findUnique({
317
- where: { id: roleId },
318
- });
335
+ const role = store_1.roles.find((r) => r.id === roleId);
319
336
  if (!role) {
320
337
  (0, response_1.sendError)(res, 404, "Role not found");
321
338
  return;
322
339
  }
323
- const permission = await database_1.prisma.permissions.findUnique({
324
- where: { id: permissionId },
325
- });
340
+ const permission = store_1.permissions.find((p) => p.id === permissionId);
326
341
  if (!permission) {
327
342
  (0, response_1.sendError)(res, 404, "Permission not found");
328
343
  return;
329
344
  }
330
- await database_1.prisma.role_permissions.upsert({
331
- where: {
332
- role_id_permission_id: {
333
- role_id: roleId,
334
- permission_id: permissionId,
335
- },
336
- },
337
- create: {
345
+ const exists = store_1.role_permissions.find((rp) => rp.role_id === roleId && rp.permission_id === permissionId);
346
+ if (!exists) {
347
+ store_1.role_permissions.push({
348
+ id: (0, store_1.generateId)(),
338
349
  role_id: roleId,
339
350
  permission_id: permissionId,
340
351
  created_at: new Date(),
341
- },
342
- update: {},
343
- });
352
+ });
353
+ (0, store_1.saveStore)();
354
+ }
344
355
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
345
356
  status: "success",
346
357
  message: "Permission assigned to role",
@@ -357,12 +368,12 @@ async function removePermissionFromRole(req, res) {
357
368
  return;
358
369
  }
359
370
  const { roleId, permissionId } = await validator.validated();
360
- await database_1.prisma.role_permissions.deleteMany({
361
- where: {
362
- role_id: roleId,
363
- permission_id: permissionId,
364
- },
365
- });
371
+ for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
372
+ if (store_1.role_permissions[i].role_id === roleId &&
373
+ store_1.role_permissions[i].permission_id === permissionId) {
374
+ store_1.role_permissions.splice(i, 1);
375
+ }
376
+ }
366
377
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
367
378
  status: "success",
368
379
  message: "Permission removed from role",
@@ -379,34 +390,25 @@ async function assignPermissionToUser(req, res) {
379
390
  return;
380
391
  }
381
392
  const { userId, permissionId } = await validator.validated();
382
- const user = await database_1.prisma.users.findUnique({
383
- where: { id: userId },
384
- });
393
+ const user = store_1.users.find((u) => u.id === userId);
385
394
  if (!user) {
386
395
  (0, response_1.sendError)(res, 404, "User not found");
387
396
  return;
388
397
  }
389
- const permission = await database_1.prisma.permissions.findUnique({
390
- where: { id: permissionId },
391
- });
398
+ const permission = store_1.permissions.find((p) => p.id === permissionId);
392
399
  if (!permission) {
393
400
  (0, response_1.sendError)(res, 404, "Permission not found");
394
401
  return;
395
402
  }
396
- await database_1.prisma.user_permissions.upsert({
397
- where: {
398
- user_id_permission_id: {
399
- user_id: userId,
400
- permission_id: permissionId,
401
- },
402
- },
403
- create: {
403
+ const exists = store_1.user_permissions.find((up) => up.user_id === userId && up.permission_id === permissionId);
404
+ if (!exists) {
405
+ store_1.user_permissions.push({
406
+ id: (0, store_1.generateId)(),
404
407
  user_id: userId,
405
408
  permission_id: permissionId,
406
409
  created_at: new Date(),
407
- },
408
- update: {},
409
- });
410
+ });
411
+ }
410
412
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
411
413
  status: "success",
412
414
  message: "Permission assigned to user",
@@ -423,12 +425,11 @@ async function removePermissionFromUser(req, res) {
423
425
  return;
424
426
  }
425
427
  const { userId, permissionId } = await validator.validated();
426
- await database_1.prisma.user_permissions.deleteMany({
427
- where: {
428
- user_id: userId,
429
- permission_id: permissionId,
430
- },
431
- });
428
+ const index = store_1.user_permissions.findIndex((up) => up.user_id === userId && up.permission_id === permissionId);
429
+ if (index !== -1) {
430
+ store_1.user_permissions.splice(index, 1);
431
+ (0, store_1.saveStore)();
432
+ }
432
433
  (0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
433
434
  status: "success",
434
435
  message: "Permission removed from user",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,4CAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,4CAAW,CAAC"}
@@ -1,14 +1,9 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.apiRouter = void 0;
7
4
  const express_1 = require("express");
8
5
  const auth_1 = require("../routes/auth");
9
6
  const rbac_1 = require("../routes/rbac");
10
- const pets_1 = __importDefault(require("../routes/pets"));
11
7
  exports.apiRouter = (0, express_1.Router)();
12
8
  exports.apiRouter.use("/auth", auth_1.authRouter);
13
9
  exports.apiRouter.use("/rbac", rbac_1.rbacRouter);
14
- exports.apiRouter.use("/pets", pets_1.default);
@@ -10,13 +10,9 @@ Referensi cepat untuk perintah dan kode yang sering digunakan.
10
10
  | **`npm run typecheck`** | Cek error TypeScript (tanpa compile). |
11
11
  | **`npm run lint`** | Cek kode kotor/variabel tidak terpakai. |
12
12
  | **`npm run lint:fix`** | Perbaiki kode kotor otomatis. |
13
- | **`npm run make:module <Name>`** | Buat Controller, Route, & Model sekaligus. |
14
- | **`npm run make:controller <Name>`** | Buat Controller saja. |
15
- | **`npm run make:model <Name>`** | Buat Model Prisma saja. |
16
- | **`npm run prisma:migrate`** | Apply perubahan schema ke DB lokal. |
17
- | **`npm run db:studio`** | Buka GUI Database. |
18
- | **`npm run db:seed`** | Isi data dummy. |
19
- | **`npm run db:reset`** | Hapus DB & mulai dari nol. |
13
+ | **`npm run make:module <Name>`** | Create Controller, Route, & Model. |
14
+ | **`npm run make:controller <Name>`** | Create Controller only. |
15
+ | **`npm run db:seed`** | Seed dummy data. |
20
16
 
21
17
  ## 🛡️ Validator Rules (Simple Syntax)
22
18
 
package/doc/en/CLI.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CLI Tools & Scripts
2
2
 
3
- Lapeh Framework comes with various CLI scripts to speed up the development process, ranging from code generation to database management.
3
+ Lapeh Framework comes with various CLI scripts to speed up the development process.
4
4
 
5
5
  All commands are executed using `npm run <command>`.
6
6
 
@@ -11,6 +11,7 @@ All commands are executed using `npm run <command>`.
11
11
  Main commands to run the application:
12
12
 
13
13
  ### 1. Initialize Project (`init`)
14
+
14
15
  Creates a new project from scratch.
15
16
 
16
17
  ```bash
@@ -18,11 +19,13 @@ npx lapeh@latest init <project-name> [flags]
18
19
  ```
19
20
 
20
21
  **Available Flags:**
22
+
21
23
  - `--full`: Initialize with full setup (includes dummy users, roles, permissions).
22
24
  - `--default`: Initialize with default configuration (PostgreSQL) skipping interactive prompts.
23
25
  - `--y`: Alias for `--default`.
24
26
 
25
27
  **Examples:**
28
+
26
29
  ```bash
27
30
  # Interactive Mode
28
31
  npx lapeh init my-app
@@ -35,17 +38,21 @@ npx lapeh init my-app --y
35
38
  ```
36
39
 
37
40
  ### 2. Upgrade Framework (`upgrade`)
41
+
38
42
  Upgrades the Lapeh framework to the latest version in your existing project.
39
43
 
40
44
  ```bash
41
45
  npx lapeh upgrade
42
46
  ```
47
+
43
48
  **Features:**
49
+
44
50
  - Automatically updates `package.json` dependencies.
45
51
  - Syncs core framework files while preserving your custom code.
46
52
  - **Smart Dependency Handling**: Preserves local `file:` dependencies if you are developing the framework locally, otherwise updates to the latest npm version.
47
53
 
48
54
  ### 3. Development Server (`dev`)
55
+
49
56
  Runs the server in development mode with hot-reload feature.
50
57
 
51
58
  ```bash
@@ -55,6 +62,7 @@ npx lapeh dev
55
62
  ```
56
63
 
57
64
  ### 2. Production Server (`start`)
65
+
58
66
  Runs the server in production mode (ensure it has been built).
59
67
 
60
68
  ```bash
@@ -64,6 +72,7 @@ npx lapeh start
64
72
  ```
65
73
 
66
74
  ### 3. Build Project (`build`)
75
+
67
76
  Compiles TypeScript code to JavaScript in the `dist` folder.
68
77
 
69
78
  ```bash
@@ -77,60 +86,26 @@ npx lapeh build
77
86
  Use these commands to create boilerplate files automatically.
78
87
 
79
88
  ### 1. Create Complete Module (`make:module`)
80
- Creates Controller, Route, and Model (Schema) at once.
89
+
90
+ Creates Controller and Route at once.
81
91
 
82
92
  ```bash
83
93
  npm run make:module <module-name>
84
94
  ```
95
+
85
96
  **Example:** `npm run make:module Product`
86
97
 
87
98
  Output:
99
+
88
100
  - `src/controllers/productController.ts`
89
101
  - `src/routes/product.ts`
90
- - `src/models/product.prisma`
91
102
 
92
103
  ### 2. Create Controller (`make:controller`)
104
+
93
105
  Only creates a controller file with basic CRUD methods.
94
106
 
95
107
  ```bash
96
108
  npm run make:controller <controller-name>
97
109
  ```
98
- **Example:** `npm run make:controller Order` (Will create `src/controllers/orderController.ts`)
99
-
100
- ### 3. Create Database Model (`make:model`)
101
- Only creates a new Prisma schema file.
102
-
103
- ```bash
104
- npm run make:model <model-name>
105
- ```
106
- **Example:** `npm run make:model Transaction` (Will create `src/models/transaction.prisma`)
107
-
108
- ## Database Management (Prisma)
109
-
110
- This framework uses a **Multi-File Schema** system. You don't edit `schema.prisma` directly, but instead edit small files in `src/models/*.prisma`.
111
-
112
- ### 1. Database Migration (`prisma:migrate`)
113
- Run this every time you change a model definition in `src/models/*.prisma`.
114
-
115
- ```bash
116
- npm run prisma:migrate
117
- ```
118
- This command will:
119
- 1. Merge all `.prisma` files in `src/models/` into one `prisma/schema.prisma`.
120
- 2. Create SQL migration files.
121
- 3. Apply changes to the local database.
122
- 4. Regenerate Prisma Client (Type Definitions).
123
110
 
124
- ### 2. Deploy to Production (`prisma:deploy`)
125
- Use in production server. Only applies existing migrations without resetting data.
126
-
127
- ```bash
128
- npm run prisma:deploy
129
- ```
130
-
131
- ### 3. Database Studio (`db:studio`)
132
- Opens a GUI in the browser to view and edit database data.
133
-
134
- ```bash
135
- npm run db:studio
136
- ```
111
+ **Example:** `npm run make:controller Order` (Will create `src/controllers/orderController.ts`)