| function ensureConfigDefaults(config) { |
| const result = { ...config }; |
|
|
| result.site = result.site || {}; |
| result.navigation = result.navigation || []; |
|
|
| result.fonts = result.fonts && typeof result.fonts === 'object' ? result.fonts : {}; |
| result.fonts.source = result.fonts.source || 'css'; |
| result.fonts.family = result.fonts.family || 'LXGW WenKai'; |
| result.fonts.weight = result.fonts.weight || 'normal'; |
| result.fonts.cssUrl = result.fonts.cssUrl || 'https://fontsapi.zeoseven.com/292/main/result.css'; |
|
|
| result.profile = result.profile || {}; |
| result.social = result.social || []; |
|
|
| result.icons = result.icons || {}; |
| result.icons.mode = result.icons.mode || 'favicon'; |
| result.icons.region = result.icons.region || 'com'; |
|
|
| result.site.title = result.site.title || 'MeNav导航'; |
| result.site.description = result.site.description || '个人网络导航站'; |
| result.site.author = result.site.author || 'MeNav User'; |
| result.site.logo_text = result.site.logo_text || '导航站'; |
| result.site.favicon = result.site.favicon || 'menav.svg'; |
| result.site.logo = result.site.logo || null; |
| result.site.footer = result.site.footer || ''; |
| result.site.theme = result.site.theme || { |
| primary: '#4a89dc', |
| background: '#f5f7fa', |
| modeToggle: true, |
| }; |
|
|
| result.profile.title = result.profile.title || '欢迎使用'; |
| result.profile.subtitle = result.profile.subtitle || 'MeNav个人导航系统'; |
|
|
| function processSiteDefaults(site) { |
| site.name = site.name || '未命名站点'; |
| site.url = site.url || '#'; |
| site.description = site.description || ''; |
| site.icon = site.icon || 'fas fa-link'; |
| site.external = typeof site.external === 'boolean' ? site.external : true; |
| } |
|
|
| function processNodeSitesRecursively(node) { |
| if (!node || typeof node !== 'object') return; |
|
|
| if (Array.isArray(node.sites)) { |
| node.sites.forEach(processSiteDefaults); |
| } |
|
|
| if (Array.isArray(node.subcategories)) node.subcategories.forEach(processNodeSitesRecursively); |
| if (Array.isArray(node.groups)) node.groups.forEach(processNodeSitesRecursively); |
| if (Array.isArray(node.subgroups)) node.subgroups.forEach(processNodeSitesRecursively); |
| } |
|
|
| function processCategoryDefaults(category) { |
| category.name = category.name || '未命名分类'; |
| category.sites = category.sites || []; |
| processNodeSitesRecursively(category); |
| } |
|
|
| Object.keys(result).forEach((key) => { |
| const pageConfig = result[key]; |
| if (!pageConfig || typeof pageConfig !== 'object') return; |
|
|
| if (Array.isArray(pageConfig.categories)) { |
| pageConfig.categories.forEach(processCategoryDefaults); |
| } |
|
|
| if (Array.isArray(pageConfig.sites)) { |
| pageConfig.sites.forEach(processSiteDefaults); |
| } |
| }); |
|
|
| return result; |
| } |
|
|
| function validateConfig(config) { |
| if (!config || typeof config !== 'object') { |
| const { createLogger } = require('../utils/logger'); |
| createLogger('config').error('配置无效:配置必须是对象'); |
| return false; |
| } |
|
|
| return true; |
| } |
|
|
| module.exports = { |
| ensureConfigDefaults, |
| validateConfig, |
| }; |
|
|