fix(web): restore root env loading

- Restore root .env loading for web Vite builds.
- Keep extension release env isolation intact.
- Cover package script behavior with node tests.
This commit is contained in:
linshen committed 2026-05-16 13:31:18 +08:00
1 parent 4340f1bf28
commit 75aeb5ba66
2 files changed
+66 -31

No files matched your search

+51 -31
View File
@@ -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<string, string>)
}
}
},
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')
}
}
})
+15
View File
@@ -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)