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,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.payloadModifier = payloadModifier;
4
+ const constant_1 = require("../../../constant");
5
+ const utils_1 = require("../utils");
6
+ const hepler_1 = require("./hepler");
7
+ // Apply modifications to object properties (for data/response scopes)
8
+ function modifySchemaProperties(schema, config) {
9
+ if (!schema || typeof schema !== 'object') {
10
+ return schema;
11
+ }
12
+ const targetSchema = { ...schema };
13
+ // union recursively
14
+ if (Array.isArray(targetSchema.oneOf)) {
15
+ targetSchema.oneOf = targetSchema.oneOf.map(item => modifySchemaProperties(item, config));
16
+ }
17
+ if (Array.isArray(targetSchema.anyOf)) {
18
+ targetSchema.anyOf = targetSchema.anyOf.map(item => modifySchemaProperties(item, config));
19
+ }
20
+ if (Array.isArray(targetSchema.allOf)) {
21
+ targetSchema.allOf = targetSchema.allOf.map(item => modifySchemaProperties(item, config));
22
+ }
23
+ // modify properties
24
+ if (targetSchema.properties) {
25
+ const props = { ...targetSchema.properties };
26
+ let required = Array.isArray(targetSchema.required) ? [...targetSchema.required] : [];
27
+ for (const key of Object.keys(props)) {
28
+ if (!(0, utils_1.isMatch)(key, config.match)) {
29
+ continue;
30
+ }
31
+ const { required: requiredOverride, value: valueSchema } = (0, hepler_1.applyModifierSchema)(props[key], config, { required: required.includes(key) });
32
+ required = required.filter(r => r !== key);
33
+ if (!valueSchema) {
34
+ delete props[key];
35
+ continue;
36
+ }
37
+ props[key] = valueSchema;
38
+ if (requiredOverride) {
39
+ required.push(key);
40
+ }
41
+ }
42
+ targetSchema.properties = props;
43
+ targetSchema.required = Array.from(new Set(required));
44
+ }
45
+ return targetSchema;
46
+ }
47
+ function modifyParameters(parameters, type, config) {
48
+ if (!parameters || !Array.isArray(parameters)) {
49
+ return parameters;
50
+ }
51
+ return parameters.map((param) => {
52
+ if (param.in === type) {
53
+ if (!(0, utils_1.isMatch)(param.name, config.match)) {
54
+ return param;
55
+ }
56
+ const { value: schema, required } = (0, hepler_1.applyModifierSchema)(param.schema, config, { required: !!param.required });
57
+ if (!schema) {
58
+ return null;
59
+ }
60
+ return {
61
+ ...param,
62
+ schema,
63
+ required,
64
+ };
65
+ }
66
+ return param;
67
+ }).filter(item => item !== null);
68
+ }
69
+ function payloadModifierApiDescriptor(apiDescriptor, config) {
70
+ if (!apiDescriptor) {
71
+ return null;
72
+ }
73
+ const newDescriptor = { ...apiDescriptor };
74
+ const { scope } = config;
75
+ switch (scope) {
76
+ case constant_1.ModifierScope.PARAMS:
77
+ if (newDescriptor.parameters) {
78
+ newDescriptor.parameters = modifyParameters(newDescriptor.parameters, constant_1.ParameterIn.QUERY, config);
79
+ }
80
+ break;
81
+ case constant_1.ModifierScope.PATH_PARAMS:
82
+ if (newDescriptor.parameters) {
83
+ newDescriptor.parameters = modifyParameters(newDescriptor.parameters, constant_1.ParameterIn.PATH, config);
84
+ }
85
+ break;
86
+ case constant_1.ModifierScope.DATA:
87
+ if (newDescriptor.requestBody) {
88
+ newDescriptor.requestBody = modifySchemaProperties(newDescriptor.requestBody, config);
89
+ }
90
+ break;
91
+ case constant_1.ModifierScope.RESPONSE:
92
+ if (newDescriptor.responses) {
93
+ newDescriptor.responses = modifySchemaProperties(newDescriptor.responses, config);
94
+ }
95
+ break;
96
+ default:
97
+ break;
98
+ }
99
+ return newDescriptor;
100
+ }
101
+ function payloadModifier(configs) {
102
+ return {
103
+ name: constant_1.PluginName.PAYLOAD_MODIFIER,
104
+ config({ config }) {
105
+ return (0, utils_1.extend)(config, {
106
+ handleApi: (apiDescriptor) => {
107
+ if (!apiDescriptor) {
108
+ return null;
109
+ }
110
+ // Apply each configuration in sequence
111
+ return configs.reduce((desc, conf) => {
112
+ if (!desc) {
113
+ return null;
114
+ }
115
+ return payloadModifierApiDescriptor(desc, conf);
116
+ }, apiDescriptor);
117
+ },
118
+ });
119
+ },
120
+ };
121
+ }
122
+ exports.default = payloadModifier;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platform = platform;
4
+ const constant_1 = require("../../constant");
5
+ /**
6
+ * Generate OpenAPI file URLs based on platform type.
7
+ * For Swagger and Knife4j, generates multiple URLs covering both OAS3 and Swagger2 endpoints.
8
+ */
9
+ function resolvePlatformUrls(baseUrl, platformType) {
10
+ // Normalize: remove trailing slash
11
+ const base = baseUrl.replace(/\/+$/, '');
12
+ switch (platformType) {
13
+ case 'swagger':
14
+ // Try OAS3 first, then Swagger2, then generic openapi.json
15
+ return [
16
+ `${base}/openapi.json`,
17
+ `${base}/v2/swagger.json`,
18
+ `${base}/api/v3/openapi.json`,
19
+ baseUrl,
20
+ ];
21
+ case 'knife4j':
22
+ // Try OAS3 first (springdoc), then Swagger2 (springfox)
23
+ return [
24
+ `${base}/v3/api-docs`,
25
+ `${base}/v2/api-docs`,
26
+ baseUrl,
27
+ ];
28
+ case 'fastapi':
29
+ return [`${base}/openapi.json`, baseUrl];
30
+ case 'yapi':
31
+ // YApi requires pid and token in URL, use input as-is
32
+ return [baseUrl];
33
+ }
34
+ }
35
+ /**
36
+ * Platform plugin for auto-resolving OpenAPI file URLs.
37
+ *
38
+ * Pass a platform type (e.g., `'swagger'`) and the plugin will use `config.input`
39
+ * as the base URL to generate candidate OpenAPI file URLs. The framework will try
40
+ * each URL in order and use the first successful response.
41
+ *
42
+ * @param platformType - The platform type: 'swagger' | 'knife4j' | 'fastapi' | 'yapi'
43
+ * @returns ApiPlugin
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { platform, alovaGlobals } from 'worma/plugin';
48
+ *
49
+ * defineConfig({
50
+ * generator: [{
51
+ * input: 'https://petstore3.swagger.io',
52
+ * plugins: [platform('swagger'), alovaGlobals()],
53
+ * output: './src/api',
54
+ * }]
55
+ * });
56
+ * ```
57
+ */
58
+ function platform(platformType) {
59
+ return {
60
+ name: constant_1.PluginName.PLATFORM,
61
+ config({ config }) {
62
+ const raw = config.input;
63
+ if (!raw)
64
+ return config;
65
+ // Normalize to an array of base URLs, deduplicate
66
+ const inputs = Array.isArray(raw) ? [...new Set(raw)] : [raw];
67
+ // For each input, generate platform URLs, then flatten
68
+ config.input = inputs.flatMap(url => resolvePlatformUrls(url, platformType));
69
+ return config;
70
+ },
71
+ };
72
+ }
73
+ exports.default = platform;
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rename = rename;
4
+ const constant_1 = require("../../constant");
5
+ const utils_1 = require("./utils");
6
+ function toCamelCase(str) {
7
+ return str.replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : '')).replace(/^(.)/, c => c.toLowerCase());
8
+ }
9
+ function toCase(str) {
10
+ return str
11
+ .replace(/([a-z\d])([A-Z])/g, '$1_$2')
12
+ .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1_$2')
13
+ .replace(/[-\s]+/g, '_')
14
+ .toLowerCase();
15
+ }
16
+ function toKebabCase(str) {
17
+ return str
18
+ .replace(/([a-z\d])([A-Z])/g, '$1-$2')
19
+ .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1-$2')
20
+ .replace(/[_\s]+/g, '-')
21
+ .toLowerCase();
22
+ }
23
+ function toPascalCase(str) {
24
+ return str.replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : '')).replace(/^(.)/, c => c.toUpperCase());
25
+ }
26
+ /**
27
+ * Applies renaming rules to the specified value
28
+ * @returns The renamed value, or original value if not matched
29
+ */
30
+ function applyRenameRule(value, config, apiDescriptor) {
31
+ if (!(0, utils_1.isMatch)(value, config.match)) {
32
+ return value;
33
+ }
34
+ if (config.transform) {
35
+ value = config.transform(apiDescriptor, value);
36
+ }
37
+ if (!config.style) {
38
+ return value;
39
+ }
40
+ if (config.style === 'kebabCase' && config.scope === 'refName') {
41
+ throw new Error(`Invalid rename style: ${config.style}、${config.scope}`);
42
+ }
43
+ switch (config.style) {
44
+ case 'camelCase':
45
+ return toCamelCase(value);
46
+ case 'snakeCase':
47
+ return toCase(value);
48
+ case 'kebabCase':
49
+ return toKebabCase(value);
50
+ case 'pascalCase':
51
+ return toPascalCase(value);
52
+ default:
53
+ throw new Error(`Invalid rename style: ${config.style}`);
54
+ }
55
+ }
56
+ /**
57
+ * renames URL path by processing each segment individually
58
+ * while keeping path parameter placeholders
59
+ */
60
+ function renameUrl(url, config, apiDescriptor) {
61
+ const segments = url.split('/');
62
+ return segments
63
+ .map((segment) => {
64
+ // Skip parameter placeholders and empty segments
65
+ if ((segment.startsWith('{') && segment.endsWith('}')) || !segment) {
66
+ return segment;
67
+ }
68
+ return applyRenameRule(segment, config, apiDescriptor);
69
+ })
70
+ .join('/')
71
+ .replace(/^\/{2,}/g, '/');
72
+ }
73
+ /**
74
+ * Transforms object properties using the renaming rules
75
+ */
76
+ function transformProperties(obj, config, apiDescriptor) {
77
+ if (!obj || typeof obj !== 'object' || !('properties' in obj)) {
78
+ return obj;
79
+ }
80
+ const properties = { ...obj.properties };
81
+ const newProperties = {};
82
+ for (const key in properties) {
83
+ const newKey = applyRenameRule(key, config, apiDescriptor);
84
+ newProperties[newKey] = properties[key];
85
+ }
86
+ return {
87
+ ...obj,
88
+ properties: newProperties,
89
+ };
90
+ }
91
+ /**
92
+ * Transforms parameters of specific type using the renaming rules
93
+ */
94
+ function transformParameters(parameters, type, config, apiDescriptor) {
95
+ if (!parameters || !Array.isArray(parameters)) {
96
+ return parameters;
97
+ }
98
+ return parameters.map((param) => {
99
+ if (param.in === type) {
100
+ return {
101
+ ...param,
102
+ name: applyRenameRule(param.name, config, apiDescriptor),
103
+ };
104
+ }
105
+ return param;
106
+ });
107
+ }
108
+ function transformRefNameMap(refNameMap, config, apiDescriptor) {
109
+ if (!refNameMap || typeof refNameMap !== 'object') {
110
+ return refNameMap;
111
+ }
112
+ const newRefNameMap = {};
113
+ for (const key in refNameMap) {
114
+ const newValue = applyRenameRule(refNameMap[key], config, apiDescriptor);
115
+ newRefNameMap[key] = newValue;
116
+ }
117
+ return newRefNameMap;
118
+ }
119
+ /**
120
+ * Processes API descriptor based on renaming configuration
121
+ *
122
+ * Each scope targets different parts of the API descriptor:
123
+ * - url: Renames URL path segments
124
+ * - params: Renames query parameters
125
+ * - pathParams: Renames path parameters and their placeholders in URL
126
+ * - data: Renames request body properties
127
+ * - response: Renames response body properties
128
+ */
129
+ function renameApiDescriptor(apiDescriptor, config) {
130
+ if (!apiDescriptor)
131
+ return apiDescriptor;
132
+ const newDescriptor = { ...apiDescriptor };
133
+ const scope = config.scope || constant_1.RenameScope.URL;
134
+ switch (scope) {
135
+ case constant_1.RenameScope.PARAMS:
136
+ if (newDescriptor.parameters) {
137
+ newDescriptor.parameters = transformParameters(newDescriptor.parameters, constant_1.ParameterIn.QUERY, config, apiDescriptor);
138
+ }
139
+ break;
140
+ case constant_1.RenameScope.PATH_PARAMS:
141
+ if (newDescriptor.parameters) {
142
+ newDescriptor.parameters = transformParameters(newDescriptor.parameters, constant_1.ParameterIn.PATH, config, apiDescriptor);
143
+ }
144
+ if (newDescriptor.url) {
145
+ newDescriptor.url = newDescriptor.url.replace(/\{([^}]+)\}/g, (match, paramName) => {
146
+ const newName = applyRenameRule(paramName, config, apiDescriptor);
147
+ return `{${newName}}`;
148
+ });
149
+ }
150
+ break;
151
+ case constant_1.RenameScope.DATA:
152
+ if (newDescriptor.requestBody) {
153
+ newDescriptor.requestBody = transformProperties(newDescriptor.requestBody, config, apiDescriptor);
154
+ }
155
+ break;
156
+ case constant_1.RenameScope.RESPONSE:
157
+ if (newDescriptor.responses) {
158
+ newDescriptor.responses = transformProperties(newDescriptor.responses, config, apiDescriptor);
159
+ }
160
+ break;
161
+ case constant_1.RenameScope.URL:
162
+ if (newDescriptor.url) {
163
+ newDescriptor.url = renameUrl(newDescriptor.url, config, apiDescriptor);
164
+ }
165
+ break;
166
+ case constant_1.RenameScope.REF_NAME:
167
+ if (newDescriptor.refNameMap) {
168
+ newDescriptor.refNameMap = transformRefNameMap(newDescriptor.refNameMap, config, apiDescriptor);
169
+ }
170
+ break;
171
+ default:
172
+ // No action needed, keep original descriptor
173
+ break;
174
+ }
175
+ return newDescriptor;
176
+ }
177
+ /**
178
+ * Creates a rename plugin that transforms API descriptors
179
+ * according to specified naming rules
180
+ */
181
+ function rename(config) {
182
+ const configs = Array.isArray(config) ? config : [config];
183
+ for (const conf of configs) {
184
+ if (!conf.style && !conf.transform) {
185
+ throw new Error('at least one of `style` or `transform` is required');
186
+ }
187
+ if (conf.style === 'kebabCase' && conf.scope === 'refName') {
188
+ throw new Error(`Invalid rename style: ${conf.style}、${conf.scope}`);
189
+ }
190
+ }
191
+ return {
192
+ name: constant_1.PluginName.RENAME,
193
+ config({ config }) {
194
+ return (0, utils_1.extend)(config, {
195
+ handleApi: (apiDescriptor) => {
196
+ if (!apiDescriptor)
197
+ return null;
198
+ // Apply each configuration in sequence
199
+ return configs.reduce((desc, conf) => {
200
+ if (!desc)
201
+ return null;
202
+ return renameApiDescriptor(desc, conf);
203
+ }, apiDescriptor);
204
+ },
205
+ });
206
+ },
207
+ };
208
+ }
209
+ exports.default = rename;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processApiTags = processApiTags;
4
+ exports.tagModifier = tagModifier;
5
+ const constant_1 = require("../../constant");
6
+ const utils_1 = require("./utils");
7
+ /**
8
+ * Validates if tag name follows naming conventions
9
+ * @param tag The tag name to validate
10
+ * @returns true if valid, false otherwise
11
+ */
12
+ function isValidTagName(tag) {
13
+ if (!tag || typeof tag !== 'string') {
14
+ return false;
15
+ }
16
+ const trimmedTag = tag.trim();
17
+ if (!trimmedTag) {
18
+ return false;
19
+ }
20
+ // Basic naming convention: allow letters, numbers, hyphens, underscores and Chinese characters
21
+ const validPattern = /^[\u4E00-\u9FA5\w-]+$/;
22
+ return validPattern.test(trimmedTag);
23
+ }
24
+ /**
25
+ * Processes tags in the API descriptor
26
+ * @param apiDescriptor The API descriptor
27
+ * @param handler Tag modifier handler function
28
+ * @returns Modified API descriptor
29
+ */
30
+ function processApiTags(apiDescriptor, handler) {
31
+ if (!apiDescriptor)
32
+ return apiDescriptor;
33
+ const newDescriptor = { ...apiDescriptor };
34
+ // Check if tags property exists and is an array
35
+ if (!newDescriptor.tags || !Array.isArray(newDescriptor.tags)) {
36
+ return newDescriptor;
37
+ }
38
+ // Process each tag and filter out null/undefined results
39
+ newDescriptor.tags = newDescriptor.tags
40
+ .map((tag) => {
41
+ try {
42
+ // Call user provided handler function
43
+ const modifiedTag = handler(tag);
44
+ // If handler returns null/undefined/void, remove this tag
45
+ if (!modifiedTag) {
46
+ return null;
47
+ }
48
+ // Validate if modified tag follows naming conventions
49
+ if (!isValidTagName(modifiedTag)) {
50
+ return tag; // Keep original tag if invalid
51
+ }
52
+ return modifiedTag.trim(); // Return trimmed modified tag
53
+ }
54
+ catch {
55
+ return tag; // Return original tag on error
56
+ }
57
+ })
58
+ .filter((tag) => tag != null); // Filter out null/undefined values
59
+ return newDescriptor;
60
+ }
61
+ /**
62
+ * Creates a tag modifier plugin
63
+ *
64
+ * @param handler Tag modifier handler function that receives a tag string and returns modified tag or null/undefined/void to remove the tag
65
+ * @returns API plugin instance
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * // Convert all tags to uppercase
70
+ * const upperCasePlugin = tagModifier(tag => tag.toUpperCase());
71
+ *
72
+ * // Add prefix to tags
73
+ * const prefixPlugin = tagModifier(tag => `api-${tag}`);
74
+ *
75
+ * // Remove specific tags
76
+ * const filterPlugin = tagModifier(tag => tag === 'internal' ? null : tag);
77
+ *
78
+ * // Use the plugin
79
+ * export default {
80
+ * generator: [{
81
+ * // ...other config
82
+ * plugins: [upperCasePlugin]
83
+ * }]
84
+ * };
85
+ * ```
86
+ */
87
+ function tagModifier(handler) {
88
+ if (!handler || typeof handler !== 'function') {
89
+ throw new Error('tagModifier requires a valid handler function');
90
+ }
91
+ return {
92
+ name: constant_1.PluginName.TAG_MODIFIER,
93
+ config({ config }) {
94
+ return (0, utils_1.extend)(config, {
95
+ handleApi: (apiDescriptor) => {
96
+ if (!apiDescriptor)
97
+ return null;
98
+ return processApiTags(apiDescriptor, handler);
99
+ },
100
+ });
101
+ },
102
+ };
103
+ }
104
+ exports.default = tagModifier;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extend = extend;
4
+ exports.isMatch = isMatch;
5
+ const prepareConfig_1 = require("../../functions/prepareConfig");
6
+ /**
7
+ * 扩展生成器配置:
8
+ * 根据传入的 newConfig(对象或函数)与基础 config 生成合并后的配置。
9
+ * 当未提供 newConfig 时,直接回退到原始 config。
10
+ * @param config 基础配置
11
+ * @param newConfig 需要扩展的配置或用于生成扩展配置的函数
12
+ * @returns 合并且标准化后的配置
13
+ */
14
+ function extend(config, newConfig) {
15
+ // 根据 newConfig 类型计算扩展配置:函数则调用生成配置,否则直接使用对象;未提供则回退到原始 config
16
+ const pluginExtendsConfig = typeof newConfig === 'function' ? newConfig(config) : (newConfig ?? config);
17
+ // 使用 extendsConfig 进行配置合并与标准化,确保最终结构满足生成器需求
18
+ return (0, prepareConfig_1.extendsConfig)(config, pluginExtendsConfig);
19
+ }
20
+ /**
21
+ * Tests if value matches the specified rule
22
+ */
23
+ function isMatch(value, match) {
24
+ if (!match)
25
+ return true;
26
+ if (typeof match === 'string') {
27
+ return value.includes(match);
28
+ }
29
+ if (match instanceof RegExp) {
30
+ return match.test(value);
31
+ }
32
+ if (typeof match === 'function') {
33
+ return match(value);
34
+ }
35
+ return false;
36
+ }
@@ -0,0 +1,92 @@
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.readConfig = readConfig;
7
+ exports.getApiDocs = getApiDocs;
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const esbuild_1 = __importDefault(require("esbuild"));
11
+ const wormaJson_1 = require("./functions/wormaJson");
12
+ const helper_1 = require("./helper");
13
+ const utils_1 = require("./utils");
14
+ const readWormaRc_1 = require("./functions/readWormaRc");
15
+ /**
16
+ * Read the worma.config configuration file and return the parsed configuration object.
17
+ * @param projectPath The project path where the configuration file is located. The default value is `process.cwd()`.
18
+ * @returns a promise instance that contains configuration object.
19
+ */
20
+ async function readConfig(projectPath = process.cwd()) {
21
+ const configFile = await (0, utils_1.resolveConfigFile)(projectPath);
22
+ if (!configFile) {
23
+ throw helper_1.logger.throwError(`Cannot found config file from path ${projectPath}`, {
24
+ projectPath,
25
+ name: 'readConfig',
26
+ });
27
+ }
28
+ // Check if it's a .wormarc file
29
+ if (configFile.endsWith('.wormarc')) {
30
+ const config = await (0, readWormaRc_1.readWormaRc)(projectPath);
31
+ if (!config) {
32
+ throw helper_1.logger.throwError(`Failed to parse .wormarc file from path ${projectPath}`, {
33
+ projectPath,
34
+ name: 'readConfig',
35
+ });
36
+ }
37
+ await helper_1.configHelper.load(config, projectPath);
38
+ return config;
39
+ }
40
+ // 获取用户已安装的依赖
41
+ const userDependencies = await (0, utils_1.getUserInstalledDependencies)(projectPath);
42
+ // 始终将 worma 自身作为外部依赖,防止 esbuild 打包 worma 源码进入临时文件
43
+ // 否则 __dirname 会指向用户项目目录,导致预设模板路径解析失败
44
+ // monorepo 子包可能不直接依赖 worma,但 config 文件会 import from 'worma'
45
+ const allExternals = [...new Set([...userDependencies, 'worma', 'worma/plugin'])];
46
+ const configTmpFileName = `alova_tmp_${Date.now()}.cjs`;
47
+ // 使用绝对路径:esbuild 写入相对 outfile 时按 cwd 解析,
48
+ // 而 require() 解析相对路径时基于调用模块所在目录,二者不一致会导致 require 失败。
49
+ // 绝对路径可保证写入与 require 指向同一文件。
50
+ const outfile = node_path_1.default.resolve(projectPath, configTmpFileName);
51
+ await esbuild_1.default.build({
52
+ entryPoints: [configFile],
53
+ // 排除用户已安装的依赖,避免打包进最终文件
54
+ external: allExternals,
55
+ bundle: true,
56
+ format: 'cjs',
57
+ platform: 'node',
58
+ outfile,
59
+ logLevel: 'silent',
60
+ });
61
+ // try/finally 保证临时文件在任何情况下(require 抛错)都被清理
62
+ let module;
63
+ try {
64
+ // eslint-disable-next-line ts/no-require-imports
65
+ module = require(outfile);
66
+ }
67
+ finally {
68
+ await (0, promises_1.unlink)(outfile);
69
+ }
70
+ const config = await helper_1.configHelper.readUserConfig(module.default || module);
71
+ // Read the cache file and save it
72
+ await helper_1.configHelper.load(config, projectPath);
73
+ return helper_1.configHelper.getConfig();
74
+ }
75
+ /**
76
+ * Get cached API docs. Cache is self-describing — no config needed.
77
+ * In monorepo, pass ANY sub-package path; cache is always read from the unified cacheRoot.
78
+ * @param outputs Optional filter: only return entries matching these output paths.
79
+ * If omitted, returns ALL cached entries (including all monorepo sub-projects).
80
+ * @param projectPath Project root, defaults to `process.cwd()`.
81
+ */
82
+ async function getApiDocs(outputs, projectPath = process.cwd()) {
83
+ if (!projectPath) {
84
+ return [];
85
+ }
86
+ if (outputs && outputs.length > 0) {
87
+ const results = await Promise.all(outputs.map(o => (0, wormaJson_1.readCacheApis)(projectPath, o)));
88
+ return results.filter((r) => r !== null);
89
+ }
90
+ // No filter: return all (includes all monorepo sub-projects)
91
+ return (0, wormaJson_1.readAllCacheApis)(projectPath);
92
+ }