@mcp-abap-adt/adt-backup 0.1.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/LICENSE +22 -0
- package/README.md +64 -0
- package/dist/bin/adt-backup.d.ts +3 -0
- package/dist/bin/adt-backup.d.ts.map +1 -0
- package/dist/bin/adt-backup.js +8 -0
- package/dist/lib/auth/NoopTokenProvider.d.ts +5 -0
- package/dist/lib/auth/NoopTokenProvider.d.ts.map +1 -0
- package/dist/lib/auth/NoopTokenProvider.js +9 -0
- package/dist/lib/auth/createTokenProvider.d.ts +4 -0
- package/dist/lib/auth/createTokenProvider.d.ts.map +1 -0
- package/dist/lib/auth/createTokenProvider.js +22 -0
- package/dist/lib/auth/getSapConfigFromBroker.d.ts +13 -0
- package/dist/lib/auth/getSapConfigFromBroker.d.ts.map +1 -0
- package/dist/lib/auth/getSapConfigFromBroker.js +184 -0
- package/dist/lib/auth/index.d.ts +4 -0
- package/dist/lib/auth/index.d.ts.map +1 -0
- package/dist/lib/auth/index.js +19 -0
- package/dist/lib/backup/backupObject.d.ts +4 -0
- package/dist/lib/backup/backupObject.d.ts.map +1 -0
- package/dist/lib/backup/backupObject.js +166 -0
- package/dist/lib/backup/index.d.ts +5 -0
- package/dist/lib/backup/index.d.ts.map +1 -0
- package/dist/lib/backup/index.js +20 -0
- package/dist/lib/backup/readBasicMetadata.d.ts +7 -0
- package/dist/lib/backup/readBasicMetadata.d.ts.map +1 -0
- package/dist/lib/backup/readBasicMetadata.js +64 -0
- package/dist/lib/backup/readMetadataXmlForType.d.ts +4 -0
- package/dist/lib/backup/readMetadataXmlForType.d.ts.map +1 -0
- package/dist/lib/backup/readMetadataXmlForType.js +100 -0
- package/dist/lib/backup/readSourceText.d.ts +4 -0
- package/dist/lib/backup/readSourceText.d.ts.map +1 -0
- package/dist/lib/backup/readSourceText.js +96 -0
- package/dist/lib/cli/applyLogEnv.d.ts +2 -0
- package/dist/lib/cli/applyLogEnv.d.ts.map +1 -0
- package/dist/lib/cli/applyLogEnv.js +50 -0
- package/dist/lib/cli/createLogger.d.ts +7 -0
- package/dist/lib/cli/createLogger.d.ts.map +1 -0
- package/dist/lib/cli/createLogger.js +30 -0
- package/dist/lib/cli/getVerbosity.d.ts +2 -0
- package/dist/lib/cli/getVerbosity.d.ts.map +1 -0
- package/dist/lib/cli/getVerbosity.js +27 -0
- package/dist/lib/cli/index.d.ts +13 -0
- package/dist/lib/cli/index.d.ts.map +1 -0
- package/dist/lib/cli/index.js +28 -0
- package/dist/lib/cli/isEnvEnabled.d.ts +2 -0
- package/dist/lib/cli/isEnvEnabled.d.ts.map +1 -0
- package/dist/lib/cli/isEnvEnabled.js +10 -0
- package/dist/lib/cli/logVerbose.d.ts +2 -0
- package/dist/lib/cli/logVerbose.d.ts.map +1 -0
- package/dist/lib/cli/logVerbose.js +9 -0
- package/dist/lib/cli/parseArgs.d.ts +2 -0
- package/dist/lib/cli/parseArgs.d.ts.map +1 -0
- package/dist/lib/cli/parseArgs.js +22 -0
- package/dist/lib/cli/redact.d.ts +4 -0
- package/dist/lib/cli/redact.d.ts.map +1 -0
- package/dist/lib/cli/redact.js +75 -0
- package/dist/lib/cli/shouldEnableAdtLogger.d.ts +2 -0
- package/dist/lib/cli/shouldEnableAdtLogger.d.ts.map +1 -0
- package/dist/lib/cli/shouldEnableAdtLogger.js +10 -0
- package/dist/lib/cli/shouldEnableBrokerLogger.d.ts +2 -0
- package/dist/lib/cli/shouldEnableBrokerLogger.d.ts.map +1 -0
- package/dist/lib/cli/shouldEnableBrokerLogger.js +9 -0
- package/dist/lib/cli/shouldEnableConnectionLogger.d.ts +2 -0
- package/dist/lib/cli/shouldEnableConnectionLogger.d.ts.map +1 -0
- package/dist/lib/cli/shouldEnableConnectionLogger.js +7 -0
- package/dist/lib/cli/shouldEnableProviderLogger.d.ts +2 -0
- package/dist/lib/cli/shouldEnableProviderLogger.d.ts.map +1 -0
- package/dist/lib/cli/shouldEnableProviderLogger.js +9 -0
- package/dist/lib/cli/shouldEnableStoreLogger.d.ts +2 -0
- package/dist/lib/cli/shouldEnableStoreLogger.d.ts.map +1 -0
- package/dist/lib/cli/shouldEnableStoreLogger.js +9 -0
- package/dist/lib/cli/usage.d.ts +2 -0
- package/dist/lib/cli/usage.d.ts.map +1 -0
- package/dist/lib/cli/usage.js +187 -0
- package/dist/lib/constants/index.d.ts +3 -0
- package/dist/lib/constants/index.d.ts.map +1 -0
- package/dist/lib/constants/index.js +18 -0
- package/dist/lib/constants/typeOrder.d.ts +3 -0
- package/dist/lib/constants/typeOrder.d.ts.map +1 -0
- package/dist/lib/constants/typeOrder.js +22 -0
- package/dist/lib/constants/xmlParser.d.ts +3 -0
- package/dist/lib/constants/xmlParser.d.ts.map +1 -0
- package/dist/lib/constants/xmlParser.js +8 -0
- package/dist/lib/crypto/computeBackupChecksum.d.ts +3 -0
- package/dist/lib/crypto/computeBackupChecksum.d.ts.map +1 -0
- package/dist/lib/crypto/computeBackupChecksum.js +14 -0
- package/dist/lib/crypto/computeCodeChecksum.d.ts +2 -0
- package/dist/lib/crypto/computeCodeChecksum.d.ts.map +1 -0
- package/dist/lib/crypto/computeCodeChecksum.js +8 -0
- package/dist/lib/crypto/decodeBase64.d.ts +2 -0
- package/dist/lib/crypto/decodeBase64.d.ts.map +1 -0
- package/dist/lib/crypto/decodeBase64.js +6 -0
- package/dist/lib/crypto/encodeBase64.d.ts +2 -0
- package/dist/lib/crypto/encodeBase64.d.ts.map +1 -0
- package/dist/lib/crypto/encodeBase64.js +6 -0
- package/dist/lib/crypto/hashText.d.ts +2 -0
- package/dist/lib/crypto/hashText.d.ts.map +1 -0
- package/dist/lib/crypto/hashText.js +7 -0
- package/dist/lib/crypto/index.d.ts +10 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +25 -0
- package/dist/lib/crypto/stripBackupChecksum.d.ts +3 -0
- package/dist/lib/crypto/stripBackupChecksum.d.ts.map +1 -0
- package/dist/lib/crypto/stripBackupChecksum.js +8 -0
- package/dist/lib/crypto/updateTreeChecksums.d.ts +3 -0
- package/dist/lib/crypto/updateTreeChecksums.d.ts.map +1 -0
- package/dist/lib/crypto/updateTreeChecksums.js +17 -0
- package/dist/lib/crypto/verifyBackupChecksum.d.ts +3 -0
- package/dist/lib/crypto/verifyBackupChecksum.d.ts.map +1 -0
- package/dist/lib/crypto/verifyBackupChecksum.js +13 -0
- package/dist/lib/crypto/verifyTreeChecksums.d.ts +3 -0
- package/dist/lib/crypto/verifyTreeChecksums.d.ts.map +1 -0
- package/dist/lib/crypto/verifyTreeChecksums.js +22 -0
- package/dist/lib/dependencies/collectTreeDependencies.d.ts +4 -0
- package/dist/lib/dependencies/collectTreeDependencies.d.ts.map +1 -0
- package/dist/lib/dependencies/collectTreeDependencies.js +99 -0
- package/dist/lib/index.d.ts +14 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +29 -0
- package/dist/lib/restore/applyTransportRequest.d.ts +2 -0
- package/dist/lib/restore/applyTransportRequest.d.ts.map +1 -0
- package/dist/lib/restore/applyTransportRequest.js +12 -0
- package/dist/lib/restore/buildRestorePlan.d.ts +12 -0
- package/dist/lib/restore/buildRestorePlan.d.ts.map +1 -0
- package/dist/lib/restore/buildRestorePlan.js +46 -0
- package/dist/lib/restore/collectDeletionTargets.d.ts +7 -0
- package/dist/lib/restore/collectDeletionTargets.d.ts.map +1 -0
- package/dist/lib/restore/collectDeletionTargets.js +23 -0
- package/dist/lib/restore/deleteBackupObjects.d.ts +4 -0
- package/dist/lib/restore/deleteBackupObjects.d.ts.map +1 -0
- package/dist/lib/restore/deleteBackupObjects.js +22 -0
- package/dist/lib/restore/index.d.ts +9 -0
- package/dist/lib/restore/index.d.ts.map +1 -0
- package/dist/lib/restore/index.js +24 -0
- package/dist/lib/restore/restoreObject.d.ts +4 -0
- package/dist/lib/restore/restoreObject.d.ts.map +1 -0
- package/dist/lib/restore/restoreObject.js +242 -0
- package/dist/lib/restore/restoreObjects.d.ts +4 -0
- package/dist/lib/restore/restoreObjects.d.ts.map +1 -0
- package/dist/lib/restore/restoreObjects.js +28 -0
- package/dist/lib/restore/restoreTreeBackup.d.ts +4 -0
- package/dist/lib/restore/restoreTreeBackup.d.ts.map +1 -0
- package/dist/lib/restore/restoreTreeBackup.js +69 -0
- package/dist/lib/restore/restoreTreeNode.d.ts +4 -0
- package/dist/lib/restore/restoreTreeNode.d.ts.map +1 -0
- package/dist/lib/restore/restoreTreeNode.js +276 -0
- package/dist/lib/restore/sortByDependencies.d.ts +3 -0
- package/dist/lib/restore/sortByDependencies.d.ts.map +1 -0
- package/dist/lib/restore/sortByDependencies.js +65 -0
- package/dist/lib/restore/sortTreeNodesByDependencies.d.ts +3 -0
- package/dist/lib/restore/sortTreeNodesByDependencies.d.ts.map +1 -0
- package/dist/lib/restore/sortTreeNodesByDependencies.js +101 -0
- package/dist/lib/run.d.ts +2 -0
- package/dist/lib/run.d.ts.map +1 -0
- package/dist/lib/run.js +748 -0
- package/dist/lib/state/index.d.ts +2 -0
- package/dist/lib/state/index.d.ts.map +1 -0
- package/dist/lib/state/index.js +17 -0
- package/dist/lib/state/verbosity.d.ts +4 -0
- package/dist/lib/state/verbosity.d.ts.map +1 -0
- package/dist/lib/state/verbosity.js +6 -0
- package/dist/lib/tree/buildConfigForNode.d.ts +3 -0
- package/dist/lib/tree/buildConfigForNode.d.ts.map +1 -0
- package/dist/lib/tree/buildConfigForNode.js +116 -0
- package/dist/lib/tree/buildPackageBackupTree.d.ts +4 -0
- package/dist/lib/tree/buildPackageBackupTree.d.ts.map +1 -0
- package/dist/lib/tree/buildPackageBackupTree.js +27 -0
- package/dist/lib/tree/buildTreeList.d.ts +13 -0
- package/dist/lib/tree/buildTreeList.d.ts.map +1 -0
- package/dist/lib/tree/buildTreeList.js +19 -0
- package/dist/lib/tree/collectTreeObjects.d.ts +3 -0
- package/dist/lib/tree/collectTreeObjects.d.ts.map +1 -0
- package/dist/lib/tree/collectTreeObjects.js +18 -0
- package/dist/lib/tree/enrichTreeNode.d.ts +4 -0
- package/dist/lib/tree/enrichTreeNode.d.ts.map +1 -0
- package/dist/lib/tree/enrichTreeNode.js +69 -0
- package/dist/lib/tree/findNodeInTree.d.ts +3 -0
- package/dist/lib/tree/findNodeInTree.d.ts.map +1 -0
- package/dist/lib/tree/findNodeInTree.js +30 -0
- package/dist/lib/tree/flattenTree.d.ts +3 -0
- package/dist/lib/tree/flattenTree.d.ts.map +1 -0
- package/dist/lib/tree/flattenTree.js +12 -0
- package/dist/lib/tree/formatTreeListText.d.ts +5 -0
- package/dist/lib/tree/formatTreeListText.d.ts.map +1 -0
- package/dist/lib/tree/formatTreeListText.js +26 -0
- package/dist/lib/tree/getNodeFunctionGroupName.d.ts +3 -0
- package/dist/lib/tree/getNodeFunctionGroupName.d.ts.map +1 -0
- package/dist/lib/tree/getNodeFunctionGroupName.js +12 -0
- package/dist/lib/tree/getNodeObjectId.d.ts +3 -0
- package/dist/lib/tree/getNodeObjectId.d.ts.map +1 -0
- package/dist/lib/tree/getNodeObjectId.js +9 -0
- package/dist/lib/tree/getNodeObjectSpec.d.ts +3 -0
- package/dist/lib/tree/getNodeObjectSpec.d.ts.map +1 -0
- package/dist/lib/tree/getNodeObjectSpec.js +21 -0
- package/dist/lib/tree/index.d.ts +13 -0
- package/dist/lib/tree/index.d.ts.map +1 -0
- package/dist/lib/tree/index.js +28 -0
- package/dist/lib/tree/isRestoreImplemented.d.ts +3 -0
- package/dist/lib/tree/isRestoreImplemented.d.ts.map +1 -0
- package/dist/lib/tree/isRestoreImplemented.js +27 -0
- package/dist/lib/tree/mapAdtTypeToSupported.d.ts +3 -0
- package/dist/lib/tree/mapAdtTypeToSupported.d.ts.map +1 -0
- package/dist/lib/tree/mapAdtTypeToSupported.js +75 -0
- package/dist/lib/tree/readPayloadForType.d.ts +7 -0
- package/dist/lib/tree/readPayloadForType.d.ts.map +1 -0
- package/dist/lib/tree/readPayloadForType.js +38 -0
- package/dist/lib/types.d.ts +60 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/utils/applyConfigName.d.ts +3 -0
- package/dist/lib/utils/applyConfigName.d.ts.map +1 -0
- package/dist/lib/utils/applyConfigName.js +67 -0
- package/dist/lib/utils/asArray.d.ts +2 -0
- package/dist/lib/utils/asArray.d.ts.map +1 -0
- package/dist/lib/utils/asArray.js +9 -0
- package/dist/lib/utils/asConfig.d.ts +3 -0
- package/dist/lib/utils/asConfig.d.ts.map +1 -0
- package/dist/lib/utils/asConfig.js +6 -0
- package/dist/lib/utils/diffAttributes.d.ts +17 -0
- package/dist/lib/utils/diffAttributes.d.ts.map +1 -0
- package/dist/lib/utils/diffAttributes.js +27 -0
- package/dist/lib/utils/diffUnified.d.ts +4 -0
- package/dist/lib/utils/diffUnified.d.ts.map +1 -0
- package/dist/lib/utils/diffUnified.js +142 -0
- package/dist/lib/utils/ensureDescription.d.ts +3 -0
- package/dist/lib/utils/ensureDescription.d.ts.map +1 -0
- package/dist/lib/utils/ensureDescription.js +9 -0
- package/dist/lib/utils/formatObjectSpec.d.ts +3 -0
- package/dist/lib/utils/formatObjectSpec.d.ts.map +1 -0
- package/dist/lib/utils/formatObjectSpec.js +9 -0
- package/dist/lib/utils/index.d.ts +12 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +27 -0
- package/dist/lib/utils/normalizeType.d.ts +3 -0
- package/dist/lib/utils/normalizeType.d.ts.map +1 -0
- package/dist/lib/utils/normalizeType.js +43 -0
- package/dist/lib/utils/objectId.d.ts +3 -0
- package/dist/lib/utils/objectId.d.ts.map +1 -0
- package/dist/lib/utils/objectId.js +9 -0
- package/dist/lib/utils/parseBehaviorDefinitionFromClass.d.ts +2 -0
- package/dist/lib/utils/parseBehaviorDefinitionFromClass.d.ts.map +1 -0
- package/dist/lib/utils/parseBehaviorDefinitionFromClass.js +10 -0
- package/dist/lib/utils/parseObjectSpec.d.ts +3 -0
- package/dist/lib/utils/parseObjectSpec.d.ts.map +1 -0
- package/dist/lib/utils/parseObjectSpec.js +27 -0
- package/dist/lib/utils/responseToText.d.ts +4 -0
- package/dist/lib/utils/responseToText.d.ts.map +1 -0
- package/dist/lib/utils/responseToText.js +11 -0
- package/dist/lib/utils/toBackupConfig.d.ts +3 -0
- package/dist/lib/utils/toBackupConfig.d.ts.map +1 -0
- package/dist/lib/utils/toBackupConfig.js +6 -0
- package/dist/lib/verify/collectBackupNodes.d.ts +3 -0
- package/dist/lib/verify/collectBackupNodes.d.ts.map +1 -0
- package/dist/lib/verify/collectBackupNodes.js +13 -0
- package/dist/lib/verify/findOtherType.d.ts +4 -0
- package/dist/lib/verify/findOtherType.d.ts.map +1 -0
- package/dist/lib/verify/findOtherType.js +41 -0
- package/dist/lib/verify/formatVerifyResultsText.d.ts +3 -0
- package/dist/lib/verify/formatVerifyResultsText.d.ts.map +1 -0
- package/dist/lib/verify/formatVerifyResultsText.js +30 -0
- package/dist/lib/verify/getExpectedPackage.d.ts +3 -0
- package/dist/lib/verify/getExpectedPackage.d.ts.map +1 -0
- package/dist/lib/verify/getExpectedPackage.js +14 -0
- package/dist/lib/verify/index.d.ts +8 -0
- package/dist/lib/verify/index.d.ts.map +1 -0
- package/dist/lib/verify/index.js +23 -0
- package/dist/lib/verify/types.d.ts +23 -0
- package/dist/lib/verify/types.d.ts.map +1 -0
- package/dist/lib/verify/types.js +2 -0
- package/dist/lib/verify/verifyBackup.d.ts +10 -0
- package/dist/lib/verify/verifyBackup.d.ts.map +1 -0
- package/dist/lib/verify/verifyBackup.js +54 -0
- package/dist/lib/verify/verifyObjectInSystem.d.ts +5 -0
- package/dist/lib/verify/verifyObjectInSystem.d.ts.map +1 -0
- package/dist/lib/verify/verifyObjectInSystem.js +136 -0
- package/dist/lib/xml/extractMetadata.d.ts +5 -0
- package/dist/lib/xml/extractMetadata.d.ts.map +1 -0
- package/dist/lib/xml/extractMetadata.js +13 -0
- package/dist/lib/xml/findAttribute.d.ts +3 -0
- package/dist/lib/xml/findAttribute.d.ts.map +1 -0
- package/dist/lib/xml/findAttribute.js +29 -0
- package/dist/lib/xml/findNode.d.ts +3 -0
- package/dist/lib/xml/findNode.d.ts.map +1 -0
- package/dist/lib/xml/findNode.js +30 -0
- package/dist/lib/xml/findNodeValue.d.ts +3 -0
- package/dist/lib/xml/findNodeValue.d.ts.map +1 -0
- package/dist/lib/xml/findNodeValue.js +11 -0
- package/dist/lib/xml/findPackageName.d.ts +3 -0
- package/dist/lib/xml/findPackageName.d.ts.map +1 -0
- package/dist/lib/xml/findPackageName.js +35 -0
- package/dist/lib/xml/flattenXmlAttributes.d.ts +2 -0
- package/dist/lib/xml/flattenXmlAttributes.d.ts.map +1 -0
- package/dist/lib/xml/flattenXmlAttributes.js +82 -0
- package/dist/lib/xml/getAttribute.d.ts +3 -0
- package/dist/lib/xml/getAttribute.d.ts.map +1 -0
- package/dist/lib/xml/getAttribute.js +12 -0
- package/dist/lib/xml/getNodeAttribute.d.ts +3 -0
- package/dist/lib/xml/getNodeAttribute.d.ts.map +1 -0
- package/dist/lib/xml/getNodeAttribute.js +11 -0
- package/dist/lib/xml/getNodeDescription.d.ts +3 -0
- package/dist/lib/xml/getNodeDescription.d.ts.map +1 -0
- package/dist/lib/xml/getNodeDescription.js +12 -0
- package/dist/lib/xml/getNodeName.d.ts +3 -0
- package/dist/lib/xml/getNodeName.d.ts.map +1 -0
- package/dist/lib/xml/getNodeName.js +12 -0
- package/dist/lib/xml/getNodeType.d.ts +3 -0
- package/dist/lib/xml/getNodeType.d.ts.map +1 -0
- package/dist/lib/xml/getNodeType.js +12 -0
- package/dist/lib/xml/index.d.ts +19 -0
- package/dist/lib/xml/index.d.ts.map +1 -0
- package/dist/lib/xml/index.js +34 -0
- package/dist/lib/xml/isNodeObject.d.ts +3 -0
- package/dist/lib/xml/isNodeObject.d.ts.map +1 -0
- package/dist/lib/xml/isNodeObject.js +12 -0
- package/dist/lib/xml/parseBehaviorDefinitionConfig.d.ts +3 -0
- package/dist/lib/xml/parseBehaviorDefinitionConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseBehaviorDefinitionConfig.js +40 -0
- package/dist/lib/xml/parseClassConfig.d.ts +3 -0
- package/dist/lib/xml/parseClassConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseClassConfig.js +59 -0
- package/dist/lib/xml/parseDataElementConfig.d.ts +3 -0
- package/dist/lib/xml/parseDataElementConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseDataElementConfig.js +67 -0
- package/dist/lib/xml/parseDomainConfig.d.ts +3 -0
- package/dist/lib/xml/parseDomainConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseDomainConfig.js +66 -0
- package/dist/lib/xml/parseEnhancementConfig.d.ts +3 -0
- package/dist/lib/xml/parseEnhancementConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseEnhancementConfig.js +73 -0
- package/dist/lib/xml/parsePackageConfig.d.ts +3 -0
- package/dist/lib/xml/parsePackageConfig.d.ts.map +1 -0
- package/dist/lib/xml/parsePackageConfig.js +48 -0
- package/dist/lib/xml/parseTableTypeConfig.d.ts +3 -0
- package/dist/lib/xml/parseTableTypeConfig.d.ts.map +1 -0
- package/dist/lib/xml/parseTableTypeConfig.js +64 -0
- package/dist/lib/xml/readAttr.d.ts +3 -0
- package/dist/lib/xml/readAttr.d.ts.map +1 -0
- package/dist/lib/xml/readAttr.js +16 -0
- package/dist/lib/xml/toBoolean.d.ts +2 -0
- package/dist/lib/xml/toBoolean.d.ts.map +1 -0
- package/dist/lib/xml/toBoolean.js +15 -0
- package/dist/lib/xml/toNumber.d.ts +2 -0
- package/dist/lib/xml/toNumber.d.ts.map +1 -0
- package/dist/lib/xml/toNumber.js +10 -0
- package/package.json +64 -0
package/dist/lib/run.js
ADDED
|
@@ -0,0 +1,748 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.run = run;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const adt_clients_1 = require("@mcp-abap-adt/adt-clients");
|
|
43
|
+
const connection_1 = require("@mcp-abap-adt/connection");
|
|
44
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
45
|
+
const getSapConfigFromBroker_1 = require("./auth/getSapConfigFromBroker");
|
|
46
|
+
const backupObject_1 = require("./backup/backupObject");
|
|
47
|
+
const readMetadataXmlForType_1 = require("./backup/readMetadataXmlForType");
|
|
48
|
+
const readSourceText_1 = require("./backup/readSourceText");
|
|
49
|
+
const applyLogEnv_1 = require("./cli/applyLogEnv");
|
|
50
|
+
const createLogger_1 = require("./cli/createLogger");
|
|
51
|
+
const getVerbosity_1 = require("./cli/getVerbosity");
|
|
52
|
+
const logVerbose_1 = require("./cli/logVerbose");
|
|
53
|
+
const parseArgs_1 = require("./cli/parseArgs");
|
|
54
|
+
const redact_1 = require("./cli/redact");
|
|
55
|
+
const shouldEnableAdtLogger_1 = require("./cli/shouldEnableAdtLogger");
|
|
56
|
+
const shouldEnableConnectionLogger_1 = require("./cli/shouldEnableConnectionLogger");
|
|
57
|
+
const usage_1 = require("./cli/usage");
|
|
58
|
+
const computeBackupChecksum_1 = require("./crypto/computeBackupChecksum");
|
|
59
|
+
const computeCodeChecksum_1 = require("./crypto/computeCodeChecksum");
|
|
60
|
+
const decodeBase64_1 = require("./crypto/decodeBase64");
|
|
61
|
+
const encodeBase64_1 = require("./crypto/encodeBase64");
|
|
62
|
+
const updateTreeChecksums_1 = require("./crypto/updateTreeChecksums");
|
|
63
|
+
const verifyBackupChecksum_1 = require("./crypto/verifyBackupChecksum");
|
|
64
|
+
const verifyTreeChecksums_1 = require("./crypto/verifyTreeChecksums");
|
|
65
|
+
const buildRestorePlan_1 = require("./restore/buildRestorePlan");
|
|
66
|
+
const deleteBackupObjects_1 = require("./restore/deleteBackupObjects");
|
|
67
|
+
const restoreObjects_1 = require("./restore/restoreObjects");
|
|
68
|
+
const restoreTreeBackup_1 = require("./restore/restoreTreeBackup");
|
|
69
|
+
const verbosity_1 = require("./state/verbosity");
|
|
70
|
+
const buildPackageBackupTree_1 = require("./tree/buildPackageBackupTree");
|
|
71
|
+
const buildTreeList_1 = require("./tree/buildTreeList");
|
|
72
|
+
const collectTreeObjects_1 = require("./tree/collectTreeObjects");
|
|
73
|
+
const findNodeInTree_1 = require("./tree/findNodeInTree");
|
|
74
|
+
const formatTreeListText_1 = require("./tree/formatTreeListText");
|
|
75
|
+
const getNodeObjectSpec_1 = require("./tree/getNodeObjectSpec");
|
|
76
|
+
const diffUnified_1 = require("./utils/diffUnified");
|
|
77
|
+
const formatObjectSpec_1 = require("./utils/formatObjectSpec");
|
|
78
|
+
const parseObjectSpec_1 = require("./utils/parseObjectSpec");
|
|
79
|
+
const collectBackupNodes_1 = require("./verify/collectBackupNodes");
|
|
80
|
+
const findOtherType_1 = require("./verify/findOtherType");
|
|
81
|
+
const formatVerifyResultsText_1 = require("./verify/formatVerifyResultsText");
|
|
82
|
+
const verifyBackup_1 = require("./verify/verifyBackup");
|
|
83
|
+
const extractMetadata_1 = require("./xml/extractMetadata");
|
|
84
|
+
async function run() {
|
|
85
|
+
const argv = process.argv.slice(2);
|
|
86
|
+
verbosity_1.verbosityState.level = (0, getVerbosity_1.getVerbosity)(argv);
|
|
87
|
+
const logger = (0, createLogger_1.createLogger)(verbosity_1.verbosityState.level);
|
|
88
|
+
const command = argv[0];
|
|
89
|
+
const args = (0, parseArgs_1.parseArgs)(argv.slice(1));
|
|
90
|
+
const logFile = typeof args['log-file'] === 'string' ? args['log-file'] : '';
|
|
91
|
+
if (logFile) {
|
|
92
|
+
enableLogFile(logFile);
|
|
93
|
+
}
|
|
94
|
+
(0, applyLogEnv_1.applyLogEnv)(verbosity_1.verbosityState.level);
|
|
95
|
+
const debugAdt = Boolean(args['debug-adt']);
|
|
96
|
+
if (debugAdt) {
|
|
97
|
+
process.env.DEBUG_ADT_LIBS = 'true';
|
|
98
|
+
process.env.DEBUG_CONNECTORS = 'true';
|
|
99
|
+
}
|
|
100
|
+
const isHelp = args.help ||
|
|
101
|
+
argv.includes('-h') ||
|
|
102
|
+
argv.includes('--help') ||
|
|
103
|
+
command === 'help';
|
|
104
|
+
if (!command || (isHelp && !argv[1]) || (command === 'help' && !argv[1])) {
|
|
105
|
+
console.log((0, usage_1.usage)());
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
if (isHelp) {
|
|
109
|
+
const helpCommand = command === 'help' ? argv[1] : command;
|
|
110
|
+
console.log((0, usage_1.usage)(helpCommand));
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
if (command === 'extract') {
|
|
114
|
+
const input = args.input;
|
|
115
|
+
const objectSpec = args.object;
|
|
116
|
+
const output = args.out;
|
|
117
|
+
if (typeof input !== 'string') {
|
|
118
|
+
throw new Error('Missing --input');
|
|
119
|
+
}
|
|
120
|
+
if (typeof objectSpec !== 'string') {
|
|
121
|
+
throw new Error('Missing --object');
|
|
122
|
+
}
|
|
123
|
+
if (typeof output !== 'string') {
|
|
124
|
+
throw new Error('Missing --out');
|
|
125
|
+
}
|
|
126
|
+
(0, logVerbose_1.logVerbose)(2, `Extracting ${objectSpec} from ${input}`);
|
|
127
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
128
|
+
const parsed = yaml_1.default.parse(raw);
|
|
129
|
+
if (!parsed || parsed.schemaVersion !== 2) {
|
|
130
|
+
throw new Error('Extract supports only schemaVersion 2 backups');
|
|
131
|
+
}
|
|
132
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(parsed);
|
|
133
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(parsed.root);
|
|
134
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpec);
|
|
135
|
+
(0, logVerbose_1.logVerbose)(3, `Parsed object spec: ${spec.type}:${spec.name}`);
|
|
136
|
+
const node = (0, findNodeInTree_1.findNodeInTree)(parsed.root, spec);
|
|
137
|
+
if (!node || !node.codeBase64) {
|
|
138
|
+
throw new Error('Object not found or no codeBase64 in backup');
|
|
139
|
+
}
|
|
140
|
+
fs.writeFileSync(output, (0, decodeBase64_1.decodeBase64)(node.codeBase64), 'utf8');
|
|
141
|
+
console.log(`Extracted to ${output}`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (command === 'list') {
|
|
145
|
+
const input = args.input;
|
|
146
|
+
if (typeof input !== 'string') {
|
|
147
|
+
throw new Error('Missing --input');
|
|
148
|
+
}
|
|
149
|
+
const format = typeof args.format === 'string' ? args.format : 'text';
|
|
150
|
+
const flat = Boolean(args.flat);
|
|
151
|
+
const showDeps = Boolean(args.deps);
|
|
152
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
153
|
+
const parsed = yaml_1.default.parse(raw);
|
|
154
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
155
|
+
throw new Error('Invalid backup file format');
|
|
156
|
+
}
|
|
157
|
+
if (parsed.schemaVersion === 2) {
|
|
158
|
+
const tree = parsed;
|
|
159
|
+
if (flat) {
|
|
160
|
+
const objects = [];
|
|
161
|
+
(0, collectTreeObjects_1.collectTreeObjects)(tree.root, objects);
|
|
162
|
+
if (format === 'json') {
|
|
163
|
+
console.log(JSON.stringify(objects, null, 2));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
for (const spec of objects) {
|
|
167
|
+
console.log((0, formatObjectSpec_1.formatObjectSpec)(spec));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (format === 'json') {
|
|
173
|
+
console.log(JSON.stringify((0, buildTreeList_1.buildTreeList)(tree.root, { showDeps }), null, 2));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const lines = (0, formatTreeListText_1.formatTreeListText)(tree.root, 0, { showDeps });
|
|
177
|
+
console.log(lines.join('\n'));
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (parsed.schemaVersion === 1) {
|
|
182
|
+
const flat = parsed;
|
|
183
|
+
const objects = flat.objects.map((obj) => ({
|
|
184
|
+
type: obj.type,
|
|
185
|
+
name: obj.name,
|
|
186
|
+
functionGroupName: obj.functionGroupName,
|
|
187
|
+
}));
|
|
188
|
+
if (format === 'json') {
|
|
189
|
+
console.log(JSON.stringify(objects, null, 2));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
for (const spec of objects) {
|
|
193
|
+
console.log((0, formatObjectSpec_1.formatObjectSpec)(spec));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
throw new Error('Invalid backup file format');
|
|
199
|
+
}
|
|
200
|
+
if (command === 'patch') {
|
|
201
|
+
const input = args.input;
|
|
202
|
+
const objectSpec = args.object;
|
|
203
|
+
const filePath = args.file;
|
|
204
|
+
if (typeof input !== 'string') {
|
|
205
|
+
throw new Error('Missing --input');
|
|
206
|
+
}
|
|
207
|
+
if (typeof objectSpec !== 'string') {
|
|
208
|
+
throw new Error('Missing --object');
|
|
209
|
+
}
|
|
210
|
+
if (typeof filePath !== 'string') {
|
|
211
|
+
throw new Error('Missing --file');
|
|
212
|
+
}
|
|
213
|
+
const output = typeof args.output === 'string' ? args.output : input;
|
|
214
|
+
(0, logVerbose_1.logVerbose)(2, `Patching ${objectSpec} in ${input}`);
|
|
215
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
216
|
+
const parsed = yaml_1.default.parse(raw);
|
|
217
|
+
if (!parsed || parsed.schemaVersion !== 2) {
|
|
218
|
+
throw new Error('Patch supports only schemaVersion 2 backups');
|
|
219
|
+
}
|
|
220
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(parsed);
|
|
221
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(parsed.root);
|
|
222
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpec);
|
|
223
|
+
(0, logVerbose_1.logVerbose)(3, `Parsed object spec: ${spec.type}:${spec.name}`);
|
|
224
|
+
const node = (0, findNodeInTree_1.findNodeInTree)(parsed.root, spec);
|
|
225
|
+
if (!node) {
|
|
226
|
+
throw new Error('Object not found in backup');
|
|
227
|
+
}
|
|
228
|
+
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
229
|
+
node.codeBase64 = (0, encodeBase64_1.encodeBase64)(fileContent);
|
|
230
|
+
node.codeChecksum = undefined;
|
|
231
|
+
node.restoreStatus = 'ok';
|
|
232
|
+
if (!node.codeFormat) {
|
|
233
|
+
node.codeFormat = 'source';
|
|
234
|
+
}
|
|
235
|
+
(0, updateTreeChecksums_1.updateTreeChecksums)(parsed.root);
|
|
236
|
+
parsed.checksum = (0, computeBackupChecksum_1.computeBackupChecksum)(parsed);
|
|
237
|
+
const yamlText = yaml_1.default.stringify(parsed, { lineWidth: 0 });
|
|
238
|
+
fs.writeFileSync(output, yamlText, 'utf8');
|
|
239
|
+
console.log(`Backup updated at ${output}`);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (command === 'validate') {
|
|
243
|
+
const input = args.input;
|
|
244
|
+
const objectSpec = args.object;
|
|
245
|
+
if (typeof input !== 'string') {
|
|
246
|
+
throw new Error('Missing --input');
|
|
247
|
+
}
|
|
248
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
249
|
+
const parsed = yaml_1.default.parse(raw);
|
|
250
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
251
|
+
throw new Error('Invalid backup file format');
|
|
252
|
+
}
|
|
253
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(parsed);
|
|
254
|
+
if (parsed.schemaVersion === 2) {
|
|
255
|
+
const tree = parsed;
|
|
256
|
+
if (typeof objectSpec === 'string') {
|
|
257
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpec);
|
|
258
|
+
const node = (0, findNodeInTree_1.findNodeInTree)(tree.root, spec);
|
|
259
|
+
if (!node) {
|
|
260
|
+
throw new Error(`Object not found: ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
261
|
+
}
|
|
262
|
+
if (!node.codeBase64) {
|
|
263
|
+
throw new Error('Object has no codeBase64 to validate');
|
|
264
|
+
}
|
|
265
|
+
if (!node.codeChecksum) {
|
|
266
|
+
throw new Error('Object has no codeChecksum to validate');
|
|
267
|
+
}
|
|
268
|
+
const expected = (0, computeCodeChecksum_1.computeCodeChecksum)(node.codeBase64);
|
|
269
|
+
if (expected !== node.codeChecksum) {
|
|
270
|
+
throw new Error('Object code checksum mismatch');
|
|
271
|
+
}
|
|
272
|
+
console.log(`Validated object ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(tree.root);
|
|
276
|
+
console.log('Backup validated');
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (parsed.schemaVersion === 1) {
|
|
281
|
+
if (typeof objectSpec === 'string') {
|
|
282
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpec);
|
|
283
|
+
const flat = parsed;
|
|
284
|
+
const matches = flat.objects.some((obj) => obj.type === spec.type &&
|
|
285
|
+
obj.name === spec.name &&
|
|
286
|
+
(spec.functionGroupName
|
|
287
|
+
? obj.functionGroupName === spec.functionGroupName
|
|
288
|
+
: true));
|
|
289
|
+
if (!matches) {
|
|
290
|
+
throw new Error(`Object not found: ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
291
|
+
}
|
|
292
|
+
console.log(`Validated object ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.log('Backup validated');
|
|
296
|
+
}
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
throw new Error('Invalid backup file format');
|
|
300
|
+
}
|
|
301
|
+
const envPath = typeof args.env === 'string'
|
|
302
|
+
? args.env
|
|
303
|
+
: typeof args.config === 'string'
|
|
304
|
+
? args.config
|
|
305
|
+
: undefined;
|
|
306
|
+
const destination = typeof args.destination === 'string' ? args.destination : undefined;
|
|
307
|
+
const authRoot = typeof args['auth-root'] === 'string' ? args['auth-root'] : undefined;
|
|
308
|
+
if (!envPath && !destination) {
|
|
309
|
+
throw new Error('Missing --destination (or provide --env)');
|
|
310
|
+
}
|
|
311
|
+
const { config, tokenRefresher } = await (0, getSapConfigFromBroker_1.getSapConfigFromBroker)({
|
|
312
|
+
destination,
|
|
313
|
+
envPath,
|
|
314
|
+
authRoot,
|
|
315
|
+
logger,
|
|
316
|
+
});
|
|
317
|
+
const allowAdtLogs = verbosity_1.verbosityState.level >= 2 || debugAdt;
|
|
318
|
+
const allowConnectionLogs = verbosity_1.verbosityState.level >= 3 || debugAdt;
|
|
319
|
+
const connectionLogger = allowConnectionLogs && (0, shouldEnableConnectionLogger_1.shouldEnableConnectionLogger)() ? logger : undefined;
|
|
320
|
+
const adtLogger = allowAdtLogs && (0, shouldEnableAdtLogger_1.shouldEnableAdtLogger)() ? logger : undefined;
|
|
321
|
+
const connection = (0, connection_1.createAbapConnection)(config, connectionLogger, undefined, tokenRefresher);
|
|
322
|
+
const client = new adt_clients_1.AdtClient(connection, adtLogger);
|
|
323
|
+
if (command === 'backup') {
|
|
324
|
+
const rawObjects = args.objects;
|
|
325
|
+
const packageName = typeof args.package === 'string' ? args.package : undefined;
|
|
326
|
+
if (packageName) {
|
|
327
|
+
(0, logVerbose_1.logVerbose)(2, `Starting package backup for ${packageName}`);
|
|
328
|
+
const output = typeof args.output === 'string' ? args.output : 'backup.yaml';
|
|
329
|
+
const tree = await (0, buildPackageBackupTree_1.buildPackageBackupTree)(client, packageName);
|
|
330
|
+
(0, updateTreeChecksums_1.updateTreeChecksums)(tree.root);
|
|
331
|
+
tree.checksum = (0, computeBackupChecksum_1.computeBackupChecksum)(tree);
|
|
332
|
+
const yamlText = yaml_1.default.stringify(tree, { lineWidth: 0 });
|
|
333
|
+
fs.writeFileSync(output, yamlText, 'utf8');
|
|
334
|
+
console.log(`Backup written to ${output}`);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (typeof rawObjects !== 'string') {
|
|
338
|
+
throw new Error('Missing --objects or --package');
|
|
339
|
+
}
|
|
340
|
+
(0, logVerbose_1.logVerbose)(2, `Starting objects backup (${rawObjects})`);
|
|
341
|
+
const specs = rawObjects
|
|
342
|
+
.split(',')
|
|
343
|
+
.map((spec) => spec.trim())
|
|
344
|
+
.filter(Boolean)
|
|
345
|
+
.map(parseObjectSpec_1.parseObjectSpec);
|
|
346
|
+
const objects = [];
|
|
347
|
+
for (const spec of specs) {
|
|
348
|
+
(0, logVerbose_1.logVerbose)(3, `Backup ${spec.type}:${spec.name}`);
|
|
349
|
+
const backup = await (0, backupObject_1.backupObject)(client, spec);
|
|
350
|
+
objects.push(backup);
|
|
351
|
+
}
|
|
352
|
+
const output = typeof args.output === 'string' ? args.output : 'backup.yaml';
|
|
353
|
+
const payload = {
|
|
354
|
+
schemaVersion: 1,
|
|
355
|
+
generatedAt: new Date().toISOString(),
|
|
356
|
+
objects,
|
|
357
|
+
};
|
|
358
|
+
payload.checksum = (0, computeBackupChecksum_1.computeBackupChecksum)(payload);
|
|
359
|
+
const yamlText = yaml_1.default.stringify(payload, { lineWidth: 0 });
|
|
360
|
+
fs.writeFileSync(output, yamlText, 'utf8');
|
|
361
|
+
console.log(`Backup written to ${output}`);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (command === 'diff') {
|
|
365
|
+
const input = args.input;
|
|
366
|
+
const objectSpec = args.object;
|
|
367
|
+
const diffAll = Boolean(args.all);
|
|
368
|
+
const showOk = Boolean(args['show-ok']);
|
|
369
|
+
const objectSpecValue = typeof objectSpec === 'string' ? objectSpec : '';
|
|
370
|
+
if (typeof input !== 'string') {
|
|
371
|
+
throw new Error('Missing --input');
|
|
372
|
+
}
|
|
373
|
+
if (!diffAll && typeof objectSpec !== 'string') {
|
|
374
|
+
throw new Error('Missing --object (or use --all)');
|
|
375
|
+
}
|
|
376
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
377
|
+
const parsed = yaml_1.default.parse(raw);
|
|
378
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
379
|
+
throw new Error('Invalid backup file format');
|
|
380
|
+
}
|
|
381
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(parsed);
|
|
382
|
+
const diffMetadata = async (label, backupText, metadataXml, showNoDiff) => {
|
|
383
|
+
const beforeMeta = (0, extractMetadata_1.extractMetadata)(backupText);
|
|
384
|
+
const afterMeta = (0, extractMetadata_1.extractMetadata)(metadataXml);
|
|
385
|
+
const changes = [];
|
|
386
|
+
if (beforeMeta.packageName !== afterMeta.packageName) {
|
|
387
|
+
changes.push({
|
|
388
|
+
key: 'packageName',
|
|
389
|
+
before: beforeMeta.packageName,
|
|
390
|
+
after: afterMeta.packageName,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
if (changes.length === 0) {
|
|
394
|
+
if (showNoDiff) {
|
|
395
|
+
console.log(`=== ${label}`);
|
|
396
|
+
console.log('No differences');
|
|
397
|
+
}
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
console.log(`=== ${label}`);
|
|
401
|
+
for (const change of changes) {
|
|
402
|
+
console.log(`changed ${change.key}: "${change.before ?? ''}" -> "${change.after ?? ''}"`);
|
|
403
|
+
}
|
|
404
|
+
return true;
|
|
405
|
+
};
|
|
406
|
+
const diffSource = async (label, backupText, actualSource, showNoDiff) => {
|
|
407
|
+
const unified = (0, diffUnified_1.diffUnified)(backupText, actualSource);
|
|
408
|
+
if (!unified.trim()) {
|
|
409
|
+
if (showNoDiff) {
|
|
410
|
+
console.log(`=== ${label}`);
|
|
411
|
+
console.log('No differences');
|
|
412
|
+
}
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
console.log(`=== ${label}`);
|
|
416
|
+
console.log(unified);
|
|
417
|
+
return true;
|
|
418
|
+
};
|
|
419
|
+
let hasAnyDiff = false;
|
|
420
|
+
if (parsed.schemaVersion === 2) {
|
|
421
|
+
const tree = parsed;
|
|
422
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(tree.root);
|
|
423
|
+
if (!diffAll) {
|
|
424
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpecValue);
|
|
425
|
+
const node = (0, findNodeInTree_1.findNodeInTree)(tree.root, spec);
|
|
426
|
+
if (!node || !node.type) {
|
|
427
|
+
throw new Error(`Object not found: ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
428
|
+
}
|
|
429
|
+
if (!node.codeBase64) {
|
|
430
|
+
throw new Error('Object has no payload to diff');
|
|
431
|
+
}
|
|
432
|
+
const label = (0, formatObjectSpec_1.formatObjectSpec)(spec);
|
|
433
|
+
const backupText = (0, decodeBase64_1.decodeBase64)(node.codeBase64);
|
|
434
|
+
if (node.codeFormat === 'xml') {
|
|
435
|
+
try {
|
|
436
|
+
const metadataXml = await (0, readMetadataXmlForType_1.readMetadataXmlForType)(client, node.type, node.name, node.functionGroupName);
|
|
437
|
+
if (!metadataXml) {
|
|
438
|
+
throw new Error('Metadata not available for diff');
|
|
439
|
+
}
|
|
440
|
+
const hasDiff = await diffMetadata(label, backupText, metadataXml, true);
|
|
441
|
+
if (!hasDiff) {
|
|
442
|
+
console.log('No metadata differences detected');
|
|
443
|
+
}
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
catch (_error) {
|
|
447
|
+
const otherType = await (0, findOtherType_1.findOtherType)(client, node.type, node.name);
|
|
448
|
+
if (otherType && otherType !== node.type) {
|
|
449
|
+
console.log(`=== ${label}`);
|
|
450
|
+
console.log(`changed type: "${node.type}" -> "${otherType}"`);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
throw _error;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
const actualSource = await (0, readSourceText_1.readSourceText)(client, {
|
|
457
|
+
type: node.type,
|
|
458
|
+
name: node.name,
|
|
459
|
+
functionGroupName: node.functionGroupName,
|
|
460
|
+
});
|
|
461
|
+
if (actualSource === undefined) {
|
|
462
|
+
throw new Error('Source not available for diff');
|
|
463
|
+
}
|
|
464
|
+
const hasDiff = await diffSource(label, backupText, actualSource, true);
|
|
465
|
+
if (!hasDiff) {
|
|
466
|
+
console.log('No source differences detected');
|
|
467
|
+
}
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const nodes = [];
|
|
471
|
+
(0, collectBackupNodes_1.collectBackupNodes)(tree.root, nodes);
|
|
472
|
+
for (const node of nodes) {
|
|
473
|
+
if (!node.type || !node.codeBase64) {
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
const spec = {
|
|
477
|
+
type: node.type,
|
|
478
|
+
name: node.name,
|
|
479
|
+
functionGroupName: node.functionGroupName,
|
|
480
|
+
};
|
|
481
|
+
const label = (0, formatObjectSpec_1.formatObjectSpec)(spec);
|
|
482
|
+
const backupText = (0, decodeBase64_1.decodeBase64)(node.codeBase64);
|
|
483
|
+
if (node.codeFormat === 'xml') {
|
|
484
|
+
try {
|
|
485
|
+
const metadataXml = await (0, readMetadataXmlForType_1.readMetadataXmlForType)(client, node.type, node.name, node.functionGroupName);
|
|
486
|
+
if (!metadataXml) {
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
const hasDiff = await diffMetadata(label, backupText, metadataXml, showOk);
|
|
490
|
+
if (hasDiff) {
|
|
491
|
+
hasAnyDiff = true;
|
|
492
|
+
}
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
catch (_error) {
|
|
496
|
+
const otherType = await (0, findOtherType_1.findOtherType)(client, node.type, node.name);
|
|
497
|
+
if (otherType && otherType !== node.type) {
|
|
498
|
+
console.log(`=== ${label}`);
|
|
499
|
+
console.log(`changed type: "${node.type}" -> "${otherType}"`);
|
|
500
|
+
hasAnyDiff = true;
|
|
501
|
+
}
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
const actualSource = await (0, readSourceText_1.readSourceText)(client, spec);
|
|
506
|
+
if (actualSource === undefined) {
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
const hasDiff = await diffSource(label, backupText, actualSource, showOk);
|
|
510
|
+
if (hasDiff) {
|
|
511
|
+
hasAnyDiff = true;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
if (!hasAnyDiff) {
|
|
515
|
+
console.log('No differences detected');
|
|
516
|
+
}
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
const flat = parsed;
|
|
520
|
+
if (!Array.isArray(flat.objects)) {
|
|
521
|
+
throw new Error('Invalid backup file format');
|
|
522
|
+
}
|
|
523
|
+
if (!diffAll) {
|
|
524
|
+
const spec = (0, parseObjectSpec_1.parseObjectSpec)(objectSpecValue);
|
|
525
|
+
const obj = flat.objects.find((item) => item.type === spec.type &&
|
|
526
|
+
item.name === spec.name &&
|
|
527
|
+
(spec.functionGroupName
|
|
528
|
+
? item.functionGroupName === spec.functionGroupName
|
|
529
|
+
: true));
|
|
530
|
+
if (!obj) {
|
|
531
|
+
throw new Error(`Object not found: ${(0, formatObjectSpec_1.formatObjectSpec)(spec)}`);
|
|
532
|
+
}
|
|
533
|
+
if (!obj.source) {
|
|
534
|
+
throw new Error('Object has no payload to diff');
|
|
535
|
+
}
|
|
536
|
+
const actualSource = await (0, readSourceText_1.readSourceText)(client, spec);
|
|
537
|
+
if (actualSource === undefined) {
|
|
538
|
+
throw new Error('Source not available for diff');
|
|
539
|
+
}
|
|
540
|
+
const hasDiff = await diffSource((0, formatObjectSpec_1.formatObjectSpec)(spec), obj.source, actualSource, true);
|
|
541
|
+
if (!hasDiff) {
|
|
542
|
+
console.log('No source differences detected');
|
|
543
|
+
}
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
for (const obj of flat.objects) {
|
|
547
|
+
if (!obj.source) {
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
const spec = {
|
|
551
|
+
type: obj.type,
|
|
552
|
+
name: obj.name,
|
|
553
|
+
functionGroupName: obj.functionGroupName,
|
|
554
|
+
};
|
|
555
|
+
const actualSource = await (0, readSourceText_1.readSourceText)(client, spec);
|
|
556
|
+
if (actualSource === undefined) {
|
|
557
|
+
continue;
|
|
558
|
+
}
|
|
559
|
+
const hasDiff = await diffSource((0, formatObjectSpec_1.formatObjectSpec)(spec), obj.source, actualSource, showOk);
|
|
560
|
+
if (hasDiff) {
|
|
561
|
+
hasAnyDiff = true;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
if (!hasAnyDiff) {
|
|
565
|
+
console.log('No differences detected');
|
|
566
|
+
}
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
if (command === 'verify') {
|
|
570
|
+
const input = args.input;
|
|
571
|
+
if (typeof input !== 'string') {
|
|
572
|
+
throw new Error('Missing --input');
|
|
573
|
+
}
|
|
574
|
+
const format = typeof args.format === 'string' ? args.format : 'text';
|
|
575
|
+
const strict = Boolean(args.strict);
|
|
576
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
577
|
+
const parsed = yaml_1.default.parse(raw);
|
|
578
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
579
|
+
throw new Error('Invalid backup file format');
|
|
580
|
+
}
|
|
581
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(parsed);
|
|
582
|
+
if (parsed.schemaVersion === 2) {
|
|
583
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(parsed.root);
|
|
584
|
+
}
|
|
585
|
+
const result = await (0, verifyBackup_1.verifyBackup)(client, parsed, { strict });
|
|
586
|
+
if (format === 'json') {
|
|
587
|
+
console.log(JSON.stringify(result, null, 2));
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
console.log((0, formatVerifyResultsText_1.formatVerifyResultsText)(result.entries, result.summary));
|
|
591
|
+
}
|
|
592
|
+
if (result.summary.conflicts > 0) {
|
|
593
|
+
throw new Error(`Conflicts found: ${result.summary.conflicts}`);
|
|
594
|
+
}
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
if (command === 'restore') {
|
|
598
|
+
const input = args.input;
|
|
599
|
+
if (typeof input !== 'string') {
|
|
600
|
+
throw new Error('Missing --input');
|
|
601
|
+
}
|
|
602
|
+
(0, logVerbose_1.logVerbose)(2, `Starting restore from ${input}`);
|
|
603
|
+
const raw = fs.readFileSync(input, 'utf8');
|
|
604
|
+
const mode = args.mode || 'upsert';
|
|
605
|
+
const activateOnUpdate = Boolean(args.activate) || !args['no-activate-on-update'];
|
|
606
|
+
const parsed = yaml_1.default.parse(raw);
|
|
607
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
608
|
+
throw new Error('Invalid backup file format');
|
|
609
|
+
}
|
|
610
|
+
const force = Boolean(args.force);
|
|
611
|
+
const strict = Boolean(args.strict);
|
|
612
|
+
const dangerous = Boolean(args.dangerous);
|
|
613
|
+
const activateOnCreate = !args['no-activate-on-create'];
|
|
614
|
+
const transportRequest = typeof args.transport === 'string' ? args.transport : undefined;
|
|
615
|
+
const softwareComponent = typeof args['software-component'] === 'string'
|
|
616
|
+
? args['software-component']
|
|
617
|
+
: undefined;
|
|
618
|
+
if (transportRequest) {
|
|
619
|
+
(0, logVerbose_1.logVerbose)(1, `Using transport request for restore: ${transportRequest}`);
|
|
620
|
+
}
|
|
621
|
+
if (softwareComponent) {
|
|
622
|
+
(0, logVerbose_1.logVerbose)(1, `Using software component override for packages: ${softwareComponent}`);
|
|
623
|
+
}
|
|
624
|
+
if (parsed.schemaVersion === 2) {
|
|
625
|
+
const tree = parsed;
|
|
626
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(tree);
|
|
627
|
+
(0, verifyTreeChecksums_1.verifyTreeChecksums)(tree.root);
|
|
628
|
+
if (dangerous) {
|
|
629
|
+
(0, logVerbose_1.logVerbose)(1, `Dangerous mode: deleting ${tree.package} objects from backup before restore`);
|
|
630
|
+
await (0, deleteBackupObjects_1.deleteBackupObjects)(client, tree, transportRequest);
|
|
631
|
+
}
|
|
632
|
+
if (!force) {
|
|
633
|
+
const result = await (0, verifyBackup_1.verifyBackup)(client, tree, { strict });
|
|
634
|
+
if (result.summary.conflicts > 0) {
|
|
635
|
+
throw new Error(`Conflicts found: ${result.summary.conflicts}. Use --force to restore anyway.`);
|
|
636
|
+
}
|
|
637
|
+
const plan = (0, buildRestorePlan_1.buildRestorePlan)(tree.root, result.entries);
|
|
638
|
+
const summary = plan.reduce((acc, item) => {
|
|
639
|
+
acc[item.action] = (acc[item.action] || 0) + 1;
|
|
640
|
+
return acc;
|
|
641
|
+
}, {});
|
|
642
|
+
(0, logVerbose_1.logVerbose)(1, `Restore plan: create ${summary.create || 0}, update ${summary.update || 0}, skip ${summary.skip || 0}, error ${summary.error || 0}`);
|
|
643
|
+
for (const item of plan) {
|
|
644
|
+
if (item.action === 'skip') {
|
|
645
|
+
continue;
|
|
646
|
+
}
|
|
647
|
+
const spec = (0, getNodeObjectSpec_1.getNodeObjectSpec)(item.node);
|
|
648
|
+
const label = spec ? (0, formatObjectSpec_1.formatObjectSpec)(spec) : item.node.name;
|
|
649
|
+
(0, logVerbose_1.logVerbose)(2, `Plan ${item.action}: ${label} (${item.status})`);
|
|
650
|
+
}
|
|
651
|
+
const restoreIds = new Set(plan
|
|
652
|
+
.filter((item) => item.action === 'create' || item.action === 'update')
|
|
653
|
+
.map((item) => item.id));
|
|
654
|
+
const restoreActions = new Map();
|
|
655
|
+
for (const item of plan) {
|
|
656
|
+
if (item.action === 'create') {
|
|
657
|
+
restoreActions.set(item.id, 'create');
|
|
658
|
+
}
|
|
659
|
+
else if (item.action === 'update') {
|
|
660
|
+
restoreActions.set(item.id, 'update');
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
if (restoreIds.size === 0) {
|
|
664
|
+
console.log('Restore skipped: no changes detected');
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
(0, logVerbose_1.logVerbose)(2, `Restoring tree backup for package ${tree.package}`);
|
|
668
|
+
await (0, restoreTreeBackup_1.restoreTreeBackup)(client, tree.root, mode, activateOnUpdate, transportRequest, restoreIds, restoreActions, activateOnCreate, softwareComponent);
|
|
669
|
+
console.log('Restore completed');
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
(0, logVerbose_1.logVerbose)(2, `Restoring tree backup for package ${tree.package}`);
|
|
673
|
+
await (0, restoreTreeBackup_1.restoreTreeBackup)(client, tree.root, mode, activateOnUpdate, transportRequest, undefined, undefined, activateOnCreate, softwareComponent);
|
|
674
|
+
console.log('Restore completed');
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
677
|
+
if (!Array.isArray(parsed.objects)) {
|
|
678
|
+
throw new Error('Invalid backup file format');
|
|
679
|
+
}
|
|
680
|
+
const flat = parsed;
|
|
681
|
+
(0, verifyBackupChecksum_1.verifyBackupChecksum)(flat);
|
|
682
|
+
if (dangerous) {
|
|
683
|
+
throw new Error('Dangerous mode is supported only for package backups');
|
|
684
|
+
}
|
|
685
|
+
if (!force) {
|
|
686
|
+
const result = await (0, verifyBackup_1.verifyBackup)(client, flat, { strict });
|
|
687
|
+
if (result.summary.conflicts > 0) {
|
|
688
|
+
throw new Error(`Conflicts found: ${result.summary.conflicts}. Use --force to restore anyway.`);
|
|
689
|
+
}
|
|
690
|
+
const restoreActions = new Map();
|
|
691
|
+
for (const entry of result.entries) {
|
|
692
|
+
if (entry.status === 'missing') {
|
|
693
|
+
restoreActions.set(`${entry.type}:${entry.name}`, 'create');
|
|
694
|
+
}
|
|
695
|
+
else if (entry.status === 'package-mismatch' ||
|
|
696
|
+
entry.status === 'source-mismatch') {
|
|
697
|
+
restoreActions.set(`${entry.type}:${entry.name}`, 'update');
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
if (restoreActions.size === 0) {
|
|
701
|
+
console.log('Restore skipped: no changes detected');
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
(0, logVerbose_1.logVerbose)(2, `Restoring flat backup (${flat.objects.length} objects)`);
|
|
705
|
+
await (0, restoreObjects_1.restoreObjects)(client, flat.objects, mode, activateOnUpdate, transportRequest, restoreActions, activateOnCreate);
|
|
706
|
+
console.log(`Restore completed for ${flat.objects.length} object(s)`);
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
(0, logVerbose_1.logVerbose)(2, `Restoring flat backup (${flat.objects.length} objects)`);
|
|
710
|
+
await (0, restoreObjects_1.restoreObjects)(client, flat.objects, mode, activateOnUpdate, transportRequest, undefined, activateOnCreate);
|
|
711
|
+
console.log(`Restore completed for ${flat.objects.length} object(s)`);
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
throw new Error(`Unknown command: ${command}`);
|
|
715
|
+
}
|
|
716
|
+
function enableLogFile(logFile) {
|
|
717
|
+
const dir = path.dirname(logFile);
|
|
718
|
+
if (dir && dir !== '.') {
|
|
719
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
720
|
+
}
|
|
721
|
+
const stream = fs.createWriteStream(logFile, { flags: 'a' });
|
|
722
|
+
const writeLine = (args) => {
|
|
723
|
+
const line = args.map(formatLogArg).join(' ');
|
|
724
|
+
stream.write(`${line}\n`);
|
|
725
|
+
};
|
|
726
|
+
const wrap = (fn) => (...args) => {
|
|
727
|
+
fn(...args);
|
|
728
|
+
writeLine(args);
|
|
729
|
+
};
|
|
730
|
+
console.log = wrap(console.log.bind(console));
|
|
731
|
+
console.info = wrap(console.info.bind(console));
|
|
732
|
+
console.warn = wrap(console.warn.bind(console));
|
|
733
|
+
console.error = wrap(console.error.bind(console));
|
|
734
|
+
}
|
|
735
|
+
function formatLogArg(arg) {
|
|
736
|
+
if (arg instanceof Error) {
|
|
737
|
+
return (0, redact_1.redactText)(arg.stack ?? arg.message);
|
|
738
|
+
}
|
|
739
|
+
if (typeof arg === 'string') {
|
|
740
|
+
return (0, redact_1.redactText)(arg);
|
|
741
|
+
}
|
|
742
|
+
try {
|
|
743
|
+
return (0, redact_1.safeStringify)(arg);
|
|
744
|
+
}
|
|
745
|
+
catch {
|
|
746
|
+
return String(arg);
|
|
747
|
+
}
|
|
748
|
+
}
|