@mcp-abap-adt/core 6.5.0 → 6.7.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/CHANGELOG.md +34 -0
- package/README.md +8 -1
- package/dist/handlers/system/readonly/handleRuntimeRunClass.d.ts +111 -0
- package/dist/handlers/system/readonly/handleRuntimeRunClass.d.ts.map +1 -0
- package/dist/handlers/system/readonly/handleRuntimeRunClass.js +141 -0
- package/dist/handlers/system/readonly/handleRuntimeRunClass.js.map +1 -0
- package/dist/handlers/system/readonly/handleRuntimeRunClassWithProfiling.d.ts +22 -1
- package/dist/handlers/system/readonly/handleRuntimeRunClassWithProfiling.d.ts.map +1 -1
- package/dist/handlers/system/readonly/handleRuntimeRunClassWithProfiling.js +32 -1
- package/dist/handlers/system/readonly/handleRuntimeRunClassWithProfiling.js.map +1 -1
- package/dist/handlers/system/readonly/handleRuntimeRunProgram.d.ts +90 -0
- package/dist/handlers/system/readonly/handleRuntimeRunProgram.d.ts.map +1 -0
- package/dist/handlers/system/readonly/handleRuntimeRunProgram.js +109 -0
- package/dist/handlers/system/readonly/handleRuntimeRunProgram.js.map +1 -0
- package/dist/handlers/system/readonly/handleRuntimeRunProgramWithProfiling.d.ts +1 -1
- package/dist/handlers/system/readonly/handleRuntimeRunProgramWithProfiling.js +1 -1
- package/dist/handlers/system/readonly/handleRuntimeRunProgramWithProfiling.js.map +1 -1
- package/dist/handlers/system/readonly/handleSearchSource.d.ts +40 -0
- package/dist/handlers/system/readonly/handleSearchSource.d.ts.map +1 -0
- package/dist/handlers/system/readonly/handleSearchSource.js +127 -0
- package/dist/handlers/system/readonly/handleSearchSource.js.map +1 -0
- package/dist/lib/handlers/groups/SearchHandlersGroup.d.ts.map +1 -1
- package/dist/lib/handlers/groups/SearchHandlersGroup.js +5 -0
- package/dist/lib/handlers/groups/SearchHandlersGroup.js.map +1 -1
- package/dist/lib/handlers/groups/SystemHandlersGroup.d.ts.map +1 -1
- package/dist/lib/handlers/groups/SystemHandlersGroup.js +10 -0
- package/dist/lib/handlers/groups/SystemHandlersGroup.js.map +1 -1
- package/dist/lib/search-source/lineScanner.d.ts +17 -0
- package/dist/lib/search-source/lineScanner.d.ts.map +1 -0
- package/dist/lib/search-source/lineScanner.js +51 -0
- package/dist/lib/search-source/lineScanner.js.map +1 -0
- package/dist/lib/search-source/orchestrator.d.ts +51 -0
- package/dist/lib/search-source/orchestrator.d.ts.map +1 -0
- package/dist/lib/search-source/orchestrator.js +158 -0
- package/dist/lib/search-source/orchestrator.js.map +1 -0
- package/dist/lib/search-source/packageEnumerator.d.ts +25 -0
- package/dist/lib/search-source/packageEnumerator.d.ts.map +1 -0
- package/dist/lib/search-source/packageEnumerator.js +0 -0
- package/dist/lib/search-source/packageEnumerator.js.map +1 -0
- package/dist/lib/search-source/sourceReader.d.ts +25 -0
- package/dist/lib/search-source/sourceReader.d.ts.map +1 -0
- package/dist/lib/search-source/sourceReader.js +128 -0
- package/dist/lib/search-source/sourceReader.js.map +1 -0
- package/docs/user-guide/AVAILABLE_TOOLS.md +77 -5
- package/docs/user-guide/AVAILABLE_TOOLS_COMPACT.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_HIGH.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_LEGACY.md +21 -3
- package/docs/user-guide/AVAILABLE_TOOLS_LOW.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_READONLY.md +76 -4
- package/package.json +3 -3
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSearchSource = runSearchSource;
|
|
4
|
+
exports.runSearchSourceWithContext = runSearchSourceWithContext;
|
|
5
|
+
const lineScanner_1 = require("./lineScanner");
|
|
6
|
+
const packageEnumerator_1 = require("./packageEnumerator");
|
|
7
|
+
const sourceReader_1 = require("./sourceReader");
|
|
8
|
+
const DEFAULTS = {
|
|
9
|
+
include_subpackages: true,
|
|
10
|
+
object_types: ['PROG', 'FUGR', 'CLAS'],
|
|
11
|
+
exclude_comments: false,
|
|
12
|
+
max_hits_per_object: 1,
|
|
13
|
+
emit_no_hits: false,
|
|
14
|
+
max_objects: 500,
|
|
15
|
+
concurrency: 8,
|
|
16
|
+
version: 'active',
|
|
17
|
+
};
|
|
18
|
+
async function runWithLimit(items, limit, worker) {
|
|
19
|
+
let next = 0;
|
|
20
|
+
async function pump() {
|
|
21
|
+
while (true) {
|
|
22
|
+
const idx = next++;
|
|
23
|
+
if (idx >= items.length)
|
|
24
|
+
return;
|
|
25
|
+
await worker(items[idx]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const n = Math.max(1, Math.min(limit, items.length));
|
|
29
|
+
await Promise.all(Array.from({ length: n }, () => pump()));
|
|
30
|
+
}
|
|
31
|
+
async function runSearchSource(deps, input) {
|
|
32
|
+
if (!input.query || input.query.length === 0) {
|
|
33
|
+
throw new Error('query must be a non-empty string');
|
|
34
|
+
}
|
|
35
|
+
if (!input.packages || input.packages.length === 0) {
|
|
36
|
+
throw new Error('packages must contain at least one entry');
|
|
37
|
+
}
|
|
38
|
+
if (input.exclude && input.exclude.length > 3) {
|
|
39
|
+
throw new Error('exclude may not contain more than 3 entries');
|
|
40
|
+
}
|
|
41
|
+
const maxHits = input.max_hits_per_object ?? DEFAULTS.max_hits_per_object;
|
|
42
|
+
const maxObjects = input.max_objects ?? DEFAULTS.max_objects;
|
|
43
|
+
const concurrency = Math.min(16, Math.max(1, input.concurrency ?? DEFAULTS.concurrency));
|
|
44
|
+
const emitNoHits = input.emit_no_hits ?? DEFAULTS.emit_no_hits;
|
|
45
|
+
const version = input.version ?? DEFAULTS.version;
|
|
46
|
+
const enumerateInput = {
|
|
47
|
+
packages: input.packages,
|
|
48
|
+
include_subpackages: input.include_subpackages ?? DEFAULTS.include_subpackages,
|
|
49
|
+
object_filter: input.object_filter,
|
|
50
|
+
object_types: input.object_types ?? DEFAULTS.object_types,
|
|
51
|
+
};
|
|
52
|
+
const allTargets = await (0, packageEnumerator_1.enumerateScanTargets)(deps.fetchPackageContents, enumerateInput);
|
|
53
|
+
const truncatedByMaxObjects = allTargets.length > maxObjects;
|
|
54
|
+
const targets = truncatedByMaxObjects
|
|
55
|
+
? allTargets.slice(0, maxObjects)
|
|
56
|
+
: allTargets;
|
|
57
|
+
const allHits = [];
|
|
58
|
+
const noHits = [];
|
|
59
|
+
let sourcesScanned = 0;
|
|
60
|
+
let truncatedByObjectCap = false;
|
|
61
|
+
await runWithLimit(targets, concurrency, async (target) => {
|
|
62
|
+
let totalForTarget = 0;
|
|
63
|
+
let capHitForTarget = false;
|
|
64
|
+
const targetHits = [];
|
|
65
|
+
for await (const unit of (0, sourceReader_1.readSourceUnits)(deps.sourceReader, target, version)) {
|
|
66
|
+
sourcesScanned++;
|
|
67
|
+
const remaining = maxHits - totalForTarget;
|
|
68
|
+
if (remaining <= 0) {
|
|
69
|
+
const probe = (0, lineScanner_1.scanLines)(unit.lines, {
|
|
70
|
+
query: input.query,
|
|
71
|
+
query2: input.query2,
|
|
72
|
+
exclude: input.exclude,
|
|
73
|
+
exclude_comments: input.exclude_comments,
|
|
74
|
+
max_hits: 1,
|
|
75
|
+
});
|
|
76
|
+
if (probe.hits.length > 0) {
|
|
77
|
+
capHitForTarget = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const scan = (0, lineScanner_1.scanLines)(unit.lines, {
|
|
83
|
+
query: input.query,
|
|
84
|
+
query2: input.query2,
|
|
85
|
+
exclude: input.exclude,
|
|
86
|
+
exclude_comments: input.exclude_comments,
|
|
87
|
+
max_hits: remaining,
|
|
88
|
+
});
|
|
89
|
+
for (const h of scan.hits) {
|
|
90
|
+
targetHits.push({
|
|
91
|
+
devclass: target.devclass,
|
|
92
|
+
object_type: target.object_type,
|
|
93
|
+
object_name: target.object_name,
|
|
94
|
+
include: unit.include,
|
|
95
|
+
line: h.line,
|
|
96
|
+
snippet: h.snippet,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
totalForTarget += scan.hits.length;
|
|
100
|
+
if (scan.capped) {
|
|
101
|
+
capHitForTarget = true;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (capHitForTarget)
|
|
106
|
+
truncatedByObjectCap = true;
|
|
107
|
+
if (targetHits.length === 0 && emitNoHits) {
|
|
108
|
+
noHits.push({
|
|
109
|
+
devclass: target.devclass,
|
|
110
|
+
object_type: target.object_type,
|
|
111
|
+
object_name: target.object_name,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
allHits.push(...targetHits);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
allHits.sort((a, b) => {
|
|
119
|
+
if (a.devclass !== b.devclass)
|
|
120
|
+
return a.devclass < b.devclass ? -1 : 1;
|
|
121
|
+
if (a.object_name !== b.object_name)
|
|
122
|
+
return a.object_name < b.object_name ? -1 : 1;
|
|
123
|
+
if (a.include !== b.include)
|
|
124
|
+
return a.include < b.include ? -1 : 1;
|
|
125
|
+
return a.line - b.line;
|
|
126
|
+
});
|
|
127
|
+
if (emitNoHits) {
|
|
128
|
+
noHits.sort((a, b) => {
|
|
129
|
+
if (a.devclass !== b.devclass)
|
|
130
|
+
return a.devclass < b.devclass ? -1 : 1;
|
|
131
|
+
if (a.object_type !== b.object_type)
|
|
132
|
+
return a.object_type < b.object_type ? -1 : 1;
|
|
133
|
+
return a.object_name < b.object_name ? -1 : 1;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const result = {
|
|
137
|
+
results: allHits,
|
|
138
|
+
scanned: {
|
|
139
|
+
packages: input.packages.length,
|
|
140
|
+
objects: targets.length,
|
|
141
|
+
sources: sourcesScanned,
|
|
142
|
+
},
|
|
143
|
+
truncated: {
|
|
144
|
+
by_object_cap: truncatedByObjectCap,
|
|
145
|
+
by_max_objects: truncatedByMaxObjects,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
if (emitNoHits)
|
|
149
|
+
result.no_hits = noHits;
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
function runSearchSourceWithContext(ctx, input) {
|
|
153
|
+
return runSearchSource({
|
|
154
|
+
fetchPackageContents: (0, packageEnumerator_1.createPackageContentsFetcher)(ctx),
|
|
155
|
+
sourceReader: (0, sourceReader_1.createSourceReaderDeps)(ctx),
|
|
156
|
+
}, input);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/search-source/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HandlerContext } from '../handlers/interfaces';
|
|
2
|
+
export type ScanObjectType = 'PROG' | 'FUGR' | 'CLAS';
|
|
3
|
+
export interface PackageContentItem {
|
|
4
|
+
name: string;
|
|
5
|
+
adtType: string;
|
|
6
|
+
packageName: string;
|
|
7
|
+
isPackage: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface EnumeratedObject {
|
|
10
|
+
devclass: string;
|
|
11
|
+
object_type: ScanObjectType;
|
|
12
|
+
object_name: string;
|
|
13
|
+
}
|
|
14
|
+
export interface EnumerateInput {
|
|
15
|
+
packages: string[];
|
|
16
|
+
include_subpackages: boolean;
|
|
17
|
+
object_filter?: string;
|
|
18
|
+
object_types: readonly ScanObjectType[];
|
|
19
|
+
}
|
|
20
|
+
export type PackageContentsFetcher = (packageName: string, options: {
|
|
21
|
+
includeSubpackages: boolean;
|
|
22
|
+
}) => Promise<PackageContentItem[]>;
|
|
23
|
+
export declare function enumerateScanTargets(fetch: PackageContentsFetcher, input: EnumerateInput): Promise<EnumeratedObject[]>;
|
|
24
|
+
export declare function createPackageContentsFetcher(ctx: HandlerContext): PackageContentsFetcher;
|
|
25
|
+
//# sourceMappingURL=packageEnumerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageEnumerator.d.ts","sourceRoot":"","sources":["../../../src/lib/search-source/packageEnumerator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,kBAAkB,EAAE,OAAO,CAAA;CAAE,KACrC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAkBnC,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoC7B;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,cAAc,GAClB,sBAAsB,CAOxB"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageEnumerator.js","sourceRoot":"","sources":["../../../src/lib/search-source/packageEnumerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HandlerContext } from '../handlers/interfaces';
|
|
2
|
+
import type { EnumeratedObject } from './packageEnumerator';
|
|
3
|
+
export type SourceVersion = 'active' | 'inactive';
|
|
4
|
+
export interface SourceUnit {
|
|
5
|
+
include: string;
|
|
6
|
+
lines: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface FugrChild {
|
|
9
|
+
objecttype: string;
|
|
10
|
+
objectname: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ReadSourceUnitsDeps {
|
|
13
|
+
readProgram(programName: string, version: SourceVersion): Promise<string | null>;
|
|
14
|
+
readInclude(includeName: string): Promise<string | null>;
|
|
15
|
+
readClassMain(className: string, version: SourceVersion): Promise<string | null>;
|
|
16
|
+
fetchFugrStructure(fugrName: string): Promise<FugrChild[]>;
|
|
17
|
+
readFugrFm(fugrName: string, fmName: string): Promise<string | null>;
|
|
18
|
+
logger?: {
|
|
19
|
+
debug?: (msg: string) => void;
|
|
20
|
+
warn?: (msg: string) => void;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function readSourceUnits(deps: ReadSourceUnitsDeps, target: EnumeratedObject, version?: SourceVersion): AsyncGenerator<SourceUnit>;
|
|
24
|
+
export declare function createSourceReaderDeps(ctx: HandlerContext): ReadSourceUnitsDeps;
|
|
25
|
+
//# sourceMappingURL=sourceReader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceReader.d.ts","sourceRoot":"","sources":["../../../src/lib/search-source/sourceReader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,qBAAqB,CAAC;AAE5E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CACT,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC1E;AA+BD,wBAAuB,eAAe,CACpC,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,aAAwB,GAChC,cAAc,CAAC,UAAU,CAAC,CA+D5B;AA6BD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,cAAc,GAClB,mBAAmB,CAuCrB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readSourceUnits = readSourceUnits;
|
|
4
|
+
exports.createSourceReaderDeps = createSourceReaderDeps;
|
|
5
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
6
|
+
const clients_1 = require("../clients");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
function splitLines(text) {
|
|
9
|
+
return text.split(/\r?\n/);
|
|
10
|
+
}
|
|
11
|
+
async function safe(op, logger, desc) {
|
|
12
|
+
try {
|
|
13
|
+
return await op();
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
logger?.debug?.(`[search-source] ${desc} failed: ${e?.message ?? e}`);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isViewFm(name) {
|
|
21
|
+
return name.length >= 4 && name.slice(0, 4).toUpperCase() === 'VIEW';
|
|
22
|
+
}
|
|
23
|
+
function sortFugrChildren(children) {
|
|
24
|
+
return [...children].sort((a, b) => {
|
|
25
|
+
if (a.objecttype !== b.objecttype)
|
|
26
|
+
return a.objecttype < b.objecttype ? -1 : 1;
|
|
27
|
+
return a.objectname < b.objectname ? -1 : 1;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function* readSourceUnits(deps, target, version = 'active') {
|
|
31
|
+
const logger = deps.logger;
|
|
32
|
+
switch (target.object_type) {
|
|
33
|
+
case 'PROG': {
|
|
34
|
+
const src = await safe(() => deps.readProgram(target.object_name, version), logger, `read PROG ${target.object_name}`);
|
|
35
|
+
if (src !== null && src !== undefined) {
|
|
36
|
+
yield { include: target.object_name, lines: splitLines(src) };
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
case 'CLAS': {
|
|
41
|
+
const src = await safe(() => deps.readClassMain(target.object_name, version), logger, `read CLAS ${target.object_name}`);
|
|
42
|
+
if (src !== null && src !== undefined) {
|
|
43
|
+
yield { include: target.object_name, lines: splitLines(src) };
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
case 'FUGR': {
|
|
48
|
+
const children = await safe(() => deps.fetchFugrStructure(target.object_name), logger, `fetch FUGR structure ${target.object_name}`);
|
|
49
|
+
if (!children)
|
|
50
|
+
return;
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
const filtered = [];
|
|
53
|
+
for (const c of children) {
|
|
54
|
+
if (c.objecttype === 'FUGR/FF' && isViewFm(c.objectname))
|
|
55
|
+
continue;
|
|
56
|
+
if (!c.objecttype.startsWith('FUGR/'))
|
|
57
|
+
continue;
|
|
58
|
+
const key = `${c.objecttype}|${c.objectname}`;
|
|
59
|
+
if (seen.has(key))
|
|
60
|
+
continue;
|
|
61
|
+
seen.add(key);
|
|
62
|
+
filtered.push(c);
|
|
63
|
+
}
|
|
64
|
+
const ordered = sortFugrChildren(filtered);
|
|
65
|
+
for (const c of ordered) {
|
|
66
|
+
const src = c.objecttype === 'FUGR/FF'
|
|
67
|
+
? await safe(() => deps.readFugrFm(target.object_name, c.objectname), logger, `read FUGR/FF ${target.object_name}/${c.objectname}`)
|
|
68
|
+
: await safe(() => deps.readInclude(c.objectname), logger, `read FUGR include ${c.objectname}`);
|
|
69
|
+
if (src !== null && src !== undefined) {
|
|
70
|
+
yield { include: c.objectname, lines: splitLines(src) };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function parseFugrChildrenFromXml(xml) {
|
|
78
|
+
const parser = new fast_xml_parser_1.XMLParser({
|
|
79
|
+
ignoreAttributes: false,
|
|
80
|
+
attributeNamePrefix: '',
|
|
81
|
+
});
|
|
82
|
+
const parsed = parser.parse(xml);
|
|
83
|
+
let nodes = parsed?.['projectexplorer:objectstructure']?.['projectexplorer:node'];
|
|
84
|
+
if (!nodes)
|
|
85
|
+
return [];
|
|
86
|
+
if (!Array.isArray(nodes))
|
|
87
|
+
nodes = [nodes];
|
|
88
|
+
const out = [];
|
|
89
|
+
for (const node of nodes) {
|
|
90
|
+
if (!node.objecttype || !node.objectname)
|
|
91
|
+
continue;
|
|
92
|
+
if (!node.objecttype.startsWith('FUGR/'))
|
|
93
|
+
continue;
|
|
94
|
+
out.push({ objecttype: node.objecttype, objectname: node.objectname });
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
function createSourceReaderDeps(ctx) {
|
|
99
|
+
const client = (0, clients_1.createAdtClient)(ctx.connection, ctx.logger);
|
|
100
|
+
return {
|
|
101
|
+
async readProgram(programName, version) {
|
|
102
|
+
const r = await client.getProgram().read({ programName }, version);
|
|
103
|
+
const data = r?.readResult?.data;
|
|
104
|
+
return typeof data === 'string' ? data : null;
|
|
105
|
+
},
|
|
106
|
+
async readInclude(includeName) {
|
|
107
|
+
const r = await (0, utils_1.makeAdtRequestWithTimeout)(ctx.connection, `/sap/bc/adt/programs/includes/${(0, utils_1.encodeSapObjectName)(includeName)}/source/main`, 'GET', 'default');
|
|
108
|
+
return typeof r?.data === 'string' ? r.data : null;
|
|
109
|
+
},
|
|
110
|
+
async readClassMain(className, version) {
|
|
111
|
+
const r = await client.getClass().read({ className }, version);
|
|
112
|
+
const data = r?.readResult?.data;
|
|
113
|
+
return typeof data === 'string' ? data : null;
|
|
114
|
+
},
|
|
115
|
+
async fetchFugrStructure(fugrName) {
|
|
116
|
+
const r = await client.getUtils().getObjectStructure('FUGR/F', fugrName);
|
|
117
|
+
return typeof r?.data === 'string'
|
|
118
|
+
? parseFugrChildrenFromXml(r.data)
|
|
119
|
+
: [];
|
|
120
|
+
},
|
|
121
|
+
async readFugrFm(fugrName, fmName) {
|
|
122
|
+
const r = await (0, utils_1.makeAdtRequestWithTimeout)(ctx.connection, `/sap/bc/adt/functions/groups/${(0, utils_1.encodeSapObjectName)(fugrName.toLowerCase())}/fmodules/${(0, utils_1.encodeSapObjectName)(fmName.toLowerCase())}/source/main`, 'GET', 'default');
|
|
123
|
+
return typeof r?.data === 'string' ? r.data : null;
|
|
124
|
+
},
|
|
125
|
+
logger: ctx.logger,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=sourceReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceReader.js","sourceRoot":"","sources":["../../../src/lib/search-source/sourceReader.ts"],"names":[],"mappings":";;AA8DA,0CAmEC;AA6BD,wDAyCC;AAvMD,qDAA4C;AAC5C,wCAA6C;AAE7C,oCAA0E;AA8B1E,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,EAAoB,EACpB,MAAqC,EACrC,IAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,EAAE,KAAK,EAAE,CAAC,mBAAmB,IAAI,YAAY,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACvE,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAqB;IAC7C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAC/B,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,IAAyB,EACzB,MAAwB,EACxB,UAAyB,QAAQ;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,QAAQ,MAAM,CAAC,WAA6B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,EACnD,MAAM,EACN,aAAa,MAAM,CAAC,WAAW,EAAE,CAClC,CAAC;YACF,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,EACrD,MAAM,EACN,aAAa,MAAM,CAAC,WAAW,EAAE,CAClC,CAAC;YACF,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,EACjD,MAAM,EACN,wBAAwB,MAAM,CAAC,WAAW,EAAE,CAC7C,CAAC;YACF,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,QAAQ,GAAgB,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;oBAAE,SAAS;gBACnE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAChD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;YACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GACP,CAAC,CAAC,UAAU,KAAK,SAAS;oBACxB,CAAC,CAAC,MAAM,IAAI,CACR,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,EACvD,MAAM,EACN,gBAAgB,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,EAAE,CACrD;oBACH,CAAC,CAAC,MAAM,IAAI,CACR,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,EACpC,MAAM,EACN,qBAAqB,CAAC,CAAC,UAAU,EAAE,CACpC,CAAC;gBACR,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC;AASD,SAAS,wBAAwB,CAAC,GAAW;IAC3C,MAAM,MAAM,GAAG,IAAI,2BAAS,CAAC;QAC3B,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,iCAAiC,CAAC,EAAE,CACvD,sBAAsB,CACgC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,SAAS;QACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACnD,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,sBAAsB,CACpC,GAAmB;IAEnB,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO;YACpC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC;YACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,WAAW;YAC3B,MAAM,CAAC,GAAG,MAAM,IAAA,iCAAyB,EACvC,GAAG,CAAC,UAAU,EACd,iCAAiC,IAAA,2BAAmB,EAAC,WAAW,CAAC,cAAc,EAC/E,KAAK,EACL,SAAS,CACV,CAAC;YACF,OAAO,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO;YACpC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC;YACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,QAAQ;YAC/B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACzE,OAAO,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ;gBAChC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClC,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM;YAC/B,MAAM,CAAC,GAAG,MAAM,IAAA,iCAAyB,EACvC,GAAG,CAAC,UAAU,EACd,gCAAgC,IAAA,2BAAmB,EAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,aAAa,IAAA,2BAAmB,EAAC,MAAM,CAAC,WAAW,EAAE,CAAC,cAAc,EAC/I,KAAK,EACL,SAAS,CACV,CAAC;YACF,OAAO,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -4,8 +4,8 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
4
4
|
|
|
5
5
|
## Summary
|
|
6
6
|
|
|
7
|
-
- Total tools:
|
|
8
|
-
- Read-only tools:
|
|
7
|
+
- Total tools: 307
|
|
8
|
+
- Read-only tools: 56
|
|
9
9
|
- High-level tools: 127
|
|
10
10
|
- Low-level tools: 124
|
|
11
11
|
|
|
@@ -86,8 +86,11 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
86
86
|
- [RuntimeListFeeds](#runtimelistfeeds-read-only-system)
|
|
87
87
|
- [RuntimeListProfilerTraceFiles](#runtimelistprofilertracefiles-read-only-system)
|
|
88
88
|
- [RuntimeListSystemMessages](#runtimelistsystemmessages-read-only-system)
|
|
89
|
+
- [RuntimeRunClass](#runtimerunclass-read-only-system)
|
|
89
90
|
- [RuntimeRunClassWithProfiling](#runtimerunclasswithprofiling-read-only-system)
|
|
91
|
+
- [RuntimeRunProgram](#runtimerunprogram-read-only-system)
|
|
90
92
|
- [RuntimeRunProgramWithProfiling](#runtimerunprogramwithprofiling-read-only-system)
|
|
93
|
+
- [SearchSource](#searchsource-read-only-system)
|
|
91
94
|
- [Table](#read-only-table)
|
|
92
95
|
- [GetTableContents](#gettablecontents-read-only-table)
|
|
93
96
|
- [ReadTable](#readtable-read-only-table)
|
|
@@ -1033,9 +1036,38 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
1033
1036
|
|
|
1034
1037
|
---
|
|
1035
1038
|
|
|
1039
|
+
<a id="runtimerunclass-read-only-system"></a>
|
|
1040
|
+
#### RuntimeRunClass (Read-Only / System)
|
|
1041
|
+
**Description:** [runtime] Execute an ABAP class implementing if_oo_adt_classrun and return its output. Set profile=true to also capture a profiler trace (returns profilerId/traceId alongside output).
|
|
1042
|
+
|
|
1043
|
+
**Source:** `src/handlers/system/readonly/handleRuntimeRunClass.ts`
|
|
1044
|
+
|
|
1045
|
+
**Parameters:**
|
|
1046
|
+
- `aggregate` (boolean, optional) -
|
|
1047
|
+
- `all_db_events` (boolean, optional) -
|
|
1048
|
+
- `all_dynpro_events` (boolean, optional) -
|
|
1049
|
+
- `all_internal_table_events` (boolean, optional) -
|
|
1050
|
+
- `all_misc_abap_statements` (boolean, optional) -
|
|
1051
|
+
- `all_procedural_units` (boolean, optional) -
|
|
1052
|
+
- `all_system_kernel_events` (boolean, optional) -
|
|
1053
|
+
- `amdp_trace` (boolean, optional) -
|
|
1054
|
+
- `class_name` (string, required) - ABAP class name to execute.
|
|
1055
|
+
- `description` (string, optional) - Profiler trace description (only used when profile=true).
|
|
1056
|
+
- `explicit_on_off` (boolean, optional) -
|
|
1057
|
+
- `max_size_for_trace_file` (number, optional) -
|
|
1058
|
+
- `max_time_for_tracing` (number, optional) -
|
|
1059
|
+
- `max_trace_attempts` (integer, optional) - Max polling attempts to resolve traceId after execution (default 5). Only used when profile=true.
|
|
1060
|
+
- `profile` (boolean, optional) - When true, run with the profiler and resolve the resulting traceId. Default false.
|
|
1061
|
+
- `sql_trace` (boolean, optional) -
|
|
1062
|
+
- `trace_lookup_uris` (array, optional) - Additional URIs to consult when resolving the trace (advanced, profile=true).
|
|
1063
|
+
- `trace_retry_delay_ms` (integer, optional) - Delay in ms between trace polling attempts (default 2000). Only used when profile=true.
|
|
1064
|
+
- `with_rfc_tracing` (boolean, optional) -
|
|
1065
|
+
|
|
1066
|
+
---
|
|
1067
|
+
|
|
1036
1068
|
<a id="runtimerunclasswithprofiling-read-only-system"></a>
|
|
1037
1069
|
#### RuntimeRunClassWithProfiling (Read-Only / System)
|
|
1038
|
-
**Description:** [runtime] Execute ABAP class with profiler enabled and return created profilerId + traceId.
|
|
1070
|
+
**Description:** [runtime][deprecated] Execute ABAP class with profiler enabled and return created profilerId + traceId. Prefer RuntimeRunClass with profile=true; this tool is kept for backward compatibility and will be removed in a future major release.
|
|
1039
1071
|
|
|
1040
1072
|
**Source:** `src/handlers/system/readonly/handleRuntimeRunClassWithProfiling.ts`
|
|
1041
1073
|
|
|
@@ -1053,6 +1085,35 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
1053
1085
|
- `explicit_on_off` (boolean, optional) -
|
|
1054
1086
|
- `max_size_for_trace_file` (number, optional) -
|
|
1055
1087
|
- `max_time_for_tracing` (number, optional) -
|
|
1088
|
+
- `max_trace_attempts` (integer, optional) - Max polling attempts to resolve traceId after execution (default 5). Increase for slow systems (e.g. SAP trial cloud).
|
|
1089
|
+
- `sql_trace` (boolean, optional) -
|
|
1090
|
+
- `trace_lookup_uris` (array, optional) - Additional URIs to consult when resolving the trace (advanced).
|
|
1091
|
+
- `trace_retry_delay_ms` (integer, optional) - Delay in ms between trace polling attempts (default 2000).
|
|
1092
|
+
- `with_rfc_tracing` (boolean, optional) -
|
|
1093
|
+
|
|
1094
|
+
---
|
|
1095
|
+
|
|
1096
|
+
<a id="runtimerunprogram-read-only-system"></a>
|
|
1097
|
+
#### RuntimeRunProgram (Read-Only / System)
|
|
1098
|
+
**Description:** [runtime] Execute an ABAP program (report) and return its output. Set profile=true to also start a profiler trace; use RuntimeListProfilerTraceFiles afterwards to locate the trace (program execution is fire-and-forget, so traceId is not returned synchronously).
|
|
1099
|
+
|
|
1100
|
+
**Source:** `src/handlers/system/readonly/handleRuntimeRunProgram.ts`
|
|
1101
|
+
|
|
1102
|
+
**Parameters:**
|
|
1103
|
+
- `aggregate` (boolean, optional) -
|
|
1104
|
+
- `all_db_events` (boolean, optional) -
|
|
1105
|
+
- `all_dynpro_events` (boolean, optional) -
|
|
1106
|
+
- `all_internal_table_events` (boolean, optional) -
|
|
1107
|
+
- `all_misc_abap_statements` (boolean, optional) -
|
|
1108
|
+
- `all_procedural_units` (boolean, optional) -
|
|
1109
|
+
- `all_system_kernel_events` (boolean, optional) -
|
|
1110
|
+
- `amdp_trace` (boolean, optional) -
|
|
1111
|
+
- `description` (string, optional) - Profiler trace description (only used when profile=true).
|
|
1112
|
+
- `explicit_on_off` (boolean, optional) -
|
|
1113
|
+
- `max_size_for_trace_file` (number, optional) -
|
|
1114
|
+
- `max_time_for_tracing` (number, optional) -
|
|
1115
|
+
- `profile` (boolean, optional) - When true, run with the profiler. Default false. Trace must be located afterwards via RuntimeListProfilerTraceFiles — program execution does not return traceId synchronously.
|
|
1116
|
+
- `program_name` (string, required) - ABAP program name to execute.
|
|
1056
1117
|
- `sql_trace` (boolean, optional) -
|
|
1057
1118
|
- `with_rfc_tracing` (boolean, optional) -
|
|
1058
1119
|
|
|
@@ -1060,7 +1121,7 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
1060
1121
|
|
|
1061
1122
|
<a id="runtimerunprogramwithprofiling-read-only-system"></a>
|
|
1062
1123
|
#### RuntimeRunProgramWithProfiling (Read-Only / System)
|
|
1063
|
-
**Description:** [runtime] Execute ABAP program with profiler enabled and return created profilerId
|
|
1124
|
+
**Description:** [runtime][deprecated] Execute ABAP program with profiler enabled and return created profilerId. Prefer RuntimeRunProgram with profile=true; this tool is kept for backward compatibility and will be removed in a future major release.
|
|
1064
1125
|
|
|
1065
1126
|
**Source:** `src/handlers/system/readonly/handleRuntimeRunProgramWithProfiling.ts`
|
|
1066
1127
|
|
|
@@ -1083,6 +1144,17 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
1083
1144
|
|
|
1084
1145
|
---
|
|
1085
1146
|
|
|
1147
|
+
<a id="searchsource-read-only-system"></a>
|
|
1148
|
+
#### SearchSource (Read-Only / System)
|
|
1149
|
+
**Description:** [read-only] Search ABAP source text inside one or more packages (programs, function groups, classes). Onprem-only (cloud lacks an indexed source-search endpoint). Comments are searched by default; set exclude_comments=true to drop col-1 `*` and full-line `
|
|
1150
|
+
|
|
1151
|
+
**Source:** `src/handlers/system/readonly/handleSearchSource.ts`
|
|
1152
|
+
|
|
1153
|
+
**Parameters:**
|
|
1154
|
+
- None
|
|
1155
|
+
|
|
1156
|
+
---
|
|
1157
|
+
|
|
1086
1158
|
<a id="read-only-table"></a>
|
|
1087
1159
|
### Read-Only / Table
|
|
1088
1160
|
|
|
@@ -4879,4 +4951,4 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
4879
4951
|
|
|
4880
4952
|
---
|
|
4881
4953
|
|
|
4882
|
-
*Last updated: 2026-
|
|
4954
|
+
*Last updated: 2026-05-14*
|
|
@@ -5,8 +5,8 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
5
5
|
Tools available on legacy SAP systems (BASIS < 7.50).
|
|
6
6
|
Legacy systems support a subset of tools — primarily Class, Interface, View, Program, Function Group/Module, Package (read/update/delete), Include, Unit Test, and common utilities.
|
|
7
7
|
|
|
8
|
-
- Total tools:
|
|
9
|
-
- Read-Only:
|
|
8
|
+
- Total tools: 130
|
|
9
|
+
- Read-Only: 12
|
|
10
10
|
- High-Level: 58
|
|
11
11
|
- Low-Level: 60
|
|
12
12
|
|
|
@@ -30,6 +30,8 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
30
30
|
- [Program](#read-only-program)
|
|
31
31
|
- [GetProgFullCode](#getprogfullcode-read-only-program)
|
|
32
32
|
- [ReadProgram](#readprogram-read-only-program)
|
|
33
|
+
- [System](#read-only-system)
|
|
34
|
+
- [SearchSource](#searchsource-read-only-system)
|
|
33
35
|
- [View](#read-only-view)
|
|
34
36
|
- [ReadView](#readview-read-only-view)
|
|
35
37
|
- [High-Level Group](#high-level-group)
|
|
@@ -337,6 +339,22 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
337
339
|
|
|
338
340
|
---
|
|
339
341
|
|
|
342
|
+
<a id="read-only-system"></a>
|
|
343
|
+
### Read-Only / System
|
|
344
|
+
|
|
345
|
+
<a id="searchsource-read-only-system"></a>
|
|
346
|
+
#### SearchSource (Read-Only / System)
|
|
347
|
+
**Description:** [read-only] Search ABAP source text inside one or more packages (programs, function groups, classes). Onprem-only (cloud lacks an indexed source-search endpoint). Comments are searched by default; set exclude_comments=true to drop col-1 `*` and full-line `
|
|
348
|
+
|
|
349
|
+
**Source:** `src/handlers/system/readonly/handleSearchSource.ts`
|
|
350
|
+
|
|
351
|
+
**Available in:** `onprem`, `legacy`
|
|
352
|
+
|
|
353
|
+
**Parameters:**
|
|
354
|
+
- None
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
340
358
|
<a id="read-only-view"></a>
|
|
341
359
|
### Read-Only / View
|
|
342
360
|
|
|
@@ -2253,4 +2271,4 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
2253
2271
|
|
|
2254
2272
|
---
|
|
2255
2273
|
|
|
2256
|
-
*Last updated: 2026-
|
|
2274
|
+
*Last updated: 2026-05-14*
|