mock平台

shema-transformTo-table.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. const _ = require('underscore');
  2. let fieldNum = 1;
  3. exports.schemaTransformToTable = schema => {
  4. try {
  5. schema = checkJsonSchema(schema);
  6. let result = Schema(schema, 0);
  7. result = _.isArray(result) ? result : [result];
  8. return result;
  9. } catch (err) {
  10. console.log(err);
  11. }
  12. };
  13. // 自动添加type
  14. function checkJsonSchema(json) {
  15. let newJson = Object.assign({}, json);
  16. if (_.isUndefined(json.type) && _.isObject(json.properties)) {
  17. newJson.type = 'object';
  18. }
  19. return newJson;
  20. }
  21. const mapping = function(data, index) {
  22. switch (data.type) {
  23. case 'string':
  24. return SchemaString(data);
  25. case 'number':
  26. return SchemaNumber(data);
  27. case 'array':
  28. return SchemaArray(data, index);
  29. case 'object':
  30. return SchemaObject(data, index);
  31. case 'boolean':
  32. return SchemaBoolean(data);
  33. case 'integer':
  34. return SchemaInt(data);
  35. default:
  36. return SchemaOther(data);
  37. }
  38. };
  39. const Schema = (data, key) => {
  40. let result = mapping(data, key);
  41. if (data.type !== 'object') {
  42. let desc = result.desc;
  43. let d = result.default;
  44. let children = result.children;
  45. delete result.desc;
  46. delete result.default;
  47. delete result.children;
  48. let item = {
  49. type: data.type,
  50. key,
  51. desc,
  52. default: d,
  53. sub: result
  54. };
  55. if (_.isArray(children)) {
  56. item = Object.assign({}, item, { children });
  57. }
  58. return item;
  59. }
  60. return result;
  61. };
  62. const SchemaObject = (data, key) => {
  63. let { properties, required } = data;
  64. properties = properties || {};
  65. required = required || [];
  66. let result = [];
  67. Object.keys(properties).map((name, index) => {
  68. let value = properties[name];
  69. let copiedState = checkJsonSchema(JSON.parse(JSON.stringify(value)));
  70. let optionForm = Schema(copiedState, key + '-' + index);
  71. let item = {
  72. name,
  73. key: key + '-' + index,
  74. desc: copiedState.description,
  75. required: required.indexOf(name) != -1
  76. };
  77. if (value.type === 'object' || (_.isUndefined(value.type) && _.isArray(optionForm))) {
  78. item = Object.assign({}, item, { type: 'object', children: optionForm });
  79. delete item.sub;
  80. } else {
  81. item = Object.assign({}, item, optionForm);
  82. }
  83. result.push(item);
  84. });
  85. return result;
  86. };
  87. const SchemaString = data => {
  88. let item = {
  89. desc: data.description,
  90. default: data.default,
  91. maxLength: data.maxLength,
  92. minLength: data.minLength,
  93. enum: data.enum,
  94. enumDesc: data.enumDesc,
  95. format: data.format,
  96. mock: data.mock && data.mock.mock
  97. };
  98. return item;
  99. };
  100. const SchemaArray = (data, index) => {
  101. data.items = data.items || { type: 'string' };
  102. let items = checkJsonSchema(data.items);
  103. let optionForm = mapping(items, index);
  104. // 处理array嵌套array的问题
  105. let children =optionForm ;
  106. if (!_.isArray(optionForm) && !_.isUndefined(optionForm)) {
  107. optionForm.key = 'array-' + fieldNum++;
  108. children = [optionForm];
  109. }
  110. let item = {
  111. desc: data.description,
  112. default: data.default,
  113. minItems: data.minItems,
  114. uniqueItems: data.uniqueItems,
  115. maxItems: data.maxItems,
  116. itemType: items.type,
  117. children
  118. };
  119. if (items.type === 'string') {
  120. item = Object.assign({}, item, { itemFormat: items.format });
  121. }
  122. return item;
  123. };
  124. const SchemaNumber = data => {
  125. let item = {
  126. desc: data.description,
  127. maximum: data.maximum,
  128. minimum: data.minimum,
  129. default: data.default,
  130. format: data.format,
  131. enum: data.enum,
  132. enumDesc: data.enumDesc,
  133. mock: data.mock && data.mock.mock
  134. };
  135. return item;
  136. };
  137. const SchemaInt = data => {
  138. let item = {
  139. desc: data.description,
  140. maximum: data.maximum,
  141. minimum: data.minimum,
  142. default: data.default,
  143. format: data.format,
  144. enum: data.enum,
  145. enumDesc: data.enumDesc,
  146. mock: data.mock && data.mock.mock
  147. };
  148. return item;
  149. };
  150. const SchemaBoolean = data => {
  151. let item = {
  152. desc: data.description,
  153. default: data.default,
  154. enum: data.enum,
  155. mock: data.mock && data.mock.mock
  156. };
  157. return item;
  158. };
  159. const SchemaOther = data => {
  160. let item = {
  161. desc: data.description,
  162. default: data.default,
  163. mock: data.mock && data.mock.mock
  164. };
  165. return item;
  166. };