yapi-next/vendors/client/components/AceEditor/mockEditor.js
2023-06-27 18:59:45 +08:00

198 lines
5.9 KiB
JavaScript
Executable File

var ace = require('brace'),
Mock = require('mockjs');
require('brace/mode/javascript');
require('brace/mode/json');
require('brace/mode/xml');
require('brace/mode/html');
require('brace/theme/xcode');
require('brace/ext/language_tools.js');
var json5 = require('json5');
const MockExtra = require('common/mock-extra.js');
var langTools = ace.acequire('ace/ext/language_tools'),
wordList = [
{ name: '字符串', mock: '@string' },
{ name: '自然数', mock: '@natural' },
{ name: '浮点数', mock: '@float' },
{ name: '字符', mock: '@character' },
{ name: '布尔', mock: '@boolean' },
{ name: 'url', mock: '@url' },
{ name: '域名', mock: '@domain' },
{ name: 'ip地址', mock: '@ip' },
{ name: 'id', mock: '@id' },
{ name: 'guid', mock: '@guid' },
{ name: '当前时间', mock: '@now' },
{ name: '时间戳', mock: '@timestamp' },
{ name: '日期', mock: '@date' },
{ name: '时间', mock: '@time' },
{ name: '日期时间', mock: '@datetime' },
{ name: '图片连接', mock: '@image' },
{ name: '图片data', mock: '@imageData' },
{ name: '颜色', mock: '@color' },
{ name: '颜色hex', mock: '@hex' },
{ name: '颜色rgba', mock: '@rgba' },
{ name: '颜色rgb', mock: '@rgb' },
{ name: '颜色hsl', mock: '@hsl' },
{ name: '整数', mock: '@integer' },
{ name: 'email', mock: '@email' },
{ name: '大段文本', mock: '@paragraph' },
{ name: '句子', mock: '@sentence' },
{ name: '单词', mock: '@word' },
{ name: '大段中文文本', mock: '@cparagraph' },
{ name: '中文标题', mock: '@ctitle' },
{ name: '标题', mock: '@title' },
{ name: '姓名', mock: '@name' },
{ name: '中文姓名', mock: '@cname' },
{ name: '中文姓', mock: '@cfirst' },
{ name: '中文名', mock: '@clast' },
{ name: '英文姓', mock: '@first' },
{ name: '英文名', mock: '@last' },
{ name: '中文句子', mock: '@csentence' },
{ name: '中文词组', mock: '@cword' },
{ name: '地址', mock: '@region' },
{ name: '省份', mock: '@province' },
{ name: '城市', mock: '@city' },
{ name: '地区', mock: '@county' },
{ name: '转换为大写', mock: '@upper' },
{ name: '转换为小写', mock: '@lower' },
{ name: '挑选(枚举)', mock: '@pick' },
{ name: '打乱数组', mock: '@shuffle' },
{ name: '协议', mock: '@protocol' }
];
let dom = ace.acequire('ace/lib/dom');
ace.acequire('ace/commands/default_commands').commands.push({
name: 'Toggle Fullscreen',
bindKey: 'F9',
exec: function(editor) {
if (editor._fullscreen_yapi) {
let fullScreen = dom.toggleCssClass(document.body, 'fullScreen');
dom.setCssClass(editor.container, 'fullScreen', fullScreen);
editor.setAutoScrollEditorIntoView(!fullScreen);
editor.resize();
}
}
});
function run(options) {
var editor, mockEditor, rhymeCompleter;
function handleJson(json) {
var curData = mockEditor.curData;
try {
curData.text = json;
var obj = json5.parse(json);
curData.format = true;
curData.jsonData = obj;
curData.mockData = () => Mock.mock(MockExtra(obj, {})); //为防止时时 mock 导致页面卡死的问题,改成函数式需要用到再计算
} catch (e) {
curData.format = e.message;
}
}
options = options || {};
var container, data;
container = options.container || 'mock-editor';
if (
options.wordList &&
typeof options.wordList === 'object' &&
options.wordList.name &&
options.wordList.mock
) {
wordList.push(options.wordList);
}
data = options.data || '';
options.readOnly = options.readOnly || false;
options.fullScreen = options.fullScreen || false;
editor = ace.edit(container);
editor.$blockScrolling = Infinity;
editor.getSession().setMode('ace/mode/javascript');
if (options.readOnly === true) {
editor.setReadOnly(true);
editor.renderer.$cursorLayer.element.style.display = 'none';
}
editor.setTheme('ace/theme/xcode');
editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: false,
enableLiveAutocompletion: true,
useWorker: true
});
editor._fullscreen_yapi = options.fullScreen;
mockEditor = {
curData: {},
getValue: () => mockEditor.curData.text,
setValue: function(data) {
editor.setValue(handleData(data));
},
editor: editor,
options: options,
insertCode: code => {
let pos = editor.selection.getCursor();
editor.session.insert(pos, code);
}
};
function formatJson(json) {
try {
return JSON.stringify(JSON.parse(json), null, 2);
} catch (err) {
return json;
}
}
function handleData(data) {
data = data || '';
if (typeof data === 'string') {
return formatJson(data);
} else if (typeof data === 'object') {
return JSON.stringify(data, null, ' ');
} else {
return '' + data;
}
}
rhymeCompleter = {
identifierRegexps: [/[@]/],
getCompletions: function(editor, session, pos, prefix, callback) {
if (prefix.length === 0) {
callback(null, []);
return;
}
callback(
null,
wordList.map(function(ea) {
return { name: ea.mock, value: ea.mock, score: ea.mock, meta: ea.name };
})
);
}
};
langTools.addCompleter(rhymeCompleter);
mockEditor.setValue(handleData(data));
handleJson(editor.getValue());
editor.clearSelection();
editor.getSession().on('change', () => {
handleJson(editor.getValue());
if (typeof options.onChange === 'function') {
options.onChange.call(mockEditor, mockEditor.curData);
}
editor.clearSelection();
});
return mockEditor;
}
/**
* mockEditor({
container: 'req_body_json', //dom的id
data: that.state.req_body_json, //初始化数据
onChange: function (d) {
that.setState({
req_body_json: d.text
})
}
})
*/
module.exports = run;