import type { ConfigEnv, UserConfig } from 'vite'; import type { DefineLibraryOptions } from '../typing'; import { readPackageJSON } from '@vben/node-utils'; import { defineConfig, mergeConfig } from 'vite'; import { loadLibraryPlugins } from '../plugins'; import { getCommonConfig } from './common'; function defineLibraryConfig(userConfigPromise?: DefineLibraryOptions) { return defineConfig(async (config: ConfigEnv) => { const options = await userConfigPromise?.(config); const { command, mode } = config; const { library = {}, vite = {} } = options || {}; const root = process.cwd(); const isBuild = command === 'build'; const plugins = await loadLibraryPlugins({ dts: false, injectMetadata: true, isBuild, mode, ...library, }); const { dependencies = {}, peerDependencies = {} } = await readPackageJSON(root); const externalPackages = [ ...Object.keys(dependencies), ...Object.keys(peerDependencies), ]; const packageConfig: UserConfig = { build: { lib: { entry: 'src/index.ts', fileName: () => 'index.mjs', formats: ['es'], }, rollupOptions: { external: (id) => { return externalPackages.some( (pkg) => id === pkg || id.startsWith(`${pkg}/`), ); }, }, }, plugins, }; const commonConfig = await getCommonConfig(); const mergedConmonConfig = mergeConfig(commonConfig, packageConfig); return mergeConfig(mergedConmonConfig, vite); }); } export { defineLibraryConfig };