mcdev 6.0.2 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/.beautyamp.json +13 -0
  2. package/.eslintrc.json +7 -1
  3. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  4. package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +10 -3
  5. package/.github/workflows/close_issues_on_merge.yml +1 -1
  6. package/.github/workflows/code-test.yml +51 -3
  7. package/.github/workflows/coverage-base-update.yml +1 -1
  8. package/.github/workflows/coverage-develop-branch.yml +1 -1
  9. package/.github/workflows/coverage-main-branch.yml +1 -1
  10. package/.github/workflows/coverage.yml +2 -2
  11. package/.github/workflows/npm-publish.yml +3 -2
  12. package/.github/workflows/pr-labeler.yml +1 -1
  13. package/.husky/commit-msg +0 -2
  14. package/.husky/post-checkout +0 -3
  15. package/.husky/post-merge +2 -7
  16. package/.husky/pre-commit +5 -5
  17. package/.prettierrc +0 -8
  18. package/.vscode/extensions.json +2 -0
  19. package/.vscode/settings.json +15 -3
  20. package/@types/lib/Builder.d.ts +97 -0
  21. package/@types/lib/Builder.d.ts.map +1 -0
  22. package/@types/lib/Deployer.d.ts +99 -0
  23. package/@types/lib/Deployer.d.ts.map +1 -0
  24. package/@types/lib/MetadataTypeDefinitions.d.ts +80 -0
  25. package/@types/lib/MetadataTypeDefinitions.d.ts.map +1 -0
  26. package/@types/lib/MetadataTypeInfo.d.ts +78 -0
  27. package/@types/lib/MetadataTypeInfo.d.ts.map +1 -0
  28. package/@types/lib/Retriever.d.ts +66 -0
  29. package/@types/lib/Retriever.d.ts.map +1 -0
  30. package/@types/lib/cli.d.ts +3 -0
  31. package/@types/lib/cli.d.ts.map +1 -0
  32. package/@types/lib/index.d.ts +383 -0
  33. package/@types/lib/index.d.ts.map +1 -0
  34. package/@types/lib/metadataTypes/Asset.d.ts +1082 -0
  35. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -0
  36. package/@types/lib/metadataTypes/AttributeGroup.d.ts +290 -0
  37. package/@types/lib/metadataTypes/AttributeGroup.d.ts.map +1 -0
  38. package/@types/lib/metadataTypes/AttributeSet.d.ts +968 -0
  39. package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -0
  40. package/@types/lib/metadataTypes/Automation.d.ts +921 -0
  41. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -0
  42. package/@types/lib/metadataTypes/Campaign.d.ts +190 -0
  43. package/@types/lib/metadataTypes/Campaign.d.ts.map +1 -0
  44. package/@types/lib/metadataTypes/ContentArea.d.ts +250 -0
  45. package/@types/lib/metadataTypes/ContentArea.d.ts.map +1 -0
  46. package/@types/lib/metadataTypes/DataExtension.d.ts +571 -0
  47. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -0
  48. package/@types/lib/metadataTypes/DataExtensionField.d.ts +236 -0
  49. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -0
  50. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts +175 -0
  51. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts.map +1 -0
  52. package/@types/lib/metadataTypes/DataExtract.d.ts +217 -0
  53. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -0
  54. package/@types/lib/metadataTypes/DataExtractType.d.ts +80 -0
  55. package/@types/lib/metadataTypes/DataExtractType.d.ts.map +1 -0
  56. package/@types/lib/metadataTypes/DeliveryProfile.d.ts +102 -0
  57. package/@types/lib/metadataTypes/DeliveryProfile.d.ts.map +1 -0
  58. package/@types/lib/metadataTypes/Discovery.d.ts +189 -0
  59. package/@types/lib/metadataTypes/Discovery.d.ts.map +1 -0
  60. package/@types/lib/metadataTypes/Email.d.ts +384 -0
  61. package/@types/lib/metadataTypes/Email.d.ts.map +1 -0
  62. package/@types/lib/metadataTypes/EmailSend.d.ts +652 -0
  63. package/@types/lib/metadataTypes/EmailSend.d.ts.map +1 -0
  64. package/@types/lib/metadataTypes/Event.d.ts +958 -0
  65. package/@types/lib/metadataTypes/Event.d.ts.map +1 -0
  66. package/@types/lib/metadataTypes/FileLocation.d.ts +101 -0
  67. package/@types/lib/metadataTypes/FileLocation.d.ts.map +1 -0
  68. package/@types/lib/metadataTypes/FileTransfer.d.ts +228 -0
  69. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -0
  70. package/@types/lib/metadataTypes/Filter.d.ts +145 -0
  71. package/@types/lib/metadataTypes/Filter.d.ts.map +1 -0
  72. package/@types/lib/metadataTypes/Folder.d.ts +287 -0
  73. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -0
  74. package/@types/lib/metadataTypes/ImportFile.d.ts +409 -0
  75. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -0
  76. package/@types/lib/metadataTypes/Journey.d.ts +541 -0
  77. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -0
  78. package/@types/lib/metadataTypes/List.d.ts +191 -0
  79. package/@types/lib/metadataTypes/List.d.ts.map +1 -0
  80. package/@types/lib/metadataTypes/MetadataType.d.ts +680 -0
  81. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -0
  82. package/@types/lib/metadataTypes/MobileCode.d.ts +225 -0
  83. package/@types/lib/metadataTypes/MobileCode.d.ts.map +1 -0
  84. package/@types/lib/metadataTypes/MobileKeyword.d.ts +432 -0
  85. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -0
  86. package/@types/lib/metadataTypes/MobileMessage.d.ts +931 -0
  87. package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -0
  88. package/@types/lib/metadataTypes/Query.d.ts +299 -0
  89. package/@types/lib/metadataTypes/Query.d.ts.map +1 -0
  90. package/@types/lib/metadataTypes/Role.d.ts +164 -0
  91. package/@types/lib/metadataTypes/Role.d.ts.map +1 -0
  92. package/@types/lib/metadataTypes/Script.d.ts +305 -0
  93. package/@types/lib/metadataTypes/Script.d.ts.map +1 -0
  94. package/@types/lib/metadataTypes/SendClassification.d.ts +221 -0
  95. package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -0
  96. package/@types/lib/metadataTypes/SenderProfile.d.ts +257 -0
  97. package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -0
  98. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +230 -0
  99. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -0
  100. package/@types/lib/metadataTypes/TransactionalMessage.d.ts +163 -0
  101. package/@types/lib/metadataTypes/TransactionalMessage.d.ts.map +1 -0
  102. package/@types/lib/metadataTypes/TransactionalPush.d.ts +175 -0
  103. package/@types/lib/metadataTypes/TransactionalPush.d.ts.map +1 -0
  104. package/@types/lib/metadataTypes/TransactionalSMS.d.ts +205 -0
  105. package/@types/lib/metadataTypes/TransactionalSMS.d.ts.map +1 -0
  106. package/@types/lib/metadataTypes/TriggeredSend.d.ts +671 -0
  107. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -0
  108. package/@types/lib/metadataTypes/User.d.ts +677 -0
  109. package/@types/lib/metadataTypes/User.d.ts.map +1 -0
  110. package/@types/lib/metadataTypes/Verification.d.ts +188 -0
  111. package/@types/lib/metadataTypes/Verification.d.ts.map +1 -0
  112. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts +692 -0
  113. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts.map +1 -0
  114. package/@types/lib/metadataTypes/definitions/AttributeGroup.definition.d.ts +246 -0
  115. package/@types/lib/metadataTypes/definitions/AttributeGroup.definition.d.ts.map +1 -0
  116. package/@types/lib/metadataTypes/definitions/AttributeSet.definition.d.ts +893 -0
  117. package/@types/lib/metadataTypes/definitions/AttributeSet.definition.d.ts.map +1 -0
  118. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts +616 -0
  119. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts.map +1 -0
  120. package/@types/lib/metadataTypes/definitions/Campaign.definition.d.ts +126 -0
  121. package/@types/lib/metadataTypes/definitions/Campaign.definition.d.ts.map +1 -0
  122. package/@types/lib/metadataTypes/definitions/ContentArea.definition.d.ts +182 -0
  123. package/@types/lib/metadataTypes/definitions/ContentArea.definition.d.ts.map +1 -0
  124. package/@types/lib/metadataTypes/definitions/DataExtension.definition.d.ts +237 -0
  125. package/@types/lib/metadataTypes/definitions/DataExtension.definition.d.ts.map +1 -0
  126. package/@types/lib/metadataTypes/definitions/DataExtensionField.definition.d.ts +121 -0
  127. package/@types/lib/metadataTypes/definitions/DataExtensionField.definition.d.ts.map +1 -0
  128. package/@types/lib/metadataTypes/definitions/DataExtensionTemplate.definition.d.ts +133 -0
  129. package/@types/lib/metadataTypes/definitions/DataExtensionTemplate.definition.d.ts.map +1 -0
  130. package/@types/lib/metadataTypes/definitions/DataExtract.definition.d.ts +156 -0
  131. package/@types/lib/metadataTypes/definitions/DataExtract.definition.d.ts.map +1 -0
  132. package/@types/lib/metadataTypes/definitions/DataExtractType.definition.d.ts +34 -0
  133. package/@types/lib/metadataTypes/definitions/DataExtractType.definition.d.ts.map +1 -0
  134. package/@types/lib/metadataTypes/definitions/DeliveryProfile.definition.d.ts +80 -0
  135. package/@types/lib/metadataTypes/definitions/DeliveryProfile.definition.d.ts.map +1 -0
  136. package/@types/lib/metadataTypes/definitions/Discovery.definition.d.ts +146 -0
  137. package/@types/lib/metadataTypes/definitions/Discovery.definition.d.ts.map +1 -0
  138. package/@types/lib/metadataTypes/definitions/Email.definition.d.ts +314 -0
  139. package/@types/lib/metadataTypes/definitions/Email.definition.d.ts.map +1 -0
  140. package/@types/lib/metadataTypes/definitions/EmailSend.definition.d.ts +582 -0
  141. package/@types/lib/metadataTypes/definitions/EmailSend.definition.d.ts.map +1 -0
  142. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +867 -0
  143. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts.map +1 -0
  144. package/@types/lib/metadataTypes/definitions/FileLocation.definition.d.ts +68 -0
  145. package/@types/lib/metadataTypes/definitions/FileLocation.definition.d.ts.map +1 -0
  146. package/@types/lib/metadataTypes/definitions/FileTransfer.definition.d.ts +191 -0
  147. package/@types/lib/metadataTypes/definitions/FileTransfer.definition.d.ts.map +1 -0
  148. package/@types/lib/metadataTypes/definitions/Filter.definition.d.ts +147 -0
  149. package/@types/lib/metadataTypes/definitions/Filter.definition.d.ts.map +1 -0
  150. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts +174 -0
  151. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts.map +1 -0
  152. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts +306 -0
  153. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts.map +1 -0
  154. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +426 -0
  155. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts.map +1 -0
  156. package/@types/lib/metadataTypes/definitions/List.definition.d.ts +118 -0
  157. package/@types/lib/metadataTypes/definitions/List.definition.d.ts.map +1 -0
  158. package/@types/lib/metadataTypes/definitions/MobileCode.definition.d.ts +167 -0
  159. package/@types/lib/metadataTypes/definitions/MobileCode.definition.d.ts.map +1 -0
  160. package/@types/lib/metadataTypes/definitions/MobileKeyword.definition.d.ts +276 -0
  161. package/@types/lib/metadataTypes/definitions/MobileKeyword.definition.d.ts.map +1 -0
  162. package/@types/lib/metadataTypes/definitions/MobileMessage.definition.d.ts +783 -0
  163. package/@types/lib/metadataTypes/definitions/MobileMessage.definition.d.ts.map +1 -0
  164. package/@types/lib/metadataTypes/definitions/Query.definition.d.ts +203 -0
  165. package/@types/lib/metadataTypes/definitions/Query.definition.d.ts.map +1 -0
  166. package/@types/lib/metadataTypes/definitions/Role.definition.d.ts +108 -0
  167. package/@types/lib/metadataTypes/definitions/Role.definition.d.ts.map +1 -0
  168. package/@types/lib/metadataTypes/definitions/Script.definition.d.ts +153 -0
  169. package/@types/lib/metadataTypes/definitions/Script.definition.d.ts.map +1 -0
  170. package/@types/lib/metadataTypes/definitions/SendClassification.definition.d.ts +151 -0
  171. package/@types/lib/metadataTypes/definitions/SendClassification.definition.d.ts.map +1 -0
  172. package/@types/lib/metadataTypes/definitions/SenderProfile.definition.d.ts +180 -0
  173. package/@types/lib/metadataTypes/definitions/SenderProfile.definition.d.ts.map +1 -0
  174. package/@types/lib/metadataTypes/definitions/TransactionalEmail.definition.d.ts +167 -0
  175. package/@types/lib/metadataTypes/definitions/TransactionalEmail.definition.d.ts.map +1 -0
  176. package/@types/lib/metadataTypes/definitions/TransactionalMessage.definition.d.ts +99 -0
  177. package/@types/lib/metadataTypes/definitions/TransactionalMessage.definition.d.ts.map +1 -0
  178. package/@types/lib/metadataTypes/definitions/TransactionalPush.definition.d.ts +119 -0
  179. package/@types/lib/metadataTypes/definitions/TransactionalPush.definition.d.ts.map +1 -0
  180. package/@types/lib/metadataTypes/definitions/TransactionalSMS.definition.d.ts +113 -0
  181. package/@types/lib/metadataTypes/definitions/TransactionalSMS.definition.d.ts.map +1 -0
  182. package/@types/lib/metadataTypes/definitions/TriggeredSend.definition.d.ts +560 -0
  183. package/@types/lib/metadataTypes/definitions/TriggeredSend.definition.d.ts.map +1 -0
  184. package/@types/lib/metadataTypes/definitions/User.definition.d.ts +423 -0
  185. package/@types/lib/metadataTypes/definitions/User.definition.d.ts.map +1 -0
  186. package/@types/lib/metadataTypes/definitions/Verification.definition.d.ts +129 -0
  187. package/@types/lib/metadataTypes/definitions/Verification.definition.d.ts.map +1 -0
  188. package/@types/lib/retrieveChangelog.d.ts +3 -0
  189. package/@types/lib/retrieveChangelog.d.ts.map +1 -0
  190. package/@types/lib/util/auth.d.ts +41 -0
  191. package/@types/lib/util/auth.d.ts.map +1 -0
  192. package/@types/lib/util/businessUnit.d.ts +21 -0
  193. package/@types/lib/util/businessUnit.d.ts.map +1 -0
  194. package/@types/lib/util/cache.d.ts +64 -0
  195. package/@types/lib/util/cache.d.ts.map +1 -0
  196. package/@types/lib/util/cli.d.ts +125 -0
  197. package/@types/lib/util/cli.d.ts.map +1 -0
  198. package/@types/lib/util/config.d.ts +45 -0
  199. package/@types/lib/util/config.d.ts.map +1 -0
  200. package/@types/lib/util/devops.d.ts +62 -0
  201. package/@types/lib/util/devops.d.ts.map +1 -0
  202. package/@types/lib/util/file.d.ts +20 -0
  203. package/@types/lib/util/file.d.ts.map +1 -0
  204. package/@types/lib/util/init.config.d.ts +66 -0
  205. package/@types/lib/util/init.config.d.ts.map +1 -0
  206. package/@types/lib/util/init.d.ts +72 -0
  207. package/@types/lib/util/init.d.ts.map +1 -0
  208. package/@types/lib/util/init.git.d.ts +40 -0
  209. package/@types/lib/util/init.git.d.ts.map +1 -0
  210. package/@types/lib/util/init.npm.d.ts +24 -0
  211. package/@types/lib/util/init.npm.d.ts.map +1 -0
  212. package/@types/lib/util/replaceContentBlockReference.d.ts +105 -0
  213. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -0
  214. package/@types/lib/util/util.d.ts +322 -0
  215. package/@types/lib/util/util.d.ts.map +1 -0
  216. package/@types/types/mcdev.d.d.ts +1282 -0
  217. package/@types/types/mcdev.d.d.ts.map +1 -0
  218. package/LICENSE +1 -1
  219. package/README.md +7 -3
  220. package/boilerplate/files/.beautyamp.json +13 -0
  221. package/boilerplate/files/.prettierrc +3 -0
  222. package/boilerplate/files/.vscode/extensions.json +6 -1
  223. package/boilerplate/files/.vscode/settings.json +16 -4
  224. package/boilerplate/forcedUpdates.json +9 -0
  225. package/jsconfig.json +7 -2
  226. package/lib/Builder.js +49 -45
  227. package/lib/Deployer.js +100 -45
  228. package/lib/MetadataTypeDefinitions.js +6 -0
  229. package/lib/MetadataTypeInfo.js +4 -0
  230. package/lib/Retriever.js +33 -27
  231. package/lib/cli.js +363 -28
  232. package/lib/index.js +615 -55
  233. package/lib/metadataTypes/Asset.js +811 -159
  234. package/lib/metadataTypes/AttributeGroup.js +17 -12
  235. package/lib/metadataTypes/AttributeSet.js +20 -15
  236. package/lib/metadataTypes/Automation.js +125 -93
  237. package/lib/metadataTypes/Campaign.js +18 -6
  238. package/lib/metadataTypes/ContentArea.js +21 -18
  239. package/lib/metadataTypes/DataExtension.js +229 -113
  240. package/lib/metadataTypes/DataExtensionField.js +52 -53
  241. package/lib/metadataTypes/DataExtensionTemplate.js +17 -5
  242. package/lib/metadataTypes/DataExtract.js +62 -27
  243. package/lib/metadataTypes/DataExtractType.js +17 -5
  244. package/lib/metadataTypes/DeliveryProfile.js +47 -0
  245. package/lib/metadataTypes/Discovery.js +15 -4
  246. package/lib/metadataTypes/Email.js +22 -19
  247. package/lib/metadataTypes/EmailSend.js +135 -35
  248. package/lib/metadataTypes/Event.js +95 -60
  249. package/lib/metadataTypes/FileLocation.js +17 -5
  250. package/lib/metadataTypes/FileTransfer.js +62 -26
  251. package/lib/metadataTypes/Filter.js +16 -4
  252. package/lib/metadataTypes/Folder.js +67 -39
  253. package/lib/metadataTypes/ImportFile.js +341 -91
  254. package/lib/metadataTypes/Journey.js +681 -324
  255. package/lib/metadataTypes/List.js +26 -14
  256. package/lib/metadataTypes/MetadataType.js +501 -265
  257. package/lib/metadataTypes/MobileCode.js +17 -5
  258. package/lib/metadataTypes/MobileKeyword.js +59 -43
  259. package/lib/metadataTypes/MobileMessage.js +67 -40
  260. package/lib/metadataTypes/Query.js +46 -38
  261. package/lib/metadataTypes/Role.js +34 -23
  262. package/lib/metadataTypes/Script.js +127 -39
  263. package/lib/metadataTypes/SendClassification.js +120 -5
  264. package/lib/metadataTypes/SenderProfile.js +179 -0
  265. package/lib/metadataTypes/TransactionalEmail.js +30 -17
  266. package/lib/metadataTypes/TransactionalMessage.js +25 -11
  267. package/lib/metadataTypes/TransactionalPush.js +24 -9
  268. package/lib/metadataTypes/TransactionalSMS.js +78 -46
  269. package/lib/metadataTypes/TriggeredSend.js +191 -43
  270. package/lib/metadataTypes/User.js +90 -62
  271. package/lib/metadataTypes/Verification.js +39 -21
  272. package/lib/metadataTypes/definitions/Asset.definition.js +3 -3
  273. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +7 -1
  274. package/lib/metadataTypes/definitions/AttributeSet.definition.js +2 -2
  275. package/lib/metadataTypes/definitions/Automation.definition.js +4 -1
  276. package/lib/metadataTypes/definitions/Campaign.definition.js +1 -1
  277. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -1
  278. package/lib/metadataTypes/definitions/DataExtension.definition.js +17 -1
  279. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -1
  280. package/lib/metadataTypes/definitions/DataExtractType.definition.js +2 -2
  281. package/lib/metadataTypes/definitions/DeliveryProfile.definition.js +59 -0
  282. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -1
  283. package/lib/metadataTypes/definitions/Email.definition.js +1 -1
  284. package/lib/metadataTypes/definitions/EmailSend.definition.js +19 -4
  285. package/lib/metadataTypes/definitions/Event.definition.js +140 -128
  286. package/lib/metadataTypes/definitions/FileLocation.definition.js +1 -1
  287. package/lib/metadataTypes/definitions/Filter.definition.js +1 -1
  288. package/lib/metadataTypes/definitions/Folder.definition.js +25 -2
  289. package/lib/metadataTypes/definitions/ImportFile.definition.js +52 -7
  290. package/lib/metadataTypes/definitions/Journey.definition.js +12 -0
  291. package/lib/metadataTypes/definitions/List.definition.js +1 -1
  292. package/lib/metadataTypes/definitions/MobileCode.definition.js +1 -1
  293. package/lib/metadataTypes/definitions/MobileMessage.definition.js +11 -5
  294. package/lib/metadataTypes/definitions/Query.definition.js +6 -0
  295. package/lib/metadataTypes/definitions/Script.definition.js +14 -14
  296. package/lib/metadataTypes/definitions/SendClassification.definition.js +60 -20
  297. package/lib/metadataTypes/definitions/SenderProfile.definition.js +185 -0
  298. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -2
  299. package/lib/metadataTypes/definitions/TransactionalMessage.definition.js +69 -0
  300. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +6 -0
  301. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +6 -0
  302. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +15 -4
  303. package/lib/metadataTypes/definitions/Verification.definition.js +1 -1
  304. package/lib/retrieveChangelog.js +7 -2
  305. package/lib/util/auth.js +56 -21
  306. package/lib/util/businessUnit.js +20 -2
  307. package/lib/util/cache.js +37 -18
  308. package/lib/util/cli.js +72 -29
  309. package/lib/util/config.js +27 -9
  310. package/lib/util/devops.js +45 -24
  311. package/lib/util/file.js +58 -33
  312. package/lib/util/init.config.js +55 -24
  313. package/lib/util/init.git.js +6 -6
  314. package/lib/util/init.js +36 -14
  315. package/lib/util/init.npm.js +2 -2
  316. package/lib/util/replaceContentBlockReference.js +278 -0
  317. package/lib/util/util.js +152 -54
  318. package/package.json +33 -30
  319. package/test/general.test.js +1327 -4
  320. package/test/mockRoot/.mcdevrc.json +26 -4
  321. package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testExisting_dataExtensionShared.dataExtension-meta.json +3 -4
  322. package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testNew_dataExtensionShared.dataExtension-meta.json +1 -4
  323. package/test/mockRoot/deploy/testInstance/_ParentBU_/query/testNew_query.query-meta.json +11 -0
  324. package/test/mockRoot/deploy/testInstance/_ParentBU_/query/testNew_query.query-meta.sql +4 -0
  325. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset.asset-block-meta.html +12 -0
  326. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset.asset-block-meta.json +39 -0
  327. package/test/mockRoot/deploy/testInstance/testBU/automation/testExisting_automation.automation-meta.json +6 -6
  328. package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +7 -7
  329. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testExisting_dataExtension.dataExtension-meta.json +3 -4
  330. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testNew_dataExtension.dataExtension-meta.json +1 -4
  331. package/test/mockRoot/deploy/testInstance/testBU/emailSend/testExisting_emailSend.emailSend-meta.json +36 -0
  332. package/test/mockRoot/deploy/testInstance/testBU/emailSend/testNew_emailSend.emailSend-meta.json +36 -0
  333. package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +10 -4
  334. package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +8 -4
  335. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_journey_Quicksend.journey-meta.json +232 -0
  336. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json +2 -4
  337. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.json +2 -4
  338. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query.query-meta.json +1 -1
  339. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.json +1 -1
  340. package/test/mockRoot/deploy/testInstance/testBU/query/testNew_query.query-meta.json +1 -1
  341. package/test/mockRoot/deploy/testInstance/testBU/sendClassification/testExisting_sendClassification.sendClassification-meta.json +8 -0
  342. package/test/mockRoot/deploy/testInstance/testBU/sendClassification/testNew_sendClassification.sendClassification-meta.json +8 -0
  343. package/test/mockRoot/deploy/testInstance/testBU/senderProfile/testExisting_senderProfile.senderProfile-meta.json +14 -0
  344. package/test/mockRoot/deploy/testInstance/testBU/senderProfile/testNew_senderProfile.senderProfile-meta.json +14 -0
  345. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +1 -1
  346. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -1
  347. package/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testExisting_tpush.transactionalPush-meta.json +1 -3
  348. package/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testNew_tpush.transactionalPush-meta.json +1 -3
  349. package/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json +1 -2
  350. package/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json +1 -2
  351. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testExisting_triggeredSend.triggeredSend-meta.json +4 -5
  352. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testNew_triggeredSend.triggeredSend-meta.json +4 -5
  353. package/test/mockRoot/deploy/testInstance/testBU/verification/testExisting_39f6a488-20eb-4ba0-b0b9.verification-meta.json +1 -1
  354. package/test/mockRoot/deploy/testInstance/testBU/verification/testNew_39f6a488-20eb-4ba0-b0b9.verification-meta.json +1 -1
  355. package/test/resourceFactory.js +118 -7
  356. package/test/resources/1111111/automation/v1/queries/get-response.json +6 -0
  357. package/test/resources/1111111/automation/v1/queries/post-response.json +18 -0
  358. package/test/resources/1111111/dataExtension/create-expected.json +4 -7
  359. package/test/resources/1111111/dataExtension/retrieve-expected.json +2 -4
  360. package/test/resources/1111111/dataExtension/update-expected.json +7 -7
  361. package/test/resources/1111111/dataExtension/update-response.xml +3 -1
  362. package/test/resources/1111111/dataFolder/retrieve-ContentType=queryactivity-response.xml +48 -0
  363. package/test/resources/1111111/query/patch_keySuffix-expected.json +11 -0
  364. package/test/resources/1111111/query/patch_keySuffix-expected.sql +4 -0
  365. package/test/resources/9999999/asset/block-1157-retrieve-expected.html +4 -3
  366. package/test/resources/9999999/asset/build-templatebasedemail-expected.json +81 -0
  367. package/test/resources/9999999/asset/build-templatebasedemail-html-expected.html +20 -0
  368. package/test/resources/9999999/asset/build-templatebasedemail-preheader-expected.amp +1 -0
  369. package/test/resources/9999999/asset/create-expected.json +18 -0
  370. package/test/resources/9999999/asset/resolveId-1234-notFound-expected.json +1 -0
  371. package/test/resources/9999999/asset/resolveId-1295064-noPath-expected.json +8 -0
  372. package/test/resources/9999999/asset/resolveId-1295064-withPath-expected.json +8 -0
  373. package/test/resources/9999999/asset/retrieve-templatebasedemail-expected.json +84 -0
  374. package/test/resources/9999999/asset/retrieve-templatebasedemail-html-expected.html +20 -0
  375. package/test/resources/9999999/asset/retrieve-templatebasedemail-preheader-expected.amp +1 -0
  376. package/test/resources/9999999/asset/template-templatebasedemail-expected.json +81 -0
  377. package/test/resources/9999999/asset/template-templatebasedemail-html-expected.html +20 -0
  378. package/test/resources/9999999/asset/template-templatebasedemail-preheader-expected.amp +1 -0
  379. package/test/resources/9999999/asset/testExisting_asset_message-html-rcb-id-expected.html +33 -0
  380. package/test/resources/9999999/asset/testExisting_asset_message-html-rcb-key-expected.html +33 -0
  381. package/test/resources/9999999/asset/testExisting_asset_message-html-rcb-name-expected.html +35 -0
  382. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-id-expected.amp +4 -0
  383. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-key-expected.amp +4 -0
  384. package/test/resources/9999999/asset/testExisting_asset_message-preheader-rcb-name-expected.amp +4 -0
  385. package/test/resources/9999999/asset/testExisting_asset_message-text-rcb-id-expected.amp +4 -0
  386. package/test/resources/9999999/asset/testExisting_asset_message-text-rcb-key-expected.amp +4 -0
  387. package/test/resources/9999999/asset/testExisting_asset_message-text-rcb-name-expected.amp +4 -0
  388. package/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json +1 -1
  389. package/test/resources/9999999/asset/v1/content/assets/5286/get-response.json +48 -0
  390. package/test/resources/9999999/asset/v1/content/assets/5289/get-response.json +198 -0
  391. package/test/resources/9999999/asset/v1/content/assets/808714/get-response.json +4 -3
  392. package/test/resources/9999999/asset/v1/content/assets/950143/delete-response.txt +1 -0
  393. package/test/resources/9999999/asset/v1/content/assets/get-response-customerKey=testExisting_asset.json +105 -0
  394. package/test/resources/9999999/asset/v1/content/assets/post-response.json +59 -0
  395. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,14.json +7 -0
  396. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN193,194,15.json +7 -0
  397. 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 +46 -0
  398. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN205,206,230,232,1.json +32 -0
  399. package/test/resources/9999999/asset/v1/content/assets/query/{post-response.json → post-response-assetType.idIN207,208,209,5.json} +45 -47
  400. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN214,4.json +35 -0
  401. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN215,216,217,218,219,220,221,222,223,224,225,226,227,228.json +7 -0
  402. package/test/resources/9999999/asset/v1/content/assets/query/post-response-customerKey=mcdev-issue-1157.json +46 -0
  403. package/test/resources/9999999/attributeGroup/retrieve-expected.json +1 -1
  404. package/test/resources/9999999/attributeSet/retrieve-expected.json +3 -3
  405. package/test/resources/9999999/automation/build-expected.json +7 -7
  406. package/test/resources/9999999/automation/create-expected.json +7 -7
  407. package/test/resources/9999999/automation/patch_fixKeys-pause-expected.json +6 -6
  408. package/test/resources/9999999/automation/patch_fixKeys-schedule-expected.json +6 -6
  409. package/test/resources/9999999/automation/retrieve-expected.json +7 -7
  410. package/test/resources/9999999/automation/template-expected.json +7 -7
  411. package/test/resources/9999999/automation/update-expected.json +6 -6
  412. package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/delete-response.txt +1 -0
  413. package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/delete-response.json +1 -0
  414. package/test/resources/9999999/automation/v1/imports/1ebf557b-372e-eb11-b81b-48df37d1dbd7/get-response.json +78 -0
  415. package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/delete-response.txt +0 -0
  416. package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/get-response.json +35 -0
  417. package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/patch-response.json +14 -10
  418. package/test/resources/9999999/automation/v1/imports/get-response.json +78 -1
  419. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +1 -1
  420. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeysSuffix/get-response.json +17 -0
  421. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeysSuffix/patch-response.json +18 -0
  422. package/test/resources/9999999/automation/v1/queries/abcde-607c-4940-afef-437965094dat/get-response.json +17 -0
  423. package/test/resources/9999999/automation/v1/queries/get-response.json +20 -3
  424. package/test/resources/9999999/automation/v1/scripts/39f6a488-20eb-4ba0-b0b9-023725b574e4/delete-response.txt +1 -0
  425. package/test/resources/9999999/automation/v1/scripts/get-response.json +3 -3
  426. package/test/resources/9999999/dataExtension/build-expected.json +3 -4
  427. package/test/resources/9999999/dataExtension/create-expected.json +1 -4
  428. package/test/resources/9999999/dataExtension/retrieve-Name=testExisting_dataExtension-response.xml +4 -4
  429. package/test/resources/9999999/dataExtension/retrieve-expected.json +3 -4
  430. package/test/resources/9999999/dataExtension/retrieve-response.xml +96 -1
  431. package/test/resources/9999999/dataExtension/template-expected.json +3 -4
  432. package/test/resources/9999999/dataExtension/update-expected.json +4 -3
  433. package/test/resources/9999999/dataExtension/update-response.xml +5 -3
  434. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +72 -0
  435. package/test/resources/9999999/dataFolder/retrieve-ContentType=userinitiatedsends-response.xml +48 -0
  436. package/test/resources/9999999/deliveryProfile/get-expected.json +7 -0
  437. package/test/resources/9999999/emailSend/build-expected.json +43 -0
  438. package/test/resources/9999999/emailSend/get-expected.json +43 -0
  439. package/test/resources/9999999/emailSend/patch-expected.json +41 -0
  440. package/test/resources/9999999/emailSend/post-expected.json +41 -0
  441. package/test/resources/9999999/emailSend/template-expected.json +43 -0
  442. package/test/resources/9999999/emailSendDefinition/create-response.xml +98 -0
  443. package/test/resources/9999999/emailSendDefinition/delete-response.xml +36 -0
  444. package/test/resources/9999999/emailSendDefinition/retrieve-IsPlatformObject=falseANDDescriptionnotEqualsSFSendDefinition-response.xml +18 -8
  445. package/test/resources/9999999/emailSendDefinition/update-response.xml +97 -0
  446. package/test/resources/9999999/importDefinition/retrieve-CustomerKey=testExisting_importFile-response.xml +30 -0
  447. package/test/resources/9999999/importDefinition/retrieve-Name=testExisting_importFile-response.xml +30 -0
  448. package/test/resources/9999999/importFile/build-expected.json +11 -6
  449. package/test/resources/9999999/importFile/get-expected.json +13 -7
  450. package/test/resources/9999999/importFile/get-sms-expected.json +79 -0
  451. package/test/resources/9999999/importFile/patch-expected.json +12 -7
  452. package/test/resources/9999999/importFile/post-expected.json +8 -5
  453. package/test/resources/9999999/importFile/template-expected.json +10 -5
  454. package/test/resources/9999999/interaction/v1/eventDefinitions/get-response.json +124 -0
  455. package/test/resources/9999999/interaction/v1/interactions/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/delete-response.txt +1 -0
  456. package/test/resources/9999999/interaction/v1/interactions/3c3f4112-9b43-43ca-8a89-aa0375b2c1a2/get-response.json +253 -0
  457. package/test/resources/9999999/interaction/v1/interactions/get-response.json +83 -779
  458. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Multistep/get-response.json +457 -0
  459. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Quicksend/get-response.json +253 -0
  460. package/test/resources/9999999/interaction/v1/interactions/{key_0b76dccf-594c-b6dc-1acf-10c4493dcb84 → key_testExisting_temail}/get-response.json +5 -5
  461. package/test/resources/9999999/journey/build-expected.json +105 -449
  462. package/test/resources/9999999/journey/get-multistep-expected.json +413 -0
  463. package/test/resources/9999999/journey/get-quicksend-expected.json +232 -0
  464. package/test/resources/9999999/journey/get-quicksend-rcb-id-expected.json +232 -0
  465. package/test/resources/9999999/journey/get-quicksend-rcb-key-expected.json +232 -0
  466. package/test/resources/9999999/journey/get-quicksend-rcb-name-expected.json +232 -0
  467. package/test/resources/9999999/journey/get-transactionalEmail-expected.json +211 -0
  468. package/test/resources/9999999/journey/template-expected.json +105 -449
  469. package/test/resources/9999999/legacy/v1/beta/messaging/deliverypolicy/get-response.json +15 -0
  470. package/test/resources/9999999/legacy/v1/beta/mobile/imports/get-response.json +112 -0
  471. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTQ3Ojc4OjA/get-response.json +1 -1
  472. package/test/resources/9999999/legacy/v1/beta/object/NWQwdnhEU3dFZWVBekJRQzdISWl0QTo0NTow/get-response.json +12 -0
  473. package/test/resources/9999999/list/retrieve-response.xml +13 -0
  474. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json +1 -1
  475. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json +1 -1
  476. package/test/resources/9999999/mobileMessage/build-expected.json +2 -5
  477. package/test/resources/9999999/mobileMessage/get-expected.json +2 -5
  478. package/test/resources/9999999/mobileMessage/post-create-expected.json +2 -4
  479. package/test/resources/9999999/mobileMessage/post-update-expected.json +2 -5
  480. package/test/resources/9999999/mobileMessage/template-expected.json +2 -5
  481. package/test/resources/9999999/query/build-expected.json +1 -1
  482. package/test/resources/9999999/query/build-expected.sql +2 -1
  483. package/test/resources/9999999/query/get-expected.json +1 -1
  484. package/test/resources/9999999/query/get-expected.sql +2 -1
  485. package/test/resources/9999999/query/get2-expected.json +1 -1
  486. package/test/resources/9999999/query/patch-expected.json +1 -1
  487. package/test/resources/9999999/query/patch_fixKeys-expected.json +1 -1
  488. package/test/resources/9999999/query/patch_fixKeysSuffix-expected.json +11 -0
  489. package/test/resources/9999999/query/patch_fixKeysSuffix-expected.sql +6 -0
  490. package/test/resources/9999999/query/post-expected.json +1 -1
  491. package/test/resources/9999999/query/template-expected.json +1 -1
  492. package/test/resources/9999999/query/template-expected.sql +2 -1
  493. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query2ANDStatus=Active-response.xml +30 -0
  494. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixKeysSuffixANDStatus=Active-response.xml +30 -0
  495. package/test/resources/9999999/script/get_ampincluded-expected.html +5 -0
  496. package/test/resources/9999999/script/get_ampincluded-rcb-id-expected.html +5 -0
  497. package/test/resources/9999999/script/get_ampincluded-rcb-key-expected.html +5 -0
  498. package/test/resources/9999999/script/get_ampincluded-rcb-name-expected.html +5 -0
  499. package/test/resources/9999999/script/get_ampscript-expected.html +6 -1
  500. package/test/resources/9999999/script/get_ampscript-rcb-id-expected.html +8 -0
  501. package/test/resources/9999999/script/get_ampscript-rcb-key-expected.html +8 -0
  502. package/test/resources/9999999/script/get_ampscript-rcb-name-expected.html +10 -0
  503. package/test/resources/9999999/script/get_mixed-expected.html +5 -2
  504. package/test/resources/9999999/script/get_mixed-rcb-id-expected.html +12 -0
  505. package/test/resources/9999999/script/get_mixed-rcb-key-expected.html +12 -0
  506. package/test/resources/9999999/script/get_mixed-rcb-name-expected.html +14 -0
  507. package/test/resources/9999999/sendClassification/build-expected.json +8 -0
  508. package/test/resources/9999999/sendClassification/create-response.xml +51 -0
  509. package/test/resources/9999999/sendClassification/delete-response.xml +36 -0
  510. package/test/resources/9999999/sendClassification/get-expected.json +10 -0
  511. package/test/resources/9999999/sendClassification/patch-expected.json +8 -0
  512. package/test/resources/9999999/sendClassification/post-expected.json +8 -0
  513. package/test/resources/9999999/sendClassification/retrieve-response.xml +86 -0
  514. package/test/resources/9999999/sendClassification/template-expected.json +8 -0
  515. package/test/resources/9999999/sendClassification/update-response.xml +49 -0
  516. package/test/resources/9999999/senderProfile/build-expected.json +14 -0
  517. package/test/resources/9999999/senderProfile/create-response.xml +49 -0
  518. package/test/resources/9999999/senderProfile/delete-response.xml +36 -0
  519. package/test/resources/9999999/senderProfile/get-expected.json +16 -0
  520. package/test/resources/9999999/senderProfile/get-rcb-id-expected.json +16 -0
  521. package/test/resources/9999999/senderProfile/get-rcb-key-expected.json +16 -0
  522. package/test/resources/9999999/senderProfile/get-rcb-name-expected.json +16 -0
  523. package/test/resources/9999999/senderProfile/patch-expected.json +14 -0
  524. package/test/resources/9999999/senderProfile/post-expected.json +14 -0
  525. package/test/resources/9999999/senderProfile/retrieve-CustomerKey=Default-response.xml +44 -0
  526. package/test/resources/9999999/senderProfile/retrieve-CustomerKey=wrong-key-response.xml +26 -0
  527. package/test/resources/9999999/senderProfile/retrieve-response.xml +80 -0
  528. package/test/resources/9999999/senderProfile/template-expected.json +14 -0
  529. package/test/resources/9999999/senderProfile/update-response.xml +47 -0
  530. package/test/resources/9999999/transactionalEmail/build-expected.json +3 -3
  531. package/test/resources/9999999/transactionalEmail/get-expected.json +3 -3
  532. package/test/resources/9999999/transactionalEmail/patch-expected.json +3 -3
  533. package/test/resources/9999999/transactionalEmail/post-expected.json +2 -2
  534. package/test/resources/9999999/transactionalEmail/template-expected.json +3 -3
  535. package/test/resources/9999999/transactionalPush/build-expected.json +1 -1
  536. package/test/resources/9999999/transactionalPush/get-expected.json +1 -1
  537. package/test/resources/9999999/transactionalPush/patch-expected.json +1 -3
  538. package/test/resources/9999999/transactionalPush/post-expected.json +1 -3
  539. package/test/resources/9999999/transactionalPush/template-expected.json +1 -1
  540. package/test/resources/9999999/transactionalSMS/build-expected.amp +1 -1
  541. package/test/resources/9999999/transactionalSMS/build-expected.json +1 -2
  542. package/test/resources/9999999/transactionalSMS/get-expected.amp +1 -1
  543. package/test/resources/9999999/transactionalSMS/get-expected.json +1 -2
  544. package/test/resources/9999999/transactionalSMS/patch-expected.amp +1 -1
  545. package/test/resources/9999999/transactionalSMS/patch-expected.json +1 -2
  546. package/test/resources/9999999/transactionalSMS/post-expected.amp +1 -1
  547. package/test/resources/9999999/transactionalSMS/post-expected.json +1 -2
  548. package/test/resources/9999999/transactionalSMS/template-expected.amp +1 -1
  549. package/test/resources/9999999/transactionalSMS/template-expected.json +1 -2
  550. package/test/resources/9999999/triggeredSend/build-expected.json +5 -6
  551. package/test/resources/9999999/triggeredSend/get-expected.json +5 -6
  552. package/test/resources/9999999/triggeredSend/get-rcb-id-expected.json +29 -0
  553. package/test/resources/9999999/triggeredSend/get-rcb-key-expected.json +29 -0
  554. package/test/resources/9999999/triggeredSend/get-rcb-name-expected.json +29 -0
  555. package/test/resources/9999999/triggeredSend/patch-expected.json +5 -6
  556. package/test/resources/9999999/triggeredSend/post-expected.json +5 -6
  557. package/test/resources/9999999/triggeredSend/template-expected.json +5 -6
  558. package/test/resources/9999999/triggeredSendDefinition/create-response.xml +6 -1
  559. package/test/resources/9999999/triggeredSendDefinition/retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml +53 -1
  560. package/test/resources/9999999/triggeredSendDefinition/update-response.xml +6 -1
  561. package/test/resources/9999999/verification/build-expected.json +1 -1
  562. package/test/resources/9999999/verification/get-expected.json +1 -1
  563. package/test/resources/9999999/verification/patch-expected.json +1 -1
  564. package/test/resources/9999999/verification/post-expected.json +1 -1
  565. package/test/resources/9999999/verification/template-expected.json +1 -1
  566. package/test/type.asset.test.js +733 -17
  567. package/test/type.attributeGroup.test.js +6 -2
  568. package/test/type.attributeSet.test.js +6 -2
  569. package/test/type.automation.test.js +174 -162
  570. package/test/type.dataExtension.test.js +41 -45
  571. package/test/type.dataExtract.test.js +22 -29
  572. package/test/type.deliveryProfile.test.js +45 -0
  573. package/test/type.emailSend.test.js +144 -0
  574. package/test/type.event.test.js +62 -0
  575. package/test/type.fileTransfer.test.js +21 -29
  576. package/test/type.importFile.test.js +61 -35
  577. package/test/type.journey.test.js +251 -45
  578. package/test/type.mobileKeyword.test.js +46 -54
  579. package/test/type.mobileMessage.test.js +28 -27
  580. package/test/type.query.test.js +303 -124
  581. package/test/type.script.test.js +288 -69
  582. package/test/type.sendClassification.test.js +156 -0
  583. package/test/type.senderProfile.test.js +254 -0
  584. package/test/type.transactionalEmail.test.js +15 -11
  585. package/test/type.transactionalPush.test.js +15 -11
  586. package/test/type.transactionalSMS.test.js +30 -23
  587. package/test/type.triggeredSend.test.js +130 -17
  588. package/test/type.user.test.js +22 -14
  589. package/test/type.verification.test.js +13 -10
  590. package/test/utils.js +76 -21
  591. package/tsconfig.json +21 -0
  592. package/types/mcdev.d.js +190 -66
  593. package/docs/dist/documentation.md +0 -8878
  594. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_interaction.interaction-meta.json +0 -576
  595. package/test/mockRoot/deploy/testInstance/testBU/journey/testNew_interaction.interaction-meta.json +0 -266
  596. package/test/resources/9999999/interaction/v1/EventDefinitions/get-response.json +0 -43
  597. package/test/resources/9999999/interaction/v1/interactions/233d4413-922c-4568-85a5-e5cc77efc3be/delete-response.json +0 -1
  598. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +0 -592
  599. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/put-response.json +0 -592
  600. package/test/resources/9999999/interaction/v1/interactions/post-response.json +0 -280
  601. package/test/resources/9999999/journey/get-expected.json +0 -576
  602. package/test/resources/9999999/script/get_ampincluded-expected.ssjs +0 -5
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  import jsonToTable from 'json-to-table';
4
- import TYPE from '../../types/mcdev.d.js';
5
4
  import MetadataType from './MetadataType.js';
6
5
  import AttributeSet from './AttributeSet.js';
7
6
  import DataExtensionField from './DataExtensionField.js';
@@ -13,22 +12,40 @@ import cache from '../util/cache.js';
13
12
  import pLimit from 'p-limit';
14
13
  import inquirer from 'inquirer';
15
14
 
15
+ /**
16
+ * @typedef {import('../../types/mcdev.d.js').BuObject} BuObject
17
+ * @typedef {import('../../types/mcdev.d.js').MetadataTypeItem} MetadataTypeItem
18
+ * @typedef {import('../../types/mcdev.d.js').MetadataTypeItemDiff} MetadataTypeItemDiff
19
+ * @typedef {import('../../types/mcdev.d.js').MetadataTypeMap} MetadataTypeMap
20
+ * @typedef {import('../../types/mcdev.d.js').SoapRequestParams} SoapRequestParams
21
+ * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
22
+ */
23
+ /**
24
+ * @typedef {import('../../types/mcdev.d.js').DataExtensionFieldItem} DataExtensionFieldItem
25
+ * @typedef {import('../../types/mcdev.d.js').DataExtensionFieldMap} DataExtensionFieldMap
26
+ * @typedef {import('../../types/mcdev.d.js').DataExtensionItem} DataExtensionItem
27
+ * @typedef {import('../../types/mcdev.d.js').DataExtensionMap} DataExtensionMap
28
+ */
29
+
16
30
  /**
17
31
  * DataExtension MetadataType
18
32
  *
19
33
  * @augments MetadataType
20
34
  */
21
35
  class DataExtension extends MetadataType {
36
+ /** @type {DataExtensionFieldMap} */
37
+ static oldFields;
22
38
  /**
23
39
  * Upserts dataExtensions after retrieving them from source and target to compare
24
40
  * if create or update operation is needed.
25
41
  *
26
- * @param {TYPE.DataExtensionMap} metadataMap dataExtensions mapped by their customerKey
42
+ * @param {DataExtensionMap} metadataMap dataExtensions mapped by their customerKey
27
43
  * @returns {Promise} Promise
28
44
  */
29
45
  static async upsert(metadataMap) {
30
46
  // get existing DE-fields for DE-keys in deployment package to properly handle add/update/delete of fields
31
47
  // we need to use IN here because it would fail otherwise if we try to deploy too many DEs at the same time
48
+ /** @type {SoapRequestParams} */
32
49
  const fieldOptions = {
33
50
  filter: {
34
51
  leftOperand: 'DataExtension.CustomerKey',
@@ -88,9 +105,7 @@ class DataExtension extends MetadataType {
88
105
  await Promise.allSettled(
89
106
  metadataToUpdate
90
107
  .filter((r) => r !== undefined && r !== null)
91
- .map((metadataEntry) =>
92
- updateLimit(() => this.update(metadataEntry.after, metadataEntry.before))
93
- )
108
+ .map((metadataEntry) => updateLimit(() => this.update(metadataEntry.after)))
94
109
  )
95
110
  )
96
111
  .filter((r) => r !== undefined && r !== null)
@@ -104,6 +119,7 @@ class DataExtension extends MetadataType {
104
119
  let upsertResults;
105
120
  if (successfulResults.length > 0) {
106
121
  const metadataResults = successfulResults
122
+ // @ts-expect-error not sure why this produces a type error. looks 100% correct
107
123
  .map((r) => r.value.Results[0].Object)
108
124
  .map((r) => {
109
125
  // if only one fields added will return object otherwise array
@@ -128,12 +144,12 @@ class DataExtension extends MetadataType {
128
144
  /**
129
145
  * helper for {@link MetadataType.upsert}
130
146
  *
131
- * @param {TYPE.MetadataTypeMap} metadataMap list of metadata
147
+ * @param {MetadataTypeMap} metadataMap list of metadata
132
148
  * @param {string} metadataKey key of item we are looking at
133
149
  * @param {boolean} hasError error flag from previous code
134
- * @param {TYPE.MetadataTypeItemDiff[]} metadataToUpdate list of items to update
135
- * @param {TYPE.MetadataTypeItem[]} metadataToCreate list of items to create
136
- * @returns {'create' | 'update' | 'skip'} action to take
150
+ * @param {MetadataTypeItemDiff[]} metadataToUpdate list of items to update
151
+ * @param {MetadataTypeItem[]} metadataToCreate list of items to create
152
+ * @returns {Promise.<'create'|'update'|'skip'>} action to take
137
153
  */
138
154
  static async createOrUpdate(
139
155
  metadataMap,
@@ -156,6 +172,7 @@ class DataExtension extends MetadataType {
156
172
  DataExtensionField.client = this.client;
157
173
  DataExtensionField.properties = this.properties;
158
174
  DataExtension.oldFields ||= {};
175
+ // @ts-expect-error not sure why this produces a type error. looks 100% correct
159
176
  DataExtension.oldFields[metadataMap[metadataKey][this.definition.keyField]] =
160
177
  await DataExtensionField.prepareDeployColumnsOnUpdate(
161
178
  metadataMap[metadataKey].Fields,
@@ -193,11 +210,11 @@ class DataExtension extends MetadataType {
193
210
  // </Fields>
194
211
  metadataMap[metadataKey].Fields = { Field: metadataMap[metadataKey].Fields };
195
212
  }
213
+ return action;
196
214
  }
197
215
  /**
198
216
  * helper for {@link DataExtension.upsert}
199
217
  *
200
- * @private
201
218
  * @param {object} res -
202
219
  * @returns {boolean} true: keep, false: discard
203
220
  */
@@ -230,7 +247,7 @@ class DataExtension extends MetadataType {
230
247
  /**
231
248
  * Create a single dataExtension. Also creates their columns in 'dataExtension.columns'
232
249
  *
233
- * @param {TYPE.DataExtensionItem} metadata single metadata entry
250
+ * @param {DataExtensionItem} metadata single metadata entry
234
251
  * @returns {Promise} Promise
235
252
  */
236
253
  static async create(metadata) {
@@ -242,8 +259,7 @@ class DataExtension extends MetadataType {
242
259
  * if that field duplicates whats in the period fields
243
260
  * during deployment, that extra value is not accepted by the APIs which is why it needs to be removed
244
261
  *
245
- * @private
246
- * @param {TYPE.DataExtensionItem} metadata single metadata entry
262
+ * @param {DataExtensionItem} metadata single metadata entry
247
263
  * @returns {void}
248
264
  */
249
265
  static #cleanupRetentionPolicyFields(metadata) {
@@ -261,7 +277,7 @@ class DataExtension extends MetadataType {
261
277
  /**
262
278
  * Updates a single dataExtension. Also updates their columns in 'dataExtension.columns'
263
279
  *
264
- * @param {TYPE.DataExtensionItem} metadata single metadata entry
280
+ * @param {DataExtensionItem} metadata single metadata entry
265
281
  * @returns {Promise} Promise
266
282
  */
267
283
  static async update(metadata) {
@@ -270,10 +286,10 @@ class DataExtension extends MetadataType {
270
286
  /**
271
287
  * Gets executed after deployment of metadata type
272
288
  *
273
- * @param {TYPE.DataExtensionMap} upsertedMetadata metadata mapped by their keyField
274
- * @param {TYPE.DataExtensionMap} originalMetadata metadata to be updated (contains additioanl fields)
289
+ * @param {DataExtensionMap} upsertedMetadata metadata mapped by their keyField
290
+ * @param {DataExtensionMap} originalMetadata metadata to be updated (contains additioanl fields)
275
291
  * @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
276
- * @returns {void}
292
+ * @returns {Promise.<void>} -
277
293
  */
278
294
  static async postDeployTasks(upsertedMetadata, originalMetadata, createdUpdated) {
279
295
  for (const key in upsertedMetadata) {
@@ -295,6 +311,7 @@ class DataExtension extends MetadataType {
295
311
 
296
312
  const existingFields = DataExtension.oldFields[item[this.definition.keyField]];
297
313
 
314
+ // @ts-expect-error Fields is a special case that cannot be properly typed; emtpy string is required for SOAP API
298
315
  if (item.Fields === '') {
299
316
  // if no fields were updated, we need to set Fields to "empty string" for the API to work
300
317
  // reset here to get the correct field list
@@ -303,15 +320,15 @@ class DataExtension extends MetadataType {
303
320
  .sort((a, b) => a.Ordinal - b.Ordinal);
304
321
  } else if (existingFields) {
305
322
  // get list of updated fields
306
- /** @type {TYPE.DataExtensionFieldItem[]} */
323
+ /** @type {DataExtensionFieldItem[]} */ // @ts-ignore Fields.Field is a special case that cannot be properly typed; only required for SOAP API
307
324
  const updatedFieldsArr = originalMetadata[oldKey].Fields.Field.filter(
308
325
  (field) => field.ObjectID && field.ObjectID !== ''
309
326
  );
310
327
  // convert existing fields obj into array and sort
311
- /** @type {TYPE.DataExtensionFieldItem[]} */
328
+ /** @type {DataExtensionFieldItem[]} */
312
329
  const finalFieldsArr = Object.keys(existingFields)
313
330
  .map((el) => {
314
- /** @type {TYPE.DataExtensionFieldItem} */
331
+ /** @type {DataExtensionFieldItem} */
315
332
  const existingField = existingFields[el];
316
333
  // check if the current field was updated and then override with it. otherwise use existing value
317
334
  const field =
@@ -327,7 +344,7 @@ class DataExtension extends MetadataType {
327
344
  .sort((a, b) => a.Ordinal - b.Ordinal);
328
345
 
329
346
  // get list of new fields
330
- /** @type {TYPE.DataExtensionFieldItem[]} */
347
+ /** @type {DataExtensionFieldItem[]} */ // @ts-ignore Fields.Field is a special case that cannot be properly typed; only required for SOAP API
331
348
  const newFieldsArr = originalMetadata[oldKey].Fields.Field.filter(
332
349
  (field) => !field.ObjectID
333
350
  );
@@ -343,7 +360,7 @@ class DataExtension extends MetadataType {
343
360
  }
344
361
  // UPDATE + CREATE
345
362
  for (const field of item.Fields) {
346
- DataExtensionField.postRetrieveTasks(field, true);
363
+ DataExtensionField.postRetrieveTasksDE(field);
347
364
  }
348
365
  }
349
366
  await this.#fixShared(upsertedMetadata, originalMetadata, createdUpdated);
@@ -354,10 +371,10 @@ class DataExtension extends MetadataType {
354
371
  * helper for {@link DataExtension.postDeployTasks}
355
372
  * fixes an issue where shared data extensions are not visible in data designer on child BU; SF known issue: https://issues.salesforce.com/#q=W-11031095
356
373
  *
357
- * @param {TYPE.DataExtensionMap} upsertedMetadata metadata mapped by their keyField
358
- * @param {TYPE.DataExtensionMap} originalMetadata metadata to be updated (contains additioanl fields)
374
+ * @param {DataExtensionMap} upsertedMetadata metadata mapped by their keyField
375
+ * @param {DataExtensionMap} originalMetadata metadata to be updated (contains additioanl fields)
359
376
  * @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
360
- * @returns {void}
377
+ * @returns {Promise.<void>} -
361
378
  */
362
379
  static async #fixShared(upsertedMetadata, originalMetadata, createdUpdated) {
363
380
  if (this.buObject.eid !== this.buObject.mid) {
@@ -391,6 +408,7 @@ class DataExtension extends MetadataType {
391
408
  const clientBak = this.client;
392
409
 
393
410
  // get dataExtension ID-Key relationship
411
+ /** @type {Object.<string, string>} */
394
412
  const sharedDataExtensionMap = {};
395
413
  for (const key of sharedDataExtensionsKeys) {
396
414
  try {
@@ -434,7 +452,7 @@ class DataExtension extends MetadataType {
434
452
  /**
435
453
  * helper for {@link DataExtension.#fixShared}
436
454
  *
437
- * @returns {string[]} list of selected BU names
455
+ * @returns {Promise.<string[]>} list of selected BU names
438
456
  */
439
457
  static async #fixShared_getBUs() {
440
458
  const buListObj = this.properties.credentials[this.buObject.credential].businessUnits;
@@ -467,13 +485,16 @@ class DataExtension extends MetadataType {
467
485
  value: name,
468
486
  checked: fixBuPreselected.includes(name),
469
487
  }));
470
- const questions = {
471
- type: 'checkbox',
472
- name: 'businessUnits',
473
- message: 'Please select BUs that have access to the updated Shared Data Extensions:',
474
- pageSize: 10,
475
- choices: buList,
476
- };
488
+ const questions = [
489
+ {
490
+ type: 'checkbox',
491
+ name: 'businessUnits',
492
+ message:
493
+ 'Please select BUs that have access to the updated Shared Data Extensions:',
494
+ pageSize: 10,
495
+ choices: buList,
496
+ },
497
+ ];
477
498
  let responses = null;
478
499
 
479
500
  try {
@@ -488,7 +509,7 @@ class DataExtension extends MetadataType {
488
509
  * helper for {@link DataExtension.#fixShared}
489
510
  *
490
511
  * @param {string} childBuName name of child BU to fix
491
- * @param {TYPE.BuObject} buObjectParent bu object for parent BU
512
+ * @param {BuObject} buObjectParent bu object for parent BU
492
513
  * @param {object} clientParent SDK for parent BU
493
514
  * @param {Object.<string, string>} sharedDataExtensionMap ID-Key relationship of shared data extensions
494
515
  * @returns {Promise.<string[]>} updated shared DE keys on BU
@@ -499,7 +520,7 @@ class DataExtension extends MetadataType {
499
520
  clientParent,
500
521
  sharedDataExtensionMap
501
522
  ) {
502
- /** @type {TYPE.BuObject} */
523
+ /** @type {BuObject} */
503
524
  const buObjectChildBu = {
504
525
  eid: this.properties.credentials[buObjectParent.credential].eid,
505
526
  mid: this.properties.credentials[buObjectParent.credential].businessUnits[childBuName],
@@ -571,9 +592,9 @@ class DataExtension extends MetadataType {
571
592
  *
572
593
  * @param {string} deId data extension ObjectID
573
594
  * @param {string} deKey dataExtension key
574
- * @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
595
+ * @param {BuObject} buObjectChildBu BU object for Child BU
575
596
  * @param {object} clientChildBu SDK for child BU
576
- * @param {TYPE.BuObject} buObjectParent BU object for Parent BU
597
+ * @param {BuObject} buObjectParent BU object for Parent BU
577
598
  * @param {object} clientParent SDK for parent BU
578
599
  * @returns {Promise.<boolean>} flag that signals if the fix was successful
579
600
  */
@@ -628,7 +649,7 @@ class DataExtension extends MetadataType {
628
649
  * add a new field to the shared DE to trigger an update to the data model
629
650
  * helper for {@link DataExtension.#fixShared_item}
630
651
  *
631
- * @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
652
+ * @param {BuObject} buObjectChildBu BU object for Child BU
632
653
  * @param {object} clientChildBu SDK for child BU
633
654
  * @param {string} deKey dataExtension key
634
655
  * @param {string} deId dataExtension ObjectID
@@ -639,28 +660,26 @@ class DataExtension extends MetadataType {
639
660
  this.client = clientChildBu;
640
661
  const randomSuffix = Util.OPTIONS._runningTest
641
662
  ? '_randomNumber_'
642
- : Math.floor(Math.random() * 9999999999);
663
+ : Math.floor(Math.random() * 9999999999).toString();
643
664
  // add a new field to the shared DE to trigger an update to the data model
644
665
  const soapType = this.definition.soapType || this.definition.type;
645
- await this.client.soap.update(
646
- Util.capitalizeFirstLetter(soapType),
647
- {
648
- CustomerKey: deKey,
649
- ObjectID: deId,
650
- Fields: {
651
- Field: [
652
- {
653
- Name: 'TriggerUpdate' + randomSuffix,
654
- IsRequired: false,
655
- IsPrimaryKey: false,
656
- FieldType: 'Boolean',
657
- ObjectID: null,
658
- },
659
- ],
660
- },
666
+ const payload = {
667
+ CustomerKey: deKey,
668
+ ObjectID: deId,
669
+ Fields: {
670
+ Field: [
671
+ {
672
+ Name: 'TriggerUpdate' + randomSuffix,
673
+ IsRequired: false,
674
+ IsPrimaryKey: false,
675
+ FieldType: 'Boolean',
676
+ ObjectID: null,
677
+ },
678
+ ],
661
679
  },
662
- null
663
- );
680
+ };
681
+ // @ts-expect-error SFMC-SDK typing error
682
+ await this.client.soap.update(Util.capitalizeFirstLetter(soapType), payload, null);
664
683
  return randomSuffix;
665
684
  }
666
685
 
@@ -669,7 +688,7 @@ class DataExtension extends MetadataType {
669
688
  * helper for {@link DataExtension.#fixShared_item}
670
689
  *
671
690
  * @param {string} randomSuffix -
672
- * @param {TYPE.BuObject} buObjectParent BU object for Parent BU
691
+ * @param {BuObject} buObjectParent BU object for Parent BU
673
692
  * @param {object} clientParent SDK for parent BU
674
693
  * @param {string} deKey dataExtension key
675
694
  * @returns {Promise.<string>} fieldObjectID
@@ -678,7 +697,7 @@ class DataExtension extends MetadataType {
678
697
  DataExtensionField.buObject = buObjectParent;
679
698
  DataExtensionField.client = clientParent;
680
699
  const fieldKey = `[${deKey}].[TriggerUpdate${randomSuffix}]`;
681
- const fieldResponse = await DataExtensionField.retrieveForCache(
700
+ const fieldResponse = await DataExtensionField.retrieveForCacheDE(
682
701
  {
683
702
  filter: {
684
703
  leftOperand: 'CustomerKey',
@@ -697,7 +716,7 @@ class DataExtension extends MetadataType {
697
716
  * helper for {@link DataExtension.#fixShared_item}
698
717
  *
699
718
  * @param {string} randomSuffix -
700
- * @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
719
+ * @param {BuObject} buObjectChildBu BU object for Child BU
701
720
  * @param {object} clientChildBu SDK for child BU
702
721
  * @param {string} deKey dataExtension key
703
722
  * @param {string} fieldObjectID field ObjectID
@@ -723,14 +742,14 @@ class DataExtension extends MetadataType {
723
742
  *
724
743
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
725
744
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
726
- * @param {void} [_] unused parameter
745
+ * @param {void | string[]} [_] unused parameter
727
746
  * @param {string} [key] customer key of single item to retrieve
728
- * @returns {Promise.<{metadata: TYPE.DataExtensionMap, type: string}>} Promise of item map
747
+ * @returns {Promise.<{metadata: DataExtensionMap, type: string}>} Promise of item map
729
748
  */
730
749
  static async retrieve(retrieveDir, additionalFields, _, key) {
731
- /** @type {TYPE.SoapRequestParams} */
750
+ /** @type {SoapRequestParams} */
732
751
  let requestParams = null;
733
- /** @type {TYPE.SoapRequestParams} */
752
+ /** @type {SoapRequestParams} */
734
753
  let fieldOptions = null;
735
754
  if (key) {
736
755
  requestParams = {
@@ -776,14 +795,14 @@ class DataExtension extends MetadataType {
776
795
  * helper for {@link DataExtension.retrieve} and for AttributeSet.fixShared_retrieve
777
796
  *
778
797
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
779
- * @returns {Promise.<TYPE.DataExtensionMap>} keyField => metadata map
798
+ * @returns {Promise.<DataExtensionMap>} keyField => metadata map
780
799
  */
781
800
  static async retrieveSharedForCache(additionalFields = []) {
782
801
  // for caching, we want to retrieve shared DEs as well from the instance parent BU
783
802
  Util.logger.info(' - Caching dependent Metadata: dataExtension (shared via _ParentBU_)');
784
803
  const buObjectBak = this.buObject;
785
804
  const clientBak = this.client;
786
- /** @type {TYPE.BuObject} */
805
+ /** @type {BuObject} */
787
806
  const buObjectParentBu = {
788
807
  eid: this.properties.credentials[this.buObject.credential].eid,
789
808
  mid: this.properties.credentials[this.buObject.credential].eid,
@@ -849,9 +868,8 @@ class DataExtension extends MetadataType {
849
868
  /**
850
869
  * helper to retrieve all dataExtension fields and attach them to the dataExtension metadata
851
870
  *
852
- * @private
853
- * @param {TYPE.DataExtensionMap} metadata already cached dataExtension metadata
854
- * @param {TYPE.SoapRequestParams} [fieldOptions] optionally filter results
871
+ * @param {DataExtensionMap} metadata already cached dataExtension metadata
872
+ * @param {SoapRequestParams} [fieldOptions] optionally filter results
855
873
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
856
874
  * @returns {Promise.<void>} -
857
875
  */
@@ -877,7 +895,7 @@ class DataExtension extends MetadataType {
877
895
  // remove attributes that we do not want to retrieve
878
896
  // * do this after sorting on the DE's field list
879
897
  for (const key of fieldKeys) {
880
- DataExtensionField.postRetrieveTasks(fieldsObj[key], true);
898
+ DataExtensionField.postRetrieveTasksDE(fieldsObj[key]);
881
899
  }
882
900
  }
883
901
 
@@ -885,7 +903,7 @@ class DataExtension extends MetadataType {
885
903
  * Retrieves dataExtension metadata. Afterwards starts retrieval of dataExtensionColumn metadata retrieval
886
904
  *
887
905
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
888
- * @returns {Promise.<{metadata: TYPE.DataExtensionMap, type: string}>} Promise of item map
906
+ * @returns {Promise.<{metadata: DataExtensionMap, type: string}>} Promise of item map
889
907
  */
890
908
  static async retrieveChangelog(additionalFields) {
891
909
  const metadata = await this._retrieveAll(additionalFields);
@@ -894,8 +912,8 @@ class DataExtension extends MetadataType {
894
912
  /**
895
913
  * manages post retrieve steps
896
914
  *
897
- * @param {TYPE.DataExtensionItem} metadata a single dataExtension
898
- * @returns {TYPE.DataExtensionItem} metadata
915
+ * @param {DataExtensionItem} metadata a single dataExtension
916
+ * @returns {Promise.<DataExtensionItem>} metadata
899
917
  */
900
918
  static async postRetrieveTasks(metadata) {
901
919
  // Error during deploy if SendableSubscriberField.Name = '_SubscriberKey' even though it is retrieved like that
@@ -908,7 +926,7 @@ class DataExtension extends MetadataType {
908
926
  // DataExtensionTemplate
909
927
  if (metadata.Template?.CustomerKey) {
910
928
  try {
911
- metadata.r__dataExtensionTemplate_Name = cache.searchForField(
929
+ metadata.r__dataExtensionTemplate_name = cache.searchForField(
912
930
  'dataExtensionTemplate',
913
931
  metadata.Template.CustomerKey,
914
932
  'CustomerKey',
@@ -932,6 +950,52 @@ class DataExtension extends MetadataType {
932
950
  delete metadata.CreatedDate;
933
951
  delete metadata.ModifiedDate;
934
952
 
953
+ // Retention policy
954
+ if (
955
+ metadata.RowBasedRetention === false &&
956
+ metadata.DeleteAtEndOfRetentionPeriod === false &&
957
+ metadata.RetainUntil === ''
958
+ ) {
959
+ // Note: RetainUntil expected to NOT have a value
960
+ metadata.c__retentionPolicy = 'none';
961
+ delete metadata.RetainUntil;
962
+ delete metadata.ResetRetentionPeriodOnImport;
963
+ } else if (
964
+ metadata.RowBasedRetention === false &&
965
+ metadata.DeleteAtEndOfRetentionPeriod === false
966
+ ) {
967
+ // Note: RetainUntil expected to have a value
968
+ metadata.c__retentionPolicy = 'allRecordsAndDataextension';
969
+ } else if (
970
+ metadata.RowBasedRetention === false &&
971
+ metadata.DeleteAtEndOfRetentionPeriod === true
972
+ ) {
973
+ // Note: RetainUntil expected to have a value
974
+ metadata.c__retentionPolicy = 'allRecords';
975
+ } else if (
976
+ metadata.RowBasedRetention === true &&
977
+ metadata.DeleteAtEndOfRetentionPeriod === false
978
+ ) {
979
+ // Note: RetainUntil expected to NOT have a value
980
+ metadata.c__retentionPolicy = 'individialRecords';
981
+ delete metadata.RetainUntil;
982
+ }
983
+ delete metadata.RowBasedRetention;
984
+ delete metadata.DeleteAtEndOfRetentionPeriod;
985
+
986
+ if (metadata.RetainUntil) {
987
+ const retainUntil = new Date(metadata.RetainUntil);
988
+ metadata.c__retainUntil = `${retainUntil.getFullYear()}-${retainUntil.getMonth() + 1}-${retainUntil.getDate()}`;
989
+ }
990
+ delete metadata.RetainUntil;
991
+ if (metadata.DataRetentionPeriodUnitOfMeasure) {
992
+ metadata.c__dataRetentionPeriodUnitOfMeasure = Util.inverseGet(
993
+ this.definition.dataRetentionPeriodUnitOfMeasureMapping,
994
+ metadata.DataRetentionPeriodUnitOfMeasure
995
+ );
996
+ delete metadata.DataRetentionPeriodUnitOfMeasure;
997
+ }
998
+
935
999
  return metadata;
936
1000
  }
937
1001
 
@@ -939,9 +1003,9 @@ class DataExtension extends MetadataType {
939
1003
  * Helper to retrieve Data Extension Fields
940
1004
  *
941
1005
  * @private
942
- * @param {TYPE.SoapRequestParams} [options] options (e.g. continueRequest)
1006
+ * @param {SoapRequestParams} [options] options (e.g. continueRequest)
943
1007
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
944
- * @returns {Promise.<TYPE.DataExtensionFieldMap>} Promise of items
1008
+ * @returns {Promise.<DataExtensionFieldMap>} Promise of items
945
1009
  */
946
1010
  static async _retrieveFields(options, additionalFields) {
947
1011
  if (!options) {
@@ -951,18 +1015,19 @@ class DataExtension extends MetadataType {
951
1015
  DataExtensionField.client = this.client;
952
1016
  DataExtensionField.properties = this.properties;
953
1017
 
954
- const response = await DataExtensionField.retrieveForCache(options, additionalFields);
1018
+ const response = await DataExtensionField.retrieveForCacheDE(options, additionalFields);
955
1019
  return response.metadata;
956
1020
  }
957
1021
  /**
958
1022
  * helps retrieving fields during templating and deploy where we dont want the full list
959
1023
  *
960
1024
  * @private
961
- * @param {TYPE.DataExtensionMap} metadata list of DEs
1025
+ * @param {DataExtensionMap} metadata list of DEs
962
1026
  * @param {string} customerKey external key of single DE
963
1027
  * @returns {Promise.<void>} -
964
1028
  */
965
1029
  static async _retrieveFieldsForSingleDe(metadata, customerKey) {
1030
+ /** @type {SoapRequestParams} */
966
1031
  const fieldOptions = {
967
1032
  filter: {
968
1033
  leftOperand: 'DataExtension.CustomerKey',
@@ -979,7 +1044,7 @@ class DataExtension extends MetadataType {
979
1044
  // remove attributes that we do not want to retrieve
980
1045
  // * do this after sorting on the DE's field list
981
1046
  for (const field of fieldArr) {
982
- DataExtensionField.postRetrieveTasks(field, true);
1047
+ DataExtensionField.postRetrieveTasksDE(field);
983
1048
  }
984
1049
 
985
1050
  metadata[customerKey].Fields = fieldArr;
@@ -987,19 +1052,18 @@ class DataExtension extends MetadataType {
987
1052
  /**
988
1053
  * helper for {@link MetadataType.updateREST} and {@link MetadataType.updateSOAP} that removes old files after the key was changed
989
1054
  *
990
- * @private
991
- * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
992
- * @returns {void}
1055
+ * @param {MetadataTypeItem} metadataEntry a single metadata Entry
1056
+ * @returns {Promise.<void>} -
993
1057
  */
994
1058
  static async _postChangeKeyTasks(metadataEntry) {
995
- super._postChangeKeyTasks(metadataEntry, true);
1059
+ return super._postChangeKeyTasks(metadataEntry, true);
996
1060
  }
997
1061
 
998
1062
  /**
999
1063
  * prepares a DataExtension for deployment
1000
1064
  *
1001
- * @param {TYPE.DataExtensionItem} metadata a single data Extension
1002
- * @returns {Promise.<TYPE.DataExtensionItem>} Promise of updated single DE
1065
+ * @param {DataExtensionItem} metadata a single data Extension
1066
+ * @returns {Promise.<DataExtensionItem>} Promise of updated single DE
1003
1067
  */
1004
1068
  static async preDeployTasks(metadata) {
1005
1069
  if (metadata.Name?.startsWith('_')) {
@@ -1026,10 +1090,10 @@ class DataExtension extends MetadataType {
1026
1090
  super.setFolderId(metadata);
1027
1091
 
1028
1092
  // DataExtensionTemplate
1029
- if (metadata.r__dataExtensionTemplate_Name) {
1093
+ if (metadata.r__dataExtensionTemplate_name) {
1030
1094
  // remove templated fields
1031
1095
  for (const templateField of this.definition.templateFields[
1032
- metadata.r__dataExtensionTemplate_Name
1096
+ metadata.r__dataExtensionTemplate_name
1033
1097
  ]) {
1034
1098
  for (let index = 0; index < metadata.Fields.length; index++) {
1035
1099
  const element = metadata.Fields[index];
@@ -1046,15 +1110,15 @@ class DataExtension extends MetadataType {
1046
1110
  metadata.Template = {
1047
1111
  CustomerKey: cache.searchForField(
1048
1112
  'dataExtensionTemplate',
1049
- metadata.r__dataExtensionTemplate_Name,
1113
+ metadata.r__dataExtensionTemplate_name,
1050
1114
  'Name',
1051
1115
  'CustomerKey'
1052
1116
  ),
1053
1117
  };
1054
- delete metadata.r__dataExtensionTemplate_Name;
1118
+ delete metadata.r__dataExtensionTemplate_name;
1055
1119
  } catch (ex) {
1056
1120
  Util.logger.debug(ex.message);
1057
- // It is assumed that non-supported types would not have been converted to r__dataExtensionTemplate_Name upon retrieve.
1121
+ // It is assumed that non-supported types would not have been converted to r__dataExtensionTemplate_name upon retrieve.
1058
1122
  // Deploying to same BU therefore still works!
1059
1123
  // A workaround for cross-BU deploy exists but it's likely not beneficial to explain to users:
1060
1124
  // Create a DE based on the not-supported template on the target BU, retrieve it, copy the Template.CustomerKey into the to-be-deployed DE (or use mcdev-templating), done
@@ -1077,6 +1141,55 @@ class DataExtension extends MetadataType {
1077
1141
  metadata.SendableSubscriberField.Name = 'Subscriber Key';
1078
1142
  }
1079
1143
 
1144
+ // Retention policy
1145
+ switch (metadata.c__retentionPolicy) {
1146
+ case 'none': {
1147
+ metadata.RowBasedRetention = false;
1148
+ metadata.DeleteAtEndOfRetentionPeriod = false;
1149
+ metadata.ResetRetentionPeriodOnImport = false;
1150
+ break;
1151
+ }
1152
+ case 'allRecordsAndDataextension': {
1153
+ metadata.RowBasedRetention = false;
1154
+ metadata.DeleteAtEndOfRetentionPeriod = false;
1155
+ break;
1156
+ }
1157
+ case 'allRecords': {
1158
+ metadata.RowBasedRetention = false;
1159
+ metadata.DeleteAtEndOfRetentionPeriod = true;
1160
+ break;
1161
+ }
1162
+ case 'individialRecords': {
1163
+ metadata.RowBasedRetention = true;
1164
+ metadata.DeleteAtEndOfRetentionPeriod = false;
1165
+ break;
1166
+ }
1167
+ default: {
1168
+ Util.logger.debug(
1169
+ ` - dataExtension '${
1170
+ metadata[this.definition.nameField]
1171
+ }': Unknown retention policy: ${metadata.c__retentionPolicy}`
1172
+ );
1173
+ }
1174
+ }
1175
+ delete metadata.c__retentionPolicy;
1176
+
1177
+ if (metadata.c__retainUntil) {
1178
+ const retainUntil = new Date(metadata.c__retainUntil);
1179
+ metadata.RetainUntil = `${retainUntil.getMonth() + 1}/${retainUntil.getDate()}/${retainUntil.getFullYear()} 12:00:00 AM`;
1180
+ delete metadata.c__retainUntil;
1181
+ } else {
1182
+ metadata.RetainUntil = '';
1183
+ }
1184
+
1185
+ if (metadata.c__dataRetentionPeriodUnitOfMeasure) {
1186
+ metadata.DataRetentionPeriodUnitOfMeasure =
1187
+ this.definition.dataRetentionPeriodUnitOfMeasureMapping[
1188
+ metadata.c__dataRetentionPeriodUnitOfMeasure
1189
+ ];
1190
+ delete metadata.c__dataRetentionPeriodUnitOfMeasure;
1191
+ }
1192
+
1080
1193
  return metadata;
1081
1194
  }
1082
1195
 
@@ -1085,7 +1198,7 @@ class DataExtension extends MetadataType {
1085
1198
  * The json's first level of keys must represent the rows and the secend level the columns
1086
1199
  *
1087
1200
  * @private
1088
- * @param {TYPE.DataExtensionItem} json single dataextension
1201
+ * @param {DataExtensionItem} json single dataextension
1089
1202
  * @param {object[][]} tabled prepped array for output in tabular format
1090
1203
  * @returns {string} file content
1091
1204
  */
@@ -1114,8 +1227,8 @@ class DataExtension extends MetadataType {
1114
1227
  '</i>)</p>\n\n'
1115
1228
  : `No</p>\n\n`;
1116
1229
  output += `<p><b>Testable:</b> ${json.IsTestable === true ? 'Yes' : 'No'}</p>\n\n`;
1117
- if (json.r__dataExtensionTemplate_Name) {
1118
- output += `<p><b>Template:</b> ${json.r__dataExtensionTemplate_Name}</p>`;
1230
+ if (json.r__dataExtensionTemplate_name) {
1231
+ output += `<p><b>Template:</b> ${json.r__dataExtensionTemplate_name}</p>`;
1119
1232
  }
1120
1233
 
1121
1234
  output += '<table><thead><tr>';
@@ -1140,7 +1253,7 @@ class DataExtension extends MetadataType {
1140
1253
  * The json's first level of keys must represent the rows and the secend level the columns
1141
1254
  *
1142
1255
  * @private
1143
- * @param {TYPE.DataExtensionItem} json dataextension
1256
+ * @param {DataExtensionItem} json dataextension
1144
1257
  * @param {object[][]} tabled prepped array for output in tabular format
1145
1258
  * @returns {string} file content
1146
1259
  */
@@ -1167,8 +1280,8 @@ class DataExtension extends MetadataType {
1167
1280
  '`)\n\n'
1168
1281
  : `No\n\n`;
1169
1282
  output += `**Testable:** ${json.IsTestable === true ? 'Yes' : 'No'}\n\n`;
1170
- if (json.r__dataExtensionTemplate_Name) {
1171
- output += `**Template:** ${json.r__dataExtensionTemplate_Name}\n\n`;
1283
+ if (json.r__dataExtensionTemplate_name) {
1284
+ output += `**Template:** ${json.r__dataExtensionTemplate_name}\n\n`;
1172
1285
  }
1173
1286
 
1174
1287
  let tableSeparator = '';
@@ -1193,14 +1306,15 @@ class DataExtension extends MetadataType {
1193
1306
  * @private
1194
1307
  * @param {string} directory directory the file will be written to
1195
1308
  * @param {string} filename name of the file without '.json' ending
1196
- * @param {TYPE.DataExtensionItem} json dataextension.columns
1309
+ * @param {DataExtensionItem} json dataextension.columns
1197
1310
  * @param {'html'|'md'} mode html or md
1198
1311
  * @param {string[]} [fieldsToKeep] list of keys(columns) to show. This will also specify
1199
- * @returns {Promise.<boolean>} Promise of success of saving the file
1312
+ * @returns {Promise.<void>} Promise of success of saving the file
1200
1313
  */
1201
1314
  static async _writeDoc(directory, filename, json, mode, fieldsToKeep) {
1202
1315
  let fieldsJson = Object.values(json.Fields);
1203
1316
  if (fieldsToKeep) {
1317
+ /** @type {DataExtensionFieldItem[]} */
1204
1318
  const newJson = [];
1205
1319
  for (const element of fieldsJson) {
1206
1320
  const newJsonElement = {};
@@ -1211,6 +1325,7 @@ class DataExtension extends MetadataType {
1211
1325
  newJsonElement[field] = element[field];
1212
1326
  }
1213
1327
  }
1328
+ // @ts-ignore hard to tell ts that this is in fact a DataExtensionFieldItem
1214
1329
  newJson.push(newJsonElement);
1215
1330
  }
1216
1331
  fieldsJson = newJson;
@@ -1232,13 +1347,13 @@ class DataExtension extends MetadataType {
1232
1347
  /**
1233
1348
  * Parses metadata into a readable Markdown/HTML format then saves it
1234
1349
  *
1235
- * @param {TYPE.DataExtensionMap} [metadataMap] a list of dataExtension definitions
1236
- * @returns {Promise.<void>} -
1350
+ * @param {DataExtensionMap} [metadataMap] a list of dataExtension definitions
1351
+ * @returns {Promise.<any>} -
1237
1352
  */
1238
1353
  static async document(metadataMap) {
1239
1354
  try {
1240
1355
  if (!metadataMap) {
1241
- metadataMap = this.readBUMetadataForType(
1356
+ metadataMap = await this.readBUMetadataForType(
1242
1357
  File.normalizePath([
1243
1358
  this.properties.directories.retrieve,
1244
1359
  this.buObject.credential,
@@ -1332,20 +1447,21 @@ class DataExtension extends MetadataType {
1332
1447
  /**
1333
1448
  * Retrieves folder metadata into local filesystem. Also creates a uniquePath attribute for each folder.
1334
1449
  *
1335
- * @returns {Promise.<{metadata: TYPE.DataExtensionMap, type: string}>} Promise
1450
+ * @returns {Promise.<{metadata: DataExtensionMap, type: string}>} Promise
1336
1451
  */
1337
1452
  static async retrieveForCache() {
1338
- return this.retrieve(null, ['ObjectID', 'CustomerKey', 'Name'], this.buObject, null, null);
1453
+ return this.retrieve(null, ['ObjectID', 'CustomerKey', 'Name']);
1339
1454
  }
1340
1455
  /**
1341
1456
  * Retrieves dataExtension metadata in template format.
1342
1457
  *
1343
1458
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
1344
1459
  * @param {string} name name of the metadata item
1345
- * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
1346
- * @returns {Promise.<{metadata: TYPE.DataExtensionMap, type: string}>} Promise of items
1460
+ * @param {TemplateMap} templateVariables variables to be replaced in the metadata
1461
+ * @returns {Promise.<{metadata: DataExtensionItem, type: string}>} Promise of items
1347
1462
  */
1348
1463
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
1464
+ /** @type {SoapRequestParams} */
1349
1465
  const options = {
1350
1466
  filter: {
1351
1467
  leftOperand: 'Name',
@@ -1359,7 +1475,7 @@ class DataExtension extends MetadataType {
1359
1475
  if (!Object.keys(metadata).length) {
1360
1476
  Util.logger.error(`${this.definition.type} '${name}' not found on server.`);
1361
1477
  Util.logger.info('Downloaded: dataExtension (0)');
1362
- return { metadata: {}, type: 'dataExtension' };
1478
+ return { metadata: null, type: 'dataExtension' };
1363
1479
  }
1364
1480
  const customerKey = Object.keys(metadata)[0];
1365
1481
  await this._retrieveFieldsForSingleDe(metadata, customerKey);
@@ -1370,8 +1486,8 @@ class DataExtension extends MetadataType {
1370
1486
  metadata[key].Fields.sort((a, b) => a.Ordinal - b.Ordinal);
1371
1487
 
1372
1488
  const originalKey = key;
1373
- const metadataCleaned = JSON.parse(
1374
- JSON.stringify(await this.postRetrieveTasks(metadata[key]))
1489
+ const metadataCleaned = structuredClone(
1490
+ await this.postRetrieveTasks(metadata[key])
1375
1491
  );
1376
1492
 
1377
1493
  this.keepTemplateFields(metadataCleaned);
@@ -1395,7 +1511,7 @@ class DataExtension extends MetadataType {
1395
1511
  * dataExtension logic that retrieves the folder path from cache and updates the given metadata with it after retrieve
1396
1512
  * it also sets the content type which is basically the subtype
1397
1513
  *
1398
- * @param {TYPE.MetadataTypeItem} metadata a single script activity definition
1514
+ * @param {MetadataTypeItem} metadata a single script activity definition
1399
1515
  */
1400
1516
  static setFolderPath(metadata) {
1401
1517
  let error = false;
@@ -1455,8 +1571,8 @@ class DataExtension extends MetadataType {
1455
1571
  *
1456
1572
  * @private
1457
1573
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
1458
- * @param {TYPE.SoapRequestParams} [options] e.g. filter
1459
- * @returns {Promise.<TYPE.DataExtensionMap>} keyField => metadata map
1574
+ * @param {SoapRequestParams} [options] e.g. filter
1575
+ * @returns {Promise.<DataExtensionMap>} keyField => metadata map
1460
1576
  */
1461
1577
  static async _retrieveAll(additionalFields, options) {
1462
1578
  const { metadata } = await super.retrieveSOAP(null, options, null, additionalFields);
@@ -1475,9 +1591,9 @@ class DataExtension extends MetadataType {
1475
1591
  * additionally, the documentation for dataExtension and automation should be returned
1476
1592
  *
1477
1593
  * @param {string[]} keyArr customerkey of the metadata
1478
- * @returns {string[]} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext']
1594
+ * @returns {Promise.<string[]>} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext']
1479
1595
  */
1480
- static getFilesToCommit(keyArr) {
1596
+ static async getFilesToCommit(keyArr) {
1481
1597
  if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) {
1482
1598
  // document dataExtension is active. assume we want to commit the MD file as well
1483
1599
  const path = File.normalizePath([