lapeeh 1.0.0

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 (76) hide show
  1. package/.env.example +14 -0
  2. package/LICENSE +21 -0
  3. package/bin/index.js +934 -0
  4. package/doc/en/ARCHITECTURE_GUIDE.md +79 -0
  5. package/doc/en/CHANGELOG.md +203 -0
  6. package/doc/en/CHEATSHEET.md +90 -0
  7. package/doc/en/CLI.md +111 -0
  8. package/doc/en/CONTRIBUTING.md +119 -0
  9. package/doc/en/DEPLOYMENT.md +171 -0
  10. package/doc/en/FAQ.md +69 -0
  11. package/doc/en/FEATURES.md +99 -0
  12. package/doc/en/GETTING_STARTED.md +84 -0
  13. package/doc/en/INTRODUCTION.md +62 -0
  14. package/doc/en/PACKAGES.md +63 -0
  15. package/doc/en/PERFORMANCE.md +98 -0
  16. package/doc/en/ROADMAP.md +104 -0
  17. package/doc/en/SECURITY.md +95 -0
  18. package/doc/en/STRUCTURE.md +79 -0
  19. package/doc/en/TUTORIAL.md +145 -0
  20. package/doc/id/ARCHITECTURE_GUIDE.md +76 -0
  21. package/doc/id/CHANGELOG.md +203 -0
  22. package/doc/id/CHEATSHEET.md +90 -0
  23. package/doc/id/CLI.md +139 -0
  24. package/doc/id/CONTRIBUTING.md +119 -0
  25. package/doc/id/DEPLOYMENT.md +171 -0
  26. package/doc/id/FAQ.md +69 -0
  27. package/doc/id/FEATURES.md +169 -0
  28. package/doc/id/GETTING_STARTED.md +91 -0
  29. package/doc/id/INTRODUCTION.md +62 -0
  30. package/doc/id/PACKAGES.md +63 -0
  31. package/doc/id/PERFORMANCE.md +100 -0
  32. package/doc/id/ROADMAP.md +107 -0
  33. package/doc/id/SECURITY.md +94 -0
  34. package/doc/id/STRUCTURE.md +79 -0
  35. package/doc/id/TUTORIAL.md +145 -0
  36. package/docker-compose.yml +24 -0
  37. package/ecosystem.config.js +17 -0
  38. package/eslint.config.mjs +26 -0
  39. package/gitignore.template +30 -0
  40. package/lib/bootstrap.ts +210 -0
  41. package/lib/core/realtime.ts +34 -0
  42. package/lib/core/redis.ts +139 -0
  43. package/lib/core/serializer.ts +63 -0
  44. package/lib/core/server.ts +70 -0
  45. package/lib/core/store.ts +116 -0
  46. package/lib/middleware/auth.ts +63 -0
  47. package/lib/middleware/error.ts +50 -0
  48. package/lib/middleware/multipart.ts +13 -0
  49. package/lib/middleware/rateLimit.ts +14 -0
  50. package/lib/middleware/requestLogger.ts +27 -0
  51. package/lib/middleware/visitor.ts +178 -0
  52. package/lib/utils/logger.ts +100 -0
  53. package/lib/utils/pagination.ts +56 -0
  54. package/lib/utils/response.ts +88 -0
  55. package/lib/utils/validator.ts +394 -0
  56. package/nodemon.json +6 -0
  57. package/package.json +126 -0
  58. package/readme.md +357 -0
  59. package/scripts/check-update.js +92 -0
  60. package/scripts/config-clear.js +45 -0
  61. package/scripts/generate-jwt-secret.js +38 -0
  62. package/scripts/init-project.js +84 -0
  63. package/scripts/make-module.js +89 -0
  64. package/scripts/release.js +494 -0
  65. package/scripts/seed-json.js +158 -0
  66. package/scripts/verify-rbac-functional.js +187 -0
  67. package/src/config/app.ts +9 -0
  68. package/src/config/cors.ts +5 -0
  69. package/src/modules/Auth/auth.controller.ts +519 -0
  70. package/src/modules/Rbac/rbac.controller.ts +533 -0
  71. package/src/routes/auth.ts +74 -0
  72. package/src/routes/index.ts +7 -0
  73. package/src/routes/rbac.ts +42 -0
  74. package/storage/logs/.gitkeep +0 -0
  75. package/tsconfig.build.json +12 -0
  76. package/tsconfig.json +30 -0
@@ -0,0 +1,171 @@
1
+ # Deployment Guide
2
+
3
+ Panduan ini akan membantu Anda membawa aplikasi lapeeh dari `localhost` ke Server Production (VPS/Cloud).
4
+
5
+ ## Persiapan Pra-Deploy
6
+
7
+ Sebelum deploy, pastikan:
8
+
9
+ 1. **Environment Variables**: Siapkan nilai `.env` untuk production (JWT Secret yang kuat, dll).
10
+ 2. **Build**: TypeScript harus dikompilasi ke JavaScript.
11
+
12
+ ## Strategi 1: VPS (Ubuntu/Debian) dengan PM2
13
+
14
+ Ini adalah cara paling umum dan hemat biaya.
15
+
16
+ ### 1. Setup Server
17
+
18
+ Pastikan Node.js dan NPM sudah terinstall di server.
19
+
20
+ ### 2. Clone & Install
21
+
22
+ ```bash
23
+ git clone https://github.com/username/repo-anda.git
24
+ cd repo-anda
25
+ npm install --production=false # Install devDependencies juga untuk build
26
+ ```
27
+
28
+ ### 3. Build Aplikasi
29
+
30
+ ```bash
31
+ npm run build
32
+ ```
33
+
34
+ Ini akan menghasilkan folder `dist/`.
35
+
36
+ ### 4. Setup Konfigurasi Production
37
+
38
+ ```bash
39
+ cp .env.example .env
40
+ nano .env # Isi dengan config production
41
+ ```
42
+
43
+ ### 5. Jalankan dengan PM2
44
+
45
+ lapeeh kini menyertakan konfigurasi otomatis PM2 (`ecosystem.config.js`).
46
+
47
+ 1. **Install PM2 Global**:
48
+
49
+ ```bash
50
+ npm install -g pm2
51
+ ```
52
+
53
+ 2. **Jalankan Aplikasi**:
54
+
55
+ ```bash
56
+ pm2 start ecosystem.config.js
57
+ ```
58
+
59
+ Perintah ini akan:
60
+
61
+ - Menjalankan aplikasi dalam mode **Cluster** (menggunakan semua core CPU yang tersedia).
62
+ - Mengatur `NODE_ENV` ke `production`.
63
+ - Mengaktifkan auto-restart jika aplikasi crash atau penggunaan memori melebihi 1GB.
64
+
65
+ 3. **Cek Status**:
66
+
67
+ ```bash
68
+ pm2 status
69
+ pm2 logs
70
+ ```
71
+
72
+ 4. **Simpan Config Startup (Agar jalan saat server reboot)**:
73
+ ```bash
74
+ pm2 save
75
+ pm2 startup
76
+ ```
77
+
78
+ ### ❓ FAQ: Mengapa Aplikasi Saya Muncul Ganda di PM2?
79
+
80
+ Jika Anda menjalankan `pm2 list` dan melihat nama aplikasi Anda muncul lebih dari satu kali, **JANGAN KHAWATIR**. Ini adalah fitur, bukan bug.
81
+
82
+ - **Penyebab**: Konfigurasi `instances: "max"` dan `exec_mode: "cluster"` di `ecosystem.config.js`.
83
+ - **Fungsi**: PM2 mendeteksi jumlah inti CPU (Core) di VPS Anda dan membuat 1 proses worker untuk setiap core.
84
+ - **Keuntungan**: Aplikasi Anda menjadi **Multi-Threaded**.
85
+
86
+ **Cara mengubah ke Single Instance (Hemat RAM):**
87
+ Jika RAM server Anda terbatas, ubah `ecosystem.config.js`:
88
+
89
+ ```javascript
90
+ module.exports = {
91
+ apps: [
92
+ {
93
+ name: "my-app",
94
+ // ...
95
+ instances: 1, // Ubah "max" menjadi 1
96
+ // ...
97
+ },
98
+ ],
99
+ };
100
+ ```
101
+
102
+ Lalu jalankan `pm2 reload ecosystem.config.js`.
103
+
104
+ ### 7. Advanced: Menjalankan Beberapa Aplikasi (Multi-App)
105
+
106
+ Anda bisa menggabungkannya dalam satu file `ecosystem.config.js`.
107
+
108
+ ### 8. Reverse Proxy (Nginx)
109
+
110
+ Jangan expose port 8000 langsung. Gunakan Nginx di depannya.
111
+ Config Nginx block:
112
+
113
+ ```nginx
114
+ server {
115
+ server_name api.domain-anda.com;
116
+ location / {
117
+ proxy_pass http://localhost:8000;
118
+ proxy_http_version 1.1;
119
+ proxy_set_header Upgrade $http_upgrade;
120
+ proxy_set_header Connection 'upgrade';
121
+ proxy_set_header Host $host;
122
+ proxy_cache_bypass $http_upgrade;
123
+ }
124
+ }
125
+ ```
126
+
127
+ ## Strategi 2: Docker (Container)
128
+
129
+ lapeeh sudah menyertakan `Dockerfile`.
130
+
131
+ **Dockerfile Minimal:**
132
+
133
+ ```dockerfile
134
+ FROM node:18-alpine
135
+
136
+ WORKDIR /app
137
+
138
+ COPY package*.json ./
139
+ RUN npm install
140
+
141
+ COPY . .
142
+ RUN npm run build
143
+
144
+ EXPOSE 8000
145
+ CMD ["npm", "run", "start:prod"]
146
+ ```
147
+
148
+ **Deploy:**
149
+
150
+ ```bash
151
+ docker build -t my-lapeeh-app .
152
+ docker run -p 8000:8000 --env-file .env my-lapeeh-app
153
+ ```
154
+
155
+ ## Strategi 3: PaaS (Railway / Render / Vercel)
156
+
157
+ Platform seperti Railway.app sangat mudah karena mendeteksi `package.json`.
158
+
159
+ 1. Push kode ke GitHub.
160
+ 2. Connect repo di Railway/Render.
161
+ 3. Set Environment Variables di dashboard mereka.
162
+ 4. Set **Build Command**: `npm run build`.
163
+ 5. Set **Start Command**: `npm run start:prod`.
164
+
165
+ ## Checklist Keamanan Production
166
+
167
+ - [ ] `NODE_ENV=production` harus diset.
168
+ - [ ] `JWT_SECRET` harus panjang dan acak.
169
+ - [ ] Database credential (jika ada) harus aman.
170
+ - [ ] Rate Limiting aktif (default lapeeh sudah aktif).
171
+ - [ ] Gunakan HTTPS (SSL) via Nginx atau Cloudflare.
package/doc/id/FAQ.md ADDED
@@ -0,0 +1,69 @@
1
+ # Frequently Asked Questions (FAQ)
2
+
3
+ Kumpulan pertanyaan umum dan solusi untuk masalah yang sering dihadapi.
4
+
5
+ ## Database
6
+
7
+ ### Q: Database apa yang didukung?
8
+
9
+ **A:**
10
+ lapeeh bersifat **Database Agnostic**. Anda bisa menggunakan PostgreSQL, MySQL, MongoDB, atau database apapun. Framework tidak membatasi pilihan database Anda. Kami menyediakan wrapper `db` generik yang bisa Anda konfigurasi sesuai kebutuhan.
11
+
12
+ ## Redis & Caching
13
+
14
+ ### Q: Saya tidak ingin pakai Redis di local, ribet installnya.
15
+
16
+ **A:**
17
+ Tenang, lapeeh otomatis mendeteksi jika Redis tidak berjalan dan akan menggunakan **In-Memory Mock** (simulasi Redis di RAM). Aplikasi tetap jalan normal tanpa error. Anda tidak perlu config apa-apa.
18
+
19
+ ### Q: Bagaimana cara clear cache Redis?
20
+
21
+ **A:**
22
+ Jika punya akses CLI Redis: `redis-cli FLUSHALL`.
23
+ Atau via kode:
24
+
25
+ ```typescript
26
+ import { redis } from "@/core/redis";
27
+ await redis.flushall();
28
+ ```
29
+
30
+ ## Fitur & Kustomisasi
31
+
32
+ ### Q: Bagaimana cara handle File Upload?
33
+
34
+ **A:**
35
+ Gunakan `multer`. Framework sudah menyiapkannya di `src/routes/auth.ts` sebagai contoh (upload avatar).
36
+ Anda bisa copy logic konfigurasi `multer` tersebut ke route lain.
37
+
38
+ ### Q: Bagaimana cara menambah middleware global baru?
39
+
40
+ **A:**
41
+ Buka `src/core/server.ts`. Di sana ada bagian `// Global Middlewares`. Tambahkan middleware Express Anda di situ:
42
+
43
+ ```typescript
44
+ app.use(myCustomMiddleware);
45
+ ```
46
+
47
+ ### Q: Saya ingin mengubah port server.
48
+
49
+ **A:**
50
+ Cukup ubah variabel `PORT` di file `.env`. Defaultnya adalah `8000`.
51
+
52
+ ## Troubleshooting
53
+
54
+ ### Q: Error `EADDRINUSE: address already in use :::8000`
55
+
56
+ **A:**
57
+ Artinya port 8000 sedang dipakai program lain (atau instance lapeeh sebelumnya yang nyangkut).
58
+ **Solusi:**
59
+
60
+ 1. Matikan terminal.
61
+ 2. Jalankan perintah kill (framework biasanya memberi saran commandnya saat error muncul).
62
+ - Windows: `taskkill /F /IM node.exe` (Hati-hati ini mematikan semua node process).
63
+ - Atau cari PID nya: `netstat -ano | findstr :8000`.
64
+
65
+ ### Q: Error `Unique constraint failed` saat seeding
66
+
67
+ **A:**
68
+ Data yang mau dimasukkan sudah ada (misal email `sa@sa.com`).
69
+ Jalankan `npm run db:reset` untuk menghapus semua data dan mulai dari nol.
@@ -0,0 +1,169 @@
1
+ # Fitur & Konsep Inti
2
+
3
+ Dokumen ini menjelaskan fitur-fitur utama lapeeh Framework dan cara penggunaannya secara mendalam.
4
+
5
+ 3. **Explicit is Better than Implicit**: Tidak ada "sihir" yang terlalu gelap. Kode controller Anda adalah kode Express biasa yang Anda mengerti.
6
+
7
+ ## 1. Validasi Data (Simple & Powerful)
8
+
9
+ Framework ini menyediakan utility `Validator` yang terinspirasi dari gaya validasi modern yang ekspresif, menggunakan `zod` di belakang layar namun dengan API yang lebih string-based dan mudah dibaca.
10
+
11
+ **Lokasi:** `@lapeeh/utils/validator`
12
+
13
+ ### Penggunaan Dasar
14
+
15
+ ```typescript
16
+ import { Validator } from "@lapeeh/utils/validator";
17
+
18
+ export async function createProduct(req: Request, res: Response) {
19
+ const validator = await Validator.make(req.body, {
20
+ name: "required|string|min:3",
21
+ price: "required|number|min:1000",
22
+ email: "required|email|unique:user,email", // Cek unik di tabel user kolom email
23
+ category_id: "required|exists:category,id", // Cek exist di tabel category kolom id
24
+ photo: "required|image|max:2048", // Validasi file upload (Max 2MB)
25
+ });
26
+
27
+ if (validator.fails()) {
28
+ return sendError(res, 400, "Validation failed", validator.errors());
29
+ }
30
+
31
+ const data = validator.validated();
32
+ // Lanjut proses simpan...
33
+ }
34
+ ```
35
+
36
+ ### Aturan Tersedia (Rules)
37
+
38
+ - `required`: Wajib diisi.
39
+ - `string`, `number`, `boolean`: Tipe data.
40
+ - `email`: Format email valid.
41
+ - `min:X`, `max:X`: Panjang string atau nilai number.
42
+ - `unique:table,column`: Pastikan nilai belum ada di database (Async).
43
+ - `exists:table,column`: Pastikan nilai ada di database (Async).
44
+ - `image`: File harus berupa gambar (jpg, png, webp, dll).
45
+ - `mimes:types`: File harus tipe tertentu (misal: `mimes:pdf,docx`).
46
+
47
+ ## 2. High Performance Response (Fastify-Like)
48
+
49
+ Untuk endpoint yang membutuhkan performa tinggi (misalnya list data besar), gunakan serialisasi berbasis schema. Ini jauh lebih cepat daripada `res.json` standar Express.
50
+
51
+ **Lokasi:** `@/utils/response`, `@/core/serializer`
52
+
53
+ ### Langkah Implementasi
54
+
55
+ 1. **Definisikan Schema Output**
56
+ Sesuaikan dengan field yang ingin ditampilkan ke user.
57
+
58
+ ```typescript
59
+ const productSchema = {
60
+ type: "object",
61
+ properties: {
62
+ id: { type: "string" }, // BigInt otomatis jadi string
63
+ name: { type: "string" },
64
+ price: { type: "number" },
65
+ },
66
+ };
67
+ ```
68
+
69
+ 2. **Buat Serializer (Cached)**
70
+ Simpan di luar handler function agar dicompile sekali saja.
71
+
72
+ ```typescript
73
+ import { getSerializer, createResponseSchema } from "@/core/serializer";
74
+
75
+ const productSerializer = getSerializer(
76
+ "product-single",
77
+ createResponseSchema(productSchema)
78
+ );
79
+ ```
80
+
81
+ 3. **Kirim Response**
82
+
83
+ ```typescript
84
+ import { sendFastSuccess } from "@lapeeh/utils/response";
85
+
86
+ // Di dalam controller
87
+ sendFastSuccess(res, 200, productSerializer, {
88
+ status: "success",
89
+ message: "Data retrieved",
90
+ data: productData,
91
+ });
92
+ ```
93
+
94
+ ## 3. Authentication & Authorization (RBAC)
95
+
96
+ Sistem autentikasi menggunakan JWT (JSON Web Token) dan mendukung Role-Based Access Control.
97
+
98
+ ### Middleware Auth
99
+
100
+ - `requireAuth`: Memastikan user login (mengirim header `Authorization: Bearer <token>`).
101
+ - `requireAdmin`: Memastikan user login DAN memiliki role `admin` atau `super_admin`.
102
+
103
+ **Contoh di Route:**
104
+
105
+ ```typescript
106
+ import { requireAuth, requireAdmin } from "@/middleware/auth";
107
+
108
+ router.get("/profile", requireAuth, getProfile); // Login only
109
+ router.delete("/users/:id", requireAuth, requireAdmin, deleteUser); // Admin only
110
+ ```
111
+
112
+ ### Helper RBAC (Role Based Access Control)
113
+
114
+ Anda bisa mengecek permission secara granular di dalam controller:
115
+
116
+ ```typescript
117
+ // (Contoh implementasi, logic ada di AuthController/RbacController)
118
+ if (req.user.role !== "manager") {
119
+ return sendError(res, 403, "Forbidden");
120
+ }
121
+ ```
122
+
123
+ ## 4. Caching & Redis
124
+
125
+ Framework ini memiliki integrasi Redis "Zero-Config".
126
+
127
+ - Jika `REDIS_URL` ada di `.env` dan server Redis berjalan, framework akan connect.
128
+ - Jika tidak ada atau gagal connect, framework otomatis fallback ke **In-Memory Mock**. Ini membuat development di local tidak wajib install Redis.
129
+
130
+ **Mengakses Redis:**
131
+
132
+ ```typescript
133
+ import { redis } from "@/core/redis";
134
+
135
+ // Set cache (1 jam)
136
+ await redis.set("my-key", "value", "EX", 3600);
137
+
138
+ // Get cache
139
+ const val = await redis.get("my-key");
140
+ ```
141
+
142
+ ## 5. Keamanan (Security)
143
+
144
+ Secara default, framework sudah menerapkan:
145
+
146
+ - **Helmet**: Mengamankan HTTP headers.
147
+ - **CORS**: Mengizinkan akses lintas domain (configurable).
148
+ - **Rate Limiting**: Membatasi jumlah request per IP untuk mencegah DDoS/Brute Force.
149
+ - Konfigurasi ada di `src/middleware/rateLimit.ts`.
150
+ - Default: 100 request / 15 menit.
151
+
152
+ ## 6. Import Path Aliases
153
+
154
+ Gunakan `@/` untuk import module agar kode lebih bersih.
155
+
156
+ - `@/core` -> `src/core`
157
+ - `@/controllers` -> `src/controllers`
158
+ - `@/utils` -> `src/utils`
159
+ - `@/middleware` -> `src/middleware`
160
+
161
+ **Contoh:**
162
+
163
+ ```typescript
164
+ import { db } from "@/core/database"; // ✅ Rapi
165
+
166
+ // vs
167
+
168
+ import { db } from "../../../core/database"; // ❌ Berantakan
169
+ ```
@@ -0,0 +1,91 @@
1
+ # Getting Started with lapeeh Framework
2
+
3
+ Selamat datang di dokumentasi resmi **lapeeh Framework**. Panduan ini akan membantu Anda memulai instalasi, konfigurasi, dan pemahaman dasar tentang struktur proyek.
4
+
5
+ ## Persyaratan Sistem
6
+
7
+ Sebelum memulai, pastikan sistem Anda memenuhi persyaratan berikut:
8
+
9
+ - **Node.js**: Versi 18.x atau lebih baru.
10
+ - **Package Manager**: NPM (bawaan Node.js).
11
+
12
+ ## Instalasi
13
+
14
+ Cara termudah untuk memulai adalah menggunakan CLI generator `npx`.
15
+
16
+ ### 1. Buat Project Baru
17
+
18
+ Jalankan perintah berikut di terminal Anda:
19
+
20
+ ```bash
21
+ # Setup Interaktif Standar
22
+ npx lapeeh@latest init nama-project-anda
23
+ ```
24
+
25
+ ### 2. Setup Awal
26
+
27
+ Setelah project dibuat, masuk ke direktori project dan jalankan setup wizard:
28
+
29
+ ```bash
30
+ cd nama-project-anda
31
+ npm run first
32
+ ```
33
+
34
+ Script ini akan melakukan hal-hal berikut secara otomatis:
35
+
36
+ 1. Menyalin `.env.example` ke `.env`.
37
+ 2. Menginstall semua dependency (`npm install`).
38
+ 3. Membuat **JWT Secret** yang aman.
39
+
40
+ ### 3. Jalankan Server Development
41
+
42
+ ```bash
43
+ npm run dev
44
+ ```
45
+
46
+ Server akan berjalan di `http://localhost:8000` (atau port yang Anda tentukan di `.env`).
47
+
48
+ ## Struktur Direktori
49
+
50
+ Berikut adalah struktur folder standar lapeeh Framework:
51
+
52
+ ```
53
+ my-app/
54
+ ├── bin/ # Script CLI untuk npx
55
+ ├── doc/ # Dokumentasi proyek
56
+ ├── scripts/ # Script utility (Generator, Compiler)
57
+ ├── src/ # Source code utama aplikasi
58
+ │ ├── controllers/ # Logika bisnis (Handler request)
59
+ │ ├── core/ # Konfigurasi inti (Redis, Server)
60
+ │ ├── middleware/ # Middleware Express (Auth, RateLimit)
61
+ │ ├── routes/ # Definisi routing API
62
+ │ ├── utils/ # Helper function (Response, Validator)
63
+ │ └── index.ts # Entry point aplikasi
64
+ ├── .env # Variabel lingkungan (Rahasia)
65
+ ├── package.json # Dependensi & Script NPM
66
+ └── tsconfig.json # Konfigurasi TypeScript
67
+ ```
68
+
69
+ ## Konfigurasi Environment (.env)
70
+
71
+ File `.env` menyimpan konfigurasi penting. Berikut adalah variabel kunci:
72
+
73
+ ```ini
74
+ # Server
75
+ PORT=8000
76
+ NODE_ENV=development
77
+
78
+ # Security
79
+ JWT_SECRET="rahasia-super-panjang-dan-acak"
80
+ ACCESS_TOKEN_EXPIRES_IN=3600 # 1 jam
81
+
82
+ # Redis (Opsional - otomatis mock jika tidak ada)
83
+ REDIS_URL="redis://localhost:6379"
84
+ NO_REDIS=false # Set true untuk memaksa mode mock
85
+ ```
86
+
87
+ ## Langkah Selanjutnya
88
+
89
+ - Pelajari cara menggunakan **[CLI Tools](CLI.md)** untuk mempercepat development.
90
+ - Pahami **[Fitur & Konsep Inti](FEATURES.md)** framework.
91
+ - Ikuti **[Tutorial Studi Kasus](TUTORIAL.md)** untuk membangun fitur nyata.
@@ -0,0 +1,62 @@
1
+ # Pengenalan lapeeh Framework
2
+
3
+ ## Apa itu lapeeh?
4
+
5
+ **lapeeh** adalah framework Backend untuk Node.js yang dibangun di atas **Express** dan **TypeScript**.
6
+
7
+ Jika Anda pernah menggunakan framework modern lainnya, Anda akan merasa sangat familiar. lapeeh mengambil filosofi kemudahan & struktur rapi, namun tetap mempertahankan fleksibilitas dan kecepatan Express.
8
+
9
+ Nama "lapeeh" diambil dari bahasa Minang yang berarti "Lepas" atau "Bebas", melambangkan kebebasan developer untuk membangun aplikasi dengan cepat tanpa terbebani konfigurasi yang rumit.
10
+
11
+ ## Mengapa lapeeh Dibuat?
12
+
13
+ Di ekosistem Node.js, developer sering mengalami "Decision Fatigue" (Kelelahan memilih):
14
+
15
+ - "Pakai ORM apa? Prisma, TypeORM, atau Drizzle?"
16
+ - "Validasi pakai Joi, Zod, atau express-validator?"
17
+ - "Struktur foldernya gimana? MVC? Clean Architecture?"
18
+ - "Auth-nya gimana?"
19
+
20
+ lapeeh menjawab semua itu dengan **Opinionated Defaults**:
21
+
22
+ 1. **Database**: Agnostic (Bebas pilih: Prisma, TypeORM, Drizzle, dll).
23
+ 2. **Validasi**: Zod (Validasi skema yang kuat dan mudah dibaca).
24
+ 3. **Struktur**: MVC Modular (Controller, Model, Route terpisah tapi kohesif).
25
+ 4. **Auth**: JWT + RBAC (Role Based Access Control) siap pakai.
26
+
27
+ ## Perbandingan dengan Framework Lain
28
+
29
+ | Fitur | Express (Raw) | NestJS | lapeeh Framework |
30
+ | :----------------- | :----------------------------- | :--------------------------------- | :------------------------------------ |
31
+ | **Learning Curve** | Rendah (tapi bingung struktur) | Tinggi (Angular-style, Decorators) | **Sedang** (Express + Struktur Jelas) |
32
+ | **Boilerplate** | Kosong | Sangat Banyak | **Pas (Ready to use)** |
33
+ | **Type Safety** | Manual | Strict | **Strict (TypeScript Native)** |
34
+ | **Kecepatan Dev** | Lambat (setup manual) | Sedang | **Cepat (CLI Generator)** |
35
+ | **Fleksibilitas** | Sangat Tinggi | Kaku | **Tinggi** |
36
+
37
+ ## Filosofi "The lapeeh Way"
38
+
39
+ 1. **Developer Experience (DX) First**: CLI tools, error message yang jelas, dan hot-reload adalah prioritas.
40
+ 2. **Performance by Default**: Serialisasi JSON cepat (Fastify-style) dan Redis caching terintegrasi.
41
+ 3. **Explicit is Better than Implicit**: Tidak ada "sihir" yang terlalu gelap. Kode controller Anda adalah kode Express biasa yang Anda mengerti.
42
+ 4. **Production Ready**: Security (Helmet, Rate Limit) dan Scalability (Docker, Cluster) bukan pikiran belakangan, tapi bawaan.
43
+
44
+ ## Siklus Hidup Request (Request Lifecycle)
45
+
46
+ Bagaimana lapeeh menangani satu permintaan dari user?
47
+
48
+ 1. **Request Masuk** (`GET /api/users`)
49
+ 2. **Security Middleware**: Helmet (Headers), CORS, Rate Limiter.
50
+ 3. **Global Middleware**: Request Logger, Body Parser (JSON).
51
+ 4. **Routing**: Mencocokkan URL di `src/routes/`.
52
+ 5. **Auth Middleware** (Opsional): Cek token JWT & Role.
53
+ 6. **Validator** (Opsional): Validasi input body/query.
54
+ 7. **Controller**: Logika bisnis utama dijalankan.
55
+ - Panggil Database (via `db` adapter).
56
+ - Panggil Cache (Redis).
57
+ 8. **Serializer**: Data diformat & disanitasi (misal: hide password).
58
+ 9. **Response**: JSON dikirim kembali ke user.
59
+
60
+ ---
61
+
62
+ **Selanjutnya:** Pelajari struktur folder di [Struktur Proyek](STRUCTURE.md).
@@ -0,0 +1,63 @@
1
+ # Referensi Package & Dependencies
2
+
3
+ Dokumen ini menjelaskan fungsi dari setiap library (package) yang terinstall di lapeeh Framework, sehingga Anda mengerti kegunaan "alat-alat" yang ada di dalam kotak peralatan Anda.
4
+
5
+ ## Core Framework (Fondasi)
6
+
7
+ Package-package ini adalah nyawa dari framework ini.
8
+
9
+ | Package | Deskripsi | Kenapa Kita Pakai? |
10
+ | :------------ | :-------------------------------- | :------------------------------------------------------------------------------------------------------ |
11
+ | **`express`** | Web Framework untuk Node.js. | Standar industri, ringan, dan komunitasnya terbesar. |
12
+ | **`dotenv`** | Memuat variabel dari file `.env`. | Agar konfigurasi rahasia (DB password, API Key) tidak di-hardcode. |
13
+ | **`cors`** | Cross-Origin Resource Sharing. | Mengizinkan frontend (React/Vue) dari domain berbeda untuk mengakses API kita. |
14
+ | **`helmet`** | Middleware keamanan HTTP headers. | Melindungi aplikasi dari serangan umum (XSS, Clickjacking) dengan mengatur header HTTP secara otomatis. |
15
+
16
+ ## Database Driver
17
+
18
+ | Package | Deskripsi | Kenapa Kita Pakai? |
19
+ | :------- | :----------------- | :------------------------------------------------ |
20
+ | **`pg`** | Driver PostgreSQL. | Driver native untuk koneksi ke database Postgres. |
21
+
22
+ ## Authentication & Security
23
+
24
+ | Package | Deskripsi | Kenapa Kita Pakai? |
25
+ | :----------------------- | :---------------- | :---------------------------------------------------- |
26
+ | **`jsonwebtoken`** | Implementasi JWT. | Standar token untuk autentikasi stateless (API). |
27
+ | **`bcryptjs`** | Hashing password. | Mengamankan password user di database (satu arah). |
28
+ | **`express-rate-limit`** | Pembatas request. | Mencegah serangan DDoS ringan atau Brute Force login. |
29
+
30
+ ## Utilities & Helper
31
+
32
+ | Package | Deskripsi | Kenapa Kita Pakai? |
33
+ | :------------------------ | :------------------------- | :----------------------------------------------------------------------------- |
34
+ | **`zod`** | Schema validation library. | Memvalidasi input user (req.body) dengan syntax yang kuat dan mudah dibaca. |
35
+ | **`fast-json-stringify`** | Serializer JSON cepat. | Mengubah object ke JSON string 2x-3x lebih cepat dari `JSON.stringify` bawaan. |
36
+ | **`uuid`** | Generator ID unik. | Membuat string acak unik (UUID v4). |
37
+ | **`slugify`** | String formatter. | Mengubah "Judul Artikel Keren" menjadi `judul-artikel-keren` (URL friendly). |
38
+ | **`multer`** | Middleware upload file. | Menangani `multipart/form-data` untuk upload gambar/dokumen. |
39
+ | **`winston`** | Logger library. | Mencatat log aplikasi (error/info) ke file atau console dengan format rapi. |
40
+
41
+ ## Realtime & Caching
42
+
43
+ | Package | Deskripsi | Kenapa Kita Pakai? |
44
+ | :----------------- | :------------------------ | :-------------------------------------------------------------------------------------------- |
45
+ | **`socket.io`** | Library WebSocket. | Fitur komunikasi real-time dua arah (chat, notifikasi live). |
46
+ | **`ioredis`** | Client Redis yang robust. | Driver terbaik untuk Redis di Node.js. |
47
+ | **`ioredis-mock`** | Simulasi Redis di memori. | Memungkinkan development tanpa perlu install Redis server asli (sangat berguna untuk pemula). |
48
+
49
+ ## Development Tools (DevDependencies)
50
+
51
+ Package ini hanya dipakai saat koding, tidak ikut terinstall di server production.
52
+
53
+ | Package | Deskripsi | Fungsi |
54
+ | :--------------- | :-------------------- | :---------------------------------------------------------------------------- |
55
+ | **`typescript`** | Compiler TS. | Mengubah kode `.ts` menjadi `.js`. |
56
+ | **`nodemon`** | Auto-restarter. | Restart server otomatis setiap kita save file. |
57
+ | **`eslint`** | Linter (Polisi Kode). | Mencari potensi error dan variabel yang tidak terpakai. |
58
+ | **`@types/*`** | Definisi Tipe. | Memberikan intellisense (saran kode) untuk library JavaScript biasa. |
59
+ | **`tsc-alias`** | Path resolver. | Mengubah alias `@/core` menjadi path relatif `../core` saat build production. |
60
+
61
+ ---
62
+
63
+ Dengan memahami daftar ini, Anda tahu persis apa yang terjadi di balik layar aplikasi Anda. Tidak ada "Bloatware", setiap package punya tujuan spesifik.