# Laporan Audit Dead Code & Dead File — Cocoa Elfatih

Tanggal: 16 Sep 2026
Scope: `resources/js`, `app/`, `routes/`, `config/`, `database/`, `lang/`, `public/`, `package.json`
Metode: cross-reference import graph (reachability dari entry point `app.tsx` + semua page Inertia), pencocokan nama komponen Inertia dengan `Inertia::render()` / `Route::inertia()`, dan pencarian referensi symbol per symbol.

> Catatan: `resources/js/routes/`, `resources/js/actions/`, `resources/js/wayfinder/` adalah
> file **generated** oleh `@laravel/vite-plugin-wayfinder` — bukan dead code, akan
> ter-regenerate otomatis.

---

## Ringkasan

| Area | Status |
| --- | --- |
| Halaman Inertia (39 pages) | ✅ Bersih — semua punya route |
| Komponen, hook, lib, layout | ✅ Bersih — semua terjangkau dari entry |
| Controller & method Laravel | ✅ Bersih — semua method publik ter-route |
| Model (32), Service (7), FormRequest (24), Enum (3), Notification (3), Middleware (6) | ✅ Bersih — semua terpakai |
| Seeder / Command | ✅ Bersih — semua ter-wire |
| Dead code frontend (symbol) | ⚠️ 2 fungsi mati |
| Dead dependencies (npm) | ❌ 13 paket tidak terpakai |

---

## 1. Dead Code (frontend)

### 1.1 Fungsi mati — `resources/js/lib/compress-image.ts`
Fungsi berikut di-export tapi tidak pernah di-import/dipakai di mana pun:

| Symbol | Lokasi |
| --- | --- |
| `compressImages()` (plural, batch) | `resources/js/lib/compress-image.ts:110` |
| `formatFileSize()` | `resources/js/lib/compress-image.ts:166` |

Yang terpakai hanya `compressImage()` (singular) — dipakai oleh
`rich-text-editor.tsx:666`, `media-picker-dialog.tsx:427`, `admin/media/index.tsx:623`.

**Rekomendasi:** hapus kedua fungsi (atau remove keyword `export` bila ingin disimpan).

### 1.2 Minor — type export yang hanya dipakai internal (opsional)
Type berikut hanya digunakan di file-nya sendiri; keyword `export` tidak diperlukan
(bukan dead code berat, hanya kebersihan API):

- `hooks/use-appearance.tsx` → `ResolvedAppearance`, `Appearance`, `UseAppearanceReturn`
- `hooks/use-clipboard.ts` → `CopiedValue`, `CopyFn`, `UseClipboardReturn`
- `hooks/use-current-url.ts` → `IsCurrentUrlFn`, `IsCurrentOrParentUrlFn`, `WhenCurrentUrlFn`, `UseCurrentUrlReturn`
- `hooks/use-two-factor-auth.ts` → `UseTwoFactorAuthReturn`
- `lib/visitor-tracking.ts` → `getVisitorId()` & `ConsentChoice` (dipakai internal saja)
- `lib/validators/*.ts` → sebagian besar `*FormValues` ✅ terpakai; hanya `SettingType`, `SettingField` bila tidak diimport form

---

## 2. Dead Dependencies (`package.json`)

Semua item di bawah **tidak memiliki satu pun referensi** di `resources/`, `eslint.config.js`, maupun `vite.config.ts`:

### dependencies yang bisa dihapus
| Paket | Alasan |
| --- | --- |
| `embla-carousel-react` | 0 referensi (tidak ada carousel) |
| `cn` | 0 referensi — `lib/utils.ts` sudah pakai `clsx` + `tailwind-merge` |
| `@fontsource/instrument-sans` | 0 referensi — `app.css` hanya import `@fontsource/poppins` |
| `@radix-ui/react-avatar` | ui/avatar.tsx pakai umbrella `radix-ui` |
| `@radix-ui/react-collapsible` | idem |
| `@radix-ui/react-dropdown-menu` | idem |
| `@radix-ui/react-label` | idem |
| `@radix-ui/react-navigation-menu` | idem |
| `@radix-ui/react-separator` | idem |
| `@radix-ui/react-toggle` | idem |
| `@radix-ui/react-toggle-group` | idem |
| `@radix-ui/react-tooltip` | idem |

> Yang **tetap terpakai** (jangan dihapus): `@radix-ui/react-checkbox`, `react-dialog`,
> `react-select`, `react-slot`, `react-switch`, `react-tabs` (diimport langsung oleh
> ui/tabs, switch, dialog, badge, checkbox, select), `radix-ui` (umbrella), `react-is`
> (peer dependency recharts v3).

### devDependencies yang bisa dihapus
| Paket | Alasan |
| --- | --- |
| `concurrently` | 0 referensi — scripts hanya pakai `vite` langsung |

### optionalDependencies (pertahankan / evaluasi)
Binari `*-linux-x64-gnu` / `*-win32-x64-msvc` (rollup, tailwind-oxide, lightningcss)
tidak terpakai di macOS lokal, tapi kemungkinan sengaja untuk build Docker/CI/Windows.
**Jangan dihapus** bila deployment memakai Docker Linux.

---

## 3. File / Artefak Lain

| Item | Status | Catatan |
| --- | --- | --- |
| `public/hot` | Artefak dev Vite | Sudah ada di `.gitignore` (line 19) — boleh dihapus lokal, akan muncul lagi saat `npm run dev` |
| `public/assets-elfatih/image-default.png` | ✅ Terpakai | Fallback gambar di `HomeAboutSection.tsx`, `product-detail.tsx`, `home.tsx` |
| `routes/console.php` (`inspire`) | Stub default Laravel | Opsional dihapus, tidak berdampak |
| `resources/views/errors/*.blade.php` | ✅ Terpakai | Dirender otomatis Laravel untuk HTTP status |
| `lang/vendor/translatable/en/validation.php` | ✅ Terpakai | Dipakai package `astrotomic/laravel-translatable` |
| `Dokumentasi_Instalasi/` | Dokumentasi | Bukan dead code |
| `public/build/` | Build output | Untracked, normal |

---

## 4. Temuan Positif (yang sering jadi false positive — sudah diverifikasi BUKAN dead code)

1. **14 model `*Translation`** (mis. `CertificationTranslation`) tidak pernah
   di-reference by name, tapi dipakai **dinamis** oleh trait
   `Astrotomic\Translatable\Translatable` via konvensi penamaan class.
2. `RobotsController` & `SitemapController` memakai pola invokable
   (`Route::get('/sitemap.xml', SitemapController::class)`) — ter-route di `routes/web.php:26-27`.
3. `settings/appearance.tsx` ter-route via `Route::inertia()` di `routes/settings.php:26`.
4. Kedua command konsol terpakai: `install:features` (composer.json post-scripts),
   `media:dedupe-files` (maintenance manual via artisan).
5. Semua middleware teregistrasi di `bootstrap/app.php`.

---

## 5. Aksi Pembersihan yang Disarankan

```bash
# 1. Hapus 2 fungsi mati di resources/js/lib/compress-image.ts (compressImages, formatFileSize)

# 2. Hapus dead dependencies:
pnpm remove embla-carousel-react cn @fontsource/instrument-sans \
  @radix-ui/react-avatar @radix-ui/react-collapsible @radix-ui/react-dropdown-menu \
  @radix-ui/react-label @radix-ui/react-navigation-menu @radix-ui/react-separator \
  @radix-ui/react-toggle @radix-ui/react-toggle-group @radix-ui/react-tooltip

pnpm remove -D concurrently

# 3. Verifikasi setelah pembersihan:
pnpm build && pnpm lint:check && pnpm types:check
```

---

## 6. Status Eksekusi (16 Sep 2026) — SELESAI ✅

- [x] `compressImages()` & `formatFileSize()` dihapus dari `resources/js/lib/compress-image.ts`
- [x] 12 paket dihapus via `pnpm remove` (concurrently berada di `dependencies`, ikut dihapus)
- [x] `pnpm types:check` → **pass** (0 error)
- [x] `pnpm build` (client + SSR) → **pass**
- [x] `pnpm lint:check` → error turun dari **45 → 24** (21 error ikut terhapus bersama fungsi mati; 24 sisanya pre-existing, bukan dari perubahan ini)

Catatan: working tree sudah berisi WIP user sebelumnya (file PHP terkait Legal/FAQ,
logo, `pages/frontend/faq.tsx`, dll.) — perubahan tersebut bukan bagian dari audit ini.
