mcdev 7.0.3 → 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 (380) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +1 -0
  3. package/.github/workflows/code-test.yml +48 -0
  4. package/.husky/post-checkout +1 -1
  5. package/.husky/post-merge +7 -1
  6. package/.husky/pre-commit +3 -1
  7. package/@types/lib/Builder.d.ts +13 -13
  8. package/@types/lib/Builder.d.ts.map +1 -1
  9. package/@types/lib/Deployer.d.ts +19 -16
  10. package/@types/lib/Deployer.d.ts.map +1 -1
  11. package/@types/lib/Retriever.d.ts +15 -15
  12. package/@types/lib/Retriever.d.ts.map +1 -1
  13. package/@types/lib/cli.d.ts +1 -1
  14. package/@types/lib/cli.d.ts.map +1 -1
  15. package/@types/lib/index.d.ts +102 -51
  16. package/@types/lib/index.d.ts.map +1 -1
  17. package/@types/lib/metadataTypes/Asset.d.ts +71 -59
  18. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/AttributeGroup.d.ts +6 -8
  20. package/@types/lib/metadataTypes/AttributeGroup.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/AttributeSet.d.ts +10 -21
  22. package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -1
  23. package/@types/lib/metadataTypes/Automation.d.ts +47 -49
  24. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  25. package/@types/lib/metadataTypes/Campaign.d.ts +12 -18
  26. package/@types/lib/metadataTypes/Campaign.d.ts.map +1 -1
  27. package/@types/lib/metadataTypes/ContentArea.d.ts +13 -31
  28. package/@types/lib/metadataTypes/ContentArea.d.ts.map +1 -1
  29. package/@types/lib/metadataTypes/DataExtension.d.ts +28 -33
  30. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  31. package/@types/lib/metadataTypes/DataExtensionField.d.ts +15 -22
  32. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  33. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts +12 -11
  34. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts.map +1 -1
  35. package/@types/lib/metadataTypes/DataExtract.d.ts +13 -28
  36. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
  37. package/@types/lib/metadataTypes/DataExtractType.d.ts +11 -10
  38. package/@types/lib/metadataTypes/DataExtractType.d.ts.map +1 -1
  39. package/@types/lib/metadataTypes/DeliveryProfile.d.ts +11 -10
  40. package/@types/lib/metadataTypes/DeliveryProfile.d.ts.map +1 -1
  41. package/@types/lib/metadataTypes/Discovery.d.ts +11 -10
  42. package/@types/lib/metadataTypes/Discovery.d.ts.map +1 -1
  43. package/@types/lib/metadataTypes/Email.d.ts +14 -34
  44. package/@types/lib/metadataTypes/Email.d.ts.map +1 -1
  45. package/@types/lib/metadataTypes/EmailSend.d.ts +18 -10
  46. package/@types/lib/metadataTypes/EmailSend.d.ts.map +1 -1
  47. package/@types/lib/metadataTypes/Event.d.ts +22 -16
  48. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  49. package/@types/lib/metadataTypes/FileLocation.d.ts +11 -10
  50. package/@types/lib/metadataTypes/FileLocation.d.ts.map +1 -1
  51. package/@types/lib/metadataTypes/FileTransfer.d.ts +12 -18
  52. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
  53. package/@types/lib/metadataTypes/Filter.d.ts +11 -10
  54. package/@types/lib/metadataTypes/Filter.d.ts.map +1 -1
  55. package/@types/lib/metadataTypes/Folder.d.ts +49 -35
  56. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
  57. package/@types/lib/metadataTypes/ImportFile.d.ts +16 -15
  58. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  59. package/@types/lib/metadataTypes/Journey.d.ts +55 -35
  60. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  61. package/@types/lib/metadataTypes/List.d.ts +13 -12
  62. package/@types/lib/metadataTypes/List.d.ts.map +1 -1
  63. package/@types/lib/metadataTypes/MetadataType.d.ts +73 -26
  64. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  65. package/@types/lib/metadataTypes/MobileCode.d.ts +12 -20
  66. package/@types/lib/metadataTypes/MobileCode.d.ts.map +1 -1
  67. package/@types/lib/metadataTypes/MobileKeyword.d.ts +23 -14
  68. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  69. package/@types/lib/metadataTypes/MobileMessage.d.ts +18 -42
  70. package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -1
  71. package/@types/lib/metadataTypes/Query.d.ts +15 -12
  72. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  73. package/@types/lib/metadataTypes/Role.d.ts +12 -11
  74. package/@types/lib/metadataTypes/Role.d.ts.map +1 -1
  75. package/@types/lib/metadataTypes/Script.d.ts +18 -25
  76. package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
  77. package/@types/lib/metadataTypes/SendClassification.d.ts +13 -10
  78. package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -1
  79. package/@types/lib/metadataTypes/SenderProfile.d.ts +12 -25
  80. package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -1
  81. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +18 -12
  82. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
  83. package/@types/lib/metadataTypes/TransactionalMessage.d.ts +12 -32
  84. package/@types/lib/metadataTypes/TransactionalMessage.d.ts.map +1 -1
  85. package/@types/lib/metadataTypes/TransactionalPush.d.ts +15 -21
  86. package/@types/lib/metadataTypes/TransactionalPush.d.ts.map +1 -1
  87. package/@types/lib/metadataTypes/TransactionalSMS.d.ts +16 -18
  88. package/@types/lib/metadataTypes/TransactionalSMS.d.ts.map +1 -1
  89. package/@types/lib/metadataTypes/TriggeredSend.d.ts +19 -24
  90. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
  91. package/@types/lib/metadataTypes/User.d.ts +23 -40
  92. package/@types/lib/metadataTypes/User.d.ts.map +1 -1
  93. package/@types/lib/metadataTypes/Verification.d.ts +16 -13
  94. package/@types/lib/metadataTypes/Verification.d.ts.map +1 -1
  95. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts +24 -14
  96. package/@types/lib/metadataTypes/definitions/AttributeGroup.definition.d.ts +3 -0
  97. package/@types/lib/metadataTypes/definitions/AttributeSet.definition.d.ts +5 -0
  98. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts +16 -0
  99. package/@types/lib/metadataTypes/definitions/Campaign.definition.d.ts +1 -0
  100. package/@types/lib/metadataTypes/definitions/ContentArea.definition.d.ts +1 -0
  101. package/@types/lib/metadataTypes/definitions/DataExtension.definition.d.ts +1 -0
  102. package/@types/lib/metadataTypes/definitions/DataExtensionField.definition.d.ts +1 -0
  103. package/@types/lib/metadataTypes/definitions/DataExtensionTemplate.definition.d.ts +1 -0
  104. package/@types/lib/metadataTypes/definitions/DataExtract.definition.d.ts +1 -0
  105. package/@types/lib/metadataTypes/definitions/DataExtractType.definition.d.ts +1 -0
  106. package/@types/lib/metadataTypes/definitions/DeliveryProfile.definition.d.ts +1 -0
  107. package/@types/lib/metadataTypes/definitions/Discovery.definition.d.ts +1 -0
  108. package/@types/lib/metadataTypes/definitions/Email.definition.d.ts +1 -0
  109. package/@types/lib/metadataTypes/definitions/EmailSend.definition.d.ts +8 -0
  110. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +10 -1
  111. package/@types/lib/metadataTypes/definitions/FileLocation.definition.d.ts +1 -0
  112. package/@types/lib/metadataTypes/definitions/FileTransfer.definition.d.ts +1 -0
  113. package/@types/lib/metadataTypes/definitions/Filter.definition.d.ts +1 -0
  114. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts +1 -0
  115. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts +5 -0
  116. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +13 -0
  117. package/@types/lib/metadataTypes/definitions/List.definition.d.ts +1 -0
  118. package/@types/lib/metadataTypes/definitions/MobileCode.definition.d.ts +1 -0
  119. package/@types/lib/metadataTypes/definitions/MobileKeyword.definition.d.ts +9 -0
  120. package/@types/lib/metadataTypes/definitions/MobileMessage.definition.d.ts +4 -0
  121. package/@types/lib/metadataTypes/definitions/Query.definition.d.ts +3 -0
  122. package/@types/lib/metadataTypes/definitions/Role.definition.d.ts +1 -0
  123. package/@types/lib/metadataTypes/definitions/Script.definition.d.ts +1 -0
  124. package/@types/lib/metadataTypes/definitions/SendClassification.definition.d.ts +3 -0
  125. package/@types/lib/metadataTypes/definitions/SenderProfile.definition.d.ts +1 -0
  126. package/@types/lib/metadataTypes/definitions/TransactionalEmail.definition.d.ts +6 -0
  127. package/@types/lib/metadataTypes/definitions/TransactionalMessage.definition.d.ts +1 -0
  128. package/@types/lib/metadataTypes/definitions/TransactionalPush.definition.d.ts +3 -0
  129. package/@types/lib/metadataTypes/definitions/TransactionalSMS.definition.d.ts +4 -0
  130. package/@types/lib/metadataTypes/definitions/TriggeredSend.definition.d.ts +6 -0
  131. package/@types/lib/metadataTypes/definitions/User.definition.d.ts +1 -0
  132. package/@types/lib/metadataTypes/definitions/Verification.definition.d.ts +3 -0
  133. package/@types/lib/util/auth.d.ts +19 -18
  134. package/@types/lib/util/auth.d.ts.map +1 -1
  135. package/@types/lib/util/businessUnit.d.ts +17 -17
  136. package/@types/lib/util/businessUnit.d.ts.map +1 -1
  137. package/@types/lib/util/cache.d.ts +34 -32
  138. package/@types/lib/util/cache.d.ts.map +1 -1
  139. package/@types/lib/util/cli.d.ts +30 -33
  140. package/@types/lib/util/cli.d.ts.map +1 -1
  141. package/@types/lib/util/config.d.ts +20 -20
  142. package/@types/lib/util/config.d.ts.map +1 -1
  143. package/@types/lib/util/devops.d.ts +21 -21
  144. package/@types/lib/util/devops.d.ts.map +1 -1
  145. package/@types/lib/util/file.d.ts +179 -18
  146. package/@types/lib/util/file.d.ts.map +1 -1
  147. package/@types/lib/util/init.config.d.ts +19 -19
  148. package/@types/lib/util/init.config.d.ts.map +1 -1
  149. package/@types/lib/util/init.d.ts +20 -20
  150. package/@types/lib/util/init.d.ts.map +1 -1
  151. package/@types/lib/util/init.git.d.ts +2 -2
  152. package/@types/lib/util/init.git.d.ts.map +1 -1
  153. package/@types/lib/util/init.npm.d.ts +2 -2
  154. package/@types/lib/util/init.npm.d.ts.map +1 -1
  155. package/@types/lib/util/replaceContentBlockReference.d.ts +55 -32
  156. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  157. package/@types/lib/util/util.d.ts +64 -39
  158. package/@types/lib/util/util.d.ts.map +1 -1
  159. package/@types/types/mcdev.d.d.ts +160 -52
  160. package/@types/types/mcdev.d.d.ts.map +1 -1
  161. package/boilerplate/files/.vscode/settings.json +1 -0
  162. package/boilerplate/forcedUpdates.json +4 -0
  163. package/boilerplate/gitignore-template +0 -1
  164. package/eslint.config.js +0 -1
  165. package/lib/Builder.js +13 -8
  166. package/lib/Deployer.js +13 -8
  167. package/lib/Retriever.js +4 -1
  168. package/lib/cli.js +384 -288
  169. package/lib/index.js +620 -241
  170. package/lib/metadataTypes/Asset.js +455 -209
  171. package/lib/metadataTypes/Automation.js +34 -0
  172. package/lib/metadataTypes/DataExtension.js +36 -31
  173. package/lib/metadataTypes/DataExtensionField.js +2 -3
  174. package/lib/metadataTypes/Event.js +227 -37
  175. package/lib/metadataTypes/Folder.js +64 -49
  176. package/lib/metadataTypes/Journey.js +340 -58
  177. package/lib/metadataTypes/MetadataType.js +272 -61
  178. package/lib/metadataTypes/MobileKeyword.js +12 -1
  179. package/lib/metadataTypes/Role.js +9 -7
  180. package/lib/metadataTypes/Script.js +4 -3
  181. package/lib/metadataTypes/SenderProfile.js +18 -5
  182. package/lib/metadataTypes/TransactionalEmail.js +2 -2
  183. package/lib/metadataTypes/TriggeredSend.js +21 -5
  184. package/lib/metadataTypes/User.js +31 -27
  185. package/lib/metadataTypes/definitions/Asset.definition.js +10 -2
  186. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
  187. package/lib/metadataTypes/definitions/AttributeSet.definition.js +11 -0
  188. package/lib/metadataTypes/definitions/Automation.definition.js +9 -0
  189. package/lib/metadataTypes/definitions/Campaign.definition.js +1 -0
  190. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
  191. package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -0
  192. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
  193. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
  194. package/lib/metadataTypes/definitions/DataExtract.definition.js +2 -1
  195. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
  196. package/lib/metadataTypes/definitions/DeliveryProfile.definition.js +1 -0
  197. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
  198. package/lib/metadataTypes/definitions/Email.definition.js +1 -0
  199. package/lib/metadataTypes/definitions/EmailSend.definition.js +8 -0
  200. package/lib/metadataTypes/definitions/Event.definition.js +9 -8
  201. package/lib/metadataTypes/definitions/FileLocation.definition.js +1 -0
  202. package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
  203. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  204. package/lib/metadataTypes/definitions/Folder.definition.js +10 -8
  205. package/lib/metadataTypes/definitions/ImportFile.definition.js +8 -1
  206. package/lib/metadataTypes/definitions/Journey.definition.js +28 -0
  207. package/lib/metadataTypes/definitions/List.definition.js +1 -0
  208. package/lib/metadataTypes/definitions/MobileCode.definition.js +1 -0
  209. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +7 -0
  210. package/lib/metadataTypes/definitions/MobileMessage.definition.js +9 -0
  211. package/lib/metadataTypes/definitions/Query.definition.js +3 -0
  212. package/lib/metadataTypes/definitions/Role.definition.js +1 -0
  213. package/lib/metadataTypes/definitions/Script.definition.js +1 -0
  214. package/lib/metadataTypes/definitions/SendClassification.definition.js +4 -0
  215. package/lib/metadataTypes/definitions/SenderProfile.definition.js +1 -0
  216. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +7 -0
  217. package/lib/metadataTypes/definitions/TransactionalMessage.definition.js +1 -0
  218. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +3 -0
  219. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +4 -0
  220. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +10 -3
  221. package/lib/metadataTypes/definitions/User.definition.js +3 -0
  222. package/lib/metadataTypes/definitions/Verification.definition.js +1 -0
  223. package/lib/util/auth.js +0 -1
  224. package/lib/util/cache.js +35 -0
  225. package/lib/util/cli.js +96 -140
  226. package/lib/util/config.js +11 -19
  227. package/lib/util/devops.js +42 -43
  228. package/lib/util/file.js +7 -10
  229. package/lib/util/init.config.js +6 -10
  230. package/lib/util/init.git.js +43 -57
  231. package/lib/util/init.js +35 -59
  232. package/lib/util/replaceContentBlockReference.js +110 -61
  233. package/lib/util/util.js +90 -4
  234. package/package.json +22 -19
  235. package/test/general.test.js +1144 -172
  236. package/test/mockRoot/.mcdevrc.json +1 -1
  237. package/test/mockRoot/deploy/testInstance/testBU/event/testExisting_event.event-meta.json +201 -0
  238. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withExistingDE.event-meta.json +233 -0
  239. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withSchema.event-meta.json +194 -0
  240. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json +1 -0
  241. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json +1 -0
  242. package/test/resourceFactory.js +43 -11
  243. package/test/resources/1111111/dataFolder/retrieve-ContentTypeINshared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml +364 -0
  244. package/test/resources/9999999/asset/{block-1157-retrieve-expected.html → build-asset_htmlblock-expected.html} +1 -1
  245. package/test/resources/9999999/asset/build-asset_htmlblock-expected.json +29 -0
  246. package/test/resources/9999999/asset/build-templatebasedemail-expected.json +65 -0
  247. package/test/resources/9999999/asset/resolveId-1295064-noPath-expected.json +3 -3
  248. package/test/resources/9999999/asset/resolveId-1295064-withPath-expected.json +3 -3
  249. package/test/resources/9999999/asset/retrieve-templatebasedemail-expected.json +65 -0
  250. package/test/resources/9999999/asset/template-emailTemplate-expected.json +20 -0
  251. package/test/resources/9999999/asset/template-templatebasedemail-expected.json +65 -0
  252. package/test/resources/9999999/asset/template-testExisting_asset_htmlblock-expected.json +29 -0
  253. package/test/resources/9999999/asset/testExisting_asset_htmlblock-retrieve-expected.html +23 -0
  254. package/test/resources/9999999/asset/{block-1157-retrieve-expected.json → testExisting_asset_htmlblock-retrieve-expected.json} +3 -3
  255. package/test/resources/9999999/asset/testExisting_asset_message-html-rcb-key-expected.html +6 -6
  256. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-id-expected.amp +1 -1
  257. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-key-expected.amp +4 -4
  258. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-name-expected.amp +1 -1
  259. package/test/resources/9999999/asset/testExisting_asset_message-text-rcb-key-expected.amp +4 -4
  260. package/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json +4 -4
  261. package/test/resources/9999999/asset/v1/content/assets/1295065/get-response.json +60 -0
  262. package/test/resources/9999999/asset/v1/content/assets/1295066/get-response.json +60 -0
  263. package/test/resources/9999999/asset/v1/content/assets/5289/get-response.json +75 -0
  264. package/test/resources/9999999/asset/v1/content/assets/808714/get-response.json +3 -3
  265. package/test/resources/9999999/asset/v1/content/assets/950143/get-response.json +97 -0
  266. package/test/resources/9999999/asset/v1/content/assets/get-response-customerKey=testExisting_asset.json +1 -1
  267. 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
  268. 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
  269. 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
  270. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1,207,208,209,5.json +229 -0
  271. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1.json +98 -1
  272. 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
  273. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN223,224,225,226,227,228,214,4.json +35 -0
  274. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN223,224,225,226,227,228.json +7 -0
  275. 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
  276. package/test/resources/9999999/automation/v1/queries/get-response-Name=testExisting_query.json +24 -0
  277. package/test/resources/9999999/automation/v1/scripts/get-response-name=testExisting_script.json +17 -0
  278. package/test/resources/9999999/automation/v1/scripts/get-response.json +2 -2
  279. package/test/resources/9999999/dataExtension/retrieve-CustomerKey=testNew_event_withSchema-response.xml +50 -0
  280. package/test/resources/9999999/dataExtension/retrieve-createdViaEvent-response.xml +50 -0
  281. package/test/resources/9999999/dataExtension/retrieve-response.xml +48 -0
  282. package/test/resources/9999999/dataExtension/retrieve_event_withSchema-expected.json +219 -0
  283. package/test/resources/9999999/dataExtension/update-afterCreatedViaEvent-response.xml +55 -0
  284. package/test/resources/9999999/dataExtension/update-callout-afterCreatedViaEvent-expected.xml +1 -0
  285. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_event_withSchema-response.xml +461 -0
  286. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKeyINtestExisting_dataExtension,testNew_dataExtension-response.xml +133 -0
  287. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +870 -0
  288. package/test/resources/9999999/dataFolder/retrieve-ContentType=asset-shared-QAA-response.xml +70 -0
  289. package/test/resources/9999999/dataFolder/retrieve-ContentType=asset-shared-response.xml +70 -0
  290. package/test/resources/9999999/dataFolder/retrieve-ContentType=journey-response.xml +48 -0
  291. 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
  292. 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
  293. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,journey-response.xml +92 -0
  294. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +115 -0
  295. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,ssjsactivity-response.xml +92 -0
  296. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared-QAA-response.xml +70 -0
  297. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset-shared,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +431 -0
  298. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINautomations,queryactivity-response.xml +70 -0
  299. package/test/resources/9999999/dataFolder/{retrieve-response.xml → retrieve-ContentTypeINdataextension,hidden,queryactivity,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +32 -119
  300. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINdataextension,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +117 -0
  301. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINhidden,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml +46 -0
  302. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINshared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-QAA-response.xml +251 -0
  303. package/test/resources/9999999/dataFolder/retrieve-response-.xml +519 -0
  304. package/test/resources/9999999/event/build-expected.json +227 -0
  305. package/test/resources/9999999/event/get-expected.json +234 -0
  306. package/test/resources/9999999/event/post_withExistingDE-callout-expected.json +20 -0
  307. package/test/resources/9999999/event/post_withExistingDE-expected.json +23 -0
  308. package/test/resources/9999999/event/post_withSchema-callout-expected.json +199 -0
  309. package/test/resources/9999999/event/post_withSchema-expected.json +234 -0
  310. package/test/resources/9999999/event/put-callout-expected.json +204 -0
  311. package/test/resources/9999999/event/put-expected.json +233 -0
  312. package/test/resources/9999999/event/template-expected.json +227 -0
  313. package/test/resources/9999999/interaction/v1/eventDefinitions/get-response.json +252 -2
  314. package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/delete-response.txt +0 -0
  315. package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/put-response.json +242 -0
  316. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withExistingDE-response.json +28 -0
  317. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withSchema-response.json +243 -0
  318. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/delete-response.txt +1 -0
  319. package/test/resources/9999999/interaction/v1/interactions/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/get-response.json +4 -4
  320. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Quicksend/get-response.json +4 -4
  321. package/test/resources/9999999/interaction/v1/interactions/publishAsync/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/post-response.json +4 -0
  322. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-failed.json +34 -0
  323. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-success.json +5 -0
  324. package/test/resources/9999999/interaction/v1/interactions/publishStatus/45f06c0a-3ed2-48b2-a6a8-b5119253f01c/get-response-successWarnings.json +36 -0
  325. package/test/resources/9999999/journey/build-expected.json +5 -5
  326. package/test/resources/9999999/journey/get-multistep-expected.json +1 -1
  327. package/test/resources/9999999/journey/get-quicksend-expected.json +5 -5
  328. package/test/resources/9999999/journey/get-quicksend-rcb-id-expected.json +1 -1
  329. package/test/resources/9999999/journey/get-quicksend-rcb-key-expected.json +7 -7
  330. package/test/resources/9999999/journey/get-quicksend-rcb-name-expected.json +1 -1
  331. package/test/resources/9999999/journey/post-expected.json +1 -1
  332. package/test/resources/9999999/journey/publish-callout-expected.json +1 -0
  333. package/test/resources/9999999/journey/put-expected.json +1 -1
  334. package/test/resources/9999999/journey/template-expected.json +5 -5
  335. package/test/resources/9999999/mobileKeyword/build-expected.json +1 -0
  336. package/test/resources/9999999/mobileKeyword/get-expected.json +1 -0
  337. package/test/resources/9999999/mobileKeyword/post-create-expected.json +1 -0
  338. package/test/resources/9999999/mobileKeyword/template-expected.json +1 -0
  339. package/test/resources/{1111111/accountUser/retrieve-CustomerKey=testExisting_userANDActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml → 9999999/queryDefinition/retrieve-CustomerKey=badANDStatus=Active-response.xml} +10 -11
  340. package/test/resources/9999999/script/get_ampincluded-rcb-key-expected.html +2 -2
  341. package/test/resources/9999999/script/get_ampscript-expected.html +1 -0
  342. package/test/resources/9999999/script/get_ampscript-rcb-id-expected.html +1 -0
  343. package/test/resources/9999999/script/get_ampscript-rcb-key-expected.html +3 -2
  344. package/test/resources/9999999/script/get_ampscript-rcb-name-expected.html +3 -0
  345. package/test/resources/9999999/script/get_mixed-expected.html +2 -2
  346. package/test/resources/9999999/script/get_mixed-rcb-key-expected.html +2 -2
  347. package/test/resources/9999999/senderProfile/get-rcb-key-expected.json +4 -4
  348. package/test/resources/9999999/senderProfile/retrieve-response.xml +1 -1
  349. package/test/resources/9999999/triggeredSend/get-rcb-key-expected.json +4 -4
  350. package/test/resources/9999999/triggeredSendDefinition/retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml +1 -1
  351. package/test/type.asset.test.js +189 -42
  352. package/test/type.automation.test.js +135 -59
  353. package/test/type.dataExtension.test.js +4 -4
  354. package/test/type.dataExtract.test.js +4 -4
  355. package/test/type.emailSend.test.js +3 -3
  356. package/test/type.event.test.js +286 -7
  357. package/test/type.journey.test.js +335 -9
  358. package/test/type.query.test.js +33 -29
  359. package/test/type.script.test.js +61 -11
  360. package/test/type.senderProfile.test.js +36 -3
  361. package/test/type.transactionalEmail.test.js +3 -3
  362. package/test/type.triggeredSend.test.js +75 -6
  363. package/test/type.user.test.js +1 -1
  364. package/test/utils.js +31 -9
  365. package/tsconfig.json +6 -1
  366. package/{jsconfig.json → tsconfig.npmScripts.json} +1 -1
  367. package/tsconfig.precommit.json +26 -0
  368. package/types/mcdev.d.js +39 -14
  369. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-response.xml → retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-QAA-response.xml} +0 -0
  370. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=falseANDEmaillike@-response.xml → retrieve-ActiveFlag=falseANDEmaillike@-QAA-response.xml} +0 -0
  371. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-response.xml → retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-QAA-response.xml} +0 -0
  372. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml → retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-QAA-response.xml} +0 -0
  373. /package/test/resources/1111111/accountUser/{retrieve-ActiveFlag=trueANDEmaillike@-response.xml → retrieve-ActiveFlag=trueANDEmaillike@-QAA-response.xml} +0 -0
  374. /package/test/resources/1111111/businessUnit/{retrieve-ID=1111111-response.xml → retrieve-ID=1111111-QAA-response.xml} +0 -0
  375. /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
  376. /package/test/resources/1111111/dataFolder/{retrieve-response.xml → retrieve-response-.xml} +0 -0
  377. /package/test/resources/9999999/dataFolder/{retrieve-ContentType=asset-sharedORContentType=asset-response.xml → retrieve-ContentTypeINasset,asset-shared-response.xml} +0 -0
  378. /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
  379. /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
  380. /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
@@ -2,6 +2,7 @@
2
2
 
3
3
  import auth from './auth.js';
4
4
  import cache from './cache.js';
5
+ import File from './file.js';
5
6
  import { Util } from '../util/util.js';
6
7
 
7
8
  import Folder from '../metadataTypes/Folder.js';
@@ -29,6 +30,8 @@ import Asset from '../metadataTypes/Asset.js';
29
30
  * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
30
31
  * @typedef {import('../../types/mcdev.d.js').TypeKeyCombo} TypeKeyCombo
31
32
  * @typedef {import('../../types/mcdev.d.js').SDKError} SDKError
33
+ *
34
+ * @typedef {import('../../types/mcdev.d.js').AssetMap} AssetMap
32
35
  * @typedef {import('../../types/mcdev.d.js').AssetItemSimple} AssetItemSimple
33
36
  * @typedef {import('../../types/mcdev.d.js').AssetItemSimpleMap} AssetItemSimpleMap
34
37
  * @typedef {import('../../types/mcdev.d.js').AssetItemIdSimpleMap} AssetItemIdSimpleMap
@@ -86,18 +89,20 @@ export default class ReplaceContentBlockReference {
86
89
  *
87
90
  * @param {string} str full code string
88
91
  * @param {string} parentName name of the object that was passed in; used in error message only
89
- * @param {ContentBlockConversionTypes[]} [fromList] what to replace
90
- * @param {ContentBlockConversionTypes} [to] what to replace with
92
+ * @param {Set.<string>} [findAssetKeys] list of keys that were found referenced via ContentBlockByX; if set, method only gets keys and runs no updates
91
93
  * @returns {string} replaced string
92
94
  */
93
- static replaceReference(str, parentName, fromList, to) {
95
+ static replaceReference(str, parentName, findAssetKeys) {
94
96
  if (!str) {
95
97
  const ex = new Error('No string provided');
98
+ // @ts-expect-error custom error object
96
99
  ex.code = 200;
97
100
  throw ex;
98
101
  }
99
- fromList ||= Util.OPTIONS.referenceFrom;
100
- to ||= Util.OPTIONS.referenceTo;
102
+ /** @type {ContentBlockConversionTypes[]} */
103
+ const fromList = Util.OPTIONS.referenceFrom;
104
+ /** @type {ContentBlockConversionTypes} */
105
+ const to = Util.OPTIONS.referenceTo;
101
106
  let result = str;
102
107
  let changes = 0;
103
108
  const languages = [
@@ -117,7 +122,12 @@ export default class ReplaceContentBlockReference {
117
122
  if (referencedAsset && referencedAsset[to]) {
118
123
  // make sure we not only found the asset but also have a replacement for it (folder issue could block swap to ContentBlockByName)
119
124
  changes++;
120
- return this.#replaceWith(referencedAsset, to, lang.isSsjs);
125
+ if (findAssetKeys) {
126
+ findAssetKeys.add(referencedAsset.key);
127
+ return;
128
+ } else {
129
+ return this.#replaceWith(referencedAsset, to, lang.isSsjs);
130
+ }
121
131
  } else {
122
132
  if (referencedAsset && !referencedAsset[to]) {
123
133
  // this is expected to only happen if to=="name"
@@ -133,6 +143,7 @@ export default class ReplaceContentBlockReference {
133
143
  }
134
144
  if (!changes) {
135
145
  const ex = new Error('No changes made to the code.');
146
+ // @ts-expect-error custom error object
136
147
  ex.code = 200;
137
148
  throw ex;
138
149
  }
@@ -158,7 +169,7 @@ export default class ReplaceContentBlockReference {
158
169
  break;
159
170
  }
160
171
  case 'name': {
161
- if (isSsjs) {
172
+ if (isSsjs && typeof identifier === 'string') {
162
173
  identifier = identifier.replaceAll('\\\\', '\\');
163
174
  }
164
175
  reference = ReplaceContentBlockReference.assetCacheMap.name[identifier];
@@ -193,40 +204,34 @@ export default class ReplaceContentBlockReference {
193
204
  }
194
205
 
195
206
  /**
207
+ * ensures we cache the right things from disk and if required from server
196
208
  *
197
209
  * @param {Mcdevrc} properties properties for auth
198
210
  saved
199
211
  * @param {BuObject} buObject properties for auth
212
+ * @param {boolean} [retrieveSharedOnly] for --dependencies only, do not have to re-retrieve local assets
213
+ * @returns {Promise.<void>} -
200
214
  */
201
- static async createCacheMap(properties, buObject) {
202
- const client = auth.getSDK(buObject);
203
-
204
- if (!cache.getCache()) {
205
- cache.initCache(buObject);
206
- }
207
- Util.logger.info('Caching folders');
208
- Folder.buObject = buObject;
209
- Folder.properties = properties;
210
- Folder.client = client;
211
- const resultFolder = await Folder.retrieveForCache(null, ['asset', 'asset-shared']);
212
- cache.setMetadata('folder', resultFolder.metadata);
215
+ static async createCacheMap(properties, buObject, retrieveSharedOnly = false) {
216
+ const { localAssets, sharedAssets } = await ReplaceContentBlockReference._retrieveCache(
217
+ buObject,
218
+ properties,
219
+ retrieveSharedOnly
220
+ );
213
221
 
214
- Util.logger.info('Caching assets');
215
- Asset.buObject = buObject;
216
- Asset.properties = properties;
217
- Asset.client = client;
218
- const resultAsset = await Asset.retrieveForCache(undefined, [
219
- 'asset',
220
- 'code',
221
- 'textfile',
222
- 'block',
223
- 'other',
224
- ]);
225
- for (const element of Object.values(resultAsset.metadata)) {
226
- // ensure we got the folder-path in our cache
227
- Asset.setFolderPath(element);
222
+ ReplaceContentBlockReference._createCacheMap(localAssets);
223
+ ReplaceContentBlockReference._createCacheMap(sharedAssets);
224
+ }
228
225
 
226
+ /**
227
+ * helper for {@link this.createCacheMap} that converts AssetMap into Asset
228
+ *
229
+ * @param {AssetMap} metadataMap list of local or shared assets
230
+ */
231
+ static _createCacheMap(metadataMap) {
232
+ for (const element of Object.values(metadataMap)) {
229
233
  // create actual cache map
234
+ /** @type {AssetItemSimple} */
230
235
  const simpleAsset = {
231
236
  id: element.id,
232
237
  key: element.customerKey,
@@ -235,44 +240,88 @@ saved
235
240
  : null,
236
241
  };
237
242
  // ! note that ContentBlockByName expects backslashes between folders and file name, not forward slashes
238
- ReplaceContentBlockReference.assetCacheMap.id[simpleAsset.id] = simpleAsset;
239
- ReplaceContentBlockReference.assetCacheMap.key[simpleAsset.key] = simpleAsset;
243
+ this.assetCacheMap.id[simpleAsset.id] = simpleAsset;
244
+ this.assetCacheMap.key[simpleAsset.key] = simpleAsset;
240
245
  if (simpleAsset.name) {
241
246
  // while asset without path could still be found via search, it would no longer referencable via ContentBlockByName
242
- ReplaceContentBlockReference.assetCacheMap.name[simpleAsset.name] = simpleAsset;
247
+ this.assetCacheMap.name[simpleAsset.name] = simpleAsset;
243
248
  }
244
249
  }
250
+ }
245
251
 
246
- cache.setMetadata('asset', resultAsset.metadata);
252
+ /**
253
+ * helper for {@link this.createCacheMap}
254
+ *
255
+ * @param {BuObject} buObject references credentials
256
+ * @param {Mcdevrc} properties central properties object
257
+ * @param {boolean} [retrieveSharedOnly] for --dependencies only, do not have to re-retrieve local assets
258
+ * @returns {Promise.<{localAssets: AssetMap, sharedAssets: AssetMap}>} -
259
+ */
260
+ static async _retrieveCache(buObject, properties, retrieveSharedOnly = false) {
261
+ const client = auth.getSDK(buObject);
247
262
 
248
- Util.logger.info('Caching shared assets');
249
- const resultAssetShared = await Asset.retrieveForCache(
250
- undefined,
251
- ['asset', 'code', 'textfile', 'block', 'other'],
252
- undefined,
253
- true
254
- );
255
- for (const element of Object.values(resultAssetShared.metadata)) {
256
- // ensure we got the folder-path in our cache
257
- Asset.setFolderPath(element);
263
+ if (!cache.getCache()) {
264
+ cache.initCache(buObject);
265
+ }
266
+ Util.logger.info(' - Caching folders');
267
+ Folder.buObject = buObject;
268
+ Folder.properties = properties;
269
+ Folder.client = client;
270
+ const resultFolder = await Folder.retrieveForCache(null, ['asset', 'asset-shared']);
271
+ cache.setMetadata('folder', resultFolder.metadata);
258
272
 
259
- // create actual cache map
260
- const simpleAsset = {
261
- id: element.id,
262
- key: element.customerKey,
263
- name: element.r__folder_Path
264
- ? element.r__folder_Path.replaceAll('/', '\\') + '\\' + element.name
265
- : null,
266
- };
267
- // ! note that ContentBlockByName expects backslashes between folders and file name, not forward slashes
268
- ReplaceContentBlockReference.assetCacheMap.id[simpleAsset.id] = simpleAsset;
269
- ReplaceContentBlockReference.assetCacheMap.key[simpleAsset.key] = simpleAsset;
270
- if (simpleAsset.name) {
271
- // while asset without path could still be found via search, it would no longer referencable via ContentBlockByName
272
- ReplaceContentBlockReference.assetCacheMap.name[simpleAsset.name] = simpleAsset;
273
+ let localAssets;
274
+ if (retrieveSharedOnly) {
275
+ Util.logger.debug(' - Caching assets locally');
276
+ if (!Asset.getJsonFromFSCache) {
277
+ // avoid re-reading the same files in every recursive iteration
278
+ Asset.getJsonFromFSCache = await Asset.getJsonFromFS(
279
+ File.normalizePath([
280
+ properties.directories.retrieve,
281
+ buObject.credential,
282
+ buObject.businessUnit,
283
+ Asset.definition.type,
284
+ ])
285
+ );
286
+ }
287
+ localAssets = Asset.getJsonFromFSCache;
288
+ cache.setMetadata('asset', Asset.getJsonFromFSCache);
289
+ } else {
290
+ Util.logger.info(' - Caching assets from server');
291
+ Asset.buObject = buObject;
292
+ Asset.properties = properties;
293
+ Asset.client = client;
294
+ const resultAsset = await Asset.retrieveForCache(
295
+ undefined,
296
+ Asset.definition.crosslinkedSubTypes
297
+ );
298
+ for (const element of Object.values(resultAsset.metadata)) {
299
+ // ensure we got the folder-path in our cache
300
+ Asset.setFolderPath(element);
273
301
  }
302
+ localAssets = resultAsset.metadata;
303
+ cache.setMetadata('asset', resultAsset.metadata);
274
304
  }
275
305
 
306
+ // get shared assets
307
+ Util.logger.info(' - Caching shared assets from server (not stored on disk)');
308
+ Asset.buObject = buObject;
309
+ Asset.properties = properties;
310
+ Asset.client = client;
311
+ const sharedAssets = (
312
+ await Asset.retrieveForCache(
313
+ undefined,
314
+ Asset.definition.crosslinkedSubTypes,
315
+ undefined,
316
+ true
317
+ )
318
+ )?.metadata;
276
319
  // lets not put the shared assets into our cache to avoid confusing the system...
320
+
321
+ for (const element of Object.values(sharedAssets)) {
322
+ // ensure we got the folder-path in our cache
323
+ Asset.setFolderPath(element);
324
+ }
325
+ return { localAssets, sharedAssets };
277
326
  }
278
327
  }
package/lib/util/util.js CHANGED
@@ -103,7 +103,7 @@ export const Util = {
103
103
  return true;
104
104
  } else {
105
105
  Util.logger.error(`Could not find the market '${market}' in your configuration file.`);
106
- const marketArr = Object.values(properties.markets);
106
+ const marketArr = Object.keys(properties.markets);
107
107
 
108
108
  if (marketArr.length) {
109
109
  Util.logger.info('Available markets are: ' + marketArr.join(', '));
@@ -797,13 +797,14 @@ export const Util = {
797
797
  * helper to print the subtypes we filtered by
798
798
  *
799
799
  * @param {string[]} subTypeArr list of subtypes to be printed
800
+ * @param {string} [indent] optional prefix of spaces to be added to the log message
800
801
  * @returns {void}
801
802
  */
802
- logSubtypes(subTypeArr) {
803
+ logSubtypes(subTypeArr, indent = '') {
803
804
  if (subTypeArr && subTypeArr.length > 0) {
804
805
  Util.logger.info(
805
806
  Util.getGrayMsg(
806
- ` - Subtype${subTypeArr.length > 1 ? 's' : ''}: ${subTypeArr.join(', ')}`
807
+ `${indent} - Subtype${subTypeArr.length > 1 ? 's' : ''}: ${[...subTypeArr].sort().join(', ')}`
807
808
  )
808
809
  );
809
810
  }
@@ -837,6 +838,10 @@ export const Util = {
837
838
  * @returns {Promise.<void>} - promise to wait for
838
839
  */
839
840
  async sleep(ms) {
841
+ if (Util.OPTIONS._runningTest) {
842
+ Util.logger.debug('Skipping sleep in test mode');
843
+ return;
844
+ }
840
845
  return new Promise((resolve) => {
841
846
  setTimeout(resolve, ms);
842
847
  });
@@ -956,7 +961,7 @@ export const Util = {
956
961
  /**
957
962
  * helper for Retriever and Deployer class
958
963
  *
959
- * @param {string[]} typeArr -
964
+ * @param {string | string[]} typeArr -
960
965
  * @param {string[]} keyArr -
961
966
  * @param {boolean} [returnEmpty] returns array with null element if false/not set; Retriever needs this to be false; Deployer needs it to be true
962
967
  * @returns {TypeKeyCombo} -
@@ -968,6 +973,9 @@ export const Util = {
968
973
  }
969
974
  /** @type {TypeKeyCombo} */
970
975
  const typeKeyMap = {};
976
+ if ('string' === typeof typeArr) {
977
+ typeArr = [typeArr];
978
+ }
971
979
  // no keys or array of keys was provided (likely called via CLI or to retrieve all)
972
980
  // transform into TypeKeyCombo to iterate over it
973
981
  for (const type of typeArr) {
@@ -975,6 +983,73 @@ export const Util = {
975
983
  }
976
984
  return typeKeyMap;
977
985
  },
986
+ /**
987
+ * helper that converts TypeKeyCombo objects into a string with all relevant -m parameters
988
+ *
989
+ * @param {TypeKeyCombo} [selectedTypes] selected metadata types & key
990
+ * @returns {string} object converted into --metadata parameters
991
+ */
992
+ convertTypeKeyToCli(selectedTypes) {
993
+ return selectedTypes
994
+ ? Object.keys(selectedTypes)
995
+ .reduce((previousValue, type) => {
996
+ previousValue.push(
997
+ ...selectedTypes[type].map((key) =>
998
+ key === null ? `-m ${type}` : `-m "${type}:${key}"`
999
+ )
1000
+ );
1001
+ return previousValue;
1002
+ }, [])
1003
+ .join(' ')
1004
+ : '';
1005
+ },
1006
+ /**
1007
+ * helper that converts TypeKeyCombo objects into a string with all relevant -m parameters
1008
+ *
1009
+ * @param {TypeKeyCombo} [selectedTypes] selected metadata types & key
1010
+ * @returns {string} object converted into --metadata parameters
1011
+ */
1012
+ convertTypeKeyToString(selectedTypes) {
1013
+ return selectedTypes
1014
+ ? Object.keys(selectedTypes)
1015
+ .reduce((previousValue, type) => {
1016
+ previousValue.push(
1017
+ selectedTypes[type]
1018
+ .map((key, index) => {
1019
+ let response = '';
1020
+ if (index === 0) {
1021
+ response += `${type}`;
1022
+ }
1023
+ if (key !== null && index === 0) {
1024
+ response += ' (';
1025
+ }
1026
+ response += key === null ? `` : `"${key}"`;
1027
+ if (key !== null && index === selectedTypes[type].length - 1) {
1028
+ response += ')';
1029
+ }
1030
+ return response;
1031
+ })
1032
+ .join(', ')
1033
+ );
1034
+ return previousValue;
1035
+ }, [])
1036
+ .join(', ')
1037
+ : '';
1038
+ },
1039
+ /**
1040
+ * helper that checks how many keys are defined in TypeKeyCombo object
1041
+ *
1042
+ * @param {TypeKeyCombo} [selectedTypes] selected metadata types & key
1043
+ * @returns {number} amount of keys across all types
1044
+ */
1045
+ getTypeKeyCount(selectedTypes) {
1046
+ return Object.keys(selectedTypes).reduce(
1047
+ (previousValue, type) =>
1048
+ previousValue + (selectedTypes[type] ? selectedTypes[type].length : 0),
1049
+ 0
1050
+ );
1051
+ },
1052
+
978
1053
  /**
979
1054
  * async version of Array.find()
980
1055
  * returns the first element in the provided array that satisfies the provided testin function
@@ -990,6 +1065,17 @@ export const Util = {
990
1065
  }
991
1066
  }
992
1067
  },
1068
+ /**
1069
+ *
1070
+ * @param {Array} array array to be chunked
1071
+ * @param {number} chunk_size integer > 0
1072
+ * @returns {Array[]} array of arrays with max chunk_size members per element, last element might have less
1073
+ */
1074
+ chunk(array, chunk_size) {
1075
+ return array.length == 0
1076
+ ? []
1077
+ : [array.splice(0, chunk_size)].concat(this.chunk(array, chunk_size));
1078
+ },
993
1079
  };
994
1080
 
995
1081
  Util.startLogger(false, true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcdev",
3
- "version": "7.0.3",
3
+ "version": "7.1.0",
4
4
  "description": "Accenture Salesforce Marketing Cloud DevTools",
5
5
  "author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
6
6
  "license": "MIT",
@@ -54,7 +54,7 @@
54
54
  "debug": "node --nolazy --inspect-brk=9229 lib/cli.js",
55
55
  "lint:fix": "eslint --fix lib/**/*.js types/*.js test/**/*.js",
56
56
  "lint": "eslint lib/**/*.js types/*.js test/**/*.js",
57
- "lint-ts": "tsc -p jsconfig.json --maxNodeModuleJsDepth 1 --noEmit",
57
+ "lint-ts": "tsc -p tsconfig.npmScripts.json",
58
58
  "prepare": "husky || true",
59
59
  "lint-and-test": "run-s lint test",
60
60
  "test": "mocha --reporter-option maxDiffSize=25000",
@@ -71,45 +71,48 @@
71
71
  "console.table": "0.10.0",
72
72
  "deep-equal": "2.2.3",
73
73
  "fs-extra": "11.2.0",
74
- "inquirer": "9.2.6",
74
+ "inquirer": "10.0.1",
75
75
  "json-to-table": "4.2.1",
76
76
  "mustache": "4.2.0",
77
- "p-limit": "5.0.0",
78
- "prettier": "3.3.2",
79
- "prettier-plugin-sql": "0.18.0",
80
- "semver": "7.6.0",
81
- "sfmc-sdk": "2.0.1",
77
+ "p-limit": "6.1.0",
78
+ "prettier": "3.3.3",
79
+ "prettier-plugin-sql": "0.18.1",
80
+ "semver": "7.6.3",
81
+ "sfmc-sdk": "2.1.1",
82
82
  "simple-git": "3.25.0",
83
83
  "toposort": "2.0.2",
84
84
  "update-notifier": "7.0.0",
85
- "winston": "3.13.0",
85
+ "winston": "3.13.1",
86
86
  "yargs": "17.7.2"
87
87
  },
88
88
  "devDependencies": {
89
- "@eslint/js": "9.6.0",
90
- "@types/mocha": "10.0.6",
91
- "@types/node": "20.14.9",
89
+ "@eslint/js": "9.7.0",
90
+ "@types/fs-extra": "11.0.4",
91
+ "@types/inquirer": "9.0.7",
92
+ "@types/mocha": "10.0.7",
93
+ "@types/node": "20.14.10",
94
+ "@types/yargs": "17.0.32",
92
95
  "assert": "2.1.0",
93
96
  "axios-mock-adapter": "1.22.0",
94
97
  "c8": "10.0.0",
95
98
  "chai": "5.1.1",
96
99
  "chai-files": "1.4.0",
97
- "eslint": "9.6.0",
100
+ "eslint": "9.7.0",
98
101
  "eslint-config-prettier": "9.1.0",
99
102
  "eslint-config-ssjs": "2.0.0",
100
- "eslint-plugin-jsdoc": "48.2.7",
103
+ "eslint-plugin-jsdoc": "48.8.3",
101
104
  "eslint-plugin-mocha": "10.4.3",
102
- "eslint-plugin-prettier": "5.1.2",
103
- "eslint-plugin-unicorn": "53.0.0",
105
+ "eslint-plugin-prettier": "5.2.1",
106
+ "eslint-plugin-unicorn": "54.0.0",
104
107
  "fast-xml-parser": "4.4.0",
105
- "globals": "15.6.0",
108
+ "globals": "15.8.0",
106
109
  "husky": "9.0.11",
107
110
  "lint-staged": "15.2.7",
108
- "mocha": "10.4.0",
111
+ "mocha": "10.7.0",
109
112
  "mock-fs": "5.2.0",
110
113
  "npm-run-all": "4.1.5",
111
114
  "prettier-eslint": "16.3.0",
112
- "typescript": "5.4.5"
115
+ "typescript": "5.5.3"
113
116
  },
114
117
  "optionalDependencies": {
115
118
  "fsevents": "*"