mcdev 5.0.2 → 5.2.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 (237) hide show
  1. package/.coverage-comment-template.svelte +177 -161
  2. package/.eslintrc.json +4 -4
  3. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +2 -2
  5. package/.github/dependabot.yml +8 -0
  6. package/.github/workflows/coverage-base-update.yml +6 -2
  7. package/.github/workflows/coverage-develop-branch.yml +7 -8
  8. package/.github/workflows/coverage-main-branch.yml +7 -8
  9. package/.github/workflows/coverage.yml +7 -4
  10. package/.husky/post-checkout +4 -2
  11. package/.husky/post-merge +1 -0
  12. package/.vscode/extensions.json +4 -0
  13. package/docs/dist/documentation.md +756 -294
  14. package/lib/Deployer.js +28 -28
  15. package/lib/MetadataTypeDefinitions.js +1 -1
  16. package/lib/MetadataTypeInfo.js +1 -1
  17. package/lib/Retriever.js +1 -1
  18. package/lib/cli.js +184 -6
  19. package/lib/index.js +493 -22
  20. package/lib/metadataTypes/Asset.js +10 -11
  21. package/lib/metadataTypes/AttributeGroup.js +76 -2
  22. package/lib/metadataTypes/AttributeSet.js +260 -0
  23. package/lib/metadataTypes/Automation.js +771 -247
  24. package/lib/metadataTypes/DataExtension.js +7 -7
  25. package/lib/metadataTypes/DataExtensionField.js +1 -1
  26. package/lib/metadataTypes/Event.js +2 -3
  27. package/lib/metadataTypes/Folder.js +1 -1
  28. package/lib/metadataTypes/Journey.js +5 -6
  29. package/lib/metadataTypes/MetadataType.js +187 -60
  30. package/lib/metadataTypes/MobileKeyword.js +8 -8
  31. package/lib/metadataTypes/MobileMessage.js +5 -5
  32. package/lib/metadataTypes/Query.js +47 -5
  33. package/lib/metadataTypes/Script.js +3 -3
  34. package/lib/metadataTypes/TransactionalSMS.js +5 -5
  35. package/lib/metadataTypes/TriggeredSend.js +25 -50
  36. package/lib/metadataTypes/User.js +7 -4
  37. package/lib/metadataTypes/definitions/Asset.definition.js +1 -0
  38. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +117 -106
  39. package/lib/metadataTypes/definitions/{SetDefinition.definition.js → AttributeSet.definition.js} +54 -27
  40. package/lib/metadataTypes/definitions/Automation.definition.js +74 -21
  41. package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -0
  42. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
  43. package/lib/metadataTypes/definitions/EmailSend.definition.js +1 -0
  44. package/lib/metadataTypes/definitions/Event.definition.js +1 -0
  45. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  46. package/lib/metadataTypes/definitions/ImportFile.definition.js +37 -6
  47. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +1 -0
  48. package/lib/metadataTypes/definitions/Query.definition.js +1 -0
  49. package/lib/metadataTypes/definitions/Role.definition.js +1 -0
  50. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +2 -0
  51. package/lib/metadataTypes/definitions/User.definition.js +1 -0
  52. package/lib/util/cache.js +9 -4
  53. package/lib/util/cli.js +40 -0
  54. package/lib/util/devops.js +13 -11
  55. package/lib/util/file.js +2 -2
  56. package/lib/util/init.js +84 -0
  57. package/lib/util/util.js +268 -137
  58. package/package.json +11 -11
  59. package/test/general.test.js +26 -0
  60. package/test/mockRoot/.mcdevrc.json +1 -1
  61. package/test/mockRoot/deploy/testInstance/testBU/automation/testExisting_automation.automation-meta.json +52 -0
  62. package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +45 -0
  63. package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testExisting_dataExtract.dataExtract-meta.json +35 -0
  64. package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testNew_dataExtract.dataExtract-meta.json +35 -0
  65. package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testExisting_fileTransfer.fileTransfer-meta.json +17 -0
  66. package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testNew_fileTransfer.fileTransfer-meta.json +17 -0
  67. package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +29 -0
  68. package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +29 -0
  69. package/test/mockRoot/deploy/testInstance/testBU/query/{testExistingQuery.query-meta.json → testExisting_query.query-meta.json} +2 -2
  70. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.json +11 -0
  71. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.sql +6 -0
  72. package/test/mockRoot/deploy/testInstance/testBU/query/{testNewQuery.query-meta.json → testNew_query.query-meta.json} +2 -2
  73. package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.json +6 -0
  74. package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.ssjs +1 -0
  75. package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.json +6 -0
  76. package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.ssjs +1 -0
  77. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testExisting_triggeredSend.triggeredSend-meta.json +29 -0
  78. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testNew_triggeredSend.triggeredSend-meta.json +29 -0
  79. package/test/resourceFactory.js +132 -24
  80. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-response.xml +27 -0
  81. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDEmaillike@-response.xml +156 -0
  82. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +87 -0
  83. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmaillike@-response.xml +156 -0
  84. package/test/resources/1111111/accountUser/retrieve-CustomerKey=testExisting_userANDActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +27 -0
  85. package/test/resources/1111111/accountUserAccount/retrieve-AccountUser.AccountUserID=700301950-response.xml +60 -0
  86. package/test/resources/1111111/user/retrieve-expected.md +4 -2
  87. package/test/resources/9999999/attributeGroup/retrieve-expected.json +25 -0
  88. package/test/resources/9999999/attributeSet/retrieve-expected.json +748 -0
  89. package/test/resources/9999999/automation/build-expected.json +57 -0
  90. package/test/resources/9999999/automation/create-expected.json +45 -0
  91. package/test/resources/9999999/automation/create-testNew_automation-expected.md +28 -0
  92. package/test/resources/9999999/automation/delete-response.xml +40 -0
  93. package/test/resources/9999999/automation/patch_fixKeys-pause-expected.json +44 -0
  94. package/test/resources/9999999/automation/patch_fixKeys-schedule-expected.json +44 -0
  95. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
  96. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_pause-response.xml +42 -0
  97. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +42 -0
  98. package/test/resources/9999999/automation/perform-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
  99. package/test/resources/9999999/automation/retrieve-expected.json +57 -0
  100. package/test/resources/9999999/automation/retrieve-testExisting_automation-expected.md +30 -0
  101. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
  102. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-pause-response.xml +38 -0
  103. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_pause-response.xml +52 -0
  104. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +52 -0
  105. package/test/resources/9999999/automation/schedule-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
  106. package/test/resources/9999999/automation/template-expected.json +57 -0
  107. package/test/resources/9999999/automation/update-expected.json +45 -0
  108. package/test/resources/9999999/automation/update-testExisting_automation-expected.md +28 -0
  109. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +85 -0
  110. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/patch-response.json +85 -0
  111. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/get-response.json +85 -0
  112. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/patch-response.json +85 -0
  113. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/get-response.json +85 -0
  114. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/patch-response.json +85 -0
  115. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/get-response.json +85 -0
  116. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/patch-response.json +85 -0
  117. package/test/resources/9999999/automation/v1/automations/a8afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +85 -0
  118. package/test/resources/9999999/automation/v1/automations/post-response.json +86 -0
  119. package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/get-response.json +38 -0
  120. package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/patch-response.json +38 -0
  121. package/test/resources/9999999/automation/v1/dataextracts/get-response.json +20 -0
  122. package/test/resources/9999999/automation/v1/dataextracts/post-response.json +38 -0
  123. package/test/resources/9999999/automation/v1/dataextracttypes/get-response.json +50 -0
  124. package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/get-response.json +18 -0
  125. package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/patch-response.json +18 -0
  126. package/test/resources/9999999/automation/v1/filetransfers/get-response.json +15 -0
  127. package/test/resources/9999999/automation/v1/filetransfers/post-response.json +18 -0
  128. package/test/resources/9999999/automation/v1/ftplocations/get-response.json +18 -0
  129. package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/patch-response.json +31 -0
  130. package/test/resources/9999999/automation/v1/imports/get-response.json +38 -0
  131. package/test/resources/9999999/automation/v1/imports/post-response.json +30 -0
  132. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dae/actions/start/post-response.txt +1 -0
  133. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/actions/start/post-response.txt +1 -0
  134. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +2 -2
  135. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +2 -2
  136. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/get-response.json +17 -0
  137. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/patch-response.json +18 -0
  138. package/test/resources/9999999/automation/v1/queries/get-response.json +22 -5
  139. package/test/resources/9999999/automation/v1/queries/post-response.json +2 -2
  140. package/test/resources/9999999/automation/v1/scripts/39f6a488-20eb-4ba0-b0b9-023725b574e4/patch-response.json +10 -0
  141. package/test/resources/9999999/automation/v1/scripts/get-response.json +27 -0
  142. package/test/resources/9999999/automation/v1/scripts/post-response.json +10 -0
  143. package/test/resources/9999999/dataExtension/retrieve-Name=testExisting_dataExtension-response.xml +52 -0
  144. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtension-response.xml +98 -0
  145. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_dataExtensionORDataExtension.CustomerKey=testExisting_dataExtension-response.xml +99 -0
  146. package/test/resources/9999999/dataExtract/build-expected.json +35 -0
  147. package/test/resources/9999999/dataExtract/get-expected.json +39 -0
  148. package/test/resources/9999999/dataExtract/patch-expected.json +37 -0
  149. package/test/resources/9999999/dataExtract/post-expected.json +37 -0
  150. package/test/resources/9999999/dataExtract/template-expected.json +35 -0
  151. package/test/resources/9999999/dataFolder/retrieve-ContentType=automations-response.xml +48 -0
  152. package/test/resources/9999999/dataFolder/retrieve-ContentType=contextual_suppression_listORContentType=publicationORContentType=suppression_listORContentType=mysubsORContentType=list-response.xml +136 -0
  153. package/test/resources/9999999/dataFolder/retrieve-ContentType=queryactivity-response.xml +48 -0
  154. package/test/resources/9999999/dataFolder/retrieve-ContentType=ssjsactivity-response.xml +48 -0
  155. package/test/resources/9999999/dataFolder/retrieve-ContentType=triggered_send_journeybuilderORContentType=triggered_sendORContentType=hidden-response.xml +276 -0
  156. package/test/resources/9999999/dataFolder/retrieve-response.xml +45 -0
  157. package/test/resources/9999999/email/retrieve-response.xml +203 -0
  158. package/test/resources/9999999/emailSendDefinition/retrieve-IsPlatformObject=falseANDDescriptionnotEqualsSFSendDefinition-response.xml +85 -0
  159. package/test/resources/9999999/fileTransfer/build-expected.json +15 -0
  160. package/test/resources/9999999/fileTransfer/get-expected.json +17 -0
  161. package/test/resources/9999999/fileTransfer/patch-expected.json +17 -0
  162. package/test/resources/9999999/fileTransfer/post-expected.json +17 -0
  163. package/test/resources/9999999/fileTransfer/template-expected.json +15 -0
  164. package/test/resources/9999999/hub/v1/contacts/schema/attributeGroups/get-response.json +585 -0
  165. package/test/resources/9999999/hub/v1/contacts/schema/setDefinitions/get-response.json +19807 -0
  166. package/test/resources/9999999/importFile/build-expected.json +27 -0
  167. package/test/resources/9999999/importFile/get-expected.json +29 -0
  168. package/test/resources/9999999/importFile/patch-expected.json +29 -0
  169. package/test/resources/9999999/importFile/post-expected.json +29 -0
  170. package/test/resources/9999999/importFile/template-expected.json +27 -0
  171. package/test/resources/9999999/legacy/v1/beta/automations/notifications/RkpOcE9qSVh2VUdnYTVJbWFfWW14dzoyNTow/get-response.json +21 -0
  172. package/test/resources/9999999/legacy/v1/beta/automations/notifications/RkpOcE9qSVh2VUdnYTVJbWFfWW14dzoyNTow/post-response.json +0 -0
  173. package/test/resources/9999999/legacy/v1/beta/bulk/automations/automation/definition/get-response.json +30 -0
  174. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation-response.xml +30 -0
  175. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_pause-response.xml +32 -0
  176. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_schedule-response.xml +32 -0
  177. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_paused-response.xml +32 -0
  178. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_scheduled-response.xml +32 -0
  179. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_pause-response.xml +30 -0
  180. package/test/resources/9999999/program/retrieve-CustomerKey=testNew_automation-response.xml +30 -0
  181. package/test/resources/9999999/program/retrieve-Name=testExisting_automation-response.xml +31 -0
  182. package/test/resources/9999999/program/retrieve-response.xml +50 -0
  183. package/test/resources/9999999/query/build-expected.json +2 -2
  184. package/test/resources/9999999/query/get-expected.json +2 -2
  185. package/test/resources/9999999/query/get2-expected.json +2 -2
  186. package/test/resources/9999999/query/patch-expected.json +2 -2
  187. package/test/resources/9999999/query/patch_fixKeys-expected.json +11 -0
  188. package/test/resources/9999999/query/patch_fixKeys-expected.sql +6 -0
  189. package/test/resources/9999999/query/post-expected.json +2 -2
  190. package/test/resources/9999999/query/template-expected.json +2 -2
  191. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixKeysANDStatus=Active-response.xml +30 -0
  192. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixedKeysANDStatus=Active-response.xml +30 -0
  193. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testNew_queryANDStatus=Active-response.xml +30 -0
  194. package/test/resources/9999999/script/build-expected.json +6 -0
  195. package/test/resources/9999999/script/build-expected.ssjs +1 -0
  196. package/test/resources/9999999/script/get-expected.json +8 -0
  197. package/test/resources/9999999/script/get-expected.ssjs +1 -0
  198. package/test/resources/9999999/script/get_noScriptTag-expected.html +1 -0
  199. package/test/resources/9999999/script/get_noScriptTag-expected.json +8 -0
  200. package/test/resources/9999999/script/patch-expected.json +8 -0
  201. package/test/resources/9999999/script/patch-expected.ssjs +1 -0
  202. package/test/resources/9999999/script/post-expected.json +8 -0
  203. package/test/resources/9999999/script/post-expected.ssjs +1 -0
  204. package/test/resources/9999999/script/template-expected.json +6 -0
  205. package/test/resources/9999999/script/template-expected.ssjs +1 -0
  206. package/test/resources/9999999/triggeredSend/build-expected.json +29 -0
  207. package/test/resources/9999999/triggeredSend/get-expected.json +29 -0
  208. package/test/resources/9999999/triggeredSend/patch-expected.json +29 -0
  209. package/test/resources/9999999/triggeredSend/post-expected.json +29 -0
  210. package/test/resources/9999999/triggeredSend/template-expected.json +29 -0
  211. package/test/resources/9999999/triggeredSendDefinition/create-response.xml +75 -0
  212. package/test/resources/9999999/triggeredSendDefinition/delete-response.xml +36 -0
  213. package/test/resources/9999999/triggeredSendDefinition/{retrieve-response.xml → retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml} +4 -4
  214. package/test/resources/9999999/triggeredSendDefinition/update-response.xml +74 -0
  215. package/test/type.attributeGroup.test.js +55 -0
  216. package/test/type.attributeSet.test.js +55 -0
  217. package/test/type.automation.test.js +886 -0
  218. package/test/type.dataExtension.test.js +3 -1
  219. package/test/type.dataExtract.test.js +187 -0
  220. package/test/type.fileTransfer.test.js +185 -0
  221. package/test/type.importFile.test.js +186 -0
  222. package/test/type.mobileKeyword.test.js +0 -1
  223. package/test/type.query.test.js +497 -33
  224. package/test/type.script.test.js +367 -0
  225. package/test/type.triggeredSend.test.js +152 -0
  226. package/test/type.user.test.js +37 -11
  227. package/test/utils.js +10 -6
  228. package/.coverage-comment-template.md +0 -20
  229. package/lib/metadataTypes/SetDefinition.js +0 -37
  230. /package/test/mockRoot/deploy/testInstance/testBU/query/{testExistingQuery.query-meta.sql → testExisting_query.query-meta.sql} +0 -0
  231. /package/test/mockRoot/deploy/testInstance/testBU/query/{testNewQuery.query-meta.sql → testNew_query.query-meta.sql} +0 -0
  232. /package/test/resources/1111111/accountUser/{retrieve-response.xml → retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-response.xml} +0 -0
  233. /package/test/resources/1111111/accountUserAccount/{retrieve-response.xml → retrieve-AccountUser.AccountUserIDIN700301950,700301951,7471228-response.xml} +0 -0
  234. /package/test/resources/1111111/businessUnit/{retrieve-response.xml → retrieve-ID=1111111-response.xml} +0 -0
  235. /package/test/resources/1111111/list/{retrieve-response.xml → retrieve-CustomerKey=All SubscribersORListName=All Subscribers-response.xml} +0 -0
  236. /package/test/resources/1111111/role/{retrieve-response.xml → retrieve-IsPrivate=false-response.xml} +0 -0
  237. /package/test/resources/9999999/queryDefinition/{retrieve-response.xml → retrieve-CustomerKey=testExisting_queryANDStatus=Active-response.xml} +0 -0
@@ -96,7 +96,7 @@ class MobileKeyword extends MetadataType {
96
96
  }
97
97
 
98
98
  /**
99
- * helper for {@link parseResponseBody} that creates a custom key field for this type based on mobileCode and keyword
99
+ * helper for {@link MobileKeyword.parseResponseBody} that creates a custom key field for this type based on mobileCode and keyword
100
100
  *
101
101
  * @private
102
102
  * @param {TYPE.MetadataType} metadata single item
@@ -106,7 +106,7 @@ class MobileKeyword extends MetadataType {
106
106
  }
107
107
 
108
108
  /**
109
- * helper for {@link preDeployTasks} and {@link createOrUpdate} to ensure we have code & keyword properly set
109
+ * helper for {@link MobileKeyword.preDeployTasks} and {@link MobileKeyword.createOrUpdate} to ensure we have code & keyword properly set
110
110
  *
111
111
  * @private
112
112
  * @param {TYPE.MetadataType} metadata single item
@@ -192,7 +192,7 @@ class MobileKeyword extends MetadataType {
192
192
  }
193
193
 
194
194
  /**
195
- * helper for {@link retrieve} and {@link retrieveAsTemplate}
195
+ * helper for {@link MobileKeyword.retrieve} and {@link MobileKeyword.retrieveAsTemplate}
196
196
  *
197
197
  * @private
198
198
  * @param {string} key customer key of single item to retrieve / name of the metadata file
@@ -281,7 +281,7 @@ class MobileKeyword extends MetadataType {
281
281
  }
282
282
  }
283
283
  /**
284
- * helper for {@link parseMetadata} and {@link _buildForNested}
284
+ * helper for {@link MobileKeyword.postRetrieveTasks} and {@link MobileKeyword._buildForNested}
285
285
  *
286
286
  * @param {string} metadataScript the code of the file
287
287
  * @returns {{fileExt:string,code:string}} returns found extension and file content
@@ -349,7 +349,7 @@ class MobileKeyword extends MetadataType {
349
349
  }
350
350
 
351
351
  /**
352
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
352
+ * helper for {@link MobileKeyword.buildTemplateForNested} / {@link MobileKeyword.buildDefinitionForNested}
353
353
  * handles extracted code if any are found for complex types
354
354
  *
355
355
  * @param {string} templateDir Directory where metadata templates are stored
@@ -445,7 +445,7 @@ class MobileKeyword extends MetadataType {
445
445
  return metadata;
446
446
  }
447
447
  /**
448
- * helper for {@link createREST}
448
+ * helper for {@link MetadataType.createREST}
449
449
  *
450
450
  * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
451
451
  * @param {object} apiResponse varies depending on the API call
@@ -455,7 +455,7 @@ class MobileKeyword extends MetadataType {
455
455
  await super.postDeployTasks_legacyApi(metadataEntry, apiResponse);
456
456
  }
457
457
  /**
458
- * helper for {@link updateREST}
458
+ * helper for {@link MetadataType.updateREST}
459
459
  *
460
460
  * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
461
461
  * @param {object} apiResponse varies depending on the API call
@@ -466,7 +466,7 @@ class MobileKeyword extends MetadataType {
466
466
  }
467
467
 
468
468
  /**
469
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
469
+ * helper for {@link MobileKeyword.preDeployTasks} that loads extracted code content back into JSON
470
470
  *
471
471
  * @param {TYPE.MetadataTypeItem} metadata a single definition
472
472
  * @param {string} deployDir directory of deploy files
@@ -83,7 +83,7 @@ class MobileMessage extends MetadataType {
83
83
  return super.createREST(metadata, '/legacy/v1/beta/mobile/message/');
84
84
  }
85
85
  /**
86
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
86
+ * helper for {@link MobileMessage.preDeployTasks} that loads extracted code content back into JSON
87
87
  *
88
88
  * @param {TYPE.MetadataTypeItem} metadata a single definition
89
89
  * @param {string} deployDir directory of deploy files
@@ -110,7 +110,7 @@ class MobileMessage extends MetadataType {
110
110
  }
111
111
  }
112
112
  /**
113
- * helper for {@link parseMetadata} and {@link _buildForNested}
113
+ * helper for {@link MobileMessage.postRetrieveTasks} and {@link MobileMessage._buildForNested}
114
114
  *
115
115
  * @param {string} code the code of the file
116
116
  * @returns {{fileExt:string,code:string}} returns found extension and file content
@@ -304,7 +304,7 @@ class MobileMessage extends MetadataType {
304
304
  return metadata;
305
305
  }
306
306
  /**
307
- * helper for {@link createREST}
307
+ * helper for {@link MetadataType.createREST}
308
308
  *
309
309
  * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
310
310
  * @param {object} apiResponse varies depending on the API call
@@ -314,7 +314,7 @@ class MobileMessage extends MetadataType {
314
314
  await super.postDeployTasks_legacyApi(metadataEntry, apiResponse);
315
315
  }
316
316
  /**
317
- * helper for {@link updateREST}
317
+ * helper for {@link MetadataType.updateREST}
318
318
  *
319
319
  * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
320
320
  * @param {object} apiResponse varies depending on the API call
@@ -380,7 +380,7 @@ class MobileMessage extends MetadataType {
380
380
  }
381
381
 
382
382
  /**
383
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
383
+ * helper for {@link MobileMessage.buildTemplateForNested} / {@link MobileMessage.buildDefinitionForNested}
384
384
  * handles extracted code if any are found for complex types
385
385
  *
386
386
  * @param {string} templateDir Directory where metadata templates are stored
@@ -38,7 +38,9 @@ class Query extends MetadataType {
38
38
  objectId = await this._getObjectIdForSingleRetrieve(key);
39
39
  if (!objectId) {
40
40
  // avoid running the rest request below by returning early
41
- Util.logger.info(`Downloaded: ${this.definition.type} (0) - Key: ${key}`);
41
+ Util.logger.info(
42
+ `Downloaded: ${this.definition.type} (0)${Util.getKeysString(key)}`
43
+ );
42
44
  return { metadata: {}, type: this.definition.type };
43
45
  }
44
46
  }
@@ -50,6 +52,34 @@ class Query extends MetadataType {
50
52
  key
51
53
  );
52
54
  }
55
+ /**
56
+ * a function to start query execution via API
57
+ *
58
+ * @param {string[]} keyArr customerkey of the metadata
59
+ * @returns {Promise.<string[]>} Returns list of keys that were executed successfully
60
+ */
61
+ static async execute(keyArr) {
62
+ const results = [];
63
+ // works only with objectId
64
+ let objectId;
65
+ for (const key of keyArr) {
66
+ if (key) {
67
+ objectId = await this._getObjectIdForSingleRetrieve(key);
68
+ if (!objectId) {
69
+ Util.logger.info(`Skipping ${key} - did not find an item with such key`);
70
+ continue;
71
+ }
72
+ }
73
+ results.push(
74
+ super.executeREST(`/automation/v1/queries/${objectId}/actions/start/`, key)
75
+ );
76
+ }
77
+ const executedKeyArr = (await Promise.all(results))
78
+ .filter((r) => r.response === 'OK')
79
+ .map((r) => r.key);
80
+ Util.logger.info(`Executed ${executedKeyArr.length} of ${keyArr.length} items`);
81
+ return executedKeyArr;
82
+ }
53
83
  /**
54
84
  * helper to allow us to select single metadata entries via REST
55
85
  *
@@ -224,7 +254,7 @@ class Query extends MetadataType {
224
254
  return metadata;
225
255
  }
226
256
  /**
227
- * helper for {@link buildDefinitionForNested}
257
+ * helper for {@link Query.buildDefinitionForNested}
228
258
  * searches extracted SQL file for template variables and applies the market values
229
259
  *
230
260
  * @param {string} code code from extracted code
@@ -302,7 +332,7 @@ class Query extends MetadataType {
302
332
  );
303
333
  }
304
334
  /**
305
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
335
+ * helper for {@link Query.buildTemplateForNested} / {@link Query.buildDefinitionForNested}
306
336
  * handles extracted code if any are found for complex types
307
337
  *
308
338
  * @private
@@ -394,11 +424,12 @@ class Query extends MetadataType {
394
424
  * @param {object} ex response payload from REST API
395
425
  * @returns {string[] | void} formatted Error Message
396
426
  */
397
- static checkForErrors(ex) {
398
- const errors = super.checkForErrors(ex);
427
+ static getErrorsREST(ex) {
428
+ const errors = super.getErrorsREST(ex);
399
429
  if (errors?.length > 0) {
400
430
  return errors.map((msg) => msg.split('Error saving the Query field.').join(''));
401
431
  }
432
+ return errors;
402
433
  }
403
434
  /**
404
435
  * Delete a metadata item from the specified business unit
@@ -426,6 +457,17 @@ class Query extends MetadataType {
426
457
  // delete local copy: retrieve/cred/bu/.../...-meta.sql
427
458
  await super.postDeleteTasks(customerKey, [`${this.definition.type}-meta.sql`]);
428
459
  }
460
+ /**
461
+ * Gets executed after deployment of metadata type
462
+ *
463
+ * @param {TYPE.MetadataTypeMap} upsertResults metadata mapped by their keyField as returned by update/create
464
+ */
465
+ static async postDeployTasks(upsertResults) {
466
+ if (Util.OPTIONS.execute) {
467
+ Util.logger.info(`Executing: ${this.definition.type}`);
468
+ await this.execute(Object.keys(upsertResults));
469
+ }
470
+ }
429
471
  }
430
472
 
431
473
  // Assign definition & cache to static attributes
@@ -82,7 +82,7 @@ class Script extends MetadataType {
82
82
  }
83
83
 
84
84
  /**
85
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
85
+ * helper for {@link Script.preDeployTasks} that loads extracted code content back into JSON
86
86
  *
87
87
  * @param {TYPE.ScriptItem} metadata a single asset definition
88
88
  * @param {string} deployDir directory of deploy files
@@ -189,7 +189,7 @@ class Script extends MetadataType {
189
189
  }
190
190
 
191
191
  /**
192
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
192
+ * helper for {@link Script.buildTemplateForNested} / {@link Script.buildDefinitionForNested}
193
193
  * handles extracted code if any are found for complex types
194
194
  *
195
195
  * @param {string} templateDir Directory where metadata templates are stored
@@ -279,7 +279,7 @@ class Script extends MetadataType {
279
279
  return { json: metadata, codeArr: codeArr, subFolder: null };
280
280
  }
281
281
  /**
282
- * helper for {@link parseMetadata} and {@link _buildForNested}
282
+ * helper for {@link Script.parseMetadata} and {@link Script._buildForNested}
283
283
  *
284
284
  * @param {string} metadataScript the code of the file
285
285
  * @param {string} metadataName the name of the metadata
@@ -66,7 +66,7 @@ class TransactionalSMS extends TransactionalMessage {
66
66
  return metadata;
67
67
  }
68
68
  /**
69
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
69
+ * helper for {@link TransactionalSMS.preDeployTasks} that loads extracted code content back into JSON
70
70
  *
71
71
  * @param {TYPE.MetadataTypeItem} metadata a single definition
72
72
  * @param {string} deployDir directory of deploy files
@@ -158,7 +158,7 @@ class TransactionalSMS extends TransactionalMessage {
158
158
  return { json: metadata, codeArr: codeArr, subFolder: null };
159
159
  }
160
160
  /**
161
- * helper for {@link parseMetadata} and {@link _buildForNested}
161
+ * helper for {@link TransactionalSMS.postRetrieveTasks} and {@link TransactionalSMS._buildForNested}
162
162
  *
163
163
  * @param {string} metadataScript the code of the file
164
164
  * @returns {{fileExt:string,code:string}} returns found extension and file content
@@ -189,7 +189,7 @@ class TransactionalSMS extends TransactionalMessage {
189
189
  return { fileExt, code };
190
190
  }
191
191
  /**
192
- * helper for {@link MetadataType.buildDefinition}
192
+ * helper for {@link TransactionalMessage.buildDefinition}
193
193
  * handles extracted code if any are found for complex types
194
194
  *
195
195
  * @param {string} templateDir Directory where metadata templates are stored
@@ -216,7 +216,7 @@ class TransactionalSMS extends TransactionalMessage {
216
216
  );
217
217
  }
218
218
  /**
219
- * helper for {@link MetadataType.buildTemplate}
219
+ * helper for {@link TransactionalMessage.buildTemplate}
220
220
  * handles extracted code if any are found for complex types
221
221
  *
222
222
  * @example scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating
@@ -245,7 +245,7 @@ class TransactionalSMS extends TransactionalMessage {
245
245
  }
246
246
 
247
247
  /**
248
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
248
+ * helper for {@link TransactionalSMS.buildTemplateForNested} / {@link TransactionalSMS.buildDefinitionForNested}
249
249
  * handles extracted code if any are found for complex types
250
250
  *
251
251
  * @param {string} templateDir Directory where metadata templates are stored
@@ -85,51 +85,19 @@ class TriggeredSend extends MetadataType {
85
85
  return super.deleteByKeySOAP(customerKey);
86
86
  }
87
87
 
88
- /**
89
- * manages post retrieve steps
90
- *
91
- * @param {TYPE.MetadataTypeItem} metadata a single query
92
- * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
93
- */
94
- static postRetrieveTasks(metadata) {
95
- return this.parseMetadata(metadata);
96
- }
97
- /**
98
- * generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
99
- *
100
- * @param {TYPE.MetadataTypeItem} metadata a single script activity definition
101
- */
102
- static setFolderPath(metadata) {
103
- try {
104
- metadata.r__folder_Path = cache.searchForField(
105
- 'folder',
106
- metadata[this.definition.folderIdField],
107
- 'ID',
108
- 'Path'
109
- );
110
- delete metadata[this.definition.folderIdField];
111
- } catch (ex) {
112
- Util.logger.verbose(
113
- ` - skipping ${this.definition.type} '${metadata[this.definition.nameField]}' (${
114
- metadata[this.definition.keyField]
115
- }): Could not find folder (${ex.message})`
116
- );
117
- throw ex;
118
- }
119
- }
120
88
  /**
121
89
  * parses retrieved Metadata before saving
122
90
  *
123
- * @param {TYPE.MetadataTypeItem} metadata a single query activity definition
91
+ * @param {TYPE.MetadataTypeItem} metadata a single item
124
92
  * @returns {TYPE.MetadataTypeItem | void} Array with one metadata object and one sql string
125
93
  */
126
- static parseMetadata(metadata) {
94
+ static postRetrieveTasks(metadata) {
127
95
  // remove IsPlatformObject, always has to be 'false'
128
96
  delete metadata.IsPlatformObject;
97
+
129
98
  // folder
130
- try {
131
- this.setFolderPath(metadata);
132
- } catch {
99
+ this.setFolderPath(metadata);
100
+ if (!metadata.r__folder_Path) {
133
101
  Util.logger.verbose(
134
102
  ` ☇ skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find folder.`
135
103
  );
@@ -163,7 +131,7 @@ class TriggeredSend extends MetadataType {
163
131
  delete metadata.Email;
164
132
  } catch {
165
133
  Util.logger.verbose(
166
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder. This TSD cannot be replublished but potentially restarted with its cached version of the email.`
134
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder. This TSD cannot be republished but potentially restarted with its cached version of the email.`
167
135
  );
168
136
  // save this TSD because it could be fixed by the user or potentially restarted without a fix; also, it might be used by a journey
169
137
  }
@@ -246,7 +214,7 @@ class TriggeredSend extends MetadataType {
246
214
  * TSD-specific refresh method that finds active TSDs and refreshes them
247
215
  *
248
216
  * @param {string[]} [keyArr] metadata keys
249
- * @param {boolean} [checkKey=true] whether to check if the key is valid
217
+ * @param {boolean} [checkKey] whether to check if the key is valid
250
218
  * @returns {Promise.<void>} -
251
219
  */
252
220
  static async refresh(keyArr, checkKey = true) {
@@ -268,7 +236,7 @@ class TriggeredSend extends MetadataType {
268
236
  }
269
237
 
270
238
  /**
271
- * helper for {@link refresh} that extracts the keys from the TSD item map and eli
239
+ * helper for {@link TriggeredSend.refresh} that extracts the keys from the TSD item map and eli
272
240
  *
273
241
  * @param {TYPE.MetadataTypeMapObj} metadata TSD item map
274
242
  * @returns {Promise.<string[]>} keyArr
@@ -282,11 +250,12 @@ class TriggeredSend extends MetadataType {
282
250
  return keyArr;
283
251
  }
284
252
  /**
285
- * helper for {@link refresh} that finds active TSDs on the server and filters it by the same rules that {@link retrieve} is using to avoid refreshing TSDs with broken dependencies
253
+ * helper for {@link TriggeredSend.refresh} that finds active TSDs on the server and filters it by the same rules that {@link TriggeredSend.retrieve} is using to avoid refreshing TSDs with broken dependencies
286
254
  *
255
+ * @param {boolean} [assetLoaded] if run after Asset.deploy via --refresh option this will skip caching assets
287
256
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of TSD item map
288
257
  */
289
- static async findRefreshableItems() {
258
+ static async findRefreshableItems(assetLoaded = false) {
290
259
  Util.logger.info('Finding refreshable items...');
291
260
  // cache dependencies to test for broken links
292
261
  // skip deprecated classic emails here, assuming they cannot be updated and hence are not relevant for {@link refresh}
@@ -305,14 +274,20 @@ class TriggeredSend extends MetadataType {
305
274
  list: null,
306
275
  };
307
276
  for (const [type, subTypeArr] of Object.entries(requiredCache)) {
308
- if (!cache.getCache()?.[type]) {
309
- Util.logger.info(` - Caching dependent Metadata: ${type}`);
310
- Util.logSubtypes(subTypeArr);
311
- cacheTypes[type].client = this.client;
312
- cacheTypes[type].buObject = this.buObject;
313
- cacheTypes[type].properties = this.properties;
277
+ if (type === 'asset' && assetLoaded) {
278
+ continue;
279
+ }
280
+ Util.logger.info(` - Caching dependent Metadata: ${type}`);
281
+ Util.logSubtypes(subTypeArr);
282
+ cacheTypes[type].client = this.client;
283
+ cacheTypes[type].buObject = this.buObject;
284
+ cacheTypes[type].properties = this.properties;
314
285
 
315
- const result = await cacheTypes[type].retrieveForCache(null, subTypeArr);
286
+ const result = await cacheTypes[type].retrieveForCache(null, subTypeArr);
287
+ if (cache.getCache()?.[type]) {
288
+ // re-run caching to merge with existing cache, assuming we might have missed subtypes
289
+ cache.mergeMetadata(type, result.metadata);
290
+ } else {
316
291
  cache.setMetadata(type, result.metadata);
317
292
  }
318
293
  }
@@ -329,7 +304,7 @@ class TriggeredSend extends MetadataType {
329
304
  }
330
305
 
331
306
  /**
332
- * helper for {@link refresh} that pauses, publishes and starts a triggered send
307
+ * helper for {@link TriggeredSend.refresh} that pauses, publishes and starts a triggered send
333
308
  *
334
309
  * @param {string} key external key of triggered send item
335
310
  * @param {boolean} checkKey whether to check if key exists on the server
@@ -404,8 +404,11 @@ class User extends MetadataType {
404
404
  if (!metadata.Password) {
405
405
  metadata.Password = this._generatePassword();
406
406
  Util.logger.info(
407
- ` - Password for ${metadata.UserID} was not given. Generated password: ${metadata.Password}`
407
+ ` - Password for ${metadata.UserID} was not given. Generated password:`
408
408
  );
409
+ // use console.log here to print the generated password to bypass the logfile
410
+ // eslint-disable-next-line no-console
411
+ console.log(metadata.Password);
409
412
  }
410
413
  }
411
414
 
@@ -510,7 +513,7 @@ class User extends MetadataType {
510
513
  * @param {string} roleName role.Name
511
514
  * @param {number} userId user.AccountUserID
512
515
  * @param {boolean} assignmentOnly if true, only assignment configuration will be returned
513
- * @param {boolean} [isRoleRemovale=false] if true, role will be removed from user; otherwise added
516
+ * @param {boolean} [isRoleRemovale] if true, role will be removed from user; otherwise added
514
517
  * @returns {object} format needed by API
515
518
  */
516
519
  static _getRoleObjectForDeploy(
@@ -737,7 +740,7 @@ class User extends MetadataType {
737
740
  }
738
741
 
739
742
  /**
740
- * helper for {@link retrieveSOAP}
743
+ * helper for {@link User.retrieveSOAP}
741
744
  *
742
745
  * @private
743
746
  * @param {TYPE.SoapRequestParams} [requestParams] required for the specific request (filter for example)
@@ -897,7 +900,7 @@ class User extends MetadataType {
897
900
  }
898
901
  }
899
902
  /**
900
- * helper for {@link createOrUpdate} to generate a random initial password for new users
903
+ * helper for {@link User.createOrUpdate} to generate a random initial password for new users
901
904
  * note: possible minimum length values in SFMC are 6, 8, 10, 15 chars. Therefore we should default here to 15 chars.
902
905
  *
903
906
  * @private
@@ -13,6 +13,7 @@ module.exports = {
13
13
  lastmodDateField: 'modifiedDate',
14
14
  lastmodNameField: 'modifiedBy.name',
15
15
  restPagination: true,
16
+ maxKeyLength: 36, // confirmed max length
16
17
  type: 'asset',
17
18
  typeDescription: 'Assets from Content Builder grouped into subtypes.',
18
19
  typeRetrieveByDefault: ['asset', 'code', 'textfile', 'block', 'message', 'template', 'other'],