import { build, loadConfigFromFile, mergeConfig, UserConfig } from 'vite';
import path from 'path';
import fs from 'fs-extra';
import dts from 'vite-plugin-dts';

const packages = path.resolve(process.cwd(), './packages');

// 获取所有包目录
const packageDirs = ['render'];

// 构建每一个包
async function buildPackages() {
    for (const packageName of packageDirs) {
        const packageDir = path.join(packages, packageName);
        const output = path.join(packageDir, 'dist');
        await fs.emptyDir(output);
        const configFile = path.resolve('./vite.config.ts');
        const config = await loadConfigFromFile(
            { command: 'build', mode: 'production' },
            configFile
        );
        const resolved = mergeConfig(config?.config ?? {}, {
            plugins: [
                dts({
                    entryRoot: path.join(packageDir, 'src/index.ts'),
                    rollupTypes: true,
                    strictOutput: false,
                    copyDtsFiles: false,
                    exclude: ['packages-user/**/*']
                })
            ],
            build: {
                lib: {
                    entry: path.join(packageDir, 'src/index.ts'),
                    name: packageName,
                    formats: ['es', 'cjs'],
                    fileName: format => `${packageName}.${format}.js`
                },
                outDir: output,
                sourcemap: true,
                emptyOutDir: true
            },
            publicDir: false
        } satisfies UserConfig);

        await build(resolved);
        console.log(`✅ Package ${packageName} built successfully.`);
    }
    const dirs = await fs.readdir(packages);
    for (const name of dirs) {
        const dir = path.join(process.cwd(), name);
        if (name === 'types') {
            await fs.emptyDir(path.join(dir, 'src'));
            await fs.rmdir(path.join(dir, 'src'));
        } else {
            await fs.emptyDir(dir);
            await fs.rmdir(dir);
        }
    }
}

buildPackages().catch(e => {
    console.error(e);
    process.exit(1);
});