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.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/bin/actions.js +245 -0
- package/dist/bin/cli.js +27 -0
- package/dist/bin/progressRenderer.js +47 -0
- package/dist/bin/renderer.js +551 -0
- package/dist/bin/theme.js +26 -0
- package/dist/config.js +19 -0
- package/dist/constant.js +162 -0
- package/dist/core/WorkerPool.js +102 -0
- package/dist/core/loader/astLoader/generates/array.js +34 -0
- package/dist/core/loader/astLoader/generates/enum.js +61 -0
- package/dist/core/loader/astLoader/generates/group.js +41 -0
- package/dist/core/loader/astLoader/generates/index.js +71 -0
- package/dist/core/loader/astLoader/generates/interface.js +59 -0
- package/dist/core/loader/astLoader/generates/simple.js +67 -0
- package/dist/core/loader/astLoader/generates/tuple.js +54 -0
- package/dist/core/loader/astLoader/generates/type.js +2 -0
- package/dist/core/loader/astLoader/generates/utils.js +86 -0
- package/dist/core/loader/astLoader/helper.js +21 -0
- package/dist/core/loader/astLoader/index.js +24 -0
- package/dist/core/loader/astLoader/normalize/index.js +70 -0
- package/dist/core/loader/astLoader/normalize/normalizer.js +69 -0
- package/dist/core/loader/astLoader/normalize/rules/convertTypeArray.js +68 -0
- package/dist/core/loader/astLoader/normalize/rules/handleEmptyType.js +8 -0
- package/dist/core/loader/astLoader/normalize/rules/inferType.js +43 -0
- package/dist/core/loader/astLoader/normalize/rules/mergeAnyOf.js +45 -0
- package/dist/core/loader/astLoader/normalize/rules/normalizeCombiningKeywords.js +26 -0
- package/dist/core/loader/astLoader/normalize/rules/normalizeEnum.js +38 -0
- package/dist/core/loader/astLoader/normalize/rules/normalizeNullType.js +24 -0
- package/dist/core/loader/astLoader/normalize/rules/removeRedundantKeywords.js +27 -0
- package/dist/core/loader/astLoader/normalize/rules/simplifySingleType.js +8 -0
- package/dist/core/loader/astLoader/normalize/rules/validateSchema.js +14 -0
- package/dist/core/loader/astLoader/parsers/array.js +28 -0
- package/dist/core/loader/astLoader/parsers/enum.js +49 -0
- package/dist/core/loader/astLoader/parsers/forward/array.js +12 -0
- package/dist/core/loader/astLoader/parsers/forward/enum.js +10 -0
- package/dist/core/loader/astLoader/parsers/forward/group.js +12 -0
- package/dist/core/loader/astLoader/parsers/forward/index.js +20 -0
- package/dist/core/loader/astLoader/parsers/forward/object.js +12 -0
- package/dist/core/loader/astLoader/parsers/forward/tuple.js +11 -0
- package/dist/core/loader/astLoader/parsers/forward/type.js +2 -0
- package/dist/core/loader/astLoader/parsers/group.js +50 -0
- package/dist/core/loader/astLoader/parsers/index.js +66 -0
- package/dist/core/loader/astLoader/parsers/object.js +44 -0
- package/dist/core/loader/astLoader/parsers/reference.js +41 -0
- package/dist/core/loader/astLoader/parsers/simple.js +48 -0
- package/dist/core/loader/astLoader/parsers/tuple.js +36 -0
- package/dist/core/loader/astLoader/parsers/type.js +2 -0
- package/dist/core/loader/astLoader/parsers/utils.js +58 -0
- package/dist/core/loader/callingCodeLoader/helper.js +183 -0
- package/dist/core/loader/callingCodeLoader/index.js +40 -0
- package/dist/core/loader/index.js +20 -0
- package/dist/core/loader/schemaLoader/index.js +101 -0
- package/dist/core/loader/standardLoader/helper.js +142 -0
- package/dist/core/loader/standardLoader/index.js +38 -0
- package/dist/core/loader/standardLoader/standards.js +105 -0
- package/dist/core/parser/index.js +18 -0
- package/dist/core/parser/openApiParser/helper.js +165 -0
- package/dist/core/parser/openApiParser/index.js +14 -0
- package/dist/core/parser/templateParser/helper.js +333 -0
- package/dist/core/parser/templateParser/index.js +314 -0
- package/dist/core/workerPool/index.js +6 -0
- package/dist/core/workerPool/poolManager.js +45 -0
- package/dist/core/workerPool/swagger2Worker.js +24 -0
- package/dist/core/workerPool/worker.js +61 -0
- package/dist/createConfig.js +37 -0
- package/dist/defineConfig.js +6 -0
- package/dist/functions/getAutoTemplateType.js +37 -0
- package/dist/functions/getFrameworkTag.js +18 -0
- package/dist/functions/prepareConfig.js +41 -0
- package/dist/functions/readWormaRc.js +155 -0
- package/dist/functions/wormaJson.js +232 -0
- package/dist/generate.js +84 -0
- package/dist/helper/PluginDriver.js +98 -0
- package/dist/helper/comment.js +88 -0
- package/dist/helper/config/ConfigHelper.js +79 -0
- package/dist/helper/config/ConfigManager.js +88 -0
- package/dist/helper/config/GeneratorHelper.js +343 -0
- package/dist/helper/config/index.js +19 -0
- package/dist/helper/config/type.js +2 -0
- package/dist/helper/config/zType.js +170 -0
- package/dist/helper/document/index.js +160 -0
- package/dist/helper/index.js +23 -0
- package/dist/helper/logger/index.js +76 -0
- package/dist/helper/progress.js +66 -0
- package/dist/helper/template/index.js +475 -0
- package/dist/index.js +33 -0
- package/dist/plugins/createPlugin.js +30 -0
- package/dist/plugins/index.js +34 -0
- package/dist/plugins/presets/aiDoc.js +173 -0
- package/dist/plugins/presets/apifox.js +56 -0
- package/dist/plugins/presets/filterApi.js +129 -0
- package/dist/plugins/presets/importType.js +49 -0
- package/dist/plugins/presets/payloadModifier/hepler.js +195 -0
- package/dist/plugins/presets/payloadModifier/index.js +122 -0
- package/dist/plugins/presets/payloadModifier/type.js +2 -0
- package/dist/plugins/presets/platform.js +73 -0
- package/dist/plugins/presets/rename.js +209 -0
- package/dist/plugins/presets/tagModifier.js +104 -0
- package/dist/plugins/presets/utils.js +36 -0
- package/dist/readConfig.js +92 -0
- package/dist/resolveWorkspaces.js +83 -0
- package/dist/template/index.js +180 -0
- package/dist/template/presets/ai-doc/SKILL.md.handlebars +29 -0
- package/dist/template/presets/ai-doc/references/{tag}/{api}.md.handlebars +54 -0
- package/dist/template/presets/alova/common/#index.cjs.handlebars +12 -0
- package/dist/template/presets/alova/common/components.d.cts.handlebars +1 -0
- package/dist/template/presets/alova/common/helper.cjs.handlebars +13 -0
- package/dist/template/presets/alova/common/services/#index.cjs.handlebars +13 -0
- package/dist/template/presets/alova/common/services/{tag}.cjs.handlebars +28 -0
- package/dist/template/presets/alova/common/services/{tag}.d.cts.handlebars +15 -0
- package/dist/template/presets/alova/common/typed.d.cts.handlebars +1 -0
- package/dist/template/presets/alova/module/#index.js.handlebars +12 -0
- package/dist/template/presets/alova/module/components.d.ts.handlebars +1 -0
- package/dist/template/presets/alova/module/helper.js.handlebars +11 -0
- package/dist/template/presets/alova/module/services/#index.js.handlebars +9 -0
- package/dist/template/presets/alova/module/services/{tag}.d.ts.handlebars +15 -0
- package/dist/template/presets/alova/module/services/{tag}.js.handlebars +21 -0
- package/dist/template/presets/alova/module/typed.d.ts.handlebars +1 -0
- package/dist/template/presets/alova/partials/api-jsdoc.handlebars +44 -0
- package/dist/template/presets/alova/partials/build-payload-body.handlebars +22 -0
- package/dist/template/presets/alova/partials/comment.handlebars +19 -0
- package/dist/template/presets/alova/partials/components-body.handlebars +4 -0
- package/dist/template/presets/alova/partials/dts-extra-config.handlebars +8 -0
- package/dist/template/presets/alova/partials/dts-fn-declare.handlebars +1 -0
- package/dist/template/presets/alova/partials/extract-responded.handlebars +11 -0
- package/dist/template/presets/alova/partials/stateshook-import.handlebars +9 -0
- package/dist/template/presets/alova/partials/stateshook-option.handlebars +9 -0
- package/dist/template/presets/alova/partials/typed-body.handlebars +43 -0
- package/dist/template/presets/alova/typescript/#index.ts.handlebars +14 -0
- package/dist/template/presets/alova/typescript/components.d.ts.handlebars +1 -0
- package/dist/template/presets/alova/typescript/helper.ts.handlebars +9 -0
- package/dist/template/presets/alova/typescript/services/#index.ts.handlebars +9 -0
- package/dist/template/presets/alova/typescript/services/{tag}.ts.handlebars +35 -0
- package/dist/template/presets/alova/typescript/typed.ts.handlebars +1 -0
- package/dist/template/presets/alova-globals/common/#index.cjs.handlebars +41 -0
- package/dist/template/presets/alova-globals/common/apiDefinitions.cjs.handlebars +12 -0
- package/dist/template/presets/alova-globals/common/createApis.cjs.handlebars +48 -0
- package/dist/template/presets/alova-globals/common/globals.d.cts.handlebars +2 -0
- package/dist/template/presets/alova-globals/module/#index.js.handlebars +2 -0
- package/dist/template/presets/alova-globals/module/apiDefinitions.js.handlebars +12 -0
- package/dist/template/presets/alova-globals/module/createApis.js.handlebars +44 -0
- package/dist/template/presets/alova-globals/module/globals.d.ts.handlebars +2 -0
- package/dist/template/presets/alova-globals/partials/comment.handlebars +19 -0
- package/dist/template/presets/alova-globals/partials/createApis-proxy-js.handlebars +55 -0
- package/dist/template/presets/alova-globals/partials/globals-d-ts.handlebars +148 -0
- package/dist/template/presets/alova-globals/partials/index-esm.handlebars +38 -0
- package/dist/template/presets/alova-globals/partials/withConfigType-jsdoc.handlebars +22 -0
- package/dist/template/presets/alova-globals/typescript/#index.ts.handlebars +2 -0
- package/dist/template/presets/alova-globals/typescript/apiDefinitions.ts.handlebars +12 -0
- package/dist/template/presets/alova-globals/typescript/createApis.ts.handlebars +99 -0
- package/dist/template/presets/alova-globals/typescript/globals.d.ts.handlebars +2 -0
- package/dist/template/presets/axios/common/#index.cjs.handlebars +22 -0
- package/dist/template/presets/axios/common/components.d.cts.handlebars +1 -0
- package/dist/template/presets/axios/common/helper.cjs.handlebars +27 -0
- package/dist/template/presets/axios/common/services/#index.cjs.handlebars +13 -0
- package/dist/template/presets/axios/common/services/{tag}.cjs.handlebars +28 -0
- package/dist/template/presets/axios/common/services/{tag}.d.cts.handlebars +11 -0
- package/dist/template/presets/axios/module/#index.js.handlebars +20 -0
- package/dist/template/presets/axios/module/components.d.ts.handlebars +1 -0
- package/dist/template/presets/axios/module/helper.js.handlebars +25 -0
- package/dist/template/presets/axios/module/services/#index.js.handlebars +9 -0
- package/dist/template/presets/axios/module/services/{tag}.d.ts.handlebars +11 -0
- package/dist/template/presets/axios/module/services/{tag}.js.handlebars +20 -0
- package/dist/template/presets/axios/partials/api-jsdoc.handlebars +44 -0
- package/dist/template/presets/axios/partials/comment.handlebars +19 -0
- package/dist/template/presets/axios/partials/components-body.handlebars +4 -0
- package/dist/template/presets/axios/partials/dts-fn-declare.handlebars +1 -0
- package/dist/template/presets/axios/partials/dts-types.handlebars +7 -0
- package/dist/template/presets/axios/typescript/#index.ts.handlebars +20 -0
- package/dist/template/presets/axios/typescript/components.d.ts.handlebars +1 -0
- package/dist/template/presets/axios/typescript/helper.ts.handlebars +28 -0
- package/dist/template/presets/axios/typescript/services/#index.ts.handlebars +9 -0
- package/dist/template/presets/axios/typescript/services/{tag}.ts.handlebars +31 -0
- package/dist/template/presets/config/common/worma.config.js.handlebars +9 -0
- package/dist/template/presets/config/module/worma.config.js.handlebars +9 -0
- package/dist/template/presets/config/partials/generator-content.handlebars +45 -0
- package/dist/template/presets/config/typescript/worma.config.ts.handlebars +9 -0
- package/dist/template/presets/fetch/common/#index.cjs.handlebars +17 -0
- package/dist/template/presets/fetch/common/FetchClient.cjs.handlebars +48 -0
- package/dist/template/presets/fetch/common/components.d.cts.handlebars +1 -0
- package/dist/template/presets/fetch/common/helper.cjs.handlebars +27 -0
- package/dist/template/presets/fetch/common/services/#index.cjs.handlebars +13 -0
- package/dist/template/presets/fetch/common/services/{tag}.cjs.handlebars +23 -0
- package/dist/template/presets/fetch/common/services/{tag}.d.cts.handlebars +10 -0
- package/dist/template/presets/fetch/module/#index.js.handlebars +15 -0
- package/dist/template/presets/fetch/module/FetchClient.js.handlebars +46 -0
- package/dist/template/presets/fetch/module/components.d.ts.handlebars +1 -0
- package/dist/template/presets/fetch/module/helper.js.handlebars +25 -0
- package/dist/template/presets/fetch/module/services/#index.js.handlebars +9 -0
- package/dist/template/presets/fetch/module/services/{tag}.d.ts.handlebars +10 -0
- package/dist/template/presets/fetch/module/services/{tag}.js.handlebars +15 -0
- package/dist/template/presets/fetch/partials/api-jsdoc.handlebars +44 -0
- package/dist/template/presets/fetch/partials/comment.handlebars +19 -0
- package/dist/template/presets/fetch/partials/components-body.handlebars +4 -0
- package/dist/template/presets/fetch/partials/dts-fn-declare.handlebars +1 -0
- package/dist/template/presets/fetch/partials/dts-types.handlebars +7 -0
- package/dist/template/presets/fetch/typescript/#index.ts.handlebars +15 -0
- package/dist/template/presets/fetch/typescript/FetchClient.ts.handlebars +59 -0
- package/dist/template/presets/fetch/typescript/components.d.ts.handlebars +1 -0
- package/dist/template/presets/fetch/typescript/helper.ts.handlebars +28 -0
- package/dist/template/presets/fetch/typescript/services/#index.ts.handlebars +9 -0
- package/dist/template/presets/fetch/typescript/services/{tag}.ts.handlebars +25 -0
- package/dist/template/presets/ky/module/#index.js.handlebars +14 -0
- package/dist/template/presets/ky/module/components.d.ts.handlebars +1 -0
- package/dist/template/presets/ky/module/helper.js.handlebars +27 -0
- package/dist/template/presets/ky/module/services/#index.js.handlebars +9 -0
- package/dist/template/presets/ky/module/services/{tag}.d.ts.handlebars +11 -0
- package/dist/template/presets/ky/module/services/{tag}.js.handlebars +19 -0
- package/dist/template/presets/ky/partials/api-jsdoc.handlebars +44 -0
- package/dist/template/presets/ky/partials/comment.handlebars +19 -0
- package/dist/template/presets/ky/partials/components-body.handlebars +4 -0
- package/dist/template/presets/ky/partials/dts-fn-declare.handlebars +1 -0
- package/dist/template/presets/ky/partials/dts-types.handlebars +9 -0
- package/dist/template/presets/ky/typescript/#index.ts.handlebars +14 -0
- package/dist/template/presets/ky/typescript/components.d.ts.handlebars +1 -0
- package/dist/template/presets/ky/typescript/helper.ts.handlebars +30 -0
- package/dist/template/presets/ky/typescript/services/#index.ts.handlebars +9 -0
- package/dist/template/presets/ky/typescript/services/{tag}.ts.handlebars +30 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/type/api.js +14 -0
- package/dist/type/ast.js +24 -0
- package/dist/type/base.js +17 -0
- package/dist/type/index.js +20 -0
- package/dist/type/lib.js +17 -0
- package/dist/type/openapi.js +2 -0
- package/dist/utils/base.js +212 -0
- package/dist/utils/format.js +64 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/openapi.js +417 -0
- package/dist/utils/readPackageJson.js +35 -0
- package/dist/utils/template.js +93 -0
- package/package.json +88 -0
- package/typings/index.d.ts +512 -0
- 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,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
|
+
}
|