import { readdirSync, statSync, readFileSync, writeFileSync } from 'fs' import { join, relative, sep } from 'path' const DIST = join(import.meta.dirname, '..', 'dist') const MANIFEST_TEMPLATE = join(import.meta.dirname, '..', 'public', 'imsmanifest.xml') const MANIFEST_OUT = join(DIST, 'imsmanifest.xml') /** * Escanea recursivamente dist/ y genera un por cada archivo, * usando '/' como separador (requerido por SCORM). */ function scanFiles(dir, basePath = '') { const entries = readdirSync(dir) const files = [] for (const entry of entries) { const full = join(dir, entry) const relativePath = basePath ? `${basePath}/${entry}` : entry if (statSync(full).isDirectory()) { files.push(...scanFiles(full, relativePath)) } else if (entry !== 'imsmanifest.xml') { // SCORM usa '/' como separador de ruta files.push(relativePath.split(sep).join('/')) } } return files } // Leer template del manifiesto let manifest = readFileSync(MANIFEST_TEMPLATE, 'utf-8') // Escanear archivos en dist/ const distFiles = scanFiles(DIST) console.log(`📁 Archivos encontrados en dist/: ${distFiles.length}`) // Generar los elements const fileElements = distFiles .map((f) => ` `) .join('\n') // Reemplazar el bloque de resources en el manifiesto // Busca y reemplaza su contenido de manteniendo el resto const resourceRegex = /(]*>)([\s\S]*?)(<\/resource>)/ manifest = manifest.replace(resourceRegex, (_, open, _inner, close) => { return `${open}\n${fileElements}\n ${close}` }) // Escribir manifiesto actualizado en dist/ writeFileSync(MANIFEST_OUT, manifest, 'utf-8') console.log('✅ imsmanifest.xml generado con todos los archivos del build') console.log(` → ${MANIFEST_OUT}`)