mirror of
https://github.com/YMFE/yapi.git
synced 2024-11-27 04:40:08 +08:00
95 lines
2.3 KiB
JavaScript
Executable File
95 lines
2.3 KiB
JavaScript
Executable File
/**
|
|
* @author suxiaoxin
|
|
* @info mockJs 功能增强脚本
|
|
*/
|
|
var strRegex = /\${([a-zA-Z]+)\.?([a-zA-Z0-9_\.]*)\}/i;
|
|
var varSplit = '.';
|
|
var mockSplit = '|';
|
|
var Mock = require('mockjs');
|
|
Mock.Random.extend({
|
|
timestamp: function(){
|
|
var time = new Date().getTime() + '';
|
|
return +time.substr(0, time.length - 3)
|
|
}
|
|
})
|
|
|
|
function mock(mockJSON, context) {
|
|
context = context || {};
|
|
var filtersMap = {
|
|
regexp: handleRegexp
|
|
};
|
|
if(!mockJSON || typeof mockJSON !== 'object'){
|
|
return mockJSON;
|
|
}
|
|
|
|
return parse(mockJSON);
|
|
|
|
function parse(p, c) {
|
|
if(!c){
|
|
c = Array.isArray(p) ? [] : {}
|
|
}
|
|
|
|
for (var i in p) {
|
|
if (!p.hasOwnProperty(i)) {
|
|
continue;
|
|
}
|
|
if (p[i] && typeof p[i] === 'object') {
|
|
c[i] = (p[i].constructor === Array) ? [] : {};
|
|
parse(p[i], c[i]);
|
|
} else if(p[i] && typeof p[i] === 'string'){
|
|
p[i] = handleStr(p[i]);
|
|
var filters = i.split(mockSplit), newFilters = [].concat(filters);
|
|
c[i] = p[i];
|
|
if (filters.length > 1) {
|
|
for (var f = 1, l = filters.length, index; f < l; f++) {
|
|
filters[f] = filters[f].toLowerCase();
|
|
if (filters[f] in filtersMap) {
|
|
if ((index = newFilters.indexOf(filters[f])) !== -1) {
|
|
newFilters.splice(index, 1);
|
|
}
|
|
delete c[i];
|
|
c[newFilters.join(mockSplit)] = filtersMap[filters[f]].call(p, p[i]);
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
c[i] = p[i];
|
|
}
|
|
}
|
|
return c;
|
|
}
|
|
|
|
function handleRegexp(item) {
|
|
return new RegExp(item);
|
|
}
|
|
|
|
function handleStr(str) {
|
|
if (typeof str !== 'string' || str.indexOf('{') === -1 || str.indexOf('}') === -1 || str.indexOf('$') === -1) {
|
|
return str;
|
|
}
|
|
|
|
let matchs = str.match(strRegex);
|
|
if(matchs){
|
|
let name = matchs[1] + (matchs[2]? '.' + matchs[2] : '');
|
|
if(!name) return str;
|
|
var names = name.split(varSplit);
|
|
var data = context;
|
|
|
|
if(typeof context[names[0]] === undefined){
|
|
return str;
|
|
}
|
|
names.forEach(function (n) {
|
|
if (data === '') return '';
|
|
if (n in data) {
|
|
data = data[n];
|
|
} else {
|
|
data = '';
|
|
}
|
|
});
|
|
return data;
|
|
}
|
|
return str;
|
|
}
|
|
}
|
|
|
|
module.exports = mock; |