Files
KArtSell.Aegis/docs/Design/kbx-foundation-v36/scripts/generate-app-screen-registry.mjs
T

35 lines
1.5 KiB
JavaScript

import fs from 'node:fs'
import path from 'node:path'
const root = process.cwd()
const sourceRoot = path.join(root, 'apps/web/src/modules')
const out = path.join(root, 'apps/web/src/registry/screens.generated.ts')
function walk(dir) {
return fs.readdirSync(dir, { withFileTypes: true }).flatMap(entry => {
const full = path.join(dir, entry.name)
return entry.isDirectory() ? walk(full) : [full]
})
}
const entries = []
for (const file of walk(sourceRoot).filter(f => /definition\.ts$/.test(f))) {
const text = fs.readFileSync(file, 'utf8')
const match = text.match(/export\s+const\s+(\w+)\s*=\s*defineKbxScreen\s*\(\s*\{/)
if (!match) continue
const body = text.slice(match.index ?? 0)
const id = body.match(/\bid:\s*['"]([^'"]+)['"]/)?.[1]
if (!id) continue
let rel = path.relative(path.dirname(out), file).replaceAll('\\', '/')
if (!rel.startsWith('.')) rel = './' + rel
rel = rel.replace(/\.ts$/, '')
entries.push({ id, exportName: match[1], importPath: rel })
}
entries.sort((a, b) => a.id.localeCompare(b.id))
const imports = entries.map((entry, i) => `import { ${entry.exportName} as screen${i} } from '${entry.importPath}'`).join('\n')
const list = entries.map((_, i) => ` screen${i},`).join('\n')
const output = `// AUTO-GENERATED by scripts/generate-app-screen-registry.mjs. Do not edit.\n${imports}\n\nexport const generatedScreens = [\n${list}\n] as const\n`
fs.writeFileSync(out, output)
console.log(`generated app screen registry with ${entries.length} screens`)