40 lines
2.0 KiB
TypeScript
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
|
|
}
|