import { readdir, writeFile, mkdir } from 'node:fs/promises'; import { join, resolve } from 'node:path'; import { loadTheme } from './src/palette.js'; import { buildVariables } from './src/themeBuilder.js'; import { renderThemeCSS } from './src/cssWriter.js'; const DOKI_REPO = resolve(process.env['DOKI_REPO'] ?? './doki-master-theme'); const OUTPUT_DIR = resolve(process.env['OUTPUT_DIR'] ?? './output'); async function findDefinitionFiles(dir: string): Promise { const entries = await readdir(dir, { recursive: true }); return entries .filter((f) => f.endsWith('.master.definition.json')) .map((f) => join(dir, f)); } async function main(): Promise { await mkdir(OUTPUT_DIR, { recursive: true }); const definitionsDir = join(DOKI_REPO, 'definitions'); const definitionFiles = await findDefinitionFiles(definitionsDir); if (definitionFiles.length === 0) { console.error(`No definition files found in ${definitionsDir}`); console.error('Make sure the doki-master-theme submodule is initialised:'); console.error(' git submodule update --init'); process.exit(1); } let success = 0; let errors = 0; for (const defPath of definitionFiles) { try { const theme = loadTheme(defPath, DOKI_REPO); const variables = buildVariables(theme); const css = renderThemeCSS(theme, variables); const outPath = join(OUTPUT_DIR, `theme-${theme.internalName}.css`); await writeFile(outPath, css, 'utf8'); console.log(`✓ ${theme.internalName}`); success++; } catch (err) { console.error(`✗ ${defPath}: ${err}`); errors++; } } console.log(`\nGenerated ${success} theme${success !== 1 ? 's' : ''}. Errors: ${errors}.`); } main();