@rayutek/abap-adt-api 6.2.1-pkg-1.0.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 (96) hide show
  1. package/.abapgit.xml +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +23 -0
  4. package/build/AdtClient.d.ts +292 -0
  5. package/build/AdtClient.d.ts.map +1 -0
  6. package/build/AdtClient.js +628 -0
  7. package/build/AdtException.d.ts +62 -0
  8. package/build/AdtException.d.ts.map +1 -0
  9. package/build/AdtException.js +185 -0
  10. package/build/AdtHTTP.d.ts +113 -0
  11. package/build/AdtHTTP.d.ts.map +1 -0
  12. package/build/AdtHTTP.js +285 -0
  13. package/build/api/abapgit.d.ts +86 -0
  14. package/build/api/abapgit.d.ts.map +1 -0
  15. package/build/api/abapgit.js +300 -0
  16. package/build/api/activate.d.ts +39 -0
  17. package/build/api/activate.d.ts.map +1 -0
  18. package/build/api/activate.js +105 -0
  19. package/build/api/atc.d.ts +163 -0
  20. package/build/api/atc.d.ts.map +1 -0
  21. package/build/api/atc.js +440 -0
  22. package/build/api/cds.d.ts +52 -0
  23. package/build/api/cds.d.ts.map +1 -0
  24. package/build/api/cds.js +147 -0
  25. package/build/api/debugger.d.ts +238 -0
  26. package/build/api/debugger.d.ts.map +1 -0
  27. package/build/api/debugger.js +299 -0
  28. package/build/api/delete.d.ts +20 -0
  29. package/build/api/delete.d.ts.map +1 -0
  30. package/build/api/delete.js +29 -0
  31. package/build/api/discovery.d.ts +44 -0
  32. package/build/api/discovery.d.ts.map +1 -0
  33. package/build/api/discovery.js +78 -0
  34. package/build/api/feeds.d.ts +63 -0
  35. package/build/api/feeds.d.ts.map +1 -0
  36. package/build/api/feeds.js +65 -0
  37. package/build/api/index.d.ts +22 -0
  38. package/build/api/index.d.ts.map +1 -0
  39. package/build/api/index.js +37 -0
  40. package/build/api/nodeContents.d.ts +41 -0
  41. package/build/api/nodeContents.d.ts.map +1 -0
  42. package/build/api/nodeContents.js +78 -0
  43. package/build/api/objectcontents.d.ts +21 -0
  44. package/build/api/objectcontents.d.ts.map +1 -0
  45. package/build/api/objectcontents.js +68 -0
  46. package/build/api/objectcreator.d.ts +103 -0
  47. package/build/api/objectcreator.d.ts.map +1 -0
  48. package/build/api/objectcreator.js +372 -0
  49. package/build/api/objectstructure.d.ts +71 -0
  50. package/build/api/objectstructure.d.ts.map +1 -0
  51. package/build/api/objectstructure.js +37 -0
  52. package/build/api/refactor.d.ts +122 -0
  53. package/build/api/refactor.d.ts.map +1 -0
  54. package/build/api/refactor.js +470 -0
  55. package/build/api/revisions.d.ts +12 -0
  56. package/build/api/revisions.d.ts.map +1 -0
  57. package/build/api/revisions.js +61 -0
  58. package/build/api/search.d.ts +25 -0
  59. package/build/api/search.d.ts.map +1 -0
  60. package/build/api/search.js +67 -0
  61. package/build/api/syntax.d.ts +133 -0
  62. package/build/api/syntax.d.ts.map +1 -0
  63. package/build/api/syntax.js +327 -0
  64. package/build/api/tablecontents.d.ts +141 -0
  65. package/build/api/tablecontents.d.ts.map +1 -0
  66. package/build/api/tablecontents.js +186 -0
  67. package/build/api/trace.test.d.ts +2 -0
  68. package/build/api/trace.test.d.ts.map +1 -0
  69. package/build/api/trace.test.js +39 -0
  70. package/build/api/traces.d.ts +13 -0
  71. package/build/api/traces.d.ts.map +1 -0
  72. package/build/api/traces.js +97 -0
  73. package/build/api/tracetypes.d.ts +276 -0
  74. package/build/api/tracetypes.d.ts.map +1 -0
  75. package/build/api/tracetypes.js +474 -0
  76. package/build/api/transports.d.ts +158 -0
  77. package/build/api/transports.d.ts.map +1 -0
  78. package/build/api/transports.js +292 -0
  79. package/build/api/unittest.d.ts +81 -0
  80. package/build/api/unittest.d.ts.map +1 -0
  81. package/build/api/unittest.js +164 -0
  82. package/build/api/urlparser.d.ts +34 -0
  83. package/build/api/urlparser.d.ts.map +1 -0
  84. package/build/api/urlparser.js +86 -0
  85. package/build/index.d.ts +10 -0
  86. package/build/index.d.ts.map +1 -0
  87. package/build/index.js +49 -0
  88. package/build/requestLogger.d.ts +30 -0
  89. package/build/requestLogger.d.ts.map +1 -0
  90. package/build/requestLogger.js +100 -0
  91. package/build/utilities.d.ts +42 -0
  92. package/build/utilities.d.ts.map +1 -0
  93. package/build/utilities.js +221 -0
  94. package/jest.config.js +32 -0
  95. package/package.json +45 -0
  96. package/setenv_sample.js +27 -0
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindingDetails = exports.runQuery = exports.tableContents = exports.servicePreviewUrl = exports.parseBindingDetails = exports.parseQueryResponse = exports.decodeQueryResult = exports.extractBindingLinks = exports.parseServiceBinding = exports.TypeKinds = void 0;
4
+ const AdtException_1 = require("../AdtException");
5
+ const utilities_1 = require("../utilities");
6
+ var TypeKinds;
7
+ (function (TypeKinds) {
8
+ TypeKinds["ANY"] = "~";
9
+ TypeKinds["CHAR"] = "C";
10
+ TypeKinds["CLASS"] = "*";
11
+ TypeKinds["CLIKE"] = "&";
12
+ TypeKinds["CSEQUENCE"] = "?";
13
+ TypeKinds["DATA"] = "#";
14
+ TypeKinds["DATE"] = "D";
15
+ TypeKinds["DECFLOAT"] = "/";
16
+ TypeKinds["DECFLOAT16"] = "a";
17
+ TypeKinds["DECFLOAT34"] = "e";
18
+ TypeKinds["DREF"] = "l";
19
+ TypeKinds["FLOAT"] = "F";
20
+ TypeKinds["HEX"] = "X";
21
+ TypeKinds["INT"] = "I";
22
+ TypeKinds["INT1"] = "b";
23
+ TypeKinds["INT8"] = "8";
24
+ TypeKinds["INT2"] = "s";
25
+ TypeKinds["INTF"] = "+";
26
+ TypeKinds["IREF"] = "m";
27
+ TypeKinds["NUM"] = "N";
28
+ TypeKinds["NUMERIC"] = "%";
29
+ TypeKinds["OREF"] = "r";
30
+ TypeKinds["PACKED"] = "P";
31
+ TypeKinds["SIMPLE"] = "$";
32
+ TypeKinds["STRING"] = "g";
33
+ TypeKinds["STRUCT1"] = "u";
34
+ TypeKinds["STRUCT2"] = "v";
35
+ TypeKinds["TABLE"] = "h";
36
+ TypeKinds["TIME"] = "T";
37
+ TypeKinds["W"] = "w";
38
+ TypeKinds["XSEQUENCE"] = "!";
39
+ TypeKinds["XSTRING"] = "y";
40
+ TypeKinds["BREF"] = "j";
41
+ })(TypeKinds = exports.TypeKinds || (exports.TypeKinds = {}));
42
+ const parseServiceBinding = (xml) => {
43
+ const s = (0, utilities_1.fullParse)(xml, { removeNSPrefix: true, parseAttributeValue: false });
44
+ const attrs = (0, utilities_1.xmlNodeAttr)(s.serviceBinding);
45
+ for (const key of ["releaseSupported", "published", "repair", "bindingCreated"])
46
+ attrs[key] = !`${attrs[key]}`.match(/false/i);
47
+ const packageRef = (0, utilities_1.xmlNodeAttr)(s.serviceBinding.packageRef);
48
+ const links = s.serviceBinding.link.map(utilities_1.xmlNodeAttr);
49
+ const parseService = (name) => (service) => {
50
+ const { "@_version": version, "@_releaseState": releaseState } = service;
51
+ const serviceDefinition = (0, utilities_1.xmlNodeAttr)(service.serviceDefinition);
52
+ return { name, version, releaseState, serviceDefinition };
53
+ };
54
+ const { "@_name": serviceName } = (0, utilities_1.xmlNode)(s, "serviceBinding", "services");
55
+ const services = (0, utilities_1.xmlArray)(s, "serviceBinding", "services", "content").map(parseService(serviceName));
56
+ const parseBinding = (b) => ({ ...(0, utilities_1.xmlNodeAttr)(b), implementation: { ...(0, utilities_1.xmlNodeAttr)(b.implementation) } });
57
+ const binding = parseBinding(s.serviceBinding.binding);
58
+ return { ...attrs, packageRef, links, services, binding };
59
+ };
60
+ exports.parseServiceBinding = parseServiceBinding;
61
+ const extractBindingLinks = (binding) => {
62
+ var _a;
63
+ const url = (_a = binding.links.find(l => l.rel === "http://www.sap.com/categories/odatav2")) === null || _a === void 0 ? void 0 : _a.href;
64
+ if (!url)
65
+ return [];
66
+ return binding.services.map(service => {
67
+ const { name: servicename, version: serviceversion, serviceDefinition: { name: srvdname } } = service;
68
+ const query = { servicename, serviceversion, srvdname };
69
+ return { service, query, url };
70
+ });
71
+ };
72
+ exports.extractBindingLinks = extractBindingLinks;
73
+ const decodeSapDate = (raw) => new Date(`${raw.substr(0, 4)}-${raw.substr(4, 2)}-${raw.substr(6, 2)}`);
74
+ const parseValue = (type, raw) => {
75
+ switch (type) {
76
+ case TypeKinds.DATE:
77
+ return decodeSapDate(raw);
78
+ case TypeKinds.DECFLOAT:
79
+ case TypeKinds.DECFLOAT16:
80
+ case TypeKinds.DECFLOAT34:
81
+ case TypeKinds.FLOAT:
82
+ case TypeKinds.NUM:
83
+ case TypeKinds.NUMERIC:
84
+ case TypeKinds.PACKED:
85
+ return parseFloat(raw);
86
+ case TypeKinds.INT:
87
+ case TypeKinds.INT1:
88
+ case TypeKinds.INT8:
89
+ case TypeKinds.INT2:
90
+ return parseInt(raw, 10);
91
+ case TypeKinds.TIME:
92
+ return raw; // converting to date doesn't sound like a great idea
93
+ default:
94
+ return raw;
95
+ }
96
+ };
97
+ const decodeQueryResult = (original) => {
98
+ const { columns } = original;
99
+ const types = new Map();
100
+ for (const c of columns)
101
+ types.set(c.name, c.type);
102
+ const values = original.values.map(l => {
103
+ const decoded = (k) => parseValue(types.get(k), l[k]);
104
+ return Object.keys(l).reduce((o, k) => { o[k] = decoded(k); return o; }, {});
105
+ });
106
+ return { columns, values };
107
+ };
108
+ exports.decodeQueryResult = decodeQueryResult;
109
+ const parseColumn = (raw) => {
110
+ const { "@_name": name = "", "@_type": type = "", "@_description": description, "@_keyAttribute": keyAttribute = false, "@_colType": colType, "@_isKeyFigure": isKeyFigure = false, "@_length": length = 0, } = raw.metadata;
111
+ const values = (0, utilities_1.xmlArray)(raw, "dataSet", "data");
112
+ const meta = { name, type, description, keyAttribute, colType, isKeyFigure, length };
113
+ return { values, meta };
114
+ };
115
+ function parseQueryResponse(body) {
116
+ const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true, parseTagValue: false });
117
+ const fields = (0, utilities_1.xmlArray)(raw, "tableData", "columns").map(parseColumn);
118
+ const columns = fields.map(c => c.meta);
119
+ const longest = fields.map(f => f.values).reduce((m, l) => l.length > m.length ? l : m, []);
120
+ const row = (_, i) => fields.reduce((r, f) => {
121
+ return { ...r, [f.meta.name]: f.values[i] };
122
+ }, {});
123
+ const values = longest.map(row);
124
+ return { columns, values };
125
+ }
126
+ exports.parseQueryResponse = parseQueryResponse;
127
+ const parseBindingDetails = (xml) => {
128
+ var _a;
129
+ const s = (0, utilities_1.fullParse)(xml, { removeNSPrefix: true, parseAttributeValue: false });
130
+ const link = (0, utilities_1.xmlNodeAttr)((_a = s === null || s === void 0 ? void 0 : s.serviceList) === null || _a === void 0 ? void 0 : _a.link);
131
+ const parseCollection = (c) => {
132
+ const name = c["@_name"];
133
+ const navigation = (0, utilities_1.xmlArray)(c, "navigation").map(utilities_1.xmlNodeAttr);
134
+ return { name, navigation };
135
+ };
136
+ const parseService = (s) => {
137
+ const base = (0, utilities_1.xmlNodeAttr)(s);
138
+ const serviceInformation = (0, utilities_1.xmlNodeAttr)(s.serviceInformation);
139
+ serviceInformation.collection = (0, utilities_1.xmlArray)(s, "serviceInformation", "collection").map(parseCollection);
140
+ return ({ ...base, serviceInformation });
141
+ };
142
+ const services = (0, utilities_1.xmlArray)(s, "serviceList", "services").map(parseService);
143
+ return { link, services };
144
+ };
145
+ exports.parseBindingDetails = parseBindingDetails;
146
+ const servicePreviewUrl = (service, collectionName) => {
147
+ const { serviceId, serviceInformation: { collection, url, name, version } } = service;
148
+ const annotation = `${name.substr(0, 28)}_VAN`;
149
+ const baseUrl = url.replace(/(https?:\/\/[^\/]+).*/, "$1");
150
+ const cn = collection.find(c => c.name === collectionName);
151
+ if (!cn)
152
+ return;
153
+ const encrypt = (s) => s.split("").map(c => String.fromCharCode(c.charCodeAt(0) + 20)).join("");
154
+ const names = cn.navigation.map(n => n.name).join("@@");
155
+ const targets = cn.navigation.map(n => n.target).join("@@");
156
+ const rawparm = [serviceId, cn.name, names, targets, annotation, version].join("##");
157
+ return `${baseUrl}/sap/bc/adt/businessservices/odatav2/feap?feapParams=${encodeURIComponent(encrypt(rawparm))}`;
158
+ };
159
+ exports.servicePreviewUrl = servicePreviewUrl;
160
+ async function tableContents(h, ddicEntityName, rowNumber = 100, decode = true, sqlQuery = "") {
161
+ const qs = { rowNumber, ddicEntityName };
162
+ const response = await h.request(`/sap/bc/adt/datapreview/ddic`, { qs, headers: { Accept: "application/*" }, method: "POST", body: sqlQuery });
163
+ const queryResult = parseQueryResponse(response.body);
164
+ if (decode)
165
+ return (0, exports.decodeQueryResult)(queryResult);
166
+ return queryResult;
167
+ }
168
+ exports.tableContents = tableContents;
169
+ async function runQuery(h, sqlQuery, rowNumber = 100, decode = true) {
170
+ const qs = { rowNumber };
171
+ const response = await h.request(`/sap/bc/adt/datapreview/freestyle`, { qs, headers: { Accept: "application/*" }, method: "POST", body: sqlQuery });
172
+ const queryResult = parseQueryResponse(response.body);
173
+ if (decode)
174
+ return (0, exports.decodeQueryResult)(queryResult);
175
+ return queryResult;
176
+ }
177
+ exports.runQuery = runQuery;
178
+ async function bindingDetails(h, binding, index = 0) {
179
+ const queries = (0, exports.extractBindingLinks)(binding);
180
+ const { query: qs, url } = queries[index];
181
+ if (!qs || !url)
182
+ throw (0, AdtException_1.adtException)("Binding not found");
183
+ const response = await h.request(url, { qs, headers: { Accept: "application/*" }, method: "GET" });
184
+ return (0, exports.parseBindingDetails)(response.body);
185
+ }
186
+ exports.bindingDetails = bindingDetails;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trace.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.test.d.ts","sourceRoot":"","sources":["../../src/api/trace.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tracetypes_1 = require("./tracetypes");
4
+ test("parse trace results", () => {
5
+ const sample = `<?xml version="1.0" encoding="utf-8"?> <atom:feed xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author> <atom:name>SAP AG</atom:name> </atom:author> <atom:contributor> <atom:name>ACD</atom:name> </atom:contributor> <atom:title>ABAP Traces in ACD</atom:title> <atom:updated>2023-11-03T00:14:08Z</atom:updated> <atom:entry xml:lang="EN"> <atom:author> <atom:name>MURBANI</atom:name> <atom:uri> http://intranet.sap.com/~form/handler?_APP=00200682500000001086&amp;_EVENT=DISPLAY&amp;00200682500000002188=MURBANI</atom:uri> </atom:author> <atom:content type="application/vnd.sap.adt.runtime.traces.abaptraces.hitlist+xml" src="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT/hitlist" /> <atom:id>/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT</atom:id> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT" rel="self" type="application/atom+xml;type=entry" title="Trace File Self Link" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT" rel="alternate" type="application/vnd.sap.sapgui.adt.runtime.traces.abaptraces.satclassic" title="SAT (SAP GUI)" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT" rel="related" type="application/vnd.sap.sapgui.adt.runtime.traces.abaptraces.filedisplay" title="Display Original Trace File (SAP GUI)" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT" rel="http://www.sap.com/adt/relations/delete" type="text/plain" title="Delete Trace File" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT/hitlist" rel="alternate" type="application/vnd.sap.adt.runtime.traces.abaptraces.hitlist+xml" title="Display Hitlist" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT/attributes?title=$value" rel="edit" type="text/plain" title="Change Trace Description" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT/attributes?expiration=$value" rel="edit" type="text/plain" title="Change Trace Expiry Date" /> <atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT/dbAccesses" rel="alternate" type="application/vnd.sap.adt.runtime.traces.abaptraces.dbaccesses+xml" title="Show DB Accesses" /> <atom:published>2023-10-27T14:25:43Z</atom:published> <atom:title>DEFAULT</atom:title> <atom:updated>2023-10-27T14:25:43Z</atom:updated> <trc:extendedData xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"> <trc:host>BTI1033</trc:host> <trc:size>21</trc:size> <trc:runtime>5531427</trc:runtime> <trc:runtimeABAP>5524781</trc:runtimeABAP> <trc:runtimeSystem>1643</trc:runtimeSystem> <trc:runtimeDatabase>5003</trc:runtimeDatabase> <trc:expiration>2023-11-24T14:25:43Z</trc:expiration> <trc:system>ACD</trc:system> <trc:client>100</trc:client> <trc:isAggregated>true</trc:isAggregated> <trc:aggregationKind>byCallPosition</trc:aggregationKind> <trc:objectName>YMUHIERTABPERFTEST</trc:objectName> <trc:state value="R" text="Finished" /> </trc:extendedData> </atom:entry> </atom:feed>`;
6
+ const results = (0, tracetypes_1.parseTraceResults)(sample);
7
+ expect(results.runs.length).toBe(1);
8
+ expect(results.runs[0].id).toBe("/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000000.DAT");
9
+ expect(results.runs[0].links[0].href).toBeDefined();
10
+ });
11
+ test("parse trace hitlist", () => {
12
+ var _a;
13
+ const sample = `<?xml version="1.0" encoding="utf-8"?> <trc:hitlist xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"> <atom:link rel="parent" href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000020.DAT" xmlns:atom="http://www.w3.org/2005/Atom" /> <trc:entry topDownIndex="1" index="19" hitCount="1" stackCount="1" recursionDepth="0" description="DB: Exec Static " proceduralEntryAnchor="3" dbAccessAnchor="3"> <trc:callingProgram adtcore:context="CL_HTTP_SECURITY_SESSION_ICF==CP" byteCodeOffset="624" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_security_session_icf/source/main#start=502" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SECURITY_SESSION_ICF" adtcore:packageName="SHTTP_SECURITY_SESSIONS" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:calledProgram adtcore:context="" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:grossTime time="1812" percentage="35.9881" /> <trc:traceEventNetTime time="1812" percentage="35.9881" /> <trc:proceduralNetTime time="-1" percentage="0.0" /> </trc:entry> <trc:entry topDownIndex="2" index="2" hitCount="1" stackCount="1" recursionDepth="0" description="Runtime Analysis On "> <trc:callingProgram adtcore:context="CL_HTTP_SERVER_NET============CP" byteCodeOffset="28249" objectReferenceQuery="/sap/bc/adt/runtime/traces/abaptraces/objectReferences?context=CL_HTTP_SERVER_NET%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3dCP&amp;byteCodeOffset=28249" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:calledProgram adtcore:context="" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:grossTime time="4822" percentage="95.7696" /> <trc:traceEventNetTime time="708" percentage="14.0616" /> <trc:proceduralNetTime time="708" percentage="14.0616" /> </trc:entry> </trc:hitlist>`;
14
+ const results = (0, tracetypes_1.parseTraceHitList)(sample);
15
+ expect(results.entries.length).toBe(2);
16
+ expect(results.entries[0].calledProgram).toBe("");
17
+ expect((_a = results.entries[0].callingProgram) === null || _a === void 0 ? void 0 : _a.name).toBe("CL_HTTP_SECURITY_SESSION_ICF");
18
+ });
19
+ test("parse trace db accesses", () => {
20
+ const sample = `<?xml version="1.0" encoding="utf-8"?><trc:dbAccesses totalDbTime="0" xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"><atom:link rel="parent" href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000020.DAT" xmlns:atom="http://www.w3.org/2005/Atom"/><trc:dbAccess index="1" tableName="&lt;DB Access from Kernel&gt;" statement="" type="" totalCount="6" bufferedCount="0"><trc:accessTime total="210" applicationServer="0" database="210" ratioOfTraceTotal="4.2"/></trc:dbAccess><trc:dbAccess index="2" tableName="SECURITY_CONTEXT" statement="insert" type="OpenSQL" totalCount="1" bufferedCount="0"><trc:accessTime total="432" applicationServer="0" database="432" ratioOfTraceTotal="8.6"/><trc:callingProgram adtcore:context="CL_HTTP_SECURITY_SESSION_ICF==CP" byteCodeOffset="538" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_security_session_icf/source/main#start=456" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SECURITY_SESSION_ICF" adtcore:packageName="SHTTP_SECURITY_SESSIONS" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="3" tableName="&lt;unspecified&gt;" statement="commit" type="EXEC SQL" totalCount="1" bufferedCount="0"><trc:accessTime total="2014" applicationServer="0" database="2014" ratioOfTraceTotal="40.0"/><trc:callingProgram adtcore:context="CL_HTTP_SECURITY_SESSION_ICF==CP" byteCodeOffset="624" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_security_session_icf/source/main#start=502" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SECURITY_SESSION_ICF" adtcore:packageName="SHTTP_SECURITY_SESSIONS" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="4" tableName="SEPP__REGISTRY" statement="select single" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="24" applicationServer="0" database="24" ratioOfTraceTotal="0.5"/><trc:callingProgram adtcore:context="CL_EPP_REGISTRY===============CP" byteCodeOffset="51" adtcore:uri="/sap/bc/adt/oo/classes/cl_epp_registry/source/main#start=154" adtcore:type="CLAS/OC" adtcore:name="CL_EPP_REGISTRY" adtcore:packageName="SEPP" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="5" tableName="SOTR_HEAD" statement="select single" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="19" applicationServer="0" database="19" ratioOfTraceTotal="0.4"/><trc:callingProgram adtcore:context="SAPLSOTR_DB_READ" byteCodeOffset="813" adtcore:uri="/sap/bc/adt/functions/groups/sotr_db_read/fmodules/sotr_get_text_key/source/main#start=52" adtcore:type="FUGR/I" adtcore:name="LSOTR_DB_READU11" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="6" tableName="SOTR_TEXT" statement="select" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="21" applicationServer="0" database="21" ratioOfTraceTotal="0.4"/><trc:callingProgram adtcore:context="SAPLSOTR_DB_READ" byteCodeOffset="977" adtcore:uri="/sap/bc/adt/functions/groups/sotr_db_read/fmodules/sotr_get_text_key/source/main#start=146" adtcore:type="FUGR/I" adtcore:name="LSOTR_DB_READU11" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="7" tableName="ICFATTRIB" statement="select" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="21" applicationServer="0" database="21" ratioOfTraceTotal="0.4"/><trc:callingProgram adtcore:context="SAPLHTTP_RUNTIME" byteCodeOffset="6332" adtcore:uri="/sap/bc/adt/functions/groups/http_runtime/fmodules/http_read_debug/source/main#start=78" adtcore:type="FUGR/I" adtcore:name="LHTTP_RUNTIMEU21" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="8" tableName="ICFATTRIB" statement="select single" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="8" applicationServer="0" database="8" ratioOfTraceTotal="0.2"/><trc:callingProgram adtcore:context="SAPLHTTP_RUNTIME" byteCodeOffset="6345" adtcore:uri="/sap/bc/adt/functions/groups/http_runtime/fmodules/http_read_debug/source/main#start=99" adtcore:type="FUGR/I" adtcore:name="LHTTP_RUNTIMEU21" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="9" tableName="/BTI/WP_WS_HANDL" statement="select single" type="OpenSQL" totalCount="1" bufferedCount="1"><trc:accessTime total="21" applicationServer="0" database="21" ratioOfTraceTotal="0.4"/><trc:callingProgram adtcore:context="/BTI/WP_WS_HANDLER============CP" byteCodeOffset="113" adtcore:uri="/sap/bc/adt/oo/classes/%2fbti%2fwp_ws_handler/source/main#start=21" adtcore:type="CLAS/OC" adtcore:name="/BTI/WP_WS_HANDLER" adtcore:packageName="/BTI/WP" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="10" tableName="SECURITY_CONTEXT" statement="select" type="OpenSQL" totalCount="1" bufferedCount="0"><trc:accessTime total="440" applicationServer="0" database="440" ratioOfTraceTotal="8.7"/><trc:callingProgram adtcore:context="CL_HTTP_SECURITY_SESSION_ADMINCP" byteCodeOffset="26" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_security_session_admin/source/main#start=363" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SECURITY_SESSION_ADMIN" adtcore:packageName="SHTTP_SECURITY_SESSIONS" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:dbAccess><trc:dbAccess index="11" tableName="&lt;DB Time of System Events&gt;" statement="" type="" totalCount="0" bufferedCount="0"><trc:accessTime total="0" applicationServer="0" database="0" ratioOfTraceTotal="0.0"/></trc:dbAccess><trc:tables><trc:table name="SECURITY_CONTEXT" type="TRANSP" description="HTTP Security Context (Cross-Server Attributes)" bufferMode="Single Entries buffered" storageType="" adtcore:package="SHTTP_SECURITY_SESSIONS" xmlns:adtcore="http://www.sap.com/adt/core"/><trc:table name="SEPP__REGISTRY" type="TRANSP" description="Registry for Application Data in EPP" bufferMode="Entirely buffered" storageType="" adtcore:package="SEPP" xmlns:adtcore="http://www.sap.com/adt/core"/><trc:table name="SOTR_HEAD" type="TRANSP" description="Header Table for OTR Texts" bufferMode="Single Entries buffered" storageType="" adtcore:package="SOTR" xmlns:adtcore="http://www.sap.com/adt/core"/><trc:table name="SOTR_TEXT" type="TRANSP" description="Text Table in the OTR" bufferMode="Generically buffered" storageType="" adtcore:package="SOTR" xmlns:adtcore="http://www.sap.com/adt/core"/><trc:table name="ICFATTRIB" type="TRANSP" description="Description of ICF Attributes (Trace/Debugging)" bufferMode="Entirely buffered" storageType="" adtcore:package="SHTTP" xmlns:adtcore="http://www.sap.com/adt/core"/><trc:table name="/BTI/WP_WS_HANDL" type="TRANSP" description="Web Platform: HTTP Handlers" bufferMode="Entirely buffered" storageType="" adtcore:package="/BTI/WP" xmlns:adtcore="http://www.sap.com/adt/core"/></trc:tables></trc:dbAccesses>`;
21
+ const results = (0, tracetypes_1.parseTraceDbAccess)(sample);
22
+ expect(results.parentLink).toBeDefined();
23
+ expect(results.tables.length).toBeTruthy();
24
+ expect(results.dbaccesses.length).toBeTruthy();
25
+ });
26
+ test("parse trace statements", () => {
27
+ const sample = `<?xml version="1.0" encoding="utf-8"?> <trc:statements withDetails="false" withSysEvents="false" m:count="43" xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces" xmlns:m="http://schema.microsoft.com/ado/2007/08/dataservices/metadata"> <atom:link rel="parent" href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000020.DAT" xmlns:atom="http://www.w3.org/2005/Atom" /> <trc:statement index="1" id="1" description="Runtime analysis " hitCount="1" hasDetailSubnodes="false" hasProcedureLikeSubnodes="true" callerId="1" callLevel="0" subnodeCount="71" directSubnodeCount="1" directSubnodeCountProcedureLike="1" isAutoDrillDowned="true" isProceduralUnit="true" isProcedureLike="true" hitlistAnchor="1"> <trc:callingProgram adtcore:context="CL_HTTP_SERVER_NET============CP" byteCodeOffset="28249" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_server_net/source/main#start=9857" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SERVER_NET" adtcore:packageName="SHTTP" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:grossTime time="5035" percentage="100.0" /> <trc:traceEventNetTime time="213" percentage="4.2304" /> <trc:proceduralNetTime time="213" percentage="4.2304" /> </trc:statement> <trc:statement index="2" id="2" description="Runtime Analysis On " hitCount="1" hasDetailSubnodes="true" hasProcedureLikeSubnodes="true" callerId="1" callLevel="1" subnodeCount="154" directSubnodeCount="15" directSubnodeCountProcedureLike="11" isAutoDrillDowned="true" isProceduralUnit="true" isProcedureLike="true" hitlistAnchor="2"> <trc:callingProgram adtcore:context="CL_HTTP_SERVER_NET============CP" byteCodeOffset="28249" adtcore:uri="/sap/bc/adt/oo/classes/cl_http_server_net/source/main#start=9857" adtcore:type="CLAS/OC" adtcore:name="CL_HTTP_SERVER_NET" adtcore:packageName="SHTTP" xmlns:adtcore="http://www.sap.com/adt/core" /> <trc:grossTime time="4822" percentage="95.7696" /> <trc:traceEventNetTime time="153" percentage="3.0387" /> <trc:proceduralNetTime time="221" percentage="4.3893" /> </trc:statement> </trc:statements>`;
28
+ const results = (0, tracetypes_1.parseTraceStatements)(sample);
29
+ expect(results.parentLink).toBeDefined();
30
+ expect(results.statements.length).toBe(2);
31
+ expect(results.statements[0].callingProgram.name).toBeTruthy();
32
+ });
33
+ test("parse trace request list", () => {
34
+ const sample = `<?xml version="1.0" encoding="utf-8"?><atom:feed xmlns:atom="http://www.w3.org/2005/Atom"><atom:contributor trc:role="orgination" xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"><atom:name>ACD</atom:name></atom:contributor><atom:title>ABAP Trace Requests ACD</atom:title><atom:updated>2023-11-06T09:44:47Z</atom:updated><atom:entry xml:lang="EN"><atom:author trc:role="admin" xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"><atom:name>MURBANI</atom:name><atom:uri>https://intranet.sap.corp/~form/handler?_APP=00200682500000001086&amp;_EVENT=DISPLAY&amp;00200682500000002188=MURBANI</atom:uri></atom:author><atom:author trc:role="trace" xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"><atom:name>MURBANI</atom:name><atom:uri>https://intranet.sap.corp/~form/handler?_APP=00200682500000001086&amp;_EVENT=DISPLAY&amp;00200682500000002188=MURBANI</atom:uri></atom:author><atom:content type="application/atom+xml" src="/sap/bc/adt/runtime/traces/abaptraces/requests/bti1033_acd_00%2c1%2c20231103000153"/><atom:id>/sap/bc/adt/runtime/traces/abaptraces/requests/bti1033_acd_00%2c1%2c20231103000153</atom:id><atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000020.DAT" rel="http://www.sap.com/adt/relations/runtime/traces/abaptraces/tracefile" type="application/atom+xml" title="03.11.2023/00:02:09/HTTP"/><atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000021.DAT" rel="http://www.sap.com/adt/relations/runtime/traces/abaptraces/tracefile" type="application/atom+xml" title="03.11.2023/00:02:09/HTTP"/><atom:link href="/sap/bc/adt/runtime/traces/abaptraces/bti1033_acd_00%2cAT000022.DAT" rel="http://www.sap.com/adt/relations/runtime/traces/abaptraces/tracefile" type="application/atom+xml" title="03.11.2023/00:02:09/HTTP"/><atom:published>2023-11-03T00:01:53Z</atom:published><atom:title>HTTP</atom:title><atom:updated>2023-11-03T00:01:53Z</atom:updated><trc:extendedData xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces"><trc:host>bti1033</trc:host><trc:requestIndex>1</trc:requestIndex><trc:client trc:role="admin">100</trc:client><trc:client trc:role="trace">100</trc:client><trc:description>HTTP</trc:description><trc:isAggregated>false</trc:isAggregated><trc:expires>2023-11-03T00:59:58Z</trc:expires><trc:processType trc:processTypeId="/sap/bc/adt/runtime/traces/abaptraces/processtypes/http"/><trc:object trc:objectTypeId="/sap/bc/adt/runtime/traces/abaptraces/objecttypes/url"/><trc:executions trc:maximal="3" trc:completed="3"/></trc:extendedData></atom:entry></atom:feed>`;
35
+ const results = (0, tracetypes_1.parseTraceRequestList)(sample);
36
+ expect(results.title).toBe("ABAP Trace Requests ACD");
37
+ expect(results.requests.length).toBe(1);
38
+ expect(results.requests[0].title).toBe("HTTP");
39
+ });
@@ -0,0 +1,13 @@
1
+ import { TraceDBAccessResponse, TraceHitList, TraceParameters, TraceResults, TraceStatementOptions, TraceStatementResponse, TracesCreationConfig, TraceRequestList } from "./tracetypes";
2
+ import { AdtHTTP } from "../AdtHTTP";
3
+ export { TraceResults, TraceHitList, TraceDBAccessResponse, TraceStatementResponse, TraceStatementOptions, TracesCreationConfig, TraceParameters, traceProcessObjects, TraceRequestList } from "./tracetypes";
4
+ export declare const tracesList: (h: AdtHTTP, user: string) => Promise<TraceResults>;
5
+ export declare const tracesListRequests: (h: AdtHTTP, user: string) => Promise<TraceRequestList>;
6
+ export declare const tracesHitList: (h: AdtHTTP, id: string, withSystemEvents?: boolean) => Promise<TraceHitList>;
7
+ export declare const tracesDbAccess: (h: AdtHTTP, id: string, withSystemEvents?: boolean) => Promise<TraceDBAccessResponse>;
8
+ export declare const tracesStatements: (h: AdtHTTP, id: string, options?: TraceStatementOptions) => Promise<TraceStatementResponse>;
9
+ export declare const tracesSetParameters: (h: AdtHTTP, parameters: TraceParameters) => Promise<string>;
10
+ export declare const tracesCreateConfiguration: (h: AdtHTTP, config: TracesCreationConfig) => Promise<TraceRequestList>;
11
+ export declare const tracesDeleteConfiguration: (h: AdtHTTP, id: string) => Promise<void>;
12
+ export declare const tracesDelete: (h: AdtHTTP, id: string) => Promise<void>;
13
+ //# sourceMappingURL=traces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../src/api/traces.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EASpB,gBAAgB,EACjB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAA;AAGpD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,cAAc,CAAA;AAErB,eAAO,MAAM,UAAU,MAClB,OAAO,QACJ,MAAM,KACX,QAAQ,YAAY,CAMtB,CAAA;AAED,eAAO,MAAM,kBAAkB,MAC1B,OAAO,QACJ,MAAM,KACX,QAAQ,gBAAgB,CAO1B,CAAA;AAOD,eAAO,MAAM,aAAa,MACrB,OAAO,MACN,MAAM,iCAET,QAAQ,YAAY,CAItB,CAAA;AAED,eAAO,MAAM,cAAc,MACtB,OAAO,MACN,MAAM,iCAET,QAAQ,qBAAqB,CAI/B,CAAA;AAED,eAAO,MAAM,gBAAgB,MACxB,OAAO,MACN,MAAM,YACD,qBAAqB,KAC7B,QAAQ,sBAAsB,CAQhC,CAAA;AAED,eAAO,MAAM,mBAAmB,MAC3B,OAAO,cACE,eAAe,KAC1B,QAAQ,MAAM,CA0BhB,CAAA;AAED,eAAO,MAAM,yBAAyB,MACjC,OAAO,UACF,oBAAoB,8BAkB7B,CAAA;AAED,eAAO,MAAM,yBAAyB,MAAa,OAAO,MAAM,MAAM,kBAIrE,CAAA;AAED,eAAO,MAAM,YAAY,MAAa,OAAO,MAAM,MAAM,kBAIxD,CAAA"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tracesDelete = exports.tracesDeleteConfiguration = exports.tracesCreateConfiguration = exports.tracesSetParameters = exports.tracesStatements = exports.tracesDbAccess = exports.tracesHitList = exports.tracesListRequests = exports.tracesList = exports.traceProcessObjects = void 0;
4
+ const tracetypes_1 = require("./tracetypes");
5
+ const __1 = require("..");
6
+ var tracetypes_2 = require("./tracetypes");
7
+ Object.defineProperty(exports, "traceProcessObjects", { enumerable: true, get: function () { return tracetypes_2.traceProcessObjects; } });
8
+ const tracesList = async (h, user) => {
9
+ const qs = { user: user.toUpperCase() };
10
+ const response = await h.request(`/sap/bc/adt/runtime/traces/abaptraces`, {
11
+ qs
12
+ });
13
+ return (0, tracetypes_1.parseTraceResults)(response.body);
14
+ };
15
+ exports.tracesList = tracesList;
16
+ const tracesListRequests = async (h, user) => {
17
+ const qs = { user: user.toUpperCase() };
18
+ const response = await h.request(`/sap/bc/adt/runtime/traces/abaptraces/requests`, { qs });
19
+ return (0, tracetypes_1.parseTraceRequestList)(response.body);
20
+ };
21
+ exports.tracesListRequests = tracesListRequests;
22
+ const traceId = (id) => id.startsWith("/sap/bc/adt/runtime/traces/abaptraces/")
23
+ ? id
24
+ : `/sap/bc/adt/runtime/traces/abaptraces/${id}`;
25
+ const tracesHitList = async (h, id, withSystemEvents = false) => {
26
+ const opts = { qs: { withSystemEvents } };
27
+ const response = await h.request(`${traceId(id)}/hitlist`, opts);
28
+ return (0, tracetypes_1.parseTraceHitList)(response.body);
29
+ };
30
+ exports.tracesHitList = tracesHitList;
31
+ const tracesDbAccess = async (h, id, withSystemEvents = false) => {
32
+ const opts = { qs: { withSystemEvents } };
33
+ const response = await h.request(`${traceId(id)}/dbAccesses`, opts);
34
+ return (0, tracetypes_1.parseTraceDbAccess)(response.body);
35
+ };
36
+ exports.tracesDbAccess = tracesDbAccess;
37
+ const tracesStatements = async (h, id, options = {}) => {
38
+ const headers = {
39
+ Accept: "application/vnd.sap.adt.runtime.traces.abaptraces.aggcalltree+xml, application/xml"
40
+ };
41
+ const opts = { qs: options, headers };
42
+ const response = await h.request(`${traceId(id)}/statements`, opts);
43
+ return (0, tracetypes_1.parseTraceStatements)(response.body);
44
+ };
45
+ exports.tracesStatements = tracesStatements;
46
+ const tracesSetParameters = async (h, parameters) => {
47
+ const headers = { "Content-Type": "application/xml" };
48
+ const body = `<?xml version="1.0" encoding="UTF-8"?>
49
+ <trc:parameters xmlns:trc="http://www.sap.com/adt/runtime/traces/abaptraces">
50
+ <trc:allMiscAbapStatements value="${parameters.allMiscAbapStatements}"></trc:allMiscAbapStatements>
51
+ <trc:allProceduralUnits value="${parameters.allProceduralUnits}"></trc:allProceduralUnits>
52
+ <trc:allInternalTableEvents value="${parameters.allInternalTableEvents}"></trc:allInternalTableEvents>
53
+ <trc:allDynproEvents value="${parameters.allDynproEvents}"></trc:allDynproEvents>
54
+ <trc:description value="${parameters.description}"></trc:description>
55
+ <trc:aggregate value="${parameters.aggregate}"></trc:aggregate>
56
+ <trc:explicitOnOff value="${parameters.explicitOnOff}"></trc:explicitOnOff>
57
+ <trc:withRfcTracing value="${parameters.withRfcTracing}"></trc:withRfcTracing>
58
+ <trc:allSystemKernelEvents value="${parameters.allSystemKernelEvents}"></trc:allSystemKernelEvents>
59
+ <trc:sqlTrace value="${parameters.sqlTrace}"></trc:sqlTrace>
60
+ <trc:allDbEvents value="${parameters.allDbEvents}"></trc:allDbEvents>
61
+ <trc:maxSizeForTraceFile value="${parameters.maxSizeForTraceFile}"></trc:maxSizeForTraceFile>
62
+ <trc:maxTimeForTracing value="${parameters.maxTimeForTracing}"></trc:maxTimeForTracing>
63
+ </trc:parameters>`;
64
+ const opts = { headers, method: "POST", body };
65
+ const response = await h.request(`/sap/bc/adt/runtime/traces/abaptraces/parameters`, opts);
66
+ const uri = response.headers["location"];
67
+ if (!uri)
68
+ throw (0, __1.adtException)("trace configuration not set");
69
+ return uri;
70
+ };
71
+ exports.tracesSetParameters = tracesSetParameters;
72
+ const tracesCreateConfiguration = async (h, config) => {
73
+ if (!tracetypes_1.traceProcessObjects[config.processType].includes(config.objectType))
74
+ throw (0, __1.adtException)(`Invalid process type ${config.processType} or object type ${config.objectType}`);
75
+ const qs = {
76
+ ...config,
77
+ server: config.server || "*",
78
+ processType: tracetypes_1.traceProcessTypeUris[config.processType],
79
+ objectType: tracetypes_1.traceObjectTypeUris[config.objectType]
80
+ };
81
+ const opts = { method: "POST", qs };
82
+ const response = await h.request(`/sap/bc/adt/runtime/traces/abaptraces/requests`, opts);
83
+ return (0, tracetypes_1.parseTraceRequestList)(response.body);
84
+ };
85
+ exports.tracesCreateConfiguration = tracesCreateConfiguration;
86
+ const tracesDeleteConfiguration = async (h, id) => {
87
+ const prefix = `/sap/bc/adt/runtime/traces/abaptraces/requests`;
88
+ const url = id.startsWith(prefix) ? id : `${prefix}/${id}`;
89
+ await h.request(url, { method: "DELETE" });
90
+ };
91
+ exports.tracesDeleteConfiguration = tracesDeleteConfiguration;
92
+ const tracesDelete = async (h, id) => {
93
+ const prefix = `/sap/bc/adt/runtime/traces/abaptraces/`;
94
+ const url = id.startsWith(prefix) ? id : `${prefix}/${id}`;
95
+ await h.request(url, { method: "DELETE" });
96
+ };
97
+ exports.tracesDelete = tracesDelete;