Files
BYW-VoiceHub/server/utils/theme-config.ts
T

40 lines
2.0 KiB
TypeScript

import { createApiError } from '~~/server/utils/apiError'
import { SERVER_ERROR_CODES, THEMES, DEFAULT_THEMES } from '~~/server/config/constants'
export const parseThemeArray = (value: unknown, fallback = DEFAULT_THEMES): string[] => {
try {
const parsed = typeof value === 'string' ? JSON.parse(value) : value
if (!Array.isArray(parsed)) return [...fallback]
const themes = [...new Set(parsed.filter((theme): theme is string => typeof theme === 'string' && THEMES.includes(theme as typeof THEMES[number])))]
return themes.length > 0 ? themes : [...fallback]
} catch {
return [...fallback]
}
}
export const validateThemeConfig = (defaultTheme: unknown, enabledThemes: unknown) => {
if (typeof defaultTheme !== 'string' || !THEMES.includes(defaultTheme as typeof THEMES[number])) {
throw createApiError(400, SERVER_ERROR_CODES.THEME_INVALID_DEFAULT, '默认主题无效')
}
if (typeof enabledThemes !== 'string') {
throw createApiError(400, SERVER_ERROR_CODES.THEME_INVALID_LIST, '启用的主题列表格式无效')
}
let parsed: unknown
try {
parsed = JSON.parse(enabledThemes)
} catch {
throw createApiError(400, SERVER_ERROR_CODES.THEME_INVALID_LIST, '启用的主题列表格式无效')
}
if (!Array.isArray(parsed) || parsed.length === 0 || parsed.some((theme) => typeof theme !== 'string' || !THEMES.includes(theme as typeof THEMES[number]))) {
throw createApiError(400, SERVER_ERROR_CODES.THEME_INVALID_LIST, '启用的主题列表无效')
}
const themes = [...new Set(parsed)] as string[]
if (!themes.includes(defaultTheme)) {
throw createApiError(400, SERVER_ERROR_CODES.THEME_INVALID_DEFAULT, '默认主题必须处于启用状态')
}
if (themes.includes('System') && (!themes.includes('ClassicDark') || !themes.includes('ClassicLight'))) {
throw createApiError(400, SERVER_ERROR_CODES.THEME_SYSTEM_REQUIRES_CLASSIC, '跟随系统时必须同时启用经典深色和经典浅色')
}
return themes
}