f6ce5267d5
- .segswitch 段控原子入 atoms.css + 登记 index.html - purchase/ui-mobile/ui-desktop 三屏:购买页支付渠道 switch(USDT→crypto 默认 / 人民币→alipay),套餐价随渠道分币种显示,删两步弹层 + nezha - 订单列表/详情集成进移动+桌面主框架 - icons.js 58 图标 sprite 单源 + gen_flutter_icons codegen + check-l1-sync 同源闸(图标同集 + l10n 完整) - pay-v2 开发决策日志 docs/pay-v2-dev-log.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
#!/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*'</g;
|
||
let m;
|
||
while ((m = re.exec(src)) !== null) keys.push(m[1]);
|
||
if (keys.length === 0) { console.error('no icon keys found in', SPRITE); process.exit(1); }
|
||
// 去重、稳定顺序(保留 sprite 出现次序)
|
||
const seen = new Set();
|
||
const ordered = keys.filter((k) => (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)`);
|