2
Arsitektur Modul
Repository ini tidak memakai framework web atau runtime server. Seluruh kode program berada di src/ dan dijalankan sebagai dua skrip CLI terpisah: start memanggil bun run src/build.ts, sedangkan check memanggil bun run src/check.ts (package.json:36-421). Keduanya duduk di atas satu lapisan helper (src/utils/) dan satu berkas kontrak tipe (src/types.ts), sementara data/ menyimpan isi daftar API yang menjadi sumber kebenaran.
Peta ketergantungan antar modul
Diagram berikut memetakan empat kelompok modul beserta simbol yang benar-benar menyeberang batas modul. Garis putus-putus menandai impor tipe saja, yang hilang saat kompilasi.
graph TD
build["src/build.ts<br/>pipeline markdown"]
check["src/check.ts<br/>validator data"]
files["src/utils/index.ts<br/>getFiles · getLanguage · isBlacklisted · resolve"]
markdown["src/utils/markdown.ts<br/>translate · markdownBuilder · generateToc"]
types["src/types.ts<br/>CategoryType · ListType"]
data["data/<kategori>/id.json · en.json"]
srcdata["src/data/blacklist.json · vocabularies.json"]
build -->|"generateToc, markdownBuilder"| markdown
build -->|"getFiles, getLanguage, isBlacklisted, resolve"| files
check -->|"getFiles, isBlacklisted"| files
build -.->|"CategoryType, ListType"| types
check -.->|"CategoryType"| types
markdown -.->|"CategoryType"| types
markdown -->|"vocabularies.json"| srcdata
files -->|"blacklist.json"| srcdata
files -->|"readdir rekursif berkas .json"| data
build -->|"Bun.write per berkas kategori"| data
style build fill:#2d7d46,color:#fff
style check fill:#dc2626,color:#fff
style files fill:#8b5cf6,color:#fff
style markdown fill:#8b5cf6,color:#fff
style types fill:#f59e0b,color:#000
style data fill:#336791,color:#fff
style srcdata fill:#336791,color:#fff
%% fig: Ketergantungan empat modul utama
%% desc: Dua entry point CLI memakai helper yang sama, membaca data/ lewat getFiles, dan hanya build.ts yang menulis kembali berkas kategori.Peran tiap modul
| Modul | Peran | Simbol yang menyeberang batas modul | Rujukan |
|---|---|---|---|
src/build.ts | pipeline: membaca data/, merakit markdown, menulis README | markdownBuilder, generateToc, getFiles, getLanguage, isBlacklisted, resolve | src/build.ts:1-102 |
src/check.ts | validator: tolak duplikat documentationUrl, wajibkan documentationUrl, hentikan proses bila konten NSFW | getFiles, isBlacklisted | src/check.ts:1-73 |
src/utils/index.ts | helper berkas dan filter: resolve, getLanguage, getFiles, isBlacklisted | dipakai kedua entry point | src/utils/index.ts:5-374 |
src/utils/markdown.ts | helper markdown: translate, markdownBuilder, generateToc | hanya dipakai src/build.ts | src/utils/markdown.ts:4-575 |
src/types.ts | kontrak tipe kategori dan daftar | CategoryType, ListType | src/types.ts:1-176 |
data/ | sumber kebenaran: satu direktori per kategori | dibaca getFiles() | data/general/id.json:1-37 |
src/data/ | data pendukung helper: blacklist.json, vocabularies.json | dibaca isBlacklisted dan translate | src/data/blacklist.json:18 |
Arah impor satu arah
Lapisan helper tidak pernah mengimpor entry point. src/utils/index.ts hanya mengimpor path, fs/promises, dan ../data/blacklist.json (src/utils/index.ts:1-39). src/utils/markdown.ts hanya mengimpor ../types dan ../data/vocabularies.json (src/utils/markdown.ts:1-210). Di sisi lain, src/build.ts mengimpor ./utils/markdown dan ./utils (src/build.ts:1-511), dan src/check.ts mengimpor ./utils saja, tanpa ./utils/markdown (src/check.ts:1-412). Kedua entry point juga tidak saling mengimpor, sehingga keduanya bisa dijalankan sendiri-sendiri lewat bun start atau bun check.
State di level modul
Tidak ada fungsi main. src/build.ts menyimpan state di scope modul: data, crawledx, crawled, dan agent (src/build.ts:7-1013), lalu langsung menjalankan loop pembacaan berkas di top level (src/build.ts:13-1514). src/check.ts memakai pola yang sama dengan crawled dan agent (src/check.ts:6-715). Karena itu setiap berkas entry point adalah program utuh: mengimpornya berarti menjalankan efek sampingnya, bukan mengambil fungsi darinya.
data/ sebagai sumber kebenaran
getFiles() menelusuri direktori data/ secara rekursif dan mengumpulkan setiap berkas berakhiran .json (src/utils/index.ts:13-3316). Setiap kategori berupa satu direktori dengan satu berkas per bahasa: data/general/id.json untuk bahasa Indonesia (data/general/id.json:1-37) dan data/general/en.json untuk bahasa Inggris (data/general/en.json:1-3). Objek yang sama juga dipakai balik sebagai tipe CategoryType saat dibaca dengan Bun.file(file).json() di kedua entry point (src/build.ts:13-15, src/check.ts:9-10). Setelah kategori disusun, src/build.ts menulis kembali berkas itu lewat Bun.write (src/build.ts:77).
Dua helper dengan beban berbeda
markdownBuilder(categories, language) merakit tabel markdown per kategori: baris header dari translate(), baris pemisah | - | - | - | - | - | - |, lalu satu baris per API (src/utils/markdown.ts:8-3320). generateToc(markdown) tidak menyentuh data/ sama sekali; ia memindai string markdown yang sudah jadi lewat regex ^(#{1,6})\s+(.+)$ dan menyusun daftar bersarang (src/utils/markdown.ts:35-5721). Pemisahan ini menjelaskan mengapa src/check.ts cukup mengimpor getFiles dan isBlacklisted. Rincian tiap helper ada di Helper Markdown dan Daftar Isi dan Helper Berkas dan Filter Blacklist.
Berkas pendukung di src/data/
blacklist.json dan vocabularies.json bukan bagian dari daftar kategori, karena keduanya tinggal di src/data/, di luar data/. isBlacklisted mencocokkan substring HTML terhadap isi blacklist (src/utils/index.ts:35-3722), dan berkas itu berisi tiga kata kunci (src/data/blacklist.json:18). translate mengambil label kolom per bahasa dari vocabularies (src/utils/markdown.ts:4-623).
Kontrak tipe bersama
src/types.ts mendefinisikan ItemType yang tidak diekspor, lalu mengekspor CategoryType (
categoryName dan apis) serta ListType yang memetakan kode bahasa ke daftar kategori (src/types.ts:1-176). ListType hanya dipakai src/build.ts untuk mengumpulkan hasil per bahasa (src/build.ts:7-1013), sedangkan src/check.ts cukup memakai CategoryType (src/check.ts:1-412).
⚠️
package.jsonmasih memuat"module": "src/builder.ts"(package.json:824), padahalsrc/hanya berisibuild.ts,check.ts,types.ts, dan dua direktori. Jalur eksekusi yang benar selalu lewatscripts(package.json:36-421), bukan fieldmoduleitu. Jangan menganggapsrc/builder.tsada.
Tahap yang dijalankan src/build.ts dibahas di Pipeline Build Markdown dan Mode Rewrite dan Status API. Aturan yang ditegakkan src/check.ts ada di Validator Data lewat check.ts, bentuk berkas di data/ ada di Skema Data Kategori, dan modul mana yang dijalankan CI ada di Otomasi GitHub Actions.