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
@@ -19,6 +19,7 @@ import pLimit from 'p-limit';
19
19
  * @typedef {import('../../types/mcdev.d.js').SDKError} SDKError
20
20
  * @typedef {import('../../types/mcdev.d.js').SoapRequestParams} SoapRequestParams
21
21
  * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
22
+ * @typedef {import('../../types/mcdev.d.js').TypeKeyCombo} TypeKeyCombo
22
23
  */
23
24
  /**
24
25
  * @typedef {import('../../types/mcdev.d.js').AutomationItem} AutomationItem
@@ -1620,6 +1621,39 @@ class Automation extends MetadataType {
1620
1621
  // delete local copy: retrieve/cred/bu/.../...-doc.md
1621
1622
  await super.postDeleteTasks(customerKey, [`${this.definition.type}-doc.md`]);
1622
1623
  }
1624
+
1625
+ /**
1626
+ * helper for {@link MetadataType.getNestedValue} - adjusted for automation activities
1627
+ *
1628
+ * @param {any} obj the metadataItem to search in (or the result)
1629
+ * @param {string[]} nestedKeyParts key in dot-notation split into parts
1630
+ * @param {string} dependentType used for types that need custom handling
1631
+ * @returns {(string) | (string)[]} result
1632
+ */
1633
+ static getNestedValueHelper(obj, nestedKeyParts, dependentType) {
1634
+ if (nestedKeyParts.length == 0) {
1635
+ // key was found; append '' to ensure we always return a string
1636
+ return obj + '';
1637
+ }
1638
+ // get most left key
1639
+ const key = nestedKeyParts.shift();
1640
+ if (!obj[key]) {
1641
+ // key was not found
1642
+ return;
1643
+ }
1644
+ if (Array.isArray(obj[key])) {
1645
+ return obj[key].flatMap((x) =>
1646
+ this.getNestedValueHelper(x, [...nestedKeyParts], dependentType)
1647
+ );
1648
+ } else {
1649
+ if (nestedKeyParts.length == 0) {
1650
+ // key was found if length is 0 and search field (r__type) is equal the current type, else, keep going
1651
+ return obj[key] === dependentType ? obj.r__key : undefined;
1652
+ } else {
1653
+ return this.getNestedValueHelper(obj[key], [...nestedKeyParts], dependentType);
1654
+ }
1655
+ }
1656
+ }
1623
1657
  }
1624
1658
 
1625
1659
  // Assign definition to static attributes
@@ -10,7 +10,7 @@ import File from '../util/file.js';
10
10
  import auth from '../util/auth.js';
11
11
  import cache from '../util/cache.js';
12
12
  import pLimit from 'p-limit';
13
- import inquirer from 'inquirer';
13
+ import { checkbox } from '@inquirer/prompts';
14
14
 
15
15
  /**
16
16
  * @typedef {import('../../types/mcdev.d.js').BuObject} BuObject
@@ -33,7 +33,7 @@ import inquirer from 'inquirer';
33
33
  * @augments MetadataType
34
34
  */
35
35
  class DataExtension extends MetadataType {
36
- /** @type {DataExtensionFieldMap} */
36
+ /** @type {Object.<string, DataExtensionFieldMap>} key: deKey, value: deFieldMap */
37
37
  static oldFields;
38
38
  /**
39
39
  * Upserts dataExtensions after retrieving them from source and target to compare
@@ -100,16 +100,26 @@ class DataExtension extends MetadataType {
100
100
  .filter((r) => r !== undefined && r !== null)
101
101
  .filter(this.#filterUpsertResults);
102
102
 
103
+ if (Util.OPTIONS.noUpdate && metadataToUpdate.length > 0) {
104
+ Util.logger.info(
105
+ ` ☇ skipping update of ${metadataToUpdate.length} ${this.definition.type}${metadataToUpdate.length == 1 ? '' : 's'}: --noUpdate flag is set`
106
+ );
107
+ }
108
+
103
109
  const updateLimit = pLimit(10);
104
- const updateResults = (
105
- await Promise.allSettled(
106
- metadataToUpdate
107
- .filter((r) => r !== undefined && r !== null)
108
- .map((metadataEntry) => updateLimit(() => this.update(metadataEntry.after)))
109
- )
110
- )
111
- .filter((r) => r !== undefined && r !== null)
112
- .filter(this.#filterUpsertResults);
110
+ const updateResults = Util.OPTIONS.noUpdate
111
+ ? []
112
+ : (
113
+ await Promise.allSettled(
114
+ metadataToUpdate
115
+ .filter((r) => r !== undefined && r !== null)
116
+ .map((metadataEntry) =>
117
+ updateLimit(() => this.update(metadataEntry.after))
118
+ )
119
+ )
120
+ )
121
+ .filter((r) => r !== undefined && r !== null)
122
+ .filter(this.#filterUpsertResults);
113
123
 
114
124
  const successfulResults = [...createResults, ...updateResults];
115
125
  Util.logger.info(
@@ -119,8 +129,8 @@ class DataExtension extends MetadataType {
119
129
  let upsertResults;
120
130
  if (successfulResults.length > 0) {
121
131
  const metadataResults = successfulResults
122
- // @ts-expect-error not sure why this produces a type error. looks 100% correct
123
- .map((r) => r.value.Results[0].Object)
132
+ .map((r) => (r.status === 'fulfilled' ? r.value.Results[0].Object : null))
133
+ .filter(Boolean)
124
134
  .map((r) => {
125
135
  // if only one fields added will return object otherwise array
126
136
  if (Array.isArray(r?.Fields?.Field)) {
@@ -172,7 +182,6 @@ class DataExtension extends MetadataType {
172
182
  DataExtensionField.client = this.client;
173
183
  DataExtensionField.properties = this.properties;
174
184
  DataExtension.oldFields ||= {};
175
- // @ts-expect-error not sure why this produces a type error. looks 100% correct
176
185
  DataExtension.oldFields[metadataMap[metadataKey][this.definition.keyField]] =
177
186
  await DataExtensionField.prepareDeployColumnsOnUpdate(
178
187
  metadataMap[metadataKey].Fields,
@@ -486,24 +495,19 @@ class DataExtension extends MetadataType {
486
495
  value: name,
487
496
  checked: fixBuPreselected.includes(name),
488
497
  }));
489
- const questions = [
490
- {
491
- type: 'checkbox',
492
- name: 'businessUnits',
498
+ let answer = null;
499
+
500
+ try {
501
+ answer = await checkbox({
493
502
  message:
494
503
  'Please select BUs that have access to the updated Shared Data Extensions:',
495
504
  pageSize: 10,
496
505
  choices: buList,
497
- },
498
- ];
499
- let responses = null;
500
-
501
- try {
502
- responses = await inquirer.prompt(questions);
506
+ });
503
507
  } catch (ex) {
504
508
  Util.logger.info(ex);
505
509
  }
506
- return responses.businessUnits;
510
+ return answer;
507
511
  }
508
512
 
509
513
  /**
@@ -821,9 +825,10 @@ class DataExtension extends MetadataType {
821
825
  // get shared folders to match our shared / synched Data Extensions
822
826
  const subTypeArr = this.definition.dependencies
823
827
  .filter((item) => item.startsWith('folder-'))
824
- .map((item) => item.slice(7));
828
+ .map((item) => item.slice(7))
829
+ .filter((item) => Folder.definition.folderTypesFromParent.includes(item));
825
830
  Util.logger.info(' - Caching dependent Metadata: folder (shared via _ParentBU_)');
826
- Util.logSubtypes(subTypeArr);
831
+ Util.logSubtypes(subTypeArr, ' ');
827
832
  Folder.client = this.client;
828
833
  Folder.buObject = this.buObject;
829
834
  Folder.properties = this.properties;
@@ -1325,7 +1330,7 @@ class DataExtension extends MetadataType {
1325
1330
  newJsonElement[field] = element[field];
1326
1331
  }
1327
1332
  }
1328
- // @ts-ignore hard to tell ts that this is in fact a DataExtensionFieldItem
1333
+ // @ts-ignore for document the fields have less values and that leads to an error here.
1329
1334
  newJson.push(newJsonElement);
1330
1335
  }
1331
1336
  fieldsJson = newJson;
@@ -97,7 +97,7 @@ class DataExtensionField extends MetadataType {
97
97
  *
98
98
  * @param {DataExtensionFieldItem[]} deployColumns Columns of data extension that will be deployed
99
99
  * @param {string} deKey external/customer key of Data Extension
100
- * @returns {Promise.<Object.<string, DataExtensionFieldItem>>} existing fields by their original name to allow re-adding FieldType after update
100
+ * @returns {Promise.<DataExtensionFieldMap>} existing fields by their original name to allow re-adding FieldType after update
101
101
  */
102
102
  static async prepareDeployColumnsOnUpdate(deployColumns, deKey) {
103
103
  // create list of DE keys that had changes to their fields to be able to use it as a filter in the --fixShared logic
@@ -132,7 +132,7 @@ class DataExtensionField extends MetadataType {
132
132
  const fieldsObj = response.metadata;
133
133
 
134
134
  // ensure fields can be updated properly by their adding ObjectId based on Name-matching
135
- /** @type {Object.<string, DataExtensionFieldItem>} */
135
+ /** @type {DataExtensionFieldMap} */
136
136
  const existingFieldByName = {};
137
137
 
138
138
  for (const key of Object.keys(fieldsObj)) {
@@ -192,8 +192,27 @@ class Event extends MetadataType {
192
192
 
193
193
  // standard values
194
194
  metadata.isVisibleInPicker ||= false;
195
- metadata.isPlatformObject = false;
196
- metadata.mode = 'Production'; // potentially needs to be set to "1" instead
195
+ if (metadata.isVisibleInPicker && !metadata.sourceApplicationExtensionId) {
196
+ Util.logger.warn(
197
+ ` - ${this.definition.type} ${metadata[this.definition.keyField]}: isVisibleInPicker is true but sourceApplicationExtensionId is missing. Setting isVisibleInPicker to false.`
198
+ );
199
+ metadata.isVisibleInPicker = false;
200
+ }
201
+ metadata.isPlatformObject ||= false;
202
+ metadata.mode ||= 'Production';
203
+ switch (metadata.type) {
204
+ case 'APIEvent': {
205
+ metadata.entrySourceGroupConfigUrl ||=
206
+ 'jb:///data/entry/api-event/entrysourcegroupconfig.json';
207
+ metadata.iconUrl ||= '/images/icon_journeyBuilder-event-api-blue.svg';
208
+ break;
209
+ }
210
+ case 'SalesforceObjectTriggerV2': {
211
+ metadata.iconUrl ||= '/jbint-events/events/SalesforceData/images/SF-Event-Icon.svg';
212
+ break;
213
+ }
214
+ }
215
+
197
216
  return metadata;
198
217
  }
199
218
  /**
@@ -405,6 +424,13 @@ class Event extends MetadataType {
405
424
  }): ${ex.message}.`
406
425
  );
407
426
  }
427
+ if (!metadata.isPlatformObject) {
428
+ delete metadata.isPlatformObject;
429
+ }
430
+ if (metadata.mode === 'Production') {
431
+ delete metadata.mode;
432
+ }
433
+
408
434
  return metadata;
409
435
  }
410
436
  }
@@ -17,6 +17,10 @@ import cache from '../util/cache.js';
17
17
  * @typedef {import('../../types/mcdev.d.js').MetadataTypeMapObj} MetadataTypeMapObj
18
18
  * @typedef {import('../../types/mcdev.d.js').SoapRequestParams} SoapRequestParams
19
19
  * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
20
+ *
21
+ * @typedef {import('../../types/mcdev.d.js').ListItem} ListItem
22
+ * @typedef {import('../../types/mcdev.d.js').ListMap} ListMap
23
+ * @typedef {import('../../types/mcdev.d.js').ListIdMap} ListIdMap
20
24
  */
21
25
 
22
26
  /**
@@ -32,20 +36,27 @@ class Folder extends MetadataType {
32
36
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
33
37
  * @param {string[]} [subTypeArr] content type of folder
34
38
  * @param {string} [key] customer key of single item to retrieve
35
- * @returns {Promise} Promise
39
+ * @returns {Promise.<{metadata: ListMap, type: string}>} Promise
36
40
  */
37
41
  static async retrieve(retrieveDir, additionalFields, subTypeArr, key) {
38
42
  if (key) {
39
43
  Util.logger.error(`Folder.retrieve() does not support key parameter`);
40
44
  }
41
- const queryAllFolders = await this.retrieveHelper(additionalFields, true, subTypeArr);
42
-
45
+ /** @type {ListItem[]} */
46
+ const queryAllFolders = await this.retrieveHelper(additionalFields, false, subTypeArr);
43
47
  if (this.buObject.eid !== this.buObject.mid) {
44
- queryAllFolders.push(
45
- ...(await this.retrieveHelper(additionalFields, false, subTypeArr))
46
- );
48
+ const selectedParentTypes = subTypeArr?.length
49
+ ? subTypeArr.filter((item) => this.definition.folderTypesFromParent.includes(item))
50
+ : subTypeArr;
51
+ if (!subTypeArr?.length || selectedParentTypes.length) {
52
+ queryAllFolders.push(
53
+ ...(await this.retrieveHelper(additionalFields, true, selectedParentTypes))
54
+ );
55
+ }
47
56
  }
57
+
48
58
  const sortPairs = toposort(queryAllFolders.map((a) => [a.ParentFolder.ID, a.ID]));
59
+ /** @type {ListIdMap} */
49
60
  const idMap = {};
50
61
  for (const val of queryAllFolders) {
51
62
  // Contact Builder Lists create a folder called "Audiences" with the same Customer Key as the
@@ -64,6 +75,7 @@ class Folder extends MetadataType {
64
75
  }
65
76
 
66
77
  // create root node for attaching, but will be deleted later
78
+ // @ts-expect-error we set an incomplete ListItem for ID==0 which is flagged by ts
67
79
  idMap[0] = {
68
80
  Name: '<ROOT>',
69
81
  };
@@ -113,6 +125,7 @@ class Folder extends MetadataType {
113
125
  }
114
126
 
115
127
  // build a new map using the customer key instead of id
128
+ /** @type {ListMap} */
116
129
  const metadata = {};
117
130
  for (const id in idMap) {
118
131
  // remove keys which are listed in other BUs and skip root
@@ -156,7 +169,7 @@ class Folder extends MetadataType {
156
169
  `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})`
157
170
  );
158
171
  }
159
- return { metadata: metadata, type: this.definition.type };
172
+ return { metadata, type: this.definition.type };
160
173
  }
161
174
 
162
175
  /**
@@ -164,7 +177,7 @@ class Folder extends MetadataType {
164
177
  *
165
178
  * @param {void | string[]} [_] parameter not used
166
179
  * @param {string[]} [subTypeArr] content type of folder
167
- * @returns {Promise} Promise
180
+ * @returns {Promise.<{metadata: ListMap, type: string}>} Promise
168
181
  */
169
182
  static retrieveForCache(_, subTypeArr) {
170
183
  return this.retrieve(null, null, subTypeArr, null);
@@ -175,8 +188,8 @@ class Folder extends MetadataType {
175
188
  * and comparing to check if create or update operation is needed.
176
189
  * Copied due to having a dependency on itself, meaning the created need to be serial
177
190
  *
178
- * @param {MetadataTypeMap} metadata metadata mapped by their keyField
179
- * @returns {Promise.<object>} Promise of saved metadata
191
+ * @param {ListMap} metadata metadata mapped by their keyField
192
+ * @returns {Promise.<ListMap>} Promise of saved metadata
180
193
  */
181
194
  static async upsert(metadata) {
182
195
  const orignalMetadata = structuredClone(metadata);
@@ -185,6 +198,7 @@ class Folder extends MetadataType {
185
198
  let createCount = 0;
186
199
  let createFailedCount = 0;
187
200
  let filteredByPreDeploy = 0;
201
+ /** @type {ListMap} */
188
202
  const upsertResults = {};
189
203
  const sortPairs = toposort(
190
204
  Object.keys(metadata).map((customerKey) => [
@@ -262,6 +276,15 @@ class Folder extends MetadataType {
262
276
  continue;
263
277
  }
264
278
  }
279
+ if (existingId && Util.OPTIONS.noUpdate) {
280
+ Util.logger.verbose(
281
+ ` - skipping ${this.definition.type} ${
282
+ deployableMetadata?.Path ||
283
+ deployableMetadata[this.definition.nameField]
284
+ }: --noUpdate flag is set`
285
+ );
286
+ continue;
287
+ }
265
288
 
266
289
  let result;
267
290
  // since deployableMetadata will be modified for deploy, make a copy for reference
@@ -339,12 +362,12 @@ class Folder extends MetadataType {
339
362
  /**
340
363
  * creates a folder based on metatadata
341
364
  *
342
- * @param {MetadataTypeItem} metadataEntry metadata of the folder
343
- * @returns {Promise} Promise
365
+ * @param {ListItem} metadataEntry metadata of the folder
366
+ * @returns {Promise.<any>} Promise of api response
344
367
  */
345
368
  static async create(metadataEntry) {
346
- if (metadataEntry?.Parent?.ID === 0) {
347
- Util.logger.error(
369
+ if (metadataEntry?.ParentFolder?.ID === 0) {
370
+ Util.logger.debug(
348
371
  `${this.definition.type}-${metadataEntry.ContentType}.create:: Cannot create Root Folder: ${metadataEntry.Name}`
349
372
  );
350
373
  return {};
@@ -405,7 +428,7 @@ class Folder extends MetadataType {
405
428
  * Updates a single Folder.
406
429
  *
407
430
  * @param {MetadataTypeItem} metadataEntry single metadata entry
408
- * @returns {Promise} Promise
431
+ * @returns {Promise.<any>} Promise of api response
409
432
  */
410
433
  static async update(metadataEntry) {
411
434
  const path = metadataEntry.Path;
@@ -434,8 +457,8 @@ class Folder extends MetadataType {
434
457
  /**
435
458
  * prepares a folder for deployment
436
459
  *
437
- * @param {MetadataTypeItem} metadata a single folder definition
438
- * @returns {Promise.<MetadataTypeItem>} Promise of parsed folder metadata
460
+ * @param {ListItem} metadata a single folder definition
461
+ * @returns {Promise.<ListItem>} Promise of parsed folder metadata
439
462
  */
440
463
  static async preDeployTasks(metadata) {
441
464
  if (!this.definition.deployFolderTypes.includes(metadata.ContentType.toLowerCase())) {
@@ -467,12 +490,7 @@ class Folder extends MetadataType {
467
490
  }
468
491
  // retreive ID based on the matching Path of the parent folder
469
492
  else if (metadata?.ParentFolder?.Path) {
470
- metadata.ParentFolder.ID = cache.searchForField(
471
- 'folder',
472
- metadata.ParentFolder.Path,
473
- 'Path',
474
- 'ID'
475
- );
493
+ metadata.ParentFolder.ID = cache.getFolderId(metadata.ParentFolder.Path);
476
494
  return metadata;
477
495
  } else {
478
496
  Util.metadataLogger(
@@ -488,13 +506,13 @@ class Folder extends MetadataType {
488
506
  /**
489
507
  * Returns file contents mapped to their filename without '.json' ending
490
508
  *
491
- * @param {string} dir directory that contains '.json' files to be read
509
+ * @param {string} dir directory with json files, e.g. /retrieve/cred/bu/folder, /deploy/cred/bu/folder, /template/folder
492
510
  * @param {boolean} [listBadKeys] do not print errors, used for badKeys()
493
- * @returns {Promise.<MetadataTypeMap>} fileName => fileContent map
511
+ * @returns {Promise.<ListMap>} fileName => fileContent map
494
512
  */
495
513
  static async getJsonFromFS(dir, listBadKeys) {
496
514
  try {
497
- /** @type {MetadataTypeMap} */
515
+ /** @type {ListMap} */
498
516
  const fileName2FileContent = {};
499
517
  const directories = File.readDirectoriesSync(dir, 10, true);
500
518
  let newCounter = 0;
@@ -564,28 +582,24 @@ class Folder extends MetadataType {
564
582
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
565
583
  * @param {boolean} [queryAllAccounts] which queryAllAccounts setting to use
566
584
  * @param {string[]} [contentTypeList] content type of folder
567
- * @returns {Promise.<object>} soap object
585
+ * @returns {Promise.<ListItem[]>} soap object
568
586
  */
569
587
  static async retrieveHelper(additionalFields, queryAllAccounts, contentTypeList) {
570
588
  const options = { QueryAllAccounts: !!queryAllAccounts };
571
589
  if (contentTypeList) {
572
- for (const contentType of contentTypeList) {
573
- options.filter = options.filter
574
- ? {
575
- leftOperand: {
576
- leftOperand: 'ContentType',
577
- operator: 'equals',
578
- rightOperand: contentType,
579
- },
580
- operator: 'OR',
581
- rightOperand: options.filter,
582
- }
583
- : {
584
- leftOperand: 'ContentType',
585
- operator: 'equals',
586
- rightOperand: contentType,
587
- };
588
- }
590
+ const newFilter = {
591
+ leftOperand: 'ContentType',
592
+ operator: contentTypeList.length === 1 ? 'equals' : 'IN',
593
+ rightOperand:
594
+ contentTypeList.length === 1 ? contentTypeList[0] : contentTypeList.sort(),
595
+ };
596
+ options.filter = options.filter
597
+ ? {
598
+ leftOperand: newFilter,
599
+ operator: 'OR',
600
+ rightOperand: options.filter,
601
+ }
602
+ : newFilter;
589
603
  }
590
604
  const response = await this.client.soap.retrieveBulk(
591
605
  'DataFolder',
@@ -599,8 +613,8 @@ class Folder extends MetadataType {
599
613
  /**
600
614
  * Gets executed after retreive of metadata type
601
615
  *
602
- * @param {MetadataTypeItem} metadata metadata mapped by their keyField
603
- * @returns {MetadataTypeItem} cloned metadata
616
+ * @param {ListItem} metadata metadata mapped by their keyField
617
+ * @returns {ListItem} cloned metadata
604
618
  */
605
619
  static postRetrieveTasks(metadata) {
606
620
  return structuredClone(metadata);
@@ -608,12 +622,13 @@ class Folder extends MetadataType {
608
622
  /**
609
623
  * Helper for writing Metadata to disk, used for Retrieve and deploy
610
624
  *
611
- * @param {MetadataTypeMap} results metadata results from deploy
625
+ * @param {ListMap} results metadata results from deploy
612
626
  * @param {string} retrieveDir directory where metadata should be stored after deploy/retrieve
613
627
  * @param {number | string} mid unused parameter
614
- * @returns {Promise.<object>} Promise of saved metadata
628
+ * @returns {Promise.<ListMap>} Promise of saved metadata
615
629
  */
616
630
  static async saveResults(results, retrieveDir, mid) {
631
+ /** @type {ListMap} */
617
632
  const savedResults = {};
618
633
  for (const metadataEntry in results) {
619
634
  try {