lapeh 2.2.9 → 2.3.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 (151) hide show
  1. package/bin/index.js +43 -126
  2. package/doc/CLI.md +33 -0
  3. package/package.json +1 -1
  4. package/readme.md +22 -13
  5. package/api-testing-enambelas/.env.example +0 -19
  6. package/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +0 -73
  7. package/api-testing-enambelas/doc/CHANGELOG.md +0 -77
  8. package/api-testing-enambelas/doc/CHEATSHEET.md +0 -94
  9. package/api-testing-enambelas/doc/CLI.md +0 -106
  10. package/api-testing-enambelas/doc/CONTRIBUTING.md +0 -105
  11. package/api-testing-enambelas/doc/DEPLOYMENT.md +0 -122
  12. package/api-testing-enambelas/doc/FAQ.md +0 -81
  13. package/api-testing-enambelas/doc/FEATURES.md +0 -165
  14. package/api-testing-enambelas/doc/GETTING_STARTED.md +0 -108
  15. package/api-testing-enambelas/doc/INTRODUCTION.md +0 -60
  16. package/api-testing-enambelas/doc/PACKAGES.md +0 -66
  17. package/api-testing-enambelas/doc/PERFORMANCE.md +0 -91
  18. package/api-testing-enambelas/doc/ROADMAP.md +0 -93
  19. package/api-testing-enambelas/doc/SECURITY.md +0 -93
  20. package/api-testing-enambelas/doc/STRUCTURE.md +0 -90
  21. package/api-testing-enambelas/doc/TUTORIAL.md +0 -192
  22. package/api-testing-enambelas/docker-compose.yml +0 -24
  23. package/api-testing-enambelas/eslint.config.mjs +0 -26
  24. package/api-testing-enambelas/framework.md +0 -168
  25. package/api-testing-enambelas/nodemon.json +0 -6
  26. package/api-testing-enambelas/package-lock.json +0 -5527
  27. package/api-testing-enambelas/package.json +0 -106
  28. package/api-testing-enambelas/prisma/base.prisma.template +0 -7
  29. package/api-testing-enambelas/prisma/migrations/20251227042956_init_setup/migration.sql +0 -248
  30. package/api-testing-enambelas/prisma/migrations/migration_lock.toml +0 -3
  31. package/api-testing-enambelas/prisma/schema.prisma +0 -183
  32. package/api-testing-enambelas/prisma/seed.ts +0 -411
  33. package/api-testing-enambelas/prisma.config.ts +0 -15
  34. package/api-testing-enambelas/readme.md +0 -414
  35. package/api-testing-enambelas/scripts/check-update.js +0 -92
  36. package/api-testing-enambelas/scripts/compile-schema.js +0 -29
  37. package/api-testing-enambelas/scripts/config-clear.js +0 -45
  38. package/api-testing-enambelas/scripts/generate-jwt-secret.js +0 -38
  39. package/api-testing-enambelas/scripts/init-project.js +0 -178
  40. package/api-testing-enambelas/scripts/make-controller.js +0 -205
  41. package/api-testing-enambelas/scripts/make-model.js +0 -42
  42. package/api-testing-enambelas/scripts/make-module.js +0 -158
  43. package/api-testing-enambelas/scripts/verify-rbac-functional.js +0 -187
  44. package/api-testing-enambelas/src/controllers/authController.ts +0 -469
  45. package/api-testing-enambelas/src/controllers/petController.ts +0 -194
  46. package/api-testing-enambelas/src/controllers/rbacController.ts +0 -478
  47. package/api-testing-enambelas/src/models/core.prisma +0 -163
  48. package/api-testing-enambelas/src/models/pets.prisma +0 -9
  49. package/api-testing-enambelas/src/routes/auth.ts +0 -74
  50. package/api-testing-enambelas/src/routes/index.ts +0 -10
  51. package/api-testing-enambelas/src/routes/pets.ts +0 -13
  52. package/api-testing-enambelas/src/routes/rbac.ts +0 -42
  53. package/api-testing-enambelas/storage/logs/.gitkeep +0 -0
  54. package/api-testing-enambelas/tsconfig.json +0 -43
  55. package/api-testing-tujuhbelas/.env.example +0 -19
  56. package/api-testing-tujuhbelas/api-testing-enambelas/.env.example +0 -19
  57. package/api-testing-tujuhbelas/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +0 -73
  58. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHANGELOG.md +0 -77
  59. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHEATSHEET.md +0 -94
  60. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CLI.md +0 -106
  61. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CONTRIBUTING.md +0 -105
  62. package/api-testing-tujuhbelas/api-testing-enambelas/doc/DEPLOYMENT.md +0 -122
  63. package/api-testing-tujuhbelas/api-testing-enambelas/doc/FAQ.md +0 -81
  64. package/api-testing-tujuhbelas/api-testing-enambelas/doc/FEATURES.md +0 -165
  65. package/api-testing-tujuhbelas/api-testing-enambelas/doc/GETTING_STARTED.md +0 -108
  66. package/api-testing-tujuhbelas/api-testing-enambelas/doc/INTRODUCTION.md +0 -60
  67. package/api-testing-tujuhbelas/api-testing-enambelas/doc/PACKAGES.md +0 -66
  68. package/api-testing-tujuhbelas/api-testing-enambelas/doc/PERFORMANCE.md +0 -91
  69. package/api-testing-tujuhbelas/api-testing-enambelas/doc/ROADMAP.md +0 -93
  70. package/api-testing-tujuhbelas/api-testing-enambelas/doc/SECURITY.md +0 -93
  71. package/api-testing-tujuhbelas/api-testing-enambelas/doc/STRUCTURE.md +0 -90
  72. package/api-testing-tujuhbelas/api-testing-enambelas/doc/TUTORIAL.md +0 -192
  73. package/api-testing-tujuhbelas/api-testing-enambelas/docker-compose.yml +0 -24
  74. package/api-testing-tujuhbelas/api-testing-enambelas/eslint.config.mjs +0 -26
  75. package/api-testing-tujuhbelas/api-testing-enambelas/framework.md +0 -168
  76. package/api-testing-tujuhbelas/api-testing-enambelas/nodemon.json +0 -6
  77. package/api-testing-tujuhbelas/api-testing-enambelas/package.json +0 -106
  78. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/base.prisma.template +0 -7
  79. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/schema.prisma +0 -183
  80. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/seed.ts +0 -411
  81. package/api-testing-tujuhbelas/api-testing-enambelas/prisma.config.ts +0 -15
  82. package/api-testing-tujuhbelas/api-testing-enambelas/readme.md +0 -414
  83. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/check-update.js +0 -92
  84. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/compile-schema.js +0 -29
  85. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/config-clear.js +0 -45
  86. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/generate-jwt-secret.js +0 -38
  87. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/init-project.js +0 -178
  88. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-controller.js +0 -205
  89. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-model.js +0 -42
  90. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-module.js +0 -158
  91. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/verify-rbac-functional.js +0 -187
  92. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/authController.ts +0 -469
  93. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/petController.ts +0 -194
  94. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/rbacController.ts +0 -478
  95. package/api-testing-tujuhbelas/api-testing-enambelas/src/models/core.prisma +0 -163
  96. package/api-testing-tujuhbelas/api-testing-enambelas/src/models/pets.prisma +0 -9
  97. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/auth.ts +0 -74
  98. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/index.ts +0 -10
  99. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/pets.ts +0 -13
  100. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/rbac.ts +0 -42
  101. package/api-testing-tujuhbelas/api-testing-enambelas/storage/logs/.gitkeep +0 -0
  102. package/api-testing-tujuhbelas/api-testing-enambelas/tsconfig.json +0 -43
  103. package/api-testing-tujuhbelas/doc/ARCHITECTURE_GUIDE.md +0 -73
  104. package/api-testing-tujuhbelas/doc/CHANGELOG.md +0 -77
  105. package/api-testing-tujuhbelas/doc/CHEATSHEET.md +0 -94
  106. package/api-testing-tujuhbelas/doc/CLI.md +0 -106
  107. package/api-testing-tujuhbelas/doc/CONTRIBUTING.md +0 -105
  108. package/api-testing-tujuhbelas/doc/DEPLOYMENT.md +0 -122
  109. package/api-testing-tujuhbelas/doc/FAQ.md +0 -81
  110. package/api-testing-tujuhbelas/doc/FEATURES.md +0 -165
  111. package/api-testing-tujuhbelas/doc/GETTING_STARTED.md +0 -108
  112. package/api-testing-tujuhbelas/doc/INTRODUCTION.md +0 -60
  113. package/api-testing-tujuhbelas/doc/PACKAGES.md +0 -66
  114. package/api-testing-tujuhbelas/doc/PERFORMANCE.md +0 -91
  115. package/api-testing-tujuhbelas/doc/ROADMAP.md +0 -93
  116. package/api-testing-tujuhbelas/doc/SECURITY.md +0 -93
  117. package/api-testing-tujuhbelas/doc/STRUCTURE.md +0 -90
  118. package/api-testing-tujuhbelas/doc/TUTORIAL.md +0 -192
  119. package/api-testing-tujuhbelas/docker-compose.yml +0 -24
  120. package/api-testing-tujuhbelas/eslint.config.mjs +0 -26
  121. package/api-testing-tujuhbelas/framework.md +0 -168
  122. package/api-testing-tujuhbelas/nodemon.json +0 -6
  123. package/api-testing-tujuhbelas/package-lock.json +0 -5527
  124. package/api-testing-tujuhbelas/package.json +0 -106
  125. package/api-testing-tujuhbelas/prisma/base.prisma.template +0 -7
  126. package/api-testing-tujuhbelas/prisma/migrations/20251227043210_init_setup/migration.sql +0 -248
  127. package/api-testing-tujuhbelas/prisma/migrations/migration_lock.toml +0 -3
  128. package/api-testing-tujuhbelas/prisma/schema.prisma +0 -183
  129. package/api-testing-tujuhbelas/prisma/seed.ts +0 -411
  130. package/api-testing-tujuhbelas/prisma.config.ts +0 -15
  131. package/api-testing-tujuhbelas/readme.md +0 -414
  132. package/api-testing-tujuhbelas/scripts/check-update.js +0 -92
  133. package/api-testing-tujuhbelas/scripts/compile-schema.js +0 -29
  134. package/api-testing-tujuhbelas/scripts/config-clear.js +0 -45
  135. package/api-testing-tujuhbelas/scripts/generate-jwt-secret.js +0 -38
  136. package/api-testing-tujuhbelas/scripts/init-project.js +0 -178
  137. package/api-testing-tujuhbelas/scripts/make-controller.js +0 -205
  138. package/api-testing-tujuhbelas/scripts/make-model.js +0 -42
  139. package/api-testing-tujuhbelas/scripts/make-module.js +0 -158
  140. package/api-testing-tujuhbelas/scripts/verify-rbac-functional.js +0 -187
  141. package/api-testing-tujuhbelas/src/controllers/authController.ts +0 -469
  142. package/api-testing-tujuhbelas/src/controllers/petController.ts +0 -194
  143. package/api-testing-tujuhbelas/src/controllers/rbacController.ts +0 -478
  144. package/api-testing-tujuhbelas/src/models/core.prisma +0 -163
  145. package/api-testing-tujuhbelas/src/models/pets.prisma +0 -9
  146. package/api-testing-tujuhbelas/src/routes/auth.ts +0 -74
  147. package/api-testing-tujuhbelas/src/routes/index.ts +0 -10
  148. package/api-testing-tujuhbelas/src/routes/pets.ts +0 -13
  149. package/api-testing-tujuhbelas/src/routes/rbac.ts +0 -42
  150. package/api-testing-tujuhbelas/storage/logs/.gitkeep +0 -0
  151. package/api-testing-tujuhbelas/tsconfig.json +0 -43
package/bin/index.js CHANGED
@@ -407,12 +407,24 @@ function createProject() {
407
407
  packageJson.name = projectName;
408
408
  // Add lapeh framework version to dependencies to track it like react-router
409
409
  packageJson.dependencies = packageJson.dependencies || {};
410
- // For local development, we use file reference. For production publish, use version.
411
- packageJson.dependencies["lapeh"] = "file:../";
410
+
411
+ // Smart dependency resolution:
412
+ // If running from node_modules (installed via npm), use the version number.
413
+ // If running locally (dev mode), use the absolute file path.
414
+ const frameworkPackageJson = require(path.join(__dirname, '../package.json'));
415
+
416
+ if (__dirname.includes('node_modules')) {
417
+ packageJson.dependencies["lapeh"] = `^${frameworkPackageJson.version}`;
418
+ } else {
419
+ // Local development
420
+ const lapehPath = path.resolve(__dirname, '..').replace(/\\/g, '/');
421
+ packageJson.dependencies["lapeh"] = `file:${lapehPath}`;
422
+ }
412
423
 
413
424
  // Ensure prisma CLI is available in devDependencies for the new project
414
425
  packageJson.devDependencies = packageJson.devDependencies || {};
415
426
  packageJson.devDependencies["prisma"] = "7.2.0";
427
+ packageJson.devDependencies["dotenv"] = "^16.4.5"; // Ensure dotenv is available for seed script
416
428
 
417
429
  // Add missing types for dev
418
430
  packageJson.devDependencies["@types/express"] = "^5.0.0";
@@ -505,6 +517,16 @@ function createProject() {
505
517
  'import { prisma } from "@lapeh/core/database"'
506
518
  );
507
519
  }
520
+
521
+ // Remove default demo data (Pets) from seed.ts ONLY if NOT using --full
522
+ // We want to keep users/roles as they are essential, but remove the demo 'Pets' data
523
+ // This matches from "// 6. Seed Pets" up to the completion log message
524
+ if (!isFull) {
525
+ seedContent = seedContent.replace(
526
+ /\/\/ 6\. Seed Pets[\s\S]*?console\.log\("Finished seeding 50,000 pets\."\);/,
527
+ '// 6. Seed Pets (Skipped by default. Use --full to include demo data)'
528
+ );
529
+ }
508
530
 
509
531
  fs.writeFileSync(prismaSeedPath, seedContent);
510
532
  }
@@ -577,136 +599,31 @@ function createProject() {
577
599
 
578
600
  // Seed (Users & Roles are mandatory, Pets are demo data)
579
601
  console.log(' Seeding mandatory data (Users, Roles, Permissions)...');
580
- // Always seed mandatory data by default or check if --full is meant for demo data only?
581
- // Based on user request: "user seeder dan pets itu selalu ada karena default, jadi seharusnya tidak digenerate saat user buat project baru"
582
- // Wait, user says: "user seeder and pets are always there because default, so it SHOULD NOT be generated when user creates new project, UNLESS user starts using framework and adding new tables"
583
-
584
- // Interpretation: The user implies that `prisma generate` and `prisma migrate` (which creates the physical tables and client code)
585
- // MIGHT be redundant if the core framework already provides a pre-built client for the default models (Users, Pets).
586
- // However, Prisma doesn't work like that easily because the Client is generated into node_modules/@prisma/client.
587
-
588
- // If the user means "don't run migration/seed unless needed", we still need to run them to have a working app.
589
- // Re-reading carefully: "masalahnya user seeder dan pets itu selalu ada karane default ,jadi seharusnya tidak digenerate saat user buuat project baru , kecuali user mulai menggunakan framework ini dan menambahkan table baru untuk developmen"
590
-
591
- // AH! The user might mean: Since User/Pets are CORE models, the Prisma Client for them should ALREADY exist or be pre-packaged,
592
- // so we don't need to run `prisma generate` during project creation?
593
- // OR: The user means the *migration files* shouldn't be generated?
594
-
595
- // "seharusnya tidak digenerate saat user buuat project baru" -> The user is annoyed by the `prisma generate` and `migration` step taking time?
596
- // But we need the DB tables.
597
-
598
- // Let's assume the user wants to SKIP the `prisma generate` and `migrate` step if possible,
599
- // but that's impossible for a fresh project connecting to a fresh DB.
600
-
601
- // Alternative interpretation: The user thinks `prisma generate` is only for NEW tables.
602
- // But `prisma generate` is required to create the client library itself.
603
-
604
- // Let's look at the "Pets" part. Maybe the user considers Pets as "bloat" that shouldn't be there by default?
605
- // "user seeder dan pets itu selalu ada karane default"
606
-
607
- // Wait, maybe the user is saying: "Since these are default, why do we need to RE-generate/RE-migrate them every time? Can't we just have them ready?"
608
- // Answer: No, because every user has a different DB connection string.
609
-
610
- // Let's explain this to the user. Prisma Client is NOT a static library like `lodash`. It is generated based on the schema.
611
- // If we don't generate it, `import { prisma }` will fail because `node_modules/@prisma/client` will be empty.
612
-
613
- // However, we CAN optimize.
614
- // Maybe the user is asking: "Why do we generate migration files (`prisma/migrations`) for default tables?"
615
- // We can ship the project WITH the migration folder for the default tables already there!
616
- // If we include `prisma/migrations` in the template, `prisma migrate dev` will see they exist and just apply them,
617
- // instead of creating a NEW migration `init_setup`.
618
-
619
- // Let's try to verify if `prisma/migrations` is in the ignore list.
620
- // Line 367: `'prisma/migrations', // Exclude existing migrations`
621
- // Yes, we are explicitly excluding them!
622
-
623
- // If we INCLUDE the base migrations in the template, then we don't need to create a new migration on init.
624
- // We just run `prisma migrate deploy` (faster) or `dev` (which will see it's in sync).
625
-
626
- // Let's change the strategy:
627
- // 1. Remove `prisma/migrations` from ignore list.
628
- // 2. But wait, the user's template might have dirty migrations.
629
-
630
- // Let's assume the user wants me to explain/fix the perception.
631
- // But wait, the user says "seharusnya tidak digenerate".
632
-
633
- // Let's stick to the most robust interpretation:
634
- // The user wants to avoid the overhead of generation for default stuff.
635
- // But generation is fast (ms). Migration is slow.
636
-
637
- // If the user means the `seed` data (Pets/Users):
638
- // "user seeder dan pets itu selalu ada... jadi seharusnya tidak digenerate"
639
- // Maybe the user means: Don't SEED them by default?
640
- // "kecuali user mulai menggunakan framework ini dan menambahkan table baru"
641
-
642
- // Let's assume the user is talking about the `prisma generate` process being redundant for default models.
643
- // I need to explain that it IS required.
644
-
645
- // BUT, I can make the process cleaner.
646
- // If I look at the previous context: "postinstall" script.
647
- // The user is replying to my explanation about "postinstall".
648
-
649
- // User: "The default models (User/Pets) are always there. So they shouldn't need generation when creating a project. Generation should only happen when I add NEW tables."
650
-
651
- // This is a misunderstanding of how Prisma works.
652
- // Prisma Client is NOT installed via npm registry with the models pre-baked.
653
- // It is an empty shell that fills itself when you run `prisma generate`.
654
-
655
- // My previous explanation might have been unclear.
656
- // I should clarify: "Generate is mandatory to install the library itself".
657
-
658
- // HOWEVER, maybe I can PRE-GENERATE it?
659
- // No, because it depends on the OS/Architecture of the user's machine.
660
-
661
- // Let's try to satisfy the user's request by skipping the explicit `prisma generate` step in the CLI
662
- // IF we rely on `prisma migrate dev` to do it automatically (it does generate client under the hood).
663
- // Line 557: `execSync('npx prisma generate'...)`
664
- // Line 561: `execSync('npx prisma migrate dev'...)` -> This AUTOMATICALLY runs generate.
665
-
666
- // So line 557 is redundant! removing it speeds things up and reduces "generation" noise.
667
-
668
- // Also, about "seeder":
669
- // "seharusnya tidak digenerate saat user buuat project baru"
670
- // If the user means the SEED FILE content.
671
- // We are copying `prisma/seed.ts` from template.
672
-
673
- // Let's remove the redundant `prisma generate` call in line 557.
674
- // And I will explain to the user WHY generation is still needed (internally) but I removed the explicit step.
675
-
676
- // Wait, if I remove `prisma generate`, `node scripts/compile-schema.js` must run before migrate.
677
- // It does (Line 554).
678
-
679
- // Let's remove the explicit `prisma generate` logging and command.
680
602
 
681
603
  if (isFull) {
682
- console.log(' Seeding database...');
683
- execSync('npm run db:seed', { cwd: projectDir, stdio: 'inherit' });
604
+ try {
605
+ execSync('npm run db:seed', { cwd: projectDir, stdio: 'inherit' });
606
+ } catch (error) {
607
+ console.warn('⚠️ Database setup encountered an issue.');
608
+ console.warn(' You may need to check your .env credentials and run:');
609
+ console.warn(` cd ${projectName}`);
610
+ console.warn(' npm run prisma:migrate');
611
+ }
684
612
  } else {
685
- console.log(' ℹ️ Skipping database seeding (use --full to seed default data)...');
613
+ console.log(' ℹ️ Skipping database seeding (use --full to seed default data)...');
686
614
  }
687
615
 
688
- } catch (error) {
689
- console.warn('⚠️ Database setup encountered an issue.');
690
- console.warn(' You may need to check your .env credentials and run:');
691
- console.warn(' cd ' + projectName);
692
- console.warn(' npm run prisma:migrate');
693
- }
694
-
695
- console.log(`\n✅ Project ${projectName} created successfully!`);
696
-
697
- if (isFull) {
698
- console.log(`\n🚀 Launching development server (--full detected)...`);
699
- try {
700
- execSync('npm run dev', { cwd: projectDir, stdio: 'inherit' });
701
- } catch (error) {
702
- // Graceful exit
703
- }
704
- console.log(`\nℹ️ Server stopped.`);
705
- console.log(` To enter project folder: cd ${projectName}`);
706
- } else {
707
- console.log(`\nNext steps:`);
616
+ console.log(`\n✅ Project ${projectName} created successfully!`);
617
+ console.log('\nNext steps:');
708
618
  console.log(` cd ${projectName}`);
709
- console.log(` npm run dev`);
619
+ console.log(' npm run dev');
620
+ } catch (error) {
621
+ console.error('❌ Error setting up database:', error.message);
622
+ console.log(`\n✅ Project ${projectName} created, but database setup failed.`);
623
+ console.log(' Please check your database credentials in .env and run:');
624
+ console.log(` cd ${projectName}`);
625
+ console.log(' npm run prisma:migrate');
710
626
  }
711
627
  })();
712
628
  }
629
+
package/doc/CLI.md CHANGED
@@ -4,6 +4,39 @@ Lapeh Framework dilengkapi dengan berbagai script CLI untuk mempercepat proses d
4
4
 
5
5
  Semua perintah dijalankan menggunakan `npm run <command>`.
6
6
 
7
+ > **Info:** Di balik layar, script `npm run` ini memanggil CLI internal framework (`lapeh`). Anda juga bisa menjalankan perintah ini secara langsung menggunakan `npx lapeh <command>`.
8
+
9
+ ## Core Commands
10
+
11
+ Perintah utama untuk menjalankan aplikasi:
12
+
13
+ ### 1. Development Server (`dev`)
14
+ Menjalankan server dalam mode development dengan fitur hot-reload.
15
+
16
+ ```bash
17
+ npm run dev
18
+ # atau
19
+ npx lapeh dev
20
+ ```
21
+
22
+ ### 2. Production Server (`start`)
23
+ Menjalankan server dalam mode production (pastikan sudah dibuild).
24
+
25
+ ```bash
26
+ npm run start
27
+ # atau
28
+ npx lapeh start
29
+ ```
30
+
31
+ ### 3. Build Project (`build`)
32
+ Mengompilasi kode TypeScript ke JavaScript di folder `dist`.
33
+
34
+ ```bash
35
+ npm run build
36
+ # atau
37
+ npx lapeh build
38
+ ```
39
+
7
40
  ## Code Generators
8
41
 
9
42
  Gunakan perintah ini untuk membuat file boilerplate secara otomatis.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lapeh",
3
- "version": "2.2.9",
3
+ "version": "2.3.2",
4
4
  "description": "Framework API Express yang siap pakai (Standardized)",
5
5
  "main": "index.js",
6
6
  "bin": {
package/readme.md CHANGED
@@ -65,34 +65,34 @@ Anda dapat menginstall framework ini menggunakan versi terbaru atau versi spesif
65
65
  npx lapeh@latest nama-project-anda
66
66
  ```
67
67
 
68
- Atau gunakan flag `--full` untuk setup lengkap (termasuk seeding data default user & roles):
68
+ Perintah di atas akan membuat proyek **bersih** (clean slate):
69
69
 
70
- ```bash
71
- npx lapeh@latest nama-project-anda --full
72
- ```
70
+ - Struktur folder dibuat.
71
+ - Dependensi diinstall.
72
+ - Database dikonfigurasi & dimigrasi (hanya Schema, **tanpa data**).
73
+ - Folder `bin` dan `lib` framework tersembunyi di `node_modules` agar root proyek Anda tetap rapi.
73
74
 
74
- ### 2. Menggunakan Versi Spesifik
75
+ ### 2. Setup Lengkap dengan Demo Data (`--full`)
75
76
 
76
- Jika Anda membutuhkan versi tertentu (misalnya untuk kompatibilitas):
77
+ Jika Anda ingin mencoba fitur lengkap dengan data demo (Users, Roles, Pets), gunakan flag `--full`:
77
78
 
78
79
  ```bash
79
- npx lapeh@1.0.8 nama-project-anda
80
+ npx lapeh@latest nama-project-anda --full
80
81
  ```
81
82
 
82
- Atau dengan setup lengkap:
83
+ Apa bedanya?
83
84
 
84
- ```bash
85
- npx lapeh@1.0.8 nama-project-anda --full
86
- ```
85
+ - **Tanpa `--full`**: Database kosong (hanya tabel). Cocok untuk memulai proyek baru dari nol.
86
+ - **Dengan `--full`**: Database otomatis di-seed dengan data User (Super Admin), Roles, Permissions, dan 50.000 data demo Pets.
87
87
 
88
88
  ### Apa yang terjadi otomatis?
89
89
 
90
- 1. Struktur project dibuat.
90
+ 1. Struktur project dibuat (Core framework tersembunyi sebagai dependency).
91
91
  2. Dependencies diinstall.
92
92
  3. Database dipilih & dikonfigurasi secara interaktif.
93
93
  4. **Database** dibuat dan dimigrasi otomatis.
94
94
  5. **JWT Secret** di-generate otomatis.
95
- 6. **Seeding Data** (jika menggunakan `--full`).
95
+ 6. **Seeding Data** (Hanya jika menggunakan `--full`).
96
96
 
97
97
  Masuk ke folder project dan jalankan:
98
98
 
@@ -101,8 +101,17 @@ cd nama-project-anda
101
101
  npm run dev
102
102
  ```
103
103
 
104
+ > **Catatan**: Perintah `npm run dev` sekarang menggunakan CLI internal framework (`lapeh dev`), memberikan pengalaman development yang lebih stabil dan terstandarisasi. Core framework (`bin` dan `lib`) tidak lagi memenuhi root folder Anda, tetapi tersimpan aman sebagai dependency.
105
+
104
106
  Server akan berjalan di `http://localhost:4000`.
105
107
 
108
+ ### 🛡️ Keamanan & Pembaruan
109
+
110
+ Framework ini didesain dengan memprioritaskan keamanan:
111
+
112
+ - **Zero-Vulnerability Policy**: Kami secara rutin melakukan audit dependensi (`npm audit`) untuk memastikan tidak ada celah keamanan.
113
+ - **Framework-as-Dependency**: Dengan menyembunyikan core logic di `node_modules`, pembaruan framework menjadi lebih mudah (cukup update versi `lapeh` di `package.json`) tanpa merusak kode aplikasi Anda.
114
+
106
115
  ### 🔑 Akun Default (Jika menggunakan `--full` atau `npm run db:seed`)
107
116
 
108
117
  Jika Anda melakukan setup dengan flag `--full`, database akan terisi dengan akun default berikut:
@@ -1,19 +0,0 @@
1
- PORT=8000
2
- DATABASE_PROVIDER="postgresql"
3
- DATABASE_URL="postgresql://sianu:12341234@localhost:5432/db_example_test?schema=public"
4
-
5
- # Used for all encryption-related tasks in the framework (JWT, etc.)
6
- JWT_SECRET="replace_this_with_a_secure_random_string"
7
-
8
- # Framework Timezone
9
- TZ="Asia/Jakarta"
10
-
11
- # Redis Configuration (Optional)
12
- # If REDIS_URL is not set or connection fails, the framework will automatically
13
- # switch to an in-memory Redis mock (bundled). No installation required for development.
14
- # REDIS_URL="redis://lapeh:12341234@localhost:6379"
15
- # NO_REDIS="true"
16
-
17
- # To force disable Redis and use in-memory mock even if Redis is available:
18
- # NO_REDIS="true"
19
-
@@ -1,73 +0,0 @@
1
- # Panduan Arsitektur: Menuju "Framework as a Dependency" (Next.js Style)
2
-
3
- Saat ini, Lapeh menggunakan pendekatan **Boilerplate** (seperti Laravel), di mana pengguna mendapatkan seluruh kode sumber (`src/`) dan bertanggung jawab atas `express`, `prisma`, dll.
4
-
5
- Untuk mengubahnya menjadi seperti **Next.js** (di mana pengguna hanya menginstall `lapeh` dan `package.json` mereka bersih), kita perlu mengubah arsitektur menjadi **Library**.
6
-
7
- ## 1. Perbedaan Utama
8
-
9
- | Fitur | Boilerplate (Lapeh Saat Ini) | Library (Next.js Style) |
10
- | :--- | :--- | :--- |
11
- | **Instalasi** | `git clone` / `npx create-lapeh` | `npm install lapeh` |
12
- | **package.json** | Banyak dependency (`express`, `cors`, dll) | Sedikit (`lapeh`, `react`) |
13
- | **Scripts** | Panjang (`nodemon src/index.ts`) | Pendek (`lapeh dev`) |
14
- | **Core Code** | Terbuka di `src/core/` | Tersembunyi di `node_modules/lapeh` |
15
- | **Update** | Susah (harus merge manual) | Mudah (`npm update lapeh`) |
16
-
17
- ## 2. Langkah Implementasi
18
-
19
- Saya telah memulai langkah pertama dengan menambahkan **CLI Runner** di `bin/index.js`.
20
-
21
- ### A. Update CLI (`bin/index.js`) ✅ (Sudah Dilakukan)
22
- Saya sudah menambahkan command `dev`, `start`, dan `build` ke dalam CLI Lapeh. Ini memungkinkan pengguna menjalankan server tanpa tahu perintah aslinya.
23
-
24
- ```javascript
25
- // Contoh penggunaan nanti:
26
- "scripts": {
27
- "dev": "lapeh dev",
28
- "build": "lapeh build",
29
- "start": "lapeh start"
30
- }
31
- ```
32
-
33
- ### B. Struktur Project Pengguna (Target)
34
- Nantinya, project pengguna Lapeh hanya akan berisi file bisnis mereka:
35
-
36
- ```text
37
- my-app/
38
- ├── src/
39
- │ ├── controllers/
40
- │ ├── routes/
41
- │ └── models/
42
- ├── lapeh.config.ts <-- Konfigurasi framework (pengganti edit core)
43
- └── package.json
44
- ```
45
-
46
- Dan `package.json` mereka akan terlihat seperti ini:
47
-
48
- ```json
49
- {
50
- "name": "my-app",
51
- "dependencies": {
52
- "lapeh": "^2.0.0"
53
- },
54
- "scripts": {
55
- "dev": "lapeh dev",
56
- "build": "lapeh build",
57
- "start": "lapeh start"
58
- }
59
- }
60
- ```
61
-
62
- ### C. Apa yang Harus Dilakukan Selanjutnya?
63
-
64
- 1. **Publish Package**: Anda perlu mempublish folder framework ini ke NPM (atau private registry).
65
- * Pastikan `express`, `cors`, `helmet`, dll ada di `dependencies` (bukan `devDependencies`).
66
- 2. **Abstraksi `src/index.ts`**:
67
- * Saat ini `src/index.ts` adalah entry point yang diedit user.
68
- * Ubah agar `lapeh dev` menjalankan server internal yang **mengimpor** routes/controller user secara dinamis (seperti Next.js pages router).
69
- 3. **Config Loader**:
70
- * Buat sistem pembacaan `lapeh.config.ts` untuk mengatur Port, Database URL, dll tanpa mengedit kode core.
71
-
72
- ## 3. Kesimpulan
73
- Perubahan yang saya lakukan di `bin/index.js` adalah fondasi untuk CLI style. Untuk mencapai "Clean package.json" sepenuhnya, Anda harus memisahkan **Framework Core** (repo ini) dengan **User Project** (repo baru yang menginstall framework ini).
@@ -1,77 +0,0 @@
1
- # Dokumentasi Perubahan Lapeh Framework
2
-
3
- File ini mencatat semua perubahan, pembaruan, dan perbaikan yang dilakukan pada framework Lapeh, diurutkan berdasarkan tanggal.
4
-
5
- ## [2025-12-27] - Code Quality & Standardization Update
6
-
7
- ### 🚀 Fitur & Standarisasi
8
-
9
- - **Standardized Import Paths**:
10
- - Implementasi path alias `@/` untuk import yang lebih bersih (e.g., `import { prisma } from "@/core/database"`).
11
- - Penghapusan penggunaan relative paths yang dalam (`../../../`).
12
- - Konfigurasi `tsconfig.json` tanpa `baseUrl` (mengikuti standar TypeScript 6.0+).
13
- - **Strict Linting & Code Quality**:
14
- - Implementasi aturan **ESLint** ketat untuk mencegah "Dead Code".
15
- - Error otomatis untuk variabel, parameter, dan import yang tidak digunakan (`no-unused-vars`).
16
- - Script `npm run lint` dan `npm run lint:fix` untuk pembersihan kode otomatis.
17
- - **Fastify-Style Standardization**:
18
- - Penerapan standar respon cepat (`sendFastSuccess`) di seluruh controller (`AuthController`, `RbacController`, `PetController`).
19
- - Penggunaan **Schema-based Serialization** untuk performa JSON maksimal.
20
- - Konversi otomatis `BigInt` ke `string` dalam respon JSON.
21
-
22
- ## [2025-12-27] - High Performance & Scalability Update
23
-
24
- ### 🚀 Fitur Baru
25
-
26
- - **High Performance Serialization (Fastify-Style)**:
27
- - Implementasi `fast-json-stringify` untuk serialisasi JSON super cepat (2x-3x lebih cepat dari `JSON.stringify`).
28
- - Helper `sendFastSuccess` di `src/utils/response.ts` untuk mem-bypass overhead Express.
29
- - Caching schema serializer otomatis di `src/core/serializer.ts`.
30
- - **Scalability & Clustering**:
31
- - Dukungan **Load Balancing** dengan Nginx.
32
- - Dukungan **Redis Clustering** untuk Rate Limiter (`rate-limit-redis`).
33
- - File konfigurasi `docker-compose.cluster.yml` untuk simulasi cluster lokal (1 Nginx + 2 App Instances + 1 Redis).
34
- - **Smart Error Handling**:
35
- - Deteksi otomatis port bentrok (`EADDRINUSE`) saat startup.
36
- - Memberikan saran command _copy-paste_ untuk mematikan process yang memblokir port (support Windows, Mac, Linux).
37
- - **SEO Optimization**:
38
- - Update metadata `package.json` dan `README.md` agar framework lebih mudah ditemukan di Google/NPM.
39
-
40
- ## [2025-12-27] - Pembaruan Struktur & Validasi
41
-
42
- ### 🚀 Fitur Baru
43
-
44
- - **Laravel-style Validator**:
45
- - Implementasi utility `Validator` baru di `src/utils/validator.ts` yang meniru gaya validasi Laravel.
46
- - Mendukung rule string seperti `required|string|min:3|email`.
47
- - Penambahan rule `unique` untuk pengecekan database otomatis (Prisma).
48
- - Penambahan rule `mimes`, `image`, `max` (file size) untuk validasi upload file.
49
- - Penambahan rule `sometimes` untuk field opsional.
50
- - **Framework Hardening (Keamanan & Stabilitas)**:
51
- - **Rate Limiting**: Middleware anti-spam/brute-force di `src/middleware/rateLimit.ts`.
52
- - **Request Logger**: Pencatatan log request masuk di `src/middleware/requestLogger.ts`.
53
- - **Health Check**: Endpoint `/` kini mengembalikan status kesehatan server.
54
- - **Graceful Shutdown**: Penanganan penutupan koneksi Database dan Redis yang aman saat server berhenti (`SIGTERM`/`SIGINT`).
55
- - **Environment Validation**: Validasi variabel `.env` wajib (seperti `DATABASE_URL`, `JWT_SECRET`) saat startup.
56
- - **Struktur Folder Baru**:
57
- - Pemisahan konfigurasi inti ke `src/core/` (`server.ts`, `database.ts`, `redis.ts`, `realtime.ts`) agar folder `src` lebih bersih.
58
- - Sentralisasi route di `src/routes/index.ts` (WIP).
59
- - **CLI Improvements**:
60
- - `npx lapeh <project-name> --full` kini otomatis menjalankan server dev setelah instalasi selesai, sehingga user bisa langsung melihat hasil tanpa mengetik perintah tambahan.
61
-
62
- ### 🛠️ Perbaikan & Refactoring
63
-
64
- - **Controller Refactoring**:
65
- - `AuthController`: Migrasi ke `Validator` baru, termasuk validasi upload avatar.
66
- - `PetController`: Migrasi ke `Validator` baru.
67
- - `RbacController`: Migrasi sebagian ke `Validator` baru.
68
- - **Pembersihan**:
69
- - Penghapusan folder `src/schema/` (Zod schema lama) karena sudah digantikan oleh `Validator` utility.
70
- - Penghapusan file duplikat/lama di root `src/` setelah migrasi ke `src/core/`.
71
-
72
- ### 📝 Catatan Teknis
73
-
74
- - **Validator Async**: Method `fails()`, `passes()`, dan `validated()` kini bersifat `async` untuk mendukung pengecekan database (`unique`).
75
- - **Type Safety**: Semua perubahan telah diverifikasi dengan `npm run typecheck`.
76
-
77
- ---
@@ -1,94 +0,0 @@
1
- # Lapeh Framework Cheatsheet
2
-
3
- Referensi cepat untuk perintah dan kode yang sering digunakan.
4
-
5
- ## 💻 CLI Commands
6
-
7
- | Perintah | Fungsi |
8
- | :----------------------------------- | :------------------------------------------- |
9
- | **`npm run dev`** | Menjalankan server development (hot-reload). |
10
- | **`npm run typecheck`** | Cek error TypeScript (tanpa compile). |
11
- | **`npm run lint`** | Cek kode kotor/variabel tidak terpakai. |
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. |
20
-
21
- ## 🛡️ Validator Rules (Laravel-Style)
22
-
23
- Gunakan di `Validator.make(data, rules)`.
24
-
25
- | Rule | Deskripsi | Contoh |
26
- | :----------------- | :---------------------- | :---------------------------------- | -------- |
27
- | `required` | Wajib ada & tidak null. | `"required"` |
28
- | `string` | Harus text. | `"required | string"` |
29
- | `number` | Harus angka. | `"required | number"` |
30
- | `email` | Format email valid. | `"required | email"` |
31
- | `min:X` | Min panjang/nilai. | `"min:8"` (pass), `"min:18"` (umur) |
32
- | `max:X` | Max panjang/nilai. | `"max:255"` |
33
- | `unique:table,col` | Cek unik di DB. | `"unique:users,email"` |
34
- | `exists:table,col` | Cek exist di DB. | `"exists:roles,id"` |
35
- | `image` | File harus gambar. | `"required | image"` |
36
- | `mimes:types` | File extension. | `"mimes:pdf,docx"` |
37
-
38
- ## 🔑 Authentication
39
-
40
- **Middleware di Route:**
41
-
42
- ```typescript
43
- import { requireAuth, requireAdmin } from "@/middleware/auth";
44
-
45
- router.get("/profile", requireAuth, getProfile); // Login User
46
- router.delete("/user", requireAuth, requireAdmin, del); // Admin Only
47
- ```
48
-
49
- **Akses User di Controller:**
50
-
51
- ```typescript
52
- // (req as any).user tersedia setelah requireAuth
53
- const userId = (req as any).user.userId;
54
- const role = (req as any).user.role;
55
- ```
56
-
57
- ## ⚡ Fast Response (Serializer)
58
-
59
- **1. Schema:**
60
-
61
- ```typescript
62
- const schema = {
63
- type: "object",
64
- properties: {
65
- id: { type: "string" },
66
- name: { type: "string" },
67
- },
68
- };
69
- ```
70
-
71
- **2. Serializer:**
72
-
73
- ```typescript
74
- const serializer = getSerializer("key-name", createResponseSchema(schema));
75
- ```
76
-
77
- **3. Send:**
78
-
79
- ```typescript
80
- sendFastSuccess(res, 200, serializer, { ...data });
81
- ```
82
-
83
- ## 📦 Redis (Cache)
84
-
85
- ```typescript
86
- import { redis } from "@lapeh/core/redis";
87
-
88
- // Set Cache (Key, Value, Mode, Detik)
89
- await redis.set("profile:1", JSON.stringify(data), "EX", 3600);
90
-
91
- // Get Cache
92
- const cached = await redis.get("profile:1");
93
- if (cached) return JSON.parse(cached);
94
- ```