trm-core 9.10.5 → 10.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 (384) hide show
  1. package/README.md +20 -0
  2. package/changelog.txt +3 -2
  3. package/dist/actions/cg3y/download.js +34 -4
  4. package/dist/actions/cg3y/index.d.ts +23 -0
  5. package/dist/actions/cg3y/index.js +13 -10
  6. package/dist/actions/cg3z/index.d.ts +67 -3
  7. package/dist/actions/cg3z/index.js +25 -14
  8. package/dist/actions/cg3z/upload.d.ts +20 -0
  9. package/dist/actions/cg3z/upload.js +165 -36
  10. package/dist/actions/checkEngines/analyze.d.ts +11 -0
  11. package/dist/actions/checkEngines/analyze.js +294 -0
  12. package/dist/actions/checkEngines/index.d.ts +87 -0
  13. package/dist/actions/checkEngines/index.js +38 -0
  14. package/dist/actions/checkEngines/init.d.ts +11 -0
  15. package/dist/actions/checkEngines/init.js +45 -0
  16. package/dist/actions/checkPackageDependencies/analyze.d.ts +10 -0
  17. package/dist/actions/checkPackageDependencies/analyze.js +37 -39
  18. package/dist/actions/checkPackageDependencies/index.d.ts +56 -0
  19. package/dist/actions/checkPackageDependencies/index.js +13 -10
  20. package/dist/actions/checkPackageDependencies/init.d.ts +8 -0
  21. package/dist/actions/checkPackageDependencies/init.js +24 -2
  22. package/dist/actions/checkSapEntries/analyze.d.ts +12 -0
  23. package/dist/actions/checkSapEntries/analyze.js +63 -47
  24. package/dist/actions/checkSapEntries/index.d.ts +35 -0
  25. package/dist/actions/checkSapEntries/index.js +12 -10
  26. package/dist/actions/checkSapEntries/init.d.ts +8 -0
  27. package/dist/actions/checkSapEntries/init.js +10 -2
  28. package/dist/actions/commons/IActionContext.d.ts +10 -0
  29. package/dist/actions/commons/checkServerAuth.d.ts +7 -0
  30. package/dist/actions/commons/checkServerAuth.js +10 -5
  31. package/dist/actions/commons/index.d.ts +1 -1
  32. package/dist/actions/commons/index.js +1 -1
  33. package/dist/actions/commons/prompts/index.d.ts +1 -0
  34. package/dist/actions/commons/prompts/index.js +1 -0
  35. package/dist/actions/commons/prompts/setLandscapeTarget.d.ts +14 -0
  36. package/dist/actions/commons/prompts/setLandscapeTarget.js +40 -0
  37. package/dist/actions/commons/prompts/setTransportTarget.d.ts +15 -0
  38. package/dist/actions/commons/prompts/setTransportTarget.js +20 -2
  39. package/dist/actions/commons/setSystemPackages.d.ts +7 -0
  40. package/dist/actions/commons/setSystemPackages.js +12 -2
  41. package/dist/actions/commons/utils/actionLocks.d.ts +32 -0
  42. package/dist/actions/commons/utils/actionLocks.js +135 -0
  43. package/dist/actions/commons/utils/dirtyEntries.d.ts +12 -0
  44. package/dist/actions/commons/utils/dirtyEntries.js +54 -0
  45. package/dist/actions/commons/utils/index.d.ts +10 -0
  46. package/dist/actions/commons/utils/index.js +26 -0
  47. package/dist/actions/commons/utils/installRegistry.d.ts +18 -0
  48. package/dist/actions/commons/utils/installRegistry.js +46 -0
  49. package/dist/actions/commons/utils/installedDependency.d.ts +15 -0
  50. package/dist/actions/commons/utils/installedDependency.js +30 -0
  51. package/dist/actions/commons/utils/owningInstallation.d.ts +6 -0
  52. package/dist/actions/commons/utils/owningInstallation.js +47 -0
  53. package/dist/actions/commons/utils/packageCleanup.d.ts +168 -0
  54. package/dist/actions/commons/utils/packageCleanup.js +1017 -0
  55. package/dist/actions/commons/utils/releaseDeletionTransport.d.ts +5 -0
  56. package/dist/actions/commons/utils/releaseDeletionTransport.js +67 -0
  57. package/dist/actions/commons/utils/restoreTransport.d.ts +6 -0
  58. package/dist/actions/commons/utils/restoreTransport.js +50 -0
  59. package/dist/actions/commons/utils/retainedWorkflow.d.ts +6 -0
  60. package/dist/actions/commons/utils/retainedWorkflow.js +49 -0
  61. package/dist/actions/commons/utils/withScopedPrefix.d.ts +5 -0
  62. package/dist/actions/commons/utils/withScopedPrefix.js +32 -0
  63. package/dist/actions/commons/workflowCallbacks.d.ts +21 -0
  64. package/dist/actions/commons/workflowCallbacks.js +157 -0
  65. package/dist/actions/index.d.ts +3 -0
  66. package/dist/actions/index.js +5 -0
  67. package/dist/actions/install/addNamespace.d.ts +18 -0
  68. package/dist/actions/install/addNamespace.js +121 -51
  69. package/dist/actions/install/checkDependants.d.ts +15 -0
  70. package/dist/actions/install/checkDependants.js +74 -0
  71. package/dist/actions/install/checkDependencies.d.ts +11 -0
  72. package/dist/actions/install/checkDependencies.js +32 -13
  73. package/dist/actions/install/checkDependencyCycles.d.ts +17 -0
  74. package/dist/actions/install/checkDependencyCycles.js +105 -0
  75. package/dist/actions/install/checkEngines.d.ts +11 -0
  76. package/dist/actions/install/checkEngines.js +100 -0
  77. package/dist/actions/install/checkInstallDevclass.d.ts +24 -0
  78. package/dist/actions/install/checkInstallDevclass.js +110 -0
  79. package/dist/actions/install/checkSapEntries.d.ts +9 -0
  80. package/dist/actions/install/checkSapEntries.js +20 -12
  81. package/dist/actions/install/checkTransports.d.ts +34 -0
  82. package/dist/actions/install/checkTransports.js +329 -170
  83. package/dist/actions/install/cleanupCheckpoint.d.ts +11 -0
  84. package/dist/actions/install/cleanupCheckpoint.js +62 -0
  85. package/dist/actions/install/defaultTransportLayer.d.ts +5 -0
  86. package/dist/actions/install/defaultTransportLayer.js +36 -0
  87. package/dist/actions/install/executePostActivities.d.ts +6 -0
  88. package/dist/actions/install/executePostActivities.js +28 -38
  89. package/dist/actions/install/generateDevclass.d.ts +10 -0
  90. package/dist/actions/install/generateDevclass.js +66 -20
  91. package/dist/actions/install/generateLandscapeTransport.d.ts +23 -0
  92. package/dist/actions/install/generateLandscapeTransport.js +136 -0
  93. package/dist/actions/install/generateUpdateTransport.d.ts +20 -0
  94. package/dist/actions/install/generateUpdateTransport.js +122 -0
  95. package/dist/actions/install/importBatch.d.ts +22 -0
  96. package/dist/actions/install/importBatch.js +0 -0
  97. package/dist/actions/install/index.d.ts +273 -44
  98. package/dist/actions/install/index.js +139 -59
  99. package/dist/actions/install/init.d.ts +14 -0
  100. package/dist/actions/install/init.js +215 -108
  101. package/dist/actions/install/installDependencies.d.ts +14 -0
  102. package/dist/actions/install/installDependencies.js +122 -45
  103. package/dist/actions/install/lockResources.d.ts +8 -0
  104. package/dist/actions/install/lockResources.js +100 -0
  105. package/dist/actions/install/prepareCust.d.ts +13 -0
  106. package/dist/actions/install/prepareCust.js +138 -0
  107. package/dist/actions/install/prepareDevc.d.ts +15 -0
  108. package/dist/actions/install/prepareDevc.js +113 -0
  109. package/dist/actions/install/prepareLang.d.ts +13 -0
  110. package/dist/actions/install/prepareLang.js +110 -0
  111. package/dist/actions/install/prepareTadir.d.ts +13 -0
  112. package/dist/actions/install/prepareTadir.js +95 -0
  113. package/dist/actions/install/releaseLandscapeTransport.d.ts +11 -0
  114. package/dist/actions/install/releaseLandscapeTransport.js +79 -0
  115. package/dist/actions/install/setInstallDevclass.d.ts +10 -0
  116. package/dist/actions/install/setInstallDevclass.js +140 -54
  117. package/dist/actions/install/updatePackageData.d.ts +9 -0
  118. package/dist/actions/install/updatePackageData.js +117 -13
  119. package/dist/actions/installDependency/checkInstalledRelease.d.ts +13 -0
  120. package/dist/actions/installDependency/checkInstalledRelease.js +50 -0
  121. package/dist/actions/installDependency/confirmDowngrade.d.ts +11 -0
  122. package/dist/actions/installDependency/confirmDowngrade.js +53 -0
  123. package/dist/actions/installDependency/findInstallRelease.d.ts +24 -0
  124. package/dist/actions/installDependency/findInstallRelease.js +42 -19
  125. package/dist/actions/installDependency/index.d.ts +64 -3
  126. package/dist/actions/installDependency/index.js +30 -13
  127. package/dist/actions/installDependency/init.d.ts +14 -0
  128. package/dist/actions/installDependency/init.js +24 -3
  129. package/dist/actions/installDependency/installRelease.d.ts +6 -0
  130. package/dist/actions/installDependency/installRelease.js +22 -12
  131. package/dist/actions/publish/enginesUi.d.ts +53 -0
  132. package/dist/actions/publish/enginesUi.js +289 -0
  133. package/dist/actions/publish/findDependencies.d.ts +19 -0
  134. package/dist/actions/publish/findDependencies.js +72 -37
  135. package/dist/actions/publish/generateCustTransport.d.ts +6 -0
  136. package/dist/actions/publish/generateCustTransport.js +42 -19
  137. package/dist/actions/publish/generateDevcTransport.d.ts +6 -0
  138. package/dist/actions/publish/generateDevcTransport.js +16 -18
  139. package/dist/actions/publish/generateLangTransport.d.ts +6 -0
  140. package/dist/actions/publish/generateLangTransport.js +20 -23
  141. package/dist/actions/publish/generateTadirTransport.d.ts +6 -0
  142. package/dist/actions/publish/generateTadirTransport.js +18 -17
  143. package/dist/actions/publish/getSystemEngines.d.ts +27 -0
  144. package/dist/actions/publish/getSystemEngines.js +112 -0
  145. package/dist/actions/publish/index.d.ts +162 -37
  146. package/dist/actions/publish/index.js +51 -34
  147. package/dist/actions/publish/init.d.ts +28 -0
  148. package/dist/actions/publish/init.js +304 -120
  149. package/dist/actions/publish/lockResources.d.ts +4 -0
  150. package/dist/actions/{install/refreshTmsTxt.js → publish/lockResources.js} +14 -17
  151. package/dist/actions/publish/publishToRegistry.d.ts +8 -0
  152. package/dist/actions/publish/publishToRegistry.js +18 -8
  153. package/dist/actions/publish/releaseTransports.d.ts +6 -0
  154. package/dist/actions/publish/releaseTransports.js +48 -20
  155. package/dist/actions/publish/setCustomizingTransports.d.ts +6 -0
  156. package/dist/actions/publish/setCustomizingTransports.js +227 -101
  157. package/dist/actions/publish/setManifestValues.d.ts +22 -0
  158. package/dist/actions/publish/setManifestValues.js +455 -119
  159. package/dist/actions/publish/setOptionalPublishData.d.ts +11 -0
  160. package/dist/actions/publish/setOptionalPublishData.js +133 -0
  161. package/dist/actions/publish/updatePackageData.d.ts +8 -0
  162. package/dist/actions/publish/updatePackageData.js +20 -7
  163. package/dist/actions/stopWarning.d.ts +5 -0
  164. package/dist/actions/stopWarning.js +5 -0
  165. package/dist/actions/uninstall/checkDependants.d.ts +7 -0
  166. package/dist/actions/uninstall/checkDependants.js +55 -0
  167. package/dist/actions/uninstall/forwardDeletionTransport.d.ts +10 -0
  168. package/dist/actions/uninstall/forwardDeletionTransport.js +51 -0
  169. package/dist/actions/uninstall/generateDeletionTransport.d.ts +10 -0
  170. package/dist/actions/uninstall/generateDeletionTransport.js +45 -0
  171. package/dist/actions/uninstall/index.d.ts +153 -0
  172. package/dist/actions/uninstall/index.js +141 -0
  173. package/dist/actions/uninstall/init.d.ts +17 -0
  174. package/dist/actions/uninstall/init.js +146 -0
  175. package/dist/actions/uninstall/lockResources.d.ts +4 -0
  176. package/dist/actions/{publish/setTransportTarget.js → uninstall/lockResources.js} +16 -7
  177. package/dist/actions/uninstall/removePackageData.d.ts +9 -0
  178. package/dist/actions/uninstall/removePackageData.js +64 -0
  179. package/dist/actions/uninstall/uninstallNestedPackages.d.ts +26 -0
  180. package/dist/actions/uninstall/uninstallNestedPackages.js +174 -0
  181. package/dist/client/ClientError.d.ts +3 -1
  182. package/dist/client/ClientError.js +2 -1
  183. package/dist/client/RESTClient.d.ts +18 -5
  184. package/dist/client/RESTClient.js +194 -56
  185. package/dist/client/RESTClientError.d.ts +1 -2
  186. package/dist/client/RESTClientError.js +3 -2
  187. package/dist/client/RFCClient.d.ts +28 -7
  188. package/dist/client/RFCClient.js +325 -77
  189. package/dist/client/RFCClientError.d.ts +1 -1
  190. package/dist/client/RFCClientError.js +2 -2
  191. package/dist/client/TransportEntries.d.ts +8 -0
  192. package/dist/client/TransportEntries.js +2 -0
  193. package/dist/client/components/BORM_ID.d.ts +1 -0
  194. package/dist/client/components/BORM_ID.js +2 -0
  195. package/dist/client/components/BORM_NAME.d.ts +1 -0
  196. package/dist/client/components/BORM_NAME.js +2 -0
  197. package/dist/client/components/BORM_NAMEL.d.ts +1 -0
  198. package/dist/client/components/BORM_NAMEL.js +2 -0
  199. package/dist/client/components/BORM_VEND.d.ts +1 -0
  200. package/dist/client/components/BORM_VEND.js +2 -0
  201. package/dist/client/components/BORM_VERS.d.ts +1 -0
  202. package/dist/client/components/BORM_VERS.js +2 -0
  203. package/dist/client/components/CWBNTNUMM.d.ts +1 -0
  204. package/dist/client/components/CWBNTNUMM.js +2 -0
  205. package/dist/client/components/CWBNTSTAT.d.ts +1 -0
  206. package/dist/client/components/CWBNTSTAT.js +2 -0
  207. package/dist/client/components/CWBNTVERS.d.ts +1 -0
  208. package/dist/client/components/CWBNTVERS.js +2 -0
  209. package/dist/client/components/CWBPRSTAT.d.ts +1 -0
  210. package/dist/client/components/CWBPRSTAT.js +2 -0
  211. package/dist/client/components/INSTSTATE.d.ts +1 -0
  212. package/dist/client/components/INSTSTATE.js +2 -0
  213. package/dist/client/components/RELC_TYPE.d.ts +1 -0
  214. package/dist/client/components/RELC_TYPE.js +2 -0
  215. package/dist/client/components/SAPPATCHLV.d.ts +1 -0
  216. package/dist/client/components/SAPPATCHLV.js +2 -0
  217. package/dist/client/components/SAPRELEASE.d.ts +1 -0
  218. package/dist/client/components/SAPRELEASE.js +2 -0
  219. package/dist/client/components/SYSYSID.d.ts +1 -0
  220. package/dist/client/components/SYSYSID.js +2 -0
  221. package/dist/client/components/ZTRM_INSTALLTR_TYPE.d.ts +1 -0
  222. package/dist/client/components/ZTRM_INSTALLTR_TYPE.js +2 -0
  223. package/dist/client/components/index.d.ts +15 -0
  224. package/dist/client/components/index.js +15 -0
  225. package/dist/client/index.d.ts +1 -0
  226. package/dist/client/index.js +1 -0
  227. package/dist/client/messageLog.d.ts +7 -0
  228. package/dist/client/messageLog.js +21 -0
  229. package/dist/client/struct/ActionLockKey.d.ts +6 -0
  230. package/dist/client/struct/ActionLockKey.js +2 -0
  231. package/dist/client/struct/CVERS.d.ts +7 -0
  232. package/dist/client/struct/CVERS.js +2 -0
  233. package/dist/client/struct/CWBNTCUST.d.ts +6 -0
  234. package/dist/client/struct/CWBNTCUST.js +2 -0
  235. package/dist/client/struct/CWBNTHEAD.d.ts +5 -0
  236. package/dist/client/struct/CWBNTHEAD.js +2 -0
  237. package/dist/client/struct/E070.d.ts +2 -1
  238. package/dist/client/struct/E071K.d.ts +9 -0
  239. package/dist/client/struct/E071K.js +2 -0
  240. package/dist/client/struct/PRDVERS.d.ts +9 -0
  241. package/dist/client/struct/PRDVERS.js +2 -0
  242. package/dist/client/struct/SCOMPKDTLN.d.ts +21 -0
  243. package/dist/client/struct/STMSCALERT.d.ts +21 -0
  244. package/dist/client/struct/STMSCALERT.js +2 -0
  245. package/dist/client/struct/STMS_TP_IMPORT.d.ts +14 -0
  246. package/dist/client/struct/STMS_TP_IMPORT.js +2 -0
  247. package/dist/client/struct/STMS_TR_REQUEST.d.ts +8 -0
  248. package/dist/client/struct/STMS_TR_REQUEST.js +2 -0
  249. package/dist/client/struct/TDEVC.d.ts +38 -0
  250. package/dist/client/struct/TPLOGPTR.d.ts +13 -0
  251. package/dist/client/struct/TPLOGPTR.js +2 -0
  252. package/dist/client/struct/TPSTDOUT.d.ts +3 -0
  253. package/dist/client/struct/TPSTDOUT.js +2 -0
  254. package/dist/client/struct/ZTRM_INSTALLTR.d.ts +8 -0
  255. package/dist/client/struct/ZTRM_INSTALLTR.js +2 -0
  256. package/dist/client/struct/index.d.ts +12 -0
  257. package/dist/client/struct/index.js +12 -0
  258. package/dist/commons/checkCoreTrmDependencies.js +1 -1
  259. package/dist/commons/getAxiosInstance.js +8 -17
  260. package/dist/commons/getNodePackage.js +7 -0
  261. package/dist/commons/getPackageHierarchy.js +2 -0
  262. package/dist/commons/getPackagesNamespace.d.ts +9 -0
  263. package/dist/commons/getPackagesNamespace.js +19 -0
  264. package/dist/commons/index.d.ts +4 -0
  265. package/dist/commons/index.js +4 -0
  266. package/dist/commons/packageDataFromTdevc.d.ts +12 -0
  267. package/dist/commons/packageDataFromTdevc.js +25 -0
  268. package/dist/commons/resolveCoreVersion.d.ts +10 -0
  269. package/dist/commons/resolveCoreVersion.js +24 -0
  270. package/dist/commons/summarizeForLog.d.ts +22 -0
  271. package/dist/commons/summarizeForLog.js +120 -0
  272. package/dist/connection/OpenRFCConnect.d.ts +13 -0
  273. package/dist/connection/OpenRFCConnect.js +23 -0
  274. package/dist/connection/index.d.ts +1 -0
  275. package/dist/connection/index.js +17 -0
  276. package/dist/dependencies/PackageDependencies.d.ts +2 -0
  277. package/dist/dependencies/PackageDependencies.js +24 -0
  278. package/dist/index.d.ts +1 -0
  279. package/dist/index.js +1 -0
  280. package/dist/lockfile/Lockfile.d.ts +23 -1
  281. package/dist/lockfile/Lockfile.js +45 -9
  282. package/dist/manifest/Manifest.d.ts +9 -5
  283. package/dist/manifest/Manifest.js +82 -29
  284. package/dist/manifest/PostActivity.js +3 -3
  285. package/dist/manifest/TrmManifest.d.ts +0 -2
  286. package/dist/manifest/TrmManifestBase.d.ts +2 -0
  287. package/dist/manifest/TrmManifestEngines.d.ts +64 -0
  288. package/dist/manifest/TrmManifestEngines.js +2 -0
  289. package/dist/manifest/engines/index.d.ts +2 -0
  290. package/dist/manifest/engines/index.js +18 -0
  291. package/dist/manifest/engines/sapRange.d.ts +38 -0
  292. package/dist/manifest/engines/sapRange.js +135 -0
  293. package/dist/manifest/engines/validateEngines.d.ts +44 -0
  294. package/dist/manifest/engines/validateEngines.js +282 -0
  295. package/dist/manifest/index.d.ts +3 -0
  296. package/dist/manifest/index.js +3 -0
  297. package/dist/manifest/sapEntries.d.ts +14 -0
  298. package/dist/manifest/sapEntries.js +63 -0
  299. package/dist/protocol/Protocol.js +7 -0
  300. package/dist/registry/AbstractRegistry.d.ts +18 -3
  301. package/dist/registry/FileSystem.d.ts +22 -13
  302. package/dist/registry/FileSystem.js +69 -18
  303. package/dist/registry/RegistryDeletionTransportUnauthorizedError.d.ts +4 -0
  304. package/dist/registry/RegistryDeletionTransportUnauthorizedError.js +12 -0
  305. package/dist/registry/RegistryDeletionTransportUnavailableError.d.ts +9 -0
  306. package/dist/registry/RegistryDeletionTransportUnavailableError.js +17 -0
  307. package/dist/registry/RegistryPackageNotFoundError.d.ts +7 -0
  308. package/dist/registry/RegistryPackageNotFoundError.js +14 -0
  309. package/dist/registry/RegistryV2.d.ts +15 -5
  310. package/dist/registry/RegistryV2.js +308 -48
  311. package/dist/registry/index.d.ts +4 -0
  312. package/dist/registry/index.js +4 -0
  313. package/dist/registry/registryKey.d.ts +7 -0
  314. package/dist/registry/registryKey.js +21 -0
  315. package/dist/systemConnector/ActionLock.d.ts +1 -0
  316. package/dist/systemConnector/ActionLock.js +2 -0
  317. package/dist/systemConnector/ISystemConnector.d.ts +21 -4
  318. package/dist/systemConnector/ISystemConnectorBase.d.ts +16 -0
  319. package/dist/systemConnector/InstallTransport.d.ts +6 -0
  320. package/dist/systemConnector/InstallTransport.js +2 -0
  321. package/dist/systemConnector/OpenRFCSystemConnector.d.ts +12 -0
  322. package/dist/systemConnector/OpenRFCSystemConnector.js +51 -0
  323. package/dist/systemConnector/RESTSystemConnector.d.ts +22 -7
  324. package/dist/systemConnector/RESTSystemConnector.js +95 -23
  325. package/dist/systemConnector/RFCConnection.d.ts +0 -1
  326. package/dist/systemConnector/RFCSystemConnector.d.ts +25 -7
  327. package/dist/systemConnector/RFCSystemConnector.js +75 -16
  328. package/dist/systemConnector/SystemConnector.d.ts +38 -6
  329. package/dist/systemConnector/SystemConnector.js +138 -12
  330. package/dist/systemConnector/SystemConnectorBase.d.ts +24 -1
  331. package/dist/systemConnector/SystemConnectorBase.js +174 -22
  332. package/dist/systemConnector/index.d.ts +3 -0
  333. package/dist/systemConnector/index.js +3 -0
  334. package/dist/transport/E071KOwner.d.ts +10 -0
  335. package/dist/transport/E071KOwner.js +15 -0
  336. package/dist/transport/R3transLogParser.d.ts +19 -0
  337. package/dist/transport/R3transLogParser.js +148 -0
  338. package/dist/transport/Transport.d.ts +36 -3
  339. package/dist/transport/Transport.js +304 -138
  340. package/dist/transport/index.d.ts +2 -0
  341. package/dist/transport/index.js +2 -0
  342. package/dist/trmPackage/TransportBinary.d.ts +4 -1
  343. package/dist/trmPackage/TrmArtifact.d.ts +12 -8
  344. package/dist/trmPackage/TrmArtifact.js +93 -74
  345. package/dist/trmPackage/TrmPackage.d.ts +20 -6
  346. package/dist/trmPackage/TrmPackage.js +27 -1
  347. package/dist/validators/validateDevclass.js +4 -0
  348. package/package.json +15 -7
  349. package/dist/actions/commons/trmServerPa.d.ts +0 -3
  350. package/dist/actions/commons/trmServerPa.js +0 -40
  351. package/dist/actions/install/checkAlreadyInstalled.d.ts +0 -3
  352. package/dist/actions/install/checkAlreadyInstalled.js +0 -71
  353. package/dist/actions/install/checkObjectTypes.d.ts +0 -3
  354. package/dist/actions/install/checkObjectTypes.js +0 -50
  355. package/dist/actions/install/checkObjectsLock.d.ts +0 -3
  356. package/dist/actions/install/checkObjectsLock.js +0 -52
  357. package/dist/actions/install/generateInstallTransports.d.ts +0 -3
  358. package/dist/actions/install/generateInstallTransports.js +0 -128
  359. package/dist/actions/install/importCustTransport.d.ts +0 -3
  360. package/dist/actions/install/importCustTransport.js +0 -73
  361. package/dist/actions/install/importDevcTransport.d.ts +0 -3
  362. package/dist/actions/install/importDevcTransport.js +0 -93
  363. package/dist/actions/install/importLangTransport.d.ts +0 -3
  364. package/dist/actions/install/importLangTransport.js +0 -72
  365. package/dist/actions/install/importTadirTransport.d.ts +0 -3
  366. package/dist/actions/install/importTadirTransport.js +0 -83
  367. package/dist/actions/install/readDevc.d.ts +0 -3
  368. package/dist/actions/install/readDevc.js +0 -33
  369. package/dist/actions/install/readTadir.d.ts +0 -3
  370. package/dist/actions/install/readTadir.js +0 -101
  371. package/dist/actions/install/refreshTmsTxt.d.ts +0 -3
  372. package/dist/actions/install/releaseInstallTransport.d.ts +0 -3
  373. package/dist/actions/install/releaseInstallTransport.js +0 -80
  374. package/dist/actions/publish/checkAllObjectsReleased.d.ts +0 -3
  375. package/dist/actions/publish/checkAllObjectsReleased.js +0 -46
  376. package/dist/actions/publish/getSourceCode.d.ts +0 -3
  377. package/dist/actions/publish/getSourceCode.js +0 -49
  378. package/dist/actions/publish/setChangelog.d.ts +0 -3
  379. package/dist/actions/publish/setChangelog.js +0 -69
  380. package/dist/actions/publish/setDevclass.d.ts +0 -3
  381. package/dist/actions/publish/setDevclass.js +0 -74
  382. package/dist/actions/publish/setReadme.d.ts +0 -3
  383. package/dist/actions/publish/setReadme.js +0 -52
  384. package/dist/actions/publish/setTransportTarget.d.ts +0 -3
@@ -0,0 +1,1017 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getPackagesInstalledIn = getPackagesInstalledIn;
13
+ exports.getInstalledObjectsLocks = getInstalledObjectsLocks;
14
+ exports.deleteTemporaryCleanupPackages = deleteTemporaryCleanupPackages;
15
+ exports.deleteCleanupStagingPackages = deleteCleanupStagingPackages;
16
+ exports.restoreTadirAssignments = restoreTadirAssignments;
17
+ exports.createStagingPackage = createStagingPackage;
18
+ exports.cleanupInstalledPackage = cleanupInstalledPackage;
19
+ exports.isDeletionForwardable = isDeletionForwardable;
20
+ exports.forwardDeletionTransport = forwardDeletionTransport;
21
+ exports.removeFromImportQueue = removeFromImportQueue;
22
+ exports.revertForwardedDeletionTransport = revertForwardedDeletionTransport;
23
+ exports.revertInstalledPackageCleanup = revertInstalledPackageCleanup;
24
+ const trm_commons_1 = require("trm-commons");
25
+ const systemConnector_1 = require("../../../systemConnector");
26
+ const transport_1 = require("../../../transport");
27
+ const registry_1 = require("../../../registry");
28
+ const commons_1 = require("../../../commons");
29
+ const crypto_1 = require("crypto");
30
+ const releaseDeletionTransport_1 = require("./releaseDeletionTransport");
31
+ const restoreTransport_1 = require("./restoreTransport");
32
+ const withScopedPrefix_1 = require("./withScopedPrefix");
33
+ const actionLocks_1 = require("./actionLocks");
34
+ const owningInstallation_1 = require("./owningInstallation");
35
+ function normalize(value) {
36
+ return value.trim().toUpperCase();
37
+ }
38
+ function objectKey(object) {
39
+ return `${normalize(object.pgmid)}\u0000${normalize(object.object)}\u0000${normalize(object.objName)}`;
40
+ }
41
+ function isDevclass(object) {
42
+ return normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'DEVC';
43
+ }
44
+ function isNamespace(object) {
45
+ return normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'NSPC';
46
+ }
47
+ /** Custom (`/XXX/`) namespace of a SAP package, if any. */
48
+ function getCustomNamespace(devclass) {
49
+ try {
50
+ const namespace = (0, commons_1.getPackageNamespace)(devclass);
51
+ return namespace.startsWith('/') ? namespace : undefined;
52
+ }
53
+ catch (e) {
54
+ // devclass doesn't use a custom namespace
55
+ return undefined;
56
+ }
57
+ }
58
+ /**
59
+ * TRM packages, other than `installed`, installed in one of `devclasses` (normalized SAP package
60
+ * names, usually the live subtree of the installed release).
61
+ */
62
+ function getPackagesInstalledIn(systemPackages, installed, devclasses) {
63
+ const installedDevclass = normalize(installed.getDevclass() || '');
64
+ return systemPackages.filter(pkg => {
65
+ const devclass = normalize(pkg.getDevclass() || '');
66
+ return devclass && devclass !== installedDevclass && devclasses.has(devclass);
67
+ });
68
+ }
69
+ /**
70
+ * Objects of the installed transport the cleanup deletes, and the namespaces it carries.
71
+ */
72
+ function readInstalledTransportObjects(installed) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const installedTransportObjects = installed.getTransport()
75
+ ? yield installed.getTransport().getE071()
76
+ : [];
77
+ // Table content (entries with E071K keys, e.g. a landscape transport carrying the CUST
78
+ // transports) is deleted by key through the customizing transports. Added without
79
+ // its keys, it would request the deletion of the whole table object.
80
+ const keyedObjects = new Set(installed.getTransport() && installedTransportObjects.length > 0
81
+ ? (yield installed.getTransport().getE071K()).map(key => objectKey((0, transport_1.getE071KOwner)(key)))
82
+ : []);
83
+ return {
84
+ // A namespace may be used by packages outside this installation: it's only deleted
85
+ // through the usage check, never because the installed transport carries it.
86
+ previousNamespaces: installedTransportObjects.filter(object => !keyedObjects.has(objectKey(object)) && isNamespace(object)),
87
+ // Translations (LANG rows, e.g. a landscape transport carrying the LANG transport) are deleted
88
+ // with their objects: SAP rejects them as deletion entries.
89
+ previousTransportObjects: installedTransportObjects.filter(object => !keyedObjects.has(objectKey(object))
90
+ && !isNamespace(object) && normalize(object.pgmid) !== 'LANG')
91
+ };
92
+ });
93
+ }
94
+ /** SAP packages of an installed release, as they are on the system now. */
95
+ function readInstallationTree(installed, previousInstallPackages, previousTransportObjects, deletedObjects, systemPackages) {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ const previousDevclasses = new Map();
98
+ previousInstallPackages.forEach(replacement => {
99
+ previousDevclasses.set(normalize(replacement.installDevclass), replacement.installDevclass);
100
+ });
101
+ // Older installations that kept the publisher package names have no replacement rows.
102
+ if (previousDevclasses.size === 0 && installed.getDevclass()) {
103
+ const previousRoot = installed.getDevclass();
104
+ previousDevclasses.set(normalize(previousRoot), previousRoot);
105
+ }
106
+ previousTransportObjects.forEach(object => {
107
+ if (isDevclass(object)) {
108
+ previousDevclasses.set(normalize(object.objName), object.objName);
109
+ }
110
+ });
111
+ const installedDevclasses = new Set(previousDevclasses.keys());
112
+ // Installation mappings do not include subpackages created locally afterwards.
113
+ // Inspect the live hierarchy even when the installation keeps its root package.
114
+ const deletedKeys = new Set(deletedObjects.map(objectKey));
115
+ const packageParents = new Map();
116
+ for (const devclass of Array.from(previousDevclasses.values())) {
117
+ for (const subpackage of yield systemConnector_1.SystemConnector.getSubpackages(devclass)) {
118
+ if (deletedKeys.has(objectKey({ pgmid: 'R3TR', object: 'DEVC', objName: subpackage.devclass }))) {
119
+ continue;
120
+ }
121
+ const key = normalize(subpackage.devclass);
122
+ previousDevclasses.set(key, subpackage.devclass);
123
+ if (subpackage.parentcl) {
124
+ packageParents.set(key, normalize(subpackage.parentcl));
125
+ }
126
+ // Without mapping rows (a published development copy, or an older installation that kept the
127
+ // publisher names) the installed transport doesn't list the SAP packages: the live ones are the installation's.
128
+ if (previousInstallPackages.length === 0) {
129
+ installedDevclasses.add(key);
130
+ }
131
+ }
132
+ }
133
+ // Other TRM packages installed underneath have their own lifecycle and are ignored: the uninstall
134
+ // action deletes them first, an upgrade removes everything else. Their ancestors stay as packages.
135
+ const otherInstallations = new Map(getPackagesInstalledIn(systemPackages, installed, new Set(previousDevclasses.keys())).map(pkg => [normalize(pkg.getDevclass()), pkg]));
136
+ const isOtherInstallation = (devclass) => {
137
+ const visited = new Set();
138
+ let current = normalize(devclass);
139
+ while (current && !visited.has(current)) {
140
+ if (otherInstallations.has(current)) {
141
+ return true;
142
+ }
143
+ visited.add(current);
144
+ current = packageParents.get(current);
145
+ }
146
+ return false;
147
+ };
148
+ return { previousDevclasses, installedDevclasses, packageParents, otherInstallations, isOtherInstallation };
149
+ });
150
+ }
151
+ /**
152
+ * Installed objects now in a SAP package outside the installation, or in the SAP package of
153
+ * another TRM package installed underneath.
154
+ */
155
+ function readRelocatedObjects(objects, tree) {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ return (yield systemConnector_1.SystemConnector.getExistingObjects(objects
158
+ .filter(object => normalize(object.pgmid) === 'R3TR' && !isDevclass(object))
159
+ .map(object => ({ pgmid: object.pgmid, object: object.object, objName: object.objName, devclass: '' }))))
160
+ .filter(object => object.devclass && (!tree.previousDevclasses.has(normalize(object.devclass)) || tree.isOtherInstallation(object.devclass)));
161
+ });
162
+ }
163
+ /**
164
+ * Locks on those of `objects` that removing `installed` certainly deletes: the objects of its
165
+ * installed transport still in its SAP packages. These would abort the cleanup at its objects
166
+ * lock check, so they can be checked before asking anything. Objects added locally or moved
167
+ * outside the installation are left out, as the cleanup may keep them.
168
+ */
169
+ function getInstalledObjectsLocks(installed, previousInstallPackages, systemPackages, objects) {
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ if (objects.length === 0) {
172
+ return [];
173
+ }
174
+ const { previousTransportObjects } = yield readInstalledTransportObjects(installed);
175
+ const installedKeys = new Set(previousTransportObjects.map(objectKey));
176
+ const candidates = new Map(objects
177
+ .filter(object => installedKeys.has(objectKey(object)))
178
+ .map(object => [objectKey(object), object]));
179
+ if (candidates.size === 0) {
180
+ return [];
181
+ }
182
+ const tree = yield readInstallationTree(installed, previousInstallPackages, previousTransportObjects, [], systemPackages);
183
+ (yield readRelocatedObjects(Array.from(candidates.values()), tree)).forEach(object => candidates.delete(objectKey(object)));
184
+ if (candidates.size === 0) {
185
+ return [];
186
+ }
187
+ return systemConnector_1.SystemConnector.getObjectsLocks(Array.from(candidates.values(), object => ({
188
+ PGMID: object.pgmid,
189
+ OBJECT: object.object,
190
+ OBJ_NAME: object.objName
191
+ })));
192
+ });
193
+ }
194
+ /** Deletes every temporary package, reporting the first failure after the cleanup pass. */
195
+ function deleteTemporaryCleanupPackages(temporaryPackages) {
196
+ return __awaiter(this, void 0, void 0, function* () {
197
+ let firstError;
198
+ for (const devclass of temporaryPackages) {
199
+ try {
200
+ yield systemConnector_1.SystemConnector.deleteTemporaryPackage(devclass.objName);
201
+ }
202
+ catch (error) {
203
+ firstError || (firstError = error);
204
+ }
205
+ }
206
+ if (firstError) {
207
+ throw firstError;
208
+ }
209
+ });
210
+ }
211
+ /**
212
+ * Deletes the staging packages created by the cleanup, once their objects were assigned back.
213
+ * Every package is attempted; the first failure is thrown afterwards.
214
+ */
215
+ function deleteCleanupStagingPackages(context) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ let firstError;
218
+ for (const devclass of context.revert.stagingPackages || []) {
219
+ try {
220
+ if (!(yield systemConnector_1.SystemConnector.getDevclass(devclass))) {
221
+ continue;
222
+ }
223
+ const objects = (yield systemConnector_1.SystemConnector.getDevclassObjects(devclass, false)).filter(object => !isDevclass(object));
224
+ if (objects.length > 0) {
225
+ throw new Error(`SAP package ${devclass} still contains ${objects.length} objects: manual cleanup is necessary.`);
226
+ }
227
+ trm_commons_1.Logger.loading(`Deleting package ${devclass}...`, true);
228
+ const transport = yield transport_1.Transport.createToc({
229
+ text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
230
+ target: systemConnector_1.SystemConnector.getDest()
231
+ });
232
+ try {
233
+ yield transport.addObjects([{ pgmid: 'R3TR', object: 'DEVC', objName: devclass }], false);
234
+ yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(transport, context.rawInput.packageData.registry, context, false);
235
+ }
236
+ catch (error) {
237
+ try {
238
+ if (yield transport.canBeDeleted()) {
239
+ yield transport.delete();
240
+ }
241
+ }
242
+ catch (deleteError) {
243
+ trm_commons_1.Logger.warning(`Could not delete transport ${transport.trkorr}: ${String(deleteError)}`, { important: true });
244
+ }
245
+ throw error;
246
+ }
247
+ }
248
+ catch (error) {
249
+ trm_commons_1.Logger.warning(`Could not delete SAP package ${devclass}, manual cleanup might be necessary.`, { important: true });
250
+ firstError || (firstError = error);
251
+ }
252
+ }
253
+ // Namespaces imported for the staging go once no package uses them.
254
+ for (const namespace of context.revert.temporaryNamespaces || []) {
255
+ try {
256
+ if (!(yield systemConnector_1.SystemConnector.getNamespace(namespace))) {
257
+ continue;
258
+ }
259
+ const packages = yield systemConnector_1.SystemConnector.getNamespacePackages(namespace);
260
+ if (packages.length > 0) {
261
+ throw new Error(`Namespace ${namespace} is still used by SAP packages ${packages.map(o => o.devclass).join(', ')}.`);
262
+ }
263
+ trm_commons_1.Logger.loading(`Deleting namespace ${namespace}...`, true);
264
+ const transport = yield transport_1.Transport.createToc({
265
+ text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
266
+ target: systemConnector_1.SystemConnector.getDest()
267
+ });
268
+ try {
269
+ yield transport.addObjects([{ pgmid: 'R3TR', object: 'NSPC', objName: namespace }], false);
270
+ yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(transport, context.rawInput.packageData.registry, context, false);
271
+ }
272
+ catch (error) {
273
+ try {
274
+ if (yield transport.canBeDeleted()) {
275
+ yield transport.delete();
276
+ }
277
+ }
278
+ catch (deleteError) {
279
+ trm_commons_1.Logger.warning(`Could not delete transport ${transport.trkorr}: ${String(deleteError)}`, { important: true });
280
+ }
281
+ throw error;
282
+ }
283
+ }
284
+ catch (error) {
285
+ trm_commons_1.Logger.warning(`Could not delete namespace ${namespace}, imported for the cleanup: manual cleanup might be necessary.`, { important: true });
286
+ firstError || (firstError = error);
287
+ }
288
+ }
289
+ if (firstError) {
290
+ throw firstError;
291
+ }
292
+ });
293
+ }
294
+ function restoreCleanupPackages(context) {
295
+ return __awaiter(this, void 0, void 0, function* () {
296
+ // Snapshots are stored in deletion order: reverse it to recreate parents first.
297
+ let firstError;
298
+ for (const pkg of [...(context.revert.cleanupTemporaryPackages || [])].reverse()) {
299
+ try {
300
+ if (yield systemConnector_1.SystemConnector.getDevclass(pkg.devclass)) {
301
+ continue;
302
+ }
303
+ yield systemConnector_1.SystemConnector.createPackage(Object.assign(Object.assign({}, (0, commons_1.packageDataFromTdevc)(pkg, {
304
+ devclass: pkg.devclass,
305
+ ctext: pkg.ctext || '',
306
+ as4user: pkg.as4user || systemConnector_1.SystemConnector.getLogonUser(),
307
+ dlvunit: pkg.dlvunit,
308
+ pdevclass: pkg.pdevclass || ''
309
+ })), { parentcl: pkg.parentcl, tpclass: pkg.tpclass }));
310
+ }
311
+ catch (error) {
312
+ firstError || (firstError = error);
313
+ }
314
+ }
315
+ if (firstError) {
316
+ throw firstError;
317
+ }
318
+ });
319
+ }
320
+ function restoreCleanupAssignments(context, restorePackages) {
321
+ return __awaiter(this, void 0, void 0, function* () {
322
+ if (restorePackages) {
323
+ yield restoreCleanupPackages(context);
324
+ }
325
+ yield restoreTadirAssignments(context.revert.cleanupOriginalTadir || []);
326
+ });
327
+ }
328
+ /**
329
+ * Assigns the objects that still exist back to their previous TADIR rows. Every object is
330
+ * attempted; the first failure is thrown afterwards.
331
+ */
332
+ function restoreTadirAssignments(originals) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ if (originals.length === 0) {
335
+ return;
336
+ }
337
+ const existing = new Set((yield systemConnector_1.SystemConnector.getExistingObjects(originals)).map(objectKey));
338
+ let firstError;
339
+ for (const object of originals) {
340
+ if (existing.has(objectKey(object))) {
341
+ try {
342
+ yield systemConnector_1.SystemConnector.tadirInterface(object);
343
+ }
344
+ catch (error) {
345
+ firstError || (firstError = error);
346
+ }
347
+ }
348
+ }
349
+ if (firstError) {
350
+ throw firstError;
351
+ }
352
+ });
353
+ }
354
+ /**
355
+ * Releases a transport of copies with the previous definition of the retained tables,
356
+ * so a rollback can restore them without dropping their data.
357
+ */
358
+ function backupRetainedTables(context, retainedTables) {
359
+ return __awaiter(this, void 0, void 0, function* () {
360
+ trm_commons_1.Logger.loading(`Backing up ${retainedTables.length} retained tables...`, true);
361
+ const backup = yield transport_1.Transport.createToc({
362
+ text: `@X1@TRM (BKP) ${context.rawInput.packageData.name} ${context.runtime.update.manifest.get().version}`,
363
+ target: systemConnector_1.SystemConnector.getDest()
364
+ });
365
+ context.revert.updateTablesBackupTransport = backup;
366
+ yield backup.addObjects(retainedTables.map(object => ({
367
+ pgmid: object.pgmid,
368
+ object: object.object,
369
+ objName: object.objName
370
+ })), false);
371
+ yield backup.release(false, true);
372
+ context.revert.retainedTables = {
373
+ trkorr: backup.trkorr,
374
+ entries: undefined,
375
+ binaries: (yield backup.download()).binaries
376
+ };
377
+ context.revert.retainedTableObjects = retainedTables.map(object => ({
378
+ pgmid: object.pgmid,
379
+ object: object.object,
380
+ objName: object.objName
381
+ }));
382
+ });
383
+ }
384
+ /**
385
+ * Customizing transports of the installed release whose rows must be deleted. Only transports
386
+ * recorded at install time and still on the system count.
387
+ */
388
+ function getCustomizingSources(context, target) {
389
+ return __awaiter(this, void 0, void 0, function* () {
390
+ const sources = [];
391
+ for (const transport of context.runtime.previousInstallTransports || []) {
392
+ if (normalize(transport.trmType || '') !== transport_1.TrmTransportIdentifier.CUST) {
393
+ continue;
394
+ }
395
+ if (yield new transport_1.Transport(transport.trkorr).getE070()) {
396
+ sources.push(transport.trkorr);
397
+ }
398
+ else {
399
+ trm_commons_1.Logger.warning(`Customizing transport ${transport.trkorr} is no longer on ${systemConnector_1.SystemConnector.getDest()}: its rows can't be deleted.`, { important: true });
400
+ }
401
+ }
402
+ if (sources.length === 0) {
403
+ return [];
404
+ }
405
+ if (target.keepCustomizing) {
406
+ trm_commons_1.Logger.warning(`Keeping customizing of ${sources.length} transports (${sources.join(', ')}).`, { important: true });
407
+ return [];
408
+ }
409
+ return sources;
410
+ });
411
+ }
412
+ /**
413
+ * Lists the customizing rows the cleanup deletes and asks to continue: always for a generic key or a
414
+ * whole table, which also delete rows not shipped by the package (default no); otherwise only when
415
+ * the incoming release doesn't ship customizing that rewrites them (default yes).
416
+ * Without prompts, it only warns.
417
+ */
418
+ function confirmCustomizingDeletion(context, target, sources) {
419
+ return __awaiter(this, void 0, void 0, function* () {
420
+ var _a;
421
+ const rows = [];
422
+ for (const trkorr of sources) {
423
+ rows.push(...yield new transport_1.Transport(trkorr).getCustomizingKeys());
424
+ }
425
+ const generic = rows.filter(row => row.tabkey === undefined || row.tabkey.includes('*'));
426
+ // Rows the incoming release ships again are rewritten by its import: only the others are lost.
427
+ const incoming = target.incomingCustomizing || [];
428
+ const wholeTables = new Set(incoming.filter(row => row.tabkey === undefined).map(row => normalize(row.table)));
429
+ const incomingKeys = new Set(incoming.filter(row => row.tabkey !== undefined).map(row => `${normalize(row.table)}\u0000${row.tabkey}`));
430
+ const lost = rows.filter(row => !generic.includes(row)
431
+ && !wholeTables.has(normalize(row.table)) && !incomingKeys.has(`${normalize(row.table)}\u0000${row.tabkey}`));
432
+ const listed = [...generic, ...lost];
433
+ if (listed.length === 0) {
434
+ trm_commons_1.Logger.log(`Deleting ${rows.length} customizing rows rewritten by the incoming release`, true);
435
+ return;
436
+ }
437
+ const label = (row) => row.tabkey === undefined ? `${row.table} (all rows)` : `${row.table} ${row.tabkey}`;
438
+ const shown = listed.slice(0, 20).map(label);
439
+ if (listed.length > shown.length) {
440
+ shown.push(`...and ${listed.length - shown.length} more`);
441
+ }
442
+ const name = context.rawInput.packageData.name;
443
+ const version = context.runtime.update.manifest.get().version;
444
+ const message = generic.length > 0
445
+ ? `${generic.length} customizing ${generic.length === 1 ? 'entry' : 'entries'} of ${name} v${version} ${generic.length === 1 ? 'uses' : 'use'} a generic key or a whole table: every matching row will be deleted, including rows not shipped by ${name}`
446
+ : `${listed.length} customizing ${listed.length === 1 ? 'row' : 'rows'} shipped by ${name} v${version} will be deleted${incoming.length > 0 ? ' (not shipped by the new release)' : ''}`;
447
+ trm_commons_1.Logger.warning(`${message}:\n${shown.join('\n')}`, { important: true });
448
+ if ((_a = context.rawInput.contextData) === null || _a === void 0 ? void 0 : _a.noInquirer) {
449
+ return;
450
+ }
451
+ const { deleteCustomizing } = yield trm_commons_1.Inquirer.prompt({
452
+ name: 'deleteCustomizing',
453
+ type: 'confirm',
454
+ message: `${message}. Continue?`,
455
+ default: generic.length === 0
456
+ });
457
+ if (!deleteCustomizing) {
458
+ throw new Error(`${target.actionName} aborted.`);
459
+ }
460
+ });
461
+ }
462
+ /** Whether `namespace` has the producer role (P) on the system: its objects are developed here. */
463
+ function isProducerNamespace(namespace) {
464
+ return __awaiter(this, void 0, void 0, function* () {
465
+ const rows = yield systemConnector_1.SystemConnector.readTable('TRNSPACE', [{ fieldName: 'ROLE' }], `NAMESPACE EQ '${namespace.replace(/'/g, "''")}'`);
466
+ return rows.some(row => normalize(row.role || '') === 'P');
467
+ });
468
+ }
469
+ /**
470
+ * Imports a custom namespace missing on the system, with the repair license of the installed
471
+ * release, so its objects can be staged in a package of the namespace.
472
+ */
473
+ function importStagingNamespace(context, namespace) {
474
+ return __awaiter(this, void 0, void 0, function* () {
475
+ var _a;
476
+ if (yield systemConnector_1.SystemConnector.getNamespace(namespace)) {
477
+ return;
478
+ }
479
+ const manifestNamespace = context.runtime.update.manifest.get().namespace;
480
+ if (!(manifestNamespace === null || manifestNamespace === void 0 ? void 0 : manifestNamespace.replicense) || normalize(manifestNamespace.ns || '') !== normalize(namespace)) {
481
+ throw new Error(`Namespace ${namespace} doesn't exist in ${systemConnector_1.SystemConnector.getDest()} and its repair license is unknown: add it in SE03 to delete the objects of the local installation.`);
482
+ }
483
+ trm_commons_1.Logger.loading(`Importing namespace ${namespace}...`, true);
484
+ // Track before the mutating await: SAP may commit the namespace and still fail the response.
485
+ (_a = context.revert).temporaryNamespaces || (_a.temporaryNamespaces = []);
486
+ context.revert.temporaryNamespaces.push(namespace);
487
+ yield systemConnector_1.SystemConnector.addNamespace(namespace, manifestNamespace.replicense, manifestNamespace.texts.map(o => ({
488
+ namespace,
489
+ spras: o.language,
490
+ descriptn: o.description,
491
+ owner: o.owner
492
+ })));
493
+ });
494
+ }
495
+ /** Creates a short-lived transportable package, in `namespace` when set, so CTS can export local objects. */
496
+ function createStagingPackage(context, namespace) {
497
+ return __awaiter(this, void 0, void 0, function* () {
498
+ var _a;
499
+ const prefix = namespace ? `${namespace}TRMD_` : 'ZTRM_DELE_';
500
+ // DEVCLASS allows 30 characters.
501
+ const hexLength = Math.min(16, 30 - prefix.length);
502
+ let stagingDevclass;
503
+ do {
504
+ stagingDevclass = `${prefix}${(0, crypto_1.randomBytes)(8).toString('hex').toUpperCase().substring(0, hexLength)}`;
505
+ } while (yield systemConnector_1.SystemConnector.getDevclass(stagingDevclass));
506
+ trm_commons_1.Logger.loading(`Creating package ${stagingDevclass}...`, true);
507
+ // Track before the mutating await because SAP may commit the package
508
+ // even when the connector response fails.
509
+ (_a = context.revert).stagingPackages || (_a.stagingPackages = []);
510
+ context.revert.stagingPackages.push(stagingDevclass);
511
+ yield systemConnector_1.SystemConnector.createPackage({
512
+ devclass: stagingDevclass,
513
+ ctext: 'TRM upgrade cleanup',
514
+ as4user: systemConnector_1.SystemConnector.getLogonUser(),
515
+ dlvunit: 'HOME',
516
+ pdevclass: yield systemConnector_1.SystemConnector.getDefaultTransportLayer()
517
+ });
518
+ yield systemConnector_1.SystemConnector.tadirInterface({
519
+ pgmid: 'R3TR', object: 'DEVC', objName: stagingDevclass,
520
+ devclass: stagingDevclass, srcsystem: 'TRM'
521
+ });
522
+ return stagingDevclass;
523
+ });
524
+ }
525
+ /**
526
+ * Removes the objects of the installed release (`context.runtime.update`) that are not part
527
+ * of `target`, through a deletion transport generated by the registry.
528
+ *
529
+ * Shared by upgrades, where the target is the incoming release, and by uninstalls, where the
530
+ * target is empty. It also removes SAP packages left empty, locally added objects (after
531
+ * confirmation), the package namespace when no other package uses it, and the customizing rows
532
+ * of the installed release. Tables shipped again by the target are kept and
533
+ * backed up so a rollback preserves their data.
534
+ */
535
+ function cleanupInstalledPackage(context, target) {
536
+ return __awaiter(this, void 0, void 0, function* () {
537
+ yield (0, withScopedPrefix_1.withScopedPrefix)(target.prefix, () => __awaiter(this, void 0, void 0, function* () {
538
+ var _a, _b, _c;
539
+ const installed = context.runtime.update;
540
+ //1- generate dummy transport
541
+ trm_commons_1.Logger.loading(`Generating transport...`);
542
+ const dummy = yield transport_1.Transport.createToc({
543
+ text: `@X1@TRM (DELE) ${context.rawInput.packageData.name} ${installed.manifest.get().version}`,
544
+ target: systemConnector_1.SystemConnector.getDest()
545
+ });
546
+ context.revert.updateCleanupTransport = dummy;
547
+ const { previousNamespaces, previousTransportObjects } = yield readInstalledTransportObjects(installed);
548
+ const incomingObjects = target.incomingObjects;
549
+ // Tables shipped again by the new release are adjusted by its import instead of
550
+ // being dropped and re-created, which would lose their data.
551
+ const incomingKeys = new Set(incomingObjects.map(objectKey));
552
+ const retainedTables = previousTransportObjects.filter(object => normalize(object.pgmid) === 'R3TR' && normalize(object.object) === 'TABL'
553
+ && incomingKeys.has(objectKey(object)));
554
+ const retainedKeys = new Set(retainedTables.map(objectKey));
555
+ retainedTables.forEach(object => trm_commons_1.Logger.log(`Keeping table ${object.objName} (present in new release)`, true));
556
+ const currentDevclasses = new Set(target.keptDevclasses.map(normalize));
557
+ const deletedKeys = new Set((context.runtime.deletedObjects || []).map(objectKey));
558
+ const { previousDevclasses, installedDevclasses, packageParents, otherInstallations, isOtherInstallation } = yield readInstallationTree(installed, context.runtime.previousInstallPackages, previousTransportObjects, context.runtime.deletedObjects || [], ((_a = context.rawInput.contextData) === null || _a === void 0 ? void 0 : _a.systemPackages) || []);
559
+ const generatedDevclasses = new Set(context.revert.sapPackages.map(normalize));
560
+ otherInstallations.forEach(pkg => trm_commons_1.Logger.log(`Ignoring SAP package ${pkg.getDevclass()}: TRM package ${pkg.packageName} is installed there`, true));
561
+ // Local additions remain cleanup candidates even when reused as incoming targets.
562
+ // The first local package owns the decision for its locally added descendants.
563
+ const cleanupGroups = new Map();
564
+ for (const normalizedDevclass of previousDevclasses.keys()) {
565
+ const locallyAdded = !installedDevclasses.has(normalizedDevclass);
566
+ if (generatedDevclasses.has(normalizedDevclass) || (!locallyAdded && currentDevclasses.has(normalizedDevclass))
567
+ || isOtherInstallation(normalizedDevclass)) {
568
+ continue;
569
+ }
570
+ let root = normalizedDevclass;
571
+ const visited = new Set([root]);
572
+ let parent = packageParents.get(root);
573
+ while (parent && previousDevclasses.has(parent) && !generatedDevclasses.has(parent)
574
+ && (!installedDevclasses.has(parent) === locallyAdded)
575
+ && (locallyAdded || !currentDevclasses.has(parent)) && !visited.has(parent)) {
576
+ root = parent;
577
+ visited.add(root);
578
+ parent = packageParents.get(root);
579
+ }
580
+ if (!cleanupGroups.has(root)) {
581
+ cleanupGroups.set(root, new Set());
582
+ }
583
+ cleanupGroups.get(root).add(normalizedDevclass);
584
+ }
585
+ const changedDevclassesToDelete = [];
586
+ const extraObjectsToDelete = new Map();
587
+ for (const [root, group] of cleanupGroups) {
588
+ const devclass = previousDevclasses.get(root);
589
+ // Only objects outside both releases need an extra cleanup decision.
590
+ const objectsAfterImport = new Map();
591
+ for (const member of group) {
592
+ for (const object of yield systemConnector_1.SystemConnector.getDevclassObjects(previousDevclasses.get(member), false)) {
593
+ // Package definitions follow the decision for the whole subtree; namespaces the usage check.
594
+ if (!isDevclass(object) && !isNamespace(object) && !deletedKeys.has(objectKey(object))) {
595
+ objectsAfterImport.set(objectKey(object), object);
596
+ }
597
+ }
598
+ }
599
+ previousTransportObjects.forEach(object => objectsAfterImport.delete(objectKey(object)));
600
+ incomingObjects.forEach(object => {
601
+ objectsAfterImport.delete(objectKey(object));
602
+ });
603
+ // Every locally added package definition is an extra object, including
604
+ // the root of this cleanup group, regardless of whether it has contents.
605
+ const packagesToRemove = Array.from(group).filter(member => !currentDevclasses.has(member));
606
+ const extraObjectCount = objectsAfterImport.size + packagesToRemove.filter(member => !installedDevclasses.has(member)).length;
607
+ if (extraObjectCount > 0) {
608
+ const extraObjectsMessage = `Cleanup of SAP package ${devclass}${group.size > 1 ? ' and its subpackages' : ''} will delete ${extraObjectCount} extra objects outside this installation`;
609
+ // Name the objects, so the user can tell local developments worth keeping.
610
+ const extraObjects = [
611
+ ...Array.from(objectsAfterImport.values()).map(object => `${object.pgmid} ${object.object} ${object.objName}`),
612
+ ...packagesToRemove.filter(member => !installedDevclasses.has(member)).map(member => `R3TR DEVC ${previousDevclasses.get(member)}`)
613
+ ];
614
+ trm_commons_1.Logger.warning(`${extraObjectsMessage}:\n${extraObjects.join('\n')}`, { important: true });
615
+ const { deleteExtraObjects } = context.rawInput.contextData.noInquirer
616
+ ? { deleteExtraObjects: true }
617
+ : yield trm_commons_1.Inquirer.prompt({
618
+ name: 'deleteExtraObjects',
619
+ type: 'confirm',
620
+ message: `${extraObjectsMessage}. Continue?`,
621
+ default: true
622
+ });
623
+ if (!deleteExtraObjects) {
624
+ continue;
625
+ }
626
+ objectsAfterImport.forEach((object, key) => extraObjectsToDelete.set(key, {
627
+ pgmid: object.pgmid,
628
+ object: object.object,
629
+ objName: object.objName
630
+ }));
631
+ }
632
+ changedDevclassesToDelete.push(...packagesToRemove.map(member => previousDevclasses.get(member)));
633
+ }
634
+ // A retained child still needs its ancestors, including when cleanup was declined.
635
+ const deletableDevclasses = new Set(changedDevclassesToDelete.map(normalize));
636
+ for (const devclass of previousDevclasses.keys()) {
637
+ if (deletableDevclasses.has(devclass)) {
638
+ continue;
639
+ }
640
+ const visited = new Set();
641
+ let parent = packageParents.get(devclass);
642
+ while (parent && !visited.has(parent)) {
643
+ visited.add(parent);
644
+ deletableDevclasses.delete(parent);
645
+ parent = packageParents.get(parent);
646
+ }
647
+ }
648
+ const packagesToDelete = changedDevclassesToDelete.filter(devclass => deletableDevclasses.has(normalize(devclass)));
649
+ // A namespace can only be cleaned up alongside its last remaining package: any other SAP
650
+ // package in it (TDEVC NAMESPACE), installed by TRM or not, keeps it. Namespaces of the
651
+ // incoming release are kept, as its packages may not have been imported yet.
652
+ const incomingNamespaces = new Set(target.keptDevclasses.map(getCustomNamespace).filter(Boolean).map(normalize));
653
+ const namespaceCandidates = new Map();
654
+ previousNamespaces.forEach(object => namespaceCandidates.set(normalize(object.objName), object.objName));
655
+ const rootNamespace = installed.getDevclass() ? getCustomNamespace(installed.getDevclass()) : undefined;
656
+ if (rootNamespace) {
657
+ namespaceCandidates.set(normalize(rootNamespace), rootNamespace);
658
+ }
659
+ const deletingDevclasses = new Set(packagesToDelete.map(normalize));
660
+ const namespacesToDelete = [];
661
+ for (const [key, namespace] of namespaceCandidates) {
662
+ if (incomingNamespaces.has(key)) {
663
+ trm_commons_1.Logger.log(`Keeping namespace ${namespace}: used by the incoming release`, true);
664
+ continue;
665
+ }
666
+ try {
667
+ if (!(yield systemConnector_1.SystemConnector.getNamespace(namespace))) {
668
+ continue;
669
+ }
670
+ // A producer namespace is developed on this system (TRM imports namespaces as recipient, role C): never delete it.
671
+ if (yield isProducerNamespace(namespace)) {
672
+ trm_commons_1.Logger.log(`Keeping namespace ${namespace}: it's a producer namespace of ${systemConnector_1.SystemConnector.getDest()}`, true);
673
+ continue;
674
+ }
675
+ const remainingPackages = (yield systemConnector_1.SystemConnector.getNamespacePackages(namespace))
676
+ .filter(pkg => !deletingDevclasses.has(normalize(pkg.devclass)));
677
+ if (remainingPackages.length === 0) {
678
+ namespacesToDelete.push(namespace);
679
+ }
680
+ else {
681
+ trm_commons_1.Logger.log(`Keeping namespace ${namespace}: still used by SAP packages ${remainingPackages.map(pkg => pkg.devclass).join(', ')}`, true);
682
+ }
683
+ }
684
+ catch (e) {
685
+ trm_commons_1.Logger.warning(`Keeping namespace ${namespace}: its usage could not be checked (${String(e)})`, { important: true });
686
+ }
687
+ }
688
+ // Installed objects moved to a package outside this installation (customer development)
689
+ // are kept unless confirmed; those now in another TRM package belong to it and are kept.
690
+ const relocatedObjects = yield readRelocatedObjects(previousTransportObjects.filter(object => !retainedKeys.has(objectKey(object))), { previousDevclasses, isOtherInstallation });
691
+ const movedKeys = new Set();
692
+ const movedObjects = [];
693
+ for (const object of relocatedObjects) {
694
+ // Shipped again by the incoming release: its import overwrites them and moves them back (confirmed at check-transports).
695
+ if (incomingKeys.has(objectKey(object))) {
696
+ trm_commons_1.Logger.log(`Keeping ${object.pgmid} ${object.object} ${object.objName}: the incoming release overwrites it`, true);
697
+ movedKeys.add(objectKey(object));
698
+ continue;
699
+ }
700
+ if (isOtherInstallation(object.devclass)) {
701
+ trm_commons_1.Logger.log(`Keeping ${object.pgmid} ${object.object} ${object.objName}: it's in SAP package ${object.devclass} of another TRM package`, true);
702
+ movedKeys.add(objectKey(object));
703
+ continue;
704
+ }
705
+ // An object now shipped by another installed TRM package belongs to it: never offer to delete it.
706
+ const owner = yield (0, owningInstallation_1.getOwningInstallation)(object.devclass, ((_b = context.rawInput.contextData) === null || _b === void 0 ? void 0 : _b.systemPackages) || [], installed);
707
+ if (owner) {
708
+ trm_commons_1.Logger.info(`Keeping ${object.pgmid} ${object.object} ${object.objName}: it belongs to TRM package ${owner.packageName} (SAP package ${object.devclass}).`);
709
+ movedKeys.add(objectKey(object));
710
+ continue;
711
+ }
712
+ movedObjects.push(object);
713
+ }
714
+ if (movedObjects.length > 0) {
715
+ movedObjects.forEach(object => trm_commons_1.Logger.warning(`${object.pgmid} ${object.object} ${object.objName} was moved to SAP package ${object.devclass}, outside this installation`));
716
+ const { deleteMovedObjects } = context.rawInput.contextData.noInquirer
717
+ ? { deleteMovedObjects: false }
718
+ : yield trm_commons_1.Inquirer.prompt({
719
+ name: 'deleteMovedObjects',
720
+ type: 'confirm',
721
+ message: `Delete ${movedObjects.length} installed objects moved outside this installation too?`,
722
+ default: false
723
+ });
724
+ if (!deleteMovedObjects) {
725
+ movedObjects.forEach(object => movedKeys.add(objectKey(object)));
726
+ trm_commons_1.Logger.warning(`Keeping ${movedObjects.length} objects moved outside this installation.`, { important: true });
727
+ }
728
+ }
729
+ const customizingSources = yield getCustomizingSources(context, target);
730
+ if (customizingSources.length > 0) {
731
+ yield confirmCustomizingDeletion(context, target, customizingSources);
732
+ }
733
+ const additionalObjects = [...extraObjectsToDelete.values(), ...packagesToDelete.map(devclass => ({
734
+ pgmid: 'R3TR',
735
+ object: 'DEVC',
736
+ objName: devclass
737
+ })), ...namespacesToDelete.map(namespace => ({
738
+ pgmid: 'R3TR',
739
+ object: 'NSPC',
740
+ objName: namespace
741
+ }))];
742
+ // Validate the complete deletion selection before adding anything to the transport.
743
+ // SAP packages the incoming release keeps are never deleted: a renamed installation has already
744
+ // generated them (generate-devclass), and the import of the others updates them in place.
745
+ const deletionObjects = new Map([...previousTransportObjects, ...additionalObjects]
746
+ .filter(object => !retainedKeys.has(objectKey(object)) && !movedKeys.has(objectKey(object)))
747
+ .filter(object => !(isDevclass(object) && currentDevclasses.has(normalize(object.objName))))
748
+ .map(object => [objectKey(object), object]));
749
+ // TRM comment rows of the installed transport are not objects to delete.
750
+ const hasObjectsToDelete = Array.from(deletionObjects.values()).some(object => normalize(object.pgmid) !== '*');
751
+ if (!hasObjectsToDelete && retainedTables.length === 0 && customizingSources.length === 0) {
752
+ trm_commons_1.Logger.warning(`Nothing to delete for package ${context.rawInput.packageData.name}: deletion transport was not generated. Manual cleanup of previous release install might be necessary.`, { important: true });
753
+ try {
754
+ if (yield dummy.canBeDeleted()) {
755
+ yield dummy.delete();
756
+ context.revert.updateCleanupTransport = undefined;
757
+ }
758
+ }
759
+ catch (e) {
760
+ trm_commons_1.Logger.warning(`Could not delete transport ${dummy.trkorr}: ${String(e)}`, { important: true });
761
+ }
762
+ return;
763
+ }
764
+ yield context.lockScope.acquire([
765
+ // TRM comment rows are not objects and are shared by every package.
766
+ ...Array.from(deletionObjects.values()).filter(object => normalize(object.pgmid) !== '*').map(actionLocks_1.objectLockResource),
767
+ ...Array.from(deletionObjects.values())
768
+ .filter(isDevclass)
769
+ .map(object => ({ type: "DEVCLASS", name: object.objName }))
770
+ ]);
771
+ if (deletionObjects.size > 0) {
772
+ trm_commons_1.Logger.loading(`Checking cleanup objects locks...`, true);
773
+ const locks = yield systemConnector_1.SystemConnector.getObjectsLocks(Array.from(deletionObjects.values(), object => ({
774
+ PGMID: object.pgmid,
775
+ OBJECT: object.object,
776
+ OBJ_NAME: object.objName
777
+ })));
778
+ if (locks.length > 0) {
779
+ locks.forEach(lock => trm_commons_1.Logger.error(`${lock.pgmid} ${lock.object} ${lock.objName} is currently locked in transport ${lock.trkorr}`, { important: true }));
780
+ throw new Error(`${target.actionName} aborted. To continue, all cleanup objects and SAP packages must be released`);
781
+ }
782
+ }
783
+ const temporaryPackages = Array.from(deletionObjects.values()).filter(object => isDevclass(object) && normalize(object.objName).startsWith('$'));
784
+ const objectsToTransport = Array.from(deletionObjects.values()).filter(object => !temporaryPackages.includes(object));
785
+ // Cleanup exports the previous installation's objects, regardless of the new namespace.
786
+ const needsStaging = normalize(installed.getDevclass() || '').startsWith('$');
787
+ const stagingDevclasses = [];
788
+ let retainedOriginalTadir = [];
789
+ if (needsStaging && (objectsToTransport.length > 0 || retainedTables.length > 0)) {
790
+ const existingObjects = yield systemConnector_1.SystemConnector.getExistingObjects([...objectsToTransport, ...retainedTables].map(object => ({
791
+ pgmid: object.pgmid, object: object.object, objName: object.objName, devclass: ''
792
+ })));
793
+ // SAP only accepts objects of a custom namespace in packages of that namespace:
794
+ // stage them by namespace.
795
+ const stagingGroups = new Map();
796
+ for (const object of existingObjects) {
797
+ const namespace = getCustomNamespace(object.objName) || '';
798
+ stagingGroups.set(namespace, [...(stagingGroups.get(namespace) || []), object]);
799
+ }
800
+ context.revert.cleanupOriginalTadir = [];
801
+ for (const [namespace, objects] of stagingGroups) {
802
+ if (namespace) {
803
+ yield importStagingNamespace(context, namespace);
804
+ }
805
+ const stagingDevclass = yield createStagingPackage(context, namespace);
806
+ stagingDevclasses.push(stagingDevclass);
807
+ for (const object of objects) {
808
+ context.revert.cleanupOriginalTadir.push(Object.assign({}, object));
809
+ if (retainedKeys.has(objectKey(object))) {
810
+ retainedOriginalTadir.push(Object.assign({}, object));
811
+ }
812
+ yield systemConnector_1.SystemConnector.tadirInterface(Object.assign(Object.assign({}, object), { devclass: stagingDevclass, srcsystem: 'TRM' }));
813
+ }
814
+ }
815
+ }
816
+ if (retainedTables.length > 0) {
817
+ yield backupRetainedTables(context, retainedTables);
818
+ // Retained tables stay installed: move them out of the staging package before it is deleted.
819
+ yield restoreTadirAssignments(retainedOriginalTadir);
820
+ }
821
+ if (objectsToTransport.length > 0) {
822
+ yield dummy.addObjects(objectsToTransport, false);
823
+ }
824
+ if (stagingDevclasses.length > 0) {
825
+ yield dummy.addObjects(stagingDevclasses.map(devclass => ({ pgmid: 'R3TR', object: 'DEVC', objName: devclass })), false);
826
+ }
827
+ // Namespaces imported for the staging go with their staging packages.
828
+ const temporaryNamespaces = (context.revert.temporaryNamespaces || [])
829
+ .filter(namespace => !namespacesToDelete.some(o => normalize(o) === normalize(namespace)));
830
+ if (temporaryNamespaces.length > 0) {
831
+ yield dummy.addObjects(temporaryNamespaces.map(namespace => ({ pgmid: 'R3TR', object: 'NSPC', objName: namespace })), false);
832
+ }
833
+ // The copy keeps the E071K keys and OBJFUNC K: the release exports the current rows
834
+ // (restored by a rollback) and the registry turns them into deletions by key.
835
+ context.revert.cleanupCustomizingSources = [];
836
+ for (const trkorr of customizingSources) {
837
+ trm_commons_1.Logger.loading(`Including customizing from transport ${trkorr}...`, true);
838
+ yield dummy.addObjectsFromTransport(trkorr);
839
+ context.revert.cleanupCustomizingSources.push(trkorr);
840
+ }
841
+ const packageDepth = (devclass) => {
842
+ const visited = new Set();
843
+ let parent = packageParents.get(normalize(devclass));
844
+ while (parent && !visited.has(parent)) {
845
+ visited.add(parent);
846
+ parent = packageParents.get(parent);
847
+ }
848
+ return visited.size;
849
+ };
850
+ // Delete descendants before their parents, regardless of transport entry order.
851
+ temporaryPackages.sort((a, b) => packageDepth(b.objName) - packageDepth(a.objName));
852
+ context.revert.cleanupTemporaryPackages = [];
853
+ // Snapshot every definition before deleting any package, including for partial failures.
854
+ for (const devclass of temporaryPackages) {
855
+ const pkg = yield systemConnector_1.SystemConnector.getDevclass(devclass.objName);
856
+ if (!pkg) {
857
+ throw new Error(`Cannot back up temporary SAP package ${devclass.objName}`);
858
+ }
859
+ context.revert.cleanupTemporaryPackages.push(Object.assign({}, pkg));
860
+ }
861
+ try {
862
+ yield deleteTemporaryCleanupPackages(temporaryPackages);
863
+ }
864
+ catch (e) {
865
+ // Their objects are already in the deletion transport: an empty local package is a harmless leftover.
866
+ trm_commons_1.Logger.warning(`Could not delete local SAP package(s) ${temporaryPackages.map(o => o.objName).join(', ')} (${e instanceof Error ? e.message : String(e)}): delete them manually.`, { important: true });
867
+ }
868
+ //guard: clean and rebuild comments
869
+ yield dummy.removeComments();
870
+ yield dummy.addComment(`name=${installed.manifest.get().name}`);
871
+ yield dummy.addComment(`version=${installed.manifest.get().version}`);
872
+ try {
873
+ yield (0, releaseDeletionTransport_1.releaseDeletionTransport)(dummy, context.rawInput.packageData.registry, context);
874
+ }
875
+ catch (e) {
876
+ if (!(e instanceof registry_1.RegistryDeletionTransportUnavailableError)) {
877
+ throw e;
878
+ }
879
+ //at this point the dummy is already released, transport cannot be deleted but it's a harmless release of a transport of copies.
880
+ yield restoreCleanupAssignments(context, true);
881
+ if (target.requireDeletion) {
882
+ trm_commons_1.Logger.error(e.message, { important: true });
883
+ throw e;
884
+ }
885
+ trm_commons_1.Logger.warning(`${e.message} Manual cleanup of previous release install might be necessary.`, { important: true });
886
+ // Deleting the staging packages needs a deletion transport too.
887
+ if (stagingDevclasses.length > 0) {
888
+ trm_commons_1.Logger.warning(`SAP package(s) ${stagingDevclasses.join(', ')}, created for the cleanup, were left on ${systemConnector_1.SystemConnector.getDest()}: delete them manually.`, { important: true });
889
+ }
890
+ if (((_c = context.revert.temporaryNamespaces) === null || _c === void 0 ? void 0 : _c.length) > 0) {
891
+ trm_commons_1.Logger.warning(`Namespace(s) ${context.revert.temporaryNamespaces.join(', ')}, imported for the cleanup, were left on ${systemConnector_1.SystemConnector.getDest()}: delete them manually.`, { important: true });
892
+ }
893
+ }
894
+ }));
895
+ });
896
+ }
897
+ /**
898
+ * Whether the deletion transport generated by {@link cleanupInstalledPackage} must be carried
899
+ * through the landscape. Objects of a temporary (`$`) installation only exist on this system.
900
+ */
901
+ function isDeletionForwardable(context) {
902
+ var _a;
903
+ return !!context.revert.dele && !normalize(((_a = context.runtime.update) === null || _a === void 0 ? void 0 : _a.getDevclass()) || '').startsWith('$');
904
+ }
905
+ /**
906
+ * Adds the deletion transport to the import queue of the landscape target system, so the
907
+ * removed objects are also deleted there.
908
+ * For a clean landscape, it has to be imported before any transport of a later release.
909
+ */
910
+ function forwardDeletionTransport(context, targetSystem) {
911
+ return __awaiter(this, void 0, void 0, function* () {
912
+ // The queue may be changed even when the connector response fails.
913
+ context.revert.deleInTargetTms = true;
914
+ yield systemConnector_1.SystemConnector.forwardTransport(context.revert.dele.trkorr, targetSystem, systemConnector_1.SystemConnector.getDest(), true);
915
+ });
916
+ }
917
+ /**
918
+ * Removes a transport from the import queue of `targetSystem`. Only the queue of the connected
919
+ * system can be changed: another system's queue would need its credentials, so the operator is
920
+ * warned to remove it manually. Returns whether the transport was removed.
921
+ */
922
+ function removeFromImportQueue(trkorr, targetSystem, description) {
923
+ return __awaiter(this, void 0, void 0, function* () {
924
+ if (normalize(targetSystem) === normalize(systemConnector_1.SystemConnector.getDest())) {
925
+ yield systemConnector_1.SystemConnector.deleteTmsTransport(trkorr, targetSystem);
926
+ return true;
927
+ }
928
+ trm_commons_1.Logger.warning(`${description} ${trkorr} may be in the ${targetSystem} import queue: remove it manually in STMS (it can't be removed from ${systemConnector_1.SystemConnector.getDest()}).`, { important: true });
929
+ return false;
930
+ });
931
+ }
932
+ /** Removes the deletion transport from the target system import queue, when it was forwarded. */
933
+ function revertForwardedDeletionTransport(context, targetSystem) {
934
+ return __awaiter(this, void 0, void 0, function* () {
935
+ if (context.revert.deleInTargetTms) {
936
+ yield removeFromImportQueue(context.revert.dele.trkorr, targetSystem, `Deletion transport`);
937
+ }
938
+ });
939
+ }
940
+ /**
941
+ * Rolls back {@link cleanupInstalledPackage}: recreates deleted temporary packages, deletes the
942
+ * deletion transport or, once its import started, re-imports the copy of the deleted objects,
943
+ * restores retained tables, and restores object assignments.
944
+ * With `restore` set to `false` (a later destructive cleanup failed), previous state is not
945
+ * restored over objects that were not deleted: only the unreleased transports are deleted.
946
+ * Every independent operation is attempted; the first failure is thrown afterwards.
947
+ */
948
+ function revertInstalledPackageCleanup(context_1) {
949
+ return __awaiter(this, arguments, void 0, function* (context, restore = true) {
950
+ let firstError;
951
+ if (restore) {
952
+ try {
953
+ yield restoreCleanupPackages(context);
954
+ }
955
+ catch (error) {
956
+ firstError = error;
957
+ }
958
+ }
959
+ try {
960
+ if (context.revert.dele) {
961
+ //check if it can be deleted -> the exception might have been raised before the transport release, we can still cleanup nicely
962
+ const transport = new transport_1.Transport(context.revert.dele.trkorr);
963
+ if (yield (transport.canBeDeleted())) {
964
+ yield transport.delete();
965
+ }
966
+ else if (context.revert.deleImportStarted) {
967
+ if (restore) {
968
+ yield (0, restoreTransport_1.restoreTransport)(context.revert.dele);
969
+ }
970
+ else {
971
+ trm_commons_1.Logger.warning(`Objects deleted by ${context.revert.dele.trkorr} were not restored, as the cleanup of the imported objects failed: manual restore might be necessary.`, { important: true });
972
+ }
973
+ }
974
+ else {
975
+ // Released but never imported: the objects were not deleted, re-importing the copy would overwrite them.
976
+ trm_commons_1.Logger.log(`Deletion transport ${context.revert.dele.trkorr} was not imported, objects restore skipped`, true);
977
+ }
978
+ }
979
+ else if (context.revert.updateCleanupTransport
980
+ && (yield context.revert.updateCleanupTransport.canBeDeleted())) {
981
+ yield context.revert.updateCleanupTransport.delete();
982
+ }
983
+ }
984
+ catch (error) {
985
+ firstError || (firstError = error);
986
+ }
987
+ try {
988
+ if (context.revert.retainedTables) {
989
+ if (restore) {
990
+ // Old table definitions are imported over the new ones: data is kept.
991
+ yield (0, restoreTransport_1.restoreTransport)(context.revert.retainedTables);
992
+ }
993
+ else {
994
+ trm_commons_1.Logger.warning(`Retained tables backup ${context.revert.retainedTables.trkorr} was not restored, as the cleanup of the imported objects failed: manual restore might be necessary.`, { important: true });
995
+ }
996
+ }
997
+ else if (context.revert.updateTablesBackupTransport
998
+ && (yield context.revert.updateTablesBackupTransport.canBeDeleted())) {
999
+ yield context.revert.updateTablesBackupTransport.delete();
1000
+ }
1001
+ }
1002
+ catch (error) {
1003
+ firstError || (firstError = error);
1004
+ }
1005
+ if (restore) {
1006
+ try {
1007
+ yield restoreCleanupAssignments(context, false);
1008
+ }
1009
+ catch (error) {
1010
+ firstError || (firstError = error);
1011
+ }
1012
+ }
1013
+ if (firstError) {
1014
+ throw firstError;
1015
+ }
1016
+ });
1017
+ }