mock平台

mockEditor.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. var ace = require('brace'),
  2. Mock = require('mockjs');
  3. require('brace/mode/javascript');
  4. require('brace/mode/json');
  5. require('brace/mode/xml');
  6. require('brace/mode/html');
  7. require('brace/theme/xcode');
  8. require('brace/ext/language_tools.js');
  9. var json5 = require('json5');
  10. const MockExtra = require('common/mock-extra.js');
  11. var langTools = ace.acequire('ace/ext/language_tools'),
  12. wordList = [
  13. { name: '字符串', mock: '@string' },
  14. { name: '自然数', mock: '@natural' },
  15. { name: '浮点数', mock: '@float' },
  16. { name: '字符', mock: '@character' },
  17. { name: '布尔', mock: '@boolean' },
  18. { name: 'url', mock: '@url' },
  19. { name: '域名', mock: '@domain' },
  20. { name: 'ip地址', mock: '@ip' },
  21. { name: 'id', mock: '@id' },
  22. { name: 'guid', mock: '@guid' },
  23. { name: '当前时间', mock: '@now' },
  24. { name: '时间戳', mock: '@timestamp' },
  25. { name: '日期', mock: '@date' },
  26. { name: '时间', mock: '@time' },
  27. { name: '日期时间', mock: '@datetime' },
  28. { name: '图片连接', mock: '@image' },
  29. { name: '图片data', mock: '@imageData' },
  30. { name: '颜色', mock: '@color' },
  31. { name: '颜色hex', mock: '@hex' },
  32. { name: '颜色rgba', mock: '@rgba' },
  33. { name: '颜色rgb', mock: '@rgb' },
  34. { name: '颜色hsl', mock: '@hsl' },
  35. { name: '整数', mock: '@integer' },
  36. { name: 'email', mock: '@email' },
  37. { name: '大段文本', mock: '@paragraph' },
  38. { name: '句子', mock: '@sentence' },
  39. { name: '单词', mock: '@word' },
  40. { name: '大段中文文本', mock: '@cparagraph' },
  41. { name: '中文标题', mock: '@ctitle' },
  42. { name: '标题', mock: '@title' },
  43. { name: '姓名', mock: '@name' },
  44. { name: '中文姓名', mock: '@cname' },
  45. { name: '中文姓', mock: '@cfirst' },
  46. { name: '中文名', mock: '@clast' },
  47. { name: '英文姓', mock: '@first' },
  48. { name: '英文名', mock: '@last' },
  49. { name: '中文句子', mock: '@csentence' },
  50. { name: '中文词组', mock: '@cword' },
  51. { name: '地址', mock: '@region' },
  52. { name: '省份', mock: '@province' },
  53. { name: '城市', mock: '@city' },
  54. { name: '地区', mock: '@county' },
  55. { name: '转换为大写', mock: '@upper' },
  56. { name: '转换为小写', mock: '@lower' },
  57. { name: '挑选(枚举)', mock: '@pick' },
  58. { name: '打乱数组', mock: '@shuffle' },
  59. { name: '协议', mock: '@protocol' }
  60. ];
  61. let dom = ace.acequire('ace/lib/dom');
  62. ace.acequire('ace/commands/default_commands').commands.push({
  63. name: 'Toggle Fullscreen',
  64. bindKey: 'F9',
  65. exec: function(editor) {
  66. if (editor._fullscreen_yapi) {
  67. let fullScreen = dom.toggleCssClass(document.body, 'fullScreen');
  68. dom.setCssClass(editor.container, 'fullScreen', fullScreen);
  69. editor.setAutoScrollEditorIntoView(!fullScreen);
  70. editor.resize();
  71. }
  72. }
  73. });
  74. function run(options) {
  75. var editor, mockEditor, rhymeCompleter;
  76. function handleJson(json) {
  77. var curData = mockEditor.curData;
  78. try {
  79. curData.text = json;
  80. var obj = json5.parse(json);
  81. curData.format = true;
  82. curData.jsonData = obj;
  83. curData.mockData = () => Mock.mock(MockExtra(obj, {})); //为防止时时 mock 导致页面卡死的问题,改成函数式需要用到再计算
  84. } catch (e) {
  85. curData.format = e.message;
  86. }
  87. }
  88. options = options || {};
  89. var container, data;
  90. container = options.container || 'mock-editor';
  91. if (
  92. options.wordList &&
  93. typeof options.wordList === 'object' &&
  94. options.wordList.name &&
  95. options.wordList.mock
  96. ) {
  97. wordList.push(options.wordList);
  98. }
  99. data = options.data || '';
  100. options.readOnly = options.readOnly || false;
  101. options.fullScreen = options.fullScreen || false;
  102. editor = ace.edit(container);
  103. editor.$blockScrolling = Infinity;
  104. editor.getSession().setMode('ace/mode/javascript');
  105. if (options.readOnly === true) {
  106. editor.setReadOnly(true);
  107. editor.renderer.$cursorLayer.element.style.display = 'none';
  108. }
  109. editor.setTheme('ace/theme/xcode');
  110. editor.setOptions({
  111. enableBasicAutocompletion: true,
  112. enableSnippets: false,
  113. enableLiveAutocompletion: true,
  114. useWorker: true
  115. });
  116. editor._fullscreen_yapi = options.fullScreen;
  117. mockEditor = {
  118. curData: {},
  119. getValue: () => mockEditor.curData.text,
  120. setValue: function(data) {
  121. editor.setValue(handleData(data));
  122. },
  123. editor: editor,
  124. options: options,
  125. insertCode: code => {
  126. let pos = editor.selection.getCursor();
  127. editor.session.insert(pos, code);
  128. }
  129. };
  130. function formatJson(json) {
  131. try {
  132. return JSON.stringify(JSON.parse(json), null, 2);
  133. } catch (err) {
  134. return json;
  135. }
  136. }
  137. function handleData(data) {
  138. data = data || '';
  139. if (typeof data === 'string') {
  140. return formatJson(data);
  141. } else if (typeof data === 'object') {
  142. return JSON.stringify(data, null, ' ');
  143. } else {
  144. return '' + data;
  145. }
  146. }
  147. rhymeCompleter = {
  148. identifierRegexps: [/[@]/],
  149. getCompletions: function(editor, session, pos, prefix, callback) {
  150. if (prefix.length === 0) {
  151. callback(null, []);
  152. return;
  153. }
  154. callback(
  155. null,
  156. wordList.map(function(ea) {
  157. return { name: ea.mock, value: ea.mock, score: ea.mock, meta: ea.name };
  158. })
  159. );
  160. }
  161. };
  162. langTools.addCompleter(rhymeCompleter);
  163. mockEditor.setValue(handleData(data));
  164. handleJson(editor.getValue());
  165. editor.clearSelection();
  166. editor.getSession().on('change', () => {
  167. handleJson(editor.getValue());
  168. if (typeof options.onChange === 'function') {
  169. options.onChange.call(mockEditor, mockEditor.curData);
  170. }
  171. editor.clearSelection();
  172. });
  173. return mockEditor;
  174. }
  175. /**
  176. * mockEditor({
  177. container: 'req_body_json', //dom的id
  178. data: that.state.req_body_json, //初始化数据
  179. onChange: function (d) {
  180. that.setState({
  181. req_body_json: d.text
  182. })
  183. }
  184. })
  185. */
  186. module.exports = run;