import { defineConfig } from 'vite'; import path from 'path'; import { glob } from 'glob'; // Find component, page, and iframe files to be used as entry points const entries = glob.sync('src/{components,pages,iframe}/**/*.{ts,tsx}').reduce((acc, file) => { const name = file.replace('src/', '').replace(/\.tsx?$/, ''); acc[name] = path.resolve(__dirname, file); return acc; }, {}); export default defineConfig({ plugins: [], esbuild: { jsx: 'transform', }, build: { lib: { entry: entries, formats: ['es'], fileName: (format, entryName) => `${entryName}.js`, }, rollupOptions: { // Mark React and ReactDOM as external - they'll be provided by the host external: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'], output: { format: 'es', // Force .js extensions for entries and chunks entryFileNames: (chunkInfo) => `${chunkInfo.name}.js`, chunkFileNames: (chunkInfo) => `${chunkInfo.name}.js`, assetFileNames: (assetInfo) => `${assetInfo.name ?? '[name]'}[extname]`, // Use import maps to resolve React from the global scope paths: { 'react': 'https://esm.sh/react@18', 'react-dom': 'https://esm.sh/react-dom@18', 'react/jsx-runtime': 'https://esm.sh/react@18/jsx-runtime', 'react/jsx-dev-runtime': 'https://esm.sh/react@18/jsx-dev-runtime' } }, }, outDir: 'dist', sourcemap: true, emptyOutDir: true, }, resolve: { alias: { // Resolve local UI kit source when building browser-targeted bundles '@alga/ui-kit': path.resolve(__dirname, '..', '..', 'server', 'packages', 'ui-kit', 'src'), } } });