@mcp-abap-adt/adt-clients 0.3.3 → 0.3.6
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/README.md +12 -0
- package/dist/core/behaviorDefinition/validation.d.ts +0 -1
- package/dist/core/behaviorDefinition/validation.d.ts.map +1 -1
- package/dist/core/behaviorDefinition/validation.js +0 -1
- package/dist/core/class/AdtClass.d.ts.map +1 -1
- package/dist/core/class/AdtClass.js +1 -1
- package/dist/core/class/create.d.ts +2 -2
- package/dist/core/class/create.d.ts.map +1 -1
- package/dist/core/class/create.js +12 -14
- package/dist/core/class/run.d.ts +2 -3
- package/dist/core/class/run.d.ts.map +1 -1
- package/dist/core/class/run.js +2 -3
- package/dist/core/dataElement/AdtDataElement.d.ts.map +1 -1
- package/dist/core/dataElement/AdtDataElement.js +2 -2
- package/dist/core/dataElement/update.d.ts +3 -3
- package/dist/core/dataElement/update.d.ts.map +1 -1
- package/dist/core/dataElement/update.js +8 -7
- package/dist/core/domain/AdtDomain.d.ts.map +1 -1
- package/dist/core/domain/AdtDomain.js +3 -3
- package/dist/core/domain/check.d.ts +2 -2
- package/dist/core/domain/check.d.ts.map +1 -1
- package/dist/core/domain/check.js +2 -2
- package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
- package/dist/core/enhancement/AdtEnhancement.js +3 -3
- package/dist/core/enhancement/create.d.ts +2 -2
- package/dist/core/enhancement/create.d.ts.map +1 -1
- package/dist/core/enhancement/create.js +12 -14
- package/dist/core/enhancement/update.d.ts +3 -3
- package/dist/core/enhancement/update.d.ts.map +1 -1
- package/dist/core/enhancement/update.js +14 -16
- package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
- package/dist/core/functionGroup/AdtFunctionGroup.js +1 -1
- package/dist/core/functionGroup/create.d.ts +2 -2
- package/dist/core/functionGroup/create.d.ts.map +1 -1
- package/dist/core/functionGroup/create.js +26 -26
- package/dist/core/functionModule/AdtFunctionModule.d.ts.map +1 -1
- package/dist/core/functionModule/AdtFunctionModule.js +2 -1
- package/dist/core/interface/AdtInterface.d.ts.map +1 -1
- package/dist/core/interface/AdtInterface.js +1 -1
- package/dist/core/interface/create.d.ts +2 -2
- package/dist/core/interface/create.d.ts.map +1 -1
- package/dist/core/interface/create.js +6 -6
- package/dist/core/metadataExtension/AdtMetadataExtension.d.ts.map +1 -1
- package/dist/core/metadataExtension/AdtMetadataExtension.js +2 -1
- package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
- package/dist/core/serviceDefinition/AdtServiceDefinition.js +2 -1
- package/dist/core/shared/AdtUtils.d.ts +8 -3
- package/dist/core/shared/AdtUtils.d.ts.map +1 -1
- package/dist/core/shared/AdtUtils.js +8 -3
- package/dist/core/shared/getInactiveObjects.d.ts +0 -1
- package/dist/core/shared/getInactiveObjects.d.ts.map +1 -1
- package/dist/core/shared/getInactiveObjects.js +0 -1
- package/dist/core/shared/index.d.ts +1 -1
- package/dist/core/shared/index.d.ts.map +1 -1
- package/dist/core/shared/packageHierarchy.d.ts +4 -4
- package/dist/core/shared/packageHierarchy.d.ts.map +1 -1
- package/dist/core/shared/packageHierarchy.js +297 -176
- package/dist/core/shared/types.d.ts +11 -0
- package/dist/core/shared/types.d.ts.map +1 -1
- package/dist/core/structure/AdtStructure.d.ts.map +1 -1
- package/dist/core/structure/AdtStructure.js +5 -4
- package/dist/core/structure/check.d.ts +2 -2
- package/dist/core/structure/check.d.ts.map +1 -1
- package/dist/core/structure/check.js +3 -3
- package/dist/core/table/AdtTable.d.ts.map +1 -1
- package/dist/core/table/AdtTable.js +2 -1
- package/dist/core/tabletype/AdtDdicTableType.d.ts.map +1 -1
- package/dist/core/tabletype/AdtDdicTableType.js +4 -3
- package/dist/core/tabletype/read.d.ts.map +1 -1
- package/dist/core/tabletype/read.js +1 -6
- package/dist/core/tabletype/update.d.ts +2 -2
- package/dist/core/tabletype/update.d.ts.map +1 -1
- package/dist/core/tabletype/update.js +3 -9
- package/dist/core/transport/AdtRequest.d.ts.map +1 -1
- package/dist/core/transport/AdtRequest.js +1 -0
- package/dist/core/unitTest/AdtCdsUnitTest.d.ts.map +1 -1
- package/dist/core/unitTest/AdtCdsUnitTest.js +1 -0
- package/dist/core/unitTest/AdtUnitTest.d.ts.map +1 -1
- package/dist/core/unitTest/AdtUnitTest.js +1 -0
- package/dist/core/view/AdtView.d.ts.map +1 -1
- package/dist/core/view/AdtView.js +5 -4
- package/dist/core/view/check.d.ts +2 -2
- package/dist/core/view/check.d.ts.map +1 -1
- package/dist/core/view/check.js +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -285,6 +285,18 @@ await adtObject.readTransport(config, { withLongPolling: true });
|
|
|
285
285
|
- After `activate()` operations - wait for object to be available in active version
|
|
286
286
|
- In tests - replace fixed `setTimeout` delays with long polling for better reliability
|
|
287
287
|
|
|
288
|
+
Operation results are stored on the returned state (`createResult`, `updateResult`, `checkResult`, etc.):
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
const createState = await client.getFunctionModule().create({
|
|
292
|
+
functionGroupName: 'ZFGROUP',
|
|
293
|
+
functionModuleName: 'ZFM_TEST',
|
|
294
|
+
description: 'Test FM',
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
console.log(createState.createResult?.status);
|
|
298
|
+
```
|
|
299
|
+
|
|
288
300
|
### Accept Negotiation (Optional)
|
|
289
301
|
|
|
290
302
|
Some ADT endpoints return `406` when the `Accept` header does not match the system’s supported media types. The client can
|
|
@@ -23,7 +23,6 @@ import type { IBehaviorDefinitionValidationParams } from './types';
|
|
|
23
23
|
* // Check validation result
|
|
24
24
|
* const severity = result.data.match(/<SEVERITY>([^<]+)<\/SEVERITY>/)?.[1];
|
|
25
25
|
* if (severity === 'OK') {
|
|
26
|
-
* console.log('Validation successful');
|
|
27
26
|
* }
|
|
28
27
|
* ```
|
|
29
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,SAAS,CAAC;AAEnE
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,SAAS,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,mCAAmC,GAC1C,OAAO,CAAC,aAAa,CAAC,CA2BxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKzD,qBAAa,QAAS,YAAW,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;IACpE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAgB,UAAU,EAAE,MAAM,CAAW;gBAEjC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA+CnE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKzD,qBAAa,QAAS,YAAW,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;IACpE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAgB,UAAU,EAAE,MAAM,CAAW;gBAEjC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA+CnE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IAiEvB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,GAAE,QAAQ,GAAG,UAAqB,EACzC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAoDnC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IAgCvB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IAiLvB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA6DjE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IA6CnE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;IA2EvB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS1D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAgBvB;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrE;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAazB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EACzD,OAAO,GAAE,QAAQ,GAAG,UAAuB,GAC1C,OAAO,CAAC,aAAa,CAAC;IAezB;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,aAAa,CAAC;IAqDzB;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,aAAa,CAAC;IAczB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,WAAW,CAAC;CAmCxB"}
|
|
@@ -135,7 +135,7 @@ class AdtClass {
|
|
|
135
135
|
master_system: config.masterSystem,
|
|
136
136
|
responsible: config.responsible,
|
|
137
137
|
template_xml: config.classTemplate,
|
|
138
|
-
});
|
|
138
|
+
}, this.logger);
|
|
139
139
|
objectCreated = true;
|
|
140
140
|
this.connection.setSessionType('stateless');
|
|
141
141
|
this.logger?.info?.('Class created');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Class create operations - Low-level functions
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
5
|
import type { ICreateClassParams } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Low-level: Create class object with metadata (POST)
|
|
@@ -9,5 +9,5 @@ import type { ICreateClassParams } from './types';
|
|
|
9
9
|
*
|
|
10
10
|
* NOTE: Requires stateful session mode enabled via connection.setSessionType("stateful")
|
|
11
11
|
*/
|
|
12
|
-
export declare function create(connection: IAbapConnection, args: ICreateClassParams): Promise<AxiosResponse>;
|
|
12
|
+
export declare function create(connection: IAbapConnection, args: ICreateClassParams, logger?: ILogger): Promise<AxiosResponse>;
|
|
13
13
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/class/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/class/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,kBAAkB,EACxB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CA8GxB"}
|
|
@@ -8,17 +8,13 @@ const internalUtils_1 = require("../../utils/internalUtils");
|
|
|
8
8
|
const systemInfo_1 = require("../../utils/systemInfo");
|
|
9
9
|
const timeouts_1 = require("../../utils/timeouts");
|
|
10
10
|
const debugEnabled = process.env.DEBUG_ADT_LIBS === 'true';
|
|
11
|
-
const logger = {
|
|
12
|
-
debug: debugEnabled ? console.log : () => { },
|
|
13
|
-
error: debugEnabled ? console.error : () => { },
|
|
14
|
-
};
|
|
15
11
|
/**
|
|
16
12
|
* Low-level: Create class object with metadata (POST)
|
|
17
13
|
* Does NOT lock/upload/activate - just creates the object
|
|
18
14
|
*
|
|
19
15
|
* NOTE: Requires stateful session mode enabled via connection.setSessionType("stateful")
|
|
20
16
|
*/
|
|
21
|
-
async function create(connection, args) {
|
|
17
|
+
async function create(connection, args, logger) {
|
|
22
18
|
// Description is limited to 60 characters in SAP ADT
|
|
23
19
|
const description = (0, internalUtils_1.limitDescription)(args.description || args.class_name || '');
|
|
24
20
|
const url = `/sap/bc/adt/oo/classes${args.transport_request ? `?corrNr=${args.transport_request}` : ''}`;
|
|
@@ -76,10 +72,12 @@ async function create(connection, args) {
|
|
|
76
72
|
'Content-Type': 'application/vnd.sap.adt.oo.classes.v4+xml',
|
|
77
73
|
};
|
|
78
74
|
// Log request details for debugging authorization issues
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
75
|
+
if (debugEnabled) {
|
|
76
|
+
logger?.debug?.(`[DEBUG] Creating class - URL: ${url}`);
|
|
77
|
+
logger?.debug?.(`[DEBUG] Creating class - Method: POST`);
|
|
78
|
+
logger?.debug?.(`[DEBUG] Creating class - Headers: ${JSON.stringify(headers, null, 2)}`);
|
|
79
|
+
logger?.debug?.(`[DEBUG] Creating class - Body (first 500 chars): ${metadataXml.substring(0, 500)}`);
|
|
80
|
+
}
|
|
83
81
|
try {
|
|
84
82
|
const response = await connection.makeAdtRequest({
|
|
85
83
|
url,
|
|
@@ -92,11 +90,11 @@ async function create(connection, args) {
|
|
|
92
90
|
}
|
|
93
91
|
catch (error) {
|
|
94
92
|
// Log error details for debugging
|
|
95
|
-
if (error.response) {
|
|
96
|
-
logger
|
|
97
|
-
logger
|
|
98
|
-
logger
|
|
99
|
-
logger
|
|
93
|
+
if (error.response && debugEnabled) {
|
|
94
|
+
logger?.error?.(`[ERROR] Create class failed - Status: ${error.response.status}`);
|
|
95
|
+
logger?.error?.(`[ERROR] Create class failed - StatusText: ${error.response.statusText}`);
|
|
96
|
+
logger?.error?.(`[ERROR] Create class failed - Response headers: ${JSON.stringify(error.response.headers, null, 2)}`);
|
|
97
|
+
logger?.error?.(`[ERROR] Create class failed - Response data (first 1000 chars):`, typeof error.response.data === 'string'
|
|
100
98
|
? error.response.data.substring(0, 1000)
|
|
101
99
|
: JSON.stringify(error.response.data).substring(0, 1000));
|
|
102
100
|
}
|
package/dist/core/class/run.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-a
|
|
|
5
5
|
/**
|
|
6
6
|
* Run an ABAP class that implements if_oo_adt_classrun interface.
|
|
7
7
|
*
|
|
8
|
-
* This executes the class's main() method and returns
|
|
8
|
+
* This executes the class's main() method and returns execution output.
|
|
9
9
|
* The class must implement if_oo_adt_classrun interface to be executable.
|
|
10
10
|
*
|
|
11
11
|
* Endpoint: POST /sap/bc/adt/oo/classrun/{className}
|
|
@@ -20,7 +20,7 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-a
|
|
|
20
20
|
* @param className - Name of the class to run (must implement if_oo_adt_classrun)
|
|
21
21
|
* @param runnable - Optional flag to check if class is runnable (default: true, throws error if false)
|
|
22
22
|
* @param sessionId - Optional session ID for session-based requests
|
|
23
|
-
* @returns Response with
|
|
23
|
+
* @returns Response with execution output from the class execution
|
|
24
24
|
* @throws Error if runnable is false, or if class doesn't implement if_oo_adt_classrun or execution fails
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
@@ -38,7 +38,6 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-a
|
|
|
38
38
|
* // ENDCLASS.
|
|
39
39
|
*
|
|
40
40
|
* const result = await runClass(connection, 'ZCL_TEST', true);
|
|
41
|
-
* console.log(result.data); // Console output from the class
|
|
42
41
|
*
|
|
43
42
|
* // Check if class is runnable before attempting to run
|
|
44
43
|
* if (classConfig.runnable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/core/class/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/core/class/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAc,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAOD,YAAY,EACV,wBAAwB,IAAI,uBAAuB,EACnD,wBAAwB,IAAI,uBAAuB,GACpD,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,wBAAwB,EAAE,EACjC,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CAgDxB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,MAAM,EACb,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,GACxE,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
package/dist/core/class/run.js
CHANGED
|
@@ -13,7 +13,7 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
13
13
|
/**
|
|
14
14
|
* Run an ABAP class that implements if_oo_adt_classrun interface.
|
|
15
15
|
*
|
|
16
|
-
* This executes the class's main() method and returns
|
|
16
|
+
* This executes the class's main() method and returns execution output.
|
|
17
17
|
* The class must implement if_oo_adt_classrun interface to be executable.
|
|
18
18
|
*
|
|
19
19
|
* Endpoint: POST /sap/bc/adt/oo/classrun/{className}
|
|
@@ -28,7 +28,7 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
28
28
|
* @param className - Name of the class to run (must implement if_oo_adt_classrun)
|
|
29
29
|
* @param runnable - Optional flag to check if class is runnable (default: true, throws error if false)
|
|
30
30
|
* @param sessionId - Optional session ID for session-based requests
|
|
31
|
-
* @returns Response with
|
|
31
|
+
* @returns Response with execution output from the class execution
|
|
32
32
|
* @throws Error if runnable is false, or if class doesn't implement if_oo_adt_classrun or execution fails
|
|
33
33
|
*
|
|
34
34
|
* @example
|
|
@@ -46,7 +46,6 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
46
46
|
* // ENDCLASS.
|
|
47
47
|
*
|
|
48
48
|
* const result = await runClass(connection, 'ZCL_TEST', true);
|
|
49
|
-
* console.log(result.data); // Console output from the class
|
|
50
49
|
*
|
|
51
50
|
* // Check if class is runnable before attempting to run
|
|
52
51
|
* if (classConfig.runnable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAKrE,qBAAa,cACX,YAAW,UAAU,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAiB;gBAEvC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAkB7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAsE7B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,QAAQ,GAAE,QAAQ,GAAG,UAAqB,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IA0BzC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC;IA0C7B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAKrE,qBAAa,cACX,YAAW,UAAU,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAiB;gBAEvC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAkB7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAsE7B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,QAAQ,GAAE,QAAQ,GAAG,UAAqB,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IA0BzC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC;IA0C7B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAsP7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAmC7B;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC;IAqB7B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,iBAAiB,CAAC;IAsC7B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAShE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;CAgB9B"}
|
|
@@ -231,7 +231,7 @@ class AdtDataElement {
|
|
|
231
231
|
search_help: config.searchHelp,
|
|
232
232
|
search_help_parameter: config.searchHelpParameter,
|
|
233
233
|
set_get_parameter: config.setGetParameter,
|
|
234
|
-
}, options.lockHandle);
|
|
234
|
+
}, options.lockHandle, this.logger);
|
|
235
235
|
this.logger?.info?.('Data element updated (low-level)');
|
|
236
236
|
return {
|
|
237
237
|
updateResult: updateResponse,
|
|
@@ -277,7 +277,7 @@ class AdtDataElement {
|
|
|
277
277
|
search_help: config.searchHelp,
|
|
278
278
|
search_help_parameter: config.searchHelpParameter,
|
|
279
279
|
set_get_parameter: config.setGetParameter,
|
|
280
|
-
}, lockHandle);
|
|
280
|
+
}, lockHandle, this.logger);
|
|
281
281
|
// updateDataElement returns void, so we don't store it in state
|
|
282
282
|
this.logger?.info?.('Data element updated');
|
|
283
283
|
// 3.5. Read with long polling to ensure object is ready after update
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DataElement update operations
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
5
|
import type { IUpdateDataElementParams } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Get domain info to extract dataType, length, decimals
|
|
@@ -19,11 +19,11 @@ export declare function updateDataElementInternal(connection: IAbapConnection, a
|
|
|
19
19
|
dataType: string;
|
|
20
20
|
length: number;
|
|
21
21
|
decimals: number;
|
|
22
|
-
}): Promise<AxiosResponse>;
|
|
22
|
+
}, logger?: ILogger): Promise<AxiosResponse>;
|
|
23
23
|
/**
|
|
24
24
|
* Update data element - atomic PUT operation
|
|
25
25
|
* NOTE: Requires object to be locked first via lockDataElement()
|
|
26
26
|
* NOTE: Caller should call connection.setSessionType("stateful") before locking
|
|
27
27
|
*/
|
|
28
|
-
export declare function updateDataElement(connection: IAbapConnection, params: IUpdateDataElementParams, lockHandle: string): Promise<AxiosResponse>;
|
|
28
|
+
export declare function updateDataElement(connection: IAbapConnection, params: IUpdateDataElementParams, lockHandle: string, logger?: ILogger): Promise<AxiosResponse>;
|
|
29
29
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAIxD;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCjE;AAmCD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,wBAAwB,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EACnE,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAgMxB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,wBAAwB,EAChC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAgCxB"}
|
|
@@ -10,6 +10,7 @@ const fast_xml_parser_1 = require("fast-xml-parser");
|
|
|
10
10
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
11
11
|
const systemInfo_1 = require("../../utils/systemInfo");
|
|
12
12
|
const timeouts_1 = require("../../utils/timeouts");
|
|
13
|
+
const debugEnabled = process.env.DEBUG_ADT_LIBS === 'true';
|
|
13
14
|
/**
|
|
14
15
|
* Get domain info to extract dataType, length, decimals
|
|
15
16
|
*/
|
|
@@ -66,7 +67,7 @@ async function _getDataElementForVerification(connection, dataElementName) {
|
|
|
66
67
|
* Update data element with new data
|
|
67
68
|
* Requires object to be locked first (lockHandle must be provided)
|
|
68
69
|
*/
|
|
69
|
-
async function updateDataElementInternal(connection, args, lockHandle, username, _domainInfo) {
|
|
70
|
+
async function updateDataElementInternal(connection, args, lockHandle, username, _domainInfo, logger) {
|
|
70
71
|
const dataElementNameEncoded = (0, internalUtils_1.encodeSapObjectName)(args.data_element_name.toLowerCase());
|
|
71
72
|
const corrNrParam = args.transport_request
|
|
72
73
|
? `&corrNr=${args.transport_request}`
|
|
@@ -190,8 +191,8 @@ async function updateDataElementInternal(connection, args, lockHandle, username,
|
|
|
190
191
|
'Content-Type': 'application/vnd.sap.adt.dataelements.v2+xml; charset=utf-8',
|
|
191
192
|
};
|
|
192
193
|
// Debug: log XML when DEBUG_ADT_LIBS is enabled (formatted for readability)
|
|
193
|
-
if (
|
|
194
|
-
|
|
194
|
+
if (debugEnabled) {
|
|
195
|
+
logger?.debug?.('[UPDATE XML]');
|
|
195
196
|
// Format XML with indentation for readability
|
|
196
197
|
try {
|
|
197
198
|
const { XMLParser, XMLBuilder } = require('fast-xml-parser');
|
|
@@ -207,11 +208,11 @@ async function updateDataElementInternal(connection, args, lockHandle, username,
|
|
|
207
208
|
});
|
|
208
209
|
const parsed = parser.parse(xmlBody);
|
|
209
210
|
const formatted = builder.build(parsed);
|
|
210
|
-
|
|
211
|
+
logger?.debug?.(formatted);
|
|
211
212
|
}
|
|
212
213
|
catch {
|
|
213
214
|
// If formatting fails, just log as-is
|
|
214
|
-
|
|
215
|
+
logger?.debug?.(xmlBody);
|
|
215
216
|
}
|
|
216
217
|
}
|
|
217
218
|
return connection.makeAdtRequest({
|
|
@@ -227,7 +228,7 @@ async function updateDataElementInternal(connection, args, lockHandle, username,
|
|
|
227
228
|
* NOTE: Requires object to be locked first via lockDataElement()
|
|
228
229
|
* NOTE: Caller should call connection.setSessionType("stateful") before locking
|
|
229
230
|
*/
|
|
230
|
-
async function updateDataElement(connection, params, lockHandle) {
|
|
231
|
+
async function updateDataElement(connection, params, lockHandle, logger) {
|
|
231
232
|
if (!params.data_element_name) {
|
|
232
233
|
throw new Error('Data element name is required');
|
|
233
234
|
}
|
|
@@ -246,5 +247,5 @@ async function updateDataElement(connection, params, lockHandle) {
|
|
|
246
247
|
length: params.length || 0,
|
|
247
248
|
decimals: params.decimals || 0,
|
|
248
249
|
};
|
|
249
|
-
return updateDataElementInternal(connection, params, lockHandle, username, domainInfo);
|
|
250
|
+
return updateDataElementInternal(connection, params, lockHandle, username, domainInfo, logger);
|
|
250
251
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK3D,qBAAa,SAAU,YAAW,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAY;gBAElC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBrE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAuExB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,QAAQ,GAAE,QAAQ,GAAG,UAAqB,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAwBpC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IAwCxB;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK3D,qBAAa,SAAU,YAAW,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAY;gBAElC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBrE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAuExB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,QAAQ,GAAE,QAAQ,GAAG,UAAqB,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAwBpC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IAwCxB;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IA+NxB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAmCnE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBrE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC;IAuBxB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,YAAY,CAAC;IAoCxB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;CAgBzB"}
|
|
@@ -238,7 +238,7 @@ class AdtDomain {
|
|
|
238
238
|
const xmlToCheck = options?.xmlContent;
|
|
239
239
|
if (xmlToCheck) {
|
|
240
240
|
this.logger?.info?.('check(inactive)');
|
|
241
|
-
const checkResponse = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, 'inactive', xmlToCheck);
|
|
241
|
+
const checkResponse = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, 'inactive', xmlToCheck, this.logger);
|
|
242
242
|
state.checkResult = checkResponse;
|
|
243
243
|
this.logger?.info?.('checked(inactive)');
|
|
244
244
|
}
|
|
@@ -285,7 +285,7 @@ class AdtDomain {
|
|
|
285
285
|
}
|
|
286
286
|
// 5. Final check (no stateful needed)
|
|
287
287
|
this.logger?.info?.('check(inactive)');
|
|
288
|
-
const checkResponse2 = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, 'inactive');
|
|
288
|
+
const checkResponse2 = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, 'inactive', undefined, this.logger);
|
|
289
289
|
state.checkResult = checkResponse2;
|
|
290
290
|
this.logger?.info?.('checked(inactive)');
|
|
291
291
|
// 6. Activate (if requested, no stateful needed - uses same session/cookies)
|
|
@@ -416,7 +416,7 @@ class AdtDomain {
|
|
|
416
416
|
};
|
|
417
417
|
// Map status to version
|
|
418
418
|
const version = status === 'active' ? 'active' : 'inactive';
|
|
419
|
-
const checkResponse = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, version);
|
|
419
|
+
const checkResponse = await (0, check_1.checkDomainSyntax)(this.connection, config.domainName, version, undefined, this.logger);
|
|
420
420
|
state.checkResult = checkResponse;
|
|
421
421
|
return state;
|
|
422
422
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Domain check operations
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
5
|
/**
|
|
6
6
|
* Check domain syntax
|
|
7
7
|
*
|
|
@@ -13,5 +13,5 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-a
|
|
|
13
13
|
*
|
|
14
14
|
* Note: When xmlContent is provided, it should be the same XML that will be sent in PUT request.
|
|
15
15
|
*/
|
|
16
|
-
export declare function checkDomainSyntax(connection: IAbapConnection, domainName: string, version: 'active' | 'inactive', xmlContent?: string): Promise<AxiosResponse>;
|
|
16
|
+
export declare function checkDomainSyntax(connection: IAbapConnection, domainName: string, version: 'active' | 'inactive', xmlContent?: string, logger?: ILogger): Promise<AxiosResponse>;
|
|
17
17
|
//# sourceMappingURL=check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/core/domain/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/core/domain/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAuExB"}
|
|
@@ -18,7 +18,7 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
18
18
|
*
|
|
19
19
|
* Note: When xmlContent is provided, it should be the same XML that will be sent in PUT request.
|
|
20
20
|
*/
|
|
21
|
-
async function checkDomainSyntax(connection, domainName, version, xmlContent) {
|
|
21
|
+
async function checkDomainSyntax(connection, domainName, version, xmlContent, logger) {
|
|
22
22
|
let response;
|
|
23
23
|
if (xmlContent) {
|
|
24
24
|
// Check with XML content (for unsaved changes or new content validation)
|
|
@@ -62,7 +62,7 @@ async function checkDomainSyntax(connection, domainName, version, xmlContent) {
|
|
|
62
62
|
if (hasCheckedMessage) {
|
|
63
63
|
// This is expected behavior - domain was already checked, return response anyway
|
|
64
64
|
if (process.env.DEBUG_ADT_LIBS === 'true') {
|
|
65
|
-
|
|
65
|
+
logger?.warn?.(`Check warning for domain ${domainName}: ${errorMessage} (domain was already checked)`);
|
|
66
66
|
}
|
|
67
67
|
return response; // Return response anyway
|
|
68
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtEnhancement.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/AdtEnhancement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,SAAS,CAAC;AAKjB,qBAAa,cACX,YAAW,UAAU,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAiB;gBAEvC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAqC7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AdtEnhancement.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/AdtEnhancement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,SAAS,CAAC;AAKjB,qBAAa,cACX,YAAW,UAAU,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAiB;gBAEvC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAKzD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAqC7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAuE7B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,GAAE,QAAQ,GAAG,UAAqB,EACzC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAoDzC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC;IAgD7B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,iBAAiB,CAAC;IA+C7B;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IA6O7B;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAiD7B;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAqC7B;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC;IAoC7B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAahE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;CAkB9B"}
|
|
@@ -106,7 +106,7 @@ class AdtEnhancement {
|
|
|
106
106
|
transport_request: config.transportRequest,
|
|
107
107
|
enhancement_spot: config.enhancementSpot,
|
|
108
108
|
badi_definition: config.badiDefinition,
|
|
109
|
-
});
|
|
109
|
+
}, this.logger);
|
|
110
110
|
state.createResult = createResponse;
|
|
111
111
|
objectCreated = true;
|
|
112
112
|
this.logger?.info?.('Enhancement created');
|
|
@@ -304,7 +304,7 @@ class AdtEnhancement {
|
|
|
304
304
|
source_code: codeToUpdate,
|
|
305
305
|
lock_handle: options.lockHandle,
|
|
306
306
|
transport_request: config.transportRequest,
|
|
307
|
-
});
|
|
307
|
+
}, this.logger);
|
|
308
308
|
this.logger?.info?.('Enhancement updated (low-level)');
|
|
309
309
|
return {
|
|
310
310
|
updateResult: updateResponse,
|
|
@@ -337,7 +337,7 @@ class AdtEnhancement {
|
|
|
337
337
|
source_code: codeToCheck,
|
|
338
338
|
lock_handle: lockHandle,
|
|
339
339
|
transport_request: config.transportRequest,
|
|
340
|
-
});
|
|
340
|
+
}, this.logger);
|
|
341
341
|
state.updateResult = updateResponse;
|
|
342
342
|
this.logger?.info?.('Enhancement updated');
|
|
343
343
|
// 3.5. Read with long polling (wait for object to be ready after update)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhancement create operations - Low-level functions
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
5
|
import { type ICreateEnhancementParams } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Low-level: Create enhancement object with metadata (POST)
|
|
@@ -13,5 +13,5 @@ import { type ICreateEnhancementParams } from './types';
|
|
|
13
13
|
* @param args - Create parameters
|
|
14
14
|
* @returns Axios response
|
|
15
15
|
*/
|
|
16
|
-
export declare function create(connection: IAbapConnection, args: ICreateEnhancementParams): Promise<AxiosResponse>;
|
|
16
|
+
export declare function create(connection: IAbapConnection, args: ICreateEnhancementParams, logger?: ILogger): Promise<AxiosResponse>;
|
|
17
17
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,SAAS,CAAC;AAgDjB;;;;;;;;;GASG;AACH,wBAAsB,MAAM,CAC1B,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,wBAAwB,EAC9B,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAwExB"}
|
|
@@ -9,10 +9,6 @@ const systemInfo_1 = require("../../utils/systemInfo");
|
|
|
9
9
|
const timeouts_1 = require("../../utils/timeouts");
|
|
10
10
|
const types_1 = require("./types");
|
|
11
11
|
const debugEnabled = process.env.DEBUG_ADT_LIBS === 'true';
|
|
12
|
-
const logger = {
|
|
13
|
-
debug: debugEnabled ? console.log : () => { },
|
|
14
|
-
error: debugEnabled ? console.error : () => { },
|
|
15
|
-
};
|
|
16
12
|
/**
|
|
17
13
|
* Build XML payload for enhancement creation based on type
|
|
18
14
|
*/
|
|
@@ -56,7 +52,7 @@ function buildCreateXml(args, masterSystem, username) {
|
|
|
56
52
|
* @param args - Create parameters
|
|
57
53
|
* @returns Axios response
|
|
58
54
|
*/
|
|
59
|
-
async function create(connection, args) {
|
|
55
|
+
async function create(connection, args, logger) {
|
|
60
56
|
if (!args.enhancement_name) {
|
|
61
57
|
throw new Error('enhancement_name is required');
|
|
62
58
|
}
|
|
@@ -81,10 +77,12 @@ async function create(connection, args) {
|
|
|
81
77
|
Accept: 'application/vnd.sap.adt.enhancements.v1+xml, application/xml',
|
|
82
78
|
'Content-Type': 'application/vnd.sap.adt.enhancements.v1+xml',
|
|
83
79
|
};
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
if (debugEnabled) {
|
|
81
|
+
logger?.debug?.(`[DEBUG] Creating enhancement - URL: ${url}`);
|
|
82
|
+
logger?.debug?.(`[DEBUG] Creating enhancement - Method: POST`);
|
|
83
|
+
logger?.debug?.(`[DEBUG] Creating enhancement - Headers: ${JSON.stringify(headers, null, 2)}`);
|
|
84
|
+
logger?.debug?.(`[DEBUG] Creating enhancement - Body (first 500 chars): ${metadataXml.substring(0, 500)}`);
|
|
85
|
+
}
|
|
88
86
|
try {
|
|
89
87
|
const response = await connection.makeAdtRequest({
|
|
90
88
|
url,
|
|
@@ -96,11 +94,11 @@ async function create(connection, args) {
|
|
|
96
94
|
return response;
|
|
97
95
|
}
|
|
98
96
|
catch (error) {
|
|
99
|
-
if (error.response) {
|
|
100
|
-
logger
|
|
101
|
-
logger
|
|
102
|
-
logger
|
|
103
|
-
logger
|
|
97
|
+
if (error.response && debugEnabled) {
|
|
98
|
+
logger?.error?.(`[ERROR] Create enhancement failed - Status: ${error.response.status}`);
|
|
99
|
+
logger?.error?.(`[ERROR] Create enhancement failed - StatusText: ${error.response.statusText}`);
|
|
100
|
+
logger?.error?.(`[ERROR] Create enhancement failed - Response headers: ${JSON.stringify(error.response.headers, null, 2)}`);
|
|
101
|
+
logger?.error?.(`[ERROR] Create enhancement failed - Response data (first 1000 chars):`, typeof error.response.data === 'string'
|
|
104
102
|
? error.response.data.substring(0, 1000)
|
|
105
103
|
: JSON.stringify(error.response.data).substring(0, 1000));
|
|
106
104
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhancement update operations - Low-level functions
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@mcp-abap-adt/interfaces';
|
|
5
5
|
import { type EnhancementType, type IUpdateEnhancementParams } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Low-level: Update enhancement source code (PUT)
|
|
@@ -13,7 +13,7 @@ import { type EnhancementType, type IUpdateEnhancementParams } from './types';
|
|
|
13
13
|
* @param args - Update parameters
|
|
14
14
|
* @returns Axios response
|
|
15
15
|
*/
|
|
16
|
-
export declare function update(connection: IAbapConnection, args: IUpdateEnhancementParams): Promise<AxiosResponse>;
|
|
16
|
+
export declare function update(connection: IAbapConnection, args: IUpdateEnhancementParams, logger?: ILogger): Promise<AxiosResponse>;
|
|
17
17
|
/**
|
|
18
18
|
* Convenience function: Update enhancement with simpler signature
|
|
19
19
|
*
|
|
@@ -25,5 +25,5 @@ export declare function update(connection: IAbapConnection, args: IUpdateEnhance
|
|
|
25
25
|
* @param transportRequest - Optional transport request
|
|
26
26
|
* @returns Axios response
|
|
27
27
|
*/
|
|
28
|
-
export declare function updateEnhancement(connection: IAbapConnection, enhancementType: EnhancementType, enhancementName: string, sourceCode: string, lockHandle: string, transportRequest?: string): Promise<AxiosResponse>;
|
|
28
|
+
export declare function updateEnhancement(connection: IAbapConnection, enhancementType: EnhancementType, enhancementName: string, sourceCode: string, lockHandle: string, transportRequest?: string, logger?: ILogger): Promise<AxiosResponse>;
|
|
29
29
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/enhancement/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,wBAAwB,EAE9B,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;GASG;AACH,wBAAsB,MAAM,CAC1B,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,wBAAwB,EAC9B,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CA6ExB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAYxB"}
|