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,333 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseResponse = parseResponse;
4
+ exports.parseRequestBody = parseRequestBody;
5
+ exports.getContentKey = getContentKey;
6
+ exports.parseParameters = parseParameters;
7
+ exports.transformApiMethods = transformApiMethods;
8
+ exports.apiMethod2ApiDescriptor = apiMethod2ApiDescriptor;
9
+ exports.apiDescriptor2apiMethod = apiDescriptor2apiMethod;
10
+ const lodash_1 = require("lodash");
11
+ const loader_1 = require("../../../core/loader");
12
+ const logger_1 = require("../../../helper/logger");
13
+ const utils_1 = require("../../../utils");
14
+ async function parseResponse(responses, options) {
15
+ const { document, config, schemasMap, refNameMap } = options;
16
+ const successKey = (0, utils_1.getResponseSuccessKey)(responses);
17
+ const responseInfo = responses?.[successKey];
18
+ if (!responseInfo) {
19
+ return {
20
+ response: 'unknown',
21
+ responseComment: config.docComment !== false ? 'unknown' : '',
22
+ };
23
+ }
24
+ const responseObject = (0, utils_1.isReferenceObject)(responseInfo)
25
+ ? (0, utils_1.findBy$ref)(responseInfo.$ref, document)
26
+ : responseInfo;
27
+ const key = getContentKey(responseObject.content, config.responseMediaType);
28
+ const responseSchema = responseObject?.content?.[key]?.schema ?? {};
29
+ // P0: Single AST parse for both type + comment
30
+ const result = await loader_1.schemaLoader.transform(responseSchema, {
31
+ document,
32
+ deep: false,
33
+ noEnum: true,
34
+ commentType: config.docComment !== false ? 'doc' : 'line',
35
+ preText: '',
36
+ defaultRequire: config.defaultRequire,
37
+ refNameMap,
38
+ async onReference(ast) {
39
+ if (config.externalTypes?.includes(ast.keyName ?? '')) {
40
+ return;
41
+ }
42
+ if (ast.keyName && schemasMap && !schemasMap.has(ast.keyName)) {
43
+ const refResult = await loader_1.astLoader.transformTsStr(ast, {
44
+ shallowDeep: true,
45
+ commentType: 'doc',
46
+ noEnum: true,
47
+ format: true,
48
+ export: true,
49
+ });
50
+ schemasMap.set(ast.keyName, refResult);
51
+ }
52
+ },
53
+ }, config.docComment !== false
54
+ ? {
55
+ document,
56
+ deep: true,
57
+ preText: '* ',
58
+ defaultRequire: config.defaultRequire,
59
+ }
60
+ : undefined);
61
+ return {
62
+ response: result.type,
63
+ responseComment: result.comment ?? '',
64
+ };
65
+ }
66
+ async function parseRequestBody(requestBody, options) {
67
+ if (!requestBody) {
68
+ return {
69
+ requestBody: '',
70
+ requestBodyComment: '',
71
+ };
72
+ }
73
+ const { document, config, schemasMap, refNameMap } = options;
74
+ const requestBodyObject = (0, utils_1.isReferenceObject)(requestBody)
75
+ ? (0, utils_1.findBy$ref)(requestBody.$ref, document)
76
+ : requestBody;
77
+ const key = getContentKey(requestBodyObject.content, config.bodyMediaType);
78
+ const requestBodySchema = requestBodyObject?.content?.[key]?.schema ?? {};
79
+ // P0: Single AST parse for both type + comment
80
+ const result = await loader_1.schemaLoader.transform(requestBodySchema, {
81
+ document,
82
+ deep: false,
83
+ noEnum: true,
84
+ commentType: config.docComment !== false ? 'doc' : 'line',
85
+ preText: '',
86
+ defaultRequire: config.defaultRequire,
87
+ refNameMap,
88
+ async onReference(ast) {
89
+ if (config.externalTypes?.includes(ast.keyName ?? '')) {
90
+ return;
91
+ }
92
+ if (ast.keyName && schemasMap && !schemasMap.has(ast.keyName)) {
93
+ const refResult = await loader_1.astLoader.transformTsStr(ast, {
94
+ shallowDeep: true,
95
+ commentType: 'doc',
96
+ noEnum: true,
97
+ format: true,
98
+ export: true,
99
+ });
100
+ schemasMap.set(ast.keyName, refResult);
101
+ }
102
+ },
103
+ }, config.docComment !== false
104
+ ? {
105
+ document,
106
+ deep: true,
107
+ preText: '* ',
108
+ defaultRequire: config.defaultRequire,
109
+ }
110
+ : undefined);
111
+ return {
112
+ requestBody: result.type,
113
+ requestBodyComment: result.comment ?? '',
114
+ };
115
+ }
116
+ function getContentKey(content = {}, requireKey = 'application/json') {
117
+ const requireKeys = Array.isArray(requireKey) ? requireKey : [requireKey];
118
+ // 按数组顺序依次查找存在的 mediaType
119
+ for (const key of requireKeys) {
120
+ if (content[key]) {
121
+ return key;
122
+ }
123
+ }
124
+ // 如果都不存在,返回第一个 key 或默认值
125
+ return Object.keys(content)[0] || requireKeys[0];
126
+ }
127
+ async function parseParameters(parameters, options) {
128
+ const { document, config, schemasMap, refNameMap } = options;
129
+ const pathParametersSchema = {
130
+ type: 'object',
131
+ };
132
+ const queryParametersSchema = {
133
+ type: 'object',
134
+ };
135
+ const parseParameter = (parameter, parameters) => {
136
+ if (!parameters.properties) {
137
+ parameters.properties = {};
138
+ }
139
+ if (!parameters.required) {
140
+ parameters.required = [];
141
+ }
142
+ if (parameter.required) {
143
+ parameters.required.push(parameter.name);
144
+ }
145
+ parameters.properties[parameter.name] = {
146
+ ...parameter.schema,
147
+ description: parameter.description || '',
148
+ deprecated: !!parameter.deprecated,
149
+ };
150
+ };
151
+ const parseParametersSchema = async (parameters) => {
152
+ let parametersStr = '';
153
+ let parametersComment = '';
154
+ if (Object.keys(parameters.properties ?? {}).length) {
155
+ // P0: Single AST parse for both type + comment
156
+ const result = await loader_1.schemaLoader.transform(parameters, {
157
+ document,
158
+ deep: false,
159
+ noEnum: true,
160
+ commentType: config.docComment !== false ? 'doc' : 'line',
161
+ preText: '',
162
+ defaultRequire: config.defaultRequire,
163
+ refNameMap,
164
+ async onReference(ast) {
165
+ if (config.externalTypes?.includes(ast.keyName ?? '')) {
166
+ return;
167
+ }
168
+ if (ast.keyName && schemasMap && !schemasMap.has(ast.keyName)) {
169
+ const refResult = await loader_1.astLoader.transformTsStr(ast, {
170
+ shallowDeep: true,
171
+ commentType: 'doc',
172
+ noEnum: true,
173
+ format: true,
174
+ export: true,
175
+ });
176
+ schemasMap.set(ast.keyName, refResult);
177
+ }
178
+ },
179
+ }, config.docComment !== false
180
+ ? {
181
+ document,
182
+ deep: true,
183
+ preText: '* ',
184
+ defaultRequire: config.defaultRequire,
185
+ }
186
+ : undefined);
187
+ parametersStr = result.type;
188
+ parametersComment = result.comment ?? '';
189
+ }
190
+ return [parametersStr, parametersComment];
191
+ };
192
+ for (const refParameter of parameters || []) {
193
+ const parameter = (0, utils_1.parseReference)(refParameter, document);
194
+ if (parameter.in === 'path') {
195
+ parseParameter(parameter, pathParametersSchema);
196
+ }
197
+ else if (parameter.in === 'query') {
198
+ parseParameter(parameter, queryParametersSchema);
199
+ }
200
+ }
201
+ const [pathParameters, pathParametersComment] = await parseParametersSchema(pathParametersSchema);
202
+ const [queryParameters, queryParametersComment] = await parseParametersSchema(queryParametersSchema);
203
+ return {
204
+ pathParameters,
205
+ queryParameters,
206
+ pathParametersComment,
207
+ queryParametersComment,
208
+ };
209
+ }
210
+ async function transformApiMethods(apiMethod, options) {
211
+ const { handleApi } = options.config;
212
+ if (!handleApi || typeof handleApi !== 'function') {
213
+ return apiMethod;
214
+ }
215
+ const { apiDescriptor, apiInfo } = apiMethod2ApiDescriptor(apiMethod, options);
216
+ // M2-B1: apiDescriptor 来自 apiMethod2ApiDescriptor 已做过 cloneDeep,无需二次克隆
217
+ let newApiDescriptor = apiDescriptor;
218
+ try {
219
+ newApiDescriptor = handleApi(newApiDescriptor);
220
+ }
221
+ catch (error) {
222
+ throw logger_1.logger.throwError(error);
223
+ }
224
+ if (!newApiDescriptor) {
225
+ return null;
226
+ }
227
+ Object.entries(newApiDescriptor.refNameMap || {}).forEach(([key, value]) => {
228
+ options.refNameMap.set(key, value);
229
+ });
230
+ const newApiMethod = apiDescriptor2apiMethod(newApiDescriptor, {
231
+ oldApiInfo: apiInfo,
232
+ operationObject: apiMethod.operationObject,
233
+ });
234
+ newApiMethod.operationObject = (0, utils_1.mergeObject)(apiMethod.operationObject, newApiMethod.operationObject, {
235
+ openApi: options.document,
236
+ map: options.map,
237
+ refNameMap: options.refNameMap,
238
+ });
239
+ return newApiMethod;
240
+ }
241
+ function apiMethod2ApiDescriptor(apiMethod, options) {
242
+ const { url, method } = apiMethod;
243
+ const { document, config } = options;
244
+ // 需要深拷贝:handleApi 可能修改 tags/security 等嵌套字段,浅拷贝会污染原始 operationObject
245
+ const operationObject = (0, lodash_1.cloneDeep)(apiMethod.operationObject);
246
+ const { requestBody, responses, parameters } = operationObject;
247
+ const apiDescriptor = {
248
+ ...operationObject,
249
+ requestBody: {},
250
+ responses: {},
251
+ parameters: [],
252
+ url,
253
+ method,
254
+ };
255
+ const successKey = (0, utils_1.getResponseSuccessKey)(responses);
256
+ const responseSuccess = responses?.[successKey];
257
+ const refNameMap = new Map();
258
+ let requestBodyObject = requestBody;
259
+ let responseObject = responseSuccess;
260
+ let requestKey = 'application/json';
261
+ let responseKey = 'application/json';
262
+ if (parameters) {
263
+ apiDescriptor.parameters = [];
264
+ parameters.forEach((parameter) => {
265
+ apiDescriptor.parameters?.push((0, utils_1.removeAll$ref)(parameter, document, { refNameMap }));
266
+ });
267
+ }
268
+ if (requestBody) {
269
+ requestBodyObject = (0, utils_1.parseReference)(requestBody, document, true);
270
+ requestKey = getContentKey(requestBodyObject.content, config.bodyMediaType);
271
+ apiDescriptor.requestBody = (0, utils_1.removeAll$ref)(requestBodyObject.content?.[requestKey].schema ?? {}, document, { refNameMap });
272
+ }
273
+ if (responseSuccess) {
274
+ responseObject = (0, utils_1.parseReference)(responseSuccess, document, true);
275
+ responseKey = getContentKey(responseObject.content, config.responseMediaType);
276
+ apiDescriptor.responses = (0, utils_1.removeAll$ref)(responseObject.content?.[responseKey].schema ?? {}, document, { refNameMap });
277
+ }
278
+ apiDescriptor.refNameMap = Object.fromEntries(refNameMap);
279
+ return {
280
+ apiDescriptor,
281
+ apiInfo: {
282
+ successKey,
283
+ requestKey,
284
+ responseKey,
285
+ requestBody: requestBodyObject,
286
+ response: responseObject,
287
+ hasResponse: !!responseSuccess,
288
+ hasRequestBody: !!requestBody,
289
+ hasParameters: !!parameters,
290
+ },
291
+ };
292
+ }
293
+ function apiDescriptor2apiMethod(apiDescriptor, options) {
294
+ const apiDescriptorValue = { ...apiDescriptor };
295
+ const operationObject = (0, lodash_1.cloneDeep)(options.operationObject); // 仍需深拷贝:content[key].schema 等深路径赋值后通过 mergeObject 回写
296
+ const { url, method } = apiDescriptorValue;
297
+ const { successKey, requestKey, responseKey, hasResponse, hasParameters, hasRequestBody, requestBody, response } = options.oldApiInfo;
298
+ if (!(0, lodash_1.isEmpty)(apiDescriptorValue.requestBody) || hasRequestBody) {
299
+ operationObject.requestBody = requestBody || { content: {} };
300
+ const { content } = operationObject.requestBody;
301
+ if (!content[requestKey]) {
302
+ content[requestKey] = {};
303
+ }
304
+ content[requestKey].schema = apiDescriptorValue.requestBody;
305
+ }
306
+ if (!(0, lodash_1.isEmpty)(apiDescriptorValue.responses) || hasResponse) {
307
+ if (!operationObject.responses) {
308
+ operationObject.responses = {};
309
+ }
310
+ operationObject.responses[successKey] = response || { content: {} };
311
+ if (!operationObject.responses[successKey].content) {
312
+ operationObject.responses[successKey].content = {};
313
+ }
314
+ const { content } = operationObject.responses[successKey];
315
+ if (!content[responseKey]) {
316
+ content[responseKey] = {};
317
+ }
318
+ content[responseKey].schema = apiDescriptorValue.responses;
319
+ }
320
+ if (!(0, lodash_1.isEmpty)(apiDescriptorValue.parameters) || hasParameters) {
321
+ operationObject.parameters = apiDescriptorValue.parameters;
322
+ }
323
+ delete apiDescriptorValue.requestBody;
324
+ delete apiDescriptorValue.responses;
325
+ delete apiDescriptorValue.parameters;
326
+ delete apiDescriptorValue.refNameMap;
327
+ Object.assign(operationObject, apiDescriptorValue);
328
+ return {
329
+ url,
330
+ method,
331
+ operationObject,
332
+ };
333
+ }
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.templateParser = exports.TemplateParser = void 0;
40
+ const node_os_1 = require("node:os");
41
+ const node_path_1 = __importDefault(require("node:path"));
42
+ const loader_1 = require("../../../core/loader");
43
+ const WorkerPool_1 = require("../../../core/WorkerPool");
44
+ const poolManager_1 = require("../../../core/workerPool/poolManager");
45
+ const getFrameworkTag_1 = __importDefault(require("../../../functions/getFrameworkTag"));
46
+ const helper_1 = require("../../../helper");
47
+ const document_1 = require("../../../helper/document");
48
+ const openapi_1 = require("../../../utils/openapi");
49
+ const helper_2 = require("./helper");
50
+ /** M2-B4: 轻量并发 limiter,无额外依赖 */
51
+ async function pMap(items, fn, concurrency) {
52
+ const results = Array.from({ length: items.length });
53
+ let idx = 0;
54
+ async function worker() {
55
+ while (idx < items.length) {
56
+ const i = idx++;
57
+ results[i] = await fn(items[i]);
58
+ }
59
+ }
60
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
61
+ return results;
62
+ }
63
+ /** 根据 CPU 核数自动计算合理并发上限 */
64
+ function autoConcurrency() {
65
+ const cpuCount = Math.max(1, (0, node_os_1.cpus)().length);
66
+ return Math.min(64, Math.max(8, cpuCount * 4));
67
+ }
68
+ class TemplateParser {
69
+ constructor() {
70
+ this.name = 'templateParser';
71
+ this.schemasMap = new Map();
72
+ this.operationIdSet = new Set();
73
+ this.pathMap = [];
74
+ this.refNameMap = new Map();
75
+ /** M1-A4: 用 Map 索引替代 tagedApis.find() 线性查找,O(n·t) → O(n+t) */
76
+ this.tagMap = new Map();
77
+ this.openApiHelper = new document_1.OpenApiHelper();
78
+ }
79
+ async parse(document, options) {
80
+ this.document = document;
81
+ this.options = options;
82
+ const templateData = await this.parseBaseInfo();
83
+ await this.parseApiMethods(this.openApiHelper.load(document).getApiMethods(), templateData);
84
+ this.clear();
85
+ return templateData;
86
+ }
87
+ clear() {
88
+ this.schemasMap.clear();
89
+ this.operationIdSet.clear();
90
+ this.pathMap.splice(0, this.pathMap.length);
91
+ this.refNameMap.clear();
92
+ this.tagMap.clear();
93
+ }
94
+ async parseBaseInfo() {
95
+ const generatorHelper = await helper_1.GeneratorHelper.load(this.options.generatorConfig);
96
+ const templateType = await generatorHelper.getTemplateType(this.options.projectPath);
97
+ const { info, openapi } = this.document;
98
+ const templateData = {
99
+ title: info.title,
100
+ openapi,
101
+ version: info.version,
102
+ description: info.description,
103
+ contact: info.contact,
104
+ framework: await (0, getFrameworkTag_1.default)(this.options.projectPath),
105
+ baseUrl: this.document.servers?.[0]?.url || '',
106
+ allApis: [],
107
+ tagedApis: [],
108
+ components: [],
109
+ componentNames: [],
110
+ type: templateType,
111
+ config: {},
112
+ };
113
+ return templateData;
114
+ }
115
+ async transformApiMethods(apiMethod) {
116
+ const { url, method, operationObject } = apiMethod;
117
+ operationObject.operationId = loader_1.standardLoader.transformOperationId(operationObject, {
118
+ url,
119
+ method,
120
+ map: this.operationIdSet,
121
+ });
122
+ operationObject.tags = loader_1.standardLoader.transformTags(operationObject.tags);
123
+ const result = await (0, helper_2.transformApiMethods)(apiMethod, {
124
+ document: this.document,
125
+ refNameMap: this.refNameMap,
126
+ config: this.options.generatorConfig,
127
+ map: this.pathMap,
128
+ });
129
+ return result;
130
+ }
131
+ async parseApiMethods(apiMethods, templateData) {
132
+ const concurrency = autoConcurrency();
133
+ const apiMethodArray = (await pMap(apiMethods, apiMethod => this.transformApiMethods(apiMethod), concurrency)).filter(apiMethod => !!apiMethod);
134
+ const refsMap = Object.fromEntries(this.refNameMap);
135
+ const usedRefs = this.openApiHelper
136
+ .saveApiMethods(apiMethodArray)
137
+ .filterUsedReferences(Object.keys(refsMap));
138
+ this.refNameMap = new Map(Object.entries((0, openapi_1.optimizeRefsMap)(refsMap, usedRefs)));
139
+ // M4-C1: Pre-process schemas via worker pool for parallel schema→TS conversion
140
+ const poolSize = (0, WorkerPool_1.pickPoolSize)(apiMethodArray.length);
141
+ if (poolSize > 0) {
142
+ const tasks = this.collectSchemaTasks(apiMethodArray);
143
+ if (tasks.length > 0) {
144
+ // .js for production, .ts for vitest/dev; existsSync may fail in mocked fs
145
+ const jsWp = node_path_1.default.resolve(__dirname, '../../workerPool/worker.js');
146
+ const tsWp = node_path_1.default.resolve(__dirname, '../../workerPool/worker.ts');
147
+ const { existsSync: fex } = await Promise.resolve().then(() => __importStar(require('node:fs')));
148
+ const workerScript = fex(jsWp) ? jsWp : tsWp;
149
+ // P2: Reuse worker pool via PoolManager singleton — avoids create/destroy overhead across repeated generate() calls
150
+ const pool = poolManager_1.PoolManager.getInstance().get({
151
+ key: `schemaWorker_${this.options.projectPath}`,
152
+ workerScript,
153
+ sharedContext: {
154
+ document: this.document,
155
+ config: {
156
+ defaultRequire: this.options.generatorConfig.defaultRequire,
157
+ externalTypes: this.options.generatorConfig.externalTypes,
158
+ },
159
+ refNameMapEntries: [...this.refNameMap.entries()],
160
+ },
161
+ poolSize,
162
+ });
163
+ const results = await pool.processBatch(tasks);
164
+ for (const { key, result } of results) {
165
+ this.schemasMap.set(key, result);
166
+ }
167
+ }
168
+ }
169
+ (await pMap(apiMethodArray, apiMethod => this.transformApis(apiMethod), concurrency))
170
+ .flat()
171
+ .forEach((api) => {
172
+ this.parseApi(api, templateData);
173
+ });
174
+ templateData.components = [...new Set(this.schemasMap.values())];
175
+ templateData.componentNames = [...this.schemasMap.keys()];
176
+ // 按名称字典序排序,确保输出顺序确定性(避免并发场景下 Map 插入顺序漂移)
177
+ const sorted = [...this.schemasMap.entries()].sort(([a], [b]) => a.localeCompare(b));
178
+ templateData.componentNames = sorted.map(([k]) => k);
179
+ templateData.components = sorted.map(([, v]) => v);
180
+ }
181
+ /**
182
+ * M4-C1: Collect all unique schema objects from API methods for batch processing.
183
+ * Mirrors the schema construction logic from parseParameters/parseRequestBody/parseResponse
184
+ * but without calling getTsStr — only collects the SchemaObjects for deferred processing.
185
+ */
186
+ collectSchemaTasks(apiMethodArray) {
187
+ const tasks = [];
188
+ const seen = new Set();
189
+ const genConfig = this.options.generatorConfig;
190
+ function add(schema) {
191
+ if (!schema || typeof schema !== 'object')
192
+ return false;
193
+ const hash = JSON.stringify(schema);
194
+ if (seen.has(hash))
195
+ return false;
196
+ seen.add(hash);
197
+ const key = `schema_${seen.size}`;
198
+ tasks.push({ key, schema });
199
+ return true;
200
+ }
201
+ for (const apiMethod of apiMethodArray) {
202
+ const { operationObject } = apiMethod;
203
+ // Collect parameter schemas (mirroring parseParameters)
204
+ if (operationObject.parameters) {
205
+ const pathSchema = { type: 'object', properties: {}, required: [] };
206
+ const querySchema = { type: 'object', properties: {}, required: [] };
207
+ for (const refParam of operationObject.parameters) {
208
+ const param = (0, openapi_1.parseReference)(refParam, this.document);
209
+ if (param.in === 'path') {
210
+ const target = pathSchema;
211
+ if (param.required)
212
+ target.required.push(param.name);
213
+ target.properties[param.name] = {
214
+ ...param.schema,
215
+ description: param.description || '',
216
+ deprecated: !!param.deprecated,
217
+ };
218
+ }
219
+ else if (param.in === 'query') {
220
+ const target = querySchema;
221
+ if (param.required)
222
+ target.required.push(param.name);
223
+ target.properties[param.name] = {
224
+ ...param.schema,
225
+ description: param.description || '',
226
+ deprecated: !!param.deprecated,
227
+ };
228
+ }
229
+ }
230
+ if (Object.keys(pathSchema.properties).length)
231
+ add(pathSchema);
232
+ if (Object.keys(querySchema.properties).length)
233
+ add(querySchema);
234
+ }
235
+ // Collect request body schema (mirroring parseRequestBody)
236
+ if (operationObject.requestBody) {
237
+ const rb = (0, openapi_1.parseReference)(operationObject.requestBody, this.document, true);
238
+ const bodyKey = (0, helper_2.getContentKey)(rb.content, genConfig.bodyMediaType);
239
+ const schema = rb.content?.[bodyKey]?.schema;
240
+ add(schema);
241
+ }
242
+ // Collect response schema (mirroring parseResponse)
243
+ if (operationObject.responses) {
244
+ const successKey = (0, openapi_1.getResponseSuccessKey)(operationObject.responses);
245
+ const resp = (0, openapi_1.parseReference)(operationObject.responses[successKey], this.document);
246
+ if (resp) {
247
+ const respKey = (0, helper_2.getContentKey)(resp.content, genConfig.responseMediaType);
248
+ const schema = resp.content?.[respKey]?.schema;
249
+ add(schema);
250
+ }
251
+ }
252
+ }
253
+ return tasks;
254
+ }
255
+ async transformApis(apiMethod) {
256
+ const { method, url: path, operationObject } = apiMethod;
257
+ const apis = [];
258
+ const tags = operationObject.tags ?? [];
259
+ for (const tag of tags) {
260
+ const { queryParameters, queryParametersComment, pathParameters, pathParametersComment } = await (0, helper_2.parseParameters)(operationObject.parameters, {
261
+ document: this.document,
262
+ config: this.options.generatorConfig,
263
+ schemasMap: this.schemasMap,
264
+ refNameMap: this.refNameMap,
265
+ });
266
+ const { requestBodyComment, requestBody } = await (0, helper_2.parseRequestBody)(operationObject.requestBody, {
267
+ document: this.document,
268
+ config: this.options.generatorConfig,
269
+ schemasMap: this.schemasMap,
270
+ refNameMap: this.refNameMap,
271
+ });
272
+ const { responseComment, response } = await (0, helper_2.parseResponse)(operationObject.responses, {
273
+ document: this.document,
274
+ config: this.options.generatorConfig,
275
+ schemasMap: this.schemasMap,
276
+ refNameMap: this.refNameMap,
277
+ });
278
+ const api = {
279
+ tag,
280
+ method: method.toUpperCase(),
281
+ summary: operationObject.summary?.replace(/\n/g, '') ?? '',
282
+ path,
283
+ name: operationObject.operationId ?? '',
284
+ response,
285
+ requestBody,
286
+ queryParameters,
287
+ queryParametersComment,
288
+ pathParameters,
289
+ pathParametersComment,
290
+ responseComment,
291
+ requestBodyComment,
292
+ callingCode: '',
293
+ };
294
+ api.callingCode = await loader_1.callingCodeLoader.transformApi(api);
295
+ apis.push(api);
296
+ }
297
+ return apis;
298
+ }
299
+ parseApi(api, templateData) {
300
+ templateData.allApis.push(api);
301
+ let tagApis = this.tagMap.get(api.tag);
302
+ if (!tagApis) {
303
+ tagApis = {
304
+ tagName: api.tag,
305
+ apis: [],
306
+ };
307
+ this.tagMap.set(api.tag, tagApis);
308
+ templateData.tagedApis.push(tagApis);
309
+ }
310
+ tagApis.apis.push(api);
311
+ }
312
+ }
313
+ exports.TemplateParser = TemplateParser;
314
+ exports.templateParser = new TemplateParser();
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerPool = exports.pickPoolSize = void 0;
4
+ var WorkerPool_1 = require("../WorkerPool");
5
+ Object.defineProperty(exports, "pickPoolSize", { enumerable: true, get: function () { return WorkerPool_1.pickPoolSize; } });
6
+ Object.defineProperty(exports, "WorkerPool", { enumerable: true, get: function () { return WorkerPool_1.WorkerPool; } });