@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,49 @@
1
+ /**
2
+ * 下载文件函数
3
+ * @param fileContent 文件内容(字符串或Buffer)
4
+ * @param filePath 文件路径
5
+ * @param fileType 文件类型(用于确定文件扩展名和编码)
6
+ * @returns 下载结果对象
7
+ */
8
+ export declare function downloadFile(fileContent: string | Buffer, filePath: string, fileType?: 'text' | 'json' | 'xml' | 'abap' | 'binary'): Promise<{
9
+ success: boolean;
10
+ message: string;
11
+ filePath?: string;
12
+ }>;
13
+ /**
14
+ * 下载ABAP代码文件(专门处理ABAP代码格式)
15
+ * @param abapCode ABAP代码内容
16
+ * @param fileName 文件名(不包含扩展名)
17
+ * @param targetDirectory 目标目录
18
+ * @returns 下载结果对象
19
+ */
20
+ export declare function downloadAbapFile(abapCode: string, fileName: string, targetDirectory: string): Promise<{
21
+ success: boolean;
22
+ message: string;
23
+ filePath?: string;
24
+ }>;
25
+ /**
26
+ * 下载JSON文件
27
+ * @param jsonData JSON数据对象或字符串
28
+ * @param fileName 文件名(不包含扩展名)
29
+ * @param targetDirectory 目标目录
30
+ * @returns 下载结果对象
31
+ */
32
+ export declare function downloadJsonFile(jsonData: any, fileName: string, targetDirectory: string): Promise<{
33
+ success: boolean;
34
+ message: string;
35
+ filePath?: string;
36
+ }>;
37
+ /**
38
+ * 下载XML文件
39
+ * @param xmlContent XML内容
40
+ * @param fileName 文件名(不包含扩展名)
41
+ * @param targetDirectory 目标目录
42
+ * @returns 下载结果对象
43
+ */
44
+ export declare function downloadXmlFile(xmlContent: string, fileName: string, targetDirectory: string): Promise<{
45
+ success: boolean;
46
+ message: string;
47
+ filePath?: string;
48
+ }>;
49
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/lib/download.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAsB,YAAY,CAC9B,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,QAAiB,GAC/D,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAClC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAInE;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAGnE"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.downloadFile = downloadFile;
4
+ exports.downloadAbapFile = downloadAbapFile;
5
+ exports.downloadJsonFile = downloadJsonFile;
6
+ exports.downloadXmlFile = downloadXmlFile;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ /**
10
+ * 下载文件函数
11
+ * @param fileContent 文件内容(字符串或Buffer)
12
+ * @param filePath 文件路径
13
+ * @param fileType 文件类型(用于确定文件扩展名和编码)
14
+ * @returns 下载结果对象
15
+ */
16
+ async function downloadFile(fileContent, filePath, fileType = 'text') {
17
+ try {
18
+ // 确保文件内容正确格式化
19
+ let content;
20
+ if (typeof fileContent === 'string') {
21
+ // 根据文件类型确定编码
22
+ const encoding = fileType === 'binary' ? 'binary' : 'utf8';
23
+ content = Buffer.from(fileContent, encoding);
24
+ }
25
+ else {
26
+ content = fileContent;
27
+ }
28
+ // 写入文件
29
+ (0, fs_1.writeFileSync)(filePath, content);
30
+ return {
31
+ success: true,
32
+ message: `文件下载成功: ${filePath}`,
33
+ filePath: filePath
34
+ };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ success: false,
39
+ message: `文件下载失败: ${error instanceof Error ? error.message : String(error)}`
40
+ };
41
+ }
42
+ }
43
+ /**
44
+ * 下载ABAP代码文件(专门处理ABAP代码格式)
45
+ * @param abapCode ABAP代码内容
46
+ * @param fileName 文件名(不包含扩展名)
47
+ * @param targetDirectory 目标目录
48
+ * @returns 下载结果对象
49
+ */
50
+ async function downloadAbapFile(abapCode, fileName, targetDirectory) {
51
+ // 处理包含路径分隔符的文件名,将 / 和 \ 替换为 _
52
+ const sanitizedFileName = fileName.replace(/[/\\]/g, '_');
53
+ const filePath = (0, path_1.join)(targetDirectory, `${sanitizedFileName}.abap`);
54
+ return downloadFile(abapCode, filePath, 'abap');
55
+ }
56
+ /**
57
+ * 下载JSON文件
58
+ * @param jsonData JSON数据对象或字符串
59
+ * @param fileName 文件名(不包含扩展名)
60
+ * @param targetDirectory 目标目录
61
+ * @returns 下载结果对象
62
+ */
63
+ async function downloadJsonFile(jsonData, fileName, targetDirectory) {
64
+ const jsonString = typeof jsonData === 'string' ? jsonData : JSON.stringify(jsonData, null, 2);
65
+ const filePath = (0, path_1.join)(targetDirectory, `${fileName}.json`);
66
+ return downloadFile(jsonString, filePath, 'json');
67
+ }
68
+ /**
69
+ * 下载XML文件
70
+ * @param xmlContent XML内容
71
+ * @param fileName 文件名(不包含扩展名)
72
+ * @param targetDirectory 目标目录
73
+ * @returns 下载结果对象
74
+ */
75
+ async function downloadXmlFile(xmlContent, fileName, targetDirectory) {
76
+ const filePath = (0, path_1.join)(targetDirectory, `${fileName}.xml`);
77
+ return downloadFile(xmlContent, filePath, 'xml');
78
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 递归对象查询库的主入口文件
3
+ * 提供递归查询ABAP对象及其引用的功能
4
+ */
5
+ export { RecursiveQueryConfig, defaultConfig, RecursiveQueryResult, RecursiveQueryContext } from '../recursive/recursiveQueryConfig';
6
+ export { RecursiveObjectQuery } from '../recursive/recursiveObjectQuery';
7
+ export { handleRecursiveObjectQuery, handleBatchRecursiveQuery } from '../recursive/handleRecursiveObjectQuery';
8
+ export { downloadFile, downloadAbapFile, downloadJsonFile, downloadXmlFile } from './download';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,EACH,0BAA0B,EAC1B,yBAAyB,EAC5B,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * 递归对象查询库的主入口文件
4
+ * 提供递归查询ABAP对象及其引用的功能
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.downloadXmlFile = exports.downloadJsonFile = exports.downloadAbapFile = exports.downloadFile = exports.handleBatchRecursiveQuery = exports.handleRecursiveObjectQuery = exports.RecursiveObjectQuery = exports.defaultConfig = void 0;
8
+ // 配置相关
9
+ var recursiveQueryConfig_1 = require("../recursive/recursiveQueryConfig");
10
+ Object.defineProperty(exports, "defaultConfig", { enumerable: true, get: function () { return recursiveQueryConfig_1.defaultConfig; } });
11
+ // 主要查询器
12
+ var recursiveObjectQuery_1 = require("../recursive/recursiveObjectQuery");
13
+ Object.defineProperty(exports, "RecursiveObjectQuery", { enumerable: true, get: function () { return recursiveObjectQuery_1.RecursiveObjectQuery; } });
14
+ // 处理器
15
+ var handleRecursiveObjectQuery_1 = require("../recursive/handleRecursiveObjectQuery");
16
+ Object.defineProperty(exports, "handleRecursiveObjectQuery", { enumerable: true, get: function () { return handleRecursiveObjectQuery_1.handleRecursiveObjectQuery; } });
17
+ Object.defineProperty(exports, "handleBatchRecursiveQuery", { enumerable: true, get: function () { return handleRecursiveObjectQuery_1.handleBatchRecursiveQuery; } });
18
+ // 工具函数
19
+ var download_1 = require("./download");
20
+ Object.defineProperty(exports, "downloadFile", { enumerable: true, get: function () { return download_1.downloadFile; } });
21
+ Object.defineProperty(exports, "downloadAbapFile", { enumerable: true, get: function () { return download_1.downloadAbapFile; } });
22
+ Object.defineProperty(exports, "downloadJsonFile", { enumerable: true, get: function () { return download_1.downloadJsonFile; } });
23
+ Object.defineProperty(exports, "downloadXmlFile", { enumerable: true, get: function () { return download_1.downloadXmlFile; } });
@@ -0,0 +1,31 @@
1
+ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
2
+ import axios from 'axios';
3
+ import { AxiosResponse } from 'axios';
4
+ export { McpError, ErrorCode, AxiosResponse };
5
+ export declare function return_response(response: AxiosResponse): {
6
+ isError: boolean;
7
+ content: {
8
+ type: string;
9
+ text: any;
10
+ }[];
11
+ };
12
+ export declare function return_error(error: any): {
13
+ isError: boolean;
14
+ content: {
15
+ type: string;
16
+ text: string;
17
+ }[];
18
+ };
19
+ export declare function createAxiosInstance(): axios.AxiosInstance;
20
+ export declare function cleanup(): void;
21
+ export declare function getBaseUrl(): Promise<Buffer<ArrayBuffer>>;
22
+ export declare function getAuthHeaders(): Promise<{
23
+ Authorization: string;
24
+ 'SAP-Client': string;
25
+ }>;
26
+ /**
27
+ * XML转义函数 - 将特殊字符转换为XML实体
28
+ */
29
+ export declare function escapeXml(text: string): string;
30
+ export declare function makeAdtRequest(url: string, method: string, timeout: number, data?: any, params?: any): Promise<any>;
31
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAoC,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAE9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa;;;;;;EAQtD;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG;;;;;;EAUtC;AAGD,wBAAgB,mBAAmB,wBASlC;AAGD,wBAAgB,OAAO,SAYtB;AAMD,wBAAsB,UAAU,iCAa/B;AAED,wBAAsB,cAAc;;;GAUnC;AAyCD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU9C;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,gBAuG1G"}
@@ -0,0 +1,272 @@
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.ErrorCode = exports.McpError = void 0;
37
+ exports.return_response = return_response;
38
+ exports.return_error = return_error;
39
+ exports.createAxiosInstance = createAxiosInstance;
40
+ exports.cleanup = cleanup;
41
+ exports.getBaseUrl = getBaseUrl;
42
+ exports.getAuthHeaders = getAuthHeaders;
43
+ exports.escapeXml = escapeXml;
44
+ exports.makeAdtRequest = makeAdtRequest;
45
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
46
+ Object.defineProperty(exports, "McpError", { enumerable: true, get: function () { return types_js_1.McpError; } });
47
+ Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return types_js_1.ErrorCode; } });
48
+ const axios_1 = __importStar(require("axios"));
49
+ const https_1 = require("https");
50
+ const index_1 = require("../index"); // getConfig needs to be exported from index.ts
51
+ function return_response(response) {
52
+ return {
53
+ isError: false,
54
+ content: [{
55
+ type: 'text',
56
+ text: response.data
57
+ }]
58
+ };
59
+ }
60
+ function return_error(error) {
61
+ return {
62
+ isError: true,
63
+ content: [{
64
+ type: 'text',
65
+ text: `Error: ${error instanceof axios_1.AxiosError ? String(error.response?.data)
66
+ : error instanceof Error ? error.message
67
+ : String(error)}`
68
+ }]
69
+ };
70
+ }
71
+ let axiosInstance = null;
72
+ function createAxiosInstance() {
73
+ if (!axiosInstance) {
74
+ axiosInstance = axios_1.default.create({
75
+ httpsAgent: new https_1.Agent({
76
+ rejectUnauthorized: false // Allow self-signed certificates
77
+ })
78
+ });
79
+ }
80
+ return axiosInstance;
81
+ }
82
+ // Cleanup function for tests
83
+ function cleanup() {
84
+ if (axiosInstance) {
85
+ // Clear any interceptors
86
+ const reqInterceptor = axiosInstance.interceptors.request.use((config) => config);
87
+ const resInterceptor = axiosInstance.interceptors.response.use((response) => response);
88
+ axiosInstance.interceptors.request.eject(reqInterceptor);
89
+ axiosInstance.interceptors.response.eject(resInterceptor);
90
+ }
91
+ axiosInstance = null;
92
+ config = undefined;
93
+ csrfToken = null;
94
+ cookies = null;
95
+ }
96
+ let config;
97
+ let csrfToken = null;
98
+ let cookies = null; // Variable to store cookies
99
+ async function getBaseUrl() {
100
+ if (!config) {
101
+ config = (0, index_1.getConfig)();
102
+ }
103
+ const { url } = config;
104
+ try {
105
+ const urlObj = new URL(url);
106
+ const baseUrl = Buffer.from(`${urlObj.origin}`);
107
+ return baseUrl;
108
+ }
109
+ catch (error) {
110
+ const errorMessage = `Invalid URL in configuration: ${error instanceof Error ? error.message : error}`;
111
+ throw new Error(errorMessage);
112
+ }
113
+ }
114
+ async function getAuthHeaders() {
115
+ if (!config) {
116
+ config = (0, index_1.getConfig)();
117
+ }
118
+ const { username, password, client } = config;
119
+ const auth = Buffer.from(`${username}:${password}`).toString('base64'); // Create Basic Auth string
120
+ return {
121
+ 'Authorization': `Basic ${auth}`, // Basic Authentication header
122
+ 'SAP-Client': client // SAP client header
123
+ };
124
+ }
125
+ async function fetchCsrfToken(url) {
126
+ try {
127
+ const response = await createAxiosInstance()({
128
+ method: 'GET',
129
+ url,
130
+ headers: {
131
+ ...(await getAuthHeaders()),
132
+ 'x-csrf-token': 'fetch'
133
+ }
134
+ });
135
+ const token = response.headers['x-csrf-token'];
136
+ if (!token) {
137
+ throw new Error('No CSRF token in response headers');
138
+ }
139
+ // Extract and store cookies
140
+ if (response.headers['set-cookie']) {
141
+ cookies = response.headers['set-cookie'].join('; ');
142
+ }
143
+ return token;
144
+ }
145
+ catch (error) {
146
+ // Even if the request fails, try to get token from error response
147
+ if (error instanceof axios_1.AxiosError && error.response?.headers['x-csrf-token']) {
148
+ const token = error.response.headers['x-csrf-token'];
149
+ if (token) {
150
+ // Extract and store cookies from the error response as well
151
+ if (error.response.headers['set-cookie']) {
152
+ cookies = error.response.headers['set-cookie'].join('; ');
153
+ }
154
+ return token;
155
+ }
156
+ }
157
+ // If we couldn't get token from error response either, throw the original error
158
+ throw new Error(`Failed to fetch CSRF token: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ }
161
+ /**
162
+ * XML转义函数 - 将特殊字符转换为XML实体
163
+ */
164
+ function escapeXml(text) {
165
+ if (text == null) {
166
+ return '';
167
+ }
168
+ return String(text)
169
+ .replace(/&/g, '&amp;')
170
+ .replace(/</g, '&lt;')
171
+ .replace(/>/g, '&gt;')
172
+ .replace(/"/g, '&quot;')
173
+ .replace(/'/g, '&apos;');
174
+ }
175
+ async function makeAdtRequest(url, method, timeout, data, params) {
176
+ // For POST/PUT requests, ensure we have a CSRF token
177
+ if ((method === 'POST' || method === 'PUT') && !csrfToken) {
178
+ try {
179
+ csrfToken = await fetchCsrfToken(url);
180
+ }
181
+ catch (error) {
182
+ throw new Error('CSRF token is required for POST/PUT requests but could not be fetched');
183
+ }
184
+ }
185
+ const requestHeaders = {
186
+ ...(await getAuthHeaders())
187
+ };
188
+ // Add CSRF token for POST/PUT requests
189
+ if ((method === 'POST' || method === 'PUT') && csrfToken) {
190
+ requestHeaders['x-csrf-token'] = csrfToken;
191
+ }
192
+ // Add cookies if available
193
+ if (cookies) {
194
+ requestHeaders['Cookie'] = cookies;
195
+ }
196
+ const config = {
197
+ method,
198
+ url,
199
+ headers: requestHeaders,
200
+ timeout,
201
+ params: params
202
+ };
203
+ // Include data in the request configuration if provided
204
+ if (data) {
205
+ config.data = data;
206
+ }
207
+ const requestStartTime = Date.now();
208
+ const urlPath = new URL(url).pathname + (config.params ? '?' + new URLSearchParams(config.params).toString() : '');
209
+ const paramsInfo = config.params ? ` | 参数: ${JSON.stringify(config.params)}` : '';
210
+ try {
211
+ console.error(`[HTTP请求] 开始请求: ${method} ${url} (超时: ${timeout}ms)${paramsInfo}`);
212
+ // 添加请求进度监控
213
+ const progressInterval = setInterval(() => {
214
+ const elapsed = Date.now() - requestStartTime;
215
+ const elapsedSeconds = Math.floor(elapsed / 1000);
216
+ if (elapsedSeconds > 10) { // 超过10秒才输出警告
217
+ console.warn(`[HTTP请求-等待中] ${method} ${url} - 已等待 ${elapsedSeconds}秒,可能网络较慢或服务器无响应${paramsInfo}`);
218
+ }
219
+ }, 10000); // 每10秒检查一次
220
+ let response;
221
+ try {
222
+ response = await createAxiosInstance()(config);
223
+ }
224
+ finally {
225
+ clearInterval(progressInterval);
226
+ }
227
+ const requestDuration = Date.now() - requestStartTime;
228
+ console.error(`[HTTP请求] 请求完成: ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`);
229
+ return response;
230
+ }
231
+ catch (error) {
232
+ const requestDuration = Date.now() - requestStartTime;
233
+ // If we get a 403 with "CSRF token validation failed", try to fetch a new token and retry
234
+ if (error instanceof axios_1.AxiosError && error.response?.status === 403 &&
235
+ error.response.data?.includes('CSRF')) {
236
+ console.error(`[HTTP请求] CSRF token 失效,重新获取token并重试: ${url}${paramsInfo}`);
237
+ csrfToken = await fetchCsrfToken(url);
238
+ config.headers['x-csrf-token'] = csrfToken;
239
+ console.error(`[HTTP请求] 重试请求: ${method} ${url}${paramsInfo}`);
240
+ const retryResponse = await createAxiosInstance()(config);
241
+ const retryDuration = Date.now() - requestStartTime;
242
+ console.error(`[HTTP请求] 重试完成: ${method} ${url} (总耗时: ${retryDuration}ms)${paramsInfo}`);
243
+ return retryResponse;
244
+ }
245
+ // 构造详细的错误信息并抛出
246
+ let errorMessage;
247
+ if (error instanceof axios_1.AxiosError) {
248
+ if (error.code === 'ECONNABORTED') {
249
+ errorMessage = `请求超时 - ${method} ${url} (耗时: ${requestDuration}ms, 超时设置: ${timeout}ms)${paramsInfo}`;
250
+ console.error(`[HTTP请求-超时] ${errorMessage}`);
251
+ }
252
+ else if (error.response) {
253
+ errorMessage = `服务器返回错误 - ${method} ${url} (状态: ${error.response.status}, 耗时: ${requestDuration}ms)${paramsInfo}`;
254
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
255
+ }
256
+ else if (error.request) {
257
+ errorMessage = `无响应 - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
258
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
259
+ }
260
+ else {
261
+ errorMessage = `${error.message} - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
262
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
263
+ }
264
+ }
265
+ else {
266
+ errorMessage = `${error instanceof Error ? error.message : String(error)} - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
267
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
268
+ }
269
+ // 抛出包含详细信息的新错误
270
+ throw new Error(errorMessage);
271
+ }
272
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 递归查询生产者
3
+ * 负责并发递归查询对象,生成所有下载任务
4
+ */
5
+ import { RedisQueueManager, RecursiveQueryConfig } from '../common';
6
+ /**
7
+ * 递归查询生产者
8
+ */
9
+ export declare class RecursiveQueryProducer {
10
+ private queueManager;
11
+ private taskQueue;
12
+ private jobId?;
13
+ private filterCache?;
14
+ constructor(queueManager: RedisQueueManager);
15
+ /**
16
+ * 创建 Job 并返回 Job ID(不阻塞)
17
+ * @param jobId Job ID(必须由外部传入)
18
+ * @param objectType 对象类型
19
+ * @param objectName 对象名称
20
+ * @param config 递归查询配置
21
+ * @returns Job ID
22
+ */
23
+ createJob(jobId: string, objectType: string, objectName: string, config: RecursiveQueryConfig): Promise<string>;
24
+ /**
25
+ * 提交查询任务(兼容旧版本,阻塞模式)
26
+ * @param objectType 对象类型
27
+ * @param objectName 对象名称
28
+ * @param config 递归查询配置
29
+ * @returns Job ID
30
+ */
31
+ submitQuery(objectType: string, objectName: string, config: RecursiveQueryConfig): Promise<string>;
32
+ /**
33
+ * 生成所有任务(可以被外部调用)
34
+ */
35
+ generateAllTasks(jobId: string, objectType: string, objectName: string, config: RecursiveQueryConfig): Promise<void>;
36
+ /**
37
+ * 等待 Job 完成
38
+ */
39
+ waitForCompletion(jobId: string, timeout?: number): Promise<any>;
40
+ /**
41
+ * 获取进度
42
+ */
43
+ getProgress(jobId: string): Promise<import("../common").JobProgress | null>;
44
+ /**
45
+ * 取消 Job
46
+ */
47
+ cancelJob(jobId: string): Promise<void>;
48
+ /**
49
+ * 递归生成任务(并发版本)
50
+ */
51
+ private recursivelyGenerateTasks;
52
+ /**
53
+ * 背压控制:等待队列有空间(✅ 优化:事件驱动替代轮询)
54
+ */
55
+ private waitForQueueSpace;
56
+ /**
57
+ * 查询对象
58
+ */
59
+ private queryObject;
60
+ /**
61
+ * 提取依赖关系
62
+ */
63
+ private extractDependencies;
64
+ /**
65
+ * 准备缓存数据(包含依赖关系)
66
+ */
67
+ private prepareCacheData;
68
+ /**
69
+ * 计算任务优先级
70
+ */
71
+ private calculatePriority;
72
+ /**
73
+ * 初始化过滤规则缓存
74
+ * ✅ 优化:预编译所有正则表达式,避免每次检查时重复编译
75
+ * @param config 递归查询配置
76
+ */
77
+ private initializeFilterCache;
78
+ /**
79
+ * 检查对象是否应该被过滤
80
+ * ✅ 优化:使用预编译的 FilterCache,避免每次检查时重复编译正则表达式
81
+ * @param objectType 对象类型
82
+ * @param objectName 对象名称
83
+ * @param config 递归查询配置
84
+ * @returns true 表示应该过滤(不递归查询),false 表示不过滤
85
+ */
86
+ private shouldFilter;
87
+ /**
88
+ * 延迟函数
89
+ */
90
+ private sleep;
91
+ }
92
+ //# sourceMappingURL=RecursiveQueryProducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecursiveQueryProducer.d.ts","sourceRoot":"","sources":["../../src/producer/RecursiveQueryProducer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,iBAAiB,EAMjB,oBAAoB,EAIvB,MAAM,WAAW,CAAC;AAyInB;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,YAAY,EAAE,iBAAiB;IAK3C;;;;;;;OAOG;IACG,SAAS,CACX,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC;IAiBlB;;;;;;OAMG;IACG,WAAW,CACb,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC;IAUlB;;OAEG;IACG,gBAAgB,CAClB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAsBhB;;OAEG;IACG,iBAAiB,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC;IAkCf;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM;IAI/B;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C;;OAEG;YACW,wBAAwB;IAsGtC;;OAEG;YACW,iBAAiB;IAqD/B;;OAEG;YACW,WAAW;IAsCzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGhB"}