#!/usr/bin/env node /** * 校验导航左上角品牌名。 * * 约定:themeConfig.siteTitle 必须以「雪羊科技」为主体。 * * 允许的形态: * 雪羊科技 * 雪羊科技物联网卡与设备管理平台 * * 不允许: * - 主体被换成别的品牌名(如「雪羊科技开源」「雪羊开源」) * - 整个删掉 siteTitle(VitePress 会回落到 config.title 的超长站名) * - logo 缺失或指向不存在的文件 * * config.title 是浏览器标签页/SEO 用的完整站名,和这里不是一回事。 */ import { readFileSync, existsSync } from 'node:fs' import { fileURLToPath } from 'node:url' import { dirname, join } from 'node:path' const root = join(dirname(fileURLToPath(import.meta.url)), '..') const configPath = join(root, '.vitepress', 'config.mts') const src = readFileSync(configPath, 'utf-8') /** 品牌名主体,左上角必须以此开头 */ const BRAND = '雪羊科技' // 取 siteTitle 的赋值(单引号或双引号,内容可含 HTML) const m = src.match(/siteTitle\s*:\s*(['"])([\s\S]*?)\1\s*,/) if (!m) { console.error('[nav-brand] themeConfig.siteTitle 缺失。') console.error(` 左上角会回落到 config.title(完整长名),应显式设为「${BRAND}」。`) process.exit(1) } const raw = m[2].trim() // 去掉可选的副标题 span,只看品牌主体 const withoutSubtitle = raw.replace( /]*>[\s\S]*?<\/span>/g, '' ).trim() if (withoutSubtitle !== BRAND) { console.error(`[nav-brand] siteTitle 的品牌主体是「${withoutSubtitle}」,应为「${BRAND}」。`) console.error(' 左上角品牌名固定,副标题可保留但主体不要换。') process.exit(1) } // logo 检查:既要配置在,也要文件真的存在 const logoNeedle = 'snowgoat-logo.png' if (!src.includes(logoNeedle)) { console.error(`[nav-brand] 未找到 logo 配置 ${logoNeedle}。`) process.exit(1) } const logoFile = join(root, 'pages', 'public', logoNeedle) if (!existsSync(logoFile)) { console.error(`[nav-brand] logo 文件不存在:pages/public/${logoNeedle}`) process.exit(1) } const hasSubtitle = /site-subtitle/.test(raw) console.log( `[nav-brand] OK:左上角「${BRAND}」${hasSubtitle ? ' + 定位副标题' : ''} + ${logoNeedle}` )