@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.
Files changed (89) hide show
  1. package/README.md +399 -0
  2. package/bin/cag.js +3 -0
  3. package/bin/csg.js +3 -0
  4. package/built/codegen/action/generate-redux-action-ast-node.js +85 -0
  5. package/built/codegen/action/generate-redux-action-call-api-function-param-ast-node.js +40 -0
  6. package/built/codegen/action/generate-redux-action-normal-params-ast-node.js +52 -0
  7. package/built/codegen/action/generate-redux-action-params-binding-element-ast-node.js +40 -0
  8. package/built/codegen/action/generate-redux-action-params-type-literal-ast-node.js +58 -0
  9. package/built/codegen/api/generate-api-error-response-ast-node.js +83 -0
  10. package/built/codegen/api/generate-api-function-ast-node.js +133 -0
  11. package/built/codegen/api/generate-api-function-request-params-type-ast-node.js +59 -0
  12. package/built/codegen/api/generate-api-response-return-type-content.js +80 -0
  13. package/built/codegen/api/generate-api-success-response-ast-node.js +84 -0
  14. package/built/codegen/api/generate-function-content-ast-node.js +104 -0
  15. package/built/codegen/api/generate-function-normal-params-ast-node.js +49 -0
  16. package/built/codegen/api/generate-function-params-ast-node.js +249 -0
  17. package/built/codegen/api/generate-function-refs-type-params-ast-node.js +102 -0
  18. package/built/codegen/api/generate-import-ast-node.js +58 -0
  19. package/built/codegen/api/generate-request-function.js +81 -0
  20. package/built/codegen/api/generate-request-url-ast-node.js +98 -0
  21. package/built/codegen/enum/generate-enum-ast-node.js +95 -0
  22. package/built/codegen/enum/generate-enum-content-ast-node.js +74 -0
  23. package/built/codegen/interface/generate-import-interface-ast-node.js +47 -0
  24. package/built/codegen/interface/generate-interface-anchor-ast-node.js +25 -0
  25. package/built/codegen/interface/generate-interface-ast-node.js +322 -0
  26. package/built/codegen/interface/generate-interface-desc-ast-node.js +51 -0
  27. package/built/codegen/interface/generate-interface-entrance.js +110 -0
  28. package/built/codegen/printer/printer-skill-client-modules.js +58 -0
  29. package/built/codegen/printer/printer-skills-client-core.js +69 -0
  30. package/built/codegen/printer/printer-swagger-api-to-file.js +128 -0
  31. package/built/codegen/printer/printer-swagger-definitions-to-file.js +81 -0
  32. package/built/codegen/printer/printer-ts-ast-to-js-file.js +72 -0
  33. package/built/codegen/record/generate-record-anchor-ast-node.js +25 -0
  34. package/built/codegen/record/generate-record-ast-node.js +134 -0
  35. package/built/codegen/swagger-definitions-to-ast-node.js +36 -0
  36. package/built/codegen/types/md-array-type-content-ast-node.js +46 -0
  37. package/built/constants/actions.js +8 -0
  38. package/built/constants/definitions.js +20 -0
  39. package/built/constants/file.js +12 -0
  40. package/built/constants/index.js +20 -0
  41. package/built/constants/prettier.js +4 -0
  42. package/built/constants/request.js +35 -0
  43. package/built/constants/skills.js +5 -0
  44. package/built/generate-api.js +36 -0
  45. package/built/generate-defintions.js +32 -0
  46. package/built/generate-entrypoint.js +130 -0
  47. package/built/index.js +19 -0
  48. package/built/interface/index.js +16 -0
  49. package/built/skills-tools/generate-config.js +28 -0
  50. package/built/skills-tools/generate-skill-cli-help.js +156 -0
  51. package/built/skills-tools/generate-skill-cli-scripts.js +20 -0
  52. package/built/skills-tools/generate-skill-md.js +25 -0
  53. package/built/skills.js +36 -0
  54. package/built/test.js +1 -0
  55. package/built/utils/camel-to-kebab.js +13 -0
  56. package/built/utils/comment-line-break.js +6 -0
  57. package/built/utils/filter-api-param.js +64 -0
  58. package/built/utils/format-interface-name.js +12 -0
  59. package/built/utils/format-type-name.js +12 -0
  60. package/built/utils/gen-operation-id.js +24 -0
  61. package/built/utils/generate-map-item.js +16 -0
  62. package/built/utils/get-codegen-target.js +8 -0
  63. package/built/utils/get-config.js +68 -0
  64. package/built/utils/get-defintion-name.js +8 -0
  65. package/built/utils/get-defintion-type.js +13 -0
  66. package/built/utils/get-generate-license.js +39 -0
  67. package/built/utils/get-keyword-type-node.js +60 -0
  68. package/built/utils/get-printer-file-prefix.js +21 -0
  69. package/built/utils/get-skills-codegen-target.js +15 -0
  70. package/built/utils/get-swagger-file.js +60 -0
  71. package/built/utils/inject-param-to-path.js +12 -0
  72. package/built/utils/is-english-only.js +8 -0
  73. package/built/utils/is-skills.js +6 -0
  74. package/built/utils/lower-first-char.js +8 -0
  75. package/built/utils/path-to-camel-case.js +31 -0
  76. package/built/utils/progress.js +76 -0
  77. package/built/utils/to-camel-case.js +8 -0
  78. package/built/utils/translations-keyworad-to-string.js +55 -0
  79. package/client/core.ts +114 -0
  80. package/client/fetch-response-handler.ts +36 -0
  81. package/client/index.ts +377 -0
  82. package/client/modules.help.ts +36 -0
  83. package/client/schemaToJson.ts +26 -0
  84. package/client/shortcuts.ts +208 -0
  85. package/client/tools.help.ts +104 -0
  86. package/client/utils/convert-link.ts +139 -0
  87. package/client/utils/generate-unique-id.ts +3 -0
  88. package/package.json +75 -0
  89. package/skills-template/SKILL.md +100 -0
package/README.md ADDED
@@ -0,0 +1,399 @@
1
+ # cnb-api-generate
2
+
3
+ `cnb-api-generate`是一款基于`swagger2.0`标准协议生成基于`@cnb/request`和`@reduxjs/toolkit`的`Typescript`代码的工具。将`Typescript`中的`Interface`和`Enum`与`swagger.json`强绑定。并自动对请求函数的依赖分析并引入。
4
+
5
+ ## 解决了什么问题?
6
+ 长期以来,前后端开发都是两套代码甚至多套代码各自维护。前端基于后端提供的接口定义,例如`swagger.json`中定义的接口入参出参,自行编写`Typescript`代码,用`Typescript`重新定义一遍接口的入参出参(`Interface`和`Enum`)。然后自行引用这些定义的入参出参(`Interface`和`Enum`)。
7
+
8
+ 看似一切都很正常,实际上这里有一个致命问题,当后端接口主动或被动发生变更时,前端无感知。但是代码却能正常编译通过,当进入到运行时时,就会出现错误。问题核心就在于前端自行维护入参出参(`Interface`和`Enum`)和`swargger.json`中的定义是脱钩的。当后端代码发生变化,通过编译重新生成了`swargger.json`,但是新的`swargger.json`的变化并不能触达到前端。
9
+
10
+ - ❎ 与`swargger.json`脱钩,`swargger.json`变化无法触发前端,编译通过,运行报错。
11
+ - ❎ 手动定义`Interface`和`Enum`,可能存在认为失误写错代码。
12
+ - ❎ 可能存在多个重复定义的`Interface`和`Enum`。
13
+
14
+ 当使用`cnb-api-generate`后,`Interface`和`Enum`完全基于`swargger.json`中的定义自动生成标准的`Typescript`代码。并根据前端`CNB`的前端技术栈,完全自动生成多态化的网络函数调用,并自动完成对`Interface`和`Enum`的依赖注入。
15
+
16
+ - 💯 `swargger.json`与所有的前端网络调用函数代码强绑定,当`swargger.json`变化后,重新生成前端代码,实现`Typescript`代码重新生成,从而在编译时就能发现类型错误的问题。
17
+ - 💯 `Interface`和`Enum`的定义完全自动化,完全基于`swargger.json`,无需人为干预。
18
+ - 💯 生成的代码更规范,抹除因开发人员水平差异导致编写的`Typescript`代码质量参差不齐。
19
+ - 💯 完善的jsDos定义,除了生成`Typescript`代码外,还会根据`swargger.json`定义每个参数的说明,自动生成jsDos的注释。
20
+ - 💯 从生成的代码和注释质量倒推接口的文档规范。
21
+
22
+ ## 安装
23
+
24
+ ```shell
25
+ npm install @cnbcool/cnb-api-generate -D
26
+ # or
27
+ yarn add @cnbcool/cnb-api-generate -D
28
+ ```
29
+
30
+ ## 快速使用
31
+
32
+ 在运行`cag`目录下创建`cag.config.js`文件。
33
+
34
+ ```javascript
35
+ module.exports = {
36
+ target: '<swargger.json文件地址>',
37
+ }
38
+ ```
39
+
40
+ ```shell
41
+ npx cag
42
+ # or
43
+ yarn cag
44
+ ```
45
+
46
+ >cnb-api-generate必须搭配@cnb/request使用!!!
47
+
48
+
49
+ ## cag.config.js
50
+ `cnb-api-generate`基本不需要任何配置,为了灵活支持输入输出文件的位置和引用代码的自定义位置,提供一些简单的配置。
51
+
52
+ ### target
53
+ 指定`swagger.json`的文件位置,路径为相对cag.config.js的路径。
54
+
55
+ ### outputDir
56
+ 指定输出的生成代码的目录,路径为相对cag.config.js的路径。
57
+
58
+ ### printeReduxAction
59
+ 是否输出`Redux Action`代码,默认为`true`。
60
+
61
+ ### requestDependencyMap
62
+ 用于定义请求模块中依赖的函数与Typescript的定义
63
+
64
+ - path -> 模块所在路径
65
+ - isDefault -> 是否default导出
66
+ ```typescript
67
+ [key in string]: {
68
+ path: string;
69
+ isDefault: boolean;
70
+ }
71
+ ```
72
+
73
+ > 基于@cnb/request,已内置,无需配置
74
+
75
+ ## Example
76
+ `cnb-api-generate`基于`swargger`中定义的类型生成三类型代码,`Interface`、`Enum`和`Api`。其中`Api`会基于`swargger`中对接口的分类进行目录级归类输出。
77
+
78
+ ### Interface
79
+ 对`swagger`中定义的`definitions`处理,生成`Interface`。
80
+ ```json
81
+ "dto.AiAutoPrResult": {
82
+ "type": "object",
83
+ "properties": {
84
+ "buildLogUrl": {
85
+ "description": "构建链接",
86
+ "type": "string"
87
+ },
88
+ "message": {
89
+ "description": "message",
90
+ "type": "string"
91
+ },
92
+ "sn": {
93
+ "description": "构建号",
94
+ "type": "string"
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ interfaces/dto.aiautoprresult.ts
101
+ ```typescript
102
+ export interface DtoAiAutoPrResult {
103
+ /**
104
+ * 构建链接
105
+ */
106
+ buildLogUrl?: string;
107
+ /**
108
+ * message
109
+ */
110
+ message?: string;
111
+ /**
112
+ * 构建号
113
+ */
114
+ sn?: string;
115
+ }
116
+
117
+ ```
118
+
119
+ #### 依赖其他Interface
120
+ 在`swagger`的定义中,`definitions`是可以互相依赖的。`cnb-api-generate`会自动处理好所有依赖的文件引入,确保代码正常使用。
121
+
122
+ ```json
123
+ "api.CommitObject": {
124
+ "type": "object",
125
+ "properties": {
126
+ "author": {
127
+ "$ref": "#/definitions/api.Signature"
128
+ },
129
+ "comment_count": {
130
+ "type": "integer"
131
+ },
132
+ "committer": {
133
+ "$ref": "#/definitions/api.Signature"
134
+ },
135
+ "message": {
136
+ "type": "string"
137
+ },
138
+ "tree": {
139
+ "$ref": "#/definitions/api.CommitObjectTree"
140
+ },
141
+ "verification": {
142
+ "$ref": "#/definitions/api.CommitObjectVerification"
143
+ }
144
+ }
145
+ }
146
+ ```
147
+ interfaces/api.commitobject.ts
148
+ ```typescript
149
+ import { ApiSignature } from "./api.signature";
150
+ import { ApiCommitObjectTree } from "./api.commitobjecttree";
151
+ import { ApiCommitObjectVerification } from "./api.commitobjectverification";
152
+ export interface ApiCommitObject {
153
+ author?: ApiSignature;
154
+ comment_count?: number;
155
+ committer?: ApiSignature;
156
+ message?: string;
157
+ tree?: ApiCommitObjectTree;
158
+ verification?: ApiCommitObjectVerification;
159
+ }
160
+ ```
161
+
162
+ ### Enum
163
+ 对`swagger`中定义的`definitions`处理,生成`Interface`。
164
+
165
+ ```json
166
+ "constant.ActivityType": {
167
+ "type": "string",
168
+ "enum": [
169
+ "mine",
170
+ "fork",
171
+ "follow",
172
+ "star",
173
+ "join_group",
174
+ "create_repo",
175
+ "user_create_release",
176
+ "repo_create_release",
177
+ "user_deploy_success",
178
+ "repo_deploy_success",
179
+ "at_user",
180
+ "comment"
181
+ ],
182
+ "x-enum-comments": {
183
+ "AtUser": "AtUser @用户",
184
+ "Comment": "Comment pr,issue 评论",
185
+ "CreateRepo": "CreateRepo 创建仓库",
186
+ "Follow": "Follow 用户 follow",
187
+ "Fork": "Fork 仓库 fork",
188
+ "JoinGroup": "JoinGroup 加入组织",
189
+ "Mine": "Mine 与我相关的动态",
190
+ "RepoCreateRelease": "RepoCreateRelease 仓库发布版本",
191
+ "RepoDeploySuccess": "RepoDeploySuccess 仓库部署版本",
192
+ "Star": "Star 仓库 star",
193
+ "UserCreateRelease": "UserCreateRelease 用户发布版本",
194
+ "UserDeploySuccess": "UserDeploySuccess 用户部署版本"
195
+ },
196
+ "x-enum-descriptions": [
197
+ "Mine 与我相关的动态",
198
+ "Fork 仓库 fork",
199
+ "Follow 用户 follow",
200
+ "Star 仓库 star",
201
+ "JoinGroup 加入组织",
202
+ "CreateRepo 创建仓库",
203
+ "UserCreateRelease 用户发布版本",
204
+ "RepoCreateRelease 仓库发布版本",
205
+ "UserDeploySuccess 用户部署版本",
206
+ "RepoDeploySuccess 仓库部署版本",
207
+ "AtUser @用户",
208
+ "Comment pr,issue 评论"
209
+ ],
210
+ "x-enum-varnames": [
211
+ "Mine",
212
+ "Fork",
213
+ "Follow",
214
+ "Star",
215
+ "JoinGroup",
216
+ "CreateRepo",
217
+ "UserCreateRelease",
218
+ "RepoCreateRelease",
219
+ "UserDeploySuccess",
220
+ "RepoDeploySuccess",
221
+ "AtUser",
222
+ "Comment"
223
+ ]
224
+ }
225
+ ```
226
+
227
+ enums/constant.activitytype.ts
228
+ ```typescript
229
+ export enum ConstantActivityType {
230
+ /* Mine 与我相关的动态 */
231
+ Mine = "mine",
232
+ /* Fork 仓库 fork */
233
+ Fork = "fork",
234
+ /* Follow 用户 follow */
235
+ Follow = "follow",
236
+ /* Star 仓库 star */
237
+ Star = "star",
238
+ /* JoinGroup 加入组织 */
239
+ JoinGroup = "join_group",
240
+ /* CreateRepo 创建仓库 */
241
+ CreateRepo = "create_repo",
242
+ /* UserCreateRelease 用户发布版本 */
243
+ UserCreateRelease = "user_create_release",
244
+ /* RepoCreateRelease 仓库发布版本 */
245
+ RepoCreateRelease = "repo_create_release",
246
+ /* UserDeploySuccess 用户部署版本 */
247
+ UserDeploySuccess = "user_deploy_success",
248
+ /* RepoDeploySuccess 仓库部署版本 */
249
+ RepoDeploySuccess = "repo_deploy_success",
250
+ /* AtUser @用户 */
251
+ AtUser = "at_user",
252
+ /* Comment pr,issue 评论 */
253
+ Comment = "comment",
254
+ }
255
+ ```
256
+
257
+ ### Api
258
+ `cnb-api-generate`是为cnb量身定做的代码生成工具,所以基于`@cnb/request`和`@reduxjs/toolkit`生成调用代码,并且自动完成对生成的`interface`和`enum`的引用依赖。
259
+
260
+ ```json
261
+ "/user/gpg-keys/{id}": {
262
+ "delete": {
263
+ "security": [
264
+ {
265
+ "BearerAuth": []
266
+ }
267
+ ],
268
+ "consumes": [
269
+ "application/json"
270
+ ],
271
+ "produces": [
272
+ "application/json",
273
+ "application/vnd.cnb.web+json"
274
+ ],
275
+ "tags": [
276
+ "Users"
277
+ ],
278
+ "summary": "删除用户 GPG key",
279
+ "operationId": "DeleteGPGKey",
280
+ "parameters": [
281
+ {
282
+ "type": "string",
283
+ "description": "gpg id",
284
+ "name": "id",
285
+ "in": "path",
286
+ "required": true
287
+ }
288
+ ],
289
+ "responses": {
290
+ "200": {
291
+ "description": "OK"
292
+ },
293
+ "404": {
294
+ "description": "Not Found",
295
+ "schema": {
296
+ "$ref": "#/definitions/die.WebError"
297
+ }
298
+ },
299
+ "500": {
300
+ "description": "Internal Server Error",
301
+ "schema": {
302
+ "$ref": "#/definitions/die.WebError"
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }
308
+ ```
309
+
310
+ apis/users/delete-gpg-key.ts
311
+
312
+ ```typescript
313
+ import type { IncomingMessage } from "http";
314
+ import { createAsyncThunk } from "@reduxjs/toolkit";
315
+ import fetch from "@/request";
316
+ import { CnbRequestOptions, CnbRequestResult } from "@cnb/request";
317
+ import { AxiosRequestConfig } from "axios";
318
+ import { DieWebError } from "../../interfaces/die.weberror";
319
+
320
+ /**
321
+ * @description Other reuqest params
322
+ */
323
+ type RequestConfig<DataType = any> = AxiosRequestConfig<DataType> & {
324
+ options?: CnbRequestOptions;
325
+ req?: IncomingMessage;
326
+ };
327
+
328
+ /**
329
+ * @description DeleteGPGKeyRes Success Response Type
330
+ */
331
+ export type DeleteGPGKeyRes = unknown;
332
+
333
+ /**
334
+ * @description DeleteGPGKeyError Error Response Type
335
+ */
336
+ export type DeleteGPGKeyError = DieWebError;
337
+
338
+ /**
339
+ * @description No description
340
+ * @tags Users
341
+ * @name deleteGPGKey
342
+ * @summary 删除用户 GPG key
343
+ * @request delete:/user/gpg-keys/{id}
344
+
345
+ ----------------------------------
346
+ * @param {string} arg0
347
+ * @param {RequestConfig} arg1 - Other reuqest params
348
+ */
349
+ export async function deleteGPGKey(
350
+ id: string,
351
+ {req, options, ...axiosConfig}: RequestConfig = {},
352
+ ): Promise<CnbRequestResult<DeleteGPGKeyRes, DeleteGPGKeyError>> {
353
+ return await fetch.request<DeleteGPGKeyRes, DeleteGPGKeyError>({
354
+ ...axiosConfig,
355
+ _next_req: req,
356
+ options: options,
357
+ url: `/user/gpg-keys/${id}`,
358
+ _apiTag: "/user/gpg-keys/{id}",
359
+ method: "delete",
360
+ });
361
+ }
362
+ ```
363
+
364
+ ## 生成SKILL
365
+
366
+ 基于swagger生成Agent Skill。
367
+
368
+ ### 文件配置
369
+ cag.config.js
370
+ ```javascript
371
+ module.exports = {
372
+ target: './template/swagger.json',
373
+ skillsOutputDir: `./`,
374
+ }
375
+
376
+ ```
377
+
378
+ ### 执行命令
379
+
380
+ ```bash
381
+ npx csg
382
+ ```
383
+
384
+ 生成如下目录结构:
385
+
386
+ ```
387
+ | SKILL.md
388
+ | scripts/
389
+ | - core/
390
+ | - modules/
391
+ ```
392
+
393
+ ### 环境变量依赖
394
+
395
+ skills运行需要依赖以下环境变量
396
+
397
+ - CNB_API_ENDPOINT: 可选:自定义 API 地址(默认为 https://api.cnb.cool)
398
+ - CNB_TOKEN: openapi令牌
399
+ - CNB_WEB_ENDPOINT: 与CNB_API_ENDPOINT相对应的根域名(默认为 https://cnb.cool)
package/bin/cag.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../built/index.js');
package/bin/csg.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../built/skills.js');
@@ -0,0 +1,85 @@
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.generateReduxActionASTNode = generateReduxActionASTNode;
37
+ const ts = __importStar(require("typescript"));
38
+ const constants_1 = require("../../constants");
39
+ const generate_redux_action_params_binding_element_ast_node_1 = require("./generate-redux-action-params-binding-element-ast-node");
40
+ const generate_redux_action_params_type_literal_ast_node_1 = require("./generate-redux-action-params-type-literal-ast-node");
41
+ const generate_redux_action_call_api_function_param_ast_node_1 = require("./generate-redux-action-call-api-function-param-ast-node");
42
+ const format_interface_name_1 = require("../../utils/format-interface-name");
43
+ function generateReduxActionASTNode(methodData, reduxActionMap) {
44
+ var _a;
45
+ const { paramsSequence } = reduxActionMap;
46
+ const reduxActionRequestParamsBindingPatternASTNodes = [];
47
+ const reduxActionRequestParamsTypeLiteralASTNodes = [];
48
+ const reduxActionCallApiFunctionParamsASTNode = [];
49
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
50
+ for (let i = 0; i < paramsSequence.length; i++) {
51
+ const param = paramsSequence[i];
52
+ reduxActionRequestParamsBindingPatternASTNodes.push((0, generate_redux_action_params_binding_element_ast_node_1.generateReduxActionParamsBindingElementAstNode)(param));
53
+ reduxActionRequestParamsTypeLiteralASTNodes.push((0, generate_redux_action_params_type_literal_ast_node_1.generateReduxActionTypeLiteralElementAstNode)(param));
54
+ reduxActionCallApiFunctionParamsASTNode.push((0, generate_redux_action_call_api_function_param_ast_node_1.generateReduxActionCallApiFunctionParamAstNode)(param));
55
+ }
56
+ const reduxActionFunctionName = `${methodData.exportName}Action`;
57
+ const reduxActionParamTypeName = (0, format_interface_name_1.formatInterfaceName)(`${reduxActionFunctionName}Params`);
58
+ // 添加注释
59
+ const apiFunctionDescription = methodData.descriptionMap[methodData.exportName] || {};
60
+ methodData.descriptionMap[reduxActionParamTypeName] = {
61
+ name: reduxActionParamTypeName,
62
+ description: `${reduxActionParamTypeName} params type`,
63
+ };
64
+ methodData.descriptionMap[reduxActionFunctionName] = {
65
+ ...apiFunctionDescription,
66
+ name: reduxActionFunctionName,
67
+ param: `${reduxActionParamTypeName} ${((_a = methodData.descriptionMap[reduxActionParamTypeName]) === null || _a === void 0 ? void 0 : _a.description) || ''}`,
68
+ };
69
+ const reduxActionParamTypeASTNodes = ts.factory.createTypeAliasDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createIdentifier(reduxActionParamTypeName), undefined, ts.factory.createTypeLiteralNode(reduxActionRequestParamsTypeLiteralASTNodes));
70
+ return [
71
+ ts.factory.createExpressionStatement(ts.factory.createStringLiteral(`<$${reduxActionParamTypeName}$>`)),
72
+ reduxActionParamTypeASTNodes,
73
+ ts.factory.createExpressionStatement(ts.factory.createStringLiteral(`<$${reduxActionFunctionName}$>`)),
74
+ ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([
75
+ ts.factory.createVariableDeclaration(ts.factory.createIdentifier(reduxActionFunctionName), undefined, undefined, ts.factory.createCallExpression(ts.factory.createIdentifier(constants_1.CNB_REDUX_ACTION_THUNK), undefined, [
76
+ ts.factory.createStringLiteral(`${methodData.category}/${methodData.exportName}`),
77
+ ts.factory.createArrowFunction([ts.factory.createToken(ts.SyntaxKind.AsyncKeyword)], undefined, [
78
+ ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createObjectBindingPattern(reduxActionRequestParamsBindingPatternASTNodes), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(reduxActionParamTypeName), undefined), undefined),
79
+ ], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createBlock([
80
+ ts.factory.createReturnStatement(ts.factory.createAwaitExpression(ts.factory.createCallExpression(ts.factory.createIdentifier(methodData.exportName), undefined, reduxActionCallApiFunctionParamsASTNode))),
81
+ ], true)),
82
+ ])),
83
+ ], ts.NodeFlags.Const)),
84
+ ];
85
+ }
@@ -0,0 +1,40 @@
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.generateReduxActionCallApiFunctionParamAstNode = generateReduxActionCallApiFunctionParamAstNode;
37
+ const ts = __importStar(require("typescript"));
38
+ function generateReduxActionCallApiFunctionParamAstNode(data) {
39
+ return ts.factory.createIdentifier(data.param);
40
+ }
@@ -0,0 +1,52 @@
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.generateReduxActionNormalParamsASTNode = generateReduxActionNormalParamsASTNode;
37
+ const ts = __importStar(require("typescript"));
38
+ const get_keyword_type_node_1 = require("../../utils/get-keyword-type-node");
39
+ function generateReduxActionNormalParamsASTNode(param) {
40
+ const keywordTypeNode = (0, get_keyword_type_node_1.getKeywordTypeNode)(param.type);
41
+ if (!keywordTypeNode ||
42
+ keywordTypeNode === ts.SyntaxKind.ObjectKeyword ||
43
+ keywordTypeNode === ts.SyntaxKind.ArrayType) {
44
+ throw new Error(`[${param.type}] ${param.name} is not a valid type!`);
45
+ }
46
+ const reduxActionRequestParamsBindingPatternASTNode = ts.factory.createBindingElement(undefined, undefined, ts.factory.createIdentifier(param.name), undefined);
47
+ const reduxActionRequestParamsTypeLiteralASTNode = ts.factory.createPropertySignature(undefined, ts.factory.createIdentifier(param.name), undefined, ts.factory.createKeywordTypeNode(keywordTypeNode));
48
+ return {
49
+ reduxActionRequestParamsBindingPatternASTNode,
50
+ reduxActionRequestParamsTypeLiteralASTNode,
51
+ };
52
+ }
@@ -0,0 +1,40 @@
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.generateReduxActionParamsBindingElementAstNode = generateReduxActionParamsBindingElementAstNode;
37
+ const ts = __importStar(require("typescript"));
38
+ function generateReduxActionParamsBindingElementAstNode(data) {
39
+ return ts.factory.createBindingElement(undefined, undefined, ts.factory.createIdentifier(data.param), undefined);
40
+ }
@@ -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.generateReduxActionTypeLiteralElementAstNode = generateReduxActionTypeLiteralElementAstNode;
37
+ const ts = __importStar(require("typescript"));
38
+ const constants_1 = require("../../constants");
39
+ const get_keyword_type_node_1 = require("../../utils/get-keyword-type-node");
40
+ function generateReduxActionTypeLiteralElementAstNode(data) {
41
+ if (!data.typeLiteral || !data.typeLiteralLabel) {
42
+ throw new Error('typeLiteral and typeLiteralLabel are required');
43
+ }
44
+ let typeLiteral;
45
+ if (data.typeLiteralLabel === constants_1.TypeLiteralLabel.Quoted) {
46
+ typeLiteral = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(data.typeLiteral), undefined);
47
+ }
48
+ else {
49
+ const keywordTypeNode = (0, get_keyword_type_node_1.getKeywordTypeNode)(data.typeLiteral);
50
+ if (!keywordTypeNode || keywordTypeNode === ts.SyntaxKind.ArrayType) {
51
+ throw new Error('keywordTypeNode is invalid');
52
+ }
53
+ typeLiteral = ts.factory.createKeywordTypeNode(keywordTypeNode);
54
+ }
55
+ return ts.factory.createPropertySignature(undefined, ts.factory.createIdentifier(data.param), data.required
56
+ ? undefined
57
+ : ts.factory.createToken(ts.SyntaxKind.QuestionToken), typeLiteral);
58
+ }