me / src /generator /config /loader.js
cheymin's picture
Upload 136 files
e1ae2c6 verified
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,
};