@cnbcool/cnb-api-generate 1.0.0
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/README.md +399 -0
- package/bin/cag.js +3 -0
- package/bin/csg.js +3 -0
- package/built/codegen/action/generate-redux-action-ast-node.js +85 -0
- package/built/codegen/action/generate-redux-action-call-api-function-param-ast-node.js +40 -0
- package/built/codegen/action/generate-redux-action-normal-params-ast-node.js +52 -0
- package/built/codegen/action/generate-redux-action-params-binding-element-ast-node.js +40 -0
- package/built/codegen/action/generate-redux-action-params-type-literal-ast-node.js +58 -0
- package/built/codegen/api/generate-api-error-response-ast-node.js +83 -0
- package/built/codegen/api/generate-api-function-ast-node.js +133 -0
- package/built/codegen/api/generate-api-function-request-params-type-ast-node.js +59 -0
- package/built/codegen/api/generate-api-response-return-type-content.js +80 -0
- package/built/codegen/api/generate-api-success-response-ast-node.js +84 -0
- package/built/codegen/api/generate-function-content-ast-node.js +104 -0
- package/built/codegen/api/generate-function-normal-params-ast-node.js +49 -0
- package/built/codegen/api/generate-function-params-ast-node.js +249 -0
- package/built/codegen/api/generate-function-refs-type-params-ast-node.js +102 -0
- package/built/codegen/api/generate-import-ast-node.js +58 -0
- package/built/codegen/api/generate-request-function.js +81 -0
- package/built/codegen/api/generate-request-url-ast-node.js +98 -0
- package/built/codegen/enum/generate-enum-ast-node.js +95 -0
- package/built/codegen/enum/generate-enum-content-ast-node.js +74 -0
- package/built/codegen/interface/generate-import-interface-ast-node.js +47 -0
- package/built/codegen/interface/generate-interface-anchor-ast-node.js +25 -0
- package/built/codegen/interface/generate-interface-ast-node.js +322 -0
- package/built/codegen/interface/generate-interface-desc-ast-node.js +51 -0
- package/built/codegen/interface/generate-interface-entrance.js +110 -0
- package/built/codegen/printer/printer-skill-client-modules.js +58 -0
- package/built/codegen/printer/printer-skills-client-core.js +69 -0
- package/built/codegen/printer/printer-swagger-api-to-file.js +128 -0
- package/built/codegen/printer/printer-swagger-definitions-to-file.js +81 -0
- package/built/codegen/printer/printer-ts-ast-to-js-file.js +72 -0
- package/built/codegen/record/generate-record-anchor-ast-node.js +25 -0
- package/built/codegen/record/generate-record-ast-node.js +134 -0
- package/built/codegen/swagger-definitions-to-ast-node.js +36 -0
- package/built/codegen/types/md-array-type-content-ast-node.js +46 -0
- package/built/constants/actions.js +8 -0
- package/built/constants/definitions.js +20 -0
- package/built/constants/file.js +12 -0
- package/built/constants/index.js +20 -0
- package/built/constants/prettier.js +4 -0
- package/built/constants/request.js +35 -0
- package/built/constants/skills.js +5 -0
- package/built/generate-api.js +36 -0
- package/built/generate-defintions.js +32 -0
- package/built/generate-entrypoint.js +130 -0
- package/built/index.js +19 -0
- package/built/interface/index.js +16 -0
- package/built/skills-tools/generate-config.js +28 -0
- package/built/skills-tools/generate-skill-cli-help.js +156 -0
- package/built/skills-tools/generate-skill-cli-scripts.js +20 -0
- package/built/skills-tools/generate-skill-md.js +25 -0
- package/built/skills.js +36 -0
- package/built/test.js +1 -0
- package/built/utils/camel-to-kebab.js +13 -0
- package/built/utils/comment-line-break.js +6 -0
- package/built/utils/filter-api-param.js +64 -0
- package/built/utils/format-interface-name.js +12 -0
- package/built/utils/format-type-name.js +12 -0
- package/built/utils/gen-operation-id.js +24 -0
- package/built/utils/generate-map-item.js +16 -0
- package/built/utils/get-codegen-target.js +8 -0
- package/built/utils/get-config.js +68 -0
- package/built/utils/get-defintion-name.js +8 -0
- package/built/utils/get-defintion-type.js +13 -0
- package/built/utils/get-generate-license.js +39 -0
- package/built/utils/get-keyword-type-node.js +60 -0
- package/built/utils/get-printer-file-prefix.js +21 -0
- package/built/utils/get-skills-codegen-target.js +15 -0
- package/built/utils/get-swagger-file.js +60 -0
- package/built/utils/inject-param-to-path.js +12 -0
- package/built/utils/is-english-only.js +8 -0
- package/built/utils/is-skills.js +6 -0
- package/built/utils/lower-first-char.js +8 -0
- package/built/utils/path-to-camel-case.js +31 -0
- package/built/utils/progress.js +76 -0
- package/built/utils/to-camel-case.js +8 -0
- package/built/utils/translations-keyworad-to-string.js +55 -0
- package/client/core.ts +114 -0
- package/client/fetch-response-handler.ts +36 -0
- package/client/index.ts +377 -0
- package/client/modules.help.ts +36 -0
- package/client/schemaToJson.ts +26 -0
- package/client/shortcuts.ts +208 -0
- package/client/tools.help.ts +104 -0
- package/client/utils/convert-link.ts +139 -0
- package/client/utils/generate-unique-id.ts +3 -0
- package/package.json +75 -0
- package/skills-template/SKILL.md +100 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateFunctionParamsASTNode = generateFunctionParamsASTNode;
|
|
37
|
+
const ts = __importStar(require("typescript"));
|
|
38
|
+
const format_interface_name_1 = require("../../utils/format-interface-name");
|
|
39
|
+
const generate_function_refs_type_params_ast_node_1 = require("./generate-function-refs-type-params-ast-node");
|
|
40
|
+
const generate_function_normal_params_ast_node_1 = require("./generate-function-normal-params-ast-node");
|
|
41
|
+
const get_keyword_type_node_1 = require("../../utils/get-keyword-type-node");
|
|
42
|
+
const is_english_only_1 = require("../../utils/is-english-only");
|
|
43
|
+
const constants_1 = require("../../constants");
|
|
44
|
+
const md_array_type_content_ast_node_1 = require("../types/md-array-type-content-ast-node");
|
|
45
|
+
function generateFunctionParamsASTNode(methodData, pathParams, queryParams, bodyParams, defintionsMap) {
|
|
46
|
+
var _a;
|
|
47
|
+
// request函数参数
|
|
48
|
+
const requestParamsASTNodes = [];
|
|
49
|
+
const requestInterfaceASTNodes = [];
|
|
50
|
+
// redux action的参数
|
|
51
|
+
const reduxActionMap = {
|
|
52
|
+
imports: new Set(),
|
|
53
|
+
paramsSequence: [],
|
|
54
|
+
};
|
|
55
|
+
let dependencies = new Set();
|
|
56
|
+
let allRequestParams = [];
|
|
57
|
+
// 当存在多个path参数时,合并为一个对象,作为一个参数传入
|
|
58
|
+
// 当存在query的时候,会将path和query合并为一个对象,作为第一个参数传入
|
|
59
|
+
if (pathParams.length > 1 || (queryParams && queryParams.length > 0)) {
|
|
60
|
+
const paramsInterfaceName = `${(0, format_interface_name_1.formatInterfaceName)(methodData.exportName)}Params`;
|
|
61
|
+
const paramMap = {};
|
|
62
|
+
const firstParams = [];
|
|
63
|
+
// 排重
|
|
64
|
+
[...pathParams, ...queryParams].map((item) => {
|
|
65
|
+
paramMap[item.name] = item;
|
|
66
|
+
});
|
|
67
|
+
Object.keys(paramMap).forEach((key) => {
|
|
68
|
+
firstParams.push(paramMap[key]);
|
|
69
|
+
});
|
|
70
|
+
const paramsInterfaceContentASTNode = [];
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
72
|
+
for (let i = 0; i < firstParams.length; i++) {
|
|
73
|
+
const param = firstParams[i];
|
|
74
|
+
const keywordTypeSyntaxKind = (0, get_keyword_type_node_1.getKeywordTypeNode)(param.type);
|
|
75
|
+
if (keywordTypeSyntaxKind === ts.SyntaxKind.UnknownKeyword ||
|
|
76
|
+
keywordTypeSyntaxKind === ts.SyntaxKind.ObjectKeyword) {
|
|
77
|
+
throw new Error(`${methodData.exportName} ${param.name} type illegal`);
|
|
78
|
+
}
|
|
79
|
+
// 注入注释
|
|
80
|
+
if (param.description) {
|
|
81
|
+
const propertieDescKey = `${paramsInterfaceName}:${param.name}`;
|
|
82
|
+
// eslint-disable-next-line no-param-reassign
|
|
83
|
+
methodData.descriptionMap[propertieDescKey] = {
|
|
84
|
+
description: param.description,
|
|
85
|
+
default: param.default,
|
|
86
|
+
};
|
|
87
|
+
paramsInterfaceContentASTNode.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(`<$${propertieDescKey}$>`), undefined, undefined));
|
|
88
|
+
}
|
|
89
|
+
let signatureValue;
|
|
90
|
+
// 当前是否为enum
|
|
91
|
+
if (param.enum) {
|
|
92
|
+
signatureValue = ts.factory.createUnionTypeNode(param.enum.map((item) => {
|
|
93
|
+
let itemASTNode;
|
|
94
|
+
if (keywordTypeSyntaxKind === ts.SyntaxKind.NumberKeyword) {
|
|
95
|
+
if (item < 0) {
|
|
96
|
+
itemASTNode = ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, ts.factory.createNumericLiteral(Math.abs(item)));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
itemASTNode = ts.factory.createNumericLiteral(item);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
itemASTNode = ts.factory.createStringLiteral(item);
|
|
104
|
+
}
|
|
105
|
+
return ts.factory.createLiteralTypeNode(itemASTNode);
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
else if (keywordTypeSyntaxKind === ts.SyntaxKind.ArrayType) {
|
|
109
|
+
signatureValue = ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
|
|
110
|
+
let currParam = {
|
|
111
|
+
type: param.type,
|
|
112
|
+
items: param.items,
|
|
113
|
+
};
|
|
114
|
+
let layer = 0;
|
|
115
|
+
while (currParam) {
|
|
116
|
+
if (!currParam.items) {
|
|
117
|
+
signatureValue = ts.factory.createKeywordTypeNode((0, get_keyword_type_node_1.getKeywordTypeNode)(currParam === null || currParam === void 0 ? void 0 : currParam.type));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
layer += 1;
|
|
121
|
+
}
|
|
122
|
+
currParam = currParam.items;
|
|
123
|
+
}
|
|
124
|
+
for (let i = 0; i < layer; i++) {
|
|
125
|
+
signatureValue = ts.factory.createArrayTypeNode(signatureValue);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
signatureValue = ts.factory.createKeywordTypeNode(keywordTypeSyntaxKind);
|
|
130
|
+
}
|
|
131
|
+
// 创建interface的内容
|
|
132
|
+
paramsInterfaceContentASTNode.push(ts.factory.createPropertySignature(undefined, (0, is_english_only_1.isEnglishOnly)(param.name)
|
|
133
|
+
? ts.factory.createIdentifier(param.name)
|
|
134
|
+
: ts.factory.createStringLiteral(param.name), param.required
|
|
135
|
+
? undefined
|
|
136
|
+
: ts.factory.createToken(ts.SyntaxKind.QuestionToken), signatureValue));
|
|
137
|
+
}
|
|
138
|
+
// 注入注释
|
|
139
|
+
methodData.descriptionMap[paramsInterfaceName] = {
|
|
140
|
+
description: `${methodData.exportName} request params`,
|
|
141
|
+
};
|
|
142
|
+
requestInterfaceASTNodes.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(`<$${paramsInterfaceName}$>`)));
|
|
143
|
+
// 创建interface主体
|
|
144
|
+
requestInterfaceASTNodes.push(ts.factory.createInterfaceDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createIdentifier(paramsInterfaceName), undefined, undefined, paramsInterfaceContentASTNode));
|
|
145
|
+
// 创建path参数
|
|
146
|
+
const pathParamsBindingElements = pathParams.map((item) => {
|
|
147
|
+
return ts.factory.createBindingElement(undefined, undefined, ts.factory.createIdentifier(item.name), undefined);
|
|
148
|
+
});
|
|
149
|
+
// 创建解构参数
|
|
150
|
+
const deconstructionParams = [...pathParamsBindingElements];
|
|
151
|
+
if (queryParams && queryParams.length > 0) {
|
|
152
|
+
deconstructionParams.push(ts.factory.createBindingElement(ts.factory.createToken(ts.SyntaxKind.DotDotDotToken), undefined, ts.factory.createIdentifier(constants_1.CNB_REQUEST_PARAM_QUERY_NAME), undefined));
|
|
153
|
+
}
|
|
154
|
+
requestParamsASTNodes.push(ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createObjectBindingPattern(deconstructionParams), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(paramsInterfaceName), undefined), undefined));
|
|
155
|
+
// redux action参数定义
|
|
156
|
+
reduxActionMap.paramsSequence.push({
|
|
157
|
+
param: constants_1.CNB_REDUX_ACTION_PARAM_NAME,
|
|
158
|
+
typeLiteral: paramsInterfaceName,
|
|
159
|
+
typeLiteralLabel: constants_1.TypeLiteralLabel.Quoted,
|
|
160
|
+
required: true,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
allRequestParams = [...pathParams];
|
|
165
|
+
}
|
|
166
|
+
if (bodyParams) {
|
|
167
|
+
allRequestParams.push(bodyParams);
|
|
168
|
+
}
|
|
169
|
+
// 排序
|
|
170
|
+
allRequestParams.sort((a, b) => {
|
|
171
|
+
if (a.required === b.required)
|
|
172
|
+
return 0;
|
|
173
|
+
return a.required ? -1 : 1;
|
|
174
|
+
});
|
|
175
|
+
// 处理body和单个path参数(不存在query)
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
177
|
+
for (let i = 0; i < allRequestParams.length; i++) {
|
|
178
|
+
const param = allRequestParams[i];
|
|
179
|
+
if (param === null || param === void 0 ? void 0 : param.schema) {
|
|
180
|
+
// 多维数组处理
|
|
181
|
+
if (param.schema.type &&
|
|
182
|
+
param.schema.type ===
|
|
183
|
+
constants_1.DefinitionsKeywordTypeNodeKey.array &&
|
|
184
|
+
((_a = param.schema.items) === null || _a === void 0 ? void 0 : _a.type) ===
|
|
185
|
+
constants_1.DefinitionsKeywordTypeNodeKey.array) {
|
|
186
|
+
const { returnType, dependencies: typeDependencies } = (0, md_array_type_content_ast_node_1.mdArrayTypeContentAstNode)(defintionsMap, methodData.exportName, param.schema);
|
|
187
|
+
const paramsBodyName = `${(0, format_interface_name_1.formatInterfaceName)(methodData.exportName)}Payload`;
|
|
188
|
+
// 注入注释
|
|
189
|
+
methodData.descriptionMap[paramsBodyName] = {
|
|
190
|
+
description: `${methodData.exportName} request body payload`,
|
|
191
|
+
};
|
|
192
|
+
requestInterfaceASTNodes.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(`<$${paramsBodyName}$>`)));
|
|
193
|
+
// 创建interface主体
|
|
194
|
+
requestInterfaceASTNodes.push(ts.factory.createTypeAliasDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createIdentifier(paramsBodyName), undefined, returnType));
|
|
195
|
+
requestParamsASTNodes.push(ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier(param.name), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(paramsBodyName), undefined), undefined));
|
|
196
|
+
if (typeDependencies && typeDependencies.size > 0) {
|
|
197
|
+
dependencies = new Set([...dependencies, ...typeDependencies]);
|
|
198
|
+
}
|
|
199
|
+
// redux action参数定义
|
|
200
|
+
reduxActionMap.paramsSequence.push({
|
|
201
|
+
param: param.name,
|
|
202
|
+
typeLiteral: paramsBodyName,
|
|
203
|
+
typeLiteralLabel: constants_1.TypeLiteralLabel.Quoted,
|
|
204
|
+
required: param.required,
|
|
205
|
+
});
|
|
206
|
+
// 普通对象处理
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const [imports, astNode, paramsSequenceItem] = (0, generate_function_refs_type_params_ast_node_1.generateFunctionReferenceTypeDataParamsASTNode)(param, defintionsMap);
|
|
210
|
+
astNode && requestParamsASTNodes.push(astNode);
|
|
211
|
+
if (imports && imports.size > 0) {
|
|
212
|
+
dependencies = new Set([...dependencies, ...imports]);
|
|
213
|
+
}
|
|
214
|
+
// redux action参数定义
|
|
215
|
+
reduxActionMap.paramsSequence.push(paramsSequenceItem);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const normalParamsASTNode = (0, generate_function_normal_params_ast_node_1.generateFunctionNormalParamsASTNode)(param);
|
|
220
|
+
requestParamsASTNodes.push(normalParamsASTNode);
|
|
221
|
+
// redux action参数定义
|
|
222
|
+
reduxActionMap.paramsSequence.push({
|
|
223
|
+
param: param.name,
|
|
224
|
+
typeLiteral: param.type || null,
|
|
225
|
+
typeLiteralLabel: constants_1.TypeLiteralLabel.Native,
|
|
226
|
+
required: param.required,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// 添加requestConfig
|
|
231
|
+
requestParamsASTNodes.push(ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createObjectBindingPattern([
|
|
232
|
+
ts.factory.createBindingElement(undefined, undefined, ts.factory.createIdentifier(constants_1.CNB_REQUEST_PARAM_REQ_NAME), undefined),
|
|
233
|
+
ts.factory.createBindingElement(undefined, undefined, ts.factory.createIdentifier(constants_1.CNB_REQUEST_PARAM_OPTIONS_NAME), undefined),
|
|
234
|
+
ts.factory.createBindingElement(ts.factory.createToken(ts.SyntaxKind.DotDotDotToken), undefined, ts.factory.createIdentifier(constants_1.CNB_REQUEST_AXIOS_CONFIG_NAME), undefined),
|
|
235
|
+
]), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(constants_1.CNB_REQUEST_PARAM_TYPE_NAME), undefined), ts.factory.createObjectLiteralExpression([], false)));
|
|
236
|
+
// redux action参数定义
|
|
237
|
+
reduxActionMap.paramsSequence.push({
|
|
238
|
+
param: constants_1.CNB_REQUEST_CONFIG_NAME,
|
|
239
|
+
typeLiteral: constants_1.CNB_REQUEST_PARAM_TYPE_NAME,
|
|
240
|
+
typeLiteralLabel: constants_1.TypeLiteralLabel.Quoted,
|
|
241
|
+
required: false,
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
requestParamsASTNodes,
|
|
245
|
+
reduxActionMap,
|
|
246
|
+
dependencies,
|
|
247
|
+
requestInterfaceASTNodes,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateFunctionReferenceTypeDataParamsASTNode = generateFunctionReferenceTypeDataParamsASTNode;
|
|
37
|
+
const ts = __importStar(require("typescript"));
|
|
38
|
+
const get_keyword_type_node_1 = require("../../utils/get-keyword-type-node");
|
|
39
|
+
const get_defintion_name_1 = require("../../utils/get-defintion-name");
|
|
40
|
+
const constants_1 = require("../../constants");
|
|
41
|
+
const translations_keyworad_to_string_1 = require("../../utils/translations-keyworad-to-string");
|
|
42
|
+
function isBaseApiParamArrayData(schema) {
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
return schema.type && schema.type === 'array';
|
|
45
|
+
}
|
|
46
|
+
function generateFunctionReferenceTypeDataParamsASTNode(param, defintionsMap) {
|
|
47
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
48
|
+
const imports = new Set();
|
|
49
|
+
let astNode = null;
|
|
50
|
+
const paramsSequenceItem = {
|
|
51
|
+
param: param.name,
|
|
52
|
+
typeLiteral: null,
|
|
53
|
+
required: true,
|
|
54
|
+
typeLiteralLabel: null,
|
|
55
|
+
};
|
|
56
|
+
if (!param.schema) {
|
|
57
|
+
return [imports, astNode, paramsSequenceItem];
|
|
58
|
+
}
|
|
59
|
+
// 判断是否为数组
|
|
60
|
+
if (isBaseApiParamArrayData(param.schema)) {
|
|
61
|
+
// 是否为锚点
|
|
62
|
+
if ((_a = param.schema.items) === null || _a === void 0 ? void 0 : _a.type) {
|
|
63
|
+
const keywordTypeNode = (0, get_keyword_type_node_1.getKeywordTypeNode)((_b = param.schema.items) === null || _b === void 0 ? void 0 : _b.type);
|
|
64
|
+
if (!keywordTypeNode ||
|
|
65
|
+
keywordTypeNode === ts.SyntaxKind.ObjectKeyword ||
|
|
66
|
+
keywordTypeNode === ts.SyntaxKind.ArrayType) {
|
|
67
|
+
throw new Error(`[${(_c = param.schema.items) === null || _c === void 0 ? void 0 : _c.type}] ${param.name} is not a valid type!`);
|
|
68
|
+
}
|
|
69
|
+
astNode = ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier(param.name), undefined, ts.factory.createArrayTypeNode(ts.factory.createKeywordTypeNode(keywordTypeNode)), undefined);
|
|
70
|
+
paramsSequenceItem.typeLiteral =
|
|
71
|
+
(0, translations_keyworad_to_string_1.translationsKeyworadToString)(keywordTypeNode);
|
|
72
|
+
paramsSequenceItem.typeLiteralLabel = constants_1.TypeLiteralLabel.Native;
|
|
73
|
+
}
|
|
74
|
+
// 处理锚点
|
|
75
|
+
else if ((_d = param.schema.items) === null || _d === void 0 ? void 0 : _d.$ref) {
|
|
76
|
+
const defintionName = (0, get_defintion_name_1.getDefinitionName)((_e = param.schema.items) === null || _e === void 0 ? void 0 : _e.$ref);
|
|
77
|
+
const defintion = defintionsMap[defintionName];
|
|
78
|
+
if (!defintion) {
|
|
79
|
+
throw new Error(`[${(_f = param.schema) === null || _f === void 0 ? void 0 : _f.type}] ${param.name} not found ${defintionName}!`);
|
|
80
|
+
}
|
|
81
|
+
imports.add(defintionName);
|
|
82
|
+
astNode = ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier(param.name), param.required
|
|
83
|
+
? undefined
|
|
84
|
+
: ts.factory.createToken(ts.SyntaxKind.QuestionToken), ts.factory.createArrayTypeNode(ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(defintion.exportName), undefined)), undefined);
|
|
85
|
+
paramsSequenceItem.typeLiteral = defintion.exportName;
|
|
86
|
+
paramsSequenceItem.typeLiteralLabel = constants_1.TypeLiteralLabel.Quoted;
|
|
87
|
+
}
|
|
88
|
+
// object
|
|
89
|
+
}
|
|
90
|
+
else if ((_g = param.schema) === null || _g === void 0 ? void 0 : _g.$ref) {
|
|
91
|
+
const defintionName = (0, get_defintion_name_1.getDefinitionName)((_h = param.schema) === null || _h === void 0 ? void 0 : _h.$ref);
|
|
92
|
+
const defintion = defintionsMap[defintionName];
|
|
93
|
+
if (!defintion) {
|
|
94
|
+
throw new Error(`[object] ${param.name} not found ${defintionName}!`);
|
|
95
|
+
}
|
|
96
|
+
imports.add(defintionName);
|
|
97
|
+
astNode = ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier(param.name), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(defintion.exportName), undefined), undefined);
|
|
98
|
+
paramsSequenceItem.typeLiteral = defintion.exportName;
|
|
99
|
+
paramsSequenceItem.typeLiteralLabel = constants_1.TypeLiteralLabel.Quoted;
|
|
100
|
+
}
|
|
101
|
+
return [imports, astNode, paramsSequenceItem];
|
|
102
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateImportAstNode = generateImportAstNode;
|
|
37
|
+
exports.generateDefaultImportAstNode = generateDefaultImportAstNode;
|
|
38
|
+
const ts = __importStar(require("typescript"));
|
|
39
|
+
const get_printer_file_prefix_1 = require("../../utils/get-printer-file-prefix");
|
|
40
|
+
function generateImportAstNode(importName, importPath, clause, category, type) {
|
|
41
|
+
const prefix = type
|
|
42
|
+
? `../${category ? '../' : ''}${(0, get_printer_file_prefix_1.getPrinterFilePrefix)(type)}/`
|
|
43
|
+
: '';
|
|
44
|
+
let importSpecifiers = [];
|
|
45
|
+
if (Array.isArray(importName)) {
|
|
46
|
+
importSpecifiers = importName.map((name) => {
|
|
47
|
+
return ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(name));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
importSpecifiers.push(ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(importName)));
|
|
52
|
+
}
|
|
53
|
+
return ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(clause, undefined, ts.factory.createNamedImports(importSpecifiers)), ts.factory.createStringLiteral(`${prefix}${importPath}`), undefined);
|
|
54
|
+
}
|
|
55
|
+
function generateDefaultImportAstNode(importName, importPath, clause, type) {
|
|
56
|
+
const prefix = type ? `../${(0, get_printer_file_prefix_1.getPrinterFilePrefix)(type)}/` : '';
|
|
57
|
+
return ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(clause, ts.factory.createIdentifier(importName), undefined), ts.factory.createStringLiteral(`${prefix}${importPath}`), undefined);
|
|
58
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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.generateRequestFunction = generateRequestFunction;
|
|
7
|
+
const constants_1 = require("../../constants");
|
|
8
|
+
const camel_to_kebab_1 = require("../../utils/camel-to-kebab");
|
|
9
|
+
const comment_line_break_1 = require("../../utils/comment-line-break");
|
|
10
|
+
const gen_operation_id_1 = require("../../utils/gen-operation-id");
|
|
11
|
+
const get_config_1 = require("../../utils/get-config");
|
|
12
|
+
const lower_first_char_1 = require("../../utils/lower-first-char");
|
|
13
|
+
const generate_api_function_ast_node_1 = require("./generate-api-function-ast-node");
|
|
14
|
+
const generate_import_ast_node_1 = require("./generate-import-ast-node");
|
|
15
|
+
const debug_1 = __importDefault(require("debug"));
|
|
16
|
+
const logger = (0, debug_1.default)('cag:api');
|
|
17
|
+
function generateRequestFunction(path, method, methodDefinitions, definitions, defintionsMap) {
|
|
18
|
+
var _a;
|
|
19
|
+
if (!methodDefinitions.operationId) {
|
|
20
|
+
// 根据method和path自动生成operationId
|
|
21
|
+
// eslint-disable-next-line no-param-reassign
|
|
22
|
+
methodDefinitions.operationId = (0, gen_operation_id_1.generateOperationId)(path, method);
|
|
23
|
+
logger(`[${method}] <${path}> no operatiion, auto generate operationId -> ${methodDefinitions.operationId}`);
|
|
24
|
+
}
|
|
25
|
+
const methodData = {
|
|
26
|
+
path,
|
|
27
|
+
method,
|
|
28
|
+
astNode: [],
|
|
29
|
+
category: (0, camel_to_kebab_1.camelToKebab)(((_a = methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.tags) === null || _a === void 0 ? void 0 : _a[0]) || ''), // 默认第一个tag作为分类,不支持多个
|
|
30
|
+
tags: methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.tags,
|
|
31
|
+
filename: (0, camel_to_kebab_1.camelToKebab)((methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.operationId) || ''),
|
|
32
|
+
description: (methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.description)
|
|
33
|
+
? (0, comment_line_break_1.commentLineBreak)(methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.description)
|
|
34
|
+
: '',
|
|
35
|
+
summary: (methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.summary)
|
|
36
|
+
? (0, comment_line_break_1.commentLineBreak)(methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.summary)
|
|
37
|
+
: '',
|
|
38
|
+
original: methodDefinitions,
|
|
39
|
+
exportName: (0, lower_first_char_1.lowerFirstChar)((methodDefinitions === null || methodDefinitions === void 0 ? void 0 : methodDefinitions.operationId) || ''),
|
|
40
|
+
descriptionMap: {},
|
|
41
|
+
source: path,
|
|
42
|
+
};
|
|
43
|
+
logger(`[${method}] <${path}>`);
|
|
44
|
+
methodData.astNode.push((0, generate_import_ast_node_1.generateImportAstNode)('IncomingMessage', 'http', true, methodData.category, undefined));
|
|
45
|
+
if ((0, get_config_1.getConfig)().printeReduxAction) {
|
|
46
|
+
methodData.astNode.push((0, generate_import_ast_node_1.generateImportAstNode)(constants_1.CNB_REDUX_ACTION_THUNK, constants_1.CNB_REDUX_ACTION_PACKAGENAME, false, methodData.category, undefined));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 默认必须引入2个依赖,用于提供生成的代码调用axios的实例
|
|
50
|
+
* import fetch from '../../request';
|
|
51
|
+
* import { CnbRequestOptions, CnbRequestResult } from '../..cnb/request';
|
|
52
|
+
*/
|
|
53
|
+
const requestFunctionDefaultImportMap = {};
|
|
54
|
+
const requestFunctionImportMap = {};
|
|
55
|
+
const config = (0, get_config_1.getConfig)();
|
|
56
|
+
const { requestDependencyMap } = config;
|
|
57
|
+
Object.keys(requestDependencyMap).forEach((key) => {
|
|
58
|
+
const { isDefault, path } = requestDependencyMap[key];
|
|
59
|
+
if (isDefault) {
|
|
60
|
+
requestFunctionDefaultImportMap[path] = key;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
if (requestFunctionImportMap[path]) {
|
|
64
|
+
requestFunctionImportMap[path].push(key);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
requestFunctionImportMap[path] = [key];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
72
|
+
for (const key in requestFunctionDefaultImportMap) {
|
|
73
|
+
methodData.astNode.push((0, generate_import_ast_node_1.generateDefaultImportAstNode)(requestFunctionDefaultImportMap[key], key, false));
|
|
74
|
+
}
|
|
75
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
76
|
+
for (const key in requestFunctionImportMap) {
|
|
77
|
+
methodData.astNode.push((0, generate_import_ast_node_1.generateImportAstNode)(requestFunctionImportMap[key], key, false, methodData.category, undefined));
|
|
78
|
+
}
|
|
79
|
+
methodData.astNode.push(...(0, generate_api_function_ast_node_1.generateApiFunctionASTNode)(methodData, definitions, defintionsMap));
|
|
80
|
+
return methodData;
|
|
81
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateRequestUrlASTNode = generateRequestUrlASTNode;
|
|
37
|
+
const ts = __importStar(require("typescript"));
|
|
38
|
+
function generateRequestUrlASTNode(originalPath, pathParams) {
|
|
39
|
+
if (!pathParams || pathParams.length === 0) {
|
|
40
|
+
return ts.factory.createStringLiteral(originalPath);
|
|
41
|
+
}
|
|
42
|
+
const headArrya = [];
|
|
43
|
+
const spanArray = [];
|
|
44
|
+
let pathSwitch = false;
|
|
45
|
+
const requestPathArray = originalPath.split('/');
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
47
|
+
for (let i = 0; i < requestPathArray.length; i++) {
|
|
48
|
+
const requestPathItem = requestPathArray[i];
|
|
49
|
+
if (pathSwitch) {
|
|
50
|
+
if (/\{.*\}/gi.test(requestPathItem)) {
|
|
51
|
+
const match = requestPathItem.match(/^\{(.+)\}$/);
|
|
52
|
+
if (!match) {
|
|
53
|
+
throw new Error(`Failed to extract the variables ${requestPathItem} in the url`);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 某一些path比较特殊
|
|
57
|
+
* /{repo}/-/upload/commit-assets/{sha1:string}
|
|
58
|
+
* 这时候要将前面的sha1提取出来
|
|
59
|
+
*/
|
|
60
|
+
const variable = match[1].split(':')[0];
|
|
61
|
+
const item = {
|
|
62
|
+
identifier: variable,
|
|
63
|
+
middle: [],
|
|
64
|
+
};
|
|
65
|
+
spanArray.push(item);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
spanArray[spanArray.length - 1].middle.push(requestPathItem);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
if (!/\{.*\}/gi.test(requestPathItem)) {
|
|
73
|
+
headArrya.push(requestPathItem);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
pathSwitch = true;
|
|
77
|
+
i -= 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (spanArray.length === 0) {
|
|
82
|
+
return ts.factory.createStringLiteral(originalPath);
|
|
83
|
+
}
|
|
84
|
+
const head = `${headArrya.join('/')}/`;
|
|
85
|
+
const astNode = ts.factory.createTemplateExpression(ts.factory.createTemplateHead(head, head), spanArray.map((item, key) => {
|
|
86
|
+
const last = key === spanArray.length - 1;
|
|
87
|
+
// eslint-disable-next-line no-nested-ternary
|
|
88
|
+
const middlePath = last
|
|
89
|
+
? item.middle.length > 0 ? `/${item.middle.join('/')}` : ''
|
|
90
|
+
: item.middle.length === 0
|
|
91
|
+
? '/'
|
|
92
|
+
: `/${item.middle.join('/')}/`;
|
|
93
|
+
return ts.factory.createTemplateSpan(ts.factory.createIdentifier(item.identifier), last
|
|
94
|
+
? ts.factory.createTemplateTail(middlePath, middlePath)
|
|
95
|
+
: ts.factory.createTemplateMiddle(middlePath, middlePath));
|
|
96
|
+
}));
|
|
97
|
+
return astNode;
|
|
98
|
+
}
|