import type { ProxyOptions } from 'vite' import { consola } from 'consola' import { bgRed, bgYellow, green, lightBlue } from 'kolorist' import { createServiceConfig } from '../../src/utils/service' /** * 设置 HTTP 代理 * * @param env - 当前环境变量 * @param enable - 是否启用 HTTP 代理 */ 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)) }) return proxy } /** * 创建 HTTP 代理项 * * @param item - 服务配置项 * @param enableLog - 是否启用日志记录 */ function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) { const proxy: Record = {} proxy[item.proxyPattern] = { target: item.baseURL, changeOrigin: true, secure: false, // 如果是https接口,需要配置这个参数 configure: (_proxy, options) => { _proxy.on('proxyReq', (_proxyReq, req, _res) => { if (!enableLog) return const requestUrl = `${lightBlue('[代理地址]')}: ${bgYellow(` ${req.method} `)} ${green(`${item.proxyPattern}${req.url}`)}` const proxyUrl = `${lightBlue('[真实请求地址]')}: ${green(`${options.target}${req.url}`)}` consola.log(`${requestUrl}\n${proxyUrl}`) }) _proxy.on('error', (_err, req, _res) => { if (!enableLog) return consola.log(bgRed(`错误: ${req.method} `), green(`${options.target}${req.url}`)) }) }, rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), ''), } return proxy }