import { NextConfig } from 'next/dist/server/config-shared' import * as yup from 'yup' import { LoadedUnbodyConfig, UnbodyConfig } from '../types' const configSchema = yup.object({ dir: yup.string().optional().default('.unbody'), projectDir: yup.string().optional().default(process.cwd()), setupApi: yup.boolean().optional().default(true), setupTailwind: yup.boolean().optional().default(true), setupComponents: yup.boolean().optional().default(true), output: yup .object({ browser: yup .object({ enable: yup.boolean().optional().default(false), concurrency: yup.number().optional().default(undefined), resourceUrlWhitelist: yup .array() .of(yup.string()) .optional() .default([]), }) .optional() .default({}), server: yup .object({ enable: yup.boolean().optional().default(false), }) .optional() .default({}), }) .optional() .default({}), assistant: yup .object({ name: yup.string().optional().default('Assistant'), label: yup.string().optional().default('Assistant'), }) .optional() .default({}), env: yup .object({ apiKey: yup.string().optional().default('UNBODY_API_KEY'), projectId: yup.string().optional().default('UNBODY_PROJECT_ID'), sourceId: yup.string().optional().default('UNBODY_SOURCE_ID'), }) .optional(), remote: yup .object({ name: yup.string().optional(), url: yup.string().optional(), branch: yup.string().optional().default('unbody'), userName: yup.string().optional(), userEmail: yup.string().optional(), commitMessage: yup.string().optional(), }) .optional() .default({}), }) export const validateConfig = ( config: UnbodyConfig, nextConfig: NextConfig, ): LoadedUnbodyConfig => { return configSchema.validateSync(config, { recursive: true, abortEarly: false, stripUnknown: true, }) as LoadedUnbodyConfig } export const loadConfig = ({ conf, nextConfig, }: { conf: UnbodyConfig nextConfig: NextConfig }): LoadedUnbodyConfig => { return validateConfig(conf, nextConfig) }