@mcp-abap-adt/adt-backup 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +34 -0
  2. package/dist/bin/adt-backup.js +0 -0
  3. package/dist/lib/auth/createTokenProvider.d.ts +1 -1
  4. package/dist/lib/auth/createTokenProvider.d.ts.map +1 -1
  5. package/dist/lib/auth/createTokenProvider.js +2 -1
  6. package/dist/lib/auth/getSapConfigFromBroker.d.ts +1 -0
  7. package/dist/lib/auth/getSapConfigFromBroker.d.ts.map +1 -1
  8. package/dist/lib/auth/getSapConfigFromBroker.js +94 -95
  9. package/dist/lib/backup/backupObject.d.ts.map +1 -1
  10. package/dist/lib/backup/backupObject.js +19 -5
  11. package/dist/lib/backup/readMetadataXmlForType.d.ts +1 -1
  12. package/dist/lib/backup/readMetadataXmlForType.d.ts.map +1 -1
  13. package/dist/lib/backup/readMetadataXmlForType.js +113 -92
  14. package/dist/lib/backup/readSourceText.d.ts +1 -1
  15. package/dist/lib/backup/readSourceText.d.ts.map +1 -1
  16. package/dist/lib/backup/readSourceText.js +96 -87
  17. package/dist/lib/cli/createLogger.d.ts.map +1 -1
  18. package/dist/lib/cli/createLogger.js +18 -0
  19. package/dist/lib/cli/parseArgs.d.ts +1 -1
  20. package/dist/lib/cli/parseArgs.d.ts.map +1 -1
  21. package/dist/lib/cli/parseArgs.js +25 -10
  22. package/dist/lib/cli/usage.d.ts.map +1 -1
  23. package/dist/lib/cli/usage.js +92 -87
  24. package/dist/lib/constants/typeOrder.d.ts.map +1 -1
  25. package/dist/lib/constants/typeOrder.js +1 -0
  26. package/dist/lib/dependencies/collectTreeDependencies.d.ts.map +1 -1
  27. package/dist/lib/dependencies/collectTreeDependencies.js +1 -0
  28. package/dist/lib/restore/analyzeDependencies.d.ts +13 -0
  29. package/dist/lib/restore/analyzeDependencies.d.ts.map +1 -0
  30. package/dist/lib/restore/analyzeDependencies.js +187 -0
  31. package/dist/lib/restore/restoreObject.d.ts.map +1 -1
  32. package/dist/lib/restore/restoreObject.js +13 -0
  33. package/dist/lib/restore/restoreObjects.d.ts.map +1 -1
  34. package/dist/lib/restore/restoreObjects.js +49 -10
  35. package/dist/lib/restore/restoreTreeBackup.d.ts +1 -1
  36. package/dist/lib/restore/restoreTreeBackup.d.ts.map +1 -1
  37. package/dist/lib/restore/restoreTreeBackup.js +192 -42
  38. package/dist/lib/restore/restoreTreeNode.d.ts +1 -1
  39. package/dist/lib/restore/restoreTreeNode.d.ts.map +1 -1
  40. package/dist/lib/restore/restoreTreeNode.js +128 -36
  41. package/dist/lib/run.d.ts.map +1 -1
  42. package/dist/lib/run.js +393 -559
  43. package/dist/lib/tree/buildConfigForNode.d.ts.map +1 -1
  44. package/dist/lib/tree/buildConfigForNode.js +19 -0
  45. package/dist/lib/tree/buildPackageBackupTree.d.ts.map +1 -1
  46. package/dist/lib/tree/buildPackageBackupTree.js +9 -3
  47. package/dist/lib/tree/enrichTreeNode.d.ts.map +1 -1
  48. package/dist/lib/tree/enrichTreeNode.js +17 -1
  49. package/dist/lib/tree/isRestoreImplemented.d.ts.map +1 -1
  50. package/dist/lib/tree/isRestoreImplemented.js +2 -0
  51. package/dist/lib/tree/mapAdtTypeToSupported.d.ts.map +1 -1
  52. package/dist/lib/tree/mapAdtTypeToSupported.js +6 -0
  53. package/dist/lib/tree/readPayloadForType.d.ts.map +1 -1
  54. package/dist/lib/tree/readPayloadForType.js +5 -3
  55. package/dist/lib/types.d.ts +22 -2
  56. package/dist/lib/types.d.ts.map +1 -1
  57. package/dist/lib/utils/applyConfigName.d.ts.map +1 -1
  58. package/dist/lib/utils/applyConfigName.js +6 -0
  59. package/dist/lib/utils/normalizeType.d.ts.map +1 -1
  60. package/dist/lib/utils/normalizeType.js +2 -0
  61. package/dist/lib/utils/parseBdefSource.d.ts +9 -0
  62. package/dist/lib/utils/parseBdefSource.d.ts.map +1 -0
  63. package/dist/lib/utils/parseBdefSource.js +18 -0
  64. package/dist/lib/verify/findOtherType.d.ts.map +1 -1
  65. package/dist/lib/verify/findOtherType.js +1 -0
  66. package/dist/lib/verify/formatVerifyResultsText.d.ts +1 -1
  67. package/dist/lib/verify/formatVerifyResultsText.d.ts.map +1 -1
  68. package/dist/lib/verify/formatVerifyResultsText.js +76 -14
  69. package/dist/lib/verify/types.d.ts +3 -0
  70. package/dist/lib/verify/types.d.ts.map +1 -1
  71. package/dist/lib/verify/verifyBackup.d.ts +4 -2
  72. package/dist/lib/verify/verifyBackup.d.ts.map +1 -1
  73. package/dist/lib/verify/verifyBackup.js +67 -32
  74. package/dist/lib/verify/verifyObjectInSystem.d.ts +1 -1
  75. package/dist/lib/verify/verifyObjectInSystem.d.ts.map +1 -1
  76. package/dist/lib/verify/verifyObjectInSystem.js +39 -105
  77. package/dist/lib/xml/index.d.ts +1 -0
  78. package/dist/lib/xml/index.d.ts.map +1 -1
  79. package/dist/lib/xml/index.js +1 -0
  80. package/dist/lib/xml/parseServiceBindingConfig.d.ts +3 -0
  81. package/dist/lib/xml/parseServiceBindingConfig.d.ts.map +1 -0
  82. package/dist/lib/xml/parseServiceBindingConfig.js +70 -0
  83. package/package.json +12 -12
@@ -2,95 +2,104 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.readSourceText = readSourceText;
4
4
  const responseToText_1 = require("../utils/responseToText");
5
- async function readSourceText(client, spec) {
6
- switch (spec.type) {
7
- case 'class': {
8
- const state = await client
9
- .getClass()
10
- .read({ className: spec.name }, 'active');
11
- return (0, responseToText_1.responseToText)(state?.readResult);
12
- }
13
- case 'interface': {
14
- const state = await client
15
- .getInterface()
16
- .read({ interfaceName: spec.name }, 'active');
17
- return (0, responseToText_1.responseToText)(state?.readResult);
18
- }
19
- case 'program': {
20
- const state = await client
21
- .getProgram()
22
- .read({ programName: spec.name }, 'active');
23
- return (0, responseToText_1.responseToText)(state?.readResult);
24
- }
25
- case 'structure': {
26
- const state = await client
27
- .getStructure()
28
- .read({ structureName: spec.name }, 'active');
29
- return (0, responseToText_1.responseToText)(state?.readResult);
30
- }
31
- case 'table': {
32
- const state = await client
33
- .getTable()
34
- .read({ tableName: spec.name }, 'active');
35
- return (0, responseToText_1.responseToText)(state?.readResult);
36
- }
37
- case 'view': {
38
- const state = await client
39
- .getView()
40
- .read({ viewName: spec.name }, 'active');
41
- return (0, responseToText_1.responseToText)(state?.readResult);
42
- }
43
- case 'tableType': {
44
- const state = await client
45
- .getTableType()
46
- .read({ tableTypeName: spec.name }, 'active');
47
- return (0, responseToText_1.responseToText)(state?.readResult);
48
- }
49
- case 'functionModule': {
50
- if (!spec.functionGroupName) {
51
- return undefined;
5
+ async function readSourceText(client, spec, version = 'active') {
6
+ try {
7
+ switch (spec.type) {
8
+ case 'class': {
9
+ const state = await client
10
+ .getClass()
11
+ .read({ className: spec.name }, version);
12
+ return (0, responseToText_1.responseToText)(state?.readResult);
52
13
  }
53
- const state = await client.getFunctionModule().read({
54
- functionGroupName: spec.functionGroupName,
55
- functionModuleName: spec.name,
56
- }, 'active');
57
- return (0, responseToText_1.responseToText)(state?.readResult);
58
- }
59
- case 'serviceDefinition': {
60
- const state = await client
61
- .getServiceDefinition()
62
- .read({ serviceDefinitionName: spec.name }, 'active');
63
- return (0, responseToText_1.responseToText)(state?.readResult);
64
- }
65
- case 'metadataExtension': {
66
- const state = await client
67
- .getMetadataExtension()
68
- .read({ name: spec.name }, 'active');
69
- return (0, responseToText_1.responseToText)(state?.readResult);
70
- }
71
- case 'behaviorDefinition': {
72
- const state = await client
73
- .getBehaviorDefinition()
74
- .read({ name: spec.name }, 'active');
75
- return (0, responseToText_1.responseToText)(state?.readResult);
76
- }
77
- case 'behaviorImplementation': {
78
- const state = await client
79
- .getBehaviorImplementation()
80
- .read({ className: spec.name }, 'active');
81
- return (0, responseToText_1.responseToText)(state?.readResult);
14
+ case 'interface': {
15
+ const state = await client
16
+ .getInterface()
17
+ .read({ interfaceName: spec.name }, version);
18
+ return (0, responseToText_1.responseToText)(state?.readResult);
19
+ }
20
+ case 'program': {
21
+ const state = await client
22
+ .getProgram()
23
+ .read({ programName: spec.name }, version);
24
+ return (0, responseToText_1.responseToText)(state?.readResult);
25
+ }
26
+ case 'view': {
27
+ const state = await client
28
+ .getView()
29
+ .read({ viewName: spec.name }, version);
30
+ return (0, responseToText_1.responseToText)(state?.readResult);
31
+ }
32
+ case 'table': {
33
+ const state = await client
34
+ .getTable()
35
+ .read({ tableName: spec.name }, version);
36
+ return (0, responseToText_1.responseToText)(state?.readResult);
37
+ }
38
+ case 'structure': {
39
+ const state = await client
40
+ .getStructure()
41
+ .read({ structureName: spec.name }, version);
42
+ return (0, responseToText_1.responseToText)(state?.readResult);
43
+ }
44
+ case 'tableType': {
45
+ const state = await client
46
+ .getTableType()
47
+ .read({ tableTypeName: spec.name }, version);
48
+ return (0, responseToText_1.responseToText)(state?.readResult);
49
+ }
50
+ case 'behaviorDefinition': {
51
+ const state = await client
52
+ .getBehaviorDefinition()
53
+ .read({ name: spec.name }, version);
54
+ return (0, responseToText_1.responseToText)(state?.readResult);
55
+ }
56
+ case 'behaviorImplementation': {
57
+ const state = await client
58
+ .getBehaviorImplementation()
59
+ .read({ className: spec.name }, version);
60
+ return (0, responseToText_1.responseToText)(state?.readResult);
61
+ }
62
+ case 'serviceDefinition': {
63
+ const state = await client
64
+ .getServiceDefinition()
65
+ .read({ serviceDefinitionName: spec.name }, version);
66
+ return (0, responseToText_1.responseToText)(state?.readResult);
67
+ }
68
+ case 'metadataExtension': {
69
+ const state = await client
70
+ .getMetadataExtension()
71
+ .read({ name: spec.name }, version);
72
+ return (0, responseToText_1.responseToText)(state?.readResult);
73
+ }
74
+ case 'functionModule': {
75
+ if (!spec.functionGroupName)
76
+ return undefined;
77
+ const state = await client.getFunctionModule().read({
78
+ functionGroupName: spec.functionGroupName,
79
+ functionModuleName: spec.name,
80
+ }, version);
81
+ return (0, responseToText_1.responseToText)(state?.readResult);
82
+ }
83
+ case 'enhancement': {
84
+ const state = await client
85
+ .getEnhancement()
86
+ .read({ enhancementName: spec.name, enhancementType: 'enhoxh' }, version);
87
+ return (0, responseToText_1.responseToText)(state?.readResult);
88
+ }
89
+ case 'accessControl': {
90
+ const state = await client
91
+ .getAccessControl()
92
+ .read({ accessControlName: spec.name }, version);
93
+ return (0, responseToText_1.responseToText)(state?.readResult);
94
+ }
95
+ default:
96
+ return undefined;
82
97
  }
83
- case 'enhancement': {
84
- // For enhancement we need to know the type, but since we don't have it in spec easily
85
- // and it's mostly used for BAdI implementations in this context, we try to read it
86
- // via general enhancement client if available or skip.
87
- // Assuming 'enhoxh' (Enhancement Implementation) as default for now if not specified.
88
- const state = await client
89
- .getEnhancement()
90
- .read({ enhancementName: spec.name, enhancementType: 'enhoxh' }, 'active');
91
- return (0, responseToText_1.responseToText)(state?.readResult);
98
+ }
99
+ catch (error) {
100
+ if (error.status === 404 || error.response?.status === 404) {
101
+ return null;
92
102
  }
93
- default:
94
- return undefined;
103
+ throw error;
95
104
  }
96
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createLogger.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/createLogger.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM;qBAErB,MAAM,SAAS,OAAO;oBAMvB,MAAM,SAAS,OAAO;oBAMtB,MAAM,SAAS,OAAO;qBAMrB,MAAM,SAAS,OAAO;EAK1C"}
1
+ {"version":3,"file":"createLogger.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/createLogger.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM;qBAErB,MAAM,SAAS,OAAO;oBAMvB,MAAM,SAAS,OAAO;oBAMtB,MAAM,SAAS,OAAO;qBAMrB,MAAM,SAAS,OAAO;EA6B1C"}
@@ -23,6 +23,24 @@ function createLogger(level) {
23
23
  }
24
24
  },
25
25
  error: (message, meta) => {
26
+ // Robust detection of "expected" missing object errors from ADT clients
27
+ const metaObj = meta && typeof meta === 'object' ? meta : {};
28
+ const fullMsg = (message +
29
+ (metaObj.message || '') +
30
+ JSON.stringify(metaObj)).toLowerCase();
31
+ const isExpectedNotFound = metaObj.status === 404 ||
32
+ metaObj.status === 410 ||
33
+ /not found/i.test(fullMsg) ||
34
+ /does not exist/i.test(fullMsg) ||
35
+ /ExceptionResourceNotFound/i.test(fullMsg) ||
36
+ (/failed for/i.test(fullMsg) && /404/i.test(fullMsg));
37
+ if (isExpectedNotFound) {
38
+ // Only show detailed ADT failures at maximum verbosity (-vvv)
39
+ if (level >= 3) {
40
+ console.log(`[DEBUG] Object missing in system: ${message}`);
41
+ }
42
+ return;
43
+ }
26
44
  const formatted = (0, redact_1.formatLogMeta)(meta);
27
45
  console.error(message, formatted || '');
28
46
  },
@@ -1,2 +1,2 @@
1
- export declare function parseArgs(argv: string[]): Record<string, string | boolean>;
1
+ export declare function parseArgs(argv: string[]): Record<string, string | boolean | number>;
2
2
  //# sourceMappingURL=parseArgs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseArgs.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/parseArgs.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAiB1E"}
1
+ {"version":3,"file":"parseArgs.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/parseArgs.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EAAE,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CA8B3C"}
@@ -5,17 +5,32 @@ function parseArgs(argv) {
5
5
  const args = {};
6
6
  for (let i = 0; i < argv.length; i += 1) {
7
7
  const arg = argv[i];
8
- if (!arg.startsWith('--')) {
9
- continue;
8
+ if (arg.startsWith('--')) {
9
+ const key = arg.slice(2);
10
+ // Handle --v, --vv, --vvv as verbosity flags
11
+ if (/^v+$/.test(key)) {
12
+ args.verbosity = Math.max(Number(args.verbosity || 0), key.length);
13
+ continue;
14
+ }
15
+ const next = argv[i + 1];
16
+ if (!next || next.startsWith('--') || next.startsWith('-')) {
17
+ args[key] = true;
18
+ }
19
+ else {
20
+ args[key] = next;
21
+ i += 1;
22
+ }
10
23
  }
11
- const key = arg.slice(2);
12
- const next = argv[i + 1];
13
- if (!next || next.startsWith('--')) {
14
- args[key] = true;
15
- }
16
- else {
17
- args[key] = next;
18
- i += 1;
24
+ else if (arg.startsWith('-')) {
25
+ // Handle short flags like -v, -vv, -vvv
26
+ const key = arg.slice(1);
27
+ if (key.startsWith('v')) {
28
+ const vCount = key.split('').filter((c) => c === 'v').length;
29
+ args.verbosity = Math.max(Number(args.verbosity || 0), vCount);
30
+ }
31
+ else {
32
+ args[key] = true;
33
+ }
19
34
  }
20
35
  }
21
36
  return args;
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/usage.ts"],"names":[],"mappings":"AAyJA,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAwC9C"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/usage.ts"],"names":[],"mappings":"AA8KA,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA2B9C"}
@@ -3,9 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.usage = usage;
4
4
  const commonOptions = [
5
5
  'Common Options:',
6
- ' --destination <name> Destination name for AuthBroker stores',
7
- ' --env <file> Path to .env file',
6
+ ' --destination <name> Target system name (from AuthBroker stores)',
7
+ ' --target <name> Alias for --destination',
8
+ ' --env <file> Path to .env file for target system',
9
+ ' --env-path <file> Alias for --env',
8
10
  ' --auth-root <path> Root folder with auth configs',
11
+ ' --mcp Enable MCP-compatible mode',
12
+ ' --browser-auth-port <port> Port for OAuth callback server (default: 10001)',
9
13
  ' --log-file <path> Write console output to a file',
10
14
  ' --debug-adt Enable ADT/connection logs',
11
15
  ' -v, -vv, -vvv Verbosity levels',
@@ -14,7 +18,7 @@ const commands = {
14
18
  backup: `
15
19
  Usage: adt-backup backup [options]
16
20
 
17
- Backs up ABAP objects or packages.
21
+ Backs up ABAP objects or packages from the source system.
18
22
 
19
23
  Options:
20
24
  --objects <list> Comma-separated list of objects (type:name)
@@ -22,127 +26,141 @@ Options:
22
26
  --output <file> Output file (default: backup.yaml)
23
27
 
24
28
  ${commonOptions}
29
+ `.trim(),
30
+ tree: `
31
+ Usage: adt-backup tree [options]
25
32
 
26
- Examples:
27
- adt-backup backup --objects class:ZCL_TEST,view:ZV_TEST
28
- adt-backup backup --package ZPKG_TEST --output backup.yaml
33
+ Fetches package hierarchy and dependencies from the source system.
34
+
35
+ Options:
36
+ --package <name> Name of the package to analyze
37
+ --output <file> Output file (default: tree.yaml)
38
+
39
+ ${commonOptions}
29
40
  `.trim(),
30
- restore: `
31
- Usage: adt-backup restore [options]
41
+ enrich: `
42
+ Usage: adt-backup enrich [options]
32
43
 
33
- Restores objects from a backup file.
44
+ Populates a tree file with metadata and source code from the source system.
34
45
 
35
46
  Options:
36
- --input <file> Backup file to restore
37
- --mode <mode> Restore mode: create, update, upsert (default: upsert)
38
- --activate Activate objects after restore (default for updates)
39
- --no-activate-on-create Skip activation for new objects
40
- --no-activate-on-update Skip activation for updated objects
41
- --force Force restore even if conflicts are found
42
- --strict Fail on any verification error
43
- --dangerous Delete objects from system before restore (package only)
44
- --transport <request> Transport request for changes
45
- --software-component <name> Override software component for packages
47
+ --input <file> Input tree YAML file
48
+ --output <file> Output backup file (defaults to input file)
46
49
 
47
50
  ${commonOptions}
51
+ `.trim(),
52
+ plan: `
53
+ Usage: adt-backup plan [options]
54
+
55
+ Builds a dependency-based restoration sequence (offline).
56
+
57
+ Options:
58
+ --input <file> Backup file to analyze
59
+ --output <file> Output plan file (default: plan.yaml)
60
+ --mode <mode> Default action for all objects: create, update, upsert (default: create)
48
61
 
49
62
  Examples:
50
- adt-backup restore --input backup.yaml --mode upsert --activate
51
- adt-backup restore --input backup.yaml --force --transport DEVK900001
63
+ adt-backup plan --input backup.yaml --output plan.yaml
52
64
  `.trim(),
53
- diff: `
54
- Usage: adt-backup diff [options]
65
+ verify: `
66
+ Usage: adt-backup verify [options]
55
67
 
56
- Compares backup content with the current system state.
68
+ Updates a restoration plan with actual TARGET system state (online).
57
69
 
58
70
  Options:
59
- --input <file> Backup file to compare
60
- --object <type:name> Specific object to compare
61
- --all Compare all objects in the backup
62
- --show-ok Show objects with no differences
71
+ --plan <file> Plan file to update (required)
72
+ --output <file> Output plan file (defaults to input file)
73
+ --skip-existing Skip all existing objects (mark as 'skip' instead of 'update')
74
+ --skip-unchanged Skip unchanged objects only (source-mismatch still updated)
63
75
 
64
76
  ${commonOptions}
65
77
 
66
78
  Examples:
67
- adt-backup diff --input backup.yaml --all
68
- adt-backup diff --input backup.yaml --object class:ZCL_TEST
79
+ adt-backup verify --plan plan.yaml --target mdd-sk-dev
80
+ adt-backup verify --plan plan.yaml --target mdd-sk-dev --skip-existing
81
+ adt-backup verify --plan plan.yaml --target mdd-sk-dev --skip-unchanged
69
82
  `.trim(),
70
- verify: `
71
- Usage: adt-backup verify [options]
83
+ check: `
84
+ Usage: adt-backup check [options]
72
85
 
73
- Verifies the integrity of a backup file (source-only).
86
+ Compares backup file with the TARGET system (online).
74
87
 
75
88
  Options:
76
- --input <file> Backup file to verify
89
+ --input <file> Backup file to check
77
90
  --format <format> Output format: text, json (default: text)
78
- --strict Fail on any verification error
91
+ --strict Fail on any difference (source/package)
79
92
 
80
93
  ${commonOptions}
81
94
 
82
95
  Examples:
83
- adt-backup verify --input backup.yaml
96
+ adt-backup check --input backup.yaml --target mdd-sk-dev
84
97
  `.trim(),
85
- validate: `
86
- Usage: adt-backup validate [options]
98
+ restore: `
99
+ Usage: adt-backup restore [options]
87
100
 
88
- Validates the internal checksums of a backup file.
101
+ Executes a restoration plan on the TARGET system (online).
89
102
 
90
103
  Options:
91
- --input <file> Backup file to validate
92
- --object <type:name> Specific object to validate (optional)
104
+ --plan <file> Pre-generated and verified plan file (required)
105
+ --no-activate Disable all activations (including group activation)
106
+ --transport <request> Transport request for changes in target system
107
+ --software-component <name> Override software component for packages
108
+ --transport-layer <name> Override transport layer for packages
109
+ --super-package <name> Default super package for root packages
93
110
 
94
111
  ${commonOptions}
95
112
 
96
113
  Examples:
97
- adt-backup validate --input backup.yaml
114
+ adt-backup restore --plan plan.yaml --target mdd-sk-dev
98
115
  `.trim(),
99
- extract: `
100
- Usage: adt-backup extract [options]
116
+ activate: `
117
+ Usage: adt-backup activate [options]
101
118
 
102
- Extracts a single object's source code from a backup file.
119
+ Activates existing objects in the TARGET system based on a plan file.
120
+ Useful after --skip-existing to activate objects that were skipped during restore.
103
121
 
104
122
  Options:
105
- --input <file> Backup file
106
- --object <type:name> Object to extract
107
- --out <file> Output file path
123
+ --plan <file> Plan file to read (required)
124
+ --filter <mode> Which objects to activate: skip, update, or all (default: all)
108
125
 
109
126
  ${commonOptions}
110
127
 
111
128
  Examples:
112
- adt-backup extract --input backup.yaml --object class:ZCL_TEST --out ZCL_TEST.abap
129
+ adt-backup activate --plan plan.yaml --target mdd-sk-dev
130
+ adt-backup activate --plan plan.yaml --target mdd-sk-dev --filter skip
113
131
  `.trim(),
114
- patch: `
115
- Usage: adt-backup patch [options]
132
+ diff: `
133
+ Usage: adt-backup diff [options]
116
134
 
117
- Patches an object's source code in a backup file.
135
+ Compares backup content with the TARGET system state.
118
136
 
119
137
  Options:
120
- --input <file> Backup file
121
- --object <type:name> Object to patch
122
- --file <file> File containing new source code
123
- --output <file> Output backup file (defaults to input file)
138
+ --input <file> Backup file to compare
139
+ --object <type:name> Specific object to compare
140
+ --all Compare all objects in the backup
141
+ --show-ok Show objects with no differences
124
142
 
125
143
  ${commonOptions}
144
+ `.trim(),
145
+ validate: `
146
+ Usage: adt-backup validate [options]
126
147
 
127
- Examples:
128
- adt-backup patch --input backup.yaml --object class:ZCL_TEST --file ZCL_TEST.abap
148
+ Validates the internal checksums of a backup file (offline).
149
+
150
+ Options:
151
+ --input <file> Backup file to validate
152
+ --object <type:name> Specific object to validate (optional)
129
153
  `.trim(),
130
154
  list: `
131
155
  Usage: adt-backup list [options]
132
156
 
133
- Lists contents of a backup file.
157
+ Lists contents of a backup file (offline).
134
158
 
135
159
  Options:
136
160
  --input <file> Backup file
137
161
  --format <format> Output format: text, json (default: text)
138
162
  --flat List flattened objects (for tree backups)
139
163
  --deps Show dependencies (tree structure only)
140
-
141
- ${commonOptions}
142
-
143
- Examples:
144
- adt-backup list --input backup.yaml
145
- adt-backup list --input backup.yaml --flat
146
164
  `.trim(),
147
165
  };
148
166
  function usage(command) {
@@ -155,33 +173,20 @@ function usage(command) {
155
173
  'Usage: adt-backup <command> [options]',
156
174
  '',
157
175
  'Commands:',
158
- ' backup Backup ABAP objects or packages',
159
- ' restore Restore objects from backup',
160
- ' diff Compare backup with system',
161
- ' verify Verify backup integrity',
176
+ ' tree Fetch package hierarchy and dependencies (no source)',
177
+ ' enrich Populate tree file with metadata and source',
178
+ ' backup Backup ABAP objects or packages (one-step)',
179
+ ' plan Prepare restoration sequence (offline)',
180
+ ' verify Update plan with target system state (online)',
181
+ ' check Check backup against target system (online)',
182
+ ' restore Execute restoration plan on target system (online)',
183
+ ' activate Activate existing objects in target system',
184
+ ' diff Compare backup with target system',
162
185
  ' validate Validate backup checksums',
163
- ' extract Extract object source',
164
- ' patch Patch object source in backup',
165
186
  ' list List backup contents',
166
187
  '',
167
188
  'Run "adt-backup <command> --help" for command-specific options.',
168
189
  '',
169
190
  commonOptions,
170
- '',
171
- 'Object type examples:',
172
- ' class:ZCL_TEST',
173
- ' interface:ZIF_TEST',
174
- ' program:ZREP_TEST',
175
- ' view:ZV_TEST',
176
- ' domain:ZDOM_TEST',
177
- ' dataElement:ZDE_TEST',
178
- ' structure:ZST_TEST',
179
- ' table:ZT_TEST',
180
- ' tableType:ZTT_TEST',
181
- ' functionGroup:ZFG_TEST',
182
- ' functionModule:ZFG_TEST|ZFM_TEST',
183
- ' serviceDefinition:Z_I_SRV_DEF',
184
- ' metadataExtension:Z_I_SRV_EXT',
185
- ' behaviorDefinition:Z_I_BDEF',
186
191
  ].join('\n');
187
192
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typeOrder.d.ts","sourceRoot":"","sources":["../../../src/lib/constants/typeOrder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,SAAS,EAAE,aAAa,EAkBpC,CAAC"}
1
+ {"version":3,"file":"typeOrder.d.ts","sourceRoot":"","sources":["../../../src/lib/constants/typeOrder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,SAAS,EAAE,aAAa,EAmBpC,CAAC"}
@@ -15,6 +15,7 @@ exports.typeOrder = [
15
15
  'class',
16
16
  'program',
17
17
  'serviceDefinition',
18
+ 'serviceBinding',
18
19
  'metadataExtension',
19
20
  'behaviorDefinition',
20
21
  'behaviorImplementation',
@@ -1 +1 @@
1
- {"version":3,"file":"collectTreeDependencies.d.ts","sourceRoot":"","sources":["../../../src/lib/dependencies/collectTreeDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,KAAK,EAAE,cAAc,EAA6B,MAAM,UAAU,CAAC;AAkC1E,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Ff"}
1
+ {"version":3,"file":"collectTreeDependencies.d.ts","sourceRoot":"","sources":["../../../src/lib/dependencies/collectTreeDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,KAAK,EAAE,cAAc,EAA6B,MAAM,UAAU,CAAC;AAmC1E,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Ff"}
@@ -20,6 +20,7 @@ const WHERE_USED_TYPE_MAP = {
20
20
  functionGroup: 'FUGR/F',
21
21
  functionModule: 'FUGR/FF',
22
22
  serviceDefinition: 'SRVD/SRV',
23
+ serviceBinding: 'SRVB/SVB',
23
24
  metadataExtension: 'DDLX/EX',
24
25
  behaviorDefinition: 'BDEF/BDO',
25
26
  behaviorImplementation: 'BIMP/BIM',
@@ -0,0 +1,13 @@
1
+ import type { BackupTreeNode } from '../types';
2
+ export interface RestoreGroup {
3
+ nodes: BackupTreeNode[];
4
+ isCircular: boolean;
5
+ }
6
+ /**
7
+ * Robustly analyzes dependencies between objects by scanning both
8
+ * source code and XML metadata.
9
+ * Uses composite type:name keys to handle objects that share the same name
10
+ * (e.g. view and behaviorDefinition for the same CDS entity).
11
+ */
12
+ export declare function analyzeDependencies(nodes: BackupTreeNode[]): RestoreGroup[];
13
+ //# sourceMappingURL=analyzeDependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeDependencies.d.ts","sourceRoot":"","sources":["../../../src/lib/restore/analyzeDependencies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAwM3E"}