import { IPlugin } from '../../intf/IPlugin' import { AxiosInstance } from 'axios' import { combineURLs, isAbsoluteURL } from '../../utils/build-full-path' import { IRequestOptions } from '../../intf/IRequestOptions' /** 提供mock能力插件 */ export const mock = (): IPlugin => { return { pluginName: 'mock', handler: (axios: AxiosInstance) => { // 注入mock依赖 axios.interceptors.request.use((req: IRequestOptions) => { const { url, mock } = req const { command } = process.env let mockURL!: string let target: string | undefined if (!url) return req if (command !== 'serve') return req if ((req.headers?.common as any)?.mockURL) { mockURL = (req.headers?.common as any)?.mockURL } else if (req.headers?.mockURL) { mockURL = req.headers?.mockURL } if (mock) { if (!mockURL) { throw new Error( `headers 中似乎并没有配置 'mockURL', 请通过 配置 'headers: { mockURL:''}' 或 使用 env() 插件启用mock能力` ) } // 填充 baseUrl if (!isAbsoluteURL(url)) { target = combineURLs(mockURL, url) } else { // 转换为url对象 const u = new URL(url) // 去除origin, 并附加 mockURL target = combineURLs(mockURL, url.replace(u.origin, '')) } } req.url = target ?? req.url return req }) } } }