/** * Copie les décodeurs Draco et KTX2 de three.js dans `public/libs/`. * * Pourquoi une copie et pas un CDN : règle 1 de la décision D3 — le viewer doit * être un jeu de fichiers statiques servable depuis une origine locale, donc * embarquable dans les assets d'une app Flutter et utilisable hors ligne. Un * décodeur chargé depuis un CDN casse exactement ça, et il le casse sur site, * dans un musée sans wifi. */ import { cp, mkdir } from 'node:fs/promises'; import { existsSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; const here = dirname(fileURLToPath(import.meta.url)); const root = resolve(here, '..'); const sources = [ ['node_modules/three/examples/jsm/libs/draco/gltf', 'public/libs/draco'], ['node_modules/three/examples/jsm/libs/basis', 'public/libs/basis'], ]; for (const [from, to] of sources) { const source = resolve(root, from); if (!existsSync(source)) { console.warn(`[libs] ${from} introuvable - lance d'abord npm install`); continue; } const target = resolve(root, to); await mkdir(dirname(target), { recursive: true }); await cp(source, target, { recursive: true }); console.log(`[libs] ${from} -> ${to}`); }