mcdev 4.3.4 → 5.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 (227) hide show
  1. package/.coverage-comment-template.md +20 -0
  2. package/.coverage-comment-template.svelte +178 -0
  3. package/.eslintrc.json +2 -0
  4. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  5. package/.github/workflows/code-test.yml +36 -0
  6. package/.github/workflows/coverage-base-update.yml +57 -0
  7. package/.github/workflows/coverage-develop-branch.yml +41 -0
  8. package/.github/workflows/coverage-main-branch.yml +41 -0
  9. package/.github/workflows/coverage.yml +77 -0
  10. package/.husky/post-checkout +1 -1
  11. package/.prettierrc +1 -1
  12. package/.vscode/extensions.json +0 -4
  13. package/boilerplate/config.json +1 -1
  14. package/boilerplate/files/.prettierrc +1 -1
  15. package/boilerplate/files/.vscode/extensions.json +1 -1
  16. package/boilerplate/forcedUpdates.json +4 -0
  17. package/docs/dist/documentation.md +1196 -430
  18. package/lib/Builder.js +6 -1
  19. package/lib/Deployer.js +30 -5
  20. package/lib/MetadataTypeDefinitions.js +8 -6
  21. package/lib/MetadataTypeInfo.js +8 -6
  22. package/lib/cli.js +54 -42
  23. package/lib/index.js +82 -8
  24. package/lib/metadataTypes/Asset.js +73 -1
  25. package/lib/metadataTypes/AttributeGroup.js +0 -1
  26. package/lib/metadataTypes/Automation.js +48 -5
  27. package/lib/metadataTypes/Campaign.js +20 -7
  28. package/lib/metadataTypes/ContentArea.js +1 -1
  29. package/lib/metadataTypes/DataExtension.js +221 -184
  30. package/lib/metadataTypes/DataExtensionField.js +12 -19
  31. package/lib/metadataTypes/DataExtensionTemplate.js +1 -1
  32. package/lib/metadataTypes/DataExtract.js +1 -1
  33. package/lib/metadataTypes/DataExtractType.js +1 -1
  34. package/lib/metadataTypes/Email.js +1 -1
  35. package/lib/metadataTypes/{EmailSendDefinition.js → EmailSend.js} +5 -5
  36. package/lib/metadataTypes/{EventDefinition.js → Event.js} +17 -35
  37. package/lib/metadataTypes/{FtpLocation.js → FileLocation.js} +2 -2
  38. package/lib/metadataTypes/FileTransfer.js +8 -7
  39. package/lib/metadataTypes/Filter.js +1 -1
  40. package/lib/metadataTypes/Folder.js +8 -3
  41. package/lib/metadataTypes/ImportFile.js +6 -6
  42. package/lib/metadataTypes/{Interaction.js → Journey.js} +311 -147
  43. package/lib/metadataTypes/List.js +2 -2
  44. package/lib/metadataTypes/MetadataType.js +318 -90
  45. package/lib/metadataTypes/MobileCode.js +0 -1
  46. package/lib/metadataTypes/MobileKeyword.js +336 -40
  47. package/lib/metadataTypes/MobileMessage.js +473 -0
  48. package/lib/metadataTypes/Query.js +114 -32
  49. package/lib/metadataTypes/Role.js +60 -21
  50. package/lib/metadataTypes/Script.js +2 -3
  51. package/lib/metadataTypes/SendClassification.js +40 -0
  52. package/lib/metadataTypes/SetDefinition.js +1 -7
  53. package/lib/metadataTypes/TransactionalEmail.js +2 -3
  54. package/lib/metadataTypes/TransactionalMessage.js +1 -2
  55. package/lib/metadataTypes/TransactionalSMS.js +8 -15
  56. package/lib/metadataTypes/{TriggeredSendDefinition.js → TriggeredSend.js} +35 -27
  57. package/lib/metadataTypes/User.js +1177 -0
  58. package/lib/metadataTypes/definitions/Asset.definition.js +1 -0
  59. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
  60. package/lib/metadataTypes/definitions/Automation.definition.js +3 -2
  61. package/lib/metadataTypes/definitions/Campaign.definition.js +79 -4
  62. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
  63. package/lib/metadataTypes/definitions/DataExtension.definition.js +2 -1
  64. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
  65. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
  66. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
  67. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
  68. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
  69. package/lib/metadataTypes/definitions/Email.definition.js +1 -0
  70. package/lib/metadataTypes/definitions/{EmailSendDefinition.definition.js → EmailSend.definition.js} +4 -2
  71. package/lib/metadataTypes/definitions/{EventDefinition.definition.js → Event.definition.js} +2 -1
  72. package/lib/metadataTypes/definitions/{FtpLocation.definition.js → FileLocation.definition.js} +4 -3
  73. package/lib/metadataTypes/definitions/FileTransfer.definition.js +3 -2
  74. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  75. package/lib/metadataTypes/definitions/Folder.definition.js +2 -0
  76. package/lib/metadataTypes/definitions/ImportFile.definition.js +4 -3
  77. package/lib/metadataTypes/definitions/{Interaction.definition.js → Journey.definition.js} +11 -2
  78. package/lib/metadataTypes/definitions/List.definition.js +1 -0
  79. package/lib/metadataTypes/definitions/MobileCode.definition.js +3 -1
  80. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +27 -17
  81. package/lib/metadataTypes/definitions/MobileMessage.definition.js +743 -0
  82. package/lib/metadataTypes/definitions/Query.definition.js +3 -2
  83. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  84. package/lib/metadataTypes/definitions/Script.definition.js +1 -0
  85. package/lib/metadataTypes/definitions/SendClassification.definition.js +114 -0
  86. package/lib/metadataTypes/definitions/SetDefinition.definition.js +1 -0
  87. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -1
  88. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +1 -0
  89. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +1 -0
  90. package/lib/metadataTypes/definitions/{TriggeredSendDefinition.definition.js → TriggeredSend.definition.js} +5 -3
  91. package/lib/metadataTypes/definitions/User.definition.js +365 -0
  92. package/lib/retrieveChangelog.js +1 -2
  93. package/lib/util/auth.js +29 -9
  94. package/lib/util/businessUnit.js +3 -3
  95. package/lib/util/cli.js +55 -7
  96. package/lib/util/devops.js +6 -4
  97. package/lib/util/file.js +55 -13
  98. package/lib/util/init.config.js +1 -2
  99. package/lib/util/init.npm.js +3 -3
  100. package/lib/util/util.js +23 -14
  101. package/package.json +16 -15
  102. package/test/general.test.js +62 -0
  103. package/test/mockRoot/.mcdevrc.json +7 -5
  104. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testBlocked_user.user-meta.json +23 -0
  105. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testExisting_user.user-meta.json +31 -0
  106. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testNew_user.user-meta.json +27 -0
  107. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{childBU_dataextension_test.dataExtension-meta.json → testExisting_dataExtension.dataExtension-meta.json} +2 -2
  108. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{testDataExtension.dataExtension-meta.json → testNew_dataExtension.dataExtension-meta.json} +2 -2
  109. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_interaction.interaction-meta.json +576 -0
  110. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp +2 -0
  111. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +10 -0
  112. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp +2 -0
  113. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +10 -0
  114. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.amp +1 -0
  115. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json +61 -0
  116. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.amp +1 -0
  117. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.json +60 -0
  118. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +1 -1
  119. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json +1 -1
  120. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql +1 -1
  121. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +1 -1
  122. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -1
  123. package/test/resourceFactory.js +13 -0
  124. package/test/resources/1111111/accountUser/configure-response.xml +70 -0
  125. package/test/resources/1111111/accountUser/create-response.xml +97 -0
  126. package/test/resources/1111111/accountUser/retrieve-response.xml +156 -0
  127. package/test/resources/1111111/accountUser/update-response.xml +111 -0
  128. package/test/resources/1111111/accountUserAccount/retrieve-response.xml +77 -0
  129. package/test/resources/1111111/platform/v1/setup/quickflow/data/get-response.json +455 -0
  130. package/test/resources/1111111/role/retrieve-response.xml +76 -0
  131. package/test/resources/1111111/user/build-expected.json +16 -0
  132. package/test/resources/1111111/user/create-expected.json +21 -0
  133. package/test/resources/1111111/user/retrieve-expected.json +24 -0
  134. package/test/resources/1111111/user/template-expected.json +16 -0
  135. package/test/resources/1111111/user/update-expected.json +21 -0
  136. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/delete-response.json +1 -0
  137. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +17 -0
  138. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +3 -3
  139. package/test/resources/9999999/automation/v1/queries/get-response.json +21 -4
  140. package/test/resources/9999999/automation/v1/queries/post-response.json +4 -4
  141. package/test/resources/9999999/data/v1/customobjectdata/key/{childBU_dataextension_test → testExisting_dataExtension}/rowset/get-response.json +1 -1
  142. package/test/resources/9999999/dataExtension/build-expected.json +3 -3
  143. package/test/resources/9999999/dataExtension/create-expected.json +2 -2
  144. package/test/resources/9999999/dataExtension/create-response.xml +8 -3
  145. package/test/resources/9999999/dataExtension/retrieve-expected.json +3 -3
  146. package/test/resources/9999999/dataExtension/retrieve-response.xml +9 -4
  147. package/test/resources/9999999/dataExtension/template-expected.json +3 -3
  148. package/test/resources/9999999/dataExtension/update-expected.json +3 -3
  149. package/test/resources/9999999/dataExtension/update-response.xml +9 -4
  150. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +14 -9
  151. package/test/resources/9999999/interaction/v1/interactions/get-response.json +312 -0
  152. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +312 -0
  153. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/put-response.json +592 -0
  154. package/test/resources/9999999/journey/build-expected.json +572 -0
  155. package/test/resources/9999999/journey/get-expected.json +576 -0
  156. package/test/resources/9999999/journey/put-expected.json +576 -0
  157. package/test/resources/9999999/journey/template-expected.json +572 -0
  158. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json +42 -0
  159. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow/delete-response.json +0 -0
  160. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json +1 -0
  161. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/post-response.json +3 -0
  162. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/delete-response.json +0 -0
  163. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json +106 -0
  164. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/post-response.json +0 -0
  165. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTQ3Ojc4OjA/get-response.json +127 -0
  166. package/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json +129 -0
  167. package/test/resources/9999999/legacy/v1/beta/mobile/message/post-response.json +3 -0
  168. package/test/resources/9999999/legacy/v1/beta2/data/campaign/get-response.json +29 -0
  169. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  170. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json +1 -1
  171. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json +1 -1
  172. package/test/resources/9999999/mobileKeyword/build-expected.amp +2 -0
  173. package/test/resources/9999999/mobileKeyword/build-expected.json +9 -0
  174. package/test/resources/9999999/mobileKeyword/get-expected.amp +2 -0
  175. package/test/resources/9999999/mobileKeyword/get-expected.json +15 -0
  176. package/test/resources/9999999/mobileKeyword/post-create-expected.amp +2 -0
  177. package/test/resources/9999999/mobileKeyword/post-create-expected.json +17 -0
  178. package/test/resources/9999999/mobileKeyword/template-expected.amp +2 -0
  179. package/test/resources/9999999/mobileKeyword/template-expected.json +9 -0
  180. package/test/resources/9999999/mobileMessage/build-expected.amp +1 -0
  181. package/test/resources/9999999/mobileMessage/build-expected.json +60 -0
  182. package/test/resources/9999999/mobileMessage/get-expected.amp +1 -0
  183. package/test/resources/9999999/mobileMessage/get-expected.json +61 -0
  184. package/test/resources/9999999/mobileMessage/post-create-expected.amp +1 -0
  185. package/test/resources/9999999/mobileMessage/post-create-expected.json +63 -0
  186. package/test/resources/9999999/mobileMessage/post-update-expected.amp +1 -0
  187. package/test/resources/9999999/mobileMessage/post-update-expected.json +61 -0
  188. package/test/resources/9999999/mobileMessage/template-expected.amp +1 -0
  189. package/test/resources/9999999/mobileMessage/template-expected.json +60 -0
  190. package/test/resources/9999999/query/build-expected.json +1 -1
  191. package/test/resources/9999999/query/get-expected.json +1 -1
  192. package/test/resources/9999999/query/get2-expected.json +11 -0
  193. package/test/resources/9999999/query/patch-expected.json +1 -1
  194. package/test/resources/9999999/query/post-expected.json +1 -1
  195. package/test/resources/9999999/query/template-expected.json +1 -1
  196. package/test/resources/9999999/queryDefinition/retrieve-response.xml +30 -0
  197. package/test/resources/9999999/transactionalEmail/build-expected.json +5 -5
  198. package/test/resources/9999999/transactionalEmail/get-expected.json +1 -1
  199. package/test/resources/9999999/transactionalEmail/patch-expected.json +1 -1
  200. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  201. package/test/resources/9999999/transactionalEmail/template-expected.json +5 -5
  202. package/test/resources/9999999/transactionalPush/build-expected.json +2 -2
  203. package/test/resources/9999999/transactionalPush/template-expected.json +2 -2
  204. package/test/resources/9999999/transactionalSMS/build-expected.json +3 -3
  205. package/test/resources/9999999/transactionalSMS/template-expected.json +3 -3
  206. package/test/{dataExtension.test.js → type.dataExtension.test.js} +78 -21
  207. package/test/{interaction.test.js → type.journey.test.js} +64 -30
  208. package/test/type.mobileKeyword.test.js +250 -0
  209. package/test/type.mobileMessage.test.js +205 -0
  210. package/test/{query.test.js → type.query.test.js} +102 -5
  211. package/test/{transactionalEmail.test.js → type.transactionalEmail.test.js} +40 -2
  212. package/test/{transactionalPush.test.js → type.transactionalPush.test.js} +41 -2
  213. package/test/{transactionalSMS.test.js → type.transactionalSMS.test.js} +73 -3
  214. package/test/type.user.test.js +160 -0
  215. package/test/utils.js +17 -5
  216. package/types/mcdev.d.js +48 -15
  217. package/.github/workflows/code-analysis.yml +0 -57
  218. package/lib/metadataTypes/AccountUser.js +0 -426
  219. package/lib/metadataTypes/definitions/AccountUser.definition.js +0 -227
  220. package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +0 -266
  221. package/test/resources/9999999/interaction/build-expected.json +0 -260
  222. package/test/resources/9999999/interaction/get-expected.json +0 -264
  223. package/test/resources/9999999/interaction/put-expected.json +0 -264
  224. package/test/resources/9999999/interaction/template-expected.json +0 -260
  225. package/test/resources/9999999/interaction/v1/interactions/put-response.json +0 -280
  226. /package/test/mockRoot/deploy/testInstance/testBU/{interaction → journey}/testNew_interaction.interaction-meta.json +0 -0
  227. /package/test/resources/9999999/{interaction → journey}/post-expected.json +0 -0
@@ -25,7 +25,7 @@ class Asset extends MetadataType {
25
25
  */
26
26
  static async retrieve(retrieveDir, _, subTypeArr, key) {
27
27
  const items = [];
28
- subTypeArr = subTypeArr || this._getSubTypes();
28
+ subTypeArr ||= this._getSubTypes();
29
29
  await File.initPrettier();
30
30
  // loop through subtypes and return results of each subType for caching (saving is handled per subtype)
31
31
  for (const subType of subTypeArr) {
@@ -496,6 +496,78 @@ class Asset extends MetadataType {
496
496
  return metadata;
497
497
  }
498
498
 
499
+ /**
500
+ * Gets executed after deployment of metadata type
501
+ *
502
+ * @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
503
+ * @param {TYPE.MetadataTypeMap} _ originalMetadata to be updated (contains additioanl fields)
504
+ * @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
505
+ * @param {boolean} [isRefresh] optional flag to indicate that triggeredSend should be refreshed after deployment of assets
506
+ * @returns {Promise.<void>} -
507
+ */
508
+ static async postDeployTasks(metadata, _, createdUpdated, isRefresh) {
509
+ if (isRefresh) {
510
+ if (createdUpdated.updated) {
511
+ // only run this if assets were updated. for created assets we do not expect
512
+ this._refreshTriggeredSend(metadata);
513
+ } else {
514
+ Util.logger.warn(
515
+ 'You set the --refresh flag but no updated assets found. Skipping refresh of triggeredSendDefinitions.'
516
+ );
517
+ }
518
+ }
519
+ }
520
+
521
+ /**
522
+ * helper for {@link postDeployTasks}. triggers a refresh of active triggerredSendDefinitions associated with the updated asset-message items. Gets executed if isRefresh is true.
523
+ *
524
+ * @private
525
+ * @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
526
+ * @returns {Promise.<void>} -
527
+ */
528
+ static async _refreshTriggeredSend(metadata) {
529
+ // get legacyData.legacyId from assets to compare to TSD's metadata.Email.ID to
530
+ const legacyIdArr = Object.keys(metadata)
531
+ .map((key) => metadata[key]?.legacyData?.legacyId)
532
+ .filter(Boolean);
533
+
534
+ if (!legacyIdArr.length) {
535
+ Util.logger.warn(
536
+ 'No legacyId found in updated emails. Skipping refresh of triggeredSendDefinitions.'
537
+ );
538
+ return;
539
+ }
540
+ // prep triggeredSendDefinition class
541
+ const TriggeredSend = require('./TriggeredSend');
542
+ TriggeredSend.properties = this.properties;
543
+ TriggeredSend.buObject = this.buObject;
544
+ TriggeredSend.client = this.client;
545
+ try {
546
+ // find refreshable TSDs
547
+ const tsdObj = (await TriggeredSend.findRefreshableItems()).metadata;
548
+
549
+ const tsdCountInitial = Object.keys(tsdObj).length;
550
+ const emailCount = legacyIdArr.length;
551
+ // filter TSDs by legacyId
552
+ for (const key in tsdObj) {
553
+ if (!legacyIdArr.includes(tsdObj[key].Email.ID)) {
554
+ delete tsdObj[key];
555
+ }
556
+ }
557
+ const tsdCountFiltered = Object.keys(tsdObj).length;
558
+ Util.logger.info(
559
+ `Found ${tsdCountFiltered} out of ${tsdCountInitial} total triggeredSendDefinitions for ${emailCount} deployed emails. Commencing validation...`
560
+ );
561
+
562
+ // get keys of TSDs to refresh
563
+ const keyArr = await TriggeredSend.getKeysForValidTSDs(tsdObj);
564
+
565
+ await TriggeredSend.refresh(keyArr);
566
+ } catch {
567
+ Util.logger.warn('Failed to refresh triggeredSendDefinition');
568
+ }
569
+ }
570
+
499
571
  /**
500
572
  * prepares an asset definition for deployment
501
573
  *
@@ -23,7 +23,6 @@ class AttributeGroup extends MetadataType {
23
23
  retrieveDir,
24
24
  '/hub/v1/contacts/schema/attributeGroups',
25
25
  null,
26
- null,
27
26
  key
28
27
  );
29
28
  }
@@ -230,12 +230,11 @@ class Automation extends MetadataType {
230
230
  * @param {TYPE.AutomationMap} metadata metadata mapped by their keyField
231
231
  * @param {string} targetBU name/shorthand of target businessUnit for mapping
232
232
  * @param {string} retrieveDir directory where metadata after deploy should be saved
233
+ * @param {boolean} [isRefresh] optional flag - so far not used by automation
233
234
  * @returns {Promise.<TYPE.AutomationMap>} Promise
234
235
  */
235
- static async deploy(metadata, targetBU, retrieveDir) {
236
- const orignalMetadata = JSON.parse(JSON.stringify(metadata));
237
- const upsertResults = await this.upsert(metadata, targetBU);
238
- await this.postDeployTasks(upsertResults, orignalMetadata);
236
+ static async deploy(metadata, targetBU, retrieveDir, isRefresh) {
237
+ const upsertResults = await this.upsert(metadata, targetBU, isRefresh);
239
238
  await this.saveResults(upsertResults, retrieveDir, null);
240
239
  return upsertResults;
241
240
  }
@@ -868,7 +867,7 @@ class Automation extends MetadataType {
868
867
  row1.push(
869
868
  `| ${column.title}${
870
869
  column.description
871
- ? `<br>_<small>${column.description.replace(/\n/g, '<br>')}</small>_`
870
+ ? `<br>_<small>${column.description.replaceAll('\n', '<br>')}</small>_`
872
871
  : ''
873
872
  } `
874
873
  );
@@ -1000,6 +999,50 @@ class Automation extends MetadataType {
1000
999
  return super.getFilesToCommit(keyArr);
1001
1000
  }
1002
1001
  }
1002
+ /**
1003
+ * helper to allow us to select single metadata entries via REST
1004
+ *
1005
+ * @private
1006
+ * @param {string} key customer key
1007
+ * @returns {Promise.<string>} objectId or enpty string
1008
+ */
1009
+ static async _getObjectIdForSingleRetrieve(key) {
1010
+ const response = await this.client.soap.retrieve('Program', ['ObjectID'], {
1011
+ filter: {
1012
+ leftOperand: 'CustomerKey',
1013
+ operator: 'equals',
1014
+ rightOperand: key,
1015
+ },
1016
+ });
1017
+ return response?.Results?.length ? response.Results[0].ObjectID : null;
1018
+ }
1019
+
1020
+ /**
1021
+ * Delete a metadata item from the specified business unit
1022
+ *
1023
+ * @param {string} customerKey Identifier of data extension
1024
+ * @returns {boolean} deletion success status
1025
+ */
1026
+ static async deleteByKey(customerKey) {
1027
+ // the delete endpoint returns a general exception if the automation does not exist; handle it gracefully instead by adding a retrieve first
1028
+ const objectId = customerKey ? await this._getObjectIdForSingleRetrieve(customerKey) : null;
1029
+ if (!objectId) {
1030
+ Util.logger.error(` - automation not found`);
1031
+ return false;
1032
+ }
1033
+ return super.deleteByKeySOAP(customerKey, 'CustomerKey');
1034
+ }
1035
+ /**
1036
+ * clean up after deleting a metadata item
1037
+ *
1038
+ * @param {string} customerKey Identifier of metadata item
1039
+ * @returns {void}
1040
+ */
1041
+ static async postDeleteTasks(customerKey) {
1042
+ // delete local copy: retrieve/cred/bu/.../...-meta.json
1043
+ // delete local copy: retrieve/cred/bu/.../...-doc.md
1044
+ await super.postDeleteTasks(customerKey, [`${this.definition.type}-doc.md`]);
1045
+ }
1003
1046
  }
1004
1047
 
1005
1048
  // Assign definition to static attributes
@@ -21,31 +21,44 @@ class Campaign extends MetadataType {
21
21
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
22
22
  */
23
23
  static async retrieve(retrieveDir, _, __, key) {
24
- const res = await super.retrieveREST(retrieveDir, '/hub/v1/campaigns', null, null, key);
24
+ const res = await super.retrieveREST(
25
+ retrieveDir,
26
+ '/legacy/v1/beta2/data/campaign/',
27
+ null,
28
+ key
29
+ );
25
30
  // get assignments
26
-
31
+ Util.logger.info(`Retrieving: campaignAsset`);
27
32
  const campaignAssets = await Promise.all(
28
33
  Object.keys(res.metadata).map((key) =>
29
- this.getAssetTags(retrieveDir, res.metadata[key].id, key)
34
+ this.getAssetTags(retrieveDir, res.metadata[key].campaignId, key)
30
35
  )
31
36
  );
32
37
  Util.logger.info(
33
- `Downloaded: campaignAssets (${campaignAssets.flat().length})` + Util.getKeysString(key)
38
+ `Downloaded: campaignAsset (${campaignAssets.flat().length})` + Util.getKeysString(key)
34
39
  );
35
40
 
36
41
  return res;
37
42
  }
43
+ /**
44
+ * Retrieves event definition metadata for caching
45
+ *
46
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
47
+ */
48
+ static retrieveForCache() {
49
+ return super.retrieveREST(null, '/legacy/v1/beta2/data/campaign/');
50
+ }
38
51
 
39
52
  /**
40
53
  * Parses campaign asset response body and returns metadata entries mapped to their id
41
54
  *
42
55
  * @param {string} retrieveDir folder where to save
43
- * @param {string} id of camapaign to retrieve
56
+ * @param {string} campaignId of camapaign to retrieve
44
57
  * @param {string} name of camapaign for saving
45
58
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Campaign Asset Object
46
59
  */
47
- static async getAssetTags(retrieveDir, id, name) {
48
- const res = await this.client.rest.getBulk(`/hub/v1/campaigns/${id}/assets`);
60
+ static async getAssetTags(retrieveDir, campaignId, name) {
61
+ const res = await this.client.rest.getBulk(`/hub/v1/campaigns/${campaignId}/assets`);
49
62
 
50
63
  for (const asset of res.items) {
51
64
  await File.writeJSONToFile(
@@ -36,7 +36,7 @@ class ContentArea extends MetadataType {
36
36
  };
37
37
  }
38
38
  // !dont activate `await File.initPrettier('html');` as we only want to retrieve for migration and formatting might mess with the outcome
39
- return super.retrieveSOAP(retrieveDir, requestParams);
39
+ return super.retrieveSOAP(retrieveDir, requestParams, key);
40
40
  }
41
41
  /**
42
42
  * manages post retrieve steps