@mcp-abap-adt/adt-clients 7.3.1 → 7.4.2

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 (85) hide show
  1. package/dist/clients/AdtClient.d.ts +32 -0
  2. package/dist/clients/AdtClient.d.ts.map +1 -1
  3. package/dist/clients/AdtClient.js +75 -30
  4. package/dist/core/accessControl/AdtAccessControl.d.ts +3 -1
  5. package/dist/core/accessControl/AdtAccessControl.d.ts.map +1 -1
  6. package/dist/core/accessControl/AdtAccessControl.js +11 -2
  7. package/dist/core/appendStructure/AdtAppendStructure.d.ts +3 -1
  8. package/dist/core/appendStructure/AdtAppendStructure.d.ts.map +1 -1
  9. package/dist/core/appendStructure/AdtAppendStructure.js +11 -2
  10. package/dist/core/authorizationField/AdtAuthorizationField.d.ts +3 -1
  11. package/dist/core/authorizationField/AdtAuthorizationField.d.ts.map +1 -1
  12. package/dist/core/authorizationField/AdtAuthorizationField.js +14 -3
  13. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts +3 -1
  14. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts.map +1 -1
  15. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.js +11 -2
  16. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts +2 -1
  17. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts.map +1 -1
  18. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.js +6 -3
  19. package/dist/core/class/AdtClass.d.ts +3 -1
  20. package/dist/core/class/AdtClass.d.ts.map +1 -1
  21. package/dist/core/class/AdtClass.js +16 -3
  22. package/dist/core/dataElement/AdtDataElement.d.ts +3 -1
  23. package/dist/core/dataElement/AdtDataElement.d.ts.map +1 -1
  24. package/dist/core/dataElement/AdtDataElement.js +9 -1
  25. package/dist/core/ddl/AdtDdl.d.ts +3 -1
  26. package/dist/core/ddl/AdtDdl.d.ts.map +1 -1
  27. package/dist/core/ddl/AdtDdl.js +11 -2
  28. package/dist/core/domain/AdtDomain.d.ts +3 -1
  29. package/dist/core/domain/AdtDomain.d.ts.map +1 -1
  30. package/dist/core/domain/AdtDomain.js +11 -1
  31. package/dist/core/enhancement/AdtEnhancement.d.ts +12 -1
  32. package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
  33. package/dist/core/enhancement/AdtEnhancement.js +35 -4
  34. package/dist/core/featureToggle/AdtFeatureToggle.d.ts +3 -1
  35. package/dist/core/featureToggle/AdtFeatureToggle.d.ts.map +1 -1
  36. package/dist/core/featureToggle/AdtFeatureToggle.js +14 -2
  37. package/dist/core/functionGroup/AdtFunctionGroup.d.ts +3 -1
  38. package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
  39. package/dist/core/functionGroup/AdtFunctionGroup.js +9 -1
  40. package/dist/core/functionInclude/AdtFunctionInclude.d.ts +9 -1
  41. package/dist/core/functionInclude/AdtFunctionInclude.d.ts.map +1 -1
  42. package/dist/core/functionInclude/AdtFunctionInclude.js +33 -3
  43. package/dist/core/functionModule/AdtFunctionModule.d.ts +9 -1
  44. package/dist/core/functionModule/AdtFunctionModule.d.ts.map +1 -1
  45. package/dist/core/functionModule/AdtFunctionModule.js +27 -2
  46. package/dist/core/interface/AdtInterface.d.ts +3 -1
  47. package/dist/core/interface/AdtInterface.d.ts.map +1 -1
  48. package/dist/core/interface/AdtInterface.js +11 -2
  49. package/dist/core/messageClass/AdtMessageClass.d.ts +3 -1
  50. package/dist/core/messageClass/AdtMessageClass.d.ts.map +1 -1
  51. package/dist/core/messageClass/AdtMessageClass.js +11 -2
  52. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts +3 -1
  53. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts.map +1 -1
  54. package/dist/core/metadataExtension/AdtMetadataExtension.js +9 -1
  55. package/dist/core/package/AdtPackage.d.ts +3 -1
  56. package/dist/core/package/AdtPackage.d.ts.map +1 -1
  57. package/dist/core/package/AdtPackage.js +11 -2
  58. package/dist/core/program/AdtProgram.d.ts +3 -1
  59. package/dist/core/program/AdtProgram.d.ts.map +1 -1
  60. package/dist/core/program/AdtProgram.js +11 -2
  61. package/dist/core/scalarFunction/AdtScalarFunction.d.ts +3 -1
  62. package/dist/core/scalarFunction/AdtScalarFunction.d.ts.map +1 -1
  63. package/dist/core/scalarFunction/AdtScalarFunction.js +11 -2
  64. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts +3 -1
  65. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts.map +1 -1
  66. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.js +14 -2
  67. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts +6 -3
  68. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
  69. package/dist/core/serviceDefinition/AdtServiceDefinition.js +14 -4
  70. package/dist/core/shared/LockRegistry.d.ts +77 -0
  71. package/dist/core/shared/LockRegistry.d.ts.map +1 -0
  72. package/dist/core/shared/LockRegistry.js +91 -0
  73. package/dist/core/structure/AdtStructure.d.ts +3 -1
  74. package/dist/core/structure/AdtStructure.d.ts.map +1 -1
  75. package/dist/core/structure/AdtStructure.js +11 -2
  76. package/dist/core/table/AdtTable.d.ts +3 -1
  77. package/dist/core/table/AdtTable.d.ts.map +1 -1
  78. package/dist/core/table/AdtTable.js +11 -2
  79. package/dist/core/tabletype/AdtDdicTableType.d.ts +3 -1
  80. package/dist/core/tabletype/AdtDdicTableType.d.ts.map +1 -1
  81. package/dist/core/tabletype/AdtDdicTableType.js +9 -1
  82. package/dist/core/transformation/AdtTransformation.d.ts +3 -1
  83. package/dist/core/transformation/AdtTransformation.d.ts.map +1 -1
  84. package/dist/core/transformation/AdtTransformation.js +11 -2
  85. package/package.json +1 -1
@@ -18,6 +18,7 @@
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.AdtAuthorizationField = void 0;
20
20
  const internalUtils_1 = require("../../utils/internalUtils");
21
+ const LockRegistry_1 = require("../shared/LockRegistry");
21
22
  const versions_1 = require("../shared/versions");
22
23
  const activation_1 = require("./activation");
23
24
  const check_1 = require("./check");
@@ -32,11 +33,13 @@ class AdtAuthorizationField {
32
33
  connection;
33
34
  logger;
34
35
  systemContext;
36
+ lockTracker;
35
37
  objectType = 'AuthorizationField';
36
- constructor(connection, logger, systemContext) {
38
+ constructor(connection, logger, systemContext, lockRegistry) {
37
39
  this.connection = connection;
38
40
  this.logger = logger;
39
41
  this.systemContext = systemContext ?? {};
42
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockAuthorizationField)(this.connection, name, lockHandle));
40
43
  }
41
44
  /**
42
45
  * Map camelCase config to the snake_case low-level params the functions expect.
@@ -218,6 +221,7 @@ class AdtAuthorizationField {
218
221
  this.connection.setSessionType('stateful');
219
222
  lockHandle = await (0, lock_1.lockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, this.logger);
220
223
  state.lockHandle = lockHandle;
224
+ this.lockTracker.track(fullConfig.authorizationFieldName, lockHandle);
221
225
  fullConfig.onLock?.(lockHandle);
222
226
  this.logger?.info?.('Authorization field locked, handle:', lockHandle);
223
227
  // 2. Check inactive with XML for update (if provided)
@@ -232,10 +236,11 @@ class AdtAuthorizationField {
232
236
  this.logger?.info?.('Step 3: Updating authorization field');
233
237
  await (0, update_1.updateAuthorizationField)(this.connection, params, lockHandle, this.logger);
234
238
  this.logger?.info?.('Authorization field updated');
239
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
235
240
  // 3.5. Read with long polling to ensure object is ready after update
236
241
  this.logger?.info?.('read (wait for object ready after update)');
237
242
  try {
238
- await this.read({ authorizationFieldName: fullConfig.authorizationFieldName }, 'active', { withLongPolling: true });
243
+ await this.read({ authorizationFieldName: fullConfig.authorizationFieldName }, 'inactive', { withLongPolling: true });
239
244
  this.logger?.info?.('object is ready after update');
240
245
  }
241
246
  catch (readError) {
@@ -246,6 +251,7 @@ class AdtAuthorizationField {
246
251
  this.connection.setSessionType('stateful');
247
252
  await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
248
253
  this.connection.setSessionType('stateless');
254
+ this.lockTracker.untrack(fullConfig.authorizationFieldName);
249
255
  lockHandle = undefined;
250
256
  this.logger?.info?.('Authorization field unlocked');
251
257
  // 5. Final check
@@ -271,7 +277,9 @@ class AdtAuthorizationField {
271
277
  }
272
278
  }
273
279
  else {
274
- const readResponse = await (0, read_1.readAuthorizationField)(this.connection, fullConfig.authorizationFieldName, 'active');
280
+ // No activation happened: return the version just written (inactive),
281
+ // not the stale active one.
282
+ const readResponse = await (0, read_1.readAuthorizationField)(this.connection, fullConfig.authorizationFieldName, 'inactive');
275
283
  state.readResult = readResponse;
276
284
  }
277
285
  return state;
@@ -285,6 +293,7 @@ class AdtAuthorizationField {
285
293
  this.connection.setSessionType('stateful');
286
294
  await (0, unlock_1.unlockAuthorizationField)(this.connection, fullConfig.authorizationFieldName, lockHandle);
287
295
  this.connection.setSessionType('stateless');
296
+ this.lockTracker.untrack(fullConfig.authorizationFieldName);
288
297
  }
289
298
  catch (unlockError) {
290
299
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -380,6 +389,7 @@ class AdtAuthorizationField {
380
389
  }
381
390
  this.connection.setSessionType('stateful');
382
391
  const lockHandle = await (0, lock_1.lockAuthorizationField)(this.connection, config.authorizationFieldName, this.logger);
392
+ this.lockTracker.track(config.authorizationFieldName, lockHandle);
383
393
  return lockHandle;
384
394
  }
385
395
  /**
@@ -392,6 +402,7 @@ class AdtAuthorizationField {
392
402
  this.connection.setSessionType('stateful');
393
403
  await (0, unlock_1.unlockAuthorizationField)(this.connection, config.authorizationFieldName, lockHandle);
394
404
  this.connection.setSessionType('stateless');
405
+ this.lockTracker.untrack(config.authorizationFieldName);
395
406
  return { errors: [] };
396
407
  }
397
408
  async getVersions(_config) {
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { IBehaviorDefinitionConfig, IBehaviorDefinitionState } from './types';
24
25
  export declare class AdtBehaviorDefinition implements IAdtObject<IBehaviorDefinitionConfig, IBehaviorDefinitionState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate behavior definition configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtBehaviorDefinition.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/AdtBehaviorDefinition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;AAWpD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AASjB,qBAAa,qBACX,YAAW,UAAU,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;IAE1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAwB;gBAGxD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IA+CpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAuEpC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IA8BhD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAoMpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAqCpC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAwBpC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IA4BpC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,CAAC;IAcpC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAItD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtBehaviorDefinition.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorDefinition/AdtBehaviorDefinition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AASjB,qBAAa,qBACX,YAAW,UAAU,CAAC,yBAAyB,EAAE,wBAAwB,CAAC;IAE1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAwB;gBAGxD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAY7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IA+CpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAuEpC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IA8BhD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,wBAAwB,CAAC;IAoCpC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,wBAAwB,CAAC;IAwMpC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAqCpC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GACzC,OAAO,CAAC,wBAAwB,CAAC;IAwBpC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IA4BpC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,CAAC;IAepC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAItD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtBehaviorDefinition = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activation_1 = require("./activation");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -35,11 +36,13 @@ class AdtBehaviorDefinition {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'BehaviorDefinition';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlock)(this.connection, name, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate behavior definition configuration before creation
@@ -279,6 +282,7 @@ class AdtBehaviorDefinition {
279
282
  this.connection.setSessionType('stateful');
280
283
  lockHandle = await (0, lock_1.lock)(this.connection, config.name);
281
284
  state.lockHandle = lockHandle;
285
+ this.lockTracker.track(config.name, lockHandle);
282
286
  this.logger?.info?.('Behavior definition locked, handle:', lockHandle);
283
287
  // 2. Check inactive with code for update (from options or config)
284
288
  const codeToCheck = options?.sourceCode || config.sourceCode;
@@ -299,10 +303,11 @@ class AdtBehaviorDefinition {
299
303
  });
300
304
  state.updateResult = updateResponse;
301
305
  this.logger?.info?.('Behavior definition updated');
306
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
302
307
  // 3.5. Read with long polling (wait for object to be ready after update)
303
308
  this.logger?.info?.('read (wait for object ready after update)');
304
309
  try {
305
- await this.read({ name: config.name }, 'active', {
310
+ await this.read({ name: config.name }, 'inactive', {
306
311
  withLongPolling: true,
307
312
  });
308
313
  this.logger?.info?.('object is ready after update');
@@ -319,6 +324,7 @@ class AdtBehaviorDefinition {
319
324
  const unlockResponse = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
320
325
  state.unlockResult = unlockResponse;
321
326
  this.connection.setSessionType('stateless');
327
+ this.lockTracker.untrack(config.name);
322
328
  lockHandle = undefined;
323
329
  this.logger?.info?.('Behavior definition unlocked');
324
330
  }
@@ -360,6 +366,7 @@ class AdtBehaviorDefinition {
360
366
  this.connection.setSessionType('stateful');
361
367
  await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
362
368
  this.connection.setSessionType('stateless');
369
+ this.lockTracker.untrack(config.name);
363
370
  }
364
371
  catch (unlockError) {
365
372
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -476,6 +483,7 @@ class AdtBehaviorDefinition {
476
483
  }
477
484
  this.connection.setSessionType('stateful');
478
485
  const lockHandle = await (0, lock_1.lock)(this.connection, config.name);
486
+ this.lockTracker.track(config.name, lockHandle);
479
487
  return lockHandle;
480
488
  }
481
489
  /**
@@ -488,6 +496,7 @@ class AdtBehaviorDefinition {
488
496
  this.connection.setSessionType('stateful');
489
497
  const result = await (0, unlock_1.unlock)(this.connection, config.name, lockHandle);
490
498
  this.connection.setSessionType('stateless');
499
+ this.lockTracker.untrack(config.name);
491
500
  return {
492
501
  unlockResult: result,
493
502
  errors: [],
@@ -23,6 +23,7 @@
23
23
  * - Delete: check(deletion) → delete (via AdtClass)
24
24
  */
25
25
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
26
+ import type { LockRegistry } from '../shared/LockRegistry';
26
27
  import type { IReadOptions } from '../shared/types';
27
28
  import type { IBehaviorImplementationConfig, IBehaviorImplementationState } from './types';
28
29
  export declare class AdtBehaviorImplementation implements IAdtObject<IBehaviorImplementationConfig, IBehaviorImplementationState> {
@@ -30,7 +31,7 @@ export declare class AdtBehaviorImplementation implements IAdtObject<IBehaviorIm
30
31
  private readonly logger?;
31
32
  private readonly class;
32
33
  readonly objectType: string;
33
- constructor(connection: IAbapConnection, logger?: ILogger);
34
+ constructor(connection: IAbapConnection, logger?: ILogger, lockRegistry?: LockRegistry);
34
35
  /**
35
36
  * Validate behavior implementation configuration before creation
36
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtBehaviorImplementation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorImplementation/AdtBehaviorImplementation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,qBAAa,yBACX,YACE,UAAU,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;IAEzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,SAAgB,UAAU,EAAE,MAAM,CAA4B;gBAElD,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAMzD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IAmCxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,6BAA6B,EACrC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,4BAA4B,CAAC;IA4CxC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC;IA8BpD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,CAAC;IAiCxC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,4BAA4B,CAAC;IAoCxC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,4BAA4B,CAAC;IAiPxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA+BxC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA0BxC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,4BAA4B,CAAC;IAuBxC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ3E;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,4BAA4B,CAAC;IAexC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC;IAI1D,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtBehaviorImplementation.d.ts","sourceRoot":"","sources":["../../../src/core/behaviorImplementation/AdtBehaviorImplementation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,qBAAa,yBACX,YACE,UAAU,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;IAEzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,SAAgB,UAAU,EAAE,MAAM,CAA4B;gBAG5D,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,YAAY;IAe7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IAmCxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,6BAA6B,EACrC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,4BAA4B,CAAC;IA4CxC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC;IA8BpD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,4BAA4B,CAAC;IAiCxC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,4BAA4B,CAAC;IAoCxC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,4BAA4B,CAAC;IAkPxC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA+BxC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAC7C,OAAO,CAAC,4BAA4B,CAAC;IA0BxC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,4BAA4B,CAAC;IAuBxC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ3E;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC,EAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,4BAA4B,CAAC;IAexC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC;IAI1D,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -38,10 +38,12 @@ class AdtBehaviorImplementation {
38
38
  logger;
39
39
  class;
40
40
  objectType = 'BehaviorImplementation';
41
- constructor(connection, logger) {
41
+ constructor(connection, logger, lockRegistry) {
42
42
  this.connection = connection;
43
43
  this.logger = logger;
44
- this.class = new class_1.AdtClass(connection, logger);
44
+ // Behavior implementation locks are class locks delegated to this internal
45
+ // AdtClass — pass the session registry so those locks are tracked too.
46
+ this.class = new class_1.AdtClass(connection, logger, undefined, undefined, lockRegistry);
45
47
  }
46
48
  /**
47
49
  * Validate behavior implementation configuration before creation
@@ -283,10 +285,11 @@ ENDCLASS.`;
283
285
  const updateResponse = await (0, update_2.updateBehaviorImplementation)(this.connection, config.className, codeToCheck, lockHandle, config.transportRequest);
284
286
  state.updateResult = updateResponse;
285
287
  this.logger?.info?.('Behavior implementation implementations include updated');
288
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
286
289
  // 5.5. Read with long polling (wait for object to be ready after update)
287
290
  this.logger?.info?.('read (wait for object ready after update)');
288
291
  try {
289
- await this.read({ className: config.className }, 'active', {
292
+ await this.read({ className: config.className }, 'inactive', {
290
293
  withLongPolling: true,
291
294
  });
292
295
  this.logger?.info?.('object is ready after update');
@@ -19,6 +19,7 @@
19
19
  import { type IAdtResponse as AxiosResponse, type IAbapConnection, type IAdtObject, type IAdtOperationOptions, type ILogger, type IObjectVersion } from '@mcp-abap-adt/interfaces';
20
20
  import type { IAdtSystemContext } from '../../clients/AdtClient';
21
21
  import type { IAdtContentTypes } from '../shared/contentTypes';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { IClassConfig, IClassState } from './types';
24
25
  import { type ClassIncludeType } from './versions';
@@ -27,8 +28,9 @@ export declare class AdtClass implements IAdtObject<IClassConfig, IClassState> {
27
28
  protected readonly logger?: ILogger;
28
29
  protected readonly systemContext: IAdtSystemContext;
29
30
  protected readonly contentTypes?: IAdtContentTypes;
31
+ private readonly lockTracker;
30
32
  readonly objectType: string;
31
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes);
33
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes, lockRegistry?: LockRegistry);
32
34
  /**
33
35
  * Validate class configuration before creation
34
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdtClass.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClass.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
54
54
  exports.AdtClass = void 0;
55
55
  const interfaces_1 = require("@mcp-abap-adt/interfaces");
56
56
  const internalUtils_1 = require("../../utils/internalUtils");
57
+ const LockRegistry_1 = require("../shared/LockRegistry");
57
58
  const activation_1 = require("./activation");
58
59
  const check_1 = require("./check");
59
60
  const create_1 = require("./create");
@@ -70,12 +71,14 @@ class AdtClass {
70
71
  logger;
71
72
  systemContext;
72
73
  contentTypes;
74
+ lockTracker;
73
75
  objectType = 'Class';
74
- constructor(connection, logger, systemContext, contentTypes) {
76
+ constructor(connection, logger, systemContext, contentTypes, lockRegistry) {
75
77
  this.connection = connection;
76
78
  this.logger = logger;
77
79
  this.systemContext = systemContext ?? {};
78
80
  this.contentTypes = contentTypes;
81
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (className, lockHandle) => (0, unlock_1.unlockClass)(this.connection, className, lockHandle));
79
82
  }
80
83
  /**
81
84
  * Validate class configuration before creation
@@ -281,6 +284,7 @@ class AdtClass {
281
284
  this.connection.setSessionType('stateful');
282
285
  lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
283
286
  state.lockHandle = lockHandle;
287
+ this.lockTracker.track(config.className, lockHandle);
284
288
  this.logger?.info?.('Class locked, handle:', lockHandle);
285
289
  // 2. Check inactive with code/xml for update (from options or config)
286
290
  const codeToCheck = options?.sourceCode || config.sourceCode;
@@ -294,10 +298,11 @@ class AdtClass {
294
298
  this.logger?.info?.('Step 3: Updating class');
295
299
  state.updateResult = await (0, update_1.updateClass)(this.connection, config.className, codeToCheck, lockHandle, config.transportRequest, this.contentTypes?.sourceArtifactContentType());
296
300
  this.logger?.info?.('Class updated');
301
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
297
302
  // 3.5. Read with long polling to ensure object is ready after update
298
303
  this.logger?.info?.('read (wait for object ready after update)');
299
304
  try {
300
- await this.read({ className: config.className }, 'active', {
305
+ await this.read({ className: config.className }, 'inactive', {
301
306
  withLongPolling: true,
302
307
  });
303
308
  this.logger?.info?.('object is ready after update');
@@ -313,6 +318,7 @@ class AdtClass {
313
318
  this.connection.setSessionType('stateful');
314
319
  state.unlockResult = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
315
320
  this.connection.setSessionType('stateless');
321
+ this.lockTracker.untrack(config.className);
316
322
  lockHandle = undefined;
317
323
  this.logger?.info?.('Class unlocked');
318
324
  }
@@ -350,6 +356,7 @@ class AdtClass {
350
356
  this.connection.setSessionType('stateful');
351
357
  await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
352
358
  this.connection.setSessionType('stateless');
359
+ this.lockTracker.untrack(config.className);
353
360
  }
354
361
  catch (unlockError) {
355
362
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -538,7 +545,9 @@ class AdtClass {
538
545
  // is only valid inside stateful requests, so a stateless write between lock
539
546
  // and unlock fails with 423.
540
547
  this.connection.setSessionType('stateful');
541
- return await (0, lock_1.lockClass)(this.connection, config.className);
548
+ const lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
549
+ this.lockTracker.track(config.className, lockHandle);
550
+ return lockHandle;
542
551
  }
543
552
  /**
544
553
  * Unlock class
@@ -550,6 +559,7 @@ class AdtClass {
550
559
  this.connection.setSessionType('stateful');
551
560
  const result = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
552
561
  this.connection.setSessionType('stateless');
562
+ this.lockTracker.untrack(config.className);
553
563
  return {
554
564
  unlockResult: result,
555
565
  errors: [],
@@ -611,6 +621,7 @@ class AdtClass {
611
621
  this.logger?.info?.('Step 1: Locking parent class');
612
622
  this.connection.setSessionType('stateful');
613
623
  lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
624
+ this.lockTracker.track(config.className, lockHandle);
614
625
  this.logger?.info?.('Parent class locked, handle:', lockHandle);
615
626
  // 2. Update test classes (uses parent class lock handle)
616
627
  this.logger?.info?.('Step 2: Updating test classes');
@@ -620,6 +631,7 @@ class AdtClass {
620
631
  this.connection.setSessionType('stateful');
621
632
  await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
622
633
  this.connection.setSessionType('stateless');
634
+ this.lockTracker.untrack(config.className);
623
635
  lockHandle = undefined;
624
636
  return response;
625
637
  }
@@ -631,6 +643,7 @@ class AdtClass {
631
643
  this.connection.setSessionType('stateful');
632
644
  await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
633
645
  this.connection.setSessionType('stateless');
646
+ this.lockTracker.untrack(config.className);
634
647
  }
635
648
  catch (unlockError) {
636
649
  this.logger?.warn?.('Failed to unlock parent class after error:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { IDataElementConfig, IDataElementState } from './types';
24
25
  export declare class AdtDataElement implements IAdtObject<IDataElementConfig, IDataElementState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate data element configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIrE,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,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAiB;gBAGjD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;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;IA0E7B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IA2BzC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,iBAAiB,CAAC;IA8C7B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAmP7B;;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;IAahE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAkBvB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
1
+ {"version":3,"file":"AdtDataElement.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/AdtDataElement.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtDataElement = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const versions_1 = require("../shared/versions");
25
26
  const activation_1 = require("./activation");
26
27
  const check_1 = require("./check");
@@ -35,11 +36,13 @@ class AdtDataElement {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'DataElement';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockDataElement)(this.connection, name, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate data element configuration before creation
@@ -250,6 +253,7 @@ class AdtDataElement {
250
253
  this.connection.setSessionType('stateful');
251
254
  lockHandle = await (0, lock_1.lockDataElement)(this.connection, config.dataElementName);
252
255
  state.lockHandle = lockHandle;
256
+ this.lockTracker.track(config.dataElementName, lockHandle);
253
257
  this.logger?.info?.('Data element locked, handle:', lockHandle);
254
258
  // 2. Check inactive with XML for update (if provided)
255
259
  const xmlToCheck = options?.xmlContent;
@@ -300,6 +304,7 @@ class AdtDataElement {
300
304
  const unlockResponse = await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
301
305
  state.unlockResult = unlockResponse;
302
306
  this.connection.setSessionType('stateless');
307
+ this.lockTracker.untrack(config.dataElementName);
303
308
  lockHandle = undefined;
304
309
  this.logger?.info?.('Data element unlocked');
305
310
  }
@@ -343,6 +348,7 @@ class AdtDataElement {
343
348
  this.connection.setSessionType('stateful');
344
349
  await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
345
350
  this.connection.setSessionType('stateless');
351
+ this.lockTracker.untrack(config.dataElementName);
346
352
  }
347
353
  catch (unlockError) {
348
354
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -484,6 +490,7 @@ class AdtDataElement {
484
490
  }
485
491
  this.connection.setSessionType('stateful');
486
492
  const lockHandle = await (0, lock_1.lockDataElement)(this.connection, config.dataElementName);
493
+ this.lockTracker.track(config.dataElementName, lockHandle);
487
494
  return lockHandle;
488
495
  }
489
496
  /**
@@ -496,6 +503,7 @@ class AdtDataElement {
496
503
  this.connection.setSessionType('stateful');
497
504
  const result = await (0, unlock_1.unlockDataElement)(this.connection, config.dataElementName, lockHandle);
498
505
  this.connection.setSessionType('stateless');
506
+ this.lockTracker.untrack(config.dataElementName);
499
507
  return {
500
508
  unlockResult: result,
501
509
  errors: [],
@@ -22,14 +22,16 @@
22
22
  */
23
23
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
24
24
  import type { IAdtSystemContext } from '../../clients/AdtClient';
25
+ import { type LockRegistry } from '../shared/LockRegistry';
25
26
  import type { IReadOptions } from '../shared/types';
26
27
  import type { IDdlConfig, IDdlState } from './types';
27
28
  export declare class AdtDdl implements IAdtObject<IDdlConfig, IDdlState> {
28
29
  protected readonly connection: IAbapConnection;
29
30
  protected readonly logger?: ILogger;
30
31
  protected readonly systemContext: IAdtSystemContext;
32
+ private readonly lockTracker;
31
33
  readonly objectType: string;
32
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
34
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
33
35
  /**
34
36
  * Validate view configuration before creation
35
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtDdl.d.ts","sourceRoot":"","sources":["../../../src/core/ddl/AdtDdl.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;AAOpD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMrD,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;IAC9D,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,CAAU;gBAG1C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B/D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IA4DrB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAyBjC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC;IAgCrB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,CAAC;IAkCrB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAmMrB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAgC7D;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAiB/D;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC;IAsBrB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxD;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IAkBrB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;IAIvC,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtDdl.d.ts","sourceRoot":"","sources":["../../../src/core/ddl/AdtDdl.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,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMrD,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;IAC9D,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,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAU;gBAG1C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAY7B;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B/D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IA4DrB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAyBjC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC;IAgCrB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,SAAS,CAAC;IAkCrB;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAuMrB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAgC7D;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAiB/D;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC;IAsBrB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IAmBrB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;IAIvC,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -24,6 +24,7 @@
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.AdtDdl = void 0;
26
26
  const internalUtils_1 = require("../../utils/internalUtils");
27
+ const LockRegistry_1 = require("../shared/LockRegistry");
27
28
  const activation_1 = require("./activation");
28
29
  const check_1 = require("./check");
29
30
  const create_1 = require("./create");
@@ -38,11 +39,13 @@ class AdtDdl {
38
39
  connection;
39
40
  logger;
40
41
  systemContext;
42
+ lockTracker;
41
43
  objectType = 'View';
42
- constructor(connection, logger, systemContext) {
44
+ constructor(connection, logger, systemContext, lockRegistry) {
43
45
  this.connection = connection;
44
46
  this.logger = logger;
45
47
  this.systemContext = systemContext ?? {};
48
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (ddlName, lockHandle) => (0, unlock_1.unlockDDLS)(this.connection, ddlName, lockHandle));
46
49
  }
47
50
  /**
48
51
  * Validate view configuration before creation
@@ -238,6 +241,7 @@ class AdtDdl {
238
241
  this.logger?.info?.('Step 1: Locking view');
239
242
  this.connection.setSessionType('stateful');
240
243
  lockHandle = await (0, lock_1.lockDDLS)(this.connection, config.ddlName);
244
+ this.lockTracker.track(config.ddlName, lockHandle);
241
245
  this.logger?.info?.('View locked, handle:', lockHandle);
242
246
  // 2. Check inactive with code for update (from options or config)
243
247
  const codeToCheck = options?.sourceCode || config.ddlSource;
@@ -251,10 +255,11 @@ class AdtDdl {
251
255
  this.logger?.info?.('Step 3: Updating view');
252
256
  await (0, update_1.updateDdl)(this.connection, config.ddlName, codeToCheck, lockHandle, config.transportRequest);
253
257
  this.logger?.info?.('View updated');
258
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
254
259
  // 3.5. Read with long polling to ensure object is ready after update
255
260
  this.logger?.info?.('read (wait for object ready after update)');
256
261
  try {
257
- await this.read({ ddlName: config.ddlName }, 'active', {
262
+ await this.read({ ddlName: config.ddlName }, 'inactive', {
258
263
  withLongPolling: true,
259
264
  });
260
265
  this.logger?.info?.('object is ready after update');
@@ -270,6 +275,7 @@ class AdtDdl {
270
275
  this.connection.setSessionType('stateful');
271
276
  await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
272
277
  this.connection.setSessionType('stateless');
278
+ this.lockTracker.untrack(config.ddlName);
273
279
  lockHandle = undefined;
274
280
  this.logger?.info?.('View unlocked');
275
281
  }
@@ -321,6 +327,7 @@ class AdtDdl {
321
327
  this.connection.setSessionType('stateful');
322
328
  await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
323
329
  this.connection.setSessionType('stateless');
330
+ this.lockTracker.untrack(config.ddlName);
324
331
  }
325
332
  catch (unlockError) {
326
333
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -424,6 +431,7 @@ class AdtDdl {
424
431
  }
425
432
  this.connection.setSessionType('stateful');
426
433
  const lockHandle = await (0, lock_1.lockDDLS)(this.connection, config.ddlName);
434
+ this.lockTracker.track(config.ddlName, lockHandle);
427
435
  return lockHandle;
428
436
  }
429
437
  /**
@@ -436,6 +444,7 @@ class AdtDdl {
436
444
  this.connection.setSessionType('stateful');
437
445
  const result = await (0, unlock_1.unlockDDLS)(this.connection, config.ddlName, lockHandle);
438
446
  this.connection.setSessionType('stateless');
447
+ this.lockTracker.untrack(config.ddlName);
439
448
  return {
440
449
  unlockResult: result,
441
450
  errors: [],
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { IDomainConfig, IDomainState } from './types';
24
25
  export declare class AdtDomain implements IAdtObject<IDomainConfig, IDomainState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate domain configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3D,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,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAY;gBAG5C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;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;IAmExB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAyBpC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IA4CxB;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAyNxB;;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;IAU3D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAkBlB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
1
+ {"version":3,"file":"AdtDomain.d.ts","sourceRoot":"","sources":["../../../src/core/domain/AdtDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3D,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,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAY;gBAG5C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;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;IAmExB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAyBpC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IA4CxB;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IA8NxB;;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;IAW3D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAmBlB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}