@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.
- package/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/cli/consumer-cli.d.ts +8 -0
- package/dist/cli/consumer-cli.d.ts.map +1 -0
- package/dist/cli/consumer-cli.js +180 -0
- package/dist/cli/producer-cli.d.ts +8 -0
- package/dist/cli/producer-cli.d.ts.map +1 -0
- package/dist/cli/producer-cli.js +249 -0
- package/dist/cli/query-object.d.ts +3 -0
- package/dist/cli/query-object.d.ts.map +1 -0
- package/dist/cli/query-object.js +486 -0
- package/dist/common/FilterCache.d.ts +62 -0
- package/dist/common/FilterCache.d.ts.map +1 -0
- package/dist/common/FilterCache.js +119 -0
- package/dist/common/RedisQueueManager.d.ts +170 -0
- package/dist/common/RedisQueueManager.d.ts.map +1 -0
- package/dist/common/RedisQueueManager.js +663 -0
- package/dist/common/abapStructures.d.ts +391 -0
- package/dist/common/abapStructures.d.ts.map +1 -0
- package/dist/common/abapStructures.js +2 -0
- package/dist/common/config.d.ts +66 -0
- package/dist/common/config.d.ts.map +1 -0
- package/dist/common/config.js +56 -0
- package/dist/common/index.d.ts +13 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +38 -0
- package/dist/common/recursiveQueryConfig.d.ts +77 -0
- package/dist/common/recursiveQueryConfig.d.ts.map +1 -0
- package/dist/common/recursiveQueryConfig.js +129 -0
- package/dist/common/tableStructures.d.ts +176 -0
- package/dist/common/tableStructures.d.ts.map +1 -0
- package/dist/common/tableStructures.js +10 -0
- package/dist/common/types.d.ts +104 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +31 -0
- package/dist/common/utils.d.ts +57 -0
- package/dist/common/utils.d.ts.map +1 -0
- package/dist/common/utils.js +300 -0
- package/dist/consumer/FileDownloadConsumer.d.ts +127 -0
- package/dist/consumer/FileDownloadConsumer.d.ts.map +1 -0
- package/dist/consumer/FileDownloadConsumer.js +1003 -0
- package/dist/consumer/generators/baseGenerator.d.ts +38 -0
- package/dist/consumer/generators/baseGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/baseGenerator.js +103 -0
- package/dist/consumer/generators/domainGenerator.d.ts +78 -0
- package/dist/consumer/generators/domainGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/domainGenerator.js +241 -0
- package/dist/consumer/generators/guiStatusGenerator.d.ts +16 -0
- package/dist/consumer/generators/guiStatusGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/guiStatusGenerator.js +48 -0
- package/dist/consumer/generators/guiTitleGenerator.d.ts +16 -0
- package/dist/consumer/generators/guiTitleGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/guiTitleGenerator.js +48 -0
- package/dist/consumer/generators/index.d.ts +14 -0
- package/dist/consumer/generators/index.d.ts.map +1 -0
- package/dist/consumer/generators/index.js +38 -0
- package/dist/consumer/generators/messageGenerator.d.ts +16 -0
- package/dist/consumer/generators/messageGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/messageGenerator.js +73 -0
- package/dist/consumer/generators/metadataGenerator.d.ts +29 -0
- package/dist/consumer/generators/metadataGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/metadataGenerator.js +135 -0
- package/dist/consumer/generators/screenGenerator.d.ts +173 -0
- package/dist/consumer/generators/screenGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/screenGenerator.js +859 -0
- package/dist/consumer/generators/structureGenerator.d.ts +36 -0
- package/dist/consumer/generators/structureGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/structureGenerator.js +131 -0
- package/dist/consumer/generators/textElementGenerator.d.ts +16 -0
- package/dist/consumer/generators/textElementGenerator.d.ts.map +1 -0
- package/dist/consumer/generators/textElementGenerator.js +70 -0
- package/dist/consumer/handlers/handleGetClass.d.ts +8 -0
- package/dist/consumer/handlers/handleGetClass.d.ts.map +1 -0
- package/dist/consumer/handlers/handleGetClass.js +18 -0
- package/dist/consumer/handlers/handleGetFunction.d.ts +8 -0
- package/dist/consumer/handlers/handleGetFunction.d.ts.map +1 -0
- package/dist/consumer/handlers/handleGetFunction.js +19 -0
- package/dist/consumer/handlers/handleGetFunctionGroup.d.ts +8 -0
- package/dist/consumer/handlers/handleGetFunctionGroup.d.ts.map +1 -0
- package/dist/consumer/handlers/handleGetFunctionGroup.js +19 -0
- package/dist/consumer/handlers/handleGetInclude.d.ts +8 -0
- package/dist/consumer/handlers/handleGetInclude.d.ts.map +1 -0
- package/dist/consumer/handlers/handleGetInclude.js +18 -0
- package/dist/consumer/handlers/handleGetProgram.d.ts +8 -0
- package/dist/consumer/handlers/handleGetProgram.d.ts.map +1 -0
- package/dist/consumer/handlers/handleGetProgram.js +27 -0
- package/dist/consumer/handlers/handleZTableQuery.d.ts +8 -0
- package/dist/consumer/handlers/handleZTableQuery.d.ts.map +1 -0
- package/dist/consumer/handlers/handleZTableQuery.js +20 -0
- package/dist/consumer/handlers/index.d.ts +10 -0
- package/dist/consumer/handlers/index.d.ts.map +1 -0
- package/dist/consumer/handlers/index.js +27 -0
- package/dist/consumer/index.d.ts +9 -0
- package/dist/consumer/index.d.ts.map +1 -0
- package/dist/consumer/index.js +24 -0
- package/dist/consumer/utils/download.d.ts +13 -0
- package/dist/consumer/utils/download.d.ts.map +1 -0
- package/dist/consumer/utils/download.js +38 -0
- package/dist/consumer/utils/index.d.ts +5 -0
- package/dist/consumer/utils/index.d.ts.map +1 -0
- package/dist/consumer/utils/index.js +20 -0
- package/dist/handlers/handleGetClass.d.ts +8 -0
- package/dist/handlers/handleGetClass.d.ts.map +1 -0
- package/dist/handlers/handleGetClass.js +19 -0
- package/dist/handlers/handleGetFunction.d.ts +8 -0
- package/dist/handlers/handleGetFunction.d.ts.map +1 -0
- package/dist/handlers/handleGetFunction.js +20 -0
- package/dist/handlers/handleGetFunctionGroup.d.ts +8 -0
- package/dist/handlers/handleGetFunctionGroup.d.ts.map +1 -0
- package/dist/handlers/handleGetFunctionGroup.js +19 -0
- package/dist/handlers/handleGetInclude.d.ts +8 -0
- package/dist/handlers/handleGetInclude.d.ts.map +1 -0
- package/dist/handlers/handleGetInclude.js +19 -0
- package/dist/handlers/handleGetInterface.d.ts +8 -0
- package/dist/handlers/handleGetInterface.d.ts.map +1 -0
- package/dist/handlers/handleGetInterface.js +19 -0
- package/dist/handlers/handleGetPackage.d.ts +8 -0
- package/dist/handlers/handleGetPackage.d.ts.map +1 -0
- package/dist/handlers/handleGetPackage.js +42 -0
- package/dist/handlers/handleGetProgram.d.ts +8 -0
- package/dist/handlers/handleGetProgram.d.ts.map +1 -0
- package/dist/handlers/handleGetProgram.js +19 -0
- package/dist/handlers/handleGetStructure.d.ts +8 -0
- package/dist/handlers/handleGetStructure.d.ts.map +1 -0
- package/dist/handlers/handleGetStructure.js +19 -0
- package/dist/handlers/handleGetTable.d.ts +8 -0
- package/dist/handlers/handleGetTable.d.ts.map +1 -0
- package/dist/handlers/handleGetTable.js +19 -0
- package/dist/handlers/handleGetTableContents.d.ts +8 -0
- package/dist/handlers/handleGetTableContents.d.ts.map +1 -0
- package/dist/handlers/handleGetTableContents.js +22 -0
- package/dist/handlers/handleGetTransaction.d.ts +8 -0
- package/dist/handlers/handleGetTransaction.d.ts.map +1 -0
- package/dist/handlers/handleGetTransaction.js +19 -0
- package/dist/handlers/handleGetTypeInfo.d.ts +8 -0
- package/dist/handlers/handleGetTypeInfo.d.ts.map +1 -0
- package/dist/handlers/handleGetTypeInfo.js +32 -0
- package/dist/handlers/handleSearchObject.d.ts +8 -0
- package/dist/handlers/handleSearchObject.d.ts.map +1 -0
- package/dist/handlers/handleSearchObject.js +20 -0
- package/dist/handlers/handleZObjectQuery.d.ts +8 -0
- package/dist/handlers/handleZObjectQuery.d.ts.map +1 -0
- package/dist/handlers/handleZObjectQuery.js +25 -0
- package/dist/handlers/handleZTableQuery.d.ts +8 -0
- package/dist/handlers/handleZTableQuery.d.ts.map +1 -0
- package/dist/handlers/handleZTableQuery.js +20 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/lib/download.d.ts +49 -0
- package/dist/lib/download.d.ts.map +1 -0
- package/dist/lib/download.js +78 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +23 -0
- package/dist/lib/utils.d.ts +31 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +272 -0
- package/dist/producer/RecursiveQueryProducer.d.ts +92 -0
- package/dist/producer/RecursiveQueryProducer.d.ts.map +1 -0
- package/dist/producer/RecursiveQueryProducer.js +496 -0
- package/dist/producer/handlers/handleZObjectQuery.d.ts +8 -0
- package/dist/producer/handlers/handleZObjectQuery.d.ts.map +1 -0
- package/dist/producer/handlers/handleZObjectQuery.js +24 -0
- package/dist/producer/handlers/index.d.ts +6 -0
- package/dist/producer/handlers/index.d.ts.map +1 -0
- package/dist/producer/handlers/index.js +21 -0
- package/dist/producer/index.d.ts +7 -0
- package/dist/producer/index.d.ts.map +1 -0
- package/dist/producer/index.js +22 -0
- package/dist/recursive/abapStructures.d.ts +377 -0
- package/dist/recursive/abapStructures.d.ts.map +1 -0
- package/dist/recursive/abapStructures.js +2 -0
- package/dist/recursive/generate/baseGenerator.d.ts +34 -0
- package/dist/recursive/generate/baseGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/baseGenerator.js +112 -0
- package/dist/recursive/generate/domainGenerator.d.ts +26 -0
- package/dist/recursive/generate/domainGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/domainGenerator.js +128 -0
- package/dist/recursive/generate/functionGroupGenerator.d.ts +30 -0
- package/dist/recursive/generate/functionGroupGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/functionGroupGenerator.js +90 -0
- package/dist/recursive/generate/index.d.ts +12 -0
- package/dist/recursive/generate/index.d.ts.map +1 -0
- package/dist/recursive/generate/index.js +34 -0
- package/dist/recursive/generate/messageGenerator.d.ts +16 -0
- package/dist/recursive/generate/messageGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/messageGenerator.js +73 -0
- package/dist/recursive/generate/screenGenerator.d.ts +173 -0
- package/dist/recursive/generate/screenGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/screenGenerator.js +858 -0
- package/dist/recursive/generate/structureGenerator.d.ts +22 -0
- package/dist/recursive/generate/structureGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/structureGenerator.js +88 -0
- package/dist/recursive/generate/textElementGenerator.d.ts +16 -0
- package/dist/recursive/generate/textElementGenerator.d.ts.map +1 -0
- package/dist/recursive/generate/textElementGenerator.js +68 -0
- package/dist/recursive/handleRecursiveObjectQuery.d.ts +94 -0
- package/dist/recursive/handleRecursiveObjectQuery.d.ts.map +1 -0
- package/dist/recursive/handleRecursiveObjectQuery.js +219 -0
- package/dist/recursive/recursiveObjectQuery.d.ts +159 -0
- package/dist/recursive/recursiveObjectQuery.d.ts.map +1 -0
- package/dist/recursive/recursiveObjectQuery.js +1358 -0
- package/dist/recursive/recursiveQueryConfig.d.ts +129 -0
- package/dist/recursive/recursiveQueryConfig.d.ts.map +1 -0
- package/dist/recursive/recursiveQueryConfig.js +133 -0
- package/dist/recursive/tableStructures.d.ts +196 -0
- package/dist/recursive/tableStructures.d.ts.map +1 -0
- package/dist/recursive/tableStructures.js +10 -0
- 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"}
|