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,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generate = generate;
|
|
4
|
+
exports.getValue = getValue;
|
|
5
|
+
exports.setComment = setComment;
|
|
6
|
+
exports.normalizeCode = normalizeCode;
|
|
7
|
+
exports.getTsStr = getTsStr;
|
|
8
|
+
const helper_1 = require("../../../../helper");
|
|
9
|
+
function generate(ast, ctx, generators) {
|
|
10
|
+
const generator = generators.find((generator) => {
|
|
11
|
+
const tyes = [generator.type].flat();
|
|
12
|
+
return tyes.includes(ast.type);
|
|
13
|
+
});
|
|
14
|
+
if (generator) {
|
|
15
|
+
return generator.generate(ast, ctx);
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function getValue(result, options) {
|
|
20
|
+
if (options.shallowDeep) {
|
|
21
|
+
options.shallowDeep = false;
|
|
22
|
+
options.deep = false;
|
|
23
|
+
return result.code;
|
|
24
|
+
}
|
|
25
|
+
return options.deep || !result.name ? result.code : result.name;
|
|
26
|
+
}
|
|
27
|
+
function setComment(ast, options) {
|
|
28
|
+
let { comment } = ast;
|
|
29
|
+
if (ast.deepComment && options.deep) {
|
|
30
|
+
comment += ast.deepComment;
|
|
31
|
+
}
|
|
32
|
+
const commenter = helper_1.CommentHelper.load({
|
|
33
|
+
type: options.commentType,
|
|
34
|
+
comment,
|
|
35
|
+
});
|
|
36
|
+
if (ast.deprecated) {
|
|
37
|
+
commenter.add('[deprecated]');
|
|
38
|
+
}
|
|
39
|
+
ast.comment = commenter.end();
|
|
40
|
+
return ast.comment ?? '';
|
|
41
|
+
}
|
|
42
|
+
/** Generate normalized TS code body (prettier moved to file level per 9.5.1). Applies basic normalization for merged comments and indentation. */
|
|
43
|
+
function normalizeCode(code, type) {
|
|
44
|
+
// Fix merged */ with next content: */id → */\nid, */{ → */\n{
|
|
45
|
+
const result = code.replace(/\*\/(\s*\S)/g, '*/\n$1');
|
|
46
|
+
const trimmed = result.trim();
|
|
47
|
+
// Normalize indentation for block structures
|
|
48
|
+
const blockTypes = ['interface', 'type', 'enum', 'group', 'array'];
|
|
49
|
+
if (!type || !blockTypes.includes(type))
|
|
50
|
+
return trimmed;
|
|
51
|
+
// Match { ... } blocks (interface/enum) or Array<{ ... }> blocks
|
|
52
|
+
const isBlock = trimmed.startsWith('{') || trimmed.startsWith('[') || trimmed.startsWith('Array<{');
|
|
53
|
+
if (!isBlock)
|
|
54
|
+
return trimmed;
|
|
55
|
+
const lines = trimmed.split('\n');
|
|
56
|
+
if (lines.length <= 2)
|
|
57
|
+
return trimmed;
|
|
58
|
+
return lines.map((line, i) => {
|
|
59
|
+
if (i === 0 || i === lines.length - 1)
|
|
60
|
+
return line.trim();
|
|
61
|
+
// Preserve nested indentation: lines already indented >= 2 spaces keep their depth
|
|
62
|
+
const trimmed = line.trimStart();
|
|
63
|
+
const leadingSpaces = line.length - trimmed.length;
|
|
64
|
+
return leadingSpaces >= 2 ? line : ` ${trimmed}`;
|
|
65
|
+
}).join('\n');
|
|
66
|
+
}
|
|
67
|
+
function getTsStr(genResult, options) {
|
|
68
|
+
let result = genResult.code;
|
|
69
|
+
switch (genResult.type) {
|
|
70
|
+
case 'interface':
|
|
71
|
+
result = `interface ${genResult.name} ${genResult.code}`;
|
|
72
|
+
break;
|
|
73
|
+
case 'type':
|
|
74
|
+
result = `type ${genResult.name} = ${genResult.code}`;
|
|
75
|
+
break;
|
|
76
|
+
case 'enum':
|
|
77
|
+
result = `enum ${genResult.name} ${genResult.code}`;
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
if (options?.export) {
|
|
83
|
+
result = `export ${result}`;
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.transformAST = transformAST;
|
|
7
|
+
exports.transformSchema = transformSchema;
|
|
8
|
+
const generates_1 = require("./generates");
|
|
9
|
+
const normalize_1 = __importDefault(require("./normalize"));
|
|
10
|
+
const parsers_1 = require("./parsers");
|
|
11
|
+
async function transformAST(ast, options) {
|
|
12
|
+
const result = (0, generates_1.astGenerate)(ast, options);
|
|
13
|
+
if (options.format) {
|
|
14
|
+
result.code = await (0, generates_1.normalizeCode)(result.code, result.type);
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
async function transformSchema(schema, options) {
|
|
19
|
+
const normalized = normalize_1.default.normalize(schema);
|
|
20
|
+
return (0, parsers_1.astParse)(normalized, options);
|
|
21
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.astLoader = exports.AstLoader = void 0;
|
|
4
|
+
const generates_1 = require("./generates");
|
|
5
|
+
const helper_1 = require("./helper");
|
|
6
|
+
class AstLoader {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.name = 'astLoader';
|
|
9
|
+
}
|
|
10
|
+
async transform(ast, options) {
|
|
11
|
+
return (0, helper_1.transformAST)(ast, options);
|
|
12
|
+
}
|
|
13
|
+
async transformSchema(schema, options) {
|
|
14
|
+
return (0, helper_1.transformSchema)(schema, options);
|
|
15
|
+
}
|
|
16
|
+
async transformTsStr(ast, options) {
|
|
17
|
+
const result = await this.transform(ast, options);
|
|
18
|
+
return (0, generates_1.getTsStr)(result, {
|
|
19
|
+
export: options.export,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.AstLoader = AstLoader;
|
|
24
|
+
exports.astLoader = new AstLoader();
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const normalizer_1 = require("./normalizer");
|
|
7
|
+
const convertTypeArray_1 = __importDefault(require("./rules/convertTypeArray"));
|
|
8
|
+
const handleEmptyType_1 = __importDefault(require("./rules/handleEmptyType"));
|
|
9
|
+
const inferType_1 = __importDefault(require("./rules/inferType"));
|
|
10
|
+
const mergeAnyOf_1 = __importDefault(require("./rules/mergeAnyOf"));
|
|
11
|
+
const normalizeCombiningKeywords_1 = __importDefault(require("./rules/normalizeCombiningKeywords"));
|
|
12
|
+
const normalizeEnum_1 = __importDefault(require("./rules/normalizeEnum"));
|
|
13
|
+
const normalizeNullType_1 = __importDefault(require("./rules/normalizeNullType"));
|
|
14
|
+
const removeRedundantKeywords_1 = __importDefault(require("./rules/removeRedundantKeywords"));
|
|
15
|
+
const simplifySingleType_1 = __importDefault(require("./rules/simplifySingleType"));
|
|
16
|
+
const validateSchema_1 = __importDefault(require("./rules/validateSchema"));
|
|
17
|
+
const normalizer = new normalizer_1.SchemaNormalizer();
|
|
18
|
+
// ================= 注册规则 =================
|
|
19
|
+
normalizer
|
|
20
|
+
.addRule({
|
|
21
|
+
name: 'inferType',
|
|
22
|
+
description: '从关键字推断类型',
|
|
23
|
+
handler: inferType_1.default,
|
|
24
|
+
})
|
|
25
|
+
.addRule({
|
|
26
|
+
name: 'normalizeNullType',
|
|
27
|
+
description: '规范化 null 类型',
|
|
28
|
+
handler: normalizeNullType_1.default,
|
|
29
|
+
})
|
|
30
|
+
.addRule({
|
|
31
|
+
name: 'convertTypeArray',
|
|
32
|
+
description: '将 type 数组转换为 anyOf 结构',
|
|
33
|
+
handler: convertTypeArray_1.default,
|
|
34
|
+
})
|
|
35
|
+
.addRule({
|
|
36
|
+
name: 'normalizeEnum',
|
|
37
|
+
description: '规范化枚举类型',
|
|
38
|
+
handler: normalizeEnum_1.default,
|
|
39
|
+
})
|
|
40
|
+
.addRule({
|
|
41
|
+
name: 'normalizeCombiningKeywords',
|
|
42
|
+
description: '规范化anyOf/oneOf/allOf 关键字',
|
|
43
|
+
handler: normalizeCombiningKeywords_1.default,
|
|
44
|
+
})
|
|
45
|
+
.addRule({
|
|
46
|
+
name: 'mergeAnyOf',
|
|
47
|
+
description: '合并anyOf中type相同的分支',
|
|
48
|
+
handler: mergeAnyOf_1.default,
|
|
49
|
+
})
|
|
50
|
+
.addRule({
|
|
51
|
+
name: 'removeRedundantKeywords',
|
|
52
|
+
description: '移除多余关键字',
|
|
53
|
+
handler: removeRedundantKeywords_1.default,
|
|
54
|
+
})
|
|
55
|
+
.addRule({
|
|
56
|
+
name: 'handleEmptyType',
|
|
57
|
+
description: '处理空类型定义',
|
|
58
|
+
handler: handleEmptyType_1.default,
|
|
59
|
+
})
|
|
60
|
+
.addRule({
|
|
61
|
+
name: 'simplifySingleType',
|
|
62
|
+
description: '简化单元素类型数组',
|
|
63
|
+
handler: simplifySingleType_1.default,
|
|
64
|
+
})
|
|
65
|
+
.addRule({
|
|
66
|
+
name: 'validateSchema',
|
|
67
|
+
description: '验证 schema 的有效性',
|
|
68
|
+
handler: validateSchema_1.default,
|
|
69
|
+
});
|
|
70
|
+
exports.default = normalizer;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaNormalizer = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const utils_1 = require("../../../../utils");
|
|
6
|
+
class SchemaNormalizer {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.rules = [];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 添加新规则
|
|
12
|
+
*/
|
|
13
|
+
addRule(rule) {
|
|
14
|
+
this.rules.push(rule);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 规范化 JSON Schema
|
|
19
|
+
* M1-A3: 循环检测从 JSON.stringify 改为 WeakSet,消除每节点 O(s) 序列化开销
|
|
20
|
+
*/
|
|
21
|
+
normalize(schema) {
|
|
22
|
+
// 深度优先遍历
|
|
23
|
+
const visited = new WeakSet();
|
|
24
|
+
const process = (s) => {
|
|
25
|
+
if (!s || (0, utils_1.isReferenceObject)(s) || visited.has(s)) {
|
|
26
|
+
return s;
|
|
27
|
+
}
|
|
28
|
+
visited.add(s);
|
|
29
|
+
// 处理组合模式
|
|
30
|
+
if (s.anyOf) {
|
|
31
|
+
s.anyOf = s.anyOf.map(item => process(item));
|
|
32
|
+
}
|
|
33
|
+
if (s.oneOf) {
|
|
34
|
+
s.oneOf = s.oneOf.map(item => process(item));
|
|
35
|
+
}
|
|
36
|
+
if (s.allOf) {
|
|
37
|
+
s.allOf = s.allOf.map(item => process(item));
|
|
38
|
+
}
|
|
39
|
+
// 处理数组类型
|
|
40
|
+
if ((0, utils_1.isMaybeArraySchemaObject)(s)) {
|
|
41
|
+
s.items = process(s.items);
|
|
42
|
+
}
|
|
43
|
+
// 处理对象属性
|
|
44
|
+
if (s.properties) {
|
|
45
|
+
const newProps = {};
|
|
46
|
+
for (const [key, value] of Object.entries(s.properties)) {
|
|
47
|
+
newProps[key] = process(value);
|
|
48
|
+
}
|
|
49
|
+
s.properties = newProps;
|
|
50
|
+
}
|
|
51
|
+
let result = s;
|
|
52
|
+
// 应用规则
|
|
53
|
+
for (const rule of this.rules) {
|
|
54
|
+
const newResult = rule.handler(result);
|
|
55
|
+
if (newResult && !visited.has(newResult)) {
|
|
56
|
+
result = newResult;
|
|
57
|
+
visited.add(result);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if ((0, lodash_1.isEqual)(s, result)) {
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
visited.delete(result);
|
|
64
|
+
return process(result);
|
|
65
|
+
};
|
|
66
|
+
return process((0, lodash_1.cloneDeep)(schema));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.SchemaNormalizer = SchemaNormalizer;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TYPE_REQUIRE_KEYWORDS = exports.TYPE_SPECIFIC_KEYWORDS = exports.GLOBAL_KEYWORDS = void 0;
|
|
4
|
+
exports.assignTypeSpecificKeywords = assignTypeSpecificKeywords;
|
|
5
|
+
exports.default = convertTypeArray;
|
|
6
|
+
exports.GLOBAL_KEYWORDS = [
|
|
7
|
+
'title',
|
|
8
|
+
'description',
|
|
9
|
+
'default',
|
|
10
|
+
'examples',
|
|
11
|
+
'deprecated',
|
|
12
|
+
'readOnly',
|
|
13
|
+
'writeOnly',
|
|
14
|
+
'const',
|
|
15
|
+
];
|
|
16
|
+
exports.TYPE_SPECIFIC_KEYWORDS = {
|
|
17
|
+
string: ['minLength', 'maxLength', 'pattern', 'format', 'contentMediaType'],
|
|
18
|
+
number: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
|
|
19
|
+
integer: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
|
|
20
|
+
array: ['items', 'minItems', 'maxItems', 'uniqueItems'],
|
|
21
|
+
object: ['properties', 'additionalProperties', 'required', 'minProperties', 'maxProperties'],
|
|
22
|
+
};
|
|
23
|
+
exports.TYPE_REQUIRE_KEYWORDS = {
|
|
24
|
+
string: [],
|
|
25
|
+
number: [],
|
|
26
|
+
integer: [],
|
|
27
|
+
array: [['items', { type: 'any' }]],
|
|
28
|
+
object: [],
|
|
29
|
+
};
|
|
30
|
+
function assignTypeSpecificKeywords(branch, type, typeSpecificKeywords) {
|
|
31
|
+
const keywords = exports.TYPE_SPECIFIC_KEYWORDS[type];
|
|
32
|
+
const requireKeywords = exports.TYPE_REQUIRE_KEYWORDS[type];
|
|
33
|
+
if (!keywords) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
keywords.forEach((key) => {
|
|
37
|
+
if (key in typeSpecificKeywords) {
|
|
38
|
+
branch[key] = typeSpecificKeywords[key];
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
requireKeywords.forEach(([key, value]) => {
|
|
42
|
+
if (!(key in typeSpecificKeywords)) {
|
|
43
|
+
branch[key] = value;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function convertTypeArray(schema) {
|
|
48
|
+
if (!Array.isArray(schema.type) || schema.type.length <= 1 || (schema.enum && Array.isArray(schema.enum))) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const { type: typeArray, ...restSchema } = schema;
|
|
52
|
+
const globalKeywords = {};
|
|
53
|
+
const typeSpecificKeywords = {};
|
|
54
|
+
for (const [key, value] of Object.entries(restSchema)) {
|
|
55
|
+
if (exports.GLOBAL_KEYWORDS.includes(key)) {
|
|
56
|
+
globalKeywords[key] = value;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
typeSpecificKeywords[key] = value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const branches = typeArray.map((t) => {
|
|
63
|
+
const branch = { type: t };
|
|
64
|
+
assignTypeSpecificKeywords(branch, t, typeSpecificKeywords);
|
|
65
|
+
return branch;
|
|
66
|
+
});
|
|
67
|
+
return { ...globalKeywords, anyOf: branches };
|
|
68
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = handleEmptyType;
|
|
4
|
+
function handleEmptyType(schema) {
|
|
5
|
+
if (!schema.type && !schema.enum && !schema.oneOf && !schema.anyOf && !schema.allOf && schema.const === undefined) {
|
|
6
|
+
return { ...schema, type: 'null' };
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = inferType;
|
|
4
|
+
const utils_1 = require("../../../../../utils");
|
|
5
|
+
function inferType(schema) {
|
|
6
|
+
if (Array.isArray(schema.type)
|
|
7
|
+
|| typeof schema.type === 'string') {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (schema.enum || schema.oneOf || schema.anyOf || schema.allOf) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const type = [];
|
|
14
|
+
if (schema.properties
|
|
15
|
+
|| schema.additionalProperties
|
|
16
|
+
|| schema.required
|
|
17
|
+
|| schema.minProperties !== undefined
|
|
18
|
+
|| schema.maxProperties !== undefined) {
|
|
19
|
+
type.push('object');
|
|
20
|
+
}
|
|
21
|
+
if ((0, utils_1.isMaybeArraySchemaObject)(schema)
|
|
22
|
+
|| schema.minItems !== undefined
|
|
23
|
+
|| schema.maxItems !== undefined
|
|
24
|
+
|| schema.uniqueItems !== undefined
|
|
25
|
+
|| schema.contains) {
|
|
26
|
+
type.push('array');
|
|
27
|
+
}
|
|
28
|
+
if (schema.minLength !== undefined
|
|
29
|
+
|| schema.maxLength !== undefined
|
|
30
|
+
|| schema.pattern
|
|
31
|
+
|| schema.format
|
|
32
|
+
|| schema.contentMediaType) {
|
|
33
|
+
type.push('string');
|
|
34
|
+
}
|
|
35
|
+
if (schema.minimum !== undefined
|
|
36
|
+
|| schema.maximum !== undefined
|
|
37
|
+
|| schema.multipleOf !== undefined
|
|
38
|
+
|| schema.exclusiveMinimum !== undefined
|
|
39
|
+
|| schema.exclusiveMaximum !== undefined) {
|
|
40
|
+
type.push('number');
|
|
41
|
+
}
|
|
42
|
+
return { ...schema, type };
|
|
43
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = mergeAnyOf;
|
|
4
|
+
function mergeAnyOf(schema) {
|
|
5
|
+
if (!schema.anyOf || schema.anyOf.length < 2) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const typeMap = new Map();
|
|
9
|
+
for (const sub of schema.anyOf) {
|
|
10
|
+
const t = sub.type;
|
|
11
|
+
const typeKey = Array.isArray(t) ? t.join(',') : String(t);
|
|
12
|
+
if (!typeMap.has(typeKey))
|
|
13
|
+
typeMap.set(typeKey, []);
|
|
14
|
+
typeMap.get(typeKey).push(sub);
|
|
15
|
+
}
|
|
16
|
+
const mergedAnyOf = [];
|
|
17
|
+
for (const group of typeMap.values()) {
|
|
18
|
+
if (group.length === 1) {
|
|
19
|
+
mergedAnyOf.push(group[0]);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const merged = { type: group[0].type };
|
|
23
|
+
for (const sub of group) {
|
|
24
|
+
for (const [key, value] of Object.entries(sub)) {
|
|
25
|
+
if (key === 'type')
|
|
26
|
+
continue;
|
|
27
|
+
if (merged[key] === undefined) {
|
|
28
|
+
merged[key] = value;
|
|
29
|
+
}
|
|
30
|
+
else if (Array.isArray(merged[key]) && Array.isArray(value)) {
|
|
31
|
+
merged[key] = Array.from(new Set([...merged[key], ...value]));
|
|
32
|
+
}
|
|
33
|
+
else if (typeof merged[key] === 'object' && typeof value === 'object') {
|
|
34
|
+
merged[key] = { ...merged[key], ...value };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
mergedAnyOf.push(merged);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (mergedAnyOf.length === schema.anyOf.length && mergedAnyOf.every((s, i) => s === schema.anyOf[i])) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
return { ...schema, anyOf: mergedAnyOf };
|
|
45
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = normalizeCombiningKeywords;
|
|
4
|
+
function normalizeCombiningKeywords(schema) {
|
|
5
|
+
const { allOf, anyOf, oneOf, ...baseSchema } = schema;
|
|
6
|
+
// 如果没有组合关键字,或只存在其中一个,则无需处理
|
|
7
|
+
if ([allOf, anyOf, oneOf].filter(Boolean).length <= 1) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// 用于存储最终转换后的 allOf 数组
|
|
11
|
+
const allOfArray = [];
|
|
12
|
+
// 2. 处理原始 allOf(展开到新 allOf 中)
|
|
13
|
+
if (Array.isArray(allOf)) {
|
|
14
|
+
allOfArray.push(...allOf);
|
|
15
|
+
}
|
|
16
|
+
// 3. 处理 anyOf(包装成 anyOf 对象)
|
|
17
|
+
if (Array.isArray(anyOf) && anyOf.length > 0) {
|
|
18
|
+
allOfArray.push({ anyOf });
|
|
19
|
+
}
|
|
20
|
+
// 4. 处理 oneOf(包装成 oneOf 对象)
|
|
21
|
+
if (Array.isArray(oneOf) && oneOf.length > 0) {
|
|
22
|
+
allOfArray.push({ oneOf });
|
|
23
|
+
}
|
|
24
|
+
// 构建最终模式
|
|
25
|
+
return allOfArray.length > 0 ? { allOf: allOfArray, ...baseSchema } : baseSchema;
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = normalizeEnum;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const utils_1 = require("../../../../../utils");
|
|
6
|
+
const convertTypeArray_1 = require("./convertTypeArray");
|
|
7
|
+
function normalizeEnum(schema) {
|
|
8
|
+
if (!schema.enum || !Array.isArray(schema.enum) || !schema.enum.length) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const enumArray = schema.enum ?? [];
|
|
12
|
+
const typeArray = [...new Set([schema.type ?? []].flat())];
|
|
13
|
+
const enumTypeArray = [];
|
|
14
|
+
enumArray.forEach((item) => {
|
|
15
|
+
const type = (0, utils_1.getType)(item);
|
|
16
|
+
if (!enumTypeArray.includes(type)) {
|
|
17
|
+
enumTypeArray.push(type);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const otherType = typeArray.filter(item => !enumTypeArray.includes(item));
|
|
21
|
+
const enumType = enumTypeArray.length > 1 ? enumTypeArray : (enumTypeArray[0] ?? 'null');
|
|
22
|
+
if (otherType.length > 0) {
|
|
23
|
+
return {
|
|
24
|
+
...(0, lodash_1.pick)(schema, convertTypeArray_1.GLOBAL_KEYWORDS),
|
|
25
|
+
anyOf: [
|
|
26
|
+
{
|
|
27
|
+
type: enumType,
|
|
28
|
+
enum: enumArray,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: otherType,
|
|
32
|
+
...(0, lodash_1.omit)(schema, convertTypeArray_1.GLOBAL_KEYWORDS.concat(['type', 'enum'])),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { ...schema, type: enumType };
|
|
38
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = normalizeNullType;
|
|
4
|
+
const NULL_TYPE = [null, 'null'];
|
|
5
|
+
function normalizeNullType(schema) {
|
|
6
|
+
// 兼容openai3.0的nullable
|
|
7
|
+
if (schema.nullable) {
|
|
8
|
+
delete schema.nullable;
|
|
9
|
+
const currentType = schema.type || [];
|
|
10
|
+
const typeArray = Array.isArray(currentType) ? currentType : [currentType];
|
|
11
|
+
const filteredTypes = typeArray.filter(t => t !== null && t !== 'null');
|
|
12
|
+
schema.type = filteredTypes.length > 0 ? [...filteredTypes, 'null'] : 'null';
|
|
13
|
+
}
|
|
14
|
+
if (schema.type === null || (Array.isArray(schema.type) && !schema.type.length)) {
|
|
15
|
+
return { ...schema, type: 'null' };
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(schema.type) && schema.type.some(t => NULL_TYPE.includes(t))) {
|
|
18
|
+
const filteredTypes = schema.type.filter(t => !NULL_TYPE.includes(t));
|
|
19
|
+
if (filteredTypes.length === 0) {
|
|
20
|
+
return { ...schema, type: 'null' };
|
|
21
|
+
}
|
|
22
|
+
return { ...schema, type: [...filteredTypes, 'null'] };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = removeRedundantKeywords;
|
|
4
|
+
const TYPE_SPECIFIC_KEYWORDS = {
|
|
5
|
+
string: ['minLength', 'maxLength', 'pattern', 'format', 'contentMediaType'],
|
|
6
|
+
number: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
|
|
7
|
+
integer: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'],
|
|
8
|
+
array: ['items', 'minItems', 'maxItems', 'uniqueItems'],
|
|
9
|
+
object: ['properties', 'additionalProperties', 'required', 'minProperties', 'maxProperties'],
|
|
10
|
+
};
|
|
11
|
+
function removeRedundantKeywords(schema) {
|
|
12
|
+
if (!schema.type || Array.isArray(schema.type))
|
|
13
|
+
return;
|
|
14
|
+
const { type } = schema;
|
|
15
|
+
const cleanSchema = { ...schema };
|
|
16
|
+
const typeKeywords = TYPE_SPECIFIC_KEYWORDS[type] ?? [];
|
|
17
|
+
Object.entries(TYPE_SPECIFIC_KEYWORDS).forEach(([typeName, keywords]) => {
|
|
18
|
+
if (type === typeName)
|
|
19
|
+
return;
|
|
20
|
+
keywords.forEach((keyword) => {
|
|
21
|
+
if (keyword in cleanSchema && !typeKeywords.includes(keyword)) {
|
|
22
|
+
delete cleanSchema[keyword];
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
return cleanSchema;
|
|
27
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = simplifySingleType;
|
|
4
|
+
function simplifySingleType(schema) {
|
|
5
|
+
if (Array.isArray(schema.type) && schema.type.length === 1) {
|
|
6
|
+
return { ...schema, type: schema.type[0] };
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = validateSchema;
|
|
4
|
+
function validateSchema(schema) {
|
|
5
|
+
if (schema.type && typeof schema.type !== 'string' && !Array.isArray(schema.type)) {
|
|
6
|
+
return { ...schema, type: 'null' };
|
|
7
|
+
}
|
|
8
|
+
if (schema.enum && (!Array.isArray(schema.enum) || schema.enum.length === 0)) {
|
|
9
|
+
delete schema.enum;
|
|
10
|
+
}
|
|
11
|
+
if (schema.const !== undefined && schema.const === null) {
|
|
12
|
+
return { ...schema, type: 'null' };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.arrayTypeParser = arrayTypeParser;
|
|
4
|
+
const helper_1 = require("../../../../helper");
|
|
5
|
+
const type_1 = require("../../../../type");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
function arrayTypeParser(schema, ctx) {
|
|
8
|
+
ctx.pathKey = '[]';
|
|
9
|
+
const itemsAst = ctx.next(schema.items, ctx.options);
|
|
10
|
+
const result = {
|
|
11
|
+
...(0, utils_1.initAST)(schema, ctx),
|
|
12
|
+
type: type_1.ASTType.ARRAY,
|
|
13
|
+
params: itemsAst,
|
|
14
|
+
};
|
|
15
|
+
result.deepComment = helper_1.CommentHelper.load({
|
|
16
|
+
type: ctx.options.commentType,
|
|
17
|
+
})
|
|
18
|
+
.add('[items] start')
|
|
19
|
+
.add(helper_1.CommentHelper.parse(itemsAst.comment ?? '').join('\n'))
|
|
20
|
+
.add(helper_1.CommentHelper.parse(itemsAst.deepComment ?? '').join('\n'))
|
|
21
|
+
.add('[items] end')
|
|
22
|
+
.end();
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
exports.default = {
|
|
26
|
+
type: 'array',
|
|
27
|
+
parse: arrayTypeParser,
|
|
28
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enumTypeParser = enumTypeParser;
|
|
4
|
+
const standardLoader_1 = require("../../../../core/loader/standardLoader");
|
|
5
|
+
const helper_1 = require("../../../../helper");
|
|
6
|
+
const type_1 = require("../../../../type");
|
|
7
|
+
const utils_1 = require("../../../../utils");
|
|
8
|
+
const utils_2 = require("./utils");
|
|
9
|
+
function enumTypeParser(schema, ctx) {
|
|
10
|
+
const result = {
|
|
11
|
+
...(0, utils_2.initAST)(schema, ctx),
|
|
12
|
+
type: type_1.ASTType.ENUM,
|
|
13
|
+
params: [],
|
|
14
|
+
};
|
|
15
|
+
const enumArray = schema.enum ?? [];
|
|
16
|
+
let typeArray = [schema.type ?? []].flat();
|
|
17
|
+
// 如果没有指定type,从enum值中推断类型
|
|
18
|
+
if (typeArray.length === 0 && enumArray.length > 0) {
|
|
19
|
+
typeArray = [...new Set(enumArray.map(item => (0, utils_1.getType)(item)))];
|
|
20
|
+
}
|
|
21
|
+
// 类型兼容性检查函数
|
|
22
|
+
const isTypeCompatible = (itemType, allowedTypes) => {
|
|
23
|
+
return allowedTypes.includes(itemType)
|
|
24
|
+
|| (allowedTypes.includes('number') && itemType === 'integer');
|
|
25
|
+
};
|
|
26
|
+
// 验证所有枚举值的类型
|
|
27
|
+
const hasInvalidType = enumArray.some(item => !isTypeCompatible((0, utils_1.getType)(item), typeArray));
|
|
28
|
+
if (hasInvalidType) {
|
|
29
|
+
throw helper_1.logger.throwError(`enum ${schema.title ?? 'undefined'} type error`, {
|
|
30
|
+
enum: enumArray,
|
|
31
|
+
type: typeArray,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
enumArray.forEach((item) => {
|
|
35
|
+
const keyName = typeof item === 'string' && standardLoader_1.standardLoader.validate(item) ? item.toUpperCase() : '';
|
|
36
|
+
result.params.push({
|
|
37
|
+
keyName,
|
|
38
|
+
ast: {
|
|
39
|
+
type: type_1.ASTType.LITERAL,
|
|
40
|
+
params: item,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
exports.default = {
|
|
47
|
+
type: 'enum',
|
|
48
|
+
parse: enumTypeParser,
|
|
49
|
+
};
|