import type { ProxyOptions } from 'vite'; import { bgRed, bgYellow, green, lightBlue } from 'kolorist'; import { consola } from 'consola'; import { WEB_SERVICE_PREFIX } from '../../src/constants/service'; import { createServiceConfig } from '../../src/utils/service'; /** * Set http proxy * * @param env - The current env * @param enable - If enable http proxy */ export function createViteProxy(env: Env.ImportMeta, enable: boolean) { const isEnableHttpProxy = enable && env.VITE_HTTP_PROXY === 'Y'; if (!isEnableHttpProxy) return undefined; const isEnableProxyLog = env.VITE_PROXY_LOG === 'Y'; const { baseURL, proxyPattern, other } = createServiceConfig(env); const proxy: Record = createProxyItem({ baseURL, proxyPattern }, isEnableProxyLog); other.forEach(item => { Object.assign(proxy, createProxyItem(item, isEnableProxyLog)); }); // 富文本图片 由浏览器直接发起, // 不经过 axios,没有 baseURL 前缀。这里加一条原样透传,避免被 Vite SPA fallback 兜底成 index.html。 // 不带 rewrite —— 原样把 /admin-api/* 转发到后端;不影响现有 /proxy-default 链路。 proxy[WEB_SERVICE_PREFIX] = { target: baseURL, changeOrigin: true }; return proxy; } function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) { const proxy: Record = {}; proxy[item.proxyPattern] = { target: item.baseURL, changeOrigin: true, configure: (_proxy, options) => { _proxy.on('proxyReq', (_proxyReq, req, _res) => { if (!enableLog) return; const requestUrl = `${lightBlue('[proxy url]')}: ${bgYellow(` ${req.method} `)} ${green( `${item.proxyPattern}${req.url}` )}`; const proxyUrl = `${lightBlue('[real request url]')}: ${green(`${options.target}${req.url}`)}`; consola.log(`${requestUrl}\n${proxyUrl}`); }); _proxy.on('error', (_err, req, _res) => { if (!enableLog) return; consola.log(bgRed(`Error: ${req.method} `), green(`${options.target}${req.url}`)); }); }, rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), '') }; return proxy; }