lapeh 2.4.4 → 2.4.6

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.
@@ -0,0 +1,73 @@
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).
@@ -0,0 +1,97 @@
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-28] - Minggu, 28 Desember 2025 - Perbaikan Kompatibilitas & Automasi
6
+
7
+ ### 🛠️ Perbaikan Bug (Bug Fixes)
8
+
9
+ - **Linux/Mac Path Compatibility (v2.4.1)**:
10
+
11
+ - Memperbaiki masalah `MODULE_NOT_FOUND` pada sistem operasi Linux dan macOS ketika path proyek mengandung spasi (misalnya: `/Folder Saya/Proyek Lapeh`).
12
+ - Mengubah logika escaping argumen pada `nodemon` di `bin/index.js` agar menggunakan _single quotes_ pada sistem berbasis Unix.
13
+
14
+ - **Auto Prisma Generate (v2.4.2)**:
15
+
16
+ - Memperbaiki error `Cannot find module '.prisma/client/default'` yang sering muncul setelah instalasi bersih.
17
+ - Menambahkan eksekusi otomatis `npx prisma generate` saat menjalankan perintah `npm run dev` dan `npm run build`.
18
+ - Memastikan Prisma Client selalu tersedia sebelum server berjalan, meningkatkan pengalaman pengguna baru.
19
+
20
+ - **PM2 Ecosystem Config (v2.4.4)**:
21
+ - Menambahkan file `ecosystem.config.js` secara otomatis ke dalam proyek baru dan proyek yang di-upgrade.
22
+ - File ini berisi konfigurasi siap pakai untuk menjalankan aplikasi dalam mode **Cluster** (load balancing) di production menggunakan PM2.
23
+ - Memperbarui dokumentasi `doc/DEPLOYMENT.md` dengan instruksi penggunaan PM2 yang baru.
24
+
25
+ ## [2025-12-27] - Code Quality & Standardization Update
26
+
27
+ ### 🚀 Fitur & Standarisasi
28
+
29
+ - **Standardized Import Paths**:
30
+ - Implementasi path alias `@/` untuk import yang lebih bersih (e.g., `import { prisma } from "@/core/database"`).
31
+ - Penghapusan penggunaan relative paths yang dalam (`../../../`).
32
+ - Konfigurasi `tsconfig.json` tanpa `baseUrl` (mengikuti standar TypeScript 6.0+).
33
+ - **Strict Linting & Code Quality**:
34
+ - Implementasi aturan **ESLint** ketat untuk mencegah "Dead Code".
35
+ - Error otomatis untuk variabel, parameter, dan import yang tidak digunakan (`no-unused-vars`).
36
+ - Script `npm run lint` dan `npm run lint:fix` untuk pembersihan kode otomatis.
37
+ - **Fastify-Style Standardization**:
38
+ - Penerapan standar respon cepat (`sendFastSuccess`) di seluruh controller (`AuthController`, `RbacController`, `PetController`).
39
+ - Penggunaan **Schema-based Serialization** untuk performa JSON maksimal.
40
+ - Konversi otomatis `BigInt` ke `string` dalam respon JSON.
41
+
42
+ ## [2025-12-27] - High Performance & Scalability Update
43
+
44
+ ### 🚀 Fitur Baru
45
+
46
+ - **High Performance Serialization (Fastify-Style)**:
47
+ - Implementasi `fast-json-stringify` untuk serialisasi JSON super cepat (2x-3x lebih cepat dari `JSON.stringify`).
48
+ - Helper `sendFastSuccess` di `src/utils/response.ts` untuk mem-bypass overhead Express.
49
+ - Caching schema serializer otomatis di `src/core/serializer.ts`.
50
+ - **Scalability & Clustering**:
51
+ - Dukungan **Load Balancing** dengan Nginx.
52
+ - Dukungan **Redis Clustering** untuk Rate Limiter (`rate-limit-redis`).
53
+ - File konfigurasi `docker-compose.cluster.yml` untuk simulasi cluster lokal (1 Nginx + 2 App Instances + 1 Redis).
54
+ - **Smart Error Handling**:
55
+ - Deteksi otomatis port bentrok (`EADDRINUSE`) saat startup.
56
+ - Memberikan saran command _copy-paste_ untuk mematikan process yang memblokir port (support Windows, Mac, Linux).
57
+ - **SEO Optimization**:
58
+ - Update metadata `package.json` dan `README.md` agar framework lebih mudah ditemukan di Google/NPM.
59
+
60
+ ## [2025-12-27] - Pembaruan Struktur & Validasi
61
+
62
+ ### 🚀 Fitur Baru
63
+
64
+ - **Laravel-style Validator**:
65
+ - Implementasi utility `Validator` baru di `src/utils/validator.ts` yang meniru gaya validasi Laravel.
66
+ - Mendukung rule string seperti `required|string|min:3|email`.
67
+ - Penambahan rule `unique` untuk pengecekan database otomatis (Prisma).
68
+ - Penambahan rule `mimes`, `image`, `max` (file size) untuk validasi upload file.
69
+ - Penambahan rule `sometimes` untuk field opsional.
70
+ - **Framework Hardening (Keamanan & Stabilitas)**:
71
+ - **Rate Limiting**: Middleware anti-spam/brute-force di `src/middleware/rateLimit.ts`.
72
+ - **Request Logger**: Pencatatan log request masuk di `src/middleware/requestLogger.ts`.
73
+ - **Health Check**: Endpoint `/` kini mengembalikan status kesehatan server.
74
+ - **Graceful Shutdown**: Penanganan penutupan koneksi Database dan Redis yang aman saat server berhenti (`SIGTERM`/`SIGINT`).
75
+ - **Environment Validation**: Validasi variabel `.env` wajib (seperti `DATABASE_URL`, `JWT_SECRET`) saat startup.
76
+ - **Struktur Folder Baru**:
77
+ - Pemisahan konfigurasi inti ke `src/core/` (`server.ts`, `database.ts`, `redis.ts`, `realtime.ts`) agar folder `src` lebih bersih.
78
+ - Sentralisasi route di `src/routes/index.ts` (WIP).
79
+ - **CLI Improvements**:
80
+ - `npx lapeh <project-name> --full` kini otomatis menjalankan server dev setelah instalasi selesai, sehingga user bisa langsung melihat hasil tanpa mengetik perintah tambahan.
81
+
82
+ ### 🛠️ Perbaikan & Refactoring
83
+
84
+ - **Controller Refactoring**:
85
+ - `AuthController`: Migrasi ke `Validator` baru, termasuk validasi upload avatar.
86
+ - `PetController`: Migrasi ke `Validator` baru.
87
+ - `RbacController`: Migrasi sebagian ke `Validator` baru.
88
+ - **Pembersihan**:
89
+ - Penghapusan folder `src/schema/` (Zod schema lama) karena sudah digantikan oleh `Validator` utility.
90
+ - Penghapusan file duplikat/lama di root `src/` setelah migrasi ke `src/core/`.
91
+
92
+ ### 📝 Catatan Teknis
93
+
94
+ - **Validator Async**: Method `fails()`, `passes()`, dan `validated()` kini bersifat `async` untuk mendukung pengecekan database (`unique`).
95
+ - **Type Safety**: Semua perubahan telah diverifikasi dengan `npm run typecheck`.
96
+
97
+ ---
@@ -0,0 +1,94 @@
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
+ ```
package/doc/CLI.md ADDED
@@ -0,0 +1,139 @@
1
+ # CLI Tools & Scripts
2
+
3
+ Lapeh Framework dilengkapi dengan berbagai script CLI untuk mempercepat proses development, mulai dari generate code hingga manajemen database.
4
+
5
+ Semua perintah dijalankan menggunakan `npm run <command>`.
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
+
40
+ ## Code Generators
41
+
42
+ Gunakan perintah ini untuk membuat file boilerplate secara otomatis.
43
+
44
+ ### 1. Membuat Module Lengkap (`make:module`)
45
+ Membuat Controller, Route, dan Model (Schema) sekaligus.
46
+
47
+ ```bash
48
+ npm run make:module <nama-module>
49
+ ```
50
+ **Contoh:** `npm run make:module Product`
51
+
52
+ Output:
53
+ - `src/controllers/productController.ts`
54
+ - `src/routes/product.ts`
55
+ - `src/models/product.prisma`
56
+
57
+ ### 2. Membuat Controller (`make:controller`)
58
+ Hanya membuat file controller dengan method CRUD dasar.
59
+
60
+ ```bash
61
+ npm run make:controller <nama-controller>
62
+ ```
63
+ **Contoh:** `npm run make:controller Order` (Akan membuat `src/controllers/orderController.ts`)
64
+
65
+ ### 3. Membuat Model Database (`make:model`)
66
+ Hanya membuat file schema Prisma baru.
67
+
68
+ ```bash
69
+ npm run make:model <nama-model>
70
+ ```
71
+ **Contoh:** `npm run make:model Transaction` (Akan membuat `src/models/transaction.prisma`)
72
+
73
+ ## Database Management (Prisma)
74
+
75
+ Framework ini menggunakan sistem **Multi-File Schema**. Anda tidak mengedit `schema.prisma` secara langsung, melainkan mengedit file kecil di `src/models/*.prisma`.
76
+
77
+ ### 1. Migrasi Database (`prisma:migrate`)
78
+ Jalankan setiap kali Anda mengubah definisi model di `src/models/*.prisma`.
79
+
80
+ ```bash
81
+ npm run prisma:migrate
82
+ ```
83
+ Perintah ini akan:
84
+ 1. Menggabungkan semua file `.prisma` di `src/models/` menjadi satu `prisma/schema.prisma`.
85
+ 2. Membuat file migrasi SQL.
86
+ 3. Menerapkan perubahan ke database lokal.
87
+ 4. Men-generate ulang Prisma Client (Type Definitions).
88
+
89
+ ### 2. Deploy ke Production (`prisma:deploy`)
90
+ Gunakan di server production. Hanya menerapkan migrasi yang sudah ada tanpa reset data.
91
+
92
+ ```bash
93
+ npm run prisma:deploy
94
+ ```
95
+
96
+ ### 3. Database Studio (`db:studio`)
97
+ Membuka GUI di browser untuk melihat dan mengedit data database.
98
+
99
+ ```bash
100
+ npm run db:studio
101
+ ```
102
+
103
+ ### 4. Seeding Data (`db:seed`)
104
+ Mengisi database dengan data awal yang didefinisikan di `prisma/seed.ts`.
105
+
106
+ ```bash
107
+ npm run db:seed
108
+ ```
109
+
110
+ ### 5. Reset Database (`db:reset`)
111
+ **PERINGATAN:** Menghapus semua data dan tabel, lalu menjalankan migrasi dari awal.
112
+
113
+ ```bash
114
+ npm run db:reset
115
+ ```
116
+
117
+ ## Code Quality & Utilities
118
+
119
+ ### 1. Linting (`lint`)
120
+ Memeriksa kode dari error, variabel tidak terpakai, dan gaya penulisan.
121
+
122
+ ```bash
123
+ npm run lint
124
+ ```
125
+ Gunakan `npm run lint:fix` untuk memperbaiki error otomatis.
126
+
127
+ ### 2. Type Check (`typecheck`)
128
+ Memeriksa error tipe data TypeScript tanpa melakukan compile.
129
+
130
+ ```bash
131
+ npm run typecheck
132
+ ```
133
+
134
+ ### 3. Generate JWT Secret (`generate:jwt`)
135
+ Membuat random string aman untuk `JWT_SECRET` di file `.env`.
136
+
137
+ ```bash
138
+ npm run generate:jwt
139
+ ```
@@ -0,0 +1,105 @@
1
+ # Panduan Kontribusi (Contributing Guide)
2
+
3
+ Terima kasih atas ketertarikan Anda untuk berkontribusi pada pengembangan **Lapeh Framework**! 🎉
4
+
5
+ Proyek ini bersifat **Open Source** dan kami sangat menghargai setiap bentuk kontribusi, baik itu perbaikan bug, penambahan fitur, dokumentasi, maupun sekadar laporan error (issue).
6
+
7
+ Dokumen ini akan memandu Anda tentang cara berkontribusi dengan benar dan efisien.
8
+
9
+ ## 🚀 Memulai Kontribusi
10
+
11
+ ### 1. Persiapan Lingkungan (Prerequisites)
12
+ Pastikan Anda sudah menginstal:
13
+ - **Node.js** (v18 ke atas)
14
+ - **Git**
15
+ - **Code Editor** (VS Code disarankan, dengan ekstensi ESLint & Prettier)
16
+
17
+ ### 2. Fork & Clone Repository
18
+ 1. **Fork** repository ini ke akun GitHub Anda (tombol "Fork" di pojok kanan atas).
19
+ 2. **Clone** hasil fork ke komputer lokal Anda:
20
+ ```bash
21
+ git clone https://github.com/USERNAME_ANDA/lapeh.git
22
+ cd lapeh
23
+ ```
24
+ 3. **Tambahkan Remote Upstream** (agar bisa sinkron dengan repo asli):
25
+ ```bash
26
+ git remote add upstream https://github.com/robyajo/lapeh.git
27
+ ```
28
+
29
+ ### 3. Instalasi Dependencies
30
+ ```bash
31
+ npm install
32
+ ```
33
+ Jangan lupa jalankan setup awal untuk database lokal (pastikan PostgreSQL/MySQL jalan):
34
+ ```bash
35
+ cp .env.example .env
36
+ npm run prisma:migrate
37
+ npm run db:seed
38
+ ```
39
+
40
+ ## 🛠️ Workflow Pengembangan
41
+
42
+ ### 1. Buat Branch Baru
43
+ Jangan bekerja langsung di branch `main`. Buat branch baru yang deskriptif:
44
+ ```bash
45
+ git checkout -b feature/tambah-validasi-email
46
+ # atau
47
+ git checkout -b fix/typo-dokumentasi
48
+ ```
49
+
50
+ ### 2. Standar Koding (Coding Standards)
51
+ Kami menerapkan aturan yang ketat demi menjaga kualitas kode.
52
+ - **TypeScript**: Gunakan tipe data eksplisit. Hindari `any` sebisa mungkin.
53
+ - **Linter**: Pastikan tidak ada error ESLint. Variabel tidak terpakai harus dihapus atau diberi prefix `_`.
54
+ - **Formatter**: Kode harus rapi.
55
+
56
+ Sebelum commit, **WAJIB** jalankan perintah ini untuk memastikan kode Anda bersih:
57
+ ```bash
58
+ npm run typecheck # Cek error TypeScript
59
+ npm run lint # Cek error Linter
60
+ ```
61
+
62
+ ### 3. Commit Message Convention
63
+ Gunakan format **Conventional Commits** agar history mudah dibaca:
64
+ - `feat: ...` untuk fitur baru.
65
+ - `fix: ...` untuk perbaikan bug.
66
+ - `docs: ...` untuk perubahan dokumentasi.
67
+ - `chore: ...` untuk perubahan kecil (config, script).
68
+ - `refactor: ...` untuk perbaikan struktur kode tanpa mengubah fitur.
69
+
70
+ **Contoh:**
71
+ ```text
72
+ feat: add email validation rule to validator
73
+ fix: resolve EADDRINUSE error on windows
74
+ docs: update installation guide
75
+ ```
76
+
77
+ ## 📮 Mengirim Pull Request (PR)
78
+
79
+ 1. **Push** branch Anda ke GitHub:
80
+ ```bash
81
+ git push origin feature/nama-fitur
82
+ ```
83
+ 2. Buka repository fork Anda di GitHub, lalu klik **Compare & pull request**.
84
+ 3. Isi judul dan deskripsi PR dengan jelas:
85
+ - Jelaskan apa yang Anda ubah.
86
+ - Sertakan screenshot (jika ada perubahan visual/output).
87
+ - Referensikan Issue jika ada (contoh: `Closes #123`).
88
+ 4. Tunggu review dari maintainer. Kami mungkin akan meminta revisi kecil.
89
+ 5. Setelah disetujui, kode Anda akan di-merge! 🚀
90
+
91
+ ## 🐛 Melaporkan Bug (Issues)
92
+
93
+ Jika Anda menemukan bug tapi belum bisa memperbaikinya, silakan buat **Issue** baru.
94
+ - Gunakan judul yang jelas.
95
+ - Jelaskan langkah-langkah untuk mereproduksi bug (Steps to Reproduce).
96
+ - Sertakan log error atau screenshot.
97
+ - Sebutkan versi Node.js dan OS yang digunakan.
98
+
99
+ ## 💡 Ide & Diskusi
100
+
101
+ Punya ide fitur baru? Jangan ragu untuk membukanya di **GitHub Discussions** atau buat Issue dengan label `enhancement` sebelum mulai koding, agar kita bisa mendiskusikan desainnya terlebih dahulu.
102
+
103
+ ---
104
+
105
+ Selamat berkontribusi! Kode Anda akan membantu developer lain membangun aplikasi dengan lebih cepat dan menyenangkan. ❤️