File size: 3,098 Bytes
e1ae2c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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,
};