fork from bc4552c5a8
This commit is contained in:
95
common/mock-extra.js
Normal file
95
common/mock-extra.js
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* @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;
|
||||
Reference in New Issue
Block a user