yapi-next/vendors/common/schema-transformTo-table.js
2023-06-25 19:08:56 +08:00

198 lines
4.4 KiB
JavaScript

const _ = require('underscore');
let fieldNum = 1;
exports.schemaTransformToTable = schema => {
try {
schema = checkJsonSchema(schema);
let result = Schema(schema, 0);
result = _.isArray(result) ? result : [result];
return result;
} catch (err) {
console.log(err);
}
};
// 自动添加type
function checkJsonSchema(json) {
let newJson = Object.assign({}, json);
if (_.isUndefined(json.type) && _.isObject(json.properties)) {
newJson.type = 'object';
}
return newJson;
}
const mapping = function(data, index) {
switch (data.type) {
case 'string':
return SchemaString(data);
case 'number':
return SchemaNumber(data);
case 'array':
return SchemaArray(data, index);
case 'object':
return SchemaObject(data, index);
case 'boolean':
return SchemaBoolean(data);
case 'integer':
return SchemaInt(data);
default:
return SchemaOther(data);
}
};
const ConcatDesc = (title, desc) => {
return [title, desc].join('\n').trim();
};
const Schema = (data, key) => {
let result = mapping(data, key);
if (data.type !== 'object') {
let desc = result.desc;
let d = result.default;
let children = result.children;
delete result.desc;
delete result.default;
delete result.children;
let item = {
type: data.type,
key,
desc,
default: d,
sub: result
};
if (_.isArray(children)) {
item = Object.assign({}, item, { children });
}
return item;
}
return result;
};
const SchemaObject = (data, key) => {
let { properties, required } = data;
properties = properties || {};
required = required || [];
let result = [];
Object.keys(properties).map((name, index) => {
let value = properties[name];
let copiedState = checkJsonSchema(JSON.parse(JSON.stringify(value)));
let optionForm = Schema(copiedState, key + '-' + index);
let item = {
name,
key: key + '-' + index,
desc: ConcatDesc(copiedState.title, copiedState.description),
required: required.indexOf(name) != -1
};
if (value.type === 'object' || (_.isUndefined(value.type) && _.isArray(optionForm))) {
item = Object.assign({}, item, { type: 'object', children: optionForm });
delete item.sub;
} else {
item = Object.assign({}, item, optionForm);
}
result.push(item);
});
return result;
};
const SchemaString = data => {
let item = {
desc: ConcatDesc(data.title, data.description),
default: data.default,
maxLength: data.maxLength,
minLength: data.minLength,
enum: data.enum,
enumDesc: data.enumDesc,
format: data.format,
mock: data.mock && data.mock.mock
};
return item;
};
const SchemaArray = (data, index) => {
data.items = data.items || { type: 'string' };
let items = checkJsonSchema(data.items);
let optionForm = mapping(items, index);
// 处理array嵌套array的问题
let children =optionForm ;
if (!_.isArray(optionForm) && !_.isUndefined(optionForm)) {
optionForm.key = 'array-' + fieldNum++;
children = [optionForm];
}
let item = {
desc: ConcatDesc(data.title, data.description),
default: data.default,
minItems: data.minItems,
uniqueItems: data.uniqueItems,
maxItems: data.maxItems,
itemType: items.type,
children
};
if (items.type === 'string') {
item = Object.assign({}, item, { itemFormat: items.format });
}
return item;
};
const SchemaNumber = data => {
let item = {
desc: ConcatDesc(data.title, data.description),
maximum: data.maximum,
minimum: data.minimum,
default: data.default,
format: data.format,
enum: data.enum,
enumDesc: data.enumDesc,
mock: data.mock && data.mock.mock
};
return item;
};
const SchemaInt = data => {
let item = {
desc: ConcatDesc(data.title, data.description),
maximum: data.maximum,
minimum: data.minimum,
default: data.default,
format: data.format,
enum: data.enum,
enumDesc: data.enumDesc,
mock: data.mock && data.mock.mock
};
return item;
};
const SchemaBoolean = data => {
let item = {
desc: ConcatDesc(data.title, data.description),
default: data.default,
enum: data.enum,
mock: data.mock && data.mock.mock
};
return item;
};
const SchemaOther = data => {
let item = {
desc: ConcatDesc(data.title, data.description),
default: data.default,
mock: data.mock && data.mock.mock
};
return item;
};