| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- 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 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: 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: 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: 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: 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: 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: data.description,
- default: data.default,
- enum: data.enum,
- mock: data.mock && data.mock.mock
- };
- return item;
- };
- const SchemaOther = data => {
- let item = {
- desc: data.description,
- default: data.default,
- mock: data.mock && data.mock.mock
- };
- return item;
- };
|