1import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "node:fs"
2import path from "node:path"
3import { fileURLToPath } from "node:url"
4
5/* ARCHITECTURE §4 dan §8: Gesture Snap di-host sendiri, tanpa CDN. Berkas
6 wasm-nya disalin dari paket yang versinya dikunci lockfile, bukan disimpan di
7 git: enam berkas `node_modules/@mediapipe/tasks-vision/wasm/` (dua `.js` dan
8 empat `.wasm`, sekitar 39 MB) tidak berubah antar versi paket, jadi
9 menaruhnya di repo hanya menggandakan bobot klon tanpa menambah apa pun.
10
11 Model gesture (`public/models/gesture_recognizer.task`) tetap di-commit: ia
12 diunduh dari dokumentasi resmi Google dan tidak bisa dibuat ulang dari
13 paket, jadi klon bersih harus tetap bisa menjalankan Gesture Snap luring.
14
15 Idempoten: berkas tujuan yang ukurannya sama dengan sumber tidak disalin
16 ulang, jadi `npm install` berulang tidak menyentuh mtime. Gagal dengan
17 peringatan, bukan galat, bila paket MediaPipe tidak ada: tanpa paket itu,
18 yang hilang hanyalah aset wasm, bukan seluruh pemasangan. */
19
20const root = fileURLToPath(new URL("..", import.meta.url))
21const sumber = path.join(root, "node_modules", "@mediapipe", "tasks-vision", "wasm")
22const tujuan = path.join(root, "public", "mediapipe", "wasm")
23
24if (!existsSync(sumber)) {
25 console.warn(
26 "copy-mediapipe-wasm: node_modules/@mediapipe/tasks-vision/wasm tidak ada, aset dilewati"
27 )
28 process.exit(0)
29}
30
31mkdirSync(tujuan, { recursive: true })
32
33let disalin = 0
34let dilewati = 0
35for (const nama of readdirSync(sumber)) {
36 const asal = path.join(sumber, nama)
37 const akhir = path.join(tujuan, nama)
38 if (!statSync(asal).isFile()) continue
39 if (existsSync(akhir) && statSync(akhir).size === statSync(asal).size) {
40 dilewati += 1
41 continue
42 }
43 copyFileSync(asal, akhir)
44 disalin += 1
45}
46
47console.log(
48 `copy-mediapipe-wasm: ${disalin} berkas disalin, ${dilewati} sudah ada di public/mediapipe/wasm`
49)
50