UNPKG

better-mock

Version:

Forked from Mockjs. Generate random data & Intercept ajax request. Support miniprogram.

106 lines (90 loc) 2.63 kB
import mocked from '../../core/mocked' import setting from '../../core/setting' import { PlatformName, MpGlobal, WxSuccessCallback, MySuccessCallback, MpRequestOptions } from './types' import { XHRCustomOptions } from '../../types' import { isFunction, assert } from '../../utils' // 获取小程序平台标识 function getMpPlatform (): { name: PlatformName; global: MpGlobal; } { let global let name if (typeof wx !== 'undefined') { global = wx name = 'wx' } else if (typeof my !== 'undefined') { global = my name = 'my' } else if (typeof tt !== 'undefined') { global = tt name = 'tt' } else if (typeof swan !== 'undefined') { global = swan name = 'swan' } assert(global && name, 'Invalid mini-program platform, just work in "wx", "my", "tt" or "swan"!') return { global, name } } const platform = getMpPlatform() const platformName = platform.name const platformRequest = platform.global.request function MockRequest (opts: MpRequestOptions) { const options: XHRCustomOptions = { url: opts.url, type: opts.method || 'GET', body: opts.data as any || null, headers: opts.header || opts.headers || {} } // 查找与请求参数匹配的数据模板 const item = mocked.find(options.url, options.type) // 如果未找到匹配的数据模板,则采用原生 request 发送请求。 if (!item) { return platformRequest(opts) } // 找到了匹配的数据模板,拦截 fetch 请求 const responseData = mocked.convert(item, options) let successOptions: WxSuccessCallback | MySuccessCallback if (platformName === 'my') { successOptions = { status: 200, data: responseData, headers: {} } as MySuccessCallback } else { successOptions = { statusCode: 200, data: responseData, header: {} } as WxSuccessCallback } if (isFunction(opts.success) || isFunction(opts.complete)) { setTimeout(() => { isFunction(opts.success) && opts.success(successOptions) isFunction(opts.complete) && opts.complete(successOptions) }, setting.parseTimeout()) } } // 覆盖原生的 request 方法 function overrideRequest () { if (!platform.global.request.__MOCK__) { // 小程序 API 做了 setter 限制,不能直接复制 Object.defineProperty(platform.global, 'request', { configurable: true, enumerable: true, writable: true, value: MockRequest }) platform.global.request.__MOCK__ = true } } export { overrideRequest, getMpPlatform } declare global { let wx: any let my: any let tt: any let swan: any }