@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.
- package/README.md +34 -0
- package/dist/bin/adt-backup.js +0 -0
- package/dist/lib/auth/createTokenProvider.d.ts +1 -1
- package/dist/lib/auth/createTokenProvider.d.ts.map +1 -1
- package/dist/lib/auth/createTokenProvider.js +2 -1
- package/dist/lib/auth/getSapConfigFromBroker.d.ts +1 -0
- package/dist/lib/auth/getSapConfigFromBroker.d.ts.map +1 -1
- package/dist/lib/auth/getSapConfigFromBroker.js +94 -95
- package/dist/lib/backup/backupObject.d.ts.map +1 -1
- package/dist/lib/backup/backupObject.js +19 -5
- package/dist/lib/backup/readMetadataXmlForType.d.ts +1 -1
- package/dist/lib/backup/readMetadataXmlForType.d.ts.map +1 -1
- package/dist/lib/backup/readMetadataXmlForType.js +113 -92
- package/dist/lib/backup/readSourceText.d.ts +1 -1
- package/dist/lib/backup/readSourceText.d.ts.map +1 -1
- package/dist/lib/backup/readSourceText.js +96 -87
- package/dist/lib/cli/createLogger.d.ts.map +1 -1
- package/dist/lib/cli/createLogger.js +18 -0
- package/dist/lib/cli/parseArgs.d.ts +1 -1
- package/dist/lib/cli/parseArgs.d.ts.map +1 -1
- package/dist/lib/cli/parseArgs.js +25 -10
- package/dist/lib/cli/usage.d.ts.map +1 -1
- package/dist/lib/cli/usage.js +92 -87
- package/dist/lib/constants/typeOrder.d.ts.map +1 -1
- package/dist/lib/constants/typeOrder.js +1 -0
- package/dist/lib/dependencies/collectTreeDependencies.d.ts.map +1 -1
- package/dist/lib/dependencies/collectTreeDependencies.js +1 -0
- package/dist/lib/restore/analyzeDependencies.d.ts +13 -0
- package/dist/lib/restore/analyzeDependencies.d.ts.map +1 -0
- package/dist/lib/restore/analyzeDependencies.js +187 -0
- package/dist/lib/restore/restoreObject.d.ts.map +1 -1
- package/dist/lib/restore/restoreObject.js +13 -0
- package/dist/lib/restore/restoreObjects.d.ts.map +1 -1
- package/dist/lib/restore/restoreObjects.js +49 -10
- package/dist/lib/restore/restoreTreeBackup.d.ts +1 -1
- package/dist/lib/restore/restoreTreeBackup.d.ts.map +1 -1
- package/dist/lib/restore/restoreTreeBackup.js +192 -42
- package/dist/lib/restore/restoreTreeNode.d.ts +1 -1
- package/dist/lib/restore/restoreTreeNode.d.ts.map +1 -1
- package/dist/lib/restore/restoreTreeNode.js +128 -36
- package/dist/lib/run.d.ts.map +1 -1
- package/dist/lib/run.js +393 -559
- package/dist/lib/tree/buildConfigForNode.d.ts.map +1 -1
- package/dist/lib/tree/buildConfigForNode.js +19 -0
- package/dist/lib/tree/buildPackageBackupTree.d.ts.map +1 -1
- package/dist/lib/tree/buildPackageBackupTree.js +9 -3
- package/dist/lib/tree/enrichTreeNode.d.ts.map +1 -1
- package/dist/lib/tree/enrichTreeNode.js +17 -1
- package/dist/lib/tree/isRestoreImplemented.d.ts.map +1 -1
- package/dist/lib/tree/isRestoreImplemented.js +2 -0
- package/dist/lib/tree/mapAdtTypeToSupported.d.ts.map +1 -1
- package/dist/lib/tree/mapAdtTypeToSupported.js +6 -0
- package/dist/lib/tree/readPayloadForType.d.ts.map +1 -1
- package/dist/lib/tree/readPayloadForType.js +5 -3
- package/dist/lib/types.d.ts +22 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/utils/applyConfigName.d.ts.map +1 -1
- package/dist/lib/utils/applyConfigName.js +6 -0
- package/dist/lib/utils/normalizeType.d.ts.map +1 -1
- package/dist/lib/utils/normalizeType.js +2 -0
- package/dist/lib/utils/parseBdefSource.d.ts +9 -0
- package/dist/lib/utils/parseBdefSource.d.ts.map +1 -0
- package/dist/lib/utils/parseBdefSource.js +18 -0
- package/dist/lib/verify/findOtherType.d.ts.map +1 -1
- package/dist/lib/verify/findOtherType.js +1 -0
- package/dist/lib/verify/formatVerifyResultsText.d.ts +1 -1
- package/dist/lib/verify/formatVerifyResultsText.d.ts.map +1 -1
- package/dist/lib/verify/formatVerifyResultsText.js +76 -14
- package/dist/lib/verify/types.d.ts +3 -0
- package/dist/lib/verify/types.d.ts.map +1 -1
- package/dist/lib/verify/verifyBackup.d.ts +4 -2
- package/dist/lib/verify/verifyBackup.d.ts.map +1 -1
- package/dist/lib/verify/verifyBackup.js +67 -32
- package/dist/lib/verify/verifyObjectInSystem.d.ts +1 -1
- package/dist/lib/verify/verifyObjectInSystem.d.ts.map +1 -1
- package/dist/lib/verify/verifyObjectInSystem.js +39 -105
- package/dist/lib/xml/index.d.ts +1 -0
- package/dist/lib/xml/index.d.ts.map +1 -1
- package/dist/lib/xml/index.js +1 -0
- package/dist/lib/xml/parseServiceBindingConfig.d.ts +3 -0
- package/dist/lib/xml/parseServiceBindingConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseServiceBindingConfig.js +70 -0
- 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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;
|
|
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,
|
|
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 (
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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":"
|
|
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"}
|
package/dist/lib/cli/usage.js
CHANGED
|
@@ -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>
|
|
7
|
-
' --
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
31
|
-
Usage: adt-backup
|
|
41
|
+
enrich: `
|
|
42
|
+
Usage: adt-backup enrich [options]
|
|
32
43
|
|
|
33
|
-
|
|
44
|
+
Populates a tree file with metadata and source code from the source system.
|
|
34
45
|
|
|
35
46
|
Options:
|
|
36
|
-
--input <file>
|
|
37
|
-
--
|
|
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
|
|
51
|
-
adt-backup restore --input backup.yaml --force --transport DEVK900001
|
|
63
|
+
adt-backup plan --input backup.yaml --output plan.yaml
|
|
52
64
|
`.trim(),
|
|
53
|
-
|
|
54
|
-
Usage: adt-backup
|
|
65
|
+
verify: `
|
|
66
|
+
Usage: adt-backup verify [options]
|
|
55
67
|
|
|
56
|
-
|
|
68
|
+
Updates a restoration plan with actual TARGET system state (online).
|
|
57
69
|
|
|
58
70
|
Options:
|
|
59
|
-
--
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
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
|
|
68
|
-
adt-backup
|
|
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
|
-
|
|
71
|
-
Usage: adt-backup
|
|
83
|
+
check: `
|
|
84
|
+
Usage: adt-backup check [options]
|
|
72
85
|
|
|
73
|
-
|
|
86
|
+
Compares backup file with the TARGET system (online).
|
|
74
87
|
|
|
75
88
|
Options:
|
|
76
|
-
--input <file> Backup file to
|
|
89
|
+
--input <file> Backup file to check
|
|
77
90
|
--format <format> Output format: text, json (default: text)
|
|
78
|
-
--strict Fail on any
|
|
91
|
+
--strict Fail on any difference (source/package)
|
|
79
92
|
|
|
80
93
|
${commonOptions}
|
|
81
94
|
|
|
82
95
|
Examples:
|
|
83
|
-
adt-backup
|
|
96
|
+
adt-backup check --input backup.yaml --target mdd-sk-dev
|
|
84
97
|
`.trim(),
|
|
85
|
-
|
|
86
|
-
Usage: adt-backup
|
|
98
|
+
restore: `
|
|
99
|
+
Usage: adt-backup restore [options]
|
|
87
100
|
|
|
88
|
-
|
|
101
|
+
Executes a restoration plan on the TARGET system (online).
|
|
89
102
|
|
|
90
103
|
Options:
|
|
91
|
-
--
|
|
92
|
-
--
|
|
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
|
|
114
|
+
adt-backup restore --plan plan.yaml --target mdd-sk-dev
|
|
98
115
|
`.trim(),
|
|
99
|
-
|
|
100
|
-
Usage: adt-backup
|
|
116
|
+
activate: `
|
|
117
|
+
Usage: adt-backup activate [options]
|
|
101
118
|
|
|
102
|
-
|
|
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
|
-
--
|
|
106
|
-
--
|
|
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
|
|
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
|
-
|
|
115
|
-
Usage: adt-backup
|
|
132
|
+
diff: `
|
|
133
|
+
Usage: adt-backup diff [options]
|
|
116
134
|
|
|
117
|
-
|
|
135
|
+
Compares backup content with the TARGET system state.
|
|
118
136
|
|
|
119
137
|
Options:
|
|
120
|
-
--input <file> Backup file
|
|
121
|
-
--object <type:name>
|
|
122
|
-
--
|
|
123
|
-
--
|
|
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
|
-
|
|
128
|
-
|
|
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
|
-
'
|
|
159
|
-
'
|
|
160
|
-
'
|
|
161
|
-
'
|
|
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,
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -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"}
|