@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,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultConfig = exports.defaultFilters = void 0;
4
+ /**
5
+ * 默认过滤规则
6
+ * 这些是推荐的通用过滤规则,可以避免递归查询大量标准 SAP 对象
7
+ * 主要过滤与业务逻辑无关的 SAP 框架、系统工具和技术组件
8
+ */
9
+ exports.defaultFilters = {
10
+ excludeNames: [
11
+ // 常见的系统程序
12
+ 'SAPLSMTR',
13
+ 'SAPLSMTR_NAVIGATION',
14
+ 'SAPLSTRD',
15
+ 'SAPLSLVC',
16
+ 'SAPLSLVC_FULLSCREEN',
17
+ 'SAPLSBAL',
18
+ 'SAPLSPOL',
19
+ 'SAPLSTXB',
20
+ 'SAPMSSY0',
21
+ 'SAPMSSY1',
22
+ 'SAPMSSY3',
23
+ 'SAPMSSYD'
24
+ ],
25
+ excludeNamePatterns: [
26
+ // ============ SAP 标准对象和命名空间 ============
27
+ // 'SAP*', // SAP 标准程序和对象
28
+ // '/SAP/*', // SAP 命名空间
29
+ '/1*', // SAP 内部命名空间
30
+ // ============ Repository 和系统工具 ============
31
+ 'RS*', // Repository 工具 (SE80, SE11等)
32
+ // 'RM*', // 报表管理器
33
+ 'SE*', // 系统编辑器相关
34
+ 'SY*', // 系统相关
35
+ 'RSSCD*', // 变更文档
36
+ 'RSTS*', // 测试工具
37
+ // ============ GUI 和 ALV 框架 ============
38
+ 'CL_GUI_*', // GUI 控制类
39
+ 'CL_ALV_*', // ALV 表格类
40
+ 'CL_SALV_*', // 新版 ALV 类
41
+ 'SAPLSALV*', // ALV 函数组
42
+ // ============ ABAP 基础框架类 ============
43
+ 'CL_ABAP_*', // ABAP 基础类(类型描述、反射等)
44
+ 'CL_SYSTEM_*', // 系统类
45
+ 'CL_OS_*', // 操作系统相关类
46
+ // ============ Web Dynpro 框架 ============
47
+ 'CL_WD_*', // Web Dynpro 类
48
+ 'CL_WDR_*', // Web Dynpro Runtime
49
+ '/IWBEP/*', // Gateway Business Enablement
50
+ '/IWFND/*', // Gateway Foundation
51
+ '/IWCOR/*', // Gateway Core
52
+ // ============ OData 和 REST 框架 ============
53
+ 'CL_REST_*', // REST 框架
54
+ '/IWMB/*', // Model Builder
55
+ '/IWSRV/*', // Service 相关
56
+ // ============ UI5 和 Fiori 框架 ============
57
+ '/UI2/*', // UI2 框架
58
+ '/UI5/*', // UI5 框架
59
+ '/NEPTUNE/*', // Neptune (低代码平台)
60
+ // ============ HTTP、网络和通信框架 ============
61
+ 'CL_HTTP_*', // HTTP 客户端/服务器
62
+ 'CL_PROXY_*', // 代理类
63
+ 'CL_SOAP_*', // SOAP 框架
64
+ 'CL_REST_*', // REST 框架
65
+ // ============ XML、JSON 数据处理框架 ============
66
+ 'CL_XML_*', // XML 处理
67
+ 'CL_JSON_*', // JSON 处理
68
+ 'CL_IXML_*', // iXML 处理
69
+ 'CL_SXML_*', // Simple XML
70
+ 'CL_XSLT_*', // XSLT 处理
71
+ // ============ BCS 邮件和消息框架 ============
72
+ 'CL_BCS*', // Business Communication Services (邮件)
73
+ 'CL_CAM_*', // Communication Application
74
+ 'CL_SWF_*', // 工作流
75
+ // ============ 数据库和持久化框架 ============
76
+ 'CL_SQL_*', // SQL 相关
77
+ 'CL_OSQL_*', // Open SQL
78
+ // ============ Dynpro (经典屏幕) 框架 ============
79
+ 'CL_DYNP_*', // Dynpro 相关
80
+ // ============ BAPI 和标准接口框架 ============
81
+ 'BAPI_*', // 标准 BAPI (如果只关注自定义业务)
82
+ // ============ 日志和监控框架 ============
83
+ 'CL_LOGGER*', // 日志框架
84
+ 'CL_SLG*', // Application Log
85
+ 'CL_ATRA*', // Application Trace
86
+ // ============ 安全和授权框架 ============
87
+ 'CL_AUTH*', // 权限检查
88
+ 'CL_SEC*', // 安全相关
89
+ // ============ 打印和输出框架 ============
90
+ 'CL_SMARTFORM*', // Smartforms
91
+ 'CL_SSF_*', // SSF (Smart Style)
92
+ 'CL_FP_*', // Forms (Adobe Forms等)
93
+ // ============ 工具和实用类 ============
94
+ 'CL_DEMO_*', // 演示类
95
+ 'CL_PROGRESS_*', // 进度指示器
96
+ 'CL_DD_*', // Data Dictionary
97
+ // ============ 批处理和后台处理 ============
98
+ 'CL_BP_*', // 批处理相关
99
+ 'CL_BATCH*', // 批处理
100
+ // ============ BASIS 技术组件 ============
101
+ 'CL_SPOOL*', // Spool 系统
102
+ 'CL_BATCH*', // 批处理输入
103
+ // ============ 标准函数组 (SAP 系统层面) ============
104
+ // 'SAPL*', // 大多数 SAP 标准函数组以 SAPL 开头
105
+ // ============ 标准表和结构 (系统级别) ============
106
+ 'STANDARD', // 标准表类型
107
+ 'SYSUUID*', // 系统 UUID
108
+ 'DD*', // Data Dictionary 对象
109
+ // ============ 旧版本兼容性对象 ============
110
+ '*_LEGACY',
111
+ '*_COMPAT',
112
+ '*_DEPRECATED'
113
+ ]
114
+ };
115
+ /**
116
+ * 默认配置
117
+ */
118
+ exports.defaultConfig = {
119
+ maxRecursionDepth: 1,
120
+ downloadRootPath: './downloads',
121
+ downloadIncludes: true,
122
+ enableCircularReferenceCheck: true,
123
+ concurrentRequestLimit: 10,
124
+ requestInterval: 100,
125
+ recursionFilters: {
126
+ excludeNames: [],
127
+ excludeNamePatterns: []
128
+ }
129
+ };
@@ -0,0 +1,176 @@
1
+ /**
2
+ * 数据库表结构定义
3
+ * 对应 table.json 文件的结构定义
4
+ *
5
+ * @description
6
+ * 此文件包含了 SAP 数据库表、字段、索引的完整结构定义
7
+ * 用于解析和处理从 SAP 系统导出的表结构信息
8
+ */
9
+ /**
10
+ * 数据库表信息结构
11
+ * 对应 table.json 中的 GT_TABLES 节点
12
+ */
13
+ export interface TableInfo {
14
+ /** 索引序号 */
15
+ IDX?: number;
16
+ /** 表名 */
17
+ TABNAME: string;
18
+ /** 表类别 (如 TRANSP: 透明表, POOL: 池表, CLUSTER: 簇表) */
19
+ TABCLASS?: string;
20
+ /** 中文描述 */
21
+ DDTEXT_ZH?: string;
22
+ /** 英文描述 */
23
+ DDTEXT_EN?: string;
24
+ }
25
+ /**
26
+ * 域固定值结构
27
+ * 对应 table.json 中的 GT_FIELDS.IDOMAINS 节点
28
+ */
29
+ export interface DomainValue {
30
+ /** 域名 */
31
+ DOMNAME: string;
32
+ /** 域值下限 (低值) */
33
+ DOMVALUE_L: string;
34
+ /** 域值上限 (高值,用于区间) */
35
+ DOMVALUE_H: string;
36
+ /** 中文描述 */
37
+ DDTEXT_ZH?: string;
38
+ /** 英文描述 */
39
+ DDTEXT_EN?: string;
40
+ }
41
+ /**
42
+ * 数据库表字段信息结构
43
+ * 对应 table.json 中的 GT_FIELDS 节点
44
+ */
45
+ export interface TableField {
46
+ /** 索引序号 */
47
+ IDX?: number;
48
+ /** 表名 */
49
+ TABNAME: string;
50
+ /** 字段名 */
51
+ FIELDNAME: string;
52
+ /** 中文描述 */
53
+ DDTEXT_ZH?: string;
54
+ /** 英文描述 */
55
+ DDTEXT_EN?: string;
56
+ /** 字段在表中的位置 */
57
+ POSITION?: number;
58
+ /** 数据类型 (如 CHAR, NUMC, DATS, CUKY, QUAN等) */
59
+ DATATYPE?: string;
60
+ /** 字段长度 */
61
+ LENG?: number;
62
+ /** 小数位数 (用于数值类型字段) */
63
+ DECIMALS?: number;
64
+ /** 主键标志 (X表示是主键) */
65
+ KEYFLAG?: string;
66
+ /** 辅助键标志 */
67
+ KEYFLAG2?: string;
68
+ /** 必填标志 (X表示必填) */
69
+ MANDATORY?: string;
70
+ /** 备用中文描述 */
71
+ DDTEXT_ZH2?: string;
72
+ /** 检查表 (外键引用的表) */
73
+ CHECKTABLE?: string;
74
+ /** 域名 (Domain) */
75
+ DOMNAME?: string;
76
+ /** 数据元素 (Data Element/Roll Name) */
77
+ ROLLNAME?: string;
78
+ /** 带符号标志 (X表示可以带正负号) */
79
+ SIGNFLAG?: string;
80
+ /** 搜索帮助来源 (Search Help Origin) */
81
+ SHLPORIGIN?: string;
82
+ /** 小写标志 (X表示允许小写) */
83
+ LOWERCASE?: string;
84
+ /** 8位长度的检查表名 */
85
+ CHECKTABLE_8L?: string;
86
+ /** 左侧基数 (外键关系的左侧基数,如 "1" 表示一对一或多对一) */
87
+ CARDLEFT?: string;
88
+ /** 基数 (外键关系的基数标识,如 "N" 表示多, "CN" 表示一或多) */
89
+ CARD?: string;
90
+ /** 域固定值列表 (如枚举值、固定值域) */
91
+ IDOMAINS?: DomainValue[];
92
+ }
93
+ /**
94
+ * 数据库表索引字段结构
95
+ * 对应 table.json 中的 GT_INDEXS.FIELDNAME 节点
96
+ */
97
+ export interface IndexField {
98
+ /** 索引字段名 */
99
+ FIELDNAME: string;
100
+ }
101
+ /**
102
+ * 数据库表索引信息结构
103
+ * 对应 table.json 中的 GT_INDEXS 节点
104
+ */
105
+ export interface TableIndex {
106
+ /** 数据库表名 */
107
+ SQLTAB: string;
108
+ /** 索引名称 */
109
+ INDEXNAME: string;
110
+ /** 索引描述 */
111
+ DDTEXT?: string;
112
+ /** 唯一索引标志 (X表示唯一索引) */
113
+ UNIQUEFLAG?: string;
114
+ /** 索引字段列表 */
115
+ FIELDNAME?: IndexField[];
116
+ }
117
+ /**
118
+ * 数据库表外键信息结构
119
+ * 对应 table.json 中的 GT_FOREIGNKEY 节点
120
+ */
121
+ export interface TableForeignKey {
122
+ /** 表名 (包含外键的表) */
123
+ TABNAME: string;
124
+ /** 字段名 (外键字段) */
125
+ FIELDNAME: string;
126
+ /** 主键位置 */
127
+ PRIMPOS?: number;
128
+ /** 外表名 (Foreign Table,引用的表) */
129
+ FORTABLE?: string;
130
+ /** 外键字段名 (Foreign Key) */
131
+ FORKEY?: string;
132
+ /** 检查表 (Check Table,被引用的主表) */
133
+ CHECKTABLE?: string;
134
+ /** 检查字段 (Check Field,被引用表的字段) */
135
+ CHECKFIELD?: string;
136
+ }
137
+ /**
138
+ * 完整的表结构数据
139
+ * 对应整个 table.json 的顶层结构
140
+ *
141
+ * @description
142
+ * 这是从 SAP 系统导出的完整表结构信息,包含:
143
+ * - GT_TABLES: 表的基本信息
144
+ * - GT_FIELDS: 表的所有字段定义
145
+ * - GT_INDEXS: 表的所有索引定义
146
+ * - GT_FOREIGNKEY: 表的外键关系定义
147
+ */
148
+ export interface TableStructureData {
149
+ /** 表信息列表 */
150
+ GT_TABLES?: TableInfo[];
151
+ /** 字段信息列表 */
152
+ GT_FIELDS?: TableField[];
153
+ /** 索引信息列表 */
154
+ GT_INDEXS?: TableIndex[];
155
+ /** 外键信息列表 */
156
+ GT_FOREIGNKEY?: TableForeignKey[];
157
+ }
158
+ export interface TableData {
159
+ /** 索引序号 */
160
+ IDX?: number;
161
+ /** 表名 */
162
+ TABNAME: string;
163
+ /** 表类别 (如 TRANSP: 透明表, POOL: 池表, CLUSTER: 簇表) */
164
+ TABCLASS?: string;
165
+ /** 中文描述 */
166
+ DDTEXT_ZH?: string;
167
+ /** 英文描述 */
168
+ DDTEXT_EN?: string;
169
+ /** 字段信息列表 */
170
+ GT_FIELDS?: TableField[];
171
+ /** 索引信息列表 */
172
+ GT_INDEXS?: TableIndex[];
173
+ /** 外键信息列表 */
174
+ GT_FOREIGNKEY?: TableForeignKey[];
175
+ }
176
+ //# sourceMappingURL=tableStructures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableStructures.d.ts","sourceRoot":"","sources":["../../src/common/tableStructures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * 数据库表结构定义
4
+ * 对应 table.json 文件的结构定义
5
+ *
6
+ * @description
7
+ * 此文件包含了 SAP 数据库表、字段、索引的完整结构定义
8
+ * 用于解析和处理从 SAP 系统导出的表结构信息
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,104 @@
1
+ /**
2
+ * 队列系统的类型定义
3
+ * 用于 Redis 队列的生产者-消费者模式
4
+ */
5
+ import { AbapObjectData } from './abapStructures';
6
+ /**
7
+ * 任务状态
8
+ */
9
+ export type TaskStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'SKIPPED';
10
+ /**
11
+ * Job 状态
12
+ */
13
+ export type JobStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED';
14
+ /**
15
+ * 任务类型
16
+ */
17
+ export type TaskType = 'DOWNLOAD';
18
+ /**
19
+ * Task(任务)结构
20
+ */
21
+ export interface Task {
22
+ taskId: string;
23
+ jobId: string;
24
+ objectKey: string;
25
+ taskType: TaskType;
26
+ objectType: string;
27
+ objectName: string;
28
+ depth: number;
29
+ priority: number;
30
+ status: TaskStatus;
31
+ retryCount: number;
32
+ maxRetries: number;
33
+ createdAt: Date;
34
+ startedAt?: Date;
35
+ completedAt?: Date;
36
+ metadata: {
37
+ cacheKey: string;
38
+ dependencyCount: number;
39
+ downloadPath?: string;
40
+ };
41
+ error?: string;
42
+ workerId?: string;
43
+ }
44
+ /**
45
+ * Job(查询任务)结构
46
+ */
47
+ export interface Job {
48
+ jobId: string;
49
+ rootObjectType: string;
50
+ rootObjectName: string;
51
+ config: any;
52
+ status: JobStatus;
53
+ totalTasks: number;
54
+ completedTasks: number;
55
+ failedTasks: number;
56
+ skippedTasks: number;
57
+ createdAt: Date;
58
+ startedAt?: Date;
59
+ completedAt?: Date;
60
+ result?: any;
61
+ errors: string[];
62
+ }
63
+ /**
64
+ * 缓存的对象数据
65
+ * 现在与 AbapObjectData 完全一致,使用类型别名保持语义清晰
66
+ */
67
+ export type CachedObjectData = AbapObjectData;
68
+ /**
69
+ * Redis Key 命名规范
70
+ */
71
+ export declare const RedisKeys: {
72
+ TASK_QUEUE: (jobId: string) => string;
73
+ TASK: (taskId: string) => string;
74
+ JOB: (jobId: string) => string;
75
+ JOB_TASKS: (jobId: string) => string;
76
+ JOB_INDEX: string;
77
+ CACHE: (jobId: string, objectKey: string) => string;
78
+ VISITED: (jobId: string) => string;
79
+ PROGRESS: (jobId: string) => string;
80
+ QUEUE_SIZE: (jobId: string) => string;
81
+ WORKERS: string;
82
+ WORKER_HEARTBEAT: (workerId: string) => string;
83
+ };
84
+ /**
85
+ * Job 进度信息
86
+ */
87
+ export interface JobProgress {
88
+ totalTasks: number;
89
+ completedTasks: number;
90
+ failedTasks: number;
91
+ skippedTasks: number;
92
+ percentage: number;
93
+ estimatedTimeRemaining?: number;
94
+ averageTaskDuration?: number;
95
+ lastUpdateTime: Date;
96
+ }
97
+ /**
98
+ * 依赖关系
99
+ */
100
+ export interface Dependency {
101
+ objectType: string;
102
+ objectName: string;
103
+ }
104
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAErF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,IAAI;IAEjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAGlB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IAGnB,QAAQ,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IAGF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IAGd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC;IAGZ,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IAGnB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,SAAS;wBAEE,MAAM;mBAGX,MAAM;iBAGR,MAAM;uBACA,MAAM;;mBAIV,MAAM,aAAa,MAAM;qBAIvB,MAAM;sBAGL,MAAM;wBAGJ,MAAM;;iCAIG,MAAM;CAEtC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * 队列系统的类型定义
4
+ * 用于 Redis 队列的生产者-消费者模式
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RedisKeys = void 0;
8
+ /**
9
+ * Redis Key 命名规范
10
+ */
11
+ exports.RedisKeys = {
12
+ // === 任务队列(按Job隔离)===
13
+ TASK_QUEUE: (jobId) => `abap:queue:tasks:${jobId}`, // Sorted Set ⚠️ 按Job隔离
14
+ // === 单个任务详情 ===
15
+ TASK: (taskId) => `abap:task:${taskId}`, // Hash
16
+ // === Job 状态 ===
17
+ JOB: (jobId) => `abap:job:${jobId}`, // Hash
18
+ JOB_TASKS: (jobId) => `abap:job:${jobId}:tasks`, // Set
19
+ JOB_INDEX: 'abap:job:index', // ZSet
20
+ // === 对象缓存 ===
21
+ CACHE: (jobId, objectKey) => `abap:cache:${jobId}:${objectKey}`, // String (gzip)
22
+ // === 去重集合 ===
23
+ VISITED: (jobId) => `abap:job:${jobId}:visited`, // Set
24
+ // === 进度追踪 ===
25
+ PROGRESS: (jobId) => `abap:job:${jobId}:progress`, // Hash
26
+ // === 队列监控 ===
27
+ QUEUE_SIZE: (jobId) => `abap:queue:size:${jobId}`, // String (计数器)
28
+ // === Worker 管理 ===
29
+ WORKERS: 'abap:workers', // Hash
30
+ WORKER_HEARTBEAT: (workerId) => `abap:worker:${workerId}:heartbeat`, // String
31
+ };
@@ -0,0 +1,57 @@
1
+ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
2
+ import axios from 'axios';
3
+ import { AxiosResponse } from 'axios';
4
+ export interface SapConfig {
5
+ url: string;
6
+ username: string;
7
+ password: string;
8
+ client: string;
9
+ }
10
+ export { McpError, ErrorCode, AxiosResponse };
11
+ /**
12
+ * 从环境变量获取 SAP 配置
13
+ */
14
+ export declare function getConfig(): SapConfig;
15
+ export declare function return_response(response: AxiosResponse): {
16
+ isError: boolean;
17
+ content: {
18
+ type: string;
19
+ text: any;
20
+ }[];
21
+ };
22
+ export declare function return_error(error: any): {
23
+ isError: boolean;
24
+ content: {
25
+ type: string;
26
+ text: string;
27
+ }[];
28
+ };
29
+ export declare function createAxiosInstance(): axios.AxiosInstance;
30
+ export declare function getBaseUrl(): Promise<Buffer<ArrayBuffer>>;
31
+ export declare function getAuthHeaders(): Promise<{
32
+ Authorization: string;
33
+ 'SAP-Client': string;
34
+ }>;
35
+ /**
36
+ * XML转义函数 - 将特殊字符转换为XML实体
37
+ */
38
+ export declare function escapeXml(text: string): string;
39
+ /**
40
+ * 对象名称转义函数 - 将特殊字符转换为文件系统安全的字符
41
+ *
42
+ * 转义规则:
43
+ * - 斜杠 (/, \) -> 下划线 (_)
44
+ * - 尖括号 (<, >) -> 井号 (#)
45
+ * - 其他非字母数字字符 -> 下划线 (_)
46
+ *
47
+ * @param name - 原始对象名称
48
+ * @returns 转义后的安全名称
49
+ *
50
+ * @example
51
+ * sanitizeObjectName('SAPLMEGUI') // 'SAPLMEGUI'
52
+ * sanitizeObjectName('OBJECT/NAME') // 'OBJECT_NAME'
53
+ * sanitizeObjectName('OBJECT<TYPE>') // 'OBJECT#TYPE#'
54
+ */
55
+ export declare function sanitizeObjectName(name: string): string;
56
+ export declare function makeAdtRequest(url: string, method: string, timeout: number, data?: any, params?: any): Promise<any>;
57
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/common/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,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAE9C;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAerC;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa;;;;;;EAQtD;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG;;;;;;EAUtC;AAGD,wBAAgB,mBAAmB,wBASlC;AAOD,wBAAsB,UAAU,iCAa/B;AAED,wBAAsB,cAAc;;;GAUnC;AAyCD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;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"}