@mcp-abap-adt/adt-clients 10.0.1 → 10.0.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 (44) hide show
  1. package/dist/core/accessControl/activation.d.ts +3 -0
  2. package/dist/core/accessControl/activation.d.ts.map +1 -1
  3. package/dist/core/accessControl/activation.js +2 -34
  4. package/dist/core/appendStructure/activation.d.ts.map +1 -1
  5. package/dist/core/appendStructure/activation.js +2 -34
  6. package/dist/core/authorizationField/activation.d.ts.map +1 -1
  7. package/dist/core/authorizationField/activation.js +2 -35
  8. package/dist/core/dataElement/activation.d.ts +3 -0
  9. package/dist/core/dataElement/activation.d.ts.map +1 -1
  10. package/dist/core/dataElement/activation.js +2 -34
  11. package/dist/core/featureToggle/activation.d.ts.map +1 -1
  12. package/dist/core/featureToggle/activation.js +2 -35
  13. package/dist/core/metadataExtension/activate.d.ts +2 -2
  14. package/dist/core/metadataExtension/activate.js +2 -2
  15. package/dist/core/metadataExtension/check.d.ts +2 -2
  16. package/dist/core/metadataExtension/check.js +2 -2
  17. package/dist/core/metadataExtension/create.d.ts +2 -2
  18. package/dist/core/metadataExtension/create.js +2 -2
  19. package/dist/core/metadataExtension/delete.d.ts +2 -2
  20. package/dist/core/metadataExtension/delete.js +2 -2
  21. package/dist/core/metadataExtension/lock.d.ts +2 -2
  22. package/dist/core/metadataExtension/lock.js +2 -2
  23. package/dist/core/metadataExtension/read.d.ts +4 -4
  24. package/dist/core/metadataExtension/read.js +4 -4
  25. package/dist/core/metadataExtension/unlock.d.ts +2 -2
  26. package/dist/core/metadataExtension/unlock.js +2 -2
  27. package/dist/core/metadataExtension/update.d.ts +3 -3
  28. package/dist/core/metadataExtension/update.js +3 -3
  29. package/dist/core/scalarFunction/activation.d.ts.map +1 -1
  30. package/dist/core/scalarFunction/activation.js +2 -34
  31. package/dist/core/scalarFunctionImplementation/activation.d.ts.map +1 -1
  32. package/dist/core/scalarFunctionImplementation/activation.js +2 -34
  33. package/dist/core/serviceDefinition/activation.d.ts +3 -0
  34. package/dist/core/serviceDefinition/activation.d.ts.map +1 -1
  35. package/dist/core/serviceDefinition/activation.js +2 -34
  36. package/dist/core/shared/groupActivation.d.ts +2 -2
  37. package/dist/core/shared/groupActivation.js +2 -2
  38. package/dist/core/transformation/activation.d.ts +3 -0
  39. package/dist/core/transformation/activation.d.ts.map +1 -1
  40. package/dist/core/transformation/activation.js +2 -34
  41. package/dist/utils/activationUtils.d.ts +21 -0
  42. package/dist/utils/activationUtils.d.ts.map +1 -1
  43. package/dist/utils/activationUtils.js +45 -9
  44. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
1
  import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
2
+ /**
3
+ * Parse activation response
4
+ */
2
5
  /**
3
6
  * Activate access control
4
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/accessControl/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwD9E;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAyBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/accessControl/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;GAEG;AAEH;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.activateAccessControl = activateAccessControl;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
4
+ const activationUtils_1 = require("../../utils/activationUtils");
5
5
  const internalUtils_1 = require("../../utils/internalUtils");
6
6
  const timeouts_1 = require("../../utils/timeouts");
7
7
  /**
@@ -16,35 +16,6 @@ function buildActivationXml(accessControlName) {
16
16
  /**
17
17
  * Parse activation response
18
18
  */
19
- function parseActivationResponse(response) {
20
- const parser = new fast_xml_parser_1.XMLParser({
21
- ignoreAttributes: false,
22
- attributeNamePrefix: '',
23
- });
24
- try {
25
- const result = parser.parse(response.data);
26
- const properties = result['chkl:messages']?.['chkl:properties'];
27
- if (properties) {
28
- const activated = properties.activationExecuted === 'true' ||
29
- properties.activationExecuted === true;
30
- const checked = properties.checkExecuted === 'true' ||
31
- properties.checkExecuted === true;
32
- return {
33
- success: activated && checked,
34
- message: activated
35
- ? 'Access control activated successfully'
36
- : 'Activation failed',
37
- };
38
- }
39
- return { success: false, message: 'Unknown activation status' };
40
- }
41
- catch (error) {
42
- return {
43
- success: false,
44
- message: `Failed to parse activation response: ${error}`,
45
- };
46
- }
47
- }
48
19
  /**
49
20
  * Activate access control
50
21
  */
@@ -62,9 +33,6 @@ async function activateAccessControl(connection, accessControlName) {
62
33
  data: xmlBody,
63
34
  headers,
64
35
  });
65
- const activationResult = parseActivationResponse(response);
66
- if (!activationResult.success) {
67
- throw new Error(`Access control activation failed: ${activationResult.message}`);
68
- }
36
+ (0, activationUtils_1.assertActivationSucceeded)('Access control', response.data);
69
37
  return response;
70
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/appendStructure/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8C9E,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/appendStructure/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAY9E,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.activateAppendStructure = activateAppendStructure;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
4
+ const activationUtils_1 = require("../../utils/activationUtils");
5
5
  const internalUtils_1 = require("../../utils/internalUtils");
6
6
  const timeouts_1 = require("../../utils/timeouts");
7
7
  function buildActivationXml(name) {
@@ -10,35 +10,6 @@ function buildActivationXml(name) {
10
10
  <adtcore:objectReference adtcore:uri="/sap/bc/adt/ddic/structures/${(0, internalUtils_1.encodeSapObjectName)(name.toLowerCase())}" adtcore:name="${name.toUpperCase()}"/>
11
11
  </adtcore:objectReferences>`;
12
12
  }
13
- function parseActivationResponse(response) {
14
- const parser = new fast_xml_parser_1.XMLParser({
15
- ignoreAttributes: false,
16
- attributeNamePrefix: '',
17
- });
18
- try {
19
- const result = parser.parse(response.data);
20
- const properties = result['chkl:messages']?.['chkl:properties'];
21
- if (properties) {
22
- const activated = properties.activationExecuted === 'true' ||
23
- properties.activationExecuted === true;
24
- const checked = properties.checkExecuted === 'true' ||
25
- properties.checkExecuted === true;
26
- return {
27
- success: activated && checked,
28
- message: activated
29
- ? 'Append structure activated successfully'
30
- : 'Activation failed',
31
- };
32
- }
33
- return { success: false, message: 'Unknown activation status' };
34
- }
35
- catch (error) {
36
- return {
37
- success: false,
38
- message: `Failed to parse activation response: ${error}`,
39
- };
40
- }
41
- }
42
13
  async function activateAppendStructure(connection, name) {
43
14
  const url = `/sap/bc/adt/activation?method=activate&preauditRequested=true`;
44
15
  const response = await connection.makeAdtRequest({
@@ -48,9 +19,6 @@ async function activateAppendStructure(connection, name) {
48
19
  data: buildActivationXml(name),
49
20
  headers: { Accept: 'application/xml', 'Content-Type': 'application/xml' },
50
21
  });
51
- const activationResult = parseActivationResponse(response);
52
- if (!activationResult.success) {
53
- throw new Error(`Append structure activation failed: ${activationResult.message}`);
54
- }
22
+ (0, activationUtils_1.assertActivationSucceeded)('Append structure', response.data);
55
23
  return response;
56
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/authorizationField/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAqD9E;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CA2BvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/authorizationField/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAc9E;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.activateAuthorizationField = activateAuthorizationField;
7
- const fast_xml_parser_1 = require("fast-xml-parser");
7
+ const activationUtils_1 = require("../../utils/activationUtils");
8
8
  const internalUtils_1 = require("../../utils/internalUtils");
9
9
  const timeouts_1 = require("../../utils/timeouts");
10
10
  function buildActivationXml(name) {
@@ -15,36 +15,6 @@ function buildActivationXml(name) {
15
15
  <adtcore:objectReference adtcore:uri="/sap/bc/adt/aps/iam/auth/${encoded}" adtcore:name="${upper}"/>
16
16
  </adtcore:objectReferences>`;
17
17
  }
18
- function parseActivationResponse(response) {
19
- const parser = new fast_xml_parser_1.XMLParser({
20
- ignoreAttributes: false,
21
- attributeNamePrefix: '',
22
- });
23
- try {
24
- const result = parser.parse(response.data);
25
- const properties = result['chkl:messages']?.['chkl:properties'];
26
- if (properties) {
27
- const activated = properties.activationExecuted === 'true' ||
28
- properties.activationExecuted === true;
29
- const checked = properties.checkExecuted === 'true' ||
30
- properties.checkExecuted === true;
31
- return {
32
- success: activated && checked,
33
- message: activated
34
- ? 'Authorization field activated successfully'
35
- : 'Activation failed',
36
- };
37
- }
38
- // When the response body is empty, SAP treats activation as successful.
39
- return { success: true, message: 'Authorization field activated' };
40
- }
41
- catch (error) {
42
- return {
43
- success: false,
44
- message: `Failed to parse activation response: ${error}`,
45
- };
46
- }
47
- }
48
18
  /**
49
19
  * Activate an authorization field.
50
20
  */
@@ -64,9 +34,6 @@ async function activateAuthorizationField(connection, name) {
64
34
  'Content-Type': 'application/xml',
65
35
  },
66
36
  });
67
- const activationResult = parseActivationResponse(response);
68
- if (!activationResult.success) {
69
- throw new Error(`Authorization field activation failed: ${activationResult.message}`);
70
- }
37
+ (0, activationUtils_1.assertActivationSucceeded)('Authorization field', response.data);
71
38
  return response;
72
39
  }
@@ -2,6 +2,9 @@
2
2
  * DataElement activation operations
3
3
  */
4
4
  import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
5
+ /**
6
+ * Parse activation response
7
+ */
5
8
  /**
6
9
  * Activate data element
7
10
  * Makes data element active and usable in SAP system
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwD9E;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,eAAe,EAC3B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,CAyBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/dataElement/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;GAEG;AAEH;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,eAAe,EAC3B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.activateDataElement = activateDataElement;
7
- const fast_xml_parser_1 = require("fast-xml-parser");
7
+ const activationUtils_1 = require("../../utils/activationUtils");
8
8
  const internalUtils_1 = require("../../utils/internalUtils");
9
9
  const timeouts_1 = require("../../utils/timeouts");
10
10
  /**
@@ -19,35 +19,6 @@ function buildActivationXml(dataElementName) {
19
19
  /**
20
20
  * Parse activation response
21
21
  */
22
- function parseActivationResponse(response) {
23
- const parser = new fast_xml_parser_1.XMLParser({
24
- ignoreAttributes: false,
25
- attributeNamePrefix: '',
26
- });
27
- try {
28
- const result = parser.parse(response.data);
29
- const properties = result['chkl:messages']?.['chkl:properties'];
30
- if (properties) {
31
- const activated = properties.activationExecuted === 'true' ||
32
- properties.activationExecuted === true;
33
- const checked = properties.checkExecuted === 'true' ||
34
- properties.checkExecuted === true;
35
- return {
36
- success: activated && checked,
37
- message: activated
38
- ? 'Data element activated successfully'
39
- : 'Activation failed',
40
- };
41
- }
42
- return { success: false, message: 'Unknown activation status' };
43
- }
44
- catch (error) {
45
- return {
46
- success: false,
47
- message: `Failed to parse activation response: ${error}`,
48
- };
49
- }
50
- }
51
22
  /**
52
23
  * Activate data element
53
24
  * Makes data element active and usable in SAP system
@@ -66,9 +37,6 @@ async function activateDataElement(connection, dataElementName) {
66
37
  data: xmlBody,
67
38
  headers,
68
39
  });
69
- const activationResult = parseActivationResponse(response);
70
- if (!activationResult.success) {
71
- throw new Error(`Data element activation failed: ${activationResult.message}`);
72
- }
40
+ (0, activationUtils_1.assertActivationSucceeded)('Data element', response.data);
73
41
  return response;
74
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/featureToggle/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAqD9E;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CA2BvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/featureToggle/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAc9E;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.activateFeatureToggle = activateFeatureToggle;
7
- const fast_xml_parser_1 = require("fast-xml-parser");
7
+ const activationUtils_1 = require("../../utils/activationUtils");
8
8
  const internalUtils_1 = require("../../utils/internalUtils");
9
9
  const timeouts_1 = require("../../utils/timeouts");
10
10
  function buildActivationXml(name) {
@@ -15,36 +15,6 @@ function buildActivationXml(name) {
15
15
  <adtcore:objectReference adtcore:uri="/sap/bc/adt/sfw/featuretoggles/${encoded}" adtcore:name="${name.toUpperCase()}"/>
16
16
  </adtcore:objectReferences>`;
17
17
  }
18
- function parseActivationResponse(response) {
19
- const parser = new fast_xml_parser_1.XMLParser({
20
- ignoreAttributes: false,
21
- attributeNamePrefix: '',
22
- });
23
- try {
24
- const result = parser.parse(response.data);
25
- const properties = result['chkl:messages']?.['chkl:properties'];
26
- if (properties) {
27
- const activated = properties.activationExecuted === 'true' ||
28
- properties.activationExecuted === true;
29
- const checked = properties.checkExecuted === 'true' ||
30
- properties.checkExecuted === true;
31
- return {
32
- success: activated && checked,
33
- message: activated
34
- ? 'Feature toggle activated successfully'
35
- : 'Activation failed',
36
- };
37
- }
38
- // When the response body is empty, SAP treats activation as successful.
39
- return { success: true, message: 'Feature toggle activated' };
40
- }
41
- catch (error) {
42
- return {
43
- success: false,
44
- message: `Failed to parse activation response: ${error}`,
45
- };
46
- }
47
- }
48
18
  /**
49
19
  * Activate a feature toggle.
50
20
  */
@@ -64,9 +34,6 @@ async function activateFeatureToggle(connection, name) {
64
34
  'Content-Type': 'application/xml',
65
35
  },
66
36
  });
67
- const activationResult = parseActivationResponse(response);
68
- if (!activationResult.success) {
69
- throw new Error(`Feature toggle activation failed: ${activationResult.message}`);
70
- }
37
+ (0, activationUtils_1.assertActivationSucceeded)('Feature toggle', response.data);
71
38
  return response;
72
39
  }
@@ -8,14 +8,14 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
8
8
  * Activate a metadata extension
9
9
  *
10
10
  * @param connection - ABAP connection instance
11
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
11
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
12
12
  * @param sessionId - Session ID for request tracking
13
13
  * @param preaudit - Request pre-audit before activation (default: true)
14
14
  * @returns Axios response with activation result
15
15
  *
16
16
  * @example
17
17
  * ```typescript
18
- * await activateMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
18
+ * await activateMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
19
19
  * ```
20
20
  */
21
21
  export declare function activateMetadataExtension(connection: IAbapConnection, name: string, preaudit?: boolean): Promise<IAdtResponse>;
@@ -11,14 +11,14 @@ const activationUtils_1 = require("../../utils/activationUtils");
11
11
  * Activate a metadata extension
12
12
  *
13
13
  * @param connection - ABAP connection instance
14
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
14
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
15
15
  * @param sessionId - Session ID for request tracking
16
16
  * @param preaudit - Request pre-audit before activation (default: true)
17
17
  * @returns Axios response with activation result
18
18
  *
19
19
  * @example
20
20
  * ```typescript
21
- * await activateMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
21
+ * await activateMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
22
22
  * ```
23
23
  */
24
24
  async function activateMetadataExtension(connection, name, preaudit = true) {
@@ -8,7 +8,7 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
8
8
  * Check metadata extension syntax
9
9
  *
10
10
  * @param connection - ABAP connection instance
11
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
11
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
12
12
  * @param sessionId - Session ID for request tracking
13
13
  * @param version - Version to check ('active' or 'inactive', default 'inactive')
14
14
  * @param sourceCode - Optional source code to validate before saving
@@ -16,7 +16,7 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
16
16
  *
17
17
  * @example
18
18
  * ```typescript
19
- * const checkResult = await checkMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
19
+ * const checkResult = await checkMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
20
20
  * ```
21
21
  */
22
22
  export declare function checkMetadataExtension(connection: IAbapConnection, name: string, version?: 'active' | 'inactive', sourceCode?: string): Promise<IAdtResponse>;
@@ -11,7 +11,7 @@ const checkRun_1 = require("../../utils/checkRun");
11
11
  * Check metadata extension syntax
12
12
  *
13
13
  * @param connection - ABAP connection instance
14
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
14
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
15
15
  * @param sessionId - Session ID for request tracking
16
16
  * @param version - Version to check ('active' or 'inactive', default 'inactive')
17
17
  * @param sourceCode - Optional source code to validate before saving
@@ -19,7 +19,7 @@ const checkRun_1 = require("../../utils/checkRun");
19
19
  *
20
20
  * @example
21
21
  * ```typescript
22
- * const checkResult = await checkMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
22
+ * const checkResult = await checkMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
23
23
  * ```
24
24
  */
25
25
  async function checkMetadataExtension(connection, name, version = 'inactive', sourceCode) {
@@ -16,9 +16,9 @@ import type { IMetadataExtensionCreateParams } from './types';
16
16
  * @example
17
17
  * ```typescript
18
18
  * const response = await createMetadataExtension(connection, {
19
- * name: 'ZOK_C_CDS_TEST_0001',
19
+ * name: 'ZDEMO_C_CDS_MDE',
20
20
  * description: 'First metadata extension',
21
- * packageName: 'ZOK_TEST_000222',
21
+ * packageName: 'ZDEMO_PKG',
22
22
  * transportRequest: 'TRLK900123'
23
23
  * }, sessionId);
24
24
  * ```
@@ -20,9 +20,9 @@ const timeouts_1 = require("../../utils/timeouts");
20
20
  * @example
21
21
  * ```typescript
22
22
  * const response = await createMetadataExtension(connection, {
23
- * name: 'ZOK_C_CDS_TEST_0001',
23
+ * name: 'ZDEMO_C_CDS_MDE',
24
24
  * description: 'First metadata extension',
25
- * packageName: 'ZOK_TEST_000222',
25
+ * packageName: 'ZDEMO_PKG',
26
26
  * transportRequest: 'TRLK900123'
27
27
  * }, sessionId);
28
28
  * ```
@@ -8,14 +8,14 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
8
8
  * Delete a metadata extension
9
9
  *
10
10
  * @param connection - ABAP connection instance
11
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
11
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
12
12
  * @param transportRequest - Transport request number (optional for local objects)
13
13
  * @param sessionId - Session ID for request tracking
14
14
  * @returns Axios response
15
15
  *
16
16
  * @example
17
17
  * ```typescript
18
- * await deleteMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', 'TRLK900123', sessionId);
18
+ * await deleteMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', 'TRLK900123', sessionId);
19
19
  * ```
20
20
  */
21
21
  export declare function deleteMetadataExtension(connection: IAbapConnection, name: string, transportRequest: string | undefined): Promise<IAdtResponse>;
@@ -11,14 +11,14 @@ const timeouts_1 = require("../../utils/timeouts");
11
11
  * Delete a metadata extension
12
12
  *
13
13
  * @param connection - ABAP connection instance
14
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
14
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
15
15
  * @param transportRequest - Transport request number (optional for local objects)
16
16
  * @param sessionId - Session ID for request tracking
17
17
  * @returns Axios response
18
18
  *
19
19
  * @example
20
20
  * ```typescript
21
- * await deleteMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', 'TRLK900123', sessionId);
21
+ * await deleteMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', 'TRLK900123', sessionId);
22
22
  * ```
23
23
  */
24
24
  async function deleteMetadataExtension(connection, name, transportRequest) {
@@ -8,13 +8,13 @@ import type { IAbapConnection } from '@mcp-abap-adt/interfaces';
8
8
  * Lock a metadata extension for modification
9
9
  *
10
10
  * @param connection - ABAP connection instance
11
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
11
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
12
12
  * @param sessionId - Session ID for request tracking
13
13
  * @returns Lock handle string
14
14
  *
15
15
  * @example
16
16
  * ```typescript
17
- * const lockHandle = await lockMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
17
+ * const lockHandle = await lockMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
18
18
  * ```
19
19
  */
20
20
  export declare function lockMetadataExtension(connection: IAbapConnection, name: string): Promise<string>;
@@ -13,13 +13,13 @@ const timeouts_1 = require("../../utils/timeouts");
13
13
  * Lock a metadata extension for modification
14
14
  *
15
15
  * @param connection - ABAP connection instance
16
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
16
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
17
17
  * @param sessionId - Session ID for request tracking
18
18
  * @returns Lock handle string
19
19
  *
20
20
  * @example
21
21
  * ```typescript
22
- * const lockHandle = await lockMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sessionId);
22
+ * const lockHandle = await lockMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sessionId);
23
23
  * ```
24
24
  */
25
25
  async function lockMetadataExtension(connection, name) {
@@ -10,12 +10,12 @@ import type { IReadOptions } from '../shared/types';
10
10
  * Read metadata extension metadata
11
11
  *
12
12
  * @param connection - ABAP connection instance
13
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
13
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
14
14
  * @returns Axios response with metadata extension metadata
15
15
  *
16
16
  * @example
17
17
  * ```typescript
18
- * const metadata = await readMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001');
18
+ * const metadata = await readMetadataExtension(connection, 'ZDEMO_C_CDS_MDE');
19
19
  * ```
20
20
  */
21
21
  export declare function readMetadataExtension(connection: IAbapConnection, name: string, options?: IReadOptions, logger?: ILogger): Promise<IAdtResponse>;
@@ -23,13 +23,13 @@ export declare function readMetadataExtension(connection: IAbapConnection, name:
23
23
  * Read metadata extension source code
24
24
  *
25
25
  * @param connection - ABAP connection instance
26
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
26
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
27
27
  * @param version - Version to read ('active' or 'inactive', default 'active')
28
28
  * @returns Axios response with source code as string
29
29
  *
30
30
  * @example
31
31
  * ```typescript
32
- * const response = await readMetadataExtensionSource(connection, 'ZOK_C_CDS_TEST_0001');
32
+ * const response = await readMetadataExtensionSource(connection, 'ZDEMO_C_CDS_MDE');
33
33
  * const sourceCode = response.data;
34
34
  * ```
35
35
  */
@@ -16,12 +16,12 @@ const timeouts_1 = require("../../utils/timeouts");
16
16
  * Read metadata extension metadata
17
17
  *
18
18
  * @param connection - ABAP connection instance
19
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
19
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
20
20
  * @returns Axios response with metadata extension metadata
21
21
  *
22
22
  * @example
23
23
  * ```typescript
24
- * const metadata = await readMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001');
24
+ * const metadata = await readMetadataExtension(connection, 'ZDEMO_C_CDS_MDE');
25
25
  * ```
26
26
  */
27
27
  async function readMetadataExtension(connection, name, options, logger) {
@@ -42,13 +42,13 @@ async function readMetadataExtension(connection, name, options, logger) {
42
42
  * Read metadata extension source code
43
43
  *
44
44
  * @param connection - ABAP connection instance
45
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
45
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
46
46
  * @param version - Version to read ('active' or 'inactive', default 'active')
47
47
  * @returns Axios response with source code as string
48
48
  *
49
49
  * @example
50
50
  * ```typescript
51
- * const response = await readMetadataExtensionSource(connection, 'ZOK_C_CDS_TEST_0001');
51
+ * const response = await readMetadataExtensionSource(connection, 'ZDEMO_C_CDS_MDE');
52
52
  * const sourceCode = response.data;
53
53
  * ```
54
54
  */
@@ -10,13 +10,13 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
10
10
  * Unlock a metadata extension after editing
11
11
  *
12
12
  * @param connection - ABAP connection instance
13
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
13
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
14
14
  * @param lockHandle - Lock handle obtained from lockMetadataExtension
15
15
  * @returns Axios response
16
16
  *
17
17
  * @example
18
18
  * ```typescript
19
- * await unlockMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', lockHandle);
19
+ * await unlockMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', lockHandle);
20
20
  * connection.setSessionType("stateless");
21
21
  * ```
22
22
  */
@@ -13,13 +13,13 @@ const timeouts_1 = require("../../utils/timeouts");
13
13
  * Unlock a metadata extension after editing
14
14
  *
15
15
  * @param connection - ABAP connection instance
16
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
16
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
17
17
  * @param lockHandle - Lock handle obtained from lockMetadataExtension
18
18
  * @returns Axios response
19
19
  *
20
20
  * @example
21
21
  * ```typescript
22
- * await unlockMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', lockHandle);
22
+ * await unlockMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', lockHandle);
23
23
  * connection.setSessionType("stateless");
24
24
  * ```
25
25
  */
@@ -8,7 +8,7 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
8
8
  * Update metadata extension source code
9
9
  *
10
10
  * @param connection - ABAP connection instance
11
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
11
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
12
12
  * @param sourceCode - Metadata extension annotation source code
13
13
  * @param lockHandle - Lock handle from lockMetadataExtension
14
14
  * @returns Axios response
@@ -16,7 +16,7 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
16
16
  * @example
17
17
  * ```typescript
18
18
  * const sourceCode = `@Metadata.layer: #CUSTOMER
19
- * annotate entity ZOK_C_CDS_TEST
19
+ * annotate entity ZDEMO_C_CDS_VIEW
20
20
  * with
21
21
  * {
22
22
  * @EndUserText.label: 'Field 1 Label'
@@ -24,7 +24,7 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
24
24
  * Fld1;
25
25
  * }`;
26
26
  *
27
- * await updateMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sourceCode, lockHandle);
27
+ * await updateMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sourceCode, lockHandle);
28
28
  * ```
29
29
  */
30
30
  export declare function updateMetadataExtension(connection: IAbapConnection, name: string, sourceCode: string, lockHandle: string, transportRequest?: string): Promise<IAdtResponse>;
@@ -12,7 +12,7 @@ const timeouts_1 = require("../../utils/timeouts");
12
12
  * Update metadata extension source code
13
13
  *
14
14
  * @param connection - ABAP connection instance
15
- * @param name - Metadata extension name (e.g., 'ZOK_C_CDS_TEST_0001')
15
+ * @param name - Metadata extension name (e.g., 'ZDEMO_C_CDS_MDE')
16
16
  * @param sourceCode - Metadata extension annotation source code
17
17
  * @param lockHandle - Lock handle from lockMetadataExtension
18
18
  * @returns Axios response
@@ -20,7 +20,7 @@ const timeouts_1 = require("../../utils/timeouts");
20
20
  * @example
21
21
  * ```typescript
22
22
  * const sourceCode = `@Metadata.layer: #CUSTOMER
23
- * annotate entity ZOK_C_CDS_TEST
23
+ * annotate entity ZDEMO_C_CDS_VIEW
24
24
  * with
25
25
  * {
26
26
  * @EndUserText.label: 'Field 1 Label'
@@ -28,7 +28,7 @@ const timeouts_1 = require("../../utils/timeouts");
28
28
  * Fld1;
29
29
  * }`;
30
30
  *
31
- * await updateMetadataExtension(connection, 'ZOK_C_CDS_TEST_0001', sourceCode, lockHandle);
31
+ * await updateMetadataExtension(connection, 'ZDEMO_C_CDS_MDE', sourceCode, lockHandle);
32
32
  * ```
33
33
  */
34
34
  async function updateMetadataExtension(connection, name, sourceCode, lockHandle, transportRequest) {
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/scalarFunction/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8C9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/scalarFunction/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAY9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.activateScalarFunction = activateScalarFunction;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
4
+ const activationUtils_1 = require("../../utils/activationUtils");
5
5
  const internalUtils_1 = require("../../utils/internalUtils");
6
6
  const timeouts_1 = require("../../utils/timeouts");
7
7
  function buildActivationXml(name) {
@@ -10,35 +10,6 @@ function buildActivationXml(name) {
10
10
  <adtcore:objectReference adtcore:uri="/sap/bc/adt/ddic/dsfd/sources/${(0, internalUtils_1.encodeSapObjectName)(name.toLowerCase())}" adtcore:name="${name.toUpperCase()}"/>
11
11
  </adtcore:objectReferences>`;
12
12
  }
13
- function parseActivationResponse(response) {
14
- const parser = new fast_xml_parser_1.XMLParser({
15
- ignoreAttributes: false,
16
- attributeNamePrefix: '',
17
- });
18
- try {
19
- const result = parser.parse(response.data);
20
- const properties = result['chkl:messages']?.['chkl:properties'];
21
- if (properties) {
22
- const activated = properties.activationExecuted === 'true' ||
23
- properties.activationExecuted === true;
24
- const checked = properties.checkExecuted === 'true' ||
25
- properties.checkExecuted === true;
26
- return {
27
- success: activated && checked,
28
- message: activated
29
- ? 'Scalar function activated successfully'
30
- : 'Activation failed',
31
- };
32
- }
33
- return { success: false, message: 'Unknown activation status' };
34
- }
35
- catch (error) {
36
- return {
37
- success: false,
38
- message: `Failed to parse activation response: ${error}`,
39
- };
40
- }
41
- }
42
13
  async function activateScalarFunction(connection, name) {
43
14
  const url = `/sap/bc/adt/activation?method=activate&preauditRequested=true`;
44
15
  const response = await connection.makeAdtRequest({
@@ -48,9 +19,6 @@ async function activateScalarFunction(connection, name) {
48
19
  data: buildActivationXml(name),
49
20
  headers: { Accept: 'application/xml', 'Content-Type': 'application/xml' },
50
21
  });
51
- const activationResult = parseActivationResponse(response);
52
- if (!activationResult.success) {
53
- throw new Error(`Scalar function activation failed: ${activationResult.message}`);
54
- }
22
+ (0, activationUtils_1.assertActivationSucceeded)('Scalar function', response.data);
55
23
  return response;
56
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/scalarFunctionImplementation/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8C9E,wBAAsB,oCAAoC,CACxD,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/scalarFunctionImplementation/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAY9E,wBAAsB,oCAAoC,CACxD,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.activateScalarFunctionImplementation = activateScalarFunctionImplementation;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
4
+ const activationUtils_1 = require("../../utils/activationUtils");
5
5
  const internalUtils_1 = require("../../utils/internalUtils");
6
6
  const timeouts_1 = require("../../utils/timeouts");
7
7
  function buildActivationXml(name) {
@@ -10,35 +10,6 @@ function buildActivationXml(name) {
10
10
  <adtcore:objectReference adtcore:uri="/sap/bc/adt/ddic/dsfi/${(0, internalUtils_1.encodeSapObjectName)(name.toLowerCase())}" adtcore:name="${name.toUpperCase()}"/>
11
11
  </adtcore:objectReferences>`;
12
12
  }
13
- function parseActivationResponse(response) {
14
- const parser = new fast_xml_parser_1.XMLParser({
15
- ignoreAttributes: false,
16
- attributeNamePrefix: '',
17
- });
18
- try {
19
- const result = parser.parse(response.data);
20
- const properties = result['chkl:messages']?.['chkl:properties'];
21
- if (properties) {
22
- const activated = properties.activationExecuted === 'true' ||
23
- properties.activationExecuted === true;
24
- const checked = properties.checkExecuted === 'true' ||
25
- properties.checkExecuted === true;
26
- return {
27
- success: activated && checked,
28
- message: activated
29
- ? 'Scalar function implementation activated successfully'
30
- : 'Activation failed',
31
- };
32
- }
33
- return { success: false, message: 'Unknown activation status' };
34
- }
35
- catch (error) {
36
- return {
37
- success: false,
38
- message: `Failed to parse activation response: ${error}`,
39
- };
40
- }
41
- }
42
13
  async function activateScalarFunctionImplementation(connection, name) {
43
14
  const url = `/sap/bc/adt/activation?method=activate&preauditRequested=true`;
44
15
  const response = await connection.makeAdtRequest({
@@ -48,9 +19,6 @@ async function activateScalarFunctionImplementation(connection, name) {
48
19
  data: buildActivationXml(name),
49
20
  headers: { Accept: 'application/xml', 'Content-Type': 'application/xml' },
50
21
  });
51
- const activationResult = parseActivationResponse(response);
52
- if (!activationResult.success) {
53
- throw new Error(`Scalar function implementation activation failed: ${activationResult.message}`);
54
- }
22
+ (0, activationUtils_1.assertActivationSucceeded)('Scalar function implementation', response.data);
55
23
  return response;
56
24
  }
@@ -2,6 +2,9 @@
2
2
  * ServiceDefinition activation operations
3
3
  */
4
4
  import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
5
+ /**
6
+ * Parse activation response
7
+ */
5
8
  /**
6
9
  * Activate service definition
7
10
  * Makes service definition active and usable in SAP system
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/serviceDefinition/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwD9E;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,eAAe,EAC3B,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,YAAY,CAAC,CAyBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/serviceDefinition/activation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;GAEG;AAEH;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,eAAe,EAC3B,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.activateServiceDefinition = activateServiceDefinition;
7
- const fast_xml_parser_1 = require("fast-xml-parser");
7
+ const activationUtils_1 = require("../../utils/activationUtils");
8
8
  const internalUtils_1 = require("../../utils/internalUtils");
9
9
  const timeouts_1 = require("../../utils/timeouts");
10
10
  /**
@@ -19,35 +19,6 @@ function buildActivationXml(serviceDefinitionName) {
19
19
  /**
20
20
  * Parse activation response
21
21
  */
22
- function parseActivationResponse(response) {
23
- const parser = new fast_xml_parser_1.XMLParser({
24
- ignoreAttributes: false,
25
- attributeNamePrefix: '',
26
- });
27
- try {
28
- const result = parser.parse(response.data);
29
- const properties = result['chkl:messages']?.['chkl:properties'];
30
- if (properties) {
31
- const activated = properties.activationExecuted === 'true' ||
32
- properties.activationExecuted === true;
33
- const checked = properties.checkExecuted === 'true' ||
34
- properties.checkExecuted === true;
35
- return {
36
- success: activated && checked,
37
- message: activated
38
- ? 'Service definition activated successfully'
39
- : 'Activation failed',
40
- };
41
- }
42
- return { success: false, message: 'Unknown activation status' };
43
- }
44
- catch (error) {
45
- return {
46
- success: false,
47
- message: `Failed to parse activation response: ${error}`,
48
- };
49
- }
50
- }
51
22
  /**
52
23
  * Activate service definition
53
24
  * Makes service definition active and usable in SAP system
@@ -66,9 +37,6 @@ async function activateServiceDefinition(connection, serviceDefinitionName) {
66
37
  data: xmlBody,
67
38
  headers,
68
39
  });
69
- const activationResult = parseActivationResponse(response);
70
- if (!activationResult.success) {
71
- throw new Error(`Service definition activation failed: ${activationResult.message}`);
72
- }
40
+ (0, activationUtils_1.assertActivationSucceeded)('Service definition', response.data);
73
41
  return response;
74
42
  }
@@ -26,11 +26,11 @@ import type { IObjectReference } from './types';
26
26
  * const objects = [
27
27
  * {
28
28
  * type: 'BDEF/BDO',
29
- * name: 'ZOK_I_CDS_TEST'
29
+ * name: 'ZDEMO_I_CDS_VIEW'
30
30
  * },
31
31
  * {
32
32
  * type: 'DDLS/DF',
33
- * name: 'ZOK_C_CDS_TEST'
33
+ * name: 'ZDEMO_C_CDS_VIEW'
34
34
  * }
35
35
  * ];
36
36
  *
@@ -97,11 +97,11 @@ async function getActivationResults(connection, runId) {
97
97
  * const objects = [
98
98
  * {
99
99
  * type: 'BDEF/BDO',
100
- * name: 'ZOK_I_CDS_TEST'
100
+ * name: 'ZDEMO_I_CDS_VIEW'
101
101
  * },
102
102
  * {
103
103
  * type: 'DDLS/DF',
104
- * name: 'ZOK_C_CDS_TEST'
104
+ * name: 'ZDEMO_C_CDS_VIEW'
105
105
  * }
106
106
  * ];
107
107
  *
@@ -1,4 +1,7 @@
1
1
  import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
2
+ /**
3
+ * Parse activation response
4
+ */
2
5
  /**
3
6
  * Activate transformation
4
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/transformation/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwD9E;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,YAAY,CAAC,CAyBvB"}
1
+ {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../src/core/transformation/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;GAEG;AAEH;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.activateTransformation = activateTransformation;
4
- const fast_xml_parser_1 = require("fast-xml-parser");
4
+ const activationUtils_1 = require("../../utils/activationUtils");
5
5
  const internalUtils_1 = require("../../utils/internalUtils");
6
6
  const timeouts_1 = require("../../utils/timeouts");
7
7
  /**
@@ -16,35 +16,6 @@ function buildActivationXml(transformationName) {
16
16
  /**
17
17
  * Parse activation response
18
18
  */
19
- function parseActivationResponse(response) {
20
- const parser = new fast_xml_parser_1.XMLParser({
21
- ignoreAttributes: false,
22
- attributeNamePrefix: '',
23
- });
24
- try {
25
- const result = parser.parse(response.data);
26
- const properties = result['chkl:messages']?.['chkl:properties'];
27
- if (properties) {
28
- const activated = properties.activationExecuted === 'true' ||
29
- properties.activationExecuted === true;
30
- const checked = properties.checkExecuted === 'true' ||
31
- properties.checkExecuted === true;
32
- return {
33
- success: activated && checked,
34
- message: activated
35
- ? 'Transformation activated successfully'
36
- : 'Activation failed',
37
- };
38
- }
39
- return { success: false, message: 'Unknown activation status' };
40
- }
41
- catch (error) {
42
- return {
43
- success: false,
44
- message: `Failed to parse activation response: ${error}`,
45
- };
46
- }
47
- }
48
19
  /**
49
20
  * Activate transformation
50
21
  */
@@ -62,9 +33,6 @@ async function activateTransformation(connection, transformationName) {
62
33
  data: xmlBody,
63
34
  headers,
64
35
  });
65
- const activationResult = parseActivationResponse(response);
66
- if (!activationResult.success) {
67
- throw new Error(`Transformation activation failed: ${activationResult.message}`);
68
- }
36
+ (0, activationUtils_1.assertActivationSucceeded)('Transformation', response.data);
69
37
  return response;
70
38
  }
@@ -6,6 +6,27 @@
6
6
  * 2. Group activation: /sap/bc/adt/activation/runs (for multiple objects)
7
7
  */
8
8
  import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
9
+ /**
10
+ * Throw unless an activation response is free of error messages.
11
+ *
12
+ * Nine object types each carried a private copy of this check, all written the
13
+ * same way — `activationExecuted && checkExecuted`, with the `<msg>` list never
14
+ * read at all. That shape is wrong twice over:
15
+ *
16
+ * - It refuses a valid response. An object that needs no activation answers
17
+ * `activationExecuted="false"`, so `AdtClient` threw over objects that were
18
+ * already active. See `detectActivationFailure` above for the probed table.
19
+ * - It discards what SAP said. A genuine failure carries the reason in
20
+ * `<msg type="E">` — "Class ZAC_… does not have a TMDIR entry" — and every
21
+ * copy replaced it with the fixed string "Activation failed".
22
+ *
23
+ * One rule in one place, so the nine cannot drift apart again. Callers keep
24
+ * their own prefix, which is the only part that was ever type-specific.
25
+ *
26
+ * @param objectLabel prefix for the thrown message, e.g. `'Scalar function'`
27
+ * @throws when the response carries at least one error-severity message
28
+ */
29
+ export declare function assertActivationSucceeded(objectLabel: string, responseData: unknown): void;
9
30
  /**
10
31
  * Build object URI from name and type
11
32
  * Used by both individual and group activation
@@ -1 +1 @@
1
- {"version":3,"file":"activationUtils.d.ts","sourceRoot":"","sources":["../../src/utils/activationUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAmG9E;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAyGR;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,YAAY,CAAC,CA8BvB"}
1
+ {"version":3,"file":"activationUtils.d.ts","sourceRoot":"","sources":["../../src/utils/activationUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwG9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GACpB,IAAI,CAKN;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAyGR;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,YAAY,CAAC,CA8BvB"}
@@ -7,6 +7,7 @@
7
7
  * 2. Group activation: /sap/bc/adt/activation/runs (for multiple objects)
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.assertActivationSucceeded = assertActivationSucceeded;
10
11
  exports.buildObjectUri = buildObjectUri;
11
12
  exports.activateObjectInSession = activateObjectInSession;
12
13
  const fast_xml_parser_1 = require("fast-xml-parser");
@@ -36,11 +37,27 @@ function extractActivationMsgText(msg) {
36
37
  * Inspect an ADT activation response body for an **explicit failure signal**.
37
38
  *
38
39
  * ADT's `/sap/bc/adt/activation` endpoint returns HTTP 200 even when activation
39
- * fails (object locked by another session, syntax errors), carrying a
40
- * `<chkl:messages>` body with `chkl:properties activationExecuted="false"` and/or
40
+ * fails on a syntax error, carrying a `<chkl:messages>` body with
41
41
  * `<msg type="E">` entries. Treating "no HTTP error" as success masks these
42
42
  * failures (issue #78).
43
43
  *
44
+ * **The failure signal is an `E` message, not `activationExecuted="false"`.**
45
+ * This originally treated the flag alone as a failure, which is wrong — probed
46
+ * against a trial system:
47
+ *
48
+ * | scenario | HTTP | activationExecuted | `msg` |
49
+ * |--------------------------------|------|--------------------|-------|
50
+ * | class already active | 200 | `false` | none |
51
+ * | DDIC table already active | 200 | `true` | none |
52
+ * | class does not exist | 200 | `false` | `E` |
53
+ * | locked by another session | 403 | — | — |
54
+ *
55
+ * A class that needs no activation reports `false` with an empty message list —
56
+ * indistinguishable, by the flag alone, from a class that does not exist. So the
57
+ * flag says whether ADT did any work, not whether the work succeeded, and only
58
+ * the messages carry the verdict. The lock case the old wording named is a 403
59
+ * and never reached this function at all.
60
+ *
44
61
  * Conservative by design: returns a failure detail string ONLY on a positive
45
62
  * error signal. Empty, unparseable, or unrecognized bodies return `null`
46
63
  * (success) so the many object types whose success-body shape differs are never
@@ -67,8 +84,6 @@ function detectActivationFailure(responseData) {
67
84
  if (!messages) {
68
85
  return null;
69
86
  }
70
- const activationExecuted = messages['chkl:properties']?.activationExecuted;
71
- const executedFalse = activationExecuted === 'false' || activationExecuted === false;
72
87
  const rawMsg = messages.msg;
73
88
  const msgList = Array.isArray(rawMsg) ? rawMsg : rawMsg ? [rawMsg] : [];
74
89
  const errorTexts = msgList
@@ -78,12 +93,33 @@ function detectActivationFailure(responseData) {
78
93
  return typeof severity === 'string' && severity.toUpperCase() === 'E';
79
94
  })
80
95
  .map((m) => extractActivationMsgText(m));
81
- if (executedFalse || errorTexts.length > 0) {
82
- return errorTexts.length > 0
83
- ? errorTexts.join('; ')
84
- : 'activationExecuted=false';
96
+ return errorTexts.length > 0 ? errorTexts.join('; ') : null;
97
+ }
98
+ /**
99
+ * Throw unless an activation response is free of error messages.
100
+ *
101
+ * Nine object types each carried a private copy of this check, all written the
102
+ * same way — `activationExecuted && checkExecuted`, with the `<msg>` list never
103
+ * read at all. That shape is wrong twice over:
104
+ *
105
+ * - It refuses a valid response. An object that needs no activation answers
106
+ * `activationExecuted="false"`, so `AdtClient` threw over objects that were
107
+ * already active. See `detectActivationFailure` above for the probed table.
108
+ * - It discards what SAP said. A genuine failure carries the reason in
109
+ * `<msg type="E">` — "Class ZAC_… does not have a TMDIR entry" — and every
110
+ * copy replaced it with the fixed string "Activation failed".
111
+ *
112
+ * One rule in one place, so the nine cannot drift apart again. Callers keep
113
+ * their own prefix, which is the only part that was ever type-specific.
114
+ *
115
+ * @param objectLabel prefix for the thrown message, e.g. `'Scalar function'`
116
+ * @throws when the response carries at least one error-severity message
117
+ */
118
+ function assertActivationSucceeded(objectLabel, responseData) {
119
+ const failure = detectActivationFailure(responseData);
120
+ if (failure) {
121
+ throw new Error(`${objectLabel} activation failed: ${failure}`);
85
122
  }
86
- return null;
87
123
  }
88
124
  /**
89
125
  * Build object URI from name and type
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/adt-clients",
3
- "version": "10.0.1",
3
+ "version": "10.0.2",
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",