mock平台

mock-extra.js 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /**
  2. * @author suxiaoxin
  3. * @info mockJs 功能增强脚本
  4. */
  5. var strRegex = /\${([a-zA-Z]+)\.?([a-zA-Z0-9_\.]*)\}/i;
  6. var varSplit = '.';
  7. var mockSplit = '|';
  8. var Mock = require('mockjs');
  9. Mock.Random.extend({
  10. timestamp: function(){
  11. var time = new Date().getTime() + '';
  12. return +time.substr(0, time.length - 3)
  13. }
  14. })
  15. function mock(mockJSON, context) {
  16. context = context || {};
  17. var filtersMap = {
  18. regexp: handleRegexp
  19. };
  20. if(!mockJSON || typeof mockJSON !== 'object'){
  21. return mockJSON;
  22. }
  23. return parse(mockJSON);
  24. function parse(p, c) {
  25. if(!c){
  26. c = Array.isArray(p) ? [] : {}
  27. }
  28. for (var i in p) {
  29. if (!p.hasOwnProperty(i)) {
  30. continue;
  31. }
  32. if (p[i] && typeof p[i] === 'object') {
  33. c[i] = (p[i].constructor === Array) ? [] : {};
  34. parse(p[i], c[i]);
  35. } else if(p[i] && typeof p[i] === 'string'){
  36. p[i] = handleStr(p[i]);
  37. var filters = i.split(mockSplit), newFilters = [].concat(filters);
  38. c[i] = p[i];
  39. if (filters.length > 1) {
  40. for (var f = 1, l = filters.length, index; f < l; f++) {
  41. filters[f] = filters[f].toLowerCase();
  42. if (filters[f] in filtersMap) {
  43. if ((index = newFilters.indexOf(filters[f])) !== -1) {
  44. newFilters.splice(index, 1);
  45. }
  46. delete c[i];
  47. c[newFilters.join(mockSplit)] = filtersMap[filters[f]].call(p, p[i]);
  48. }
  49. }
  50. }
  51. }else{
  52. c[i] = p[i];
  53. }
  54. }
  55. return c;
  56. }
  57. function handleRegexp(item) {
  58. return new RegExp(item);
  59. }
  60. function handleStr(str) {
  61. if (typeof str !== 'string' || str.indexOf('{') === -1 || str.indexOf('}') === -1 || str.indexOf('$') === -1) {
  62. return str;
  63. }
  64. let matchs = str.match(strRegex);
  65. if(matchs){
  66. let name = matchs[1] + (matchs[2]? '.' + matchs[2] : '');
  67. if(!name) return str;
  68. var names = name.split(varSplit);
  69. var data = context;
  70. if(typeof context[names[0]] === undefined){
  71. return str;
  72. }
  73. names.forEach(function (n) {
  74. if (data === '') return '';
  75. if (n in data) {
  76. data = data[n];
  77. } else {
  78. data = '';
  79. }
  80. });
  81. return data;
  82. }
  83. return str;
  84. }
  85. }
  86. module.exports = mock;