mcdev 7.0.4 → 7.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.
Files changed (335) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  2. package/.husky/post-checkout +1 -1
  3. package/.husky/post-merge +7 -1
  4. package/.husky/pre-commit +2 -0
  5. package/@types/lib/Builder.d.ts.map +1 -1
  6. package/@types/lib/Deployer.d.ts +3 -0
  7. package/@types/lib/Deployer.d.ts.map +1 -1
  8. package/@types/lib/index.d.ts +70 -19
  9. package/@types/lib/index.d.ts.map +1 -1
  10. package/@types/lib/metadataTypes/Asset.d.ts +53 -16
  11. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  12. package/@types/lib/metadataTypes/AttributeGroup.d.ts +3 -0
  13. package/@types/lib/metadataTypes/AttributeGroup.d.ts.map +1 -1
  14. package/@types/lib/metadataTypes/AttributeSet.d.ts +5 -0
  15. package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -1
  16. package/@types/lib/metadataTypes/Automation.d.ts +11 -0
  17. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  18. package/@types/lib/metadataTypes/Campaign.d.ts +1 -0
  19. package/@types/lib/metadataTypes/Campaign.d.ts.map +1 -1
  20. package/@types/lib/metadataTypes/ContentArea.d.ts +1 -0
  21. package/@types/lib/metadataTypes/ContentArea.d.ts.map +1 -1
  22. package/@types/lib/metadataTypes/DataExtension.d.ts +5 -2
  23. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  24. package/@types/lib/metadataTypes/DataExtensionField.d.ts +3 -4
  25. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  26. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts +1 -0
  27. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts.map +1 -1
  28. package/@types/lib/metadataTypes/DataExtract.d.ts +1 -0
  29. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
  30. package/@types/lib/metadataTypes/DataExtractType.d.ts +1 -0
  31. package/@types/lib/metadataTypes/DataExtractType.d.ts.map +1 -1
  32. package/@types/lib/metadataTypes/DeliveryProfile.d.ts +1 -0
  33. package/@types/lib/metadataTypes/DeliveryProfile.d.ts.map +1 -1
  34. package/@types/lib/metadataTypes/Discovery.d.ts +1 -0
  35. package/@types/lib/metadataTypes/Discovery.d.ts.map +1 -1
  36. package/@types/lib/metadataTypes/Email.d.ts +1 -0
  37. package/@types/lib/metadataTypes/Email.d.ts.map +1 -1
  38. package/@types/lib/metadataTypes/EmailSend.d.ts +8 -0
  39. package/@types/lib/metadataTypes/EmailSend.d.ts.map +1 -1
  40. package/@types/lib/metadataTypes/Event.d.ts +3 -0
  41. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  42. package/@types/lib/metadataTypes/FileLocation.d.ts +1 -0
  43. package/@types/lib/metadataTypes/FileLocation.d.ts.map +1 -1
  44. package/@types/lib/metadataTypes/FileTransfer.d.ts +1 -0
  45. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
  46. package/@types/lib/metadataTypes/Filter.d.ts +1 -0
  47. package/@types/lib/metadataTypes/Filter.d.ts.map +1 -1
  48. package/@types/lib/metadataTypes/Folder.d.ts +39 -25
  49. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
  50. package/@types/lib/metadataTypes/ImportFile.d.ts +5 -0
  51. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  52. package/@types/lib/metadataTypes/Journey.d.ts +42 -3
  53. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  54. package/@types/lib/metadataTypes/List.d.ts +1 -0
  55. package/@types/lib/metadataTypes/List.d.ts.map +1 -1
  56. package/@types/lib/metadataTypes/MetadataType.d.ts +50 -3
  57. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  58. package/@types/lib/metadataTypes/MobileCode.d.ts +1 -0
  59. package/@types/lib/metadataTypes/MobileCode.d.ts.map +1 -1
  60. package/@types/lib/metadataTypes/MobileKeyword.d.ts +9 -0
  61. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  62. package/@types/lib/metadataTypes/MobileMessage.d.ts +4 -0
  63. package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -1
  64. package/@types/lib/metadataTypes/Query.d.ts +3 -0
  65. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  66. package/@types/lib/metadataTypes/Role.d.ts +1 -0
  67. package/@types/lib/metadataTypes/Role.d.ts.map +1 -1
  68. package/@types/lib/metadataTypes/Script.d.ts +3 -1
  69. package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
  70. package/@types/lib/metadataTypes/SendClassification.d.ts +3 -0
  71. package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -1
  72. package/@types/lib/metadataTypes/SenderProfile.d.ts +1 -6
  73. package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -1
  74. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +6 -0
  75. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
  76. package/@types/lib/metadataTypes/TransactionalMessage.d.ts +1 -0
  77. package/@types/lib/metadataTypes/TransactionalMessage.d.ts.map +1 -1
  78. package/@types/lib/metadataTypes/TransactionalPush.d.ts +3 -0
  79. package/@types/lib/metadataTypes/TransactionalPush.d.ts.map +1 -1
  80. package/@types/lib/metadataTypes/TransactionalSMS.d.ts +4 -0
  81. package/@types/lib/metadataTypes/TransactionalSMS.d.ts.map +1 -1
  82. package/@types/lib/metadataTypes/TriggeredSend.d.ts +6 -6
  83. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
  84. package/@types/lib/metadataTypes/User.d.ts +1 -0
  85. package/@types/lib/metadataTypes/User.d.ts.map +1 -1
  86. package/@types/lib/metadataTypes/Verification.d.ts +3 -0
  87. package/@types/lib/metadataTypes/Verification.d.ts.map +1 -1
  88. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts +24 -14
  89. package/@types/lib/metadataTypes/definitions/AttributeGroup.definition.d.ts +3 -0
  90. package/@types/lib/metadataTypes/definitions/AttributeSet.definition.d.ts +5 -0
  91. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts +16 -0
  92. package/@types/lib/metadataTypes/definitions/Campaign.definition.d.ts +1 -0
  93. package/@types/lib/metadataTypes/definitions/ContentArea.definition.d.ts +1 -0
  94. package/@types/lib/metadataTypes/definitions/DataExtension.definition.d.ts +1 -0
  95. package/@types/lib/metadataTypes/definitions/DataExtensionField.definition.d.ts +1 -0
  96. package/@types/lib/metadataTypes/definitions/DataExtensionTemplate.definition.d.ts +1 -0
  97. package/@types/lib/metadataTypes/definitions/DataExtract.definition.d.ts +1 -0
  98. package/@types/lib/metadataTypes/definitions/DataExtractType.definition.d.ts +1 -0
  99. package/@types/lib/metadataTypes/definitions/DeliveryProfile.definition.d.ts +1 -0
  100. package/@types/lib/metadataTypes/definitions/Discovery.definition.d.ts +1 -0
  101. package/@types/lib/metadataTypes/definitions/Email.definition.d.ts +1 -0
  102. package/@types/lib/metadataTypes/definitions/EmailSend.definition.d.ts +8 -0
  103. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +3 -0
  104. package/@types/lib/metadataTypes/definitions/FileLocation.definition.d.ts +1 -0
  105. package/@types/lib/metadataTypes/definitions/FileTransfer.definition.d.ts +1 -0
  106. package/@types/lib/metadataTypes/definitions/Filter.definition.d.ts +1 -0
  107. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts +1 -0
  108. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts +5 -0
  109. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +13 -0
  110. package/@types/lib/metadataTypes/definitions/List.definition.d.ts +1 -0
  111. package/@types/lib/metadataTypes/definitions/MobileCode.definition.d.ts +1 -0
  112. package/@types/lib/metadataTypes/definitions/MobileKeyword.definition.d.ts +9 -0
  113. package/@types/lib/metadataTypes/definitions/MobileMessage.definition.d.ts +4 -0
  114. package/@types/lib/metadataTypes/definitions/Query.definition.d.ts +3 -0
  115. package/@types/lib/metadataTypes/definitions/Role.definition.d.ts +1 -0
  116. package/@types/lib/metadataTypes/definitions/Script.definition.d.ts +1 -0
  117. package/@types/lib/metadataTypes/definitions/SendClassification.definition.d.ts +3 -0
  118. package/@types/lib/metadataTypes/definitions/SenderProfile.definition.d.ts +1 -0
  119. package/@types/lib/metadataTypes/definitions/TransactionalEmail.definition.d.ts +6 -0
  120. package/@types/lib/metadataTypes/definitions/TransactionalMessage.definition.d.ts +1 -0
  121. package/@types/lib/metadataTypes/definitions/TransactionalPush.definition.d.ts +3 -0
  122. package/@types/lib/metadataTypes/definitions/TransactionalSMS.definition.d.ts +4 -0
  123. package/@types/lib/metadataTypes/definitions/TriggeredSend.definition.d.ts +6 -0
  124. package/@types/lib/metadataTypes/definitions/User.definition.d.ts +1 -0
  125. package/@types/lib/metadataTypes/definitions/Verification.definition.d.ts +3 -0
  126. package/@types/lib/util/cache.d.ts +10 -0
  127. package/@types/lib/util/cache.d.ts.map +1 -1
  128. package/@types/lib/util/cli.d.ts +3 -6
  129. package/@types/lib/util/cli.d.ts.map +1 -1
  130. package/@types/lib/util/config.d.ts.map +1 -1
  131. package/@types/lib/util/devops.d.ts.map +1 -1
  132. package/@types/lib/util/init.config.d.ts.map +1 -1
  133. package/@types/lib/util/init.d.ts.map +1 -1
  134. package/@types/lib/util/init.git.d.ts.map +1 -1
  135. package/@types/lib/util/replaceContentBlockReference.d.ts +27 -4
  136. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  137. package/@types/lib/util/util.d.ts +32 -3
  138. package/@types/lib/util/util.d.ts.map +1 -1
  139. package/@types/types/mcdev.d.d.ts +87 -0
  140. package/@types/types/mcdev.d.d.ts.map +1 -1
  141. package/boilerplate/files/.vscode/settings.json +1 -0
  142. package/boilerplate/forcedUpdates.json +4 -0
  143. package/boilerplate/gitignore-template +0 -1
  144. package/lib/Builder.js +13 -8
  145. package/lib/Deployer.js +12 -7
  146. package/lib/cli.js +179 -14
  147. package/lib/index.js +538 -205
  148. package/lib/metadataTypes/Asset.js +455 -210
  149. package/lib/metadataTypes/Automation.js +34 -0
  150. package/lib/metadataTypes/DataExtension.js +33 -28
  151. package/lib/metadataTypes/DataExtensionField.js +2 -2
  152. package/lib/metadataTypes/Event.js +28 -2
  153. package/lib/metadataTypes/Folder.js +63 -48
  154. package/lib/metadataTypes/Journey.js +330 -56
  155. package/lib/metadataTypes/MetadataType.js +269 -57
  156. package/lib/metadataTypes/MobileKeyword.js +12 -1
  157. package/lib/metadataTypes/Script.js +4 -3
  158. package/lib/metadataTypes/SenderProfile.js +17 -5
  159. package/lib/metadataTypes/TriggeredSend.js +20 -5
  160. package/lib/metadataTypes/definitions/Asset.definition.js +10 -2
  161. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
  162. package/lib/metadataTypes/definitions/AttributeSet.definition.js +11 -0
  163. package/lib/metadataTypes/definitions/Automation.definition.js +9 -0
  164. package/lib/metadataTypes/definitions/Campaign.definition.js +1 -0
  165. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
  166. package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -0
  167. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
  168. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
  169. package/lib/metadataTypes/definitions/DataExtract.definition.js +2 -1
  170. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
  171. package/lib/metadataTypes/definitions/DeliveryProfile.definition.js +1 -0
  172. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
  173. package/lib/metadataTypes/definitions/Email.definition.js +1 -0
  174. package/lib/metadataTypes/definitions/EmailSend.definition.js +8 -0
  175. package/lib/metadataTypes/definitions/Event.definition.js +1 -0
  176. package/lib/metadataTypes/definitions/FileLocation.definition.js +1 -0
  177. package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
  178. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  179. package/lib/metadataTypes/definitions/Folder.definition.js +10 -8
  180. package/lib/metadataTypes/definitions/ImportFile.definition.js +8 -1
  181. package/lib/metadataTypes/definitions/Journey.definition.js +28 -0
  182. package/lib/metadataTypes/definitions/List.definition.js +1 -0
  183. package/lib/metadataTypes/definitions/MobileCode.definition.js +1 -0
  184. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +7 -0
  185. package/lib/metadataTypes/definitions/MobileMessage.definition.js +9 -0
  186. package/lib/metadataTypes/definitions/Query.definition.js +3 -0
  187. package/lib/metadataTypes/definitions/Role.definition.js +1 -0
  188. package/lib/metadataTypes/definitions/Script.definition.js +1 -0
  189. package/lib/metadataTypes/definitions/SendClassification.definition.js +4 -0
  190. package/lib/metadataTypes/definitions/SenderProfile.definition.js +1 -0
  191. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +7 -0
  192. package/lib/metadataTypes/definitions/TransactionalMessage.definition.js +1 -0
  193. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +3 -0
  194. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +4 -0
  195. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +10 -3
  196. package/lib/metadataTypes/definitions/User.definition.js +3 -0
  197. package/lib/metadataTypes/definitions/Verification.definition.js +1 -0
  198. package/lib/util/cache.js +35 -0
  199. package/lib/util/cli.js +96 -139
  200. package/lib/util/config.js +11 -19
  201. package/lib/util/devops.js +41 -41
  202. package/lib/util/init.config.js +6 -10
  203. package/lib/util/init.git.js +43 -57
  204. package/lib/util/init.js +35 -59
  205. package/lib/util/replaceContentBlockReference.js +107 -60
  206. package/lib/util/util.js +90 -4
  207. package/package.json +14 -13
  208. package/test/general.test.js +1117 -163
  209. package/test/mockRoot/.mcdevrc.json +1 -1
  210. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withExistingDE.event-meta.json +1 -0
  211. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withSchema.event-meta.json +1 -0
  212. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json +1 -0
  213. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json +1 -0
  214. package/test/resourceFactory.js +43 -11
  215. package/test/resources/1111111/dataFolder/retrieve-ContentTypeINshared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml +364 -0
  216. package/test/resources/9999999/asset/{block-1157-retrieve-expected.html → build-asset_htmlblock-expected.html} +1 -1
  217. package/test/resources/9999999/asset/build-asset_htmlblock-expected.json +29 -0
  218. package/test/resources/9999999/asset/build-templatebasedemail-expected.json +65 -0
  219. package/test/resources/9999999/asset/resolveId-1295064-noPath-expected.json +3 -3
  220. package/test/resources/9999999/asset/resolveId-1295064-withPath-expected.json +3 -3
  221. package/test/resources/9999999/asset/retrieve-templatebasedemail-expected.json +65 -0
  222. package/test/resources/9999999/asset/template-emailTemplate-expected.json +20 -0
  223. package/test/resources/9999999/asset/template-templatebasedemail-expected.json +65 -0
  224. package/test/resources/9999999/asset/template-testExisting_asset_htmlblock-expected.json +29 -0
  225. package/test/resources/9999999/asset/testExisting_asset_htmlblock-retrieve-expected.html +23 -0
  226. package/test/resources/9999999/asset/{block-1157-retrieve-expected.json → testExisting_asset_htmlblock-retrieve-expected.json} +3 -3
  227. package/test/resources/9999999/asset/testExisting_asset_message-html-rcb-key-expected.html +6 -6
  228. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-id-expected.amp +1 -1
  229. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-key-expected.amp +4 -4
  230. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-name-expected.amp +1 -1
  231. package/test/resources/9999999/asset/testExisting_asset_message-text-rcb-key-expected.amp +4 -4
  232. package/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json +4 -4
  233. package/test/resources/9999999/asset/v1/content/assets/1295065/get-response.json +60 -0
  234. package/test/resources/9999999/asset/v1/content/assets/1295066/get-response.json +60 -0
  235. package/test/resources/9999999/asset/v1/content/assets/5289/get-response.json +75 -0
  236. package/test/resources/9999999/asset/v1/content/assets/808714/get-response.json +3 -3
  237. package/test/resources/9999999/asset/v1/content/assets/950143/get-response.json +97 -0
  238. package/test/resources/9999999/asset/v1/content/assets/get-response-customerKey=testExisting_asset.json +1 -1
  239. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN195,196,197,198,199,200,201,202,203,210,211,212,213,3.json +78 -2
  240. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,14,193,194,15,195,196,197,198,199,200,201,202,203,210,211,212,213,3,207,208,209,5,214,4,215,216.json +370 -0
  241. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,14,193,194,15,195,196,197,198,199,200,201,202,203,210,211,212,213,3,215,216,217,218,219,220,221,222.json +243 -0
  242. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1,207,208,209,5.json +229 -0
  243. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1.json +98 -1
  244. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN217,218,219,220,221,222,223,224,225,226,227,228.json +7 -0
  245. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN223,224,225,226,227,228,214,4.json +35 -0
  246. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN223,224,225,226,227,228.json +7 -0
  247. package/test/resources/9999999/asset/v1/content/assets/query/{post-response-customerKey=mcdev-issue-1157.json → post-response-customerKey=testExisting_asset_htmlblock.json} +2 -2
  248. package/test/resources/9999999/automation/v1/queries/get-response-Name=testExisting_query.json +24 -0
  249. package/test/resources/9999999/automation/v1/scripts/get-response-name=testExisting_script.json +17 -0
  250. package/test/resources/9999999/automation/v1/scripts/get-response.json +2 -2
  251. package/test/resources/9999999/dataFolder/retrieve-ContentType=asset-shared-QAA-response.xml +70 -0
  252. package/test/resources/9999999/dataFolder/retrieve-ContentType=asset-shared-response.xml +70 -0
  253. package/test/resources/9999999/dataFolder/retrieve-ContentType=journey-response.xml +48 -0
  254. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-sha,automatio,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,triggered,triggered,useriniti-response.xml +519 -0
  255. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-sha,dataexten,salesforc,shared_da,shared_da,shared_sa,synchroni,automatio,useriniti,journey,mysubs,list,publicati,queryacti,ssjsactiv,triggered,triggered-response.xml +519 -0
  256. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,journey-response.xml +92 -0
  257. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +115 -0
  258. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,ssjsactivity-response.xml +92 -0
  259. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared-QAA-response.xml +70 -0
  260. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset-shared,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +431 -0
  261. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINautomations,queryactivity-response.xml +70 -0
  262. package/test/resources/9999999/dataFolder/{retrieve-response.xml → retrieve-ContentTypeINdataextension,hidden,queryactivity,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +32 -119
  263. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINdataextension,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +117 -0
  264. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINhidden,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml +46 -0
  265. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINshared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +251 -0
  266. package/test/resources/9999999/dataFolder/retrieve-response-.xml +519 -0
  267. package/test/resources/9999999/event/build-expected.json +0 -1
  268. package/test/resources/9999999/event/get-expected.json +0 -1
  269. package/test/resources/9999999/event/post_withExistingDE-callout-expected.json +3 -0
  270. package/test/resources/9999999/event/post_withExistingDE-expected.json +2 -0
  271. package/test/resources/9999999/event/post_withSchema-callout-expected.json +3 -0
  272. package/test/resources/9999999/event/post_withSchema-expected.json +2 -0
  273. package/test/resources/9999999/event/put-callout-expected.json +3 -1
  274. package/test/resources/9999999/event/put-expected.json +2 -2
  275. package/test/resources/9999999/event/template-expected.json +0 -1
  276. package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/put-response.json +2 -1
  277. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withExistingDE-response.json +2 -0
  278. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withSchema-response.json +2 -0
  279. package/test/resources/9999999/interaction/v1/interactions/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/get-response.json +4 -4
  280. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Quicksend/get-response.json +4 -4
  281. package/test/resources/9999999/interaction/v1/interactions/publishAsync/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/post-response.json +4 -0
  282. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-failed.json +34 -0
  283. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-success.json +5 -0
  284. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-successWarnings.json +36 -0
  285. package/test/resources/9999999/journey/build-expected.json +5 -5
  286. package/test/resources/9999999/journey/get-multistep-expected.json +1 -1
  287. package/test/resources/9999999/journey/get-quicksend-expected.json +5 -5
  288. package/test/resources/9999999/journey/get-quicksend-rcb-id-expected.json +1 -1
  289. package/test/resources/9999999/journey/get-quicksend-rcb-key-expected.json +7 -7
  290. package/test/resources/9999999/journey/get-quicksend-rcb-name-expected.json +1 -1
  291. package/test/resources/9999999/journey/post-expected.json +1 -1
  292. package/test/resources/9999999/journey/publish-callout-expected.json +1 -0
  293. package/test/resources/9999999/journey/put-expected.json +1 -1
  294. package/test/resources/9999999/journey/template-expected.json +5 -5
  295. package/test/resources/9999999/mobileKeyword/build-expected.json +1 -0
  296. package/test/resources/9999999/mobileKeyword/get-expected.json +1 -0
  297. package/test/resources/9999999/mobileKeyword/post-create-expected.json +1 -0
  298. package/test/resources/9999999/mobileKeyword/template-expected.json +1 -0
  299. package/test/resources/{1111111/accountUser/retrieve-CustomerKey=testExisting_userANDActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml → 9999999/queryDefinition/retrieve-CustomerKey=badANDStatus=Active-response.xml} +10 -11
  300. package/test/resources/9999999/script/get_ampincluded-rcb-key-expected.html +2 -2
  301. package/test/resources/9999999/script/get_ampscript-expected.html +1 -0
  302. package/test/resources/9999999/script/get_ampscript-rcb-id-expected.html +1 -0
  303. package/test/resources/9999999/script/get_ampscript-rcb-key-expected.html +3 -2
  304. package/test/resources/9999999/script/get_ampscript-rcb-name-expected.html +3 -0
  305. package/test/resources/9999999/script/get_mixed-expected.html +2 -2
  306. package/test/resources/9999999/script/get_mixed-rcb-key-expected.html +2 -2
  307. package/test/resources/9999999/senderProfile/get-rcb-key-expected.json +4 -4
  308. package/test/resources/9999999/senderProfile/retrieve-response.xml +1 -1
  309. package/test/resources/9999999/triggeredSend/get-rcb-key-expected.json +4 -4
  310. package/test/resources/9999999/triggeredSendDefinition/retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml +1 -1
  311. package/test/type.asset.test.js +189 -39
  312. package/test/type.automation.test.js +134 -58
  313. package/test/type.dataExtract.test.js +4 -4
  314. package/test/type.emailSend.test.js +3 -3
  315. package/test/type.event.test.js +0 -2
  316. package/test/type.journey.test.js +322 -9
  317. package/test/type.query.test.js +33 -29
  318. package/test/type.script.test.js +61 -11
  319. package/test/type.senderProfile.test.js +36 -3
  320. package/test/type.transactionalEmail.test.js +3 -3
  321. package/test/type.triggeredSend.test.js +75 -6
  322. package/test/utils.js +13 -3
  323. package/types/mcdev.d.js +27 -1
  324. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-response.xml → retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-QAA-response.xml} +0 -0
  325. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=falseANDEmaillike@-response.xml → retrieve-ActiveFlag=falseANDEmaillike@-QAA-response.xml} +0 -0
  326. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-response.xml → retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-QAA-response.xml} +0 -0
  327. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml → retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-QAA-response.xml} +0 -0
  328. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDEmaillike@-response.xml → retrieve-ActiveFlag=trueANDEmaillike@-QAA-response.xml} +0 -0
  329. /package/test/resources/1111111/businessUnit/{retrieve-ID=1111111-response.xml → retrieve-ID=1111111-QAA-response.xml} +0 -0
  330. /package/test/resources/1111111/dataFolder/{retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml → retrieve-ContentTypeINdataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +0 -0
  331. /package/test/resources/1111111/dataFolder/{retrieve-response.xml → retrieve-response-.xml} +0 -0
  332. /package/test/resources/9999999/dataFolder/{retrieve-ContentType=asset-sharedORContentType=asset-response.xml → retrieve-ContentTypeINasset,asset-shared-response.xml} +0 -0
  333. /package/test/resources/9999999/dataFolder/{retrieve-ContentType=contextual_suppression_listORContentType=publicationORContentType=suppression_listORContentType=mysubsORContentType=list-response.xml → retrieve-ContentTypeINcontextual_suppression_list,list,mysubs,publication,suppression_list-response.xml} +0 -0
  334. /package/test/resources/9999999/dataFolder/{retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml → retrieve-ContentTypeINdataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +0 -0
  335. /package/test/resources/9999999/dataFolder/{retrieve-ContentType=triggered_send_journeybuilderORContentType=triggered_sendORContentType=hidden-response.xml → retrieve-ContentTypeINhidden,triggered_send,triggered_send_journeybuilder-response.xml} +0 -0
@@ -86,7 +86,7 @@ class Journey extends MetadataType {
86
86
  // caching or single retrieve
87
87
  return await super.retrieveREST(
88
88
  retrieveDir,
89
- `${uri}${singleKey}?extras=${extras}`,
89
+ `${uri}${singleKey}?extras=${extras}${key && key.includes('/') ? '&versionNumber=' + key.split('/')[1] : ''}`,
90
90
  null,
91
91
  key
92
92
  );
@@ -106,46 +106,52 @@ class Journey extends MetadataType {
106
106
  }
107
107
  // full details for retrieve
108
108
  const extras = extrasDefault;
109
+ let parsed;
110
+ if (retrieveDir) {
111
+ // get extra details for saving this
112
+ const details = results.items
113
+ ? await Promise.all(
114
+ results.items.map(async (a) => {
115
+ try {
116
+ return await this.client.rest.get(
117
+ `${uri}key:${a[this.definition.keyField]}?extras=${extras}` +
118
+ `&versionNumber=${a.version}`
119
+ );
120
+ } catch (ex) {
121
+ // if we do get here, we should log the error and continue instead of failing to download all automations
122
+ Util.logger.warn(
123
+ ` ☇ skipping ${this.definition.type} ${
124
+ a[this.definition.nameField]
125
+ } (${a[this.definition.keyField]}): ${ex.message} (${
126
+ ex.code
127
+ })${
128
+ ex.endpoint
129
+ ? Util.getGrayMsg(
130
+ ' - ' +
131
+ ex.endpoint.split(
132
+ 'rest.marketingcloudapis.com'
133
+ )[1]
134
+ )
135
+ : ''
136
+ }`
137
+ );
138
+ return null;
139
+ }
140
+ })
141
+ )
142
+ : [];
143
+ parsed = this.parseResponseBody({ items: details.filter(Boolean) });
144
+ // * retrieveDir is mandatory in this method as it is not used for caching (there is a seperate method for that)
145
+ const savedMetadata = await this.saveResults(parsed, retrieveDir, null, null);
146
+ Util.logger.info(
147
+ `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` +
148
+ Util.getKeysString(key)
149
+ );
150
+ } else {
151
+ // limit to main details for caching
152
+ parsed = this.parseResponseBody(results);
153
+ }
109
154
 
110
- const details = results.items
111
- ? await Promise.all(
112
- results.items.map(async (a) => {
113
- try {
114
- return await this.client.rest.get(
115
- `${uri}key:${a[this.definition.keyField]}?extras=${extras}` +
116
- `&versionNumber=${a.version}`
117
- );
118
- } catch (ex) {
119
- // if we do get here, we should log the error and continue instead of failing to download all automations
120
- Util.logger.warn(
121
- ` ☇ skipping ${this.definition.type} ${
122
- a[this.definition.nameField]
123
- } (${a[this.definition.keyField]}): ${ex.message} (${
124
- ex.code
125
- })${
126
- ex.endpoint
127
- ? Util.getGrayMsg(
128
- ' - ' +
129
- ex.endpoint.split(
130
- 'rest.marketingcloudapis.com'
131
- )[1]
132
- )
133
- : ''
134
- }`
135
- );
136
- return null;
137
- }
138
- })
139
- )
140
- : [];
141
- const parsed = this.parseResponseBody({ items: details.filter(Boolean) });
142
-
143
- // * retrieveDir is mandatory in this method as it is not used for caching (there is a seperate method for that)
144
- const savedMetadata = await this.saveResults(parsed, retrieveDir, null, null);
145
- Util.logger.info(
146
- `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` +
147
- Util.getKeysString(key)
148
- );
149
155
  return {
150
156
  metadata: parsed,
151
157
  type: this.definition.type,
@@ -332,7 +338,7 @@ class Journey extends MetadataType {
332
338
  // event / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
333
339
  if (
334
340
  metadata.triggers?.length > 0 &&
335
- metadata.triggers[0].metaData?.eventDefinitionKey
341
+ metadata.triggers[0].metaData?.eventDefinitionId
336
342
  ) {
337
343
  // trigger found; there can only be one entry in this array
338
344
  try {
@@ -346,8 +352,10 @@ class Journey extends MetadataType {
346
352
  Util.logger.debug(
347
353
  `eventDefinitionKey not matching eventDefinitionId. Overwriting '${metadata.triggers[0].metaData.eventDefinitionKey}' with the correct key '${edKey}'.`
348
354
  );
349
- metadata.triggers[0].metaData.eventDefinitionKey = edKey;
350
355
  }
356
+ metadata.triggers[0].metaData.r__event_key = edKey;
357
+
358
+ delete metadata.triggers[0].metaData.eventDefinitionKey;
351
359
  delete metadata.triggers[0].metaData.eventDefinitionId;
352
360
  } catch (ex) {
353
361
  Util.logger.warn(
@@ -486,6 +494,7 @@ class Journey extends MetadataType {
486
494
  const configurationArguments = activity.configurationArguments;
487
495
  if (configurationArguments) {
488
496
  try {
497
+ // configurationArguments.triggeredSendKey && configurationArguments.triggeredSendId are only set on a running journey; if a journey is new, they do not exist
489
498
  if (configurationArguments.triggeredSendId) {
490
499
  // triggeredSendKey is not always set but triggeredSendId is
491
500
  const tsKey = cache.searchForField(
@@ -536,6 +545,38 @@ class Journey extends MetadataType {
536
545
  if (triggeredSend) {
537
546
  // this section is likely only relevant for QuickSends and not for Multi-Step Journeys
538
547
 
548
+ // triggeredSend key
549
+ if (triggeredSend.id) {
550
+ // triggeredSendKey is not always set but id is
551
+ const tsKey = cache.searchForField(
552
+ 'triggeredSend',
553
+ triggeredSend.id,
554
+ 'ObjectID',
555
+ 'CustomerKey'
556
+ );
557
+ if (triggeredSend.key != tsKey) {
558
+ Util.logger.debug(
559
+ `key not matching id. Overwriting '${triggeredSend.key}' with the correct key '${tsKey}'.`
560
+ );
561
+ triggeredSend.key = tsKey;
562
+ }
563
+ triggeredSend.r__triggeredSend_key = triggeredSend.key;
564
+ delete triggeredSend.key;
565
+ delete triggeredSend.id;
566
+ } else if (triggeredSend.key) {
567
+ // very rare case but it's been seen that no id was saved
568
+ Util.logger.debug(
569
+ `key found on triggeredSend but no id present on journey activity. Checking key directly...`
570
+ );
571
+ triggeredSend.r__triggeredSend_key = cache.searchForField(
572
+ 'triggeredSend',
573
+ triggeredSend.key,
574
+ 'CustomerKey',
575
+ 'CustomerKey'
576
+ );
577
+ delete triggeredSend.key;
578
+ }
579
+
539
580
  // List (optional)
540
581
  triggeredSend.r__list_PathName = {};
541
582
  if (triggeredSend.publicationListId) {
@@ -838,17 +879,17 @@ class Journey extends MetadataType {
838
879
  // ~~~ TRIGGERS ~~~~
839
880
 
840
881
  // event / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
841
- if (
842
- metadata.triggers?.length > 0 &&
843
- metadata.triggers[0].metaData?.eventDefinitionKey
844
- ) {
882
+ if (metadata.triggers?.length > 0 && metadata.triggers[0].metaData?.r__event_key) {
845
883
  // trigger found; there can only be one entry in this array
846
884
  metadata.triggers[0].metaData.eventDefinitionId = cache.searchForField(
847
885
  'event',
848
- metadata.triggers[0].metaData.eventDefinitionKey,
886
+ metadata.triggers[0].metaData.r__event_key,
849
887
  'eventDefinitionKey',
850
888
  'id'
851
889
  );
890
+ metadata.triggers[0].metaData.eventDefinitionKey =
891
+ metadata.triggers[0].metaData.r__event_key;
892
+ delete metadata.triggers[0].metaData.r__event_key;
852
893
  }
853
894
 
854
895
  // transactionalEmail / definitionType==='Transactional' && channel==='email' && triggers[].type === 'transactional-api'
@@ -949,7 +990,7 @@ class Journey extends MetadataType {
949
990
  // triggeredSend + email+asset
950
991
  // TODO email / asset
951
992
  const configurationArguments = activity.configurationArguments;
952
- if (configurationArguments && configurationArguments.r__triggeredSend_key) {
993
+ if (configurationArguments?.r__triggeredSend_key) {
953
994
  // triggeredSendKey is not always set but triggeredSendId is
954
995
  configurationArguments.triggeredSendId = cache.searchForField(
955
996
  'triggeredSend',
@@ -963,6 +1004,19 @@ class Journey extends MetadataType {
963
1004
  }
964
1005
  const triggeredSend = configurationArguments?.triggeredSend;
965
1006
  if (triggeredSend) {
1007
+ // triggeredSend key
1008
+ if (triggeredSend.r__triggeredSend_key) {
1009
+ // key is not always set but id is
1010
+ triggeredSend.id = cache.searchForField(
1011
+ 'triggeredSend',
1012
+ triggeredSend.r__triggeredSend_key,
1013
+ 'CustomerKey',
1014
+ 'ObjectID'
1015
+ );
1016
+ triggeredSend.key = triggeredSend.r__triggeredSend_key;
1017
+ delete triggeredSend.r__triggeredSend_key;
1018
+ }
1019
+
966
1020
  // List (optional)
967
1021
  if (triggeredSend.r__list_PathName) {
968
1022
  if (triggeredSend.r__list_PathName.publicationList) {
@@ -1175,9 +1229,11 @@ class Journey extends MetadataType {
1175
1229
  /**
1176
1230
  *
1177
1231
  * @param {MetadataTypeItem} item single metadata item
1232
+ * @param {string} [_] parameter not used
1233
+ * @param {Set.<string>} [findAssetKeys] list of keys that were found referenced via ContentBlockByX; if set, method only gets keys and runs no updates
1178
1234
  * @returns {Promise.<MetadataTypeItem>} key of the item that was updated
1179
1235
  */
1180
- static async replaceCbReference(item) {
1236
+ static async replaceCbReference(item, _, findAssetKeys) {
1181
1237
  const parentName = `${this.definition.type} ${item[this.definition.keyField]}`;
1182
1238
  let changes = false;
1183
1239
  let error;
@@ -1198,7 +1254,8 @@ class Journey extends MetadataType {
1198
1254
  try {
1199
1255
  activity.arguments.emailSubjectDataBound = ReplaceCbReference.replaceReference(
1200
1256
  activity.arguments.emailSubjectDataBound,
1201
- parentName
1257
+ parentName,
1258
+ findAssetKeys
1202
1259
  );
1203
1260
  changes = true;
1204
1261
  } catch (ex) {
@@ -1213,7 +1270,8 @@ class Journey extends MetadataType {
1213
1270
  try {
1214
1271
  triggeredSend.bccEmail = ReplaceCbReference.replaceReference(
1215
1272
  triggeredSend.bccEmail,
1216
- parentName
1273
+ parentName,
1274
+ findAssetKeys
1217
1275
  );
1218
1276
  changes = true;
1219
1277
  } catch (ex) {
@@ -1224,7 +1282,8 @@ class Journey extends MetadataType {
1224
1282
  try {
1225
1283
  triggeredSend.ccEmail = ReplaceCbReference.replaceReference(
1226
1284
  triggeredSend.ccEmail,
1227
- parentName
1285
+ parentName,
1286
+ findAssetKeys
1228
1287
  );
1229
1288
  changes = true;
1230
1289
  } catch (ex) {
@@ -1235,7 +1294,8 @@ class Journey extends MetadataType {
1235
1294
  try {
1236
1295
  triggeredSend.dynamicEmailSubject = ReplaceCbReference.replaceReference(
1237
1296
  triggeredSend.dynamicEmailSubject,
1238
- parentName
1297
+ parentName,
1298
+ findAssetKeys
1239
1299
  );
1240
1300
  changes = true;
1241
1301
  } catch (ex) {
@@ -1246,7 +1306,8 @@ class Journey extends MetadataType {
1246
1306
  try {
1247
1307
  triggeredSend.emailSubject = ReplaceCbReference.replaceReference(
1248
1308
  triggeredSend.emailSubject,
1249
- parentName
1309
+ parentName,
1310
+ findAssetKeys
1250
1311
  );
1251
1312
  changes = true;
1252
1313
  } catch (ex) {
@@ -1257,7 +1318,8 @@ class Journey extends MetadataType {
1257
1318
  try {
1258
1319
  triggeredSend.preHeader = ReplaceCbReference.replaceReference(
1259
1320
  triggeredSend.preHeader,
1260
- parentName
1321
+ parentName,
1322
+ findAssetKeys
1261
1323
  );
1262
1324
  changes = true;
1263
1325
  } catch (ex) {
@@ -1268,7 +1330,8 @@ class Journey extends MetadataType {
1268
1330
  try {
1269
1331
  triggeredSend.exclusionFilter = ReplaceCbReference.replaceReference(
1270
1332
  triggeredSend.exclusionFilter,
1271
- parentName
1333
+ parentName,
1334
+ findAssetKeys
1272
1335
  );
1273
1336
  changes = true;
1274
1337
  } catch (ex) {
@@ -1295,6 +1358,217 @@ class Journey extends MetadataType {
1295
1358
  // no error means we have a new item to deploy and need to update the item in our retrieve folder
1296
1359
  return item;
1297
1360
  }
1361
+ /**
1362
+ * Gets executed after deployment of metadata type
1363
+ *
1364
+ * @param {MetadataTypeMap} upsertResults metadata mapped by their keyField as returned by update/create
1365
+ */
1366
+ static async postDeployTasks(upsertResults) {
1367
+ if (Util.OPTIONS.publish) {
1368
+ Util.logger.info(`Publishing: ${this.definition.type}`);
1369
+ // pubslih
1370
+ const idArr = Object.values(upsertResults).map(
1371
+ (item) => 'id:' + item.id + '/' + item.version
1372
+ );
1373
+ await this.publish(idArr);
1374
+ }
1375
+ }
1376
+ /**
1377
+ * a function to publish the journey via API
1378
+ *
1379
+ * @param {string[]} keyArr keys or ids of the metadata
1380
+ * @returns {Promise.<string[]>} Returns list of updated keys/ids that were published. Success could only be seen with a delay in the UI because the publish-endpoint is async
1381
+ */
1382
+ static async publish(keyArr) {
1383
+ const results = [];
1384
+ // works only with objectId
1385
+ let objectId;
1386
+ let idFound = false;
1387
+ let versionFound = false;
1388
+ const statusUrls = [];
1389
+ for (let key of keyArr) {
1390
+ let version;
1391
+ if (key) {
1392
+ if (key.startsWith('%23')) {
1393
+ // if the key started with %23 assume an ID was copied from the URL but the user forgot to prefix it with id:
1394
+ // correct the format
1395
+ key = 'id:' + key.slice(3);
1396
+ }
1397
+ if (key.startsWith('id:')) {
1398
+ idFound = true;
1399
+ // ! allow selecting journeys by ID because that's what users see in the URL
1400
+ // remove id
1401
+ objectId = key.slice(3);
1402
+ if (objectId.startsWith('%23')) {
1403
+ // in the journey URL the Id is prefixed with an HTML-encoded "#" which could accidentally be copied by users
1404
+ // despite the slicing above, this still needs testing here because users might have prefixed the ID with id: but did not know to remove the #23
1405
+ objectId = objectId.slice(3);
1406
+ // correct the format to ensure we show sth readable in the "Downloaded" log
1407
+ objectId = 'id:' + objectId;
1408
+ // update this here to show it in the log
1409
+ key = objectId;
1410
+ }
1411
+ if (objectId.includes('/')) {
1412
+ versionFound = true;
1413
+ version = objectId.split('/')[1];
1414
+ // in the journey URL the version is appended after the ID, separated by a forward-slash. Needs to be removed from the ID for caching as we always aim to retrieve the latest version only
1415
+ objectId = objectId.split('/')[0];
1416
+ } else {
1417
+ // if we didn't find a version we need to cache this from the API after all
1418
+ objectId = null;
1419
+ if (key.includes('/')) {
1420
+ // in the journey URL the version is appended after the ID, separated by a forward-slash. Needs to be removed from the key for caching as we always aim to retrieve the latest version only
1421
+ key = key.split('/')[0];
1422
+ }
1423
+ }
1424
+ }
1425
+ if (!objectId) {
1426
+ Util.logger.info(
1427
+ ` - getting${!idFound && !versionFound ? ' ID and' : ''} latest version from server`
1428
+ );
1429
+ const metadataMap = await this.retrieveForCache(undefined, undefined, key);
1430
+ const journey = Object.values(metadataMap.metadata);
1431
+ if (!journey.length) {
1432
+ Util.logger.info(`Skipping ${key} - did not find an item with such key`);
1433
+ continue;
1434
+ }
1435
+ objectId = journey[0].id;
1436
+ version = journey[0].version;
1437
+ if (!objectId || !version) {
1438
+ Util.logger.info(`Skipping ${key} - did not find an item with such key`);
1439
+ continue;
1440
+ }
1441
+ }
1442
+ }
1443
+
1444
+ results.push(
1445
+ (async () => {
1446
+ try {
1447
+ const response = await this.client.rest.post(
1448
+ `/interaction/v1/interactions/publishAsync/${objectId}?versionNumber=${version}`,
1449
+ {}
1450
+ ); // payload is empty for this request
1451
+ if (response.statusUrl && response.statusId) {
1452
+ Util.logger.info(
1453
+ ` - queued for publishing ${this.definition.type}: ${key}`
1454
+ );
1455
+ statusUrls.push({ key, statusUrl: response.statusUrl });
1456
+ } else {
1457
+ throw new Error(response);
1458
+ }
1459
+ return key;
1460
+ } catch (ex) {
1461
+ if (ex.message === 'Cannot publish interaction in Published status.') {
1462
+ Util.logger.info(
1463
+ ` - ${this.definition.type} ${key} is already published`
1464
+ );
1465
+ } else if (ex.message === 'Cannot publish interaction in Stopped status.') {
1466
+ Util.logger.warn(
1467
+ ` - ${this.definition.type} ${key} is already published but stopped. Please resume it manually.`
1468
+ );
1469
+ } else {
1470
+ Util.logger.error(
1471
+ `Failed to publish ${this.definition.type} ${key}: ${ex.message}`
1472
+ );
1473
+ }
1474
+ }
1475
+ })()
1476
+ );
1477
+ }
1478
+ const executedKeyArr = (await Promise.all(results)).filter(Boolean);
1479
+
1480
+ if (!Util.OPTIONS.skipStatusCheck && statusUrls.length) {
1481
+ Util.logger.info(
1482
+ `Checking status of ${statusUrls.length} published item${statusUrls.length === 1 ? '' : 's'}`
1483
+ );
1484
+ executedKeyArr.length = 0;
1485
+ await Util.sleep(5000);
1486
+ for (const item of statusUrls) {
1487
+ executedKeyArr.push(await this._checkPublishStatus(item.statusUrl, item.key));
1488
+ }
1489
+ // return executedKeyArr;
1490
+ }
1491
+ Util.logger.info(
1492
+ `Published ${executedKeyArr.filter(Boolean).length} of ${keyArr.length} items`
1493
+ );
1494
+ return executedKeyArr.filter(Boolean);
1495
+ }
1496
+ /**
1497
+ * helper for {@link Journey.publish}
1498
+ *
1499
+ * @param {string} statusUrl URL to check the status of the publish request
1500
+ * @param {string} key key or id for log messages
1501
+ * @param {number} [tries] number of tries used to check the status
1502
+ * @returns {Promise.<string>} key of the item that was published successfully
1503
+ */
1504
+ static async _checkPublishStatus(statusUrl, key, tries = 1) {
1505
+ try {
1506
+ const response = await this.client.rest.get(statusUrl);
1507
+ switch (response.status) {
1508
+ case 'PublishCompleted': {
1509
+ Util.logger.info(` - ${this.definition.type} ${key}: publishing succeeded`);
1510
+ this._showPublishStatusDetails(response);
1511
+ return key;
1512
+ }
1513
+ case 'PublishInProcess': {
1514
+ Util.logger.info(
1515
+ ` - ${this.definition.type} ${key}: publishing still in progress`
1516
+ );
1517
+ if (tries < 50) {
1518
+ await (tries < 10 ? Util.sleep(2000) : Util.sleep(5000));
1519
+ return await this._checkPublishStatus(statusUrl, key, tries + 1);
1520
+ } else {
1521
+ return;
1522
+ }
1523
+ }
1524
+ case 'Error': {
1525
+ Util.logger.error(` - ${this.definition.type} ${key}: publishing failed.`);
1526
+ this._showPublishStatusDetails(response);
1527
+ return;
1528
+ }
1529
+ // No default
1530
+ }
1531
+ } catch (ex) {
1532
+ Util.logger.error(`Failed to check status of ${key}: ${ex.message}`);
1533
+ }
1534
+ }
1535
+
1536
+ /**
1537
+ * helper for {@link Journey._checkPublishStatus}
1538
+ *
1539
+ * @param {{status:string, errors:Array, warnings:Array}} response publishStatus response
1540
+ */
1541
+ static _showPublishStatusDetails(response) {
1542
+ const types = { errors: 'Errors', warnings: 'Warnings' };
1543
+ const messages = { errors: [], warnings: [] };
1544
+ for (const type in types) {
1545
+ let counter = 1;
1546
+ if (response[type] && response[type].length) {
1547
+ messages[type].push(` ${types[type]}:`);
1548
+ for (const msg of response[type]) {
1549
+ messages[type].push(
1550
+ ` #${counter++}`,
1551
+ ` Code: ${msg.errorCode}`,
1552
+ ` Details: ${msg.errorDetail}`
1553
+ );
1554
+ if (msg.additionalInfo && Object.keys(msg.additionalInfo).length) {
1555
+ messages[type].push(` Additional Info:`);
1556
+ for (const key in msg.additionalInfo) {
1557
+ messages[type].push(` ${key}: ${msg.additionalInfo[key]}`);
1558
+ }
1559
+ }
1560
+ // add spacer line
1561
+ messages[type].push('');
1562
+ }
1563
+ }
1564
+ }
1565
+ for (const msg of messages.errors) {
1566
+ Util.logger.error(msg);
1567
+ }
1568
+ for (const msg of messages.warnings) {
1569
+ Util.logger.warn(' ' + msg);
1570
+ }
1571
+ }
1298
1572
  }
1299
1573
 
1300
1574
  // Assign definition to static attributes