You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.5 KiB
104 lines
2.5 KiB
7 months ago
|
/* eslint-disable */
|
||
|
import type { MockMethod } from './types';
|
||
|
|
||
|
export async function createProdMockServer(mockList: any[]) {
|
||
|
const Mock: any = await import('mockjs');
|
||
|
const { pathToRegexp } = await import('path-to-regexp');
|
||
|
Mock.XHR.prototype.__send = Mock.XHR.prototype.send;
|
||
|
Mock.XHR.prototype.send = function () {
|
||
|
if (this.custom.xhr) {
|
||
|
this.custom.xhr.withCredentials = this.withCredentials || false;
|
||
|
|
||
|
if (this.responseType) {
|
||
|
this.custom.xhr.responseType = this.responseType;
|
||
|
}
|
||
|
}
|
||
|
if (this.custom.requestHeaders) {
|
||
|
const headers: any = {};
|
||
|
for (let k in this.custom.requestHeaders) {
|
||
|
headers[k.toString().toLowerCase()] = this.custom.requestHeaders[k];
|
||
|
}
|
||
|
this.custom.options = Object.assign({}, this.custom.options, { headers });
|
||
|
}
|
||
|
this.__send.apply(this, arguments);
|
||
|
};
|
||
|
|
||
|
Mock.XHR.prototype.proxy_open = Mock.XHR.prototype.open;
|
||
|
|
||
|
Mock.XHR.prototype.open = function () {
|
||
|
let responseType = this.responseType;
|
||
|
this.proxy_open(...arguments);
|
||
|
if (this.custom.xhr) {
|
||
|
if (responseType) {
|
||
|
this.custom.xhr.responseType = responseType;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
for (const { url, method, response, timeout } of mockList) {
|
||
|
__setupMock__(Mock, timeout);
|
||
|
Mock.mock(
|
||
|
pathToRegexp(url, undefined, { end: false }),
|
||
|
method || 'get',
|
||
|
__XHR2ExpressReqWrapper__(Mock, response),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function __param2Obj__(url: string) {
|
||
|
const search = url.split('?')[1];
|
||
|
if (!search) {
|
||
|
return {};
|
||
|
}
|
||
|
return JSON.parse(
|
||
|
'{"' +
|
||
|
decodeURIComponent(search)
|
||
|
.replace(/"/g, '\\"')
|
||
|
.replace(/&/g, '","')
|
||
|
.replace(/=/g, '":"')
|
||
|
.replace(/\+/g, ' ') +
|
||
|
'"}',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function __XHR2ExpressReqWrapper__(_Mock: any, handle: (d: any) => any) {
|
||
|
return function (options: any) {
|
||
|
let result = null;
|
||
|
if (typeof handle === 'function') {
|
||
|
const { body, type, url, headers } = options;
|
||
|
|
||
|
let b = body;
|
||
|
try {
|
||
|
b = JSON.parse(body);
|
||
|
} catch {}
|
||
|
result = handle({
|
||
|
method: type,
|
||
|
body: b,
|
||
|
query: __param2Obj__(url),
|
||
|
headers,
|
||
|
});
|
||
|
} else {
|
||
|
result = handle;
|
||
|
}
|
||
|
|
||
|
return _Mock.mock(result);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function __setupMock__(mock: any, timeout = 0) {
|
||
|
timeout &&
|
||
|
mock.setup({
|
||
|
timeout,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export function defineMockModule(
|
||
|
fn: (config: {
|
||
|
env: Record<string, any>;
|
||
|
mode: string;
|
||
|
command: 'build' | 'serve';
|
||
|
}) => Promise<MockMethod[]> | MockMethod[],
|
||
|
) {
|
||
|
return fn;
|
||
|
}
|