import { AxiosInstance } from 'axios' import { IEnv, TEnvName } from '../../intf/IEnv' import { IPlugin } from '../../intf/IPlugin' export interface IEnvPlugin extends IPlugin { current: IEnv } /** 解析 env 变量插件 * * @param {IEnv} envs * @param {string} envName (可选) * @returns IPlugin */ export const env = (envs: IEnv | Array, envName?: TEnvName): IEnvPlugin => { const { command } = process.env // ? transform envs if (!(envs instanceof Array)) envs = [envs] // # 根据优先级排序 (order 默认: 0) envs = envs.sort((a, b) => Number(b.order || 0) - Number(a.order || 0)) let current!: IEnv | undefined // ? find by envName if (command === 'serve' && envName) { current = envs.find((env) => env.name === envName) } if (!current) { // ? find by rule for (const env of envs) { const { rule } = env if (rule instanceof RegExp && rule.test(location.href)) { current = env break } else if (typeof rule === 'function' && rule()) { current = env break } else if (typeof rule === 'string' && location.host === rule) { current = env break } } } if (!current) throw new Error('当前无可用环境, 请检查 envs 配置!') return { pluginName: 'env', current, handler: (axios: AxiosInstance) => { const { baseURL, mockURL, referer } = current ?? {} // 更改 baseUrl axios.defaults.baseURL = baseURL if (command === 'serve') { if (mockURL) axios.defaults.headers.common['mockURL'] = mockURL if (referer) axios.defaults.headers.common['form'] = referer if (baseURL) axios.defaults.headers.common['target'] = baseURL } } } }