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
@@ -19,6 +19,7 @@ import pLimit from 'p-limit';
19
19
  * @typedef {import('../../types/mcdev.d.js').SDKError} SDKError
20
20
  * @typedef {import('../../types/mcdev.d.js').SoapRequestParams} SoapRequestParams
21
21
  * @typedef {import('../../types/mcdev.d.js').TemplateMap} TemplateMap
22
+ * @typedef {import('../../types/mcdev.d.js').TypeKeyCombo} TypeKeyCombo
22
23
  */
23
24
  /**
24
25
  * @typedef {import('../../types/mcdev.d.js').AutomationItem} AutomationItem
@@ -1620,6 +1621,39 @@ class Automation extends MetadataType {
1620
1621
  // delete local copy: retrieve/cred/bu/.../...-doc.md
1621
1622
  await super.postDeleteTasks(customerKey, [`${this.definition.type}-doc.md`]);
1622
1623
  }
1624
+
1625
+ /**
1626
+ * helper for {@link MetadataType.getNestedValue} - adjusted for automation activities
1627
+ *
1628
+ * @param {any} obj the metadataItem to search in (or the result)
1629
+ * @param {string[]} nestedKeyParts key in dot-notation split into parts
1630
+ * @param {string} dependentType used for types that need custom handling
1631
+ * @returns {(string) | (string)[]} result
1632
+ */
1633
+ static getNestedValueHelper(obj, nestedKeyParts, dependentType) {
1634
+ if (nestedKeyParts.length == 0) {
1635
+ // key was found; append '' to ensure we always return a string
1636
+ return obj + '';
1637
+ }
1638
+ // get most left key
1639
+ const key = nestedKeyParts.shift();
1640
+ if (!obj[key]) {
1641
+ // key was not found
1642
+ return;
1643
+ }
1644
+ if (Array.isArray(obj[key])) {
1645
+ return obj[key].flatMap((x) =>
1646
+ this.getNestedValueHelper(x, [...nestedKeyParts], dependentType)
1647
+ );
1648
+ } else {
1649
+ if (nestedKeyParts.length == 0) {
1650
+ // key was found if length is 0 and search field (r__type) is equal the current type, else, keep going
1651
+ return obj[key] === dependentType ? obj.r__key : undefined;
1652
+ } else {
1653
+ return this.getNestedValueHelper(obj[key], [...nestedKeyParts], dependentType);
1654
+ }
1655
+ }
1656
+ }
1623
1657
  }
1624
1658
 
1625
1659
  // Assign definition to static attributes
@@ -10,7 +10,7 @@ import File from '../util/file.js';
10
10
  import auth from '../util/auth.js';
11
11
  import cache from '../util/cache.js';
12
12
  import pLimit from 'p-limit';
13
- import inquirer from 'inquirer';
13
+ import { checkbox } from '@inquirer/prompts';
14
14
 
15
15
  /**
16
16
  * @typedef {import('../../types/mcdev.d.js').BuObject} BuObject
@@ -33,7 +33,7 @@ import inquirer from 'inquirer';
33
33
  * @augments MetadataType
34
34
  */
35
35
  class DataExtension extends MetadataType {
36
- /** @type {DataExtensionFieldMap} */
36
+ /** @type {Object.<string, DataExtensionFieldMap>} key: deKey, value: deFieldMap */
37
37
  static oldFields;
38
38
  /**
39
39
  * Upserts dataExtensions after retrieving them from source and target to compare
@@ -100,16 +100,26 @@ class DataExtension extends MetadataType {
100
100
  .filter((r) => r !== undefined && r !== null)
101
101
  .filter(this.#filterUpsertResults);
102
102
 
103
+ if (Util.OPTIONS.noUpdate && metadataToUpdate.length > 0) {
104
+ Util.logger.info(
105
+ ` ☇ skipping update of ${metadataToUpdate.length} ${this.definition.type}${metadataToUpdate.length == 1 ? '' : 's'}: --noUpdate flag is set`
106
+ );
107
+ }
108
+
103
109
  const updateLimit = pLimit(10);
104
- const updateResults = (
105
- await Promise.allSettled(
106
- metadataToUpdate
107
- .filter((r) => r !== undefined && r !== null)
108
- .map((metadataEntry) => updateLimit(() => this.update(metadataEntry.after)))
109
- )
110
- )
111
- .filter((r) => r !== undefined && r !== null)
112
- .filter(this.#filterUpsertResults);
110
+ const updateResults = Util.OPTIONS.noUpdate
111
+ ? []
112
+ : (
113
+ await Promise.allSettled(
114
+ metadataToUpdate
115
+ .filter((r) => r !== undefined && r !== null)
116
+ .map((metadataEntry) =>
117
+ updateLimit(() => this.update(metadataEntry.after))
118
+ )
119
+ )
120
+ )
121
+ .filter((r) => r !== undefined && r !== null)
122
+ .filter(this.#filterUpsertResults);
113
123
 
114
124
  const successfulResults = [...createResults, ...updateResults];
115
125
  Util.logger.info(
@@ -119,8 +129,8 @@ class DataExtension extends MetadataType {
119
129
  let upsertResults;
120
130
  if (successfulResults.length > 0) {
121
131
  const metadataResults = successfulResults
122
- // @ts-expect-error not sure why this produces a type error. looks 100% correct
123
- .map((r) => r.value.Results[0].Object)
132
+ .map((r) => (r.status === 'fulfilled' ? r.value.Results[0].Object : null))
133
+ .filter(Boolean)
124
134
  .map((r) => {
125
135
  // if only one fields added will return object otherwise array
126
136
  if (Array.isArray(r?.Fields?.Field)) {
@@ -172,7 +182,6 @@ class DataExtension extends MetadataType {
172
182
  DataExtensionField.client = this.client;
173
183
  DataExtensionField.properties = this.properties;
174
184
  DataExtension.oldFields ||= {};
175
- // @ts-expect-error not sure why this produces a type error. looks 100% correct
176
185
  DataExtension.oldFields[metadataMap[metadataKey][this.definition.keyField]] =
177
186
  await DataExtensionField.prepareDeployColumnsOnUpdate(
178
187
  metadataMap[metadataKey].Fields,
@@ -278,10 +287,11 @@ class DataExtension extends MetadataType {
278
287
  * Updates a single dataExtension. Also updates their columns in 'dataExtension.columns'
279
288
  *
280
289
  * @param {DataExtensionItem} metadata single metadata entry
290
+ * @param {boolean} [handleOutside] if the API reponse is irregular this allows you to handle it outside of this generic method
281
291
  * @returns {Promise} Promise
282
292
  */
283
- static async update(metadata) {
284
- return super.updateSOAP(metadata);
293
+ static async update(metadata, handleOutside) {
294
+ return super.updateSOAP(metadata, handleOutside);
285
295
  }
286
296
  /**
287
297
  * Gets executed after deployment of metadata type
@@ -485,24 +495,19 @@ class DataExtension extends MetadataType {
485
495
  value: name,
486
496
  checked: fixBuPreselected.includes(name),
487
497
  }));
488
- const questions = [
489
- {
490
- type: 'checkbox',
491
- name: 'businessUnits',
498
+ let answer = null;
499
+
500
+ try {
501
+ answer = await checkbox({
492
502
  message:
493
503
  'Please select BUs that have access to the updated Shared Data Extensions:',
494
504
  pageSize: 10,
495
505
  choices: buList,
496
- },
497
- ];
498
- let responses = null;
499
-
500
- try {
501
- responses = await inquirer.prompt(questions);
506
+ });
502
507
  } catch (ex) {
503
508
  Util.logger.info(ex);
504
509
  }
505
- return responses.businessUnits;
510
+ return answer;
506
511
  }
507
512
 
508
513
  /**
@@ -678,7 +683,6 @@ class DataExtension extends MetadataType {
678
683
  ],
679
684
  },
680
685
  };
681
- // @ts-expect-error SFMC-SDK typing error
682
686
  await this.client.soap.update(Util.capitalizeFirstLetter(soapType), payload, null);
683
687
  return randomSuffix;
684
688
  }
@@ -821,9 +825,10 @@ class DataExtension extends MetadataType {
821
825
  // get shared folders to match our shared / synched Data Extensions
822
826
  const subTypeArr = this.definition.dependencies
823
827
  .filter((item) => item.startsWith('folder-'))
824
- .map((item) => item.slice(7));
828
+ .map((item) => item.slice(7))
829
+ .filter((item) => Folder.definition.folderTypesFromParent.includes(item));
825
830
  Util.logger.info(' - Caching dependent Metadata: folder (shared via _ParentBU_)');
826
- Util.logSubtypes(subTypeArr);
831
+ Util.logSubtypes(subTypeArr, ' ');
827
832
  Folder.client = this.client;
828
833
  Folder.buObject = this.buObject;
829
834
  Folder.properties = this.properties;
@@ -1325,7 +1330,7 @@ class DataExtension extends MetadataType {
1325
1330
  newJsonElement[field] = element[field];
1326
1331
  }
1327
1332
  }
1328
- // @ts-ignore hard to tell ts that this is in fact a DataExtensionFieldItem
1333
+ // @ts-ignore for document the fields have less values and that leads to an error here.
1329
1334
  newJson.push(newJsonElement);
1330
1335
  }
1331
1336
  fieldsJson = newJson;
@@ -97,7 +97,7 @@ class DataExtensionField extends MetadataType {
97
97
  *
98
98
  * @param {DataExtensionFieldItem[]} deployColumns Columns of data extension that will be deployed
99
99
  * @param {string} deKey external/customer key of Data Extension
100
- * @returns {Promise.<Object.<string, DataExtensionFieldItem>>} existing fields by their original name to allow re-adding FieldType after update
100
+ * @returns {Promise.<DataExtensionFieldMap>} existing fields by their original name to allow re-adding FieldType after update
101
101
  */
102
102
  static async prepareDeployColumnsOnUpdate(deployColumns, deKey) {
103
103
  // create list of DE keys that had changes to their fields to be able to use it as a filter in the --fixShared logic
@@ -132,7 +132,7 @@ class DataExtensionField extends MetadataType {
132
132
  const fieldsObj = response.metadata;
133
133
 
134
134
  // ensure fields can be updated properly by their adding ObjectId based on Name-matching
135
- /** @type {Object.<string, DataExtensionFieldItem>} */
135
+ /** @type {DataExtensionFieldMap} */
136
136
  const existingFieldByName = {};
137
137
 
138
138
  for (const key of Object.keys(fieldsObj)) {
@@ -315,7 +315,6 @@ class DataExtensionField extends MetadataType {
315
315
  };
316
316
  try {
317
317
  // ! we really do need to delete from DataExtension not DataExtensionField here!
318
- // @ts-expect-error wrong jsdoc for 2nd parameter in SFMC-SDK
319
318
  this.client.soap.delete('DataExtension', keyObj, null);
320
319
 
321
320
  if (!fieldId) {
@@ -4,6 +4,7 @@ import MetadataType from './MetadataType.js';
4
4
  import { Util } from '../util/util.js';
5
5
  import File from '../util/file.js';
6
6
  import cache from '../util/cache.js';
7
+ import deepEqual from 'deep-equal';
7
8
 
8
9
  /**
9
10
  * @typedef {import('../../types/mcdev.d.js').BuObject} BuObject
@@ -24,6 +25,7 @@ import cache from '../util/cache.js';
24
25
  * @augments MetadataType
25
26
  */
26
27
  class Event extends MetadataType {
28
+ static reCacheDataExtensions = [];
27
29
  /**
28
30
  * Retrieves Metadata of Event Definition.
29
31
  * Endpoint /interaction/v1/eventDefinitions return all Event Definitions with all details.
@@ -92,30 +94,26 @@ class Event extends MetadataType {
92
94
  );
93
95
  } else if (event?.length === 1) {
94
96
  const originalKey = event[0][this.definition.keyField];
95
- const eventDef = JSON.parse(
96
- Util.replaceByObject(
97
- JSON.stringify(this.postRetrieveTasks(event[0])),
98
- templateVariables
99
- )
97
+ const metadataItemTemplated = Util.replaceByObject(
98
+ this.postRetrieveTasks(event[0]),
99
+ templateVariables
100
100
  );
101
- if (!eventDef.dataExtensionId) {
101
+
102
+ if (!metadataItemTemplated.r__dataExtension_key) {
102
103
  throw new Error(
103
- `Event.postRetrieveTasks:: ` +
104
- `No Data Extension found for ` +
105
- `event: ${eventDef.name}. ` +
106
- `This cannot be templated`
104
+ `Event.postRetrieveTasks:: No Data Extension found for ${this.definition.type}: ${metadataItemTemplated.name}. This cannot be templated.`
107
105
  );
108
106
  }
109
107
 
110
108
  // remove all fields listed in Definition for templating
111
- this.keepTemplateFields(eventDef);
109
+ this.keepTemplateFields(metadataItemTemplated);
112
110
  await File.writeJSONToFile(
113
111
  [templateDir, this.definition.type].join('/'),
114
112
  originalKey + '.' + this.definition.type + '-meta',
115
- JSON.parse(Util.replaceByObject(JSON.stringify(eventDef), templateVariables))
113
+ metadataItemTemplated
116
114
  );
117
- Util.logger.info(`- templated ${this.definition.type}: ${name}`);
118
- return { metadata: eventDef, type: this.definition.type };
115
+ Util.logger.info(` - templated ${this.definition.type}: ${name}`);
116
+ return { metadata: metadataItemTemplated, type: this.definition.type };
119
117
  } else {
120
118
  throw new Error(
121
119
  `Encountered unknown error when retrieveing ${
@@ -175,7 +173,8 @@ class Event extends MetadataType {
175
173
  static async update(metadataEntry) {
176
174
  return super.updateREST(
177
175
  metadataEntry,
178
- '/interaction/v1/eventDefinitions/' + metadataEntry.id,
176
+ '/interaction/v1/eventDefinitions/key:' +
177
+ encodeURIComponent(metadataEntry[this.definition.keyField]),
179
178
  'put'
180
179
  );
181
180
  }
@@ -187,33 +186,216 @@ class Event extends MetadataType {
187
186
  * @returns {MetadataTypeItem} parsed version
188
187
  */
189
188
  static preDeployTasks(metadata) {
190
- if (metadata.r__dataExtension_key) {
191
- metadata.dataExtensionId = cache.searchForField(
192
- 'dataExtension',
193
- metadata.r__dataExtension_key,
194
- 'CustomerKey',
195
- 'ObjectID'
196
- );
197
- metadata.dataExtensionName = cache.searchForField(
198
- 'dataExtension',
199
- metadata.r__dataExtension_key,
200
- 'CustomerKey',
201
- 'Name'
202
- );
203
- metadata.arguments.dataExtensionId = metadata.dataExtensionId;
204
- if (metadata.schema) {
205
- metadata.schema.id = metadata.dataExtensionId;
206
- metadata.schema.name = metadata.dataExtensionName;
207
- }
208
- }
189
+ // Note: lots has to be done in createOrUpdate based on what action is required
190
+ metadata.arguments ||= {};
209
191
  metadata.arguments.eventDefinitionKey = metadata.eventDefinitionKey;
210
192
 
211
193
  // standard values
212
194
  metadata.isVisibleInPicker ||= false;
213
- metadata.isPlatformObject = false;
214
- metadata.mode = 'Production'; // potentially needs to be set to "1" instead
195
+ if (metadata.isVisibleInPicker && !metadata.sourceApplicationExtensionId) {
196
+ Util.logger.warn(
197
+ ` - ${this.definition.type} ${metadata[this.definition.keyField]}: isVisibleInPicker is true but sourceApplicationExtensionId is missing. Setting isVisibleInPicker to false.`
198
+ );
199
+ metadata.isVisibleInPicker = false;
200
+ }
201
+ metadata.isPlatformObject ||= false;
202
+ metadata.mode ||= 'Production';
203
+ switch (metadata.type) {
204
+ case 'APIEvent': {
205
+ metadata.entrySourceGroupConfigUrl ||=
206
+ 'jb:///data/entry/api-event/entrysourcegroupconfig.json';
207
+ metadata.iconUrl ||= '/images/icon_journeyBuilder-event-api-blue.svg';
208
+ break;
209
+ }
210
+ case 'SalesforceObjectTriggerV2': {
211
+ metadata.iconUrl ||= '/jbint-events/events/SalesforceData/images/SF-Event-Icon.svg';
212
+ break;
213
+ }
214
+ }
215
+
215
216
  return metadata;
216
217
  }
218
+ /**
219
+ * helper for {@link MetadataType.upsert}
220
+ *
221
+ * @param {MetadataTypeMap} metadataMap list of metadata
222
+ * @param {string} metadataKey key of item we are looking at
223
+ * @param {boolean} hasError error flag from previous code
224
+ * @param {MetadataTypeItemDiff[]} metadataToUpdate list of items to update
225
+ * @param {MetadataTypeItem[]} metadataToCreate list of items to create
226
+ * @returns {Promise.<'create'|'update'|'skip'>} action to take
227
+ */
228
+ static async createOrUpdate(
229
+ metadataMap,
230
+ metadataKey,
231
+ hasError,
232
+ metadataToUpdate,
233
+ metadataToCreate
234
+ ) {
235
+ const createOrUpdateAction = await super.createOrUpdate(
236
+ metadataMap,
237
+ metadataKey,
238
+ hasError,
239
+ metadataToUpdate,
240
+ metadataToCreate
241
+ );
242
+ const metadataItem = metadataMap[metadataKey];
243
+ if (createOrUpdateAction === 'update') {
244
+ if (metadataItem.r__dataExtension_key) {
245
+ metadataItem.dataExtensionId = cache.searchForField(
246
+ 'dataExtension',
247
+ metadataItem.r__dataExtension_key,
248
+ 'CustomerKey',
249
+ 'ObjectID'
250
+ );
251
+ metadataItem.dataExtensionName = cache.searchForField(
252
+ 'dataExtension',
253
+ metadataItem.r__dataExtension_key,
254
+ 'CustomerKey',
255
+ 'Name'
256
+ );
257
+ metadataItem.arguments.dataExtensionId = metadataItem.dataExtensionId;
258
+ if (metadataItem.schema) {
259
+ metadataItem.schema.id = metadataItem.dataExtensionId;
260
+ metadataItem.schema.name = metadataItem.dataExtensionName;
261
+ }
262
+ }
263
+ if (metadataItem.schema?.fields?.length) {
264
+ const normalizedKey = File.reverseFilterIllegalFilenames(
265
+ metadataMap[metadataKey][this.definition.keyField]
266
+ );
267
+ const cachedVersion = cache.getByKey(this.definition.type, normalizedKey);
268
+ if (cachedVersion?.schema?.fields?.length) {
269
+ const cacheClone = structuredClone(cachedVersion);
270
+ cacheClone.schema.fields = cacheClone.schema.fields.map((field) => {
271
+ delete field.isDevicePreference;
272
+ return field;
273
+ });
274
+ if (!deepEqual(metadataItem?.schema?.fields, cacheClone?.schema?.fields)) {
275
+ Util.logger.warn(
276
+ ` - ${this.definition.type} ${metadataItem[this.definition.keyField]}: schema fields differ from server version. Resetting as this will not be reflected on dataExtension.`
277
+ );
278
+ metadataItem.schema.fields = cacheClone.schema.fields;
279
+ }
280
+ }
281
+ }
282
+ } else if (createOrUpdateAction === 'create') {
283
+ try {
284
+ if (metadataItem.r__dataExtension_key) {
285
+ metadataItem.dataExtensionId = cache.searchForField(
286
+ 'dataExtension',
287
+ metadataItem.r__dataExtension_key,
288
+ 'CustomerKey',
289
+ 'ObjectID'
290
+ );
291
+ metadataItem.dataExtensionName = cache.searchForField(
292
+ 'dataExtension',
293
+ metadataItem.r__dataExtension_key,
294
+ 'CustomerKey',
295
+ 'Name'
296
+ );
297
+ if (metadataItem.schema) {
298
+ delete metadataItem.schema;
299
+ Util.logger.info(
300
+ ` - ${this.definition.type} ${metadataItem[this.definition.keyField]}: dataExtension ${metadataItem.r__dataExtension_key} found, ignoring schema-section in ${this.definition.type} json`
301
+ );
302
+ }
303
+ }
304
+ } catch {
305
+ // no action
306
+ }
307
+ if (metadataItem.schema) {
308
+ if (metadataItem.r__dataExtension_key) {
309
+ metadataItem.schema.name = metadataItem.r__dataExtension_key;
310
+ }
311
+ Util.logger.warn(
312
+ `Data Extension ${metadataItem.schema.name || metadataItem[this.definition.keyField]} not found on BU. Creating it automatically based on schema-definition.`
313
+ );
314
+ // we want the event api to create the DE for us based on the schema
315
+ this.reCacheDataExtensions.push({
316
+ eventKey: metadataItem[this.definition.keyField],
317
+ deKey: metadataItem.schema.name || metadataItem[this.definition.keyField],
318
+ });
319
+ }
320
+ }
321
+ return createOrUpdateAction;
322
+ }
323
+ /**
324
+ * Gets executed after deployment of metadata type
325
+ *
326
+ * @param {MetadataTypeMap} upsertResults metadata mapped by their keyField as returned by update/create
327
+ * @param {MetadataTypeMap} originalMetadata metadata to be updated (contains additioanl fields)
328
+ * @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
329
+ * @returns {Promise.<void>} -
330
+ */
331
+ static async postDeployTasks(upsertResults, originalMetadata, createdUpdated) {
332
+ // CREATE ONLY - if dataExtensions were auto-
333
+ if (this.reCacheDataExtensions.length && createdUpdated.created > 0) {
334
+ Util.logger.warn(' - Re-caching dependent Metadata: dataExtension');
335
+ const deRetrieve = await DataExtension.retrieveForCache();
336
+ cache.setMetadata('dataExtension', deRetrieve.metadata);
337
+ const reDownloadDeKeys = [];
338
+ // try to update key & name of the auto-generated dataExtension
339
+ for (const { eventKey, deKey } of this.reCacheDataExtensions) {
340
+ if (!upsertResults[eventKey]) {
341
+ continue;
342
+ }
343
+ const eventItem = upsertResults[eventKey];
344
+ const newDeKey = cache.searchForField(
345
+ 'dataExtension',
346
+ eventItem.dataExtensionId,
347
+ 'ObjectID',
348
+ 'CustomerKey'
349
+ );
350
+ // get dataExtension from cache which conveniently already has the ObjectID set
351
+ const deObj = cache.getByKey('dataExtension', newDeKey);
352
+ const oldName = deObj[DataExtension.definition.nameField];
353
+ // prepare a clone of the DE to update name & key to match the event
354
+ const clone = structuredClone(deObj);
355
+ clone[DataExtension.definition.keyField] = deKey;
356
+ clone[DataExtension.definition.nameField] = deKey;
357
+ try {
358
+ // update DE on server
359
+ await DataExtension.update(clone, true);
360
+ Util.logger.info(
361
+ ` - changed dataExtension ${newDeKey} (${oldName}) key/name to ${deKey}`
362
+ );
363
+ // update cache
364
+ deObj[DataExtension.definition.keyField] = deKey;
365
+ deObj[DataExtension.definition.nameField] = deKey;
366
+
367
+ reDownloadDeKeys.push(deObj[DataExtension.definition.keyField]);
368
+ } catch {
369
+ // fallback, set DE key to value of DE name
370
+ const clone = structuredClone(deObj);
371
+ clone[DataExtension.definition.keyField] = oldName;
372
+ try {
373
+ // update DE on server
374
+ await DataExtension.update(clone, true);
375
+ Util.logger.info(
376
+ ` - changed dataExtension ${newDeKey} (${oldName}) key to ${oldName}`
377
+ );
378
+ // update cache
379
+ deObj[DataExtension.definition.keyField] =
380
+ deObj[DataExtension.definition.nameField];
381
+
382
+ reDownloadDeKeys.push(deObj[DataExtension.definition.keyField]);
383
+ } catch {
384
+ Util.logger.debug(
385
+ ` - failed to change dataExtension ${newDeKey} (${oldName}) key/name`
386
+ );
387
+ }
388
+ }
389
+ }
390
+ this.reCacheDataExtensions.length = 0;
391
+
392
+ // ensure we have downloaded auto-created DEs
393
+ if (reDownloadDeKeys.length) {
394
+ const retriever = new Retriever(this.properties, this.buObject);
395
+ await retriever.retrieve(['dataExtension'], reDownloadDeKeys);
396
+ }
397
+ }
398
+ }
217
399
 
218
400
  /**
219
401
  * parses retrieved Metadata before saving
@@ -234,7 +416,6 @@ class Event extends MetadataType {
234
416
  delete metadata.arguments.dataExtensionId;
235
417
  if (metadata.schema) {
236
418
  delete metadata.schema.id;
237
- delete metadata.schema.name;
238
419
  }
239
420
  } catch (ex) {
240
421
  Util.logger.verbose(
@@ -243,12 +424,21 @@ class Event extends MetadataType {
243
424
  }): ${ex.message}.`
244
425
  );
245
426
  }
427
+ if (!metadata.isPlatformObject) {
428
+ delete metadata.isPlatformObject;
429
+ }
430
+ if (metadata.mode === 'Production') {
431
+ delete metadata.mode;
432
+ }
433
+
246
434
  return metadata;
247
435
  }
248
436
  }
249
437
 
250
438
  // Assign definition to static attributes
251
439
  import MetadataTypeDefinitions from '../MetadataTypeDefinitions.js';
440
+ import DataExtension from './DataExtension.js';
441
+ import Retriever from './../Retriever.js';
252
442
  Event.definition = MetadataTypeDefinitions.event;
253
443
 
254
444
  export default Event;