const fs = require('node:fs'); const path = require('node:path'); const yaml = require('js-yaml'); const { createLogger, isVerbose } = require('../utils/logger'); const log = createLogger('config'); function handleConfigLoadError(filePath, error) { log.error('加载配置失败', { path: filePath, message: error && error.message ? error.message : String(error), }); if (isVerbose() && error && error.stack) { console.error(error.stack); } } function safeLoadYamlConfig(filePath) { if (!fs.existsSync(filePath)) { return null; } try { const fileContent = fs.readFileSync(filePath, 'utf8'); const docs = yaml.loadAll(fileContent); if (docs.length === 1) { return docs[0]; } if (docs.length > 1) { log.warn('检测到 YAML 多文档,仅使用第一个', { path: filePath }); return docs[0]; } return null; } catch (error) { handleConfigLoadError(filePath, error); return null; } } function loadModularConfig(dirPath) { if (!fs.existsSync(dirPath)) { return null; } const config = { site: {}, navigation: [], fonts: {}, profile: {}, social: [], categories: [], }; const siteConfigPath = path.join(dirPath, 'site.yml'); const siteConfig = safeLoadYamlConfig(siteConfigPath); if (siteConfig) { config.site = siteConfig; if (siteConfig.fonts) config.fonts = siteConfig.fonts; if (siteConfig.profile) config.profile = siteConfig.profile; if (siteConfig.social) config.social = siteConfig.social; if (siteConfig.icons) config.icons = siteConfig.icons; if (siteConfig.navigation) { config.navigation = siteConfig.navigation; if (isVerbose()) log.info('使用 site.yml 中的 navigation 配置'); } } const pagesPath = path.join(dirPath, 'pages'); if (fs.existsSync(pagesPath)) { const files = fs .readdirSync(pagesPath) .filter((file) => file.endsWith('.yml') || file.endsWith('.yaml')); files.forEach((file) => { const filePath = path.join(pagesPath, file); const fileConfig = safeLoadYamlConfig(filePath); if (fileConfig) { const configKey = path.basename(file, path.extname(file)); config[configKey] = fileConfig; } }); } return config; } module.exports = { safeLoadYamlConfig, loadModularConfig, };