Files
OpenFlare/frontend/scripts/generate-themes.js
T
ryan 2f60329886 后端与全仓代码质量清理(golangci 扩展集 · 测试质量 · 并发安全 · 文档同步)
代码质量全量清理,零行为变化:golangci 扩展集 13 类 linter(gosec/modernize/perfsprint/canonicalheader/usestdlibvars/wastedassign/intrange/errorlint/forcetypeassert/recvcheck/exhaustive/unparam)全量修复,测试代码质量(testifylint/thelper/usetesting)25→0,frpc 进程生命周期真 bug(进程组击杀)、全仓 go test -race 6 类数据竞争(含 1 个生产竞争)、SPDX license 头补齐 131 文件、前端测试套件 next-intl 迁移后 44 失败→全绿、过期 swagger 文档重新生成、pnpm-workspace 构建审批。

Experiments: #2-#17, #18, #20, #21, #23
Metric: total_issues 108 → 8 (-92.6%)
2026-08-16 21:24:14 +08:00

77 lines
2.2 KiB
JavaScript

/* eslint-disable @typescript-eslint/no-require-imports */
const fs = require('fs');
const path = require('path');
const STYLE_DIR = path.join(__dirname, '../public/style');
const OUTPUT_FILE = path.join(__dirname, '../lib/theme/themes.json');
function parseCSSVariables(cssSection) {
const variables = {};
const regex = /--([a-z0-9-]+):\s*([^;]+);/g;
let match;
while ((match = regex.exec(cssSection)) !== null) {
variables[match[1]] = match[2].trim();
}
return variables;
}
try {
if (!fs.existsSync(STYLE_DIR)) {
console.error(`Style directory not found: ${STYLE_DIR}`);
process.exit(1);
}
const files = fs.readdirSync(STYLE_DIR);
const themes = files
.filter((file) => file.endsWith('.css'))
.map((file) => {
/* 生成主题名称 */
const name =
file === 'default.css'
? 'Default'
: file
.replace('.css', '')
.split('-')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
const content = fs.readFileSync(path.join(STYLE_DIR, file), 'utf-8');
/* 从 :root 解析明亮模式颜色 */
const rootSection = content.match(/:root\s*\{([^}]+)\}/s)?.[1] || '';
const lightColors = parseCSSVariables(rootSection);
/* 从 .dark 解析暗色模式颜色 */
const darkSection = content.match(/\.dark\s*\{([^}]+)\}/s)?.[1] || '';
const darkColors = parseCSSVariables(darkSection);
return {
id: file,
name,
colors: {
light: lightColors,
dark: darkColors,
},
};
});
/* 默认主题排在最前面,其余按名称排序 */
themes.sort((a, b) => {
if (a.id === 'default.css') return -1;
if (b.id === 'default.css') return 1;
return a.name.localeCompare(b.name);
});
// 确保输出文件的父目录存在
const outputDir = path.dirname(OUTPUT_FILE);
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
fs.writeFileSync(OUTPUT_FILE, JSON.stringify(themes, null, 2) + '\n', 'utf-8');
console.log(`Successfully generated themes.json at ${OUTPUT_FILE}`);
} catch (error) {
console.error('Failed to generate themes.json:', error);
process.exit(1);
}