@mcp-abap-adt/adt-clients 3.10.2 → 3.11.3
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 +2 -0
- package/dist/core/class/AdtClassLegacy.d.ts +17 -1
- package/dist/core/class/AdtClassLegacy.d.ts.map +1 -1
- package/dist/core/class/AdtClassLegacy.js +100 -1
- package/dist/core/domain/check.d.ts +1 -1
- package/dist/core/domain/check.d.ts.map +1 -1
- package/dist/core/domain/check.js +1 -1
- package/dist/core/package/AdtPackage.d.ts.map +1 -1
- package/dist/core/package/AdtPackage.js +29 -20
- package/dist/core/package/create.js +1 -1
- package/dist/core/package/delete.d.ts +3 -7
- package/dist/core/package/delete.d.ts.map +1 -1
- package/dist/core/package/lock.d.ts +5 -1
- package/dist/core/package/lock.d.ts.map +1 -1
- package/dist/core/package/lock.js +5 -10
- package/dist/core/package/types.d.ts +2 -13
- package/dist/core/package/types.d.ts.map +1 -1
- package/dist/core/package/unlock.js +1 -1
- package/dist/core/package/update.d.ts +2 -6
- package/dist/core/package/update.d.ts.map +1 -1
- package/dist/core/package/update.js +4 -1
- package/dist/core/unitTest/AdtUnitTestLegacy.d.ts +1 -2
- package/dist/core/unitTest/AdtUnitTestLegacy.d.ts.map +1 -1
- package/dist/core/unitTest/AdtUnitTestLegacy.js +0 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AdtClassLegacy - Class handler for legacy SAP systems (BASIS < 7.50)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* On legacy systems, the x-sap-adt-sessiontype: stateful header causes locks
|
|
5
|
+
* to be stored in ABAP session memory instead of the global enqueue server.
|
|
6
|
+
* This means lock + update + unlock MUST happen within the same stateful
|
|
7
|
+
* HTTP session — switching to stateless between lock and update invalidates
|
|
8
|
+
* the lock handle (GitHub #11).
|
|
9
|
+
*
|
|
10
|
+
* Overrides:
|
|
11
|
+
* - update() — keeps lock→check→update→unlock in one stateful session
|
|
12
|
+
* - delete() — uses direct DELETE instead of /sap/bc/adt/deletion/ API
|
|
5
13
|
*/
|
|
14
|
+
import type { IAdtOperationOptions } from '@mcp-abap-adt/interfaces';
|
|
6
15
|
import { AdtClass } from './AdtClass';
|
|
7
16
|
import type { IClassConfig, IClassState } from './types';
|
|
8
17
|
export declare class AdtClassLegacy extends AdtClass {
|
|
18
|
+
/**
|
|
19
|
+
* Update class — legacy override.
|
|
20
|
+
*
|
|
21
|
+
* Keeps lock→check→update→unlock in a single stateful session so the
|
|
22
|
+
* lock handle remains valid (legacy stores locks in ABAP session memory).
|
|
23
|
+
*/
|
|
24
|
+
update(config: Partial<IClassConfig>, options?: IAdtOperationOptions): Promise<IClassState>;
|
|
9
25
|
delete(config: Partial<IClassConfig>): Promise<IClassState>;
|
|
10
26
|
}
|
|
11
27
|
//# sourceMappingURL=AdtClassLegacy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtClassLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClassLegacy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AdtClassLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClassLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAa,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAMhF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,qBAAa,cAAe,SAAQ,QAAQ;IAC1C;;;;;OAKG;IACY,MAAM,CACnB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IA6HR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;CA+C3E"}
|
|
@@ -2,16 +2,115 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* AdtClassLegacy - Class handler for legacy SAP systems (BASIS < 7.50)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* On legacy systems, the x-sap-adt-sessiontype: stateful header causes locks
|
|
6
|
+
* to be stored in ABAP session memory instead of the global enqueue server.
|
|
7
|
+
* This means lock + update + unlock MUST happen within the same stateful
|
|
8
|
+
* HTTP session — switching to stateless between lock and update invalidates
|
|
9
|
+
* the lock handle (GitHub #11).
|
|
10
|
+
*
|
|
11
|
+
* Overrides:
|
|
12
|
+
* - update() — keeps lock→check→update→unlock in one stateful session
|
|
13
|
+
* - delete() — uses direct DELETE instead of /sap/bc/adt/deletion/ API
|
|
6
14
|
*/
|
|
7
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
16
|
exports.AdtClassLegacy = void 0;
|
|
9
17
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
10
18
|
const deleteLegacy_1 = require("../shared/deleteLegacy");
|
|
11
19
|
const AdtClass_1 = require("./AdtClass");
|
|
20
|
+
const activation_1 = require("./activation");
|
|
21
|
+
const check_1 = require("./check");
|
|
12
22
|
const lock_1 = require("./lock");
|
|
13
23
|
const unlock_1 = require("./unlock");
|
|
24
|
+
const update_1 = require("./update");
|
|
14
25
|
class AdtClassLegacy extends AdtClass_1.AdtClass {
|
|
26
|
+
/**
|
|
27
|
+
* Update class — legacy override.
|
|
28
|
+
*
|
|
29
|
+
* Keeps lock→check→update→unlock in a single stateful session so the
|
|
30
|
+
* lock handle remains valid (legacy stores locks in ABAP session memory).
|
|
31
|
+
*/
|
|
32
|
+
async update(config, options) {
|
|
33
|
+
if (!config.className) {
|
|
34
|
+
throw new Error('Class name is required');
|
|
35
|
+
}
|
|
36
|
+
// Low-level mode: caller owns the session
|
|
37
|
+
if (options?.lockHandle) {
|
|
38
|
+
return super.update(config, options);
|
|
39
|
+
}
|
|
40
|
+
let lockHandle;
|
|
41
|
+
const state = { errors: [] };
|
|
42
|
+
try {
|
|
43
|
+
// Enter stateful session for the entire lock→update→unlock chain
|
|
44
|
+
this.connection.setSessionType('stateful');
|
|
45
|
+
// 1. Lock
|
|
46
|
+
this.logger?.info?.('Legacy update step 1: Locking class');
|
|
47
|
+
lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
|
|
48
|
+
state.lockHandle = lockHandle;
|
|
49
|
+
this.logger?.info?.('Class locked, handle:', lockHandle);
|
|
50
|
+
// 2. Check inactive with source code
|
|
51
|
+
const codeToUpdate = options?.sourceCode || config.sourceCode;
|
|
52
|
+
if (codeToUpdate) {
|
|
53
|
+
this.logger?.info?.('Legacy update step 2: Checking inactive version');
|
|
54
|
+
state.checkResult = await (0, check_1.checkClass)(this.connection, config.className, 'inactive', codeToUpdate, this.contentTypes?.sourceArtifactContentType());
|
|
55
|
+
this.logger?.info?.('Check passed');
|
|
56
|
+
}
|
|
57
|
+
// 3. Update
|
|
58
|
+
if (codeToUpdate && lockHandle) {
|
|
59
|
+
this.logger?.info?.('Legacy update step 3: Updating class');
|
|
60
|
+
state.updateResult = await (0, update_1.updateClass)(this.connection, config.className, codeToUpdate, lockHandle, config.transportRequest, this.contentTypes?.sourceArtifactContentType());
|
|
61
|
+
this.logger?.info?.('Class updated');
|
|
62
|
+
}
|
|
63
|
+
// 4. Unlock (still within the same stateful session)
|
|
64
|
+
if (lockHandle) {
|
|
65
|
+
this.logger?.info?.('Legacy update step 4: Unlocking class');
|
|
66
|
+
state.unlockResult = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
67
|
+
lockHandle = undefined;
|
|
68
|
+
this.logger?.info?.('Class unlocked');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// Cleanup: try to unlock if still locked (within same session)
|
|
73
|
+
if (lockHandle) {
|
|
74
|
+
try {
|
|
75
|
+
this.logger?.warn?.('Unlocking class during error cleanup');
|
|
76
|
+
await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
|
|
77
|
+
}
|
|
78
|
+
catch (unlockError) {
|
|
79
|
+
this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
// Always return to stateless after the chain
|
|
86
|
+
this.connection.setSessionType('stateless');
|
|
87
|
+
}
|
|
88
|
+
// Post-lock operations (stateless is fine)
|
|
89
|
+
// 5. Final check
|
|
90
|
+
this.logger?.info?.('Legacy update step 5: Final check');
|
|
91
|
+
state.checkResult = await (0, check_1.checkClass)(this.connection, config.className, 'inactive');
|
|
92
|
+
this.logger?.info?.('Final check passed');
|
|
93
|
+
// 6. Activate (if requested)
|
|
94
|
+
if (options?.activateOnUpdate) {
|
|
95
|
+
this.logger?.info?.('Legacy update step 6: Activating class');
|
|
96
|
+
const activateResult = await (0, activation_1.activateClass)(this.connection, config.className);
|
|
97
|
+
state.activateResult = activateResult;
|
|
98
|
+
this.logger?.info?.('Class activated, status:', activateResult.status);
|
|
99
|
+
// Read with long polling to ensure object is ready after activation
|
|
100
|
+
this.logger?.info?.('Read (wait for object ready after activation)');
|
|
101
|
+
try {
|
|
102
|
+
const readState = await this.read({ className: config.className }, 'active', { withLongPolling: true });
|
|
103
|
+
if (readState) {
|
|
104
|
+
state.readResult = readState.readResult;
|
|
105
|
+
}
|
|
106
|
+
this.logger?.info?.('Object is ready after activation');
|
|
107
|
+
}
|
|
108
|
+
catch (readError) {
|
|
109
|
+
this.logger?.warn?.('Read with long polling failed after activation:', (0, internalUtils_1.safeErrorMessage)(readError));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return state;
|
|
113
|
+
}
|
|
15
114
|
async delete(config) {
|
|
16
115
|
if (!config.className) {
|
|
17
116
|
throw new Error('Class name is required');
|
|
@@ -13,5 +13,5 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@m
|
|
|
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,
|
|
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,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AASlC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,
|
|
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;AASlC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,CAAC,CAuDxB"}
|
|
@@ -19,7 +19,7 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
19
19
|
*
|
|
20
20
|
* Note: When xmlContent is provided, it should be the same XML that will be sent in PUT request.
|
|
21
21
|
*/
|
|
22
|
-
async function checkDomainSyntax(connection, domainName, version, xmlContent,
|
|
22
|
+
async function checkDomainSyntax(connection, domainName, version, xmlContent, _logger) {
|
|
23
23
|
let response;
|
|
24
24
|
if (xmlContent) {
|
|
25
25
|
// Check with XML content (for unsaved changes or new content validation)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA2BvE;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IA6FzB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IA0BrC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,CAAC;IAoCzB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,aAAa,CAAC;IAkCzB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAsLzB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BrE;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAkBzB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;CAiB1B"}
|
|
@@ -62,6 +62,7 @@ class AdtPackage {
|
|
|
62
62
|
transport_request: config.transportRequest,
|
|
63
63
|
application_component: config.applicationComponent,
|
|
64
64
|
responsible: config.responsible,
|
|
65
|
+
record_changes: config.recordChanges ?? false,
|
|
65
66
|
});
|
|
66
67
|
return {
|
|
67
68
|
validationResponse: response,
|
|
@@ -99,6 +100,7 @@ class AdtPackage {
|
|
|
99
100
|
transport_request: config.transportRequest,
|
|
100
101
|
application_component: config.applicationComponent,
|
|
101
102
|
responsible: config.responsible,
|
|
103
|
+
record_changes: config.recordChanges ?? false,
|
|
102
104
|
});
|
|
103
105
|
this.logger?.info?.('Validation passed');
|
|
104
106
|
// 2. Create (no stateful needed)
|
|
@@ -113,8 +115,8 @@ class AdtPackage {
|
|
|
113
115
|
transport_request: config.transportRequest,
|
|
114
116
|
application_component: config.applicationComponent,
|
|
115
117
|
responsible: config.responsible ?? this.systemContext.responsible,
|
|
116
|
-
|
|
117
|
-
record_changes: config.recordChanges,
|
|
118
|
+
master_system: this.systemContext.masterSystem,
|
|
119
|
+
record_changes: config.recordChanges ?? false,
|
|
118
120
|
});
|
|
119
121
|
this.logger?.info?.('Package created');
|
|
120
122
|
// 2.5. Read with long polling (wait for object to be ready)
|
|
@@ -130,11 +132,7 @@ class AdtPackage {
|
|
|
130
132
|
// Continue anyway - check might still work
|
|
131
133
|
}
|
|
132
134
|
objectCreated = true;
|
|
133
|
-
//
|
|
134
|
-
this.logger?.info?.('Step 3: Checking created package');
|
|
135
|
-
await (0, check_1.checkPackage)(this.connection, config.packageName, 'inactive');
|
|
136
|
-
this.logger?.info?.('Check after create passed');
|
|
137
|
-
// Packages are containers — no source code, no activation, no need to read back
|
|
135
|
+
// Packages are containers — no source code, no activation, no syntax check needed
|
|
138
136
|
return { errors: [] };
|
|
139
137
|
}
|
|
140
138
|
catch (error) {
|
|
@@ -273,7 +271,7 @@ class AdtPackage {
|
|
|
273
271
|
description: config.description,
|
|
274
272
|
package_type: config.packageType,
|
|
275
273
|
responsible: config.responsible,
|
|
276
|
-
record_changes: config.recordChanges,
|
|
274
|
+
record_changes: config.recordChanges ?? false,
|
|
277
275
|
}, options.lockHandle);
|
|
278
276
|
this.logger?.info?.('Package updated (low-level)');
|
|
279
277
|
return {
|
|
@@ -281,14 +279,28 @@ class AdtPackage {
|
|
|
281
279
|
errors: [],
|
|
282
280
|
};
|
|
283
281
|
}
|
|
282
|
+
// TODO: Package update via RFC (SADT_REST_RFC_ENDPOINT) fails with HTTP 400
|
|
283
|
+
// "Package is already locked" on PUT even though LOCK/UNLOCK succeed.
|
|
284
|
+
// Root cause: PAK framework locks are session-scoped. Each call to
|
|
285
|
+
// SADT_REST_RFC_ENDPOINT runs in a new internal ABAP context, so the
|
|
286
|
+
// PUT cannot access the PAK lock created by the LOCK call.
|
|
287
|
+
// DDIC objects are unaffected because their locks live in the DDIC buffer
|
|
288
|
+
// (accessible by lockHandle from any context).
|
|
289
|
+
// This is non-critical for release — HTTP is the primary transport for
|
|
290
|
+
// modern on-premise systems. RFC is used for legacy (BASIS < 7.50) where
|
|
291
|
+
// package CRUD is not supported anyway.
|
|
292
|
+
// Reference: docs/development/RFC_TESTING.md
|
|
284
293
|
let lockHandle;
|
|
294
|
+
let lockCorrNr;
|
|
285
295
|
try {
|
|
286
|
-
// 1. Lock
|
|
296
|
+
// 1. Lock — stateful mode stays active until after unlock
|
|
287
297
|
this.logger?.info?.('Step 1: Locking package');
|
|
288
298
|
this.connection.setSessionType('stateful');
|
|
289
|
-
|
|
299
|
+
const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
|
|
300
|
+
lockHandle = lockResult.lockHandle;
|
|
301
|
+
lockCorrNr = lockResult.corrNr;
|
|
290
302
|
this.connection.setSessionType('stateless');
|
|
291
|
-
this.logger?.info?.(
|
|
303
|
+
this.logger?.info?.(`Package locked, handle: ${lockHandle}, corrNr: ${lockCorrNr}`);
|
|
292
304
|
// 2. Check inactive with XML for update (if provided)
|
|
293
305
|
const xmlToCheck = options?.xmlContent;
|
|
294
306
|
if (xmlToCheck) {
|
|
@@ -308,9 +320,10 @@ class AdtPackage {
|
|
|
308
320
|
package_type: config.packageType,
|
|
309
321
|
software_component: config.softwareComponent,
|
|
310
322
|
transport_layer: config.transportLayer,
|
|
311
|
-
transport_request: config.transportRequest,
|
|
323
|
+
transport_request: config.transportRequest || lockCorrNr,
|
|
312
324
|
application_component: config.applicationComponent,
|
|
313
325
|
responsible: config.responsible ?? this.systemContext.responsible,
|
|
326
|
+
master_system: config.masterSystem ?? this.systemContext.masterSystem,
|
|
314
327
|
record_changes: config.recordChanges,
|
|
315
328
|
}, lockHandle);
|
|
316
329
|
this.logger?.info?.('Package updated');
|
|
@@ -327,7 +340,7 @@ class AdtPackage {
|
|
|
327
340
|
// Continue anyway - unlock might still work
|
|
328
341
|
}
|
|
329
342
|
}
|
|
330
|
-
// 4. Unlock
|
|
343
|
+
// 4. Unlock — set stateful before unlock, stateless after (standard pattern)
|
|
331
344
|
if (lockHandle) {
|
|
332
345
|
this.logger?.info?.('Step 4: Unlocking package');
|
|
333
346
|
this.connection.setSessionType('stateful');
|
|
@@ -336,11 +349,7 @@ class AdtPackage {
|
|
|
336
349
|
lockHandle = undefined;
|
|
337
350
|
this.logger?.info?.('Package unlocked');
|
|
338
351
|
}
|
|
339
|
-
//
|
|
340
|
-
this.logger?.info?.('Step 5: Final check');
|
|
341
|
-
await (0, check_1.checkPackage)(this.connection, config.packageName, 'inactive');
|
|
342
|
-
this.logger?.info?.('Final check passed');
|
|
343
|
-
// Note: Packages don't have activate operation
|
|
352
|
+
// Note: Packages have no source code — no check or activate needed
|
|
344
353
|
// Read and return result (no stateful needed)
|
|
345
354
|
const readResponse = await (0, read_1.getPackage)(this.connection, config.packageName);
|
|
346
355
|
return {
|
|
@@ -440,9 +449,9 @@ class AdtPackage {
|
|
|
440
449
|
throw new Error('Package name is required');
|
|
441
450
|
}
|
|
442
451
|
this.connection.setSessionType('stateful');
|
|
443
|
-
const
|
|
452
|
+
const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
|
|
444
453
|
this.connection.setSessionType('stateless');
|
|
445
|
-
return lockHandle;
|
|
454
|
+
return lockResult.lockHandle;
|
|
446
455
|
}
|
|
447
456
|
/**
|
|
448
457
|
* Unlock package
|
|
@@ -24,7 +24,7 @@ async function createPackage(connection, params) {
|
|
|
24
24
|
// Description is limited to 60 characters in SAP ADT
|
|
25
25
|
const description = escapeXml((0, internalUtils_1.limitDescription)(params.description || params.package_name));
|
|
26
26
|
const packageType = params.package_type || 'development';
|
|
27
|
-
const masterSystem = params.
|
|
27
|
+
const masterSystem = params.master_system;
|
|
28
28
|
const responsibleUser = params.responsible || '';
|
|
29
29
|
// Software component is required for package creation
|
|
30
30
|
if (!params.software_component) {
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Package delete operations
|
|
3
3
|
*/
|
|
4
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
5
|
-
export interface DeletePackageParams {
|
|
6
|
-
package_name: string;
|
|
7
|
-
transport_request?: string;
|
|
8
|
-
}
|
|
4
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, IDeletePackageParams } from '@mcp-abap-adt/interfaces';
|
|
9
5
|
/**
|
|
10
6
|
* Check if package can be deleted (deletion check)
|
|
11
7
|
* Returns response with isDeletable flag
|
|
12
8
|
*
|
|
13
9
|
* NOTE: Uses stateful session headers automatically if connection has stateful mode enabled
|
|
14
10
|
*/
|
|
15
|
-
export declare function checkPackageDeletion(connection: IAbapConnection, params:
|
|
11
|
+
export declare function checkPackageDeletion(connection: IAbapConnection, params: IDeletePackageParams): Promise<AxiosResponse>;
|
|
16
12
|
/**
|
|
17
13
|
* Parse deletion check response to get isDeletable flag
|
|
18
14
|
*/
|
|
@@ -24,5 +20,5 @@ export declare function parsePackageDeletionCheck(response: AxiosResponse): {
|
|
|
24
20
|
* Delete ABAP package using ADT deletion API
|
|
25
21
|
* For packages, empty transportNumber tag may be required
|
|
26
22
|
*/
|
|
27
|
-
export declare function deletePackage(connection: IAbapConnection, params:
|
|
23
|
+
export declare function deletePackage(connection: IAbapConnection, params: IDeletePackageParams): Promise<AxiosResponse>;
|
|
28
24
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/package/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAE7B,eAAe,
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/package/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAE7B,eAAe,EACf,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAWlC;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CA+BA;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAwFxB"}
|
|
@@ -9,5 +9,9 @@ import type { IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
|
9
9
|
* NOTE: Caller must enable stateful session mode via connection.setSessionType("stateful")
|
|
10
10
|
* before calling this function
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
12
|
+
export interface IPackageLockResult {
|
|
13
|
+
lockHandle: string;
|
|
14
|
+
corrNr?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function lockPackage(connection: IAbapConnection, packageName: string): Promise<IPackageLockResult>;
|
|
13
17
|
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/core/package/lock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAMhE;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/core/package/lock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAMhE;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
|
|
@@ -8,15 +8,8 @@ const fast_xml_parser_1 = require("fast-xml-parser");
|
|
|
8
8
|
const contentTypes_1 = require("../../constants/contentTypes");
|
|
9
9
|
const internalUtils_1 = require("../../utils/internalUtils");
|
|
10
10
|
const timeouts_1 = require("../../utils/timeouts");
|
|
11
|
-
/**
|
|
12
|
-
* Lock package for modification
|
|
13
|
-
* Returns lock handle that must be used in subsequent requests
|
|
14
|
-
*
|
|
15
|
-
* NOTE: Caller must enable stateful session mode via connection.setSessionType("stateful")
|
|
16
|
-
* before calling this function
|
|
17
|
-
*/
|
|
18
11
|
async function lockPackage(connection, packageName) {
|
|
19
|
-
const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName)}?_action=LOCK&accessMode=MODIFY`;
|
|
12
|
+
const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName.toLowerCase())}?_action=LOCK&accessMode=MODIFY`;
|
|
20
13
|
const headers = {
|
|
21
14
|
Accept: contentTypes_1.ACCEPT_LOCK,
|
|
22
15
|
};
|
|
@@ -33,9 +26,11 @@ async function lockPackage(connection, packageName) {
|
|
|
33
26
|
attributeNamePrefix: '',
|
|
34
27
|
});
|
|
35
28
|
const result = parser.parse(response.data);
|
|
36
|
-
const
|
|
29
|
+
const data = result?.['asx:abap']?.['asx:values']?.DATA;
|
|
30
|
+
const lockHandle = data?.LOCK_HANDLE;
|
|
37
31
|
if (!lockHandle) {
|
|
38
32
|
throw new Error('Failed to obtain lock handle from SAP. Package may be locked by another user.');
|
|
39
33
|
}
|
|
40
|
-
|
|
34
|
+
const corrNr = data?.CORR_NUMBER || undefined;
|
|
35
|
+
return { lockHandle, corrNr };
|
|
41
36
|
}
|
|
@@ -2,19 +2,7 @@
|
|
|
2
2
|
* Package module type definitions
|
|
3
3
|
*/
|
|
4
4
|
import type { IAdtObjectState } from '@mcp-abap-adt/interfaces';
|
|
5
|
-
export
|
|
6
|
-
package_name: string;
|
|
7
|
-
description?: string;
|
|
8
|
-
super_package: string;
|
|
9
|
-
package_type?: string;
|
|
10
|
-
software_component?: string;
|
|
11
|
-
transport_layer?: string;
|
|
12
|
-
transport_request?: string;
|
|
13
|
-
application_component?: string;
|
|
14
|
-
responsible?: string;
|
|
15
|
-
masterSystem?: string;
|
|
16
|
-
record_changes?: boolean;
|
|
17
|
-
}
|
|
5
|
+
export type { ICreatePackageParams, IDeletePackageParams, IReadPackageParams, IUpdatePackageParams, } from '@mcp-abap-adt/interfaces';
|
|
18
6
|
export interface IPackageConfig {
|
|
19
7
|
packageName: string;
|
|
20
8
|
superPackage?: string;
|
|
@@ -26,6 +14,7 @@ export interface IPackageConfig {
|
|
|
26
14
|
transportRequest?: string;
|
|
27
15
|
applicationComponent?: string;
|
|
28
16
|
responsible?: string;
|
|
17
|
+
masterSystem?: string;
|
|
29
18
|
recordChanges?: boolean;
|
|
30
19
|
onLock?: (lockHandle: string) => void;
|
|
31
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/package/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/package/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;CAAG"}
|
|
@@ -14,7 +14,7 @@ const timeouts_1 = require("../../utils/timeouts");
|
|
|
14
14
|
* after calling this function
|
|
15
15
|
*/
|
|
16
16
|
async function unlockPackage(connection, packageName, lockHandle) {
|
|
17
|
-
const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName)}?_action=UNLOCK&lockHandle=${encodeURIComponent(lockHandle)}`;
|
|
17
|
+
const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName.toLowerCase())}?_action=UNLOCK&lockHandle=${encodeURIComponent(lockHandle)}`;
|
|
18
18
|
return await connection.makeAdtRequest({
|
|
19
19
|
url,
|
|
20
20
|
method: 'POST',
|
|
@@ -5,17 +5,13 @@
|
|
|
5
5
|
* This preserves all SAP-managed fields (abapLanguageVersion, etc.)
|
|
6
6
|
* that would be lost if XML were built from scratch.
|
|
7
7
|
*/
|
|
8
|
-
import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
|
|
9
|
-
import type { ICreatePackageParams } from './types';
|
|
10
|
-
export interface UpdatePackageParams extends ICreatePackageParams {
|
|
11
|
-
package_name: string;
|
|
12
|
-
}
|
|
8
|
+
import type { IAdtResponse as AxiosResponse, IAbapConnection, IUpdatePackageParams } from '@mcp-abap-adt/interfaces';
|
|
13
9
|
/**
|
|
14
10
|
* Update package with new data (read-modify-write pattern)
|
|
15
11
|
*
|
|
16
12
|
* NOTE: Requires stateful session mode enabled via connection.setSessionType("stateful")
|
|
17
13
|
*/
|
|
18
|
-
export declare function updatePackage(connection: IAbapConnection, params:
|
|
14
|
+
export declare function updatePackage(connection: IAbapConnection, params: IUpdatePackageParams, lockHandle: string): Promise<AxiosResponse>;
|
|
19
15
|
/**
|
|
20
16
|
* Update only package description (safe update - only modifiable field)
|
|
21
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/package/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/package/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAyElC;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,CAkBxB"}
|
|
@@ -26,6 +26,8 @@ function patchPackageXml(currentXml, args) {
|
|
|
26
26
|
}
|
|
27
27
|
// Responsible
|
|
28
28
|
xml = (0, xmlPatch_1.patchIf)(xml, args.responsible, (x, val) => (0, xmlPatch_1.patchXmlAttribute)(x, 'adtcore:responsible', val));
|
|
29
|
+
// Master system
|
|
30
|
+
xml = (0, xmlPatch_1.patchIf)(xml, args.master_system, (x, val) => (0, xmlPatch_1.patchXmlAttribute)(x, 'adtcore:masterSystem', val));
|
|
29
31
|
// Package type (pak:packageType attribute on pak:attributes element)
|
|
30
32
|
xml = (0, xmlPatch_1.patchIf)(xml, args.package_type, (x, val) => (0, xmlPatch_1.patchXmlElementAttribute)(x, 'pak:attributes', 'pak:packageType', val));
|
|
31
33
|
// Record changes
|
|
@@ -49,7 +51,7 @@ async function updatePackage(connection, params, lockHandle) {
|
|
|
49
51
|
if (!params.package_name) {
|
|
50
52
|
throw new Error('package_name is required');
|
|
51
53
|
}
|
|
52
|
-
const packageNameEncoded = (0, internalUtils_1.encodeSapObjectName)(params.package_name);
|
|
54
|
+
const packageNameEncoded = (0, internalUtils_1.encodeSapObjectName)(params.package_name.toLowerCase());
|
|
53
55
|
// 1. GET current XML
|
|
54
56
|
const currentResponse = await connection.makeAdtRequest({
|
|
55
57
|
url: `/sap/bc/adt/packages/${packageNameEncoded}`,
|
|
@@ -93,5 +95,6 @@ async function updatePackageDescription(connection, packageName, description, lo
|
|
|
93
95
|
package_name: packageName,
|
|
94
96
|
description: (0, internalUtils_1.limitDescription)(description),
|
|
95
97
|
super_package: superPackage || '',
|
|
98
|
+
record_changes: false,
|
|
96
99
|
}, lockHandle);
|
|
97
100
|
}
|
|
@@ -8,11 +8,10 @@
|
|
|
8
8
|
* Key difference: Legacy systems return results synchronously (aunit:runResult)
|
|
9
9
|
* from the POST to /testruns — no run ID, no async polling needed.
|
|
10
10
|
*/
|
|
11
|
-
import type { IAdtResponse as AxiosResponse,
|
|
11
|
+
import type { IAdtResponse as AxiosResponse, IAdtOperationOptions } from '@mcp-abap-adt/interfaces';
|
|
12
12
|
import { AdtUnitTest } from './AdtUnitTest';
|
|
13
13
|
import type { IClassUnitTestDefinition, IClassUnitTestRunOptions, IUnitTestConfig, IUnitTestState } from './types';
|
|
14
14
|
export declare class AdtUnitTestLegacy extends AdtUnitTest {
|
|
15
|
-
constructor(connection: IAbapConnection, logger?: ILogger);
|
|
16
15
|
/**
|
|
17
16
|
* Create unit test run using legacy endpoint.
|
|
18
17
|
* Legacy returns results synchronously — no run ID or polling needed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdtUnitTestLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/unitTest/AdtUnitTestLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,
|
|
1
|
+
{"version":3,"file":"AdtUnitTestLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/unitTest/AdtUnitTestLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AAKjB,qBAAa,iBAAkB,SAAQ,WAAW;IAChD;;;OAGG;IACY,MAAM,CACnB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAkC1B;;OAEG;IACY,GAAG,CAChB,KAAK,EAAE,wBAAwB,EAAE,EACjC,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,GAAE,OAAc,GAC/B,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,GACzE,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,IAAI,CACjB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,QAAQ,GAAE,QAAQ,GAAG,UAAqB,GACzC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;CAWvC"}
|
|
@@ -17,9 +17,6 @@ const runLegacy_1 = require("./runLegacy");
|
|
|
17
17
|
/** Synthetic run ID for legacy synchronous results */
|
|
18
18
|
const LEGACY_SYNC_RUN_ID = 'legacy-sync';
|
|
19
19
|
class AdtUnitTestLegacy extends AdtUnitTest_1.AdtUnitTest {
|
|
20
|
-
constructor(connection, logger) {
|
|
21
|
-
super(connection, logger);
|
|
22
|
-
}
|
|
23
20
|
/**
|
|
24
21
|
* Create unit test run using legacy endpoint.
|
|
25
22
|
* Legacy returns results synchronously — no run ID or polling needed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-abap-adt/adt-clients",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.11.3",
|
|
4
4
|
"description": "ADT clients for SAP ABAP systems - AdtClient and AdtRuntimeClient",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"node": ">=18.0.0"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@mcp-abap-adt/interfaces": "^
|
|
69
|
+
"@mcp-abap-adt/interfaces": "^5.0.0",
|
|
70
70
|
"@mcp-abap-adt/logger": "^0.1.3",
|
|
71
71
|
"axios": "^1.13.6",
|
|
72
72
|
"fast-xml-parser": "^5.4.1",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@biomejs/biome": "^2.4.4",
|
|
80
|
-
"@mcp-abap-adt/connection": "^1.5.
|
|
80
|
+
"@mcp-abap-adt/connection": "^1.5.2",
|
|
81
81
|
"@types/jest": "^30.0.0",
|
|
82
82
|
"@types/node": "^25.3.3",
|
|
83
83
|
"dotenv": "^17.3.1",
|