diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index ecc3db7e..49c30e3c 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -1,40 +1,60 @@ -import { defineConfig } from 'vite' +import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' import path from 'path' +import { DEFAULT_VITE_ENV } from '../core/src/utils/default-env' // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [vue()], - server: { - port: 18181, - host: true, - fs: { - // 允许为工作区依赖提供服务 - allow: ['..'] - }, - hmr: true, - watch: { - // 确保监视monorepo中其他包的变化 - ignored: ['!**/node_modules/@prompt-optimizer/**'] - } - }, - build: { - rollupOptions: { - input: { - main: resolve(__dirname, 'index.html') +export default defineConfig(({ mode }) => { + const monorepoRoot = resolve(__dirname, '../..') + const env = loadEnv(mode, monorepoRoot) + const processEnv = { + ...DEFAULT_VITE_ENV, + ...env, + } + + return { + envDir: monorepoRoot, + plugins: [vue()], + server: { + port: 18181, + host: true, + fs: { + // 允许为工作区依赖提供服务 + allow: ['..'] + }, + hmr: true, + watch: { + // 确保监视monorepo中其他包的变化 + ignored: ['!**/node_modules/@prompt-optimizer/**'] + } + }, + build: { + rollupOptions: { + input: { + main: resolve(__dirname, 'index.html') + } + } + }, + publicDir: 'public', + resolve: { + preserveSymlinks: true, + alias: { + '@': resolve(__dirname, 'src'), + '@prompt-optimizer/core': path.resolve(__dirname, '../core'), + '@prompt-optimizer/ui': path.resolve(__dirname, '../ui'), + '@prompt-optimizer/web': path.resolve(__dirname, '../web'), + '@prompt-optimizer/extension': path.resolve(__dirname, '../extension') + } + }, + define: { + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'development'), + ...Object.keys(processEnv).reduce((acc, key) => { + acc[key] = processEnv[key as keyof typeof processEnv] + return acc + }, {} as Record) } - } - }, - publicDir: 'public', - resolve: { - preserveSymlinks: true, - alias: { - '@': resolve(__dirname, 'src'), - '@prompt-optimizer/core': path.resolve(__dirname, '../core'), - '@prompt-optimizer/ui': path.resolve(__dirname, '../ui'), - '@prompt-optimizer/web': path.resolve(__dirname, '../web'), - '@prompt-optimizer/extension': path.resolve(__dirname, '../extension') } } }) diff --git a/scripts/package-scripts.test.mjs b/scripts/package-scripts.test.mjs index 947884de..64ecd219 100644 --- a/scripts/package-scripts.test.mjs +++ b/scripts/package-scripts.test.mjs @@ -61,6 +61,21 @@ test('web and extension package typecheck scripts use isolated tsconfig files', assert.match(extensionTypecheckConfig.include.join(' '), /\benv\.d\.ts\b/) }) +test('web dev loads root env while extension build stays isolated from root env', () => { + const webViteConfig = fs.readFileSync(path.join(process.cwd(), 'packages', 'web', 'vite.config.ts'), 'utf8') + const extensionViteConfig = fs.readFileSync(path.join(process.cwd(), 'packages', 'extension', 'vite.config.ts'), 'utf8') + + assert.match(webViteConfig, /loadEnv\(mode,\s*monorepoRoot\)/) + assert.match(webViteConfig, /envDir:\s*monorepoRoot/) + assert.match(webViteConfig, /DEFAULT_VITE_ENV/) + assert.match(webViteConfig, /'process\.env'/) + + assert.doesNotMatch(extensionViteConfig, /loadEnv\(mode,\s*monorepoRoot\)/) + assert.doesNotMatch(extensionViteConfig, /envDir:\s*monorepoRoot/) + assert.doesNotMatch(extensionViteConfig, /DEFAULT_VITE_ENV/) + assert.doesNotMatch(extensionViteConfig, /'process\.env'/) +}) + test('mcp-server bin points to a file that exists before build output is generated', () => { const mcpPackagePath = path.join('packages', 'mcp-server', 'package.json') const mcpPackage = readJson(mcpPackagePath)