#!/usr/bin/env node // gen_flutter_icons.mjs —— 图标单源 codegen(ds-flow step 2a)。 // 图标真源 = design/prototype/icons.js(Lucide sprite)。读其 key 集,kebab→camel, // 生成 client/lib/widgets/pangolin_icons.dart(每个 sprite key 一行 static const)。 // 零依赖(Node fs)。运行:node design/codegen/gen_flutter_icons.mjs import { readFileSync, writeFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname, resolve } from 'node:path'; const __dirname = dirname(fileURLToPath(import.meta.url)); const root = resolve(__dirname, '..', '..'); const SPRITE = resolve(root, 'design/prototype/icons.js'); const OUT = resolve(root, 'client/lib/widgets/pangolin_icons.dart'); const src = readFileSync(SPRITE, 'utf8'); // 抽 key:形如 'kebab-name': '<... const keys = []; const re = /'([a-z0-9-]+)'\s*:\s*' (seen.has(k) ? false : (seen.add(k), true))); const camel = (k) => k.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase()); const lines = ordered.map((k) => { const c = camel(k); return ` static const ${c} = LucideIcons.${c};`; }); const out = `// GENERATED by design/codegen/gen_flutter_icons.mjs —— 勿手改;图标真源=design/prototype/icons.js // 重新生成:node design/codegen/gen_flutter_icons.mjs import 'package:lucide_icons_flutter/lucide_icons.dart'; class PangolinIcons { PangolinIcons._(); ${lines.join('\n')} } `; writeFileSync(OUT, out); console.log(`generated ${OUT} (${ordered.length} icons)`);