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.
- package/bin/index.js +43 -126
- package/doc/CLI.md +33 -0
- package/package.json +1 -1
- package/readme.md +22 -13
- package/api-testing-enambelas/.env.example +0 -19
- package/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +0 -73
- package/api-testing-enambelas/doc/CHANGELOG.md +0 -77
- package/api-testing-enambelas/doc/CHEATSHEET.md +0 -94
- package/api-testing-enambelas/doc/CLI.md +0 -106
- package/api-testing-enambelas/doc/CONTRIBUTING.md +0 -105
- package/api-testing-enambelas/doc/DEPLOYMENT.md +0 -122
- package/api-testing-enambelas/doc/FAQ.md +0 -81
- package/api-testing-enambelas/doc/FEATURES.md +0 -165
- package/api-testing-enambelas/doc/GETTING_STARTED.md +0 -108
- package/api-testing-enambelas/doc/INTRODUCTION.md +0 -60
- package/api-testing-enambelas/doc/PACKAGES.md +0 -66
- package/api-testing-enambelas/doc/PERFORMANCE.md +0 -91
- package/api-testing-enambelas/doc/ROADMAP.md +0 -93
- package/api-testing-enambelas/doc/SECURITY.md +0 -93
- package/api-testing-enambelas/doc/STRUCTURE.md +0 -90
- package/api-testing-enambelas/doc/TUTORIAL.md +0 -192
- package/api-testing-enambelas/docker-compose.yml +0 -24
- package/api-testing-enambelas/eslint.config.mjs +0 -26
- package/api-testing-enambelas/framework.md +0 -168
- package/api-testing-enambelas/nodemon.json +0 -6
- package/api-testing-enambelas/package-lock.json +0 -5527
- package/api-testing-enambelas/package.json +0 -106
- package/api-testing-enambelas/prisma/base.prisma.template +0 -7
- package/api-testing-enambelas/prisma/migrations/20251227042956_init_setup/migration.sql +0 -248
- package/api-testing-enambelas/prisma/migrations/migration_lock.toml +0 -3
- package/api-testing-enambelas/prisma/schema.prisma +0 -183
- package/api-testing-enambelas/prisma/seed.ts +0 -411
- package/api-testing-enambelas/prisma.config.ts +0 -15
- package/api-testing-enambelas/readme.md +0 -414
- package/api-testing-enambelas/scripts/check-update.js +0 -92
- package/api-testing-enambelas/scripts/compile-schema.js +0 -29
- package/api-testing-enambelas/scripts/config-clear.js +0 -45
- package/api-testing-enambelas/scripts/generate-jwt-secret.js +0 -38
- package/api-testing-enambelas/scripts/init-project.js +0 -178
- package/api-testing-enambelas/scripts/make-controller.js +0 -205
- package/api-testing-enambelas/scripts/make-model.js +0 -42
- package/api-testing-enambelas/scripts/make-module.js +0 -158
- package/api-testing-enambelas/scripts/verify-rbac-functional.js +0 -187
- package/api-testing-enambelas/src/controllers/authController.ts +0 -469
- package/api-testing-enambelas/src/controllers/petController.ts +0 -194
- package/api-testing-enambelas/src/controllers/rbacController.ts +0 -478
- package/api-testing-enambelas/src/models/core.prisma +0 -163
- package/api-testing-enambelas/src/models/pets.prisma +0 -9
- package/api-testing-enambelas/src/routes/auth.ts +0 -74
- package/api-testing-enambelas/src/routes/index.ts +0 -10
- package/api-testing-enambelas/src/routes/pets.ts +0 -13
- package/api-testing-enambelas/src/routes/rbac.ts +0 -42
- package/api-testing-enambelas/storage/logs/.gitkeep +0 -0
- package/api-testing-enambelas/tsconfig.json +0 -43
- package/api-testing-tujuhbelas/.env.example +0 -19
- package/api-testing-tujuhbelas/api-testing-enambelas/.env.example +0 -19
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +0 -73
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHANGELOG.md +0 -77
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHEATSHEET.md +0 -94
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CLI.md +0 -106
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CONTRIBUTING.md +0 -105
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/DEPLOYMENT.md +0 -122
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/FAQ.md +0 -81
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/FEATURES.md +0 -165
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/GETTING_STARTED.md +0 -108
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/INTRODUCTION.md +0 -60
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/PACKAGES.md +0 -66
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/PERFORMANCE.md +0 -91
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/ROADMAP.md +0 -93
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/SECURITY.md +0 -93
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/STRUCTURE.md +0 -90
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/TUTORIAL.md +0 -192
- package/api-testing-tujuhbelas/api-testing-enambelas/docker-compose.yml +0 -24
- package/api-testing-tujuhbelas/api-testing-enambelas/eslint.config.mjs +0 -26
- package/api-testing-tujuhbelas/api-testing-enambelas/framework.md +0 -168
- package/api-testing-tujuhbelas/api-testing-enambelas/nodemon.json +0 -6
- package/api-testing-tujuhbelas/api-testing-enambelas/package.json +0 -106
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/base.prisma.template +0 -7
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/schema.prisma +0 -183
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/seed.ts +0 -411
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma.config.ts +0 -15
- package/api-testing-tujuhbelas/api-testing-enambelas/readme.md +0 -414
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/check-update.js +0 -92
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/compile-schema.js +0 -29
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/config-clear.js +0 -45
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/generate-jwt-secret.js +0 -38
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/init-project.js +0 -178
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-controller.js +0 -205
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-model.js +0 -42
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-module.js +0 -158
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/verify-rbac-functional.js +0 -187
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/authController.ts +0 -469
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/petController.ts +0 -194
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/rbacController.ts +0 -478
- package/api-testing-tujuhbelas/api-testing-enambelas/src/models/core.prisma +0 -163
- package/api-testing-tujuhbelas/api-testing-enambelas/src/models/pets.prisma +0 -9
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/auth.ts +0 -74
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/index.ts +0 -10
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/pets.ts +0 -13
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/rbac.ts +0 -42
- package/api-testing-tujuhbelas/api-testing-enambelas/storage/logs/.gitkeep +0 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/tsconfig.json +0 -43
- package/api-testing-tujuhbelas/doc/ARCHITECTURE_GUIDE.md +0 -73
- package/api-testing-tujuhbelas/doc/CHANGELOG.md +0 -77
- package/api-testing-tujuhbelas/doc/CHEATSHEET.md +0 -94
- package/api-testing-tujuhbelas/doc/CLI.md +0 -106
- package/api-testing-tujuhbelas/doc/CONTRIBUTING.md +0 -105
- package/api-testing-tujuhbelas/doc/DEPLOYMENT.md +0 -122
- package/api-testing-tujuhbelas/doc/FAQ.md +0 -81
- package/api-testing-tujuhbelas/doc/FEATURES.md +0 -165
- package/api-testing-tujuhbelas/doc/GETTING_STARTED.md +0 -108
- package/api-testing-tujuhbelas/doc/INTRODUCTION.md +0 -60
- package/api-testing-tujuhbelas/doc/PACKAGES.md +0 -66
- package/api-testing-tujuhbelas/doc/PERFORMANCE.md +0 -91
- package/api-testing-tujuhbelas/doc/ROADMAP.md +0 -93
- package/api-testing-tujuhbelas/doc/SECURITY.md +0 -93
- package/api-testing-tujuhbelas/doc/STRUCTURE.md +0 -90
- package/api-testing-tujuhbelas/doc/TUTORIAL.md +0 -192
- package/api-testing-tujuhbelas/docker-compose.yml +0 -24
- package/api-testing-tujuhbelas/eslint.config.mjs +0 -26
- package/api-testing-tujuhbelas/framework.md +0 -168
- package/api-testing-tujuhbelas/nodemon.json +0 -6
- package/api-testing-tujuhbelas/package-lock.json +0 -5527
- package/api-testing-tujuhbelas/package.json +0 -106
- package/api-testing-tujuhbelas/prisma/base.prisma.template +0 -7
- package/api-testing-tujuhbelas/prisma/migrations/20251227043210_init_setup/migration.sql +0 -248
- package/api-testing-tujuhbelas/prisma/migrations/migration_lock.toml +0 -3
- package/api-testing-tujuhbelas/prisma/schema.prisma +0 -183
- package/api-testing-tujuhbelas/prisma/seed.ts +0 -411
- package/api-testing-tujuhbelas/prisma.config.ts +0 -15
- package/api-testing-tujuhbelas/readme.md +0 -414
- package/api-testing-tujuhbelas/scripts/check-update.js +0 -92
- package/api-testing-tujuhbelas/scripts/compile-schema.js +0 -29
- package/api-testing-tujuhbelas/scripts/config-clear.js +0 -45
- package/api-testing-tujuhbelas/scripts/generate-jwt-secret.js +0 -38
- package/api-testing-tujuhbelas/scripts/init-project.js +0 -178
- package/api-testing-tujuhbelas/scripts/make-controller.js +0 -205
- package/api-testing-tujuhbelas/scripts/make-model.js +0 -42
- package/api-testing-tujuhbelas/scripts/make-module.js +0 -158
- package/api-testing-tujuhbelas/scripts/verify-rbac-functional.js +0 -187
- package/api-testing-tujuhbelas/src/controllers/authController.ts +0 -469
- package/api-testing-tujuhbelas/src/controllers/petController.ts +0 -194
- package/api-testing-tujuhbelas/src/controllers/rbacController.ts +0 -478
- package/api-testing-tujuhbelas/src/models/core.prisma +0 -163
- package/api-testing-tujuhbelas/src/models/pets.prisma +0 -9
- package/api-testing-tujuhbelas/src/routes/auth.ts +0 -74
- package/api-testing-tujuhbelas/src/routes/index.ts +0 -10
- package/api-testing-tujuhbelas/src/routes/pets.ts +0 -13
- package/api-testing-tujuhbelas/src/routes/rbac.ts +0 -42
- package/api-testing-tujuhbelas/storage/logs/.gitkeep +0 -0
- 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
|
-
|
|
411
|
-
|
|
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
|
-
|
|
683
|
-
|
|
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
|
-
|
|
613
|
+
console.log(' ℹ️ Skipping database seeding (use --full to seed default data)...');
|
|
686
614
|
}
|
|
687
615
|
|
|
688
|
-
|
|
689
|
-
console.
|
|
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(
|
|
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
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
|
-
|
|
68
|
+
Perintah di atas akan membuat proyek **bersih** (clean slate):
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
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.
|
|
75
|
+
### 2. Setup Lengkap dengan Demo Data (`--full`)
|
|
75
76
|
|
|
76
|
-
Jika Anda
|
|
77
|
+
Jika Anda ingin mencoba fitur lengkap dengan data demo (Users, Roles, Pets), gunakan flag `--full`:
|
|
77
78
|
|
|
78
79
|
```bash
|
|
79
|
-
npx lapeh@
|
|
80
|
+
npx lapeh@latest nama-project-anda --full
|
|
80
81
|
```
|
|
81
82
|
|
|
82
|
-
|
|
83
|
+
Apa bedanya?
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
```
|