import { resolve } from 'path'; import fs from 'fs-extra'; import { loadConfigFromFile } from 'vite'; import { SiteConfig, UserConfig } from '../types/index'; type RawConfig = UserConfig | Promise | (() => UserConfig | Promise); function getUserConfigPath(root: string) { try { const supportConfigFiles = ['config.ts', 'config.js']; const beaverPath = '.beaver/'; const configPath = supportConfigFiles .map((file) => resolve(`${root}/${beaverPath}`, file)) .find(fs.pathExistsSync); return configPath; } catch (e) { console.error(`Failed to load user config: ${e}`); throw e; } } export async function resolveUserConfig( root: string, command: 'serve' | 'build', mode: 'development' | 'production' ) { const configPath = getUserConfigPath(root); const result = await loadConfigFromFile({ command, mode }, configPath, root); if (result) { const { config: rawConfig = {} as RawConfig } = result; const userConfig = await (typeof rawConfig === 'function' ? rawConfig() : rawConfig); return [configPath, userConfig] as const; } else { return [configPath, {} as UserConfig] as const; } } export function resolveSiteData(userConfig: UserConfig): UserConfig { return { title: userConfig.title || 'Beaver.js', description: userConfig.description || 'SSG Framework', themeConfig: userConfig.themeConfig || {}, vite: userConfig.vite || {} }; } export async function resolveConfig( root: string, command: 'serve' | 'build', mode: 'development' | 'production' ): Promise { const [configPath, userConfig] = await resolveUserConfig(root, command, mode); const siteConfig: SiteConfig = { root, configPath: configPath, siteData: resolveSiteData(userConfig as UserConfig) }; return siteConfig; } export function defineConfig(config: UserConfig) { return config; }