@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
@@ -0,0 +1,95 @@
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.generateEnumASTNode = generateEnumASTNode;
37
+ const ts = __importStar(require("typescript"));
38
+ const format_interface_name_1 = require("../../utils/format-interface-name");
39
+ const generate_enum_content_ast_node_1 = require("./generate-enum-content-ast-node");
40
+ const comment_line_break_1 = require("../../utils/comment-line-break");
41
+ function generateEnumASTNode(name, defintion) {
42
+ const enumName = (0, format_interface_name_1.formatInterfaceName)(name);
43
+ const propertieDesc = {};
44
+ const { enum: enumValues, 'x-enum-varnames': enumKeys, 'x-enum-descriptions': enumDesc, type, } = defintion;
45
+ const jsonData = {
46
+ type: type === 'integer' ? 'number' : type,
47
+ enum: enumValues,
48
+ 'x-enum-descriptions': enumDesc,
49
+ };
50
+ const nodes = [];
51
+ const { enumContent } = (0, generate_enum_content_ast_node_1.generateEnumContentASTNode)(name, type, enumKeys, enumValues, enumDesc, propertieDesc);
52
+ nodes.push(ts.factory.createEnumDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createIdentifier(enumName), enumContent));
53
+ const enumFileContent = [];
54
+ const { description, example, default: _default, format } = defintion;
55
+ if (description || example || _default) {
56
+ const startFlag = `<$desc-flag-start$>`;
57
+ propertieDesc[startFlag] = '/**';
58
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(startFlag)));
59
+ if (description) {
60
+ const flag = `<$desc-flag-desc$>`;
61
+ propertieDesc[flag] = `* ${description}`;
62
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
63
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flag)));
64
+ }
65
+ if (format) {
66
+ const flag = `<$desc-flag-format$>`;
67
+ propertieDesc[flag] = `* @format ${format}`;
68
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
69
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flag)));
70
+ }
71
+ if (example) {
72
+ const flag = `<$desc-flag-example$>`;
73
+ propertieDesc[flag] = `* @example ${example}`;
74
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
75
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flag)));
76
+ }
77
+ if (_default) {
78
+ const flag = `<$desc-flag-default$>`;
79
+ propertieDesc[flag] = `* @default ${_default}`;
80
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
81
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flag)));
82
+ }
83
+ const endFlag = `<$desc-flag-end$>`;
84
+ propertieDesc[endFlag] = '*/';
85
+ enumFileContent.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(endFlag)));
86
+ }
87
+ enumFileContent.push(...nodes);
88
+ return {
89
+ exportName: enumName,
90
+ nodes: enumFileContent,
91
+ importList: [],
92
+ descriptions: propertieDesc,
93
+ jsonData
94
+ };
95
+ }
@@ -0,0 +1,74 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateEnumContentASTNode = generateEnumContentASTNode;
40
+ const ts = __importStar(require("typescript"));
41
+ const constants_1 = require("../../constants");
42
+ const debug_1 = __importDefault(require("debug"));
43
+ const logger = (0, debug_1.default)('cag:enum');
44
+ function generateEnumContentASTNode(name, type, enumkeys, enumValues, enumDesc, propertieDesc) {
45
+ if (type !== constants_1.DefinitionsType.STRING &&
46
+ type !== constants_1.DefinitionsType.INTEGER &&
47
+ type !== constants_1.DefinitionsType.NUMBER) {
48
+ throw new Error(`[${name}] type: ${type}, defintion other than string、integer or nunber is not supported!`);
49
+ }
50
+ const enumContent = [];
51
+ for (let i = 0; i < enumValues.length; i++) {
52
+ const enumValue = enumValues[i];
53
+ const enumKey = enumkeys ? enumkeys[i] : `Value${enumValue}`;
54
+ logger(`[${name}] Enum: ${enumKey} = ${enumValue}`);
55
+ if (enumDesc && enumDesc[i]) {
56
+ const flag = `<$enum-${enumKey}-flag$>`;
57
+ enumContent.push(ts.factory.createEnumMember(ts.factory.createStringLiteral(flag), undefined));
58
+ propertieDesc[flag] = `/* ${enumDesc[i]} */`;
59
+ }
60
+ if (type === constants_1.DefinitionsType.STRING) {
61
+ enumContent.push(ts.factory.createEnumMember(ts.factory.createIdentifier(enumKey), ts.factory.createStringLiteral(enumValue)));
62
+ }
63
+ else {
64
+ // 数字是否为负数
65
+ if (enumValue >= 0) {
66
+ enumContent.push(ts.factory.createEnumMember(ts.factory.createIdentifier(enumKey), ts.factory.createNumericLiteral(enumValue)));
67
+ }
68
+ else {
69
+ enumContent.push(ts.factory.createEnumMember(ts.factory.createIdentifier(enumKey), ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, ts.factory.createNumericLiteral(Math.abs(enumValue)))));
70
+ }
71
+ }
72
+ }
73
+ return { enumContent };
74
+ }
@@ -0,0 +1,47 @@
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.generateImportInterfaceAstNode = generateImportInterfaceAstNode;
37
+ const ts = __importStar(require("typescript"));
38
+ const constants_1 = require("../../constants");
39
+ const get_printer_file_prefix_1 = require("../../utils/get-printer-file-prefix");
40
+ function generateImportInterfaceAstNode(type, importName, importPath) {
41
+ const prefix = type === constants_1.PrinterFilterType.INTERFACE
42
+ ? './'
43
+ : `../${(0, get_printer_file_prefix_1.getPrinterFilePrefix)(type)}/`;
44
+ return ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports([
45
+ ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(importName)),
46
+ ])), ts.factory.createStringLiteral(`${prefix}${importPath}`), undefined);
47
+ }
@@ -0,0 +1,25 @@
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.generateInterfaceAnchorASTNode = generateInterfaceAnchorASTNode;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const get_defintion_name_1 = require("../../utils/get-defintion-name");
9
+ const swagger_definitions_to_ast_node_1 = require("../swagger-definitions-to-ast-node");
10
+ const logger = (0, debug_1.default)('cag:interface');
11
+ function generateInterfaceAnchorASTNode(name, key, ref, definitions, defintionsMap, interfaceDependency) {
12
+ const refKey = (0, get_defintion_name_1.getDefinitionName)(ref);
13
+ const refTarget = definitions[refKey];
14
+ logger(`[${name}] <${key}> is anchor point, $ref -> ${refKey}`);
15
+ (0, swagger_definitions_to_ast_node_1.swaggerDefinitionsToASTNode)(refKey, refTarget, definitions, defintionsMap);
16
+ // 检查锚点是否正确解析AST
17
+ if (!defintionsMap[refKey]) {
18
+ throw new Error(`[${name}] ${refKey} Object anchor point is not found!`);
19
+ }
20
+ // 添加依赖记录
21
+ interfaceDependency.add(refKey);
22
+ // 获取锚点对应的AST
23
+ const anchorPointItem = defintionsMap[refKey];
24
+ return anchorPointItem;
25
+ }
@@ -0,0 +1,322 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateInterfaceASTNode = generateInterfaceASTNode;
40
+ const ts = __importStar(require("typescript"));
41
+ const constants_1 = require("../../constants");
42
+ const get_keyword_type_node_1 = require("../../utils/get-keyword-type-node");
43
+ const debug_1 = __importDefault(require("debug"));
44
+ const is_english_only_1 = require("../../utils/is-english-only");
45
+ const generate_record_ast_node_1 = require("../record/generate-record-ast-node");
46
+ const generate_interface_anchor_ast_node_1 = require("./generate-interface-anchor-ast-node");
47
+ const comment_line_break_1 = require("../../utils/comment-line-break");
48
+ const logger = (0, debug_1.default)('cag:interface');
49
+ function generateInterfaceASTNode(name, definitionsType, currProperties, definitions, defintionsMap, parentKey) {
50
+ const currLoggerName = parentKey ? `${name}.${parentKey}` : name;
51
+ logger(`[${currLoggerName}] generate start...`);
52
+ if (definitionsType !== constants_1.DefinitionsType.OBJECT &&
53
+ definitionsType !== constants_1.DefinitionsType.ARRAY) {
54
+ throw new Error(`[${name}] type: ${definitionsType}, defintion other than object or array is not supported!`);
55
+ }
56
+ let keywordTypeNode;
57
+ let interfaceDependency = new Set();
58
+ const propertieDesc = {};
59
+ const interfaceContent = [];
60
+ const interfaceJSONData = {};
61
+ // eslint-disable-next-line no-restricted-syntax
62
+ for (const key in currProperties) {
63
+ interfaceJSONData[key] = {};
64
+ const property = currProperties[key];
65
+ const { type, $ref, properties, additionalProperties, items, enum: _enum, oneOf, allOf, anyOf, example, description, default: _default, } = property;
66
+ type && logger(`[${currLoggerName}] <${key}> is ${type}`);
67
+ // 当存在oneOf、allOf、anyOf时,需要特殊处理
68
+ if (oneOf || allOf || anyOf) {
69
+ const someOfList = oneOf || allOf || anyOf || [];
70
+ const someOfDataTypeFlag = [];
71
+ const someOfJSONData = [];
72
+ const unionIntersectionTypeNodes = [];
73
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
74
+ for (let i = 0; i < someOfList.length; i++) {
75
+ const someOfItem = someOfList[i];
76
+ // 普通对象类型
77
+ if (someOfItem.properties) {
78
+ const { interfaceContent: subInterfaceContent, interfaceDependency: subInterfaceDependency, descriptionMap: subDescriptionMap, jsonData: subJsonData, } = generateInterfaceASTNode(name, someOfItem.type, someOfItem.properties, definitions, defintionsMap, `${parentKey ? `${parentKey}.` : ''}${key}`);
79
+ someOfDataTypeFlag.push(constants_1.PrinterFilterType.INTERFACE);
80
+ someOfJSONData.push(subJsonData);
81
+ unionIntersectionTypeNodes.push(ts.factory.createTypeLiteralNode(subInterfaceContent));
82
+ // 合并依赖
83
+ interfaceDependency = new Set([
84
+ ...interfaceDependency,
85
+ ...subInterfaceDependency,
86
+ ]);
87
+ Object.assign(propertieDesc, subDescriptionMap);
88
+ continue;
89
+ }
90
+ // 引用类型
91
+ if (someOfItem.$ref) {
92
+ const anchorPointItem = (0, generate_interface_anchor_ast_node_1.generateInterfaceAnchorASTNode)(name, key, someOfItem.$ref, definitions, defintionsMap, interfaceDependency);
93
+ someOfDataTypeFlag.push(anchorPointItem.type === constants_1.PrinterFilterType.ENUM ? constants_1.PrinterFilterType.ENUM : constants_1.PrinterFilterType.INTERFACE);
94
+ someOfJSONData.push(anchorPointItem.jsonData);
95
+ unionIntersectionTypeNodes.push(ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(anchorPointItem.exportName), undefined));
96
+ continue;
97
+ }
98
+ }
99
+ // 交叉类型 &
100
+ if (allOf) {
101
+ keywordTypeNode = ts.factory.createIntersectionTypeNode(unionIntersectionTypeNodes);
102
+ // 对于交叉类型,合并所有JSON数据
103
+ if (someOfDataTypeFlag[0] === constants_1.PrinterFilterType.INTERFACE) {
104
+ interfaceJSONData[key] = { type: 'object', properties: Object.assign({}, ...someOfJSONData) };
105
+ }
106
+ else {
107
+ interfaceJSONData[key] = { type: someOfJSONData[0].type };
108
+ }
109
+ // 联合类型 |
110
+ }
111
+ else {
112
+ keywordTypeNode = ts.factory.createUnionTypeNode(unionIntersectionTypeNodes);
113
+ // 对于联合类型,使用第一个JSON数据作为代表,并标记为联合类型
114
+ if (someOfDataTypeFlag[0] === constants_1.PrinterFilterType.INTERFACE) {
115
+ interfaceJSONData[key] = { type: 'object', properties: someOfJSONData[0] };
116
+ }
117
+ else {
118
+ interfaceJSONData[key] = { type: someOfJSONData[0].type };
119
+ }
120
+ interfaceJSONData[key] = {
121
+ type: 'object',
122
+ properties: someOfJSONData.length > 0 ? someOfJSONData[0] : undefined,
123
+ };
124
+ }
125
+ }
126
+ else {
127
+ const keywordTypeSyntaxKind = (0, get_keyword_type_node_1.getKeywordTypeNode)(type);
128
+ // 遇到锚点,优先处理锚点
129
+ if (keywordTypeSyntaxKind === ts.SyntaxKind.UnknownKeyword && $ref) {
130
+ const anchorPointItem = (0, generate_interface_anchor_ast_node_1.generateInterfaceAnchorASTNode)(name, key, $ref, definitions, defintionsMap, interfaceDependency);
131
+ if (anchorPointItem.type === constants_1.PrinterFilterType.ENUM) {
132
+ interfaceJSONData[key] = anchorPointItem.jsonData;
133
+ }
134
+ else {
135
+ interfaceJSONData[key] = { type: 'object', properties: anchorPointItem.jsonData };
136
+ }
137
+ keywordTypeNode = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(anchorPointItem.exportName), undefined);
138
+ // 定义Record
139
+ }
140
+ else if (additionalProperties) {
141
+ const { recordContent, recordDependency, descriptionMap, recordJSON } = (0, generate_record_ast_node_1.generateRecordASTNode)(name, definitionsType, additionalProperties, definitions, defintionsMap);
142
+ keywordTypeNode = recordContent;
143
+ interfaceJSONData[key] = { type: 'object', properties: recordJSON };
144
+ // 合并依赖
145
+ interfaceDependency = new Set([
146
+ ...interfaceDependency,
147
+ ...recordDependency,
148
+ ]);
149
+ Object.assign(propertieDesc, descriptionMap);
150
+ }
151
+ else {
152
+ // 处理object
153
+ if (keywordTypeSyntaxKind === ts.SyntaxKind.ObjectKeyword &&
154
+ properties) {
155
+ const { interfaceContent: subInterfaceContent, interfaceDependency: subInterfaceDependency, descriptionMap: subDescriptionMap, jsonData: subJsonData, } = generateInterfaceASTNode(name, type, properties, definitions, defintionsMap, `${parentKey ? `${parentKey}.` : ''}${key}`);
156
+ interfaceJSONData[key] = { type: 'object', properties: subJsonData };
157
+ keywordTypeNode =
158
+ ts.factory.createTypeLiteralNode(subInterfaceContent);
159
+ // 合并依赖
160
+ interfaceDependency = new Set([
161
+ ...interfaceDependency,
162
+ ...subInterfaceDependency,
163
+ ]);
164
+ Object.assign(propertieDesc, subDescriptionMap);
165
+ // 处理数组
166
+ }
167
+ else if (keywordTypeSyntaxKind === ts.SyntaxKind.ArrayType) {
168
+ if (!items) {
169
+ throw new Error(`items is null.`);
170
+ }
171
+ const { $ref, type: subType } = items;
172
+ // 判断是直接类型还是锚点
173
+ if ($ref) {
174
+ const anchorPointItem = (0, generate_interface_anchor_ast_node_1.generateInterfaceAnchorASTNode)(name, key, $ref, definitions, defintionsMap, interfaceDependency);
175
+ interfaceJSONData[key] = { type: 'array', items: { properties: anchorPointItem.jsonData } };
176
+ keywordTypeNode = ts.factory.createArrayTypeNode(ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(anchorPointItem.exportName), undefined));
177
+ }
178
+ else {
179
+ logger(`[${currLoggerName}] <${key}> is multidimensional array`);
180
+ const arrayItemKeywordTypeSyntaxKind = (0, get_keyword_type_node_1.getKeywordTypeNode)(subType);
181
+ // 判断是否为一个对象, 如果是对象,则需要递归处理
182
+ if (arrayItemKeywordTypeSyntaxKind === ts.SyntaxKind.ObjectKeyword &&
183
+ items.properties) {
184
+ const { interfaceContent: subObjectContent, interfaceDependency: subObjectDependency, descriptionMap: subObjectDescriptionMap, jsonData: subObjectJSON, } = generateInterfaceASTNode(name, subType, items.properties, definitions, defintionsMap, `${parentKey ? `${parentKey}.` : ''}${key}`);
185
+ interfaceJSONData[key] = { type: 'array', items: subObjectJSON };
186
+ keywordTypeNode =
187
+ type === constants_1.DefinitionsKeywordTypeNodeKey.array
188
+ ? ts.factory.createArrayTypeNode(ts.factory.createTypeLiteralNode(subObjectContent))
189
+ : ts.factory.createTypeLiteralNode(subObjectContent);
190
+ // 合并依赖
191
+ interfaceDependency = new Set([
192
+ ...interfaceDependency,
193
+ ...subObjectDependency,
194
+ ]);
195
+ Object.assign(propertieDesc, subObjectDescriptionMap);
196
+ }
197
+ else {
198
+ // 默认是any
199
+ let arrayItemKeywordTypeNode = ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
200
+ // 多维数组的值只能是锚点或者直接类型
201
+ if (arrayItemKeywordTypeSyntaxKind === ts.SyntaxKind.ArrayType) {
202
+ // 查找对内层的具体类型
203
+ let theEnd = false;
204
+ let target = items;
205
+ let layer = 0;
206
+ while (!theEnd) {
207
+ if (!target.items) {
208
+ theEnd = true;
209
+ if (target.$ref) {
210
+ const anchorPointItem = (0, generate_interface_anchor_ast_node_1.generateInterfaceAnchorASTNode)(name, key, target.$ref, definitions, defintionsMap, interfaceDependency);
211
+ keywordTypeNode = ts.factory.createArrayTypeNode(ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(anchorPointItem.exportName), undefined));
212
+ let content = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(anchorPointItem.exportName), undefined);
213
+ let _json = anchorPointItem.jsonData;
214
+ for (let i = 0; i < layer; i++) {
215
+ _json = [_json];
216
+ content = ts.factory.createArrayTypeNode(content);
217
+ }
218
+ interfaceJSONData[key] = { type: 'array', items: _json };
219
+ arrayItemKeywordTypeNode = content;
220
+ }
221
+ else {
222
+ const keywordTypeSyntaxKind = (0, get_keyword_type_node_1.getKeywordTypeNode)(target.type || undefined);
223
+ let content = ts.factory.createKeywordTypeNode(keywordTypeSyntaxKind);
224
+ let _json = undefined;
225
+ for (let i = 0; i < layer; i++) {
226
+ _json = [_json];
227
+ content = ts.factory.createArrayTypeNode(content);
228
+ }
229
+ interfaceJSONData[key] = { type: 'array', items: _json };
230
+ arrayItemKeywordTypeNode = content;
231
+ }
232
+ }
233
+ else {
234
+ layer += 1;
235
+ target = target.items;
236
+ }
237
+ }
238
+ }
239
+ else {
240
+ // 默认是string
241
+ interfaceJSONData[key] = { type: 'array', items: { type: 'string' } };
242
+ arrayItemKeywordTypeNode = ts.factory.createKeywordTypeNode(arrayItemKeywordTypeSyntaxKind);
243
+ }
244
+ keywordTypeNode = ts.factory.createArrayTypeNode(arrayItemKeywordTypeNode);
245
+ }
246
+ }
247
+ // 其他类型
248
+ }
249
+ else {
250
+ // 可能是枚举
251
+ if (_enum) {
252
+ if (type !== constants_1.DefinitionsKeywordTypeNodeKey.string &&
253
+ type !== constants_1.DefinitionsKeywordTypeNodeKey.number &&
254
+ type !== constants_1.DefinitionsKeywordTypeNodeKey.integer) {
255
+ throw new Error(`type: ${type}, enum is not supported!`);
256
+ }
257
+ interfaceJSONData[key] = {
258
+ type: type === 'integer' ? 'number' : type,
259
+ enum: _enum,
260
+ };
261
+ const enumNodes = _enum.map((item) => {
262
+ return ts.factory.createLiteralTypeNode(type === constants_1.DefinitionsKeywordTypeNodeKey.string
263
+ ? ts.factory.createStringLiteral(item)
264
+ : ts.factory.createNumericLiteral(`${item}`));
265
+ });
266
+ keywordTypeNode = ts.factory.createUnionTypeNode(enumNodes);
267
+ }
268
+ else {
269
+ if (keywordTypeSyntaxKind) {
270
+ keywordTypeNode = ts.factory.createKeywordTypeNode(keywordTypeSyntaxKind);
271
+ interfaceJSONData[key] = {
272
+ type: type === 'integer' ? 'number' : type,
273
+ };
274
+ }
275
+ else {
276
+ logger(`[${currLoggerName}] <${key}> type: ${type}, keywordTypeSyntaxKind is null!`);
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ if (description || example || _default) {
283
+ const startFlag = `<$desc-flag-start@${parentKey ? `${parentKey}.` : ''}${key}$>`;
284
+ propertieDesc[startFlag] = '/**';
285
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(startFlag), undefined, undefined));
286
+ if (description) {
287
+ const flag = `<$desc-flag-desc@${parentKey ? `${parentKey}.` : ''}${key}$>`;
288
+ interfaceJSONData[key].description = description;
289
+ propertieDesc[flag] = `* ${description}`;
290
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
291
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(flag), undefined, undefined));
292
+ }
293
+ if (example) {
294
+ const flag = `<$desc-flag-example@${parentKey ? `${parentKey}.` : ''}${key}$>`;
295
+ interfaceJSONData[key].example = example;
296
+ propertieDesc[flag] = `* @example ${example}`;
297
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
298
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(flag), undefined, undefined));
299
+ }
300
+ if (_default) {
301
+ const flag = `<$desc-flag-default@${parentKey ? `${parentKey}.` : ''}${key}$>`;
302
+ interfaceJSONData[key].default = _default;
303
+ propertieDesc[flag] = `* @default ${_default}`;
304
+ propertieDesc[flag] = (0, comment_line_break_1.commentLineBreak)(propertieDesc[flag]);
305
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(flag), undefined, undefined));
306
+ }
307
+ const endFlag = `<$desc-flag-end@${parentKey ? `${parentKey}>` : ''}${key}$>`;
308
+ propertieDesc[endFlag] = '*/';
309
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, ts.factory.createStringLiteral(endFlag), undefined, undefined));
310
+ }
311
+ keywordTypeNode &&
312
+ interfaceContent.push(ts.factory.createPropertySignature(undefined, (0, is_english_only_1.isEnglishOnly)(key)
313
+ ? ts.factory.createIdentifier(key)
314
+ : ts.factory.createStringLiteral(key), ts.factory.createToken(ts.SyntaxKind.QuestionToken), keywordTypeNode));
315
+ }
316
+ return {
317
+ interfaceContent,
318
+ interfaceDependency,
319
+ descriptionMap: propertieDesc,
320
+ jsonData: interfaceJSONData,
321
+ };
322
+ }
@@ -0,0 +1,51 @@
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.generateInterfaceDescAstNode = generateInterfaceDescAstNode;
37
+ const ts = __importStar(require("typescript"));
38
+ function generateInterfaceDescAstNode(interfaceName, description, descriptions) {
39
+ const descNodes = [];
40
+ // 添加注释
41
+ if (description) {
42
+ const flagStart = `<$desc-flag-start@${interfaceName}$>`;
43
+ const flagEnd = `<$desc-flag-end@${interfaceName}$>`;
44
+ const flag = `<$desc-flag@${interfaceName}$>`;
45
+ descNodes.push(ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flagStart)), ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flag)), ts.factory.createExpressionStatement(ts.factory.createStringLiteral(flagEnd)));
46
+ descriptions[flagStart] = '/**';
47
+ descriptions[flag] = `* ${description}`;
48
+ descriptions[flagEnd] = '*/';
49
+ }
50
+ return descNodes;
51
+ }