Lompat ke konten
dokumentasi.id
Commit 120a248
v1
Star0

Ada commit baru di branch utama.

0792dcf

11

Pengujian dan Deploy

Repository ini tidak memakai pipeline CI. Semua pemeriksaan dijalankan lewat npm script yang sama di mesin lokal, lalu npm run deploy membangun Worker OpenNext dan mengirimkannya ke Cloudflare (package.json:6-20). README menetapkan urutan npm test, npm run lint, npm run typecheck, dan npm run build sebagai rangkaian verifikasi sebelum deploy (README.md:43-50).

Perintah verifikasi

PerintahYang dijalankanFungsiSumber
npm testvitest runmenjalankan seluruh berkas uji satu kali lalu keluarpackage.json:13
npm run test:watchvitestmode watch untuk pengembanganpackage.json:14
npm run linteslint .aturan eslint-config-next dengan globalIgnores untuk .next, .open-next, .wrangler, node_modules, dan worker-configuration.d.tspackage.json:11, eslint.config.mjs:5-15
npm run typechecktsc --noEmitmemeriksa tipe tanpa menulis keluaranpackage.json:12
npm run buildprebuild lalu next buildmembangun halaman statis Nextpackage.json:8-9
npm run previewopennextjs-cloudflare build && opennextjs-cloudflare previewmembangun lalu menjalankan Worker secara lokalpackage.json:15
npm run deployopennextjs-cloudflare build && opennextjs-cloudflare deploymembangun lalu mengirim Worker ke Cloudflarepackage.json:16
npm run uploadopennextjs-cloudflare build && opennextjs-cloudflare uploadmembangun lalu mengunggah Worker tanpa deploypackage.json:17

prebuild menjalankan npm run cf-typegen, yaitu wrangler types --env-interface CloudflareEnv (package.json:8-9, package.json:18). Karena itu npm run build selalu memakai tipe CloudflareEnv terbaru sebelum next build membaca worker.ts. Script quran:build berdiri di luar rangkaian verifikasi; ia hanya dipakai saat data Qur'an dibangun ulang, seperti dijelaskan di Data Qur'an dan Mushaf (package.json:19).

Modul yang dijaga oleh test

vitest.config.ts memasang alias @ ke ./src dan hanya mengambil berkas tests/**/*.test.ts (vitest.config.ts:4-11). Tidak ada test yang menyentuh Worker atau jaringan; semuanya memanggil fungsi di src/lib, sehingga npm test tidak butuh hasil build.

Berkas ujiModul yang dipanggilYang dikunci
tests/lessons.test.tslistAllLessons, listLessons, getLesson, contentBlocks, drillRows, practiceSections, soundKeyslug unik, urutan position per kategori, dan batas panjang title, summary, content (tests/lessons.test.ts:17-24); contentBlocks menandai paragraf yang seluruhnya Arab (tests/lessons.test.ts:34-42)
tests/practice-curriculum.test.tspracticeParts, practicePart, PRACTICE_TOTAL, groupByPart39 praktik terbagi menjadi bagian 1–7, 8–18, 19–29, dan 30–39 (tests/practice-curriculum.test.ts:10-21)
tests/practice-curriculum.test.tspracticeSections atas data src/data/praktik-*setiap praktik punya guide dan latihan berlabel Latihan A, Latihan B, Latihan C, dengan bagian terakhir bertanda setor ke guru (tests/practice-curriculum.test.ts:85-95); huruf tebal tidak pernah dibaca o (tests/practice-curriculum.test.ts:103-110)
tests/lesson-layout.test.tslessonLayout, verseParts, arabicRuns, exampleGroups, readingMinutespemisahan pengantar, bagian bernomor, grup, dan rujukan pada format konten (tests/lesson-layout.test.ts:7-27)
tests/meeting-plan.test.tsmeetingPlan, meetingDrills, meetingPageslangkah materi, drills, mushaf, task terbaca berurutan dari satu content (tests/meeting-plan.test.ts:22-33)
tests/quran.test.tslistPagesAyahs, listAyahsByRef, meetingPlan, meetingDrills, meetingPagessetiap ayat dan halaman yang dipakai pertemuan Lanjutan ada di src/data/quran.json (tests/quran.test.ts:8-14, tests/quran.test.ts:25-33)
tests/practice-progress.test.tsparseProgress, visitPractice, toggleSection, resetPractice, overallProgressprogres rusak jatuh ke emptyProgress dan tanda di luar jumlah latihan dibuang, sesuai progres belajar (tests/practice-progress.test.ts:5-18)
tests/quiz.test.tsquizBanks, drawQuiz, recordScore, parseScores, QUIZ_LENGTHsetiap bank punya minimal QUIZ_LENGTH * 5 soal dengan empat opsi unik dan lesson yang benar-benar ada (tests/quiz.test.ts:12-26); skor terbaik dipertahankan bersama jumlah percobaan (tests/quiz.test.ts:52-57)

Dari build ke Worker

npm run deploy tidak menambahkan apa pun pada next build. Perintah itu memanggil opennextjs-cloudflare build untuk menghasilkan .open-next/, lalu opennextjs-cloudflare deploy yang membaca wrangler.jsonc dan mengirim Worker (package.json:16). .open-next/worker.js baru ada setelah langkah build itu, dan worker.ts mengimpornya dengan @ts-ignore supaya npm run typecheck tetap bisa jalan sebelum ada build (worker.ts:1-10).

sequenceDiagram
  actor Dev
  participant NPM as npm scripts
  participant ESLint as eslint
  participant TSC as tsc
  participant Vitest as vitest
  participant ON as opennextjs-cloudflare
  participant CF as Cloudflare Workers
  Dev->>NPM: npm test / lint / typecheck
  NPM->>Vitest: berkas .test.ts di tests/
  NPM->>ESLint: eslint .
  NPM->>TSC: tsc --noEmit
  Vitest-->>Dev: lulus atau gagal
  Dev->>NPM: npm run deploy
  NPM->>ON: opennextjs-cloudflare build
  ON->>ON: tulis .open-next/worker.js dan .open-next/assets
  ON->>CF: opennextjs-cloudflare deploy memakai wrangler.jsonc
  CF-->>Dev: Worker quran-academy aktif
  style ON fill:#f59e0b,color:#000
  style CF fill:#336791,color:#fff
  style Vitest fill:#2d7d46,color:#fff
%% fig: Alur verifikasi sampai deploy
%% desc: Perintah uji, lint, dan typecheck berjalan lokal, lalu opennextjs-cloudflare membangun .open-next dan mengirimnya ke Cloudflare.
Fig. 1: Alur verifikasi sampai deployPerintah uji, lint, dan typecheck berjalan lokal, lalu opennextjs-cloudflare membangun .open-next dan mengirimnya ke Cloudflare.
Kunci di wrangler.jsoncNilaiArti
namequran-academynama Worker yang dituju deploy (wrangler.jsonc:3)
mainworker.tsentry Worker, bukan berkas hasil build (wrangler.jsonc:4)
compatibility_date2026-10-19tanggal acuan perilaku runtime Workers (wrangler.jsonc:5)
compatibility_flags["nodejs_compat"]mengaktifkan API Node di Worker (wrangler.jsonc:6)
assets.directory.open-next/assetsaset statis hasil opennextjs-cloudflare build (wrangler.jsonc:7-9)
assets.bindingASSETSnama binding untuk aset tersebut (wrangler.jsonc:9)

open-next.config.ts memilih staticAssetsIncrementalCache dan menyalakan enableCacheInterception, sehingga halaman prerender beserta RSC payload-nya dilayani dari aset statis, bukan dirender ulang oleh Worker pada setiap request dan prefetch (open-next.config.ts:4-9).

Cache-Control sesudah deploy

Pembungkus worker.ts mengubah satu hal pada response sebelum dikirim: bila Cache-Control memuat s-maxage, header itu ditulis ulang menjadi public, max-age=0, must-revalidate; response lain dikembalikan apa adanya (worker.ts:11-15). Alasannya tercatat di komentar berkas: setelah deploy, stale-while-revalidate membuat browser menampilkan halaman dari build sebelumnya yang chunk CSS-nya sudah tidak ada sehingga muncul 404, sedangkan revalidasi per kunjungan hanya menghasilkan 304 lewat ETag (worker.ts:5-7).

graph TD
  Req["request masuk ke fetch"] --> ONW["openNextWorker.fetch di .open-next/worker.js"]
  ONW --> Resp["Response"]
  Resp --> Check{"Cache-Control memuat s-maxage?"}
  Check -- tidak --> Pass["dikembalikan apa adanya"]
  Check -- ya --> Rewrite["Cache-Control: public, max-age=0, must-revalidate"]
  Rewrite --> Sent["response dikirim ke browser"]
  Pass --> Sent
  style ONW fill:#336791,color:#fff
  style Check fill:#f59e0b,color:#000
  style Rewrite fill:#8b5cf6,color:#fff
  style Pass fill:#2d7d46,color:#fff
  style Sent fill:#2d7d46,color:#fff
%% fig: Penulisan ulang Cache-Control di worker.ts
%% desc: Hanya response yang membawa s-maxage yang headernya diganti menjadi must-revalidate; response lain lewat tanpa perubahan.
Fig. 2: Penulisan ulang Cache-Control di worker.tsHanya response yang membawa s-maxage yang headernya diganti menjadi must-revalidate; response lain lewat tanpa perubahan.

⚠️ npm run deploy tidak menjalankan test, lint, atau typecheck (package.json:16). Apa pun yang ada di working tree saat perintah itu dijalankan langsung masuk ke bundel Worker, jadi jalankan npm test lebih dulu.

⚠️ npm run build hanya menjalankan next build; bundel .open-next/ dan aset .open-next/assets baru dibuat oleh opennextjs-cloudflare build di dalam npm run deploy (package.json:8-9, wrangler.jsonc:7-9). Untuk mencoba hasil build sebelum menyentuh produksi, pakai npm run preview (package.json:15, README.md:52-54).