@qwe8652591/abap-recursive-query 1.1.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 (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/cli/consumer-cli.d.ts +8 -0
  4. package/dist/cli/consumer-cli.d.ts.map +1 -0
  5. package/dist/cli/consumer-cli.js +180 -0
  6. package/dist/cli/producer-cli.d.ts +8 -0
  7. package/dist/cli/producer-cli.d.ts.map +1 -0
  8. package/dist/cli/producer-cli.js +249 -0
  9. package/dist/cli/query-object.d.ts +3 -0
  10. package/dist/cli/query-object.d.ts.map +1 -0
  11. package/dist/cli/query-object.js +486 -0
  12. package/dist/common/FilterCache.d.ts +62 -0
  13. package/dist/common/FilterCache.d.ts.map +1 -0
  14. package/dist/common/FilterCache.js +119 -0
  15. package/dist/common/RedisQueueManager.d.ts +170 -0
  16. package/dist/common/RedisQueueManager.d.ts.map +1 -0
  17. package/dist/common/RedisQueueManager.js +663 -0
  18. package/dist/common/abapStructures.d.ts +391 -0
  19. package/dist/common/abapStructures.d.ts.map +1 -0
  20. package/dist/common/abapStructures.js +2 -0
  21. package/dist/common/config.d.ts +66 -0
  22. package/dist/common/config.d.ts.map +1 -0
  23. package/dist/common/config.js +56 -0
  24. package/dist/common/index.d.ts +13 -0
  25. package/dist/common/index.d.ts.map +1 -0
  26. package/dist/common/index.js +38 -0
  27. package/dist/common/recursiveQueryConfig.d.ts +77 -0
  28. package/dist/common/recursiveQueryConfig.d.ts.map +1 -0
  29. package/dist/common/recursiveQueryConfig.js +129 -0
  30. package/dist/common/tableStructures.d.ts +176 -0
  31. package/dist/common/tableStructures.d.ts.map +1 -0
  32. package/dist/common/tableStructures.js +10 -0
  33. package/dist/common/types.d.ts +104 -0
  34. package/dist/common/types.d.ts.map +1 -0
  35. package/dist/common/types.js +31 -0
  36. package/dist/common/utils.d.ts +57 -0
  37. package/dist/common/utils.d.ts.map +1 -0
  38. package/dist/common/utils.js +300 -0
  39. package/dist/consumer/FileDownloadConsumer.d.ts +127 -0
  40. package/dist/consumer/FileDownloadConsumer.d.ts.map +1 -0
  41. package/dist/consumer/FileDownloadConsumer.js +1003 -0
  42. package/dist/consumer/generators/baseGenerator.d.ts +38 -0
  43. package/dist/consumer/generators/baseGenerator.d.ts.map +1 -0
  44. package/dist/consumer/generators/baseGenerator.js +103 -0
  45. package/dist/consumer/generators/domainGenerator.d.ts +78 -0
  46. package/dist/consumer/generators/domainGenerator.d.ts.map +1 -0
  47. package/dist/consumer/generators/domainGenerator.js +241 -0
  48. package/dist/consumer/generators/guiStatusGenerator.d.ts +16 -0
  49. package/dist/consumer/generators/guiStatusGenerator.d.ts.map +1 -0
  50. package/dist/consumer/generators/guiStatusGenerator.js +48 -0
  51. package/dist/consumer/generators/guiTitleGenerator.d.ts +16 -0
  52. package/dist/consumer/generators/guiTitleGenerator.d.ts.map +1 -0
  53. package/dist/consumer/generators/guiTitleGenerator.js +48 -0
  54. package/dist/consumer/generators/index.d.ts +14 -0
  55. package/dist/consumer/generators/index.d.ts.map +1 -0
  56. package/dist/consumer/generators/index.js +38 -0
  57. package/dist/consumer/generators/messageGenerator.d.ts +16 -0
  58. package/dist/consumer/generators/messageGenerator.d.ts.map +1 -0
  59. package/dist/consumer/generators/messageGenerator.js +73 -0
  60. package/dist/consumer/generators/metadataGenerator.d.ts +29 -0
  61. package/dist/consumer/generators/metadataGenerator.d.ts.map +1 -0
  62. package/dist/consumer/generators/metadataGenerator.js +135 -0
  63. package/dist/consumer/generators/screenGenerator.d.ts +173 -0
  64. package/dist/consumer/generators/screenGenerator.d.ts.map +1 -0
  65. package/dist/consumer/generators/screenGenerator.js +859 -0
  66. package/dist/consumer/generators/structureGenerator.d.ts +36 -0
  67. package/dist/consumer/generators/structureGenerator.d.ts.map +1 -0
  68. package/dist/consumer/generators/structureGenerator.js +131 -0
  69. package/dist/consumer/generators/textElementGenerator.d.ts +16 -0
  70. package/dist/consumer/generators/textElementGenerator.d.ts.map +1 -0
  71. package/dist/consumer/generators/textElementGenerator.js +70 -0
  72. package/dist/consumer/handlers/handleGetClass.d.ts +8 -0
  73. package/dist/consumer/handlers/handleGetClass.d.ts.map +1 -0
  74. package/dist/consumer/handlers/handleGetClass.js +18 -0
  75. package/dist/consumer/handlers/handleGetFunction.d.ts +8 -0
  76. package/dist/consumer/handlers/handleGetFunction.d.ts.map +1 -0
  77. package/dist/consumer/handlers/handleGetFunction.js +19 -0
  78. package/dist/consumer/handlers/handleGetFunctionGroup.d.ts +8 -0
  79. package/dist/consumer/handlers/handleGetFunctionGroup.d.ts.map +1 -0
  80. package/dist/consumer/handlers/handleGetFunctionGroup.js +19 -0
  81. package/dist/consumer/handlers/handleGetInclude.d.ts +8 -0
  82. package/dist/consumer/handlers/handleGetInclude.d.ts.map +1 -0
  83. package/dist/consumer/handlers/handleGetInclude.js +18 -0
  84. package/dist/consumer/handlers/handleGetProgram.d.ts +8 -0
  85. package/dist/consumer/handlers/handleGetProgram.d.ts.map +1 -0
  86. package/dist/consumer/handlers/handleGetProgram.js +27 -0
  87. package/dist/consumer/handlers/handleZTableQuery.d.ts +8 -0
  88. package/dist/consumer/handlers/handleZTableQuery.d.ts.map +1 -0
  89. package/dist/consumer/handlers/handleZTableQuery.js +20 -0
  90. package/dist/consumer/handlers/index.d.ts +10 -0
  91. package/dist/consumer/handlers/index.d.ts.map +1 -0
  92. package/dist/consumer/handlers/index.js +27 -0
  93. package/dist/consumer/index.d.ts +9 -0
  94. package/dist/consumer/index.d.ts.map +1 -0
  95. package/dist/consumer/index.js +24 -0
  96. package/dist/consumer/utils/download.d.ts +13 -0
  97. package/dist/consumer/utils/download.d.ts.map +1 -0
  98. package/dist/consumer/utils/download.js +38 -0
  99. package/dist/consumer/utils/index.d.ts +5 -0
  100. package/dist/consumer/utils/index.d.ts.map +1 -0
  101. package/dist/consumer/utils/index.js +20 -0
  102. package/dist/handlers/handleGetClass.d.ts +8 -0
  103. package/dist/handlers/handleGetClass.d.ts.map +1 -0
  104. package/dist/handlers/handleGetClass.js +19 -0
  105. package/dist/handlers/handleGetFunction.d.ts +8 -0
  106. package/dist/handlers/handleGetFunction.d.ts.map +1 -0
  107. package/dist/handlers/handleGetFunction.js +20 -0
  108. package/dist/handlers/handleGetFunctionGroup.d.ts +8 -0
  109. package/dist/handlers/handleGetFunctionGroup.d.ts.map +1 -0
  110. package/dist/handlers/handleGetFunctionGroup.js +19 -0
  111. package/dist/handlers/handleGetInclude.d.ts +8 -0
  112. package/dist/handlers/handleGetInclude.d.ts.map +1 -0
  113. package/dist/handlers/handleGetInclude.js +19 -0
  114. package/dist/handlers/handleGetInterface.d.ts +8 -0
  115. package/dist/handlers/handleGetInterface.d.ts.map +1 -0
  116. package/dist/handlers/handleGetInterface.js +19 -0
  117. package/dist/handlers/handleGetPackage.d.ts +8 -0
  118. package/dist/handlers/handleGetPackage.d.ts.map +1 -0
  119. package/dist/handlers/handleGetPackage.js +42 -0
  120. package/dist/handlers/handleGetProgram.d.ts +8 -0
  121. package/dist/handlers/handleGetProgram.d.ts.map +1 -0
  122. package/dist/handlers/handleGetProgram.js +19 -0
  123. package/dist/handlers/handleGetStructure.d.ts +8 -0
  124. package/dist/handlers/handleGetStructure.d.ts.map +1 -0
  125. package/dist/handlers/handleGetStructure.js +19 -0
  126. package/dist/handlers/handleGetTable.d.ts +8 -0
  127. package/dist/handlers/handleGetTable.d.ts.map +1 -0
  128. package/dist/handlers/handleGetTable.js +19 -0
  129. package/dist/handlers/handleGetTableContents.d.ts +8 -0
  130. package/dist/handlers/handleGetTableContents.d.ts.map +1 -0
  131. package/dist/handlers/handleGetTableContents.js +22 -0
  132. package/dist/handlers/handleGetTransaction.d.ts +8 -0
  133. package/dist/handlers/handleGetTransaction.d.ts.map +1 -0
  134. package/dist/handlers/handleGetTransaction.js +19 -0
  135. package/dist/handlers/handleGetTypeInfo.d.ts +8 -0
  136. package/dist/handlers/handleGetTypeInfo.d.ts.map +1 -0
  137. package/dist/handlers/handleGetTypeInfo.js +32 -0
  138. package/dist/handlers/handleSearchObject.d.ts +8 -0
  139. package/dist/handlers/handleSearchObject.d.ts.map +1 -0
  140. package/dist/handlers/handleSearchObject.js +20 -0
  141. package/dist/handlers/handleZObjectQuery.d.ts +8 -0
  142. package/dist/handlers/handleZObjectQuery.d.ts.map +1 -0
  143. package/dist/handlers/handleZObjectQuery.js +25 -0
  144. package/dist/handlers/handleZTableQuery.d.ts +8 -0
  145. package/dist/handlers/handleZTableQuery.d.ts.map +1 -0
  146. package/dist/handlers/handleZTableQuery.js +20 -0
  147. package/dist/index.d.ts +17 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +45 -0
  150. package/dist/lib/download.d.ts +49 -0
  151. package/dist/lib/download.d.ts.map +1 -0
  152. package/dist/lib/download.js +78 -0
  153. package/dist/lib/index.d.ts +9 -0
  154. package/dist/lib/index.d.ts.map +1 -0
  155. package/dist/lib/index.js +23 -0
  156. package/dist/lib/utils.d.ts +31 -0
  157. package/dist/lib/utils.d.ts.map +1 -0
  158. package/dist/lib/utils.js +272 -0
  159. package/dist/producer/RecursiveQueryProducer.d.ts +92 -0
  160. package/dist/producer/RecursiveQueryProducer.d.ts.map +1 -0
  161. package/dist/producer/RecursiveQueryProducer.js +496 -0
  162. package/dist/producer/handlers/handleZObjectQuery.d.ts +8 -0
  163. package/dist/producer/handlers/handleZObjectQuery.d.ts.map +1 -0
  164. package/dist/producer/handlers/handleZObjectQuery.js +24 -0
  165. package/dist/producer/handlers/index.d.ts +6 -0
  166. package/dist/producer/handlers/index.d.ts.map +1 -0
  167. package/dist/producer/handlers/index.js +21 -0
  168. package/dist/producer/index.d.ts +7 -0
  169. package/dist/producer/index.d.ts.map +1 -0
  170. package/dist/producer/index.js +22 -0
  171. package/dist/recursive/abapStructures.d.ts +377 -0
  172. package/dist/recursive/abapStructures.d.ts.map +1 -0
  173. package/dist/recursive/abapStructures.js +2 -0
  174. package/dist/recursive/generate/baseGenerator.d.ts +34 -0
  175. package/dist/recursive/generate/baseGenerator.d.ts.map +1 -0
  176. package/dist/recursive/generate/baseGenerator.js +112 -0
  177. package/dist/recursive/generate/domainGenerator.d.ts +26 -0
  178. package/dist/recursive/generate/domainGenerator.d.ts.map +1 -0
  179. package/dist/recursive/generate/domainGenerator.js +128 -0
  180. package/dist/recursive/generate/functionGroupGenerator.d.ts +30 -0
  181. package/dist/recursive/generate/functionGroupGenerator.d.ts.map +1 -0
  182. package/dist/recursive/generate/functionGroupGenerator.js +90 -0
  183. package/dist/recursive/generate/index.d.ts +12 -0
  184. package/dist/recursive/generate/index.d.ts.map +1 -0
  185. package/dist/recursive/generate/index.js +34 -0
  186. package/dist/recursive/generate/messageGenerator.d.ts +16 -0
  187. package/dist/recursive/generate/messageGenerator.d.ts.map +1 -0
  188. package/dist/recursive/generate/messageGenerator.js +73 -0
  189. package/dist/recursive/generate/screenGenerator.d.ts +173 -0
  190. package/dist/recursive/generate/screenGenerator.d.ts.map +1 -0
  191. package/dist/recursive/generate/screenGenerator.js +858 -0
  192. package/dist/recursive/generate/structureGenerator.d.ts +22 -0
  193. package/dist/recursive/generate/structureGenerator.d.ts.map +1 -0
  194. package/dist/recursive/generate/structureGenerator.js +88 -0
  195. package/dist/recursive/generate/textElementGenerator.d.ts +16 -0
  196. package/dist/recursive/generate/textElementGenerator.d.ts.map +1 -0
  197. package/dist/recursive/generate/textElementGenerator.js +68 -0
  198. package/dist/recursive/handleRecursiveObjectQuery.d.ts +94 -0
  199. package/dist/recursive/handleRecursiveObjectQuery.d.ts.map +1 -0
  200. package/dist/recursive/handleRecursiveObjectQuery.js +219 -0
  201. package/dist/recursive/recursiveObjectQuery.d.ts +159 -0
  202. package/dist/recursive/recursiveObjectQuery.d.ts.map +1 -0
  203. package/dist/recursive/recursiveObjectQuery.js +1358 -0
  204. package/dist/recursive/recursiveQueryConfig.d.ts +129 -0
  205. package/dist/recursive/recursiveQueryConfig.d.ts.map +1 -0
  206. package/dist/recursive/recursiveQueryConfig.js +133 -0
  207. package/dist/recursive/tableStructures.d.ts +196 -0
  208. package/dist/recursive/tableStructures.d.ts.map +1 -0
  209. package/dist/recursive/tableStructures.js +10 -0
  210. package/package.json +47 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 结构体生成器
3
+ * 生成ABAP结构体定义文件
4
+ */
5
+ import { StructureDefinition, StructureField } from '../abapStructures';
6
+ /**
7
+ * 生成结构体内容
8
+ */
9
+ export declare function generateStructureContent(structure: StructureDefinition): string;
10
+ /**
11
+ * 生成传统ABAP字段行
12
+ */
13
+ export declare function generateFieldLine(field: StructureField): string;
14
+ /**
15
+ * 生成传统字段类型定义
16
+ */
17
+ export declare function generateFieldType(field: Pick<StructureField, 'FIELDNAME' | 'ROLLNAME' | 'DOMNAME' | 'DATATYPE' | 'LENG'>): string;
18
+ /**
19
+ * 将ABAP数据类型映射到传统ABAP类型
20
+ */
21
+ export declare function mapDataTypeToTraditional(abapType: string): string;
22
+ //# sourceMappingURL=structureGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structureGenerator.d.ts","sourceRoot":"","sources":["../../../src/recursive/generate/structureGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAgB/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAc/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,GAAG,MAAM,CAsBjI;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBjE"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * 结构体生成器
4
+ * 生成ABAP结构体定义文件
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateStructureContent = generateStructureContent;
8
+ exports.generateFieldLine = generateFieldLine;
9
+ exports.generateFieldType = generateFieldType;
10
+ exports.mapDataTypeToTraditional = mapDataTypeToTraditional;
11
+ /**
12
+ * 生成结构体内容
13
+ */
14
+ function generateStructureContent(structure) {
15
+ let content = `*----------------------------------------------------------------------*\n`;
16
+ content += `* ${structure.TABLETITLE || structure.TABLENAME}\n`;
17
+ content += `*----------------------------------------------------------------------*\n`;
18
+ content += `TYPES: BEGIN OF ty_${structure.TABLENAME.toLowerCase()},\n`;
19
+ if (structure.ISTRUCTURE && structure.ISTRUCTURE.length > 0) {
20
+ const sortedFields = structure.ISTRUCTURE.sort((a, b) => a.POSITION - b.POSITION);
21
+ for (const field of sortedFields) {
22
+ content += generateFieldLine(field);
23
+ }
24
+ }
25
+ content += ` END OF ty_${structure.TABLENAME.toLowerCase()}.`;
26
+ return content;
27
+ }
28
+ /**
29
+ * 生成传统ABAP字段行
30
+ */
31
+ function generateFieldLine(field) {
32
+ // 忽略 .INCLUDE 字段
33
+ if (field.FIELDNAME === '.INCLUDE') {
34
+ return '';
35
+ }
36
+ let fieldLine = ` ${field.FIELDNAME.toLowerCase()}`;
37
+ fieldLine += generateFieldType(field);
38
+ if (field.DDTEXT) {
39
+ fieldLine += `, "${field.DDTEXT.replace(/"/g, '""')}"`;
40
+ }
41
+ return fieldLine + ',\n';
42
+ }
43
+ /**
44
+ * 生成传统字段类型定义
45
+ */
46
+ function generateFieldType(field) {
47
+ if (field.FIELDNAME === '.INCLUDE' && field.ROLLNAME) {
48
+ // return ` TYPE ${field.ROLLNAME.toLowerCase()}`;
49
+ }
50
+ if (field.ROLLNAME) {
51
+ return ` TYPE ${field.ROLLNAME.toLowerCase()}`;
52
+ }
53
+ if (field.DOMNAME) {
54
+ return ` TYPE ${field.DOMNAME.toLowerCase()}`;
55
+ }
56
+ if (field.DATATYPE) {
57
+ let typeDef = ` TYPE ${mapDataTypeToTraditional(field.DATATYPE)}`;
58
+ if (field.LENG && field.LENG > 0) {
59
+ typeDef += ` LENGTH ${field.LENG}`;
60
+ }
61
+ return typeDef;
62
+ }
63
+ return '';
64
+ }
65
+ /**
66
+ * 将ABAP数据类型映射到传统ABAP类型
67
+ */
68
+ function mapDataTypeToTraditional(abapType) {
69
+ const typeMap = {
70
+ 'CHAR': 'c',
71
+ 'NUMC': 'n',
72
+ 'INT4': 'i',
73
+ 'INT2': 's',
74
+ 'INT1': 'b',
75
+ 'DEC': 'p',
76
+ 'CURR': 'p',
77
+ 'QUAN': 'p',
78
+ 'UNIT': 'c',
79
+ 'CUKY': 'c',
80
+ 'DATS': 'd',
81
+ 'TIMS': 't',
82
+ 'STRING': 'string',
83
+ 'RAW': 'x',
84
+ 'CLNT': 'c',
85
+ 'LANG': 'c'
86
+ };
87
+ return typeMap[abapType.toUpperCase()] || abapType.toLowerCase();
88
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 文本元素生成器
3
+ * 生成文本元素XML文件
4
+ */
5
+ import { TextElement } from '../abapStructures';
6
+ /**
7
+ * 生成文本元素XML内容
8
+ * 遵循abapGit协议格式
9
+ */
10
+ export declare function generateTextElementsXmlContent(textElements: TextElement[], objectName: string, objectType: string): string;
11
+ /**
12
+ * 生成文本元素XML文件
13
+ * 符合abapGit协议规范
14
+ */
15
+ export declare function generateTextElementsXml(textElements: TextElement[], objectName: string, objectType: string, downloadRootPath: string, resultDownloadedFiles: any[]): Promise<void>;
16
+ //# sourceMappingURL=textElementGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textElementGenerator.d.ts","sourceRoot":"","sources":["../../../src/recursive/generate/textElementGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC1C,YAAY,EAAE,WAAW,EAAE,EAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACnB,MAAM,CAuBR;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CACzC,YAAY,EAAE,WAAW,EAAE,EAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,GAAG,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * 文本元素生成器
4
+ * 生成文本元素XML文件
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateTextElementsXmlContent = generateTextElementsXmlContent;
8
+ exports.generateTextElementsXml = generateTextElementsXml;
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const baseGenerator_1 = require("./baseGenerator");
12
+ /**
13
+ * 生成文本元素XML内容
14
+ * 遵循abapGit协议格式
15
+ */
16
+ function generateTextElementsXmlContent(textElements, objectName, objectType) {
17
+ let xml = '<?xml version="1.0" encoding="utf-8"?>\n';
18
+ xml += '<abapGit version="v1.0.0" serializer="LCL_OBJECT_TEXTS" serializer_version="v1.0.0">\n';
19
+ xml += ' <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">\n';
20
+ xml += ' <asx:values>\n';
21
+ xml += ' <TEXT_ELEMENTS>\n';
22
+ for (const textElement of textElements) {
23
+ if (textElement.KEY && textElement.ENTRY) {
24
+ xml += ' <TEXT_ELEMENT>\n';
25
+ xml = (0, baseGenerator_1.addXmlField)(xml, 'KEY', textElement.KEY, ' ');
26
+ xml = (0, baseGenerator_1.addXmlField)(xml, 'TEXT', textElement.ENTRY, ' ');
27
+ xml = (0, baseGenerator_1.addXmlNumericField)(xml, 'LENGTH', textElement.LENGTH, ' ');
28
+ xml += ' </TEXT_ELEMENT>\n';
29
+ }
30
+ }
31
+ xml += ' </TEXT_ELEMENTS>\n';
32
+ xml += ' </asx:values>\n';
33
+ xml += ' </asx:abap>\n';
34
+ xml += '</abapGit>\n';
35
+ return xml;
36
+ }
37
+ /**
38
+ * 生成文本元素XML文件
39
+ * 符合abapGit协议规范
40
+ */
41
+ async function generateTextElementsXml(textElements, objectName, objectType, downloadRootPath, resultDownloadedFiles) {
42
+ const safeObjectName = objectName.replace(/[/\\]/g, '_');
43
+ // 文本元素文件路径:/texts目录下
44
+ const baseDir = (0, path_1.join)(downloadRootPath, 'texts');
45
+ if (!(0, fs_1.existsSync)(baseDir)) {
46
+ (0, fs_1.mkdirSync)(baseDir, { recursive: true });
47
+ }
48
+ // 生成符合abapGit协议的XML内容
49
+ const xmlContent = generateTextElementsXmlContent(textElements, objectName, objectType);
50
+ // 按照abapGit协议命名规范,文本元素通常集成到主文件中
51
+ // 如果需要单独导出,使用:{对象名}.texts.xml
52
+ const xmlFileName = `${safeObjectName}.texts.xml`;
53
+ const xmlFilePath = (0, path_1.join)(baseDir, xmlFileName);
54
+ (0, fs_1.writeFileSync)(xmlFilePath, xmlContent, 'utf-8');
55
+ console.error(`导出文本元素 ${objectName} 到: ${xmlFilePath}`);
56
+ // 记录下载统计
57
+ resultDownloadedFiles.push({
58
+ objectName: objectName,
59
+ objectType: 'TEXT_ELEMENTS',
60
+ filePath: xmlFilePath,
61
+ success: true,
62
+ metadata: {
63
+ elementCount: textElements.length,
64
+ exportType: 'separate',
65
+ objectType: objectType
66
+ }
67
+ });
68
+ }
@@ -0,0 +1,94 @@
1
+ import { RecursiveQueryConfig } from './recursiveQueryConfig';
2
+ /**
3
+ * 处理递归对象查询请求
4
+ * @param args 查询参数
5
+ * @returns 查询结果
6
+ */
7
+ export declare function handleRecursiveObjectQuery(args: any): Promise<{
8
+ success: boolean;
9
+ data: {
10
+ original_object: any;
11
+ all_objects: {
12
+ object_key: string;
13
+ object_data: any;
14
+ }[];
15
+ downloaded_files: {
16
+ objectName: string;
17
+ objectType: string;
18
+ filePath: string;
19
+ success: boolean;
20
+ error?: string;
21
+ metadata?: any;
22
+ }[];
23
+ filtered_objects: {
24
+ objectType: string;
25
+ objectName: string;
26
+ reason: string;
27
+ filterType: "exact" | "pattern";
28
+ filterRule?: string;
29
+ timestamp: Date;
30
+ }[];
31
+ statistics: {
32
+ totalObjects: number;
33
+ totalClasses: number;
34
+ totalFunctions: number;
35
+ totalPrograms: number;
36
+ totalIncludes: number;
37
+ totalStructures: number;
38
+ totalDomains: number;
39
+ downloadedIncludes: number;
40
+ downloadedStructures: number;
41
+ downloadedDomains: number;
42
+ maxDepthReached: number;
43
+ circularReferences: number;
44
+ };
45
+ errors: string[];
46
+ summary: string;
47
+ };
48
+ message: string;
49
+ error?: undefined;
50
+ } | {
51
+ success: boolean;
52
+ error: string;
53
+ data: null;
54
+ message?: undefined;
55
+ }>;
56
+ /**
57
+ * 批量递归查询
58
+ * @param queries 查询列表
59
+ * @param config 全局配置
60
+ * @returns 批量查询结果
61
+ *
62
+ * 优化说明:
63
+ * 1. 顺序执行避免创建过多的独立任务队列
64
+ * 2. 每个查询创建独立的 RecursiveObjectQuery 实例,避免状态污染
65
+ * 3. 查询间添加适当延迟,避免服务器过载
66
+ */
67
+ export declare function handleBatchRecursiveQuery(queries: Array<{
68
+ object_type: string;
69
+ object_name: string;
70
+ }>, config?: Partial<RecursiveQueryConfig>): Promise<{
71
+ success: boolean;
72
+ data: {
73
+ results: any[];
74
+ errors: any[];
75
+ failed_files: any[];
76
+ summary: {
77
+ total_queries: number;
78
+ successful_queries: number;
79
+ failed_queries: number;
80
+ failed_files: number;
81
+ success_rate: string;
82
+ total_duration_ms: number;
83
+ average_duration_ms: number;
84
+ };
85
+ };
86
+ message: string;
87
+ error?: undefined;
88
+ } | {
89
+ success: boolean;
90
+ error: string;
91
+ data: null;
92
+ message?: undefined;
93
+ }>;
94
+ //# sourceMappingURL=handleRecursiveObjectQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleRecursiveObjectQuery.d.ts","sourceRoot":"","sources":["../../src/recursive/handleRecursiveObjectQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEzD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;GAmJzC"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleRecursiveObjectQuery = handleRecursiveObjectQuery;
4
+ exports.handleBatchRecursiveQuery = handleBatchRecursiveQuery;
5
+ const recursiveObjectQuery_1 = require("./recursiveObjectQuery");
6
+ const utils_1 = require("../lib/utils");
7
+ /**
8
+ * 处理递归对象查询请求
9
+ * @param args 查询参数
10
+ * @returns 查询结果
11
+ */
12
+ async function handleRecursiveObjectQuery(args) {
13
+ try {
14
+ // 验证必要参数
15
+ if (!args?.object_type) {
16
+ throw new utils_1.McpError(utils_1.ErrorCode.InvalidParams, 'Object type is required');
17
+ }
18
+ if (!args?.object_name) {
19
+ throw new utils_1.McpError(utils_1.ErrorCode.InvalidParams, 'Object name is required');
20
+ }
21
+ // 构建配置
22
+ const config = {
23
+ maxRecursionDepth: args.max_recursion_depth || 1,
24
+ downloadRootPath: args.download_root_path,
25
+ downloadIncludes: args.download_includes !== false,
26
+ downloadStructures: args.download_structures !== false,
27
+ recursiveClasses: args.recursive_classes !== false,
28
+ recursiveFunctions: args.recursive_functions !== false,
29
+ enableCircularReferenceCheck: args.enable_circular_reference_check !== false,
30
+ concurrentRequestLimit: args.concurrent_request_limit || 10,
31
+ requestInterval: args.request_interval || 100,
32
+ recursionFilters: args.recursion_filters
33
+ };
34
+ console.error(`开始递归查询 - 类型: ${args.object_type}, 名称: ${args.object_name}`);
35
+ console.error(`配置: ${JSON.stringify(config, null, 2)}`);
36
+ // 创建查询器并执行
37
+ const query = new recursiveObjectQuery_1.RecursiveObjectQuery(config);
38
+ const result = await query.execute(args.object_type.toUpperCase(), args.object_name.toUpperCase());
39
+ // 生成摘要信息
40
+ const summary = query.getResultSummary();
41
+ console.error(summary);
42
+ // 获取文件错误详情
43
+ const fileErrorDetails = query.getFileErrorDetails();
44
+ if (fileErrorDetails) {
45
+ console.error(fileErrorDetails);
46
+ }
47
+ // 返回结果 - 避免循环引用问题
48
+ return {
49
+ success: true,
50
+ data: {
51
+ original_object: result.originalObject,
52
+ all_objects: Array.from(result.allObjects.entries()).map(([key, value]) => ({
53
+ object_key: key,
54
+ object_data: value
55
+ })).slice(0, 20), // 限制输出数量,避免过多数据
56
+ downloaded_files: result.downloadedFiles,
57
+ filtered_objects: result.filteredObjects,
58
+ statistics: result.statistics,
59
+ errors: result.errors,
60
+ summary: summary
61
+ },
62
+ message: `递归查询完成 - 处理了 ${result.statistics.totalObjects} 个对象,过滤了 ${result.filteredObjects.length} 个对象`
63
+ };
64
+ }
65
+ catch (error) {
66
+ const errorMessage = `递归查询失败: ${error instanceof Error ? error.message : String(error)}`;
67
+ console.error(errorMessage);
68
+ return {
69
+ success: false,
70
+ error: errorMessage,
71
+ data: null
72
+ };
73
+ }
74
+ }
75
+ /**
76
+ * 批量递归查询
77
+ * @param queries 查询列表
78
+ * @param config 全局配置
79
+ * @returns 批量查询结果
80
+ *
81
+ * 优化说明:
82
+ * 1. 顺序执行避免创建过多的独立任务队列
83
+ * 2. 每个查询创建独立的 RecursiveObjectQuery 实例,避免状态污染
84
+ * 3. 查询间添加适当延迟,避免服务器过载
85
+ */
86
+ async function handleBatchRecursiveQuery(queries, config) {
87
+ try {
88
+ if (!queries || !Array.isArray(queries) || queries.length === 0) {
89
+ throw new utils_1.McpError(utils_1.ErrorCode.InvalidParams, 'Queries array is required and cannot be empty');
90
+ }
91
+ console.error(`开始批量递归查询 - 共 ${queries.length} 个查询`);
92
+ console.error(`配置: ${JSON.stringify(config, null, 2)}`);
93
+ const results = [];
94
+ const errors = [];
95
+ const fileErrors = [];
96
+ const startTime = Date.now();
97
+ // 顺序执行查询以避免过载
98
+ // 每个查询有自己的独立任务队列,可以并发处理内部的对象
99
+ for (let i = 0; i < queries.length; i++) {
100
+ const query = queries[i];
101
+ const queryStartTime = Date.now();
102
+ console.error(`\n处理第 ${i + 1}/${queries.length} 个查询: ${query.object_type} - ${query.object_name}`);
103
+ console.error('----------------------------------------');
104
+ try {
105
+ const result = await handleRecursiveObjectQuery({
106
+ ...query,
107
+ ...config
108
+ });
109
+ const queryDuration = Date.now() - queryStartTime;
110
+ console.error(`查询 ${i + 1} 完成,耗时: ${queryDuration}ms`);
111
+ if (result.success) {
112
+ results.push({
113
+ query: query,
114
+ result: result.data,
115
+ index: i,
116
+ duration: queryDuration
117
+ });
118
+ // 从 downloadedFiles 中收集失败的文件信息
119
+ if (result.data?.downloaded_files && result.data.downloaded_files.length > 0) {
120
+ const failedFiles = result.data.downloaded_files.filter((f) => !f.success);
121
+ fileErrors.push(...failedFiles.map((file) => ({
122
+ objectType: file.objectType,
123
+ objectName: file.objectName,
124
+ error: file.error,
125
+ filePath: file.filePath,
126
+ originalQuery: query,
127
+ queryIndex: i
128
+ })));
129
+ }
130
+ }
131
+ else {
132
+ errors.push({
133
+ query: query,
134
+ error: result.error,
135
+ index: i,
136
+ duration: queryDuration
137
+ });
138
+ }
139
+ // 查询间隔 - 让系统有时间清理资源
140
+ if (i < queries.length - 1) {
141
+ const interval = config?.requestInterval || 1000;
142
+ console.error(`等待 ${interval}ms 后处理下一个查询...`);
143
+ await new Promise(resolve => setTimeout(resolve, interval));
144
+ }
145
+ }
146
+ catch (error) {
147
+ const queryDuration = Date.now() - queryStartTime;
148
+ const errorMessage = `查询 ${query.object_type} - ${query.object_name} 失败: ${error instanceof Error ? error.message : String(error)}`;
149
+ errors.push({
150
+ query: query,
151
+ error: errorMessage,
152
+ index: i,
153
+ duration: queryDuration
154
+ });
155
+ console.error(errorMessage);
156
+ console.error(error);
157
+ }
158
+ }
159
+ const totalDuration = Date.now() - startTime;
160
+ const avgDuration = totalDuration / queries.length;
161
+ console.error('\n========================================');
162
+ console.error(`批量查询完成`);
163
+ console.error(`总耗时: ${totalDuration}ms`);
164
+ console.error(`平均耗时: ${avgDuration.toFixed(0)}ms/查询`);
165
+ console.error(`成功: ${results.length}, 失败: ${errors.length}`);
166
+ console.error('========================================');
167
+ // 输出文件错误信息
168
+ if (fileErrors.length > 0) {
169
+ console.error(`\n文件错误汇总 (共 ${fileErrors.length} 个):`);
170
+ console.error('========================');
171
+ fileErrors.forEach((fileError, index) => {
172
+ console.error(`${index + 1}. [查询${fileError.queryIndex + 1}] ${fileError.objectType}/${fileError.objectName}`);
173
+ console.error(` 来源: ${fileError.originalQuery.object_type} - ${fileError.originalQuery.object_name}`);
174
+ console.error(` 错误: ${fileError.error || '未知错误'}`);
175
+ if (fileError.filePath) {
176
+ console.error(` 路径: ${fileError.filePath}`);
177
+ }
178
+ });
179
+ }
180
+ // 输出错误详情
181
+ if (errors.length > 0) {
182
+ console.error(`\n查询错误详情:`);
183
+ console.error('========================');
184
+ errors.forEach((error, index) => {
185
+ console.error(`${index + 1}. [查询${error.index + 1}] ${error.query.object_type} - ${error.query.object_name}`);
186
+ console.error(` 耗时: ${error.duration}ms`);
187
+ console.error(` 错误: ${error.error}`);
188
+ });
189
+ }
190
+ return {
191
+ success: true,
192
+ data: {
193
+ results: results,
194
+ errors: errors,
195
+ failed_files: fileErrors,
196
+ summary: {
197
+ total_queries: queries.length,
198
+ successful_queries: results.length,
199
+ failed_queries: errors.length,
200
+ failed_files: fileErrors.length,
201
+ success_rate: (results.length / queries.length * 100).toFixed(2) + '%',
202
+ total_duration_ms: totalDuration,
203
+ average_duration_ms: Math.round(avgDuration)
204
+ }
205
+ },
206
+ message: `批量递归查询完成 - 成功 ${results.length}/${queries.length} 个 (${(results.length / queries.length * 100).toFixed(1)}%),失败 ${errors.length} 个,文件错误 ${fileErrors.length} 个,总耗时 ${totalDuration}ms`
207
+ };
208
+ }
209
+ catch (error) {
210
+ const errorMessage = `批量递归查询失败: ${error instanceof Error ? error.message : String(error)}`;
211
+ console.error(errorMessage);
212
+ console.error(error);
213
+ return {
214
+ success: false,
215
+ error: errorMessage,
216
+ data: null
217
+ };
218
+ }
219
+ }
@@ -0,0 +1,159 @@
1
+ import { RecursiveQueryConfig, RecursiveQueryResult } from './recursiveQueryConfig';
2
+ /**
3
+ * 递归对象查询器
4
+ * 用于查询ABAP对象及其引用的所有相关对象
5
+ */
6
+ export declare class RecursiveObjectQuery {
7
+ private config;
8
+ private result;
9
+ private context;
10
+ private taskQueue;
11
+ private objectCache;
12
+ private screenCache;
13
+ constructor(config?: Partial<RecursiveQueryConfig>);
14
+ /**
15
+ * 等待所有任务完成
16
+ */
17
+ private waitForAllTasks;
18
+ /**
19
+ * 检查对象是否应该被过滤(不进行递归查询)
20
+ * @param objectType 对象类型
21
+ * @param objectName 对象名称
22
+ * @returns true表示应该过滤(不递归),false表示可以递归
23
+ */
24
+ private shouldFilterRecursion;
25
+ /**
26
+ * 模式匹配(支持通配符 * 和 ?)
27
+ * @param text 要匹配的文本
28
+ * @param pattern 模式字符串
29
+ * @returns 是否匹配
30
+ */
31
+ private matchPattern;
32
+ /**
33
+ * 执行递归查询(优化版本)
34
+ * @param objectType 对象类型
35
+ * @param objectName 对象名称
36
+ * @returns 查询结果
37
+ */
38
+ execute(objectType: string, objectName: string): Promise<RecursiveQueryResult>;
39
+ /**
40
+ * 递归处理对象(优化版本)
41
+ * 采用并发队列 + 缓存机制,提高执行效率
42
+ * 修复死锁问题:
43
+ * 1. 避免在任务队列内部进行递归调用
44
+ * 2. 使用正确的循环引用检测机制
45
+ * 3. 分离查询和递归处理逻辑
46
+ */
47
+ private processObjectRecursively;
48
+ /**
49
+ * 处理函数组
50
+ * 当处理函数时,提取函数组信息并生成函数组文件
51
+ */
52
+ private processFunctionGroup;
53
+ /**
54
+ * 处理包含文件
55
+ */
56
+ private processIncludes;
57
+ /**
58
+ * 下载 include 文件并根据内容自动检测类型,添加符合 abaplint 规范的后缀
59
+ */
60
+ private downloadIncludeWithTypeDetection;
61
+ /**
62
+ * 使用 abaplint 进行精确的语法分析来检测 include 文件类型
63
+ * 这是最准确的方法,因为它真正解析了 ABAP 语法
64
+ */
65
+ private detectIncludeType;
66
+ /**
67
+ * 根据 include 类型生成符合 abaplint 规范的文件路径
68
+ */
69
+ private generateIncludeFilePath;
70
+ /**
71
+ * 处理文本元素
72
+ * 按照abapGit协议,文本元素应该单独导出为XML文件
73
+ */
74
+ private processTextElements;
75
+ /**
76
+ * 处理消息
77
+ * 按照abapGit协议,消息应该使用MSAG XML格式单独导出
78
+ */
79
+ private processMessages;
80
+ /**
81
+ * 处理GUI标题
82
+ */
83
+ private processGuiTitles;
84
+ /**
85
+ * 处理结构体
86
+ */
87
+ private processStructures;
88
+ /**
89
+ * 处理单个结构体
90
+ */
91
+ private processSingleStructure;
92
+ /**
93
+ * 处理透明表,获取并保存完整表结构信息
94
+ */
95
+ private processTransparentTable;
96
+ /**
97
+ * 处理结构体字段中的domain定义
98
+ */
99
+ private processStructureDomains;
100
+ /**
101
+ * 处理单个domain定义
102
+ */
103
+ private processSingleDomain;
104
+ /**
105
+ * 统一的文件路径生成器 - 根据对象类型和名称生成标准文件路径
106
+ * 支持多种ABAP对象类型:DOMAIN, STRUCTURE, CLASS, FUNCTION, PROGRAM, INCLUDE
107
+ */
108
+ private generateFilePath;
109
+ /**
110
+ * 获取ABAP对象类型的默认文件扩展名
111
+ */
112
+ private getDefaultExtension;
113
+ /**
114
+ * 获取ABAP对象类型的标准目录名
115
+ */
116
+ private getObjectDirectory;
117
+ /**
118
+ * 下载domain文件
119
+ */
120
+ private downloadDomainFile;
121
+ /**
122
+ * 下载结构文件
123
+ */
124
+ private downloadStructureFile;
125
+ /**
126
+ * 通用下载错误处理方法
127
+ */
128
+ private handleDownloadError;
129
+ /**
130
+ * 从对象数据中提取函数组信息
131
+ */
132
+ private extractFunctionGroup;
133
+ /**
134
+ * 使用已有的对象数据下载对象源代码(包含正确的函数组信息)
135
+ */
136
+ private downloadObjectSourceWithData;
137
+ /**
138
+ * 查询对象引用内容(包含下载源代码)
139
+ * 现在包含下载逻辑,因为需要函数组信息来正确下载函数源代码
140
+ */
141
+ private queryObjectReferences;
142
+ /**
143
+ * 生成对象键
144
+ */
145
+ private generateObjectKey;
146
+ /**
147
+ * 延迟函数
148
+ */
149
+ private delay;
150
+ /**
151
+ * 获取结果摘要
152
+ */
153
+ getResultSummary(): string;
154
+ /**
155
+ * 获取文件错误详细信息
156
+ */
157
+ getFileErrorDetails(): string;
158
+ }
159
+ //# sourceMappingURL=recursiveObjectQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursiveObjectQuery.d.ts","sourceRoot":"","sources":["../../src/recursive/recursiveObjectQuery.ts"],"names":[],"mappings":"AASA,OAAO,EACH,oBAAoB,EAGpB,oBAAoB,EAEvB,MAAM,wBAAwB,CAAC;AAwMhC;;;GAGG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,WAAW,CAAc;gBAGrB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAyEtD;;OAEG;YACW,eAAe;IAS7B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAqD7B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;OAKG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2DpF;;;;;;;OAOG;YACW,wBAAwB;IAkLtC;;;OAGG;YACW,oBAAoB;IAuClC;;OAEG;YACW,eAAe;IAgB7B;;OAEG;YACW,gCAAgC;IAkE9C;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmC/B;;;OAGG;YACW,mBAAmB;IAiBjC;;;OAGG;YACW,eAAe;IAiB7B;;OAEG;YACW,gBAAgB;IAwC9B;;OAEG;YACW,iBAAiB;IAa/B;;OAEG;YACW,sBAAsB;IA0BpC;;OAEG;YACW,uBAAuB;IAwErC;;OAEG;YACW,uBAAuB;IA2CrC;;OAEG;YACW,mBAAmB;IAyBjC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,qBAAqB;IAwBnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;YACW,4BAA4B;IA8F1C;;;OAGG;YACW,qBAAqB;IAoKnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAsB1B;;OAEG;IACH,mBAAmB,IAAI,MAAM;CAiBhC"}