// Copies Draco + KTX2/Basis decoder WASM from three.js into public/ so the // runtime paths /draco/ and /basis/ resolve (version-matched to installed three). // Also copies the web-ifc single-thread WASM to public/web-ifc/ for the IFC path. // Runs automatically via `npm install` (postinstall). Safe to re-run. import { cpSync, copyFileSync, existsSync, mkdirSync, rmSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta.url)); const root = resolve(__dirname, '..'); const threeEntry = fileURLToPath(import.meta.resolve('three')); const threeRoot = resolve(dirname(threeEntry), '..'); const libs = resolve(threeRoot, 'examples/jsm/libs'); const targets = [ [resolve(libs, 'draco/gltf'), resolve(root, 'public/draco')], [resolve(libs, 'basis'), resolve(root, 'public/basis')], ]; if (!existsSync(libs)) { console.warn('[copy-decoders] three not installed yet — skipping (will run on next install).'); process.exit(0); } for (const [src, dest] of targets) { if (!existsSync(src)) { console.warn(`[copy-decoders] source missing: ${src}`); continue; } rmSync(dest, { force: true, recursive: true }); mkdirSync(dest, { recursive: true }); cpSync(src, dest, { recursive: true }); console.log(`[copy-decoders] ${src} -> ${dest}`); } // web-ifc single-thread WASM (+ MT build if present) for the IFC load path. const ifcEntry = fileURLToPath(import.meta.resolve('web-ifc')); const ifcSrcDir = dirname(ifcEntry); const ifcDest = resolve(root, 'public/web-ifc'); if (existsSync(ifcSrcDir)) { mkdirSync(ifcDest, { recursive: true }); for (const wasm of ['web-ifc.wasm', 'web-ifc-mt.wasm']) { const src = resolve(ifcSrcDir, wasm); if (!existsSync(src)) continue; copyFileSync(src, resolve(ifcDest, wasm)); console.log(`[copy-decoders] ${src} -> ${resolve(ifcDest, wasm)}`); } } else { console.warn('[copy-decoders] web-ifc not installed yet — skipping IFC wasm.'); }