import tailwindcss from '@tailwindcss/vite' import react from '@vitejs/plugin-react' import { config as dotenvConfig } from 'dotenv' import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import process from 'node:process' import { dirname, join, resolve } from 'path' import { fileURLToPath } from 'url' import { defineConfig } from 'vite' const __dirname = dirname(fileURLToPath(import.meta.url)) const pageAgentPkg = JSON.parse( readFileSync(resolve(__dirname, '../page-agent/package.json'), 'utf-8') ) // Load .env from repo root dotenvConfig({ path: resolve(__dirname, '../../.env'), quiet: true }) // All SPA routes that need index.html copies for direct access on static hosts const SPA_ROUTES = [ 'docs', 'docs/introduction/overview', 'docs/introduction/quick-start', 'docs/introduction/limitations', 'docs/introduction/troubleshooting', 'docs/features/custom-tools', 'docs/features/data-masking', 'docs/features/custom-instructions', 'docs/features/models', 'docs/features/local-llms', 'docs/features/chrome-extension', 'docs/features/mcp-server', 'docs/features/third-party-agent', 'docs/advanced/page-agent', 'docs/advanced/page-agent-core', 'docs/advanced/page-controller', 'docs/advanced/custom-ui', 'docs/advanced/security-permissions', ] const SITE_URL = 'https://alibaba.github.io/page-agent' function spaRoutes() { return { name: 'spa-routes', closeBundle() { const dist = resolve(__dirname, 'dist') const src = join(dist, 'index.html') for (const route of SPA_ROUTES) { const dir = join(dist, route) mkdirSync(dir, { recursive: true }) copyFileSync(src, join(dir, 'index.html')) } console.log(` ✓ Copied index.html to ${SPA_ROUTES.length} SPA routes`) const today = new Date().toISOString().split('T')[0] const urls = ['', ...SPA_ROUTES] .map( (route) => ` \n ${SITE_URL}/${route}\n ${today}\n ` ) .join('\n') writeFileSync( join(dist, 'sitemap.xml'), `\n\n${urls}\n\n` ) console.log(` ✓ Generated sitemap.xml with ${SPA_ROUTES.length + 1} URLs`) }, } } // Website Config (React Documentation Site) export default defineConfig(({ mode }) => ({ base: '/page-agent/', clearScreen: false, plugins: [react(), tailwindcss(), spaRoutes()], build: { chunkSizeWarningLimit: 2000, cssCodeSplit: true, rollupOptions: { onwarn: function (message, handler) { if (message.code === 'EVAL') return handler(message) }, output: { manualChunks(id) { if (/[\\/]node_modules[\\/](react|react-dom|wouter)([\\/]|$)/.test(id)) { return 'vendor' } }, }, }, }, resolve: { alias: { '@': resolve(__dirname, 'src'), }, }, define: { ...(mode === 'development' && { 'import.meta.env.LLM_MODEL_NAME': JSON.stringify(process.env.LLM_MODEL_NAME), 'import.meta.env.LLM_API_KEY': JSON.stringify(process.env.LLM_API_KEY), 'import.meta.env.LLM_BASE_URL': JSON.stringify(process.env.LLM_BASE_URL), }), 'import.meta.env.VERSION': JSON.stringify(pageAgentPkg.version), }, }))