wormajs 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/bin/actions.js +245 -0
  4. package/dist/bin/cli.js +27 -0
  5. package/dist/bin/progressRenderer.js +47 -0
  6. package/dist/bin/renderer.js +551 -0
  7. package/dist/bin/theme.js +26 -0
  8. package/dist/config.js +19 -0
  9. package/dist/constant.js +162 -0
  10. package/dist/core/WorkerPool.js +102 -0
  11. package/dist/core/loader/astLoader/generates/array.js +34 -0
  12. package/dist/core/loader/astLoader/generates/enum.js +61 -0
  13. package/dist/core/loader/astLoader/generates/group.js +41 -0
  14. package/dist/core/loader/astLoader/generates/index.js +71 -0
  15. package/dist/core/loader/astLoader/generates/interface.js +59 -0
  16. package/dist/core/loader/astLoader/generates/simple.js +67 -0
  17. package/dist/core/loader/astLoader/generates/tuple.js +54 -0
  18. package/dist/core/loader/astLoader/generates/type.js +2 -0
  19. package/dist/core/loader/astLoader/generates/utils.js +86 -0
  20. package/dist/core/loader/astLoader/helper.js +21 -0
  21. package/dist/core/loader/astLoader/index.js +24 -0
  22. package/dist/core/loader/astLoader/normalize/index.js +70 -0
  23. package/dist/core/loader/astLoader/normalize/normalizer.js +69 -0
  24. package/dist/core/loader/astLoader/normalize/rules/convertTypeArray.js +68 -0
  25. package/dist/core/loader/astLoader/normalize/rules/handleEmptyType.js +8 -0
  26. package/dist/core/loader/astLoader/normalize/rules/inferType.js +43 -0
  27. package/dist/core/loader/astLoader/normalize/rules/mergeAnyOf.js +45 -0
  28. package/dist/core/loader/astLoader/normalize/rules/normalizeCombiningKeywords.js +26 -0
  29. package/dist/core/loader/astLoader/normalize/rules/normalizeEnum.js +38 -0
  30. package/dist/core/loader/astLoader/normalize/rules/normalizeNullType.js +24 -0
  31. package/dist/core/loader/astLoader/normalize/rules/removeRedundantKeywords.js +27 -0
  32. package/dist/core/loader/astLoader/normalize/rules/simplifySingleType.js +8 -0
  33. package/dist/core/loader/astLoader/normalize/rules/validateSchema.js +14 -0
  34. package/dist/core/loader/astLoader/parsers/array.js +28 -0
  35. package/dist/core/loader/astLoader/parsers/enum.js +49 -0
  36. package/dist/core/loader/astLoader/parsers/forward/array.js +12 -0
  37. package/dist/core/loader/astLoader/parsers/forward/enum.js +10 -0
  38. package/dist/core/loader/astLoader/parsers/forward/group.js +12 -0
  39. package/dist/core/loader/astLoader/parsers/forward/index.js +20 -0
  40. package/dist/core/loader/astLoader/parsers/forward/object.js +12 -0
  41. package/dist/core/loader/astLoader/parsers/forward/tuple.js +11 -0
  42. package/dist/core/loader/astLoader/parsers/forward/type.js +2 -0
  43. package/dist/core/loader/astLoader/parsers/group.js +50 -0
  44. package/dist/core/loader/astLoader/parsers/index.js +66 -0
  45. package/dist/core/loader/astLoader/parsers/object.js +44 -0
  46. package/dist/core/loader/astLoader/parsers/reference.js +41 -0
  47. package/dist/core/loader/astLoader/parsers/simple.js +48 -0
  48. package/dist/core/loader/astLoader/parsers/tuple.js +36 -0
  49. package/dist/core/loader/astLoader/parsers/type.js +2 -0
  50. package/dist/core/loader/astLoader/parsers/utils.js +58 -0
  51. package/dist/core/loader/callingCodeLoader/helper.js +183 -0
  52. package/dist/core/loader/callingCodeLoader/index.js +40 -0
  53. package/dist/core/loader/index.js +20 -0
  54. package/dist/core/loader/schemaLoader/index.js +101 -0
  55. package/dist/core/loader/standardLoader/helper.js +142 -0
  56. package/dist/core/loader/standardLoader/index.js +38 -0
  57. package/dist/core/loader/standardLoader/standards.js +105 -0
  58. package/dist/core/parser/index.js +18 -0
  59. package/dist/core/parser/openApiParser/helper.js +165 -0
  60. package/dist/core/parser/openApiParser/index.js +14 -0
  61. package/dist/core/parser/templateParser/helper.js +333 -0
  62. package/dist/core/parser/templateParser/index.js +314 -0
  63. package/dist/core/workerPool/index.js +6 -0
  64. package/dist/core/workerPool/poolManager.js +45 -0
  65. package/dist/core/workerPool/swagger2Worker.js +24 -0
  66. package/dist/core/workerPool/worker.js +61 -0
  67. package/dist/createConfig.js +37 -0
  68. package/dist/defineConfig.js +6 -0
  69. package/dist/functions/getAutoTemplateType.js +37 -0
  70. package/dist/functions/getFrameworkTag.js +18 -0
  71. package/dist/functions/prepareConfig.js +41 -0
  72. package/dist/functions/readWormaRc.js +155 -0
  73. package/dist/functions/wormaJson.js +232 -0
  74. package/dist/generate.js +84 -0
  75. package/dist/helper/PluginDriver.js +98 -0
  76. package/dist/helper/comment.js +88 -0
  77. package/dist/helper/config/ConfigHelper.js +79 -0
  78. package/dist/helper/config/ConfigManager.js +88 -0
  79. package/dist/helper/config/GeneratorHelper.js +343 -0
  80. package/dist/helper/config/index.js +19 -0
  81. package/dist/helper/config/type.js +2 -0
  82. package/dist/helper/config/zType.js +170 -0
  83. package/dist/helper/document/index.js +160 -0
  84. package/dist/helper/index.js +23 -0
  85. package/dist/helper/logger/index.js +76 -0
  86. package/dist/helper/progress.js +66 -0
  87. package/dist/helper/template/index.js +475 -0
  88. package/dist/index.js +33 -0
  89. package/dist/plugins/createPlugin.js +30 -0
  90. package/dist/plugins/index.js +34 -0
  91. package/dist/plugins/presets/aiDoc.js +173 -0
  92. package/dist/plugins/presets/apifox.js +56 -0
  93. package/dist/plugins/presets/filterApi.js +129 -0
  94. package/dist/plugins/presets/importType.js +49 -0
  95. package/dist/plugins/presets/payloadModifier/hepler.js +195 -0
  96. package/dist/plugins/presets/payloadModifier/index.js +122 -0
  97. package/dist/plugins/presets/payloadModifier/type.js +2 -0
  98. package/dist/plugins/presets/platform.js +73 -0
  99. package/dist/plugins/presets/rename.js +209 -0
  100. package/dist/plugins/presets/tagModifier.js +104 -0
  101. package/dist/plugins/presets/utils.js +36 -0
  102. package/dist/readConfig.js +92 -0
  103. package/dist/resolveWorkspaces.js +83 -0
  104. package/dist/template/index.js +180 -0
  105. package/dist/template/presets/ai-doc/SKILL.md.handlebars +29 -0
  106. package/dist/template/presets/ai-doc/references/{tag}/{api}.md.handlebars +54 -0
  107. package/dist/template/presets/alova/common/#index.cjs.handlebars +12 -0
  108. package/dist/template/presets/alova/common/components.d.cts.handlebars +1 -0
  109. package/dist/template/presets/alova/common/helper.cjs.handlebars +13 -0
  110. package/dist/template/presets/alova/common/services/#index.cjs.handlebars +13 -0
  111. package/dist/template/presets/alova/common/services/{tag}.cjs.handlebars +28 -0
  112. package/dist/template/presets/alova/common/services/{tag}.d.cts.handlebars +15 -0
  113. package/dist/template/presets/alova/common/typed.d.cts.handlebars +1 -0
  114. package/dist/template/presets/alova/module/#index.js.handlebars +12 -0
  115. package/dist/template/presets/alova/module/components.d.ts.handlebars +1 -0
  116. package/dist/template/presets/alova/module/helper.js.handlebars +11 -0
  117. package/dist/template/presets/alova/module/services/#index.js.handlebars +9 -0
  118. package/dist/template/presets/alova/module/services/{tag}.d.ts.handlebars +15 -0
  119. package/dist/template/presets/alova/module/services/{tag}.js.handlebars +21 -0
  120. package/dist/template/presets/alova/module/typed.d.ts.handlebars +1 -0
  121. package/dist/template/presets/alova/partials/api-jsdoc.handlebars +44 -0
  122. package/dist/template/presets/alova/partials/build-payload-body.handlebars +22 -0
  123. package/dist/template/presets/alova/partials/comment.handlebars +19 -0
  124. package/dist/template/presets/alova/partials/components-body.handlebars +4 -0
  125. package/dist/template/presets/alova/partials/dts-extra-config.handlebars +8 -0
  126. package/dist/template/presets/alova/partials/dts-fn-declare.handlebars +1 -0
  127. package/dist/template/presets/alova/partials/extract-responded.handlebars +11 -0
  128. package/dist/template/presets/alova/partials/stateshook-import.handlebars +9 -0
  129. package/dist/template/presets/alova/partials/stateshook-option.handlebars +9 -0
  130. package/dist/template/presets/alova/partials/typed-body.handlebars +43 -0
  131. package/dist/template/presets/alova/typescript/#index.ts.handlebars +14 -0
  132. package/dist/template/presets/alova/typescript/components.d.ts.handlebars +1 -0
  133. package/dist/template/presets/alova/typescript/helper.ts.handlebars +9 -0
  134. package/dist/template/presets/alova/typescript/services/#index.ts.handlebars +9 -0
  135. package/dist/template/presets/alova/typescript/services/{tag}.ts.handlebars +35 -0
  136. package/dist/template/presets/alova/typescript/typed.ts.handlebars +1 -0
  137. package/dist/template/presets/alova-globals/common/#index.cjs.handlebars +41 -0
  138. package/dist/template/presets/alova-globals/common/apiDefinitions.cjs.handlebars +12 -0
  139. package/dist/template/presets/alova-globals/common/createApis.cjs.handlebars +48 -0
  140. package/dist/template/presets/alova-globals/common/globals.d.cts.handlebars +2 -0
  141. package/dist/template/presets/alova-globals/module/#index.js.handlebars +2 -0
  142. package/dist/template/presets/alova-globals/module/apiDefinitions.js.handlebars +12 -0
  143. package/dist/template/presets/alova-globals/module/createApis.js.handlebars +44 -0
  144. package/dist/template/presets/alova-globals/module/globals.d.ts.handlebars +2 -0
  145. package/dist/template/presets/alova-globals/partials/comment.handlebars +19 -0
  146. package/dist/template/presets/alova-globals/partials/createApis-proxy-js.handlebars +55 -0
  147. package/dist/template/presets/alova-globals/partials/globals-d-ts.handlebars +148 -0
  148. package/dist/template/presets/alova-globals/partials/index-esm.handlebars +38 -0
  149. package/dist/template/presets/alova-globals/partials/withConfigType-jsdoc.handlebars +22 -0
  150. package/dist/template/presets/alova-globals/typescript/#index.ts.handlebars +2 -0
  151. package/dist/template/presets/alova-globals/typescript/apiDefinitions.ts.handlebars +12 -0
  152. package/dist/template/presets/alova-globals/typescript/createApis.ts.handlebars +99 -0
  153. package/dist/template/presets/alova-globals/typescript/globals.d.ts.handlebars +2 -0
  154. package/dist/template/presets/axios/common/#index.cjs.handlebars +22 -0
  155. package/dist/template/presets/axios/common/components.d.cts.handlebars +1 -0
  156. package/dist/template/presets/axios/common/helper.cjs.handlebars +27 -0
  157. package/dist/template/presets/axios/common/services/#index.cjs.handlebars +13 -0
  158. package/dist/template/presets/axios/common/services/{tag}.cjs.handlebars +28 -0
  159. package/dist/template/presets/axios/common/services/{tag}.d.cts.handlebars +11 -0
  160. package/dist/template/presets/axios/module/#index.js.handlebars +20 -0
  161. package/dist/template/presets/axios/module/components.d.ts.handlebars +1 -0
  162. package/dist/template/presets/axios/module/helper.js.handlebars +25 -0
  163. package/dist/template/presets/axios/module/services/#index.js.handlebars +9 -0
  164. package/dist/template/presets/axios/module/services/{tag}.d.ts.handlebars +11 -0
  165. package/dist/template/presets/axios/module/services/{tag}.js.handlebars +20 -0
  166. package/dist/template/presets/axios/partials/api-jsdoc.handlebars +44 -0
  167. package/dist/template/presets/axios/partials/comment.handlebars +19 -0
  168. package/dist/template/presets/axios/partials/components-body.handlebars +4 -0
  169. package/dist/template/presets/axios/partials/dts-fn-declare.handlebars +1 -0
  170. package/dist/template/presets/axios/partials/dts-types.handlebars +7 -0
  171. package/dist/template/presets/axios/typescript/#index.ts.handlebars +20 -0
  172. package/dist/template/presets/axios/typescript/components.d.ts.handlebars +1 -0
  173. package/dist/template/presets/axios/typescript/helper.ts.handlebars +28 -0
  174. package/dist/template/presets/axios/typescript/services/#index.ts.handlebars +9 -0
  175. package/dist/template/presets/axios/typescript/services/{tag}.ts.handlebars +31 -0
  176. package/dist/template/presets/config/common/worma.config.js.handlebars +9 -0
  177. package/dist/template/presets/config/module/worma.config.js.handlebars +9 -0
  178. package/dist/template/presets/config/partials/generator-content.handlebars +45 -0
  179. package/dist/template/presets/config/typescript/worma.config.ts.handlebars +9 -0
  180. package/dist/template/presets/fetch/common/#index.cjs.handlebars +17 -0
  181. package/dist/template/presets/fetch/common/FetchClient.cjs.handlebars +48 -0
  182. package/dist/template/presets/fetch/common/components.d.cts.handlebars +1 -0
  183. package/dist/template/presets/fetch/common/helper.cjs.handlebars +27 -0
  184. package/dist/template/presets/fetch/common/services/#index.cjs.handlebars +13 -0
  185. package/dist/template/presets/fetch/common/services/{tag}.cjs.handlebars +23 -0
  186. package/dist/template/presets/fetch/common/services/{tag}.d.cts.handlebars +10 -0
  187. package/dist/template/presets/fetch/module/#index.js.handlebars +15 -0
  188. package/dist/template/presets/fetch/module/FetchClient.js.handlebars +46 -0
  189. package/dist/template/presets/fetch/module/components.d.ts.handlebars +1 -0
  190. package/dist/template/presets/fetch/module/helper.js.handlebars +25 -0
  191. package/dist/template/presets/fetch/module/services/#index.js.handlebars +9 -0
  192. package/dist/template/presets/fetch/module/services/{tag}.d.ts.handlebars +10 -0
  193. package/dist/template/presets/fetch/module/services/{tag}.js.handlebars +15 -0
  194. package/dist/template/presets/fetch/partials/api-jsdoc.handlebars +44 -0
  195. package/dist/template/presets/fetch/partials/comment.handlebars +19 -0
  196. package/dist/template/presets/fetch/partials/components-body.handlebars +4 -0
  197. package/dist/template/presets/fetch/partials/dts-fn-declare.handlebars +1 -0
  198. package/dist/template/presets/fetch/partials/dts-types.handlebars +7 -0
  199. package/dist/template/presets/fetch/typescript/#index.ts.handlebars +15 -0
  200. package/dist/template/presets/fetch/typescript/FetchClient.ts.handlebars +59 -0
  201. package/dist/template/presets/fetch/typescript/components.d.ts.handlebars +1 -0
  202. package/dist/template/presets/fetch/typescript/helper.ts.handlebars +28 -0
  203. package/dist/template/presets/fetch/typescript/services/#index.ts.handlebars +9 -0
  204. package/dist/template/presets/fetch/typescript/services/{tag}.ts.handlebars +25 -0
  205. package/dist/template/presets/ky/module/#index.js.handlebars +14 -0
  206. package/dist/template/presets/ky/module/components.d.ts.handlebars +1 -0
  207. package/dist/template/presets/ky/module/helper.js.handlebars +27 -0
  208. package/dist/template/presets/ky/module/services/#index.js.handlebars +9 -0
  209. package/dist/template/presets/ky/module/services/{tag}.d.ts.handlebars +11 -0
  210. package/dist/template/presets/ky/module/services/{tag}.js.handlebars +19 -0
  211. package/dist/template/presets/ky/partials/api-jsdoc.handlebars +44 -0
  212. package/dist/template/presets/ky/partials/comment.handlebars +19 -0
  213. package/dist/template/presets/ky/partials/components-body.handlebars +4 -0
  214. package/dist/template/presets/ky/partials/dts-fn-declare.handlebars +1 -0
  215. package/dist/template/presets/ky/partials/dts-types.handlebars +9 -0
  216. package/dist/template/presets/ky/typescript/#index.ts.handlebars +14 -0
  217. package/dist/template/presets/ky/typescript/components.d.ts.handlebars +1 -0
  218. package/dist/template/presets/ky/typescript/helper.ts.handlebars +30 -0
  219. package/dist/template/presets/ky/typescript/services/#index.ts.handlebars +9 -0
  220. package/dist/template/presets/ky/typescript/services/{tag}.ts.handlebars +30 -0
  221. package/dist/tsconfig.build.tsbuildinfo +1 -0
  222. package/dist/type/api.js +14 -0
  223. package/dist/type/ast.js +24 -0
  224. package/dist/type/base.js +17 -0
  225. package/dist/type/index.js +20 -0
  226. package/dist/type/lib.js +17 -0
  227. package/dist/type/openapi.js +2 -0
  228. package/dist/utils/base.js +212 -0
  229. package/dist/utils/format.js +64 -0
  230. package/dist/utils/index.js +21 -0
  231. package/dist/utils/openapi.js +417 -0
  232. package/dist/utils/readPackageJson.js +35 -0
  233. package/dist/utils/template.js +93 -0
  234. package/package.json +88 -0
  235. package/typings/index.d.ts +512 -0
  236. package/typings/plugins.d.ts +727 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generate = generate;
4
+ exports.getValue = getValue;
5
+ exports.setComment = setComment;
6
+ exports.normalizeCode = normalizeCode;
7
+ exports.getTsStr = getTsStr;
8
+ const helper_1 = require("../../../../helper");
9
+ function generate(ast, ctx, generators) {
10
+ const generator = generators.find((generator) => {
11
+ const tyes = [generator.type].flat();
12
+ return tyes.includes(ast.type);
13
+ });
14
+ if (generator) {
15
+ return generator.generate(ast, ctx);
16
+ }
17
+ return null;
18
+ }
19
+ function getValue(result, options) {
20
+ if (options.shallowDeep) {
21
+ options.shallowDeep = false;
22
+ options.deep = false;
23
+ return result.code;
24
+ }
25
+ return options.deep || !result.name ? result.code : result.name;
26
+ }
27
+ function setComment(ast, options) {
28
+ let { comment } = ast;
29
+ if (ast.deepComment && options.deep) {
30
+ comment += ast.deepComment;
31
+ }
32
+ const commenter = helper_1.CommentHelper.load({
33
+ type: options.commentType,
34
+ comment,
35
+ });
36
+ if (ast.deprecated) {
37
+ commenter.add('[deprecated]');
38
+ }
39
+ ast.comment = commenter.end();
40
+ return ast.comment ?? '';
41
+ }
42
+ /** Generate normalized TS code body (prettier moved to file level per 9.5.1). Applies basic normalization for merged comments and indentation. */
43
+ function normalizeCode(code, type) {
44
+ // Fix merged */ with next content: */id → */\nid, */{ → */\n{
45
+ const result = code.replace(/\*\/(\s*\S)/g, '*/\n$1');
46
+ const trimmed = result.trim();
47
+ // Normalize indentation for block structures
48
+ const blockTypes = ['interface', 'type', 'enum', 'group', 'array'];
49
+ if (!type || !blockTypes.includes(type))
50
+ return trimmed;
51
+ // Match { ... } blocks (interface/enum) or Array<{ ... }> blocks
52
+ const isBlock = trimmed.startsWith('{') || trimmed.startsWith('[') || trimmed.startsWith('Array<{');
53
+ if (!isBlock)
54
+ return trimmed;
55
+ const lines = trimmed.split('\n');
56
+ if (lines.length <= 2)
57
+ return trimmed;
58
+ return lines.map((line, i) => {
59
+ if (i === 0 || i === lines.length - 1)
60
+ return line.trim();
61
+ // Preserve nested indentation: lines already indented >= 2 spaces keep their depth
62
+ const trimmed = line.trimStart();
63
+ const leadingSpaces = line.length - trimmed.length;
64
+ return leadingSpaces >= 2 ? line : ` ${trimmed}`;
65
+ }).join('\n');
66
+ }
67
+ function getTsStr(genResult, options) {
68
+ let result = genResult.code;
69
+ switch (genResult.type) {
70
+ case 'interface':
71
+ result = `interface ${genResult.name} ${genResult.code}`;
72
+ break;
73
+ case 'type':
74
+ result = `type ${genResult.name} = ${genResult.code}`;
75
+ break;
76
+ case 'enum':
77
+ result = `enum ${genResult.name} ${genResult.code}`;
78
+ break;
79
+ default:
80
+ break;
81
+ }
82
+ if (options?.export) {
83
+ result = `export ${result}`;
84
+ }
85
+ return result;
86
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.transformAST = transformAST;
7
+ exports.transformSchema = transformSchema;
8
+ const generates_1 = require("./generates");
9
+ const normalize_1 = __importDefault(require("./normalize"));
10
+ const parsers_1 = require("./parsers");
11
+ async function transformAST(ast, options) {
12
+ const result = (0, generates_1.astGenerate)(ast, options);
13
+ if (options.format) {
14
+ result.code = await (0, generates_1.normalizeCode)(result.code, result.type);
15
+ }
16
+ return result;
17
+ }
18
+ async function transformSchema(schema, options) {
19
+ const normalized = normalize_1.default.normalize(schema);
20
+ return (0, parsers_1.astParse)(normalized, options);
21
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.astLoader = exports.AstLoader = void 0;
4
+ const generates_1 = require("./generates");
5
+ const helper_1 = require("./helper");
6
+ class AstLoader {
7
+ constructor() {
8
+ this.name = 'astLoader';
9
+ }
10
+ async transform(ast, options) {
11
+ return (0, helper_1.transformAST)(ast, options);
12
+ }
13
+ async transformSchema(schema, options) {
14
+ return (0, helper_1.transformSchema)(schema, options);
15
+ }
16
+ async transformTsStr(ast, options) {
17
+ const result = await this.transform(ast, options);
18
+ return (0, generates_1.getTsStr)(result, {
19
+ export: options.export,
20
+ });
21
+ }
22
+ }
23
+ exports.AstLoader = AstLoader;
24
+ exports.astLoader = new AstLoader();
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const normalizer_1 = require("./normalizer");
7
+ const convertTypeArray_1 = __importDefault(require("./rules/convertTypeArray"));
8
+ const handleEmptyType_1 = __importDefault(require("./rules/handleEmptyType"));
9
+ const inferType_1 = __importDefault(require("./rules/inferType"));
10
+ const mergeAnyOf_1 = __importDefault(require("./rules/mergeAnyOf"));
11
+ const normalizeCombiningKeywords_1 = __importDefault(require("./rules/normalizeCombiningKeywords"));
12
+ const normalizeEnum_1 = __importDefault(require("./rules/normalizeEnum"));
13
+ const normalizeNullType_1 = __importDefault(require("./rules/normalizeNullType"));
14
+ const removeRedundantKeywords_1 = __importDefault(require("./rules/removeRedundantKeywords"));
15
+ const simplifySingleType_1 = __importDefault(require("./rules/simplifySingleType"));
16
+ const validateSchema_1 = __importDefault(require("./rules/validateSchema"));
17
+ const normalizer = new normalizer_1.SchemaNormalizer();
18
+ // ================= 注册规则 =================
19
+ normalizer
20
+ .addRule({
21
+ name: 'inferType',
22
+ description: '从关键字推断类型',
23
+ handler: inferType_1.default,
24
+ })
25
+ .addRule({
26
+ name: 'normalizeNullType',
27
+ description: '规范化 null 类型',
28
+ handler: normalizeNullType_1.default,
29
+ })
30
+ .addRule({
31
+ name: 'convertTypeArray',
32
+ description: '将 type 数组转换为 anyOf 结构',
33
+ handler: convertTypeArray_1.default,
34
+ })
35
+ .addRule({
36
+ name: 'normalizeEnum',
37
+ description: '规范化枚举类型',
38
+ handler: normalizeEnum_1.default,
39
+ })
40
+ .addRule({
41
+ name: 'normalizeCombiningKeywords',
42
+ description: '规范化anyOf/oneOf/allOf 关键字',
43
+ handler: normalizeCombiningKeywords_1.default,
44
+ })
45
+ .addRule({
46
+ name: 'mergeAnyOf',
47
+ description: '合并anyOf中type相同的分支',
48
+ handler: mergeAnyOf_1.default,
49
+ })
50
+ .addRule({
51
+ name: 'removeRedundantKeywords',
52
+ description: '移除多余关键字',
53
+ handler: removeRedundantKeywords_1.default,
54
+ })
55
+ .addRule({
56
+ name: 'handleEmptyType',
57
+ description: '处理空类型定义',
58
+ handler: handleEmptyType_1.default,
59
+ })
60
+ .addRule({
61
+ name: 'simplifySingleType',
62
+ description: '简化单元素类型数组',
63
+ handler: simplifySingleType_1.default,
64
+ })
65
+ .addRule({
66
+ name: 'validateSchema',
67
+ description: '验证 schema 的有效性',
68
+ handler: validateSchema_1.default,
69
+ });
70
+ exports.default = normalizer;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaNormalizer = void 0;
4
+ const lodash_1 = require("lodash");
5
+ const utils_1 = require("../../../../utils");
6
+ class SchemaNormalizer {
7
+ constructor() {
8
+ this.rules = [];
9
+ }
10
+ /**
11
+ * 添加新规则
12
+ */
13
+ addRule(rule) {
14
+ this.rules.push(rule);
15
+ return this;
16
+ }
17
+ /**
18
+ * 规范化 JSON Schema
19
+ * M1-A3: 循环检测从 JSON.stringify 改为 WeakSet,消除每节点 O(s) 序列化开销
20
+ */
21
+ normalize(schema) {
22
+ // 深度优先遍历
23
+ const visited = new WeakSet();
24
+ const process = (s) => {
25
+ if (!s || (0, utils_1.isReferenceObject)(s) || visited.has(s)) {
26
+ return s;
27
+ }
28
+ visited.add(s);
29
+ // 处理组合模式
30
+ if (s.anyOf) {
31
+ s.anyOf = s.anyOf.map(item => process(item));
32
+ }
33
+ if (s.oneOf) {
34
+ s.oneOf = s.oneOf.map(item => process(item));
35
+ }
36
+ if (s.allOf) {
37
+ s.allOf = s.allOf.map(item => process(item));
38
+ }
39
+ // 处理数组类型
40
+ if ((0, utils_1.isMaybeArraySchemaObject)(s)) {
41
+ s.items = process(s.items);
42
+ }
43
+ // 处理对象属性
44
+ if (s.properties) {
45
+ const newProps = {};
46
+ for (const [key, value] of Object.entries(s.properties)) {
47
+ newProps[key] = process(value);
48
+ }
49
+ s.properties = newProps;
50
+ }
51
+ let result = s;
52
+ // 应用规则
53
+ for (const rule of this.rules) {
54
+ const newResult = rule.handler(result);
55
+ if (newResult && !visited.has(newResult)) {
56
+ result = newResult;
57
+ visited.add(result);
58
+ }
59
+ }
60
+ if ((0, lodash_1.isEqual)(s, result)) {
61
+ return result;
62
+ }
63
+ visited.delete(result);
64
+ return process(result);
65
+ };
66
+ return process((0, lodash_1.cloneDeep)(schema));
67
+ }
68
+ }
69
+ exports.SchemaNormalizer = SchemaNormalizer;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TYPE_REQUIRE_KEYWORDS = exports.TYPE_SPECIFIC_KEYWORDS = exports.GLOBAL_KEYWORDS = void 0;
4
+ exports.assignTypeSpecificKeywords = assignTypeSpecificKeywords;
5
+ exports.default = convertTypeArray;
6
+ exports.GLOBAL_KEYWORDS = [
7
+ 'title',
8
+ 'description',
9
+ 'default',
10
+ 'examples',
11
+ 'deprecated',
12
+ 'readOnly',
13
+ 'writeOnly',
14
+ 'const',
15
+ ];
16
+ exports.TYPE_SPECIFIC_KEYWORDS = {
17
+ string: ['minLength', 'maxLength', 'pattern', 'format', 'contentMediaType'],
18
+ number: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
19
+ integer: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
20
+ array: ['items', 'minItems', 'maxItems', 'uniqueItems'],
21
+ object: ['properties', 'additionalProperties', 'required', 'minProperties', 'maxProperties'],
22
+ };
23
+ exports.TYPE_REQUIRE_KEYWORDS = {
24
+ string: [],
25
+ number: [],
26
+ integer: [],
27
+ array: [['items', { type: 'any' }]],
28
+ object: [],
29
+ };
30
+ function assignTypeSpecificKeywords(branch, type, typeSpecificKeywords) {
31
+ const keywords = exports.TYPE_SPECIFIC_KEYWORDS[type];
32
+ const requireKeywords = exports.TYPE_REQUIRE_KEYWORDS[type];
33
+ if (!keywords) {
34
+ return;
35
+ }
36
+ keywords.forEach((key) => {
37
+ if (key in typeSpecificKeywords) {
38
+ branch[key] = typeSpecificKeywords[key];
39
+ }
40
+ });
41
+ requireKeywords.forEach(([key, value]) => {
42
+ if (!(key in typeSpecificKeywords)) {
43
+ branch[key] = value;
44
+ }
45
+ });
46
+ }
47
+ function convertTypeArray(schema) {
48
+ if (!Array.isArray(schema.type) || schema.type.length <= 1 || (schema.enum && Array.isArray(schema.enum))) {
49
+ return;
50
+ }
51
+ const { type: typeArray, ...restSchema } = schema;
52
+ const globalKeywords = {};
53
+ const typeSpecificKeywords = {};
54
+ for (const [key, value] of Object.entries(restSchema)) {
55
+ if (exports.GLOBAL_KEYWORDS.includes(key)) {
56
+ globalKeywords[key] = value;
57
+ }
58
+ else {
59
+ typeSpecificKeywords[key] = value;
60
+ }
61
+ }
62
+ const branches = typeArray.map((t) => {
63
+ const branch = { type: t };
64
+ assignTypeSpecificKeywords(branch, t, typeSpecificKeywords);
65
+ return branch;
66
+ });
67
+ return { ...globalKeywords, anyOf: branches };
68
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = handleEmptyType;
4
+ function handleEmptyType(schema) {
5
+ if (!schema.type && !schema.enum && !schema.oneOf && !schema.anyOf && !schema.allOf && schema.const === undefined) {
6
+ return { ...schema, type: 'null' };
7
+ }
8
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = inferType;
4
+ const utils_1 = require("../../../../../utils");
5
+ function inferType(schema) {
6
+ if (Array.isArray(schema.type)
7
+ || typeof schema.type === 'string') {
8
+ return;
9
+ }
10
+ if (schema.enum || schema.oneOf || schema.anyOf || schema.allOf) {
11
+ return;
12
+ }
13
+ const type = [];
14
+ if (schema.properties
15
+ || schema.additionalProperties
16
+ || schema.required
17
+ || schema.minProperties !== undefined
18
+ || schema.maxProperties !== undefined) {
19
+ type.push('object');
20
+ }
21
+ if ((0, utils_1.isMaybeArraySchemaObject)(schema)
22
+ || schema.minItems !== undefined
23
+ || schema.maxItems !== undefined
24
+ || schema.uniqueItems !== undefined
25
+ || schema.contains) {
26
+ type.push('array');
27
+ }
28
+ if (schema.minLength !== undefined
29
+ || schema.maxLength !== undefined
30
+ || schema.pattern
31
+ || schema.format
32
+ || schema.contentMediaType) {
33
+ type.push('string');
34
+ }
35
+ if (schema.minimum !== undefined
36
+ || schema.maximum !== undefined
37
+ || schema.multipleOf !== undefined
38
+ || schema.exclusiveMinimum !== undefined
39
+ || schema.exclusiveMaximum !== undefined) {
40
+ type.push('number');
41
+ }
42
+ return { ...schema, type };
43
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = mergeAnyOf;
4
+ function mergeAnyOf(schema) {
5
+ if (!schema.anyOf || schema.anyOf.length < 2) {
6
+ return;
7
+ }
8
+ const typeMap = new Map();
9
+ for (const sub of schema.anyOf) {
10
+ const t = sub.type;
11
+ const typeKey = Array.isArray(t) ? t.join(',') : String(t);
12
+ if (!typeMap.has(typeKey))
13
+ typeMap.set(typeKey, []);
14
+ typeMap.get(typeKey).push(sub);
15
+ }
16
+ const mergedAnyOf = [];
17
+ for (const group of typeMap.values()) {
18
+ if (group.length === 1) {
19
+ mergedAnyOf.push(group[0]);
20
+ }
21
+ else {
22
+ const merged = { type: group[0].type };
23
+ for (const sub of group) {
24
+ for (const [key, value] of Object.entries(sub)) {
25
+ if (key === 'type')
26
+ continue;
27
+ if (merged[key] === undefined) {
28
+ merged[key] = value;
29
+ }
30
+ else if (Array.isArray(merged[key]) && Array.isArray(value)) {
31
+ merged[key] = Array.from(new Set([...merged[key], ...value]));
32
+ }
33
+ else if (typeof merged[key] === 'object' && typeof value === 'object') {
34
+ merged[key] = { ...merged[key], ...value };
35
+ }
36
+ }
37
+ }
38
+ mergedAnyOf.push(merged);
39
+ }
40
+ }
41
+ if (mergedAnyOf.length === schema.anyOf.length && mergedAnyOf.every((s, i) => s === schema.anyOf[i])) {
42
+ return;
43
+ }
44
+ return { ...schema, anyOf: mergedAnyOf };
45
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = normalizeCombiningKeywords;
4
+ function normalizeCombiningKeywords(schema) {
5
+ const { allOf, anyOf, oneOf, ...baseSchema } = schema;
6
+ // 如果没有组合关键字,或只存在其中一个,则无需处理
7
+ if ([allOf, anyOf, oneOf].filter(Boolean).length <= 1) {
8
+ return;
9
+ }
10
+ // 用于存储最终转换后的 allOf 数组
11
+ const allOfArray = [];
12
+ // 2. 处理原始 allOf(展开到新 allOf 中)
13
+ if (Array.isArray(allOf)) {
14
+ allOfArray.push(...allOf);
15
+ }
16
+ // 3. 处理 anyOf(包装成 anyOf 对象)
17
+ if (Array.isArray(anyOf) && anyOf.length > 0) {
18
+ allOfArray.push({ anyOf });
19
+ }
20
+ // 4. 处理 oneOf(包装成 oneOf 对象)
21
+ if (Array.isArray(oneOf) && oneOf.length > 0) {
22
+ allOfArray.push({ oneOf });
23
+ }
24
+ // 构建最终模式
25
+ return allOfArray.length > 0 ? { allOf: allOfArray, ...baseSchema } : baseSchema;
26
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = normalizeEnum;
4
+ const lodash_1 = require("lodash");
5
+ const utils_1 = require("../../../../../utils");
6
+ const convertTypeArray_1 = require("./convertTypeArray");
7
+ function normalizeEnum(schema) {
8
+ if (!schema.enum || !Array.isArray(schema.enum) || !schema.enum.length) {
9
+ return;
10
+ }
11
+ const enumArray = schema.enum ?? [];
12
+ const typeArray = [...new Set([schema.type ?? []].flat())];
13
+ const enumTypeArray = [];
14
+ enumArray.forEach((item) => {
15
+ const type = (0, utils_1.getType)(item);
16
+ if (!enumTypeArray.includes(type)) {
17
+ enumTypeArray.push(type);
18
+ }
19
+ });
20
+ const otherType = typeArray.filter(item => !enumTypeArray.includes(item));
21
+ const enumType = enumTypeArray.length > 1 ? enumTypeArray : (enumTypeArray[0] ?? 'null');
22
+ if (otherType.length > 0) {
23
+ return {
24
+ ...(0, lodash_1.pick)(schema, convertTypeArray_1.GLOBAL_KEYWORDS),
25
+ anyOf: [
26
+ {
27
+ type: enumType,
28
+ enum: enumArray,
29
+ },
30
+ {
31
+ type: otherType,
32
+ ...(0, lodash_1.omit)(schema, convertTypeArray_1.GLOBAL_KEYWORDS.concat(['type', 'enum'])),
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ return { ...schema, type: enumType };
38
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = normalizeNullType;
4
+ const NULL_TYPE = [null, 'null'];
5
+ function normalizeNullType(schema) {
6
+ // 兼容openai3.0的nullable
7
+ if (schema.nullable) {
8
+ delete schema.nullable;
9
+ const currentType = schema.type || [];
10
+ const typeArray = Array.isArray(currentType) ? currentType : [currentType];
11
+ const filteredTypes = typeArray.filter(t => t !== null && t !== 'null');
12
+ schema.type = filteredTypes.length > 0 ? [...filteredTypes, 'null'] : 'null';
13
+ }
14
+ if (schema.type === null || (Array.isArray(schema.type) && !schema.type.length)) {
15
+ return { ...schema, type: 'null' };
16
+ }
17
+ if (Array.isArray(schema.type) && schema.type.some(t => NULL_TYPE.includes(t))) {
18
+ const filteredTypes = schema.type.filter(t => !NULL_TYPE.includes(t));
19
+ if (filteredTypes.length === 0) {
20
+ return { ...schema, type: 'null' };
21
+ }
22
+ return { ...schema, type: [...filteredTypes, 'null'] };
23
+ }
24
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = removeRedundantKeywords;
4
+ const TYPE_SPECIFIC_KEYWORDS = {
5
+ string: ['minLength', 'maxLength', 'pattern', 'format', 'contentMediaType'],
6
+ number: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
7
+ integer: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
8
+ array: ['items', 'minItems', 'maxItems', 'uniqueItems'],
9
+ object: ['properties', 'additionalProperties', 'required', 'minProperties', 'maxProperties'],
10
+ };
11
+ function removeRedundantKeywords(schema) {
12
+ if (!schema.type || Array.isArray(schema.type))
13
+ return;
14
+ const { type } = schema;
15
+ const cleanSchema = { ...schema };
16
+ const typeKeywords = TYPE_SPECIFIC_KEYWORDS[type] ?? [];
17
+ Object.entries(TYPE_SPECIFIC_KEYWORDS).forEach(([typeName, keywords]) => {
18
+ if (type === typeName)
19
+ return;
20
+ keywords.forEach((keyword) => {
21
+ if (keyword in cleanSchema && !typeKeywords.includes(keyword)) {
22
+ delete cleanSchema[keyword];
23
+ }
24
+ });
25
+ });
26
+ return cleanSchema;
27
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = simplifySingleType;
4
+ function simplifySingleType(schema) {
5
+ if (Array.isArray(schema.type) && schema.type.length === 1) {
6
+ return { ...schema, type: schema.type[0] };
7
+ }
8
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = validateSchema;
4
+ function validateSchema(schema) {
5
+ if (schema.type && typeof schema.type !== 'string' && !Array.isArray(schema.type)) {
6
+ return { ...schema, type: 'null' };
7
+ }
8
+ if (schema.enum && (!Array.isArray(schema.enum) || schema.enum.length === 0)) {
9
+ delete schema.enum;
10
+ }
11
+ if (schema.const !== undefined && schema.const === null) {
12
+ return { ...schema, type: 'null' };
13
+ }
14
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.arrayTypeParser = arrayTypeParser;
4
+ const helper_1 = require("../../../../helper");
5
+ const type_1 = require("../../../../type");
6
+ const utils_1 = require("./utils");
7
+ function arrayTypeParser(schema, ctx) {
8
+ ctx.pathKey = '[]';
9
+ const itemsAst = ctx.next(schema.items, ctx.options);
10
+ const result = {
11
+ ...(0, utils_1.initAST)(schema, ctx),
12
+ type: type_1.ASTType.ARRAY,
13
+ params: itemsAst,
14
+ };
15
+ result.deepComment = helper_1.CommentHelper.load({
16
+ type: ctx.options.commentType,
17
+ })
18
+ .add('[items] start')
19
+ .add(helper_1.CommentHelper.parse(itemsAst.comment ?? '').join('\n'))
20
+ .add(helper_1.CommentHelper.parse(itemsAst.deepComment ?? '').join('\n'))
21
+ .add('[items] end')
22
+ .end();
23
+ return result;
24
+ }
25
+ exports.default = {
26
+ type: 'array',
27
+ parse: arrayTypeParser,
28
+ };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enumTypeParser = enumTypeParser;
4
+ const standardLoader_1 = require("../../../../core/loader/standardLoader");
5
+ const helper_1 = require("../../../../helper");
6
+ const type_1 = require("../../../../type");
7
+ const utils_1 = require("../../../../utils");
8
+ const utils_2 = require("./utils");
9
+ function enumTypeParser(schema, ctx) {
10
+ const result = {
11
+ ...(0, utils_2.initAST)(schema, ctx),
12
+ type: type_1.ASTType.ENUM,
13
+ params: [],
14
+ };
15
+ const enumArray = schema.enum ?? [];
16
+ let typeArray = [schema.type ?? []].flat();
17
+ // 如果没有指定type,从enum值中推断类型
18
+ if (typeArray.length === 0 && enumArray.length > 0) {
19
+ typeArray = [...new Set(enumArray.map(item => (0, utils_1.getType)(item)))];
20
+ }
21
+ // 类型兼容性检查函数
22
+ const isTypeCompatible = (itemType, allowedTypes) => {
23
+ return allowedTypes.includes(itemType)
24
+ || (allowedTypes.includes('number') && itemType === 'integer');
25
+ };
26
+ // 验证所有枚举值的类型
27
+ const hasInvalidType = enumArray.some(item => !isTypeCompatible((0, utils_1.getType)(item), typeArray));
28
+ if (hasInvalidType) {
29
+ throw helper_1.logger.throwError(`enum ${schema.title ?? 'undefined'} type error`, {
30
+ enum: enumArray,
31
+ type: typeArray,
32
+ });
33
+ }
34
+ enumArray.forEach((item) => {
35
+ const keyName = typeof item === 'string' && standardLoader_1.standardLoader.validate(item) ? item.toUpperCase() : '';
36
+ result.params.push({
37
+ keyName,
38
+ ast: {
39
+ type: type_1.ASTType.LITERAL,
40
+ params: item,
41
+ },
42
+ });
43
+ });
44
+ return result;
45
+ }
46
+ exports.default = {
47
+ type: 'enum',
48
+ parse: enumTypeParser,
49
+ };