mcdev 4.3.3 → 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 (231) 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/.fork/.prettierrc +6 -0
  5. package/.fork/custom-commands.json +13 -1
  6. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  7. package/.github/workflows/code-test.yml +36 -0
  8. package/.github/workflows/coverage-base-update.yml +57 -0
  9. package/.github/workflows/coverage-develop-branch.yml +41 -0
  10. package/.github/workflows/coverage-main-branch.yml +41 -0
  11. package/.github/workflows/coverage.yml +77 -0
  12. package/.husky/post-checkout +1 -1
  13. package/.prettierrc +1 -1
  14. package/.vscode/extensions.json +0 -4
  15. package/boilerplate/config.json +1 -1
  16. package/boilerplate/files/.prettierrc +1 -1
  17. package/boilerplate/files/.vscode/extensions.json +1 -1
  18. package/boilerplate/files/.vscode/settings.json +1 -0
  19. package/boilerplate/forcedUpdates.json +8 -0
  20. package/docs/dist/documentation.md +1261 -433
  21. package/lib/Builder.js +6 -1
  22. package/lib/Deployer.js +34 -10
  23. package/lib/MetadataTypeDefinitions.js +8 -6
  24. package/lib/MetadataTypeInfo.js +8 -6
  25. package/lib/Retriever.js +4 -1
  26. package/lib/cli.js +54 -42
  27. package/lib/index.js +82 -8
  28. package/lib/metadataTypes/Asset.js +185 -31
  29. package/lib/metadataTypes/AttributeGroup.js +0 -1
  30. package/lib/metadataTypes/Automation.js +48 -5
  31. package/lib/metadataTypes/Campaign.js +20 -7
  32. package/lib/metadataTypes/ContentArea.js +1 -1
  33. package/lib/metadataTypes/DataExtension.js +221 -184
  34. package/lib/metadataTypes/DataExtensionField.js +12 -19
  35. package/lib/metadataTypes/DataExtensionTemplate.js +1 -1
  36. package/lib/metadataTypes/DataExtract.js +1 -1
  37. package/lib/metadataTypes/DataExtractType.js +1 -1
  38. package/lib/metadataTypes/Email.js +1 -1
  39. package/lib/metadataTypes/{EmailSendDefinition.js → EmailSend.js} +5 -5
  40. package/lib/metadataTypes/{EventDefinition.js → Event.js} +17 -35
  41. package/lib/metadataTypes/{FtpLocation.js → FileLocation.js} +2 -2
  42. package/lib/metadataTypes/FileTransfer.js +8 -7
  43. package/lib/metadataTypes/Filter.js +1 -1
  44. package/lib/metadataTypes/Folder.js +8 -3
  45. package/lib/metadataTypes/ImportFile.js +6 -6
  46. package/lib/metadataTypes/{Interaction.js → Journey.js} +311 -147
  47. package/lib/metadataTypes/List.js +2 -2
  48. package/lib/metadataTypes/MetadataType.js +318 -90
  49. package/lib/metadataTypes/MobileCode.js +0 -1
  50. package/lib/metadataTypes/MobileKeyword.js +336 -40
  51. package/lib/metadataTypes/MobileMessage.js +473 -0
  52. package/lib/metadataTypes/Query.js +114 -32
  53. package/lib/metadataTypes/Role.js +60 -21
  54. package/lib/metadataTypes/Script.js +5 -7
  55. package/lib/metadataTypes/SendClassification.js +40 -0
  56. package/lib/metadataTypes/SetDefinition.js +1 -7
  57. package/lib/metadataTypes/TransactionalEmail.js +2 -3
  58. package/lib/metadataTypes/TransactionalMessage.js +1 -2
  59. package/lib/metadataTypes/TransactionalSMS.js +8 -15
  60. package/lib/metadataTypes/{TriggeredSendDefinition.js → TriggeredSend.js} +35 -27
  61. package/lib/metadataTypes/User.js +1177 -0
  62. package/lib/metadataTypes/definitions/Asset.definition.js +2 -4
  63. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
  64. package/lib/metadataTypes/definitions/Automation.definition.js +3 -2
  65. package/lib/metadataTypes/definitions/Campaign.definition.js +79 -4
  66. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
  67. package/lib/metadataTypes/definitions/DataExtension.definition.js +2 -1
  68. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
  69. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
  70. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
  71. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
  72. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
  73. package/lib/metadataTypes/definitions/Email.definition.js +1 -0
  74. package/lib/metadataTypes/definitions/{EmailSendDefinition.definition.js → EmailSend.definition.js} +4 -2
  75. package/lib/metadataTypes/definitions/{EventDefinition.definition.js → Event.definition.js} +2 -1
  76. package/lib/metadataTypes/definitions/{FtpLocation.definition.js → FileLocation.definition.js} +4 -3
  77. package/lib/metadataTypes/definitions/FileTransfer.definition.js +3 -2
  78. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  79. package/lib/metadataTypes/definitions/Folder.definition.js +2 -0
  80. package/lib/metadataTypes/definitions/ImportFile.definition.js +4 -3
  81. package/lib/metadataTypes/definitions/{Interaction.definition.js → Journey.definition.js} +11 -2
  82. package/lib/metadataTypes/definitions/List.definition.js +1 -0
  83. package/lib/metadataTypes/definitions/MobileCode.definition.js +3 -1
  84. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +27 -17
  85. package/lib/metadataTypes/definitions/MobileMessage.definition.js +743 -0
  86. package/lib/metadataTypes/definitions/Query.definition.js +3 -2
  87. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  88. package/lib/metadataTypes/definitions/Script.definition.js +1 -0
  89. package/lib/metadataTypes/definitions/SendClassification.definition.js +114 -0
  90. package/lib/metadataTypes/definitions/SetDefinition.definition.js +1 -0
  91. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -1
  92. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +1 -0
  93. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +1 -0
  94. package/lib/metadataTypes/definitions/{TriggeredSendDefinition.definition.js → TriggeredSend.definition.js} +5 -3
  95. package/lib/metadataTypes/definitions/User.definition.js +365 -0
  96. package/lib/retrieveChangelog.js +1 -2
  97. package/lib/util/auth.js +29 -9
  98. package/lib/util/businessUnit.js +3 -3
  99. package/lib/util/cli.js +55 -7
  100. package/lib/util/devops.js +93 -8
  101. package/lib/util/file.js +55 -13
  102. package/lib/util/init.config.js +1 -2
  103. package/lib/util/init.npm.js +3 -3
  104. package/lib/util/util.js +68 -14
  105. package/package.json +16 -15
  106. package/test/general.test.js +62 -0
  107. package/test/mockRoot/.mcdevrc.json +7 -5
  108. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testBlocked_user.user-meta.json +23 -0
  109. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testExisting_user.user-meta.json +31 -0
  110. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testNew_user.user-meta.json +27 -0
  111. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{childBU_dataextension_test.dataExtension-meta.json → testExisting_dataExtension.dataExtension-meta.json} +2 -2
  112. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{testDataExtension.dataExtension-meta.json → testNew_dataExtension.dataExtension-meta.json} +2 -2
  113. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_interaction.interaction-meta.json +576 -0
  114. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp +2 -0
  115. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +10 -0
  116. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp +2 -0
  117. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +10 -0
  118. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.amp +1 -0
  119. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json +61 -0
  120. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.amp +1 -0
  121. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.json +60 -0
  122. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +1 -1
  123. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json +1 -1
  124. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql +1 -1
  125. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +1 -1
  126. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -1
  127. package/test/resourceFactory.js +13 -0
  128. package/test/resources/1111111/accountUser/configure-response.xml +70 -0
  129. package/test/resources/1111111/accountUser/create-response.xml +97 -0
  130. package/test/resources/1111111/accountUser/retrieve-response.xml +156 -0
  131. package/test/resources/1111111/accountUser/update-response.xml +111 -0
  132. package/test/resources/1111111/accountUserAccount/retrieve-response.xml +77 -0
  133. package/test/resources/1111111/platform/v1/setup/quickflow/data/get-response.json +455 -0
  134. package/test/resources/1111111/role/retrieve-response.xml +76 -0
  135. package/test/resources/1111111/user/build-expected.json +16 -0
  136. package/test/resources/1111111/user/create-expected.json +21 -0
  137. package/test/resources/1111111/user/retrieve-expected.json +24 -0
  138. package/test/resources/1111111/user/template-expected.json +16 -0
  139. package/test/resources/1111111/user/update-expected.json +21 -0
  140. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/delete-response.json +1 -0
  141. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +17 -0
  142. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +3 -3
  143. package/test/resources/9999999/automation/v1/queries/get-response.json +21 -4
  144. package/test/resources/9999999/automation/v1/queries/post-response.json +4 -4
  145. package/test/resources/9999999/data/v1/customobjectdata/key/{childBU_dataextension_test → testExisting_dataExtension}/rowset/get-response.json +1 -1
  146. package/test/resources/9999999/dataExtension/build-expected.json +3 -3
  147. package/test/resources/9999999/dataExtension/create-expected.json +2 -2
  148. package/test/resources/9999999/dataExtension/create-response.xml +8 -3
  149. package/test/resources/9999999/dataExtension/retrieve-expected.json +3 -3
  150. package/test/resources/9999999/dataExtension/retrieve-response.xml +9 -4
  151. package/test/resources/9999999/dataExtension/template-expected.json +3 -3
  152. package/test/resources/9999999/dataExtension/update-expected.json +3 -3
  153. package/test/resources/9999999/dataExtension/update-response.xml +9 -4
  154. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +14 -9
  155. package/test/resources/9999999/interaction/v1/interactions/get-response.json +312 -0
  156. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +312 -0
  157. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/put-response.json +592 -0
  158. package/test/resources/9999999/journey/build-expected.json +572 -0
  159. package/test/resources/9999999/journey/get-expected.json +576 -0
  160. package/test/resources/9999999/journey/put-expected.json +576 -0
  161. package/test/resources/9999999/journey/template-expected.json +572 -0
  162. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json +42 -0
  163. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow/delete-response.json +0 -0
  164. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json +1 -0
  165. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/post-response.json +3 -0
  166. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/delete-response.json +0 -0
  167. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json +106 -0
  168. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/post-response.json +0 -0
  169. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTQ3Ojc4OjA/get-response.json +127 -0
  170. package/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json +129 -0
  171. package/test/resources/9999999/legacy/v1/beta/mobile/message/post-response.json +3 -0
  172. package/test/resources/9999999/legacy/v1/beta2/data/campaign/get-response.json +29 -0
  173. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  174. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json +1 -1
  175. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json +1 -1
  176. package/test/resources/9999999/mobileKeyword/build-expected.amp +2 -0
  177. package/test/resources/9999999/mobileKeyword/build-expected.json +9 -0
  178. package/test/resources/9999999/mobileKeyword/get-expected.amp +2 -0
  179. package/test/resources/9999999/mobileKeyword/get-expected.json +15 -0
  180. package/test/resources/9999999/mobileKeyword/post-create-expected.amp +2 -0
  181. package/test/resources/9999999/mobileKeyword/post-create-expected.json +17 -0
  182. package/test/resources/9999999/mobileKeyword/template-expected.amp +2 -0
  183. package/test/resources/9999999/mobileKeyword/template-expected.json +9 -0
  184. package/test/resources/9999999/mobileMessage/build-expected.amp +1 -0
  185. package/test/resources/9999999/mobileMessage/build-expected.json +60 -0
  186. package/test/resources/9999999/mobileMessage/get-expected.amp +1 -0
  187. package/test/resources/9999999/mobileMessage/get-expected.json +61 -0
  188. package/test/resources/9999999/mobileMessage/post-create-expected.amp +1 -0
  189. package/test/resources/9999999/mobileMessage/post-create-expected.json +63 -0
  190. package/test/resources/9999999/mobileMessage/post-update-expected.amp +1 -0
  191. package/test/resources/9999999/mobileMessage/post-update-expected.json +61 -0
  192. package/test/resources/9999999/mobileMessage/template-expected.amp +1 -0
  193. package/test/resources/9999999/mobileMessage/template-expected.json +60 -0
  194. package/test/resources/9999999/query/build-expected.json +1 -1
  195. package/test/resources/9999999/query/get-expected.json +1 -1
  196. package/test/resources/9999999/query/get2-expected.json +11 -0
  197. package/test/resources/9999999/query/patch-expected.json +1 -1
  198. package/test/resources/9999999/query/post-expected.json +1 -1
  199. package/test/resources/9999999/query/template-expected.json +1 -1
  200. package/test/resources/9999999/queryDefinition/retrieve-response.xml +30 -0
  201. package/test/resources/9999999/transactionalEmail/build-expected.json +5 -5
  202. package/test/resources/9999999/transactionalEmail/get-expected.json +1 -1
  203. package/test/resources/9999999/transactionalEmail/patch-expected.json +1 -1
  204. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  205. package/test/resources/9999999/transactionalEmail/template-expected.json +5 -5
  206. package/test/resources/9999999/transactionalPush/build-expected.json +2 -2
  207. package/test/resources/9999999/transactionalPush/template-expected.json +2 -2
  208. package/test/resources/9999999/transactionalSMS/build-expected.json +3 -3
  209. package/test/resources/9999999/transactionalSMS/template-expected.json +3 -3
  210. package/test/{dataExtension.test.js → type.dataExtension.test.js} +78 -21
  211. package/test/{interaction.test.js → type.journey.test.js} +64 -30
  212. package/test/type.mobileKeyword.test.js +250 -0
  213. package/test/type.mobileMessage.test.js +205 -0
  214. package/test/{query.test.js → type.query.test.js} +102 -5
  215. package/test/{transactionalEmail.test.js → type.transactionalEmail.test.js} +40 -2
  216. package/test/{transactionalPush.test.js → type.transactionalPush.test.js} +41 -2
  217. package/test/{transactionalSMS.test.js → type.transactionalSMS.test.js} +73 -3
  218. package/test/type.user.test.js +160 -0
  219. package/test/utils.js +17 -5
  220. package/types/mcdev.d.js +48 -15
  221. package/.github/workflows/code-analysis.yml +0 -57
  222. package/lib/metadataTypes/AccountUser.js +0 -426
  223. package/lib/metadataTypes/definitions/AccountUser.definition.js +0 -227
  224. package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +0 -266
  225. package/test/resources/9999999/interaction/build-expected.json +0 -260
  226. package/test/resources/9999999/interaction/get-expected.json +0 -264
  227. package/test/resources/9999999/interaction/put-expected.json +0 -264
  228. package/test/resources/9999999/interaction/template-expected.json +0 -260
  229. package/test/resources/9999999/interaction/v1/interactions/put-response.json +0 -280
  230. /package/test/mockRoot/deploy/testInstance/testBU/{interaction → journey}/testNew_interaction.interaction-meta.json +0 -0
  231. /package/test/resources/9999999/{interaction → journey}/post-expected.json +0 -0
@@ -8,7 +8,7 @@ const cache = require('../util/cache');
8
8
  const File = require('../util/file');
9
9
 
10
10
  /**
11
- * Interaction MetadataType
11
+ * Journey MetadataType
12
12
  * ! BETA RELEASE of journey support (v4.3.0); it so far only resolves a limited amount of dependencies and will likely break during cross-BU deployments!
13
13
  * id: A unique id of the journey assigned by the journey’s API during its creation
14
14
  * key: A unique id of the journey within the MID. Can be generated by the developer
@@ -16,9 +16,9 @@ const File = require('../util/file');
16
16
  *
17
17
  * @augments MetadataType
18
18
  */
19
- class Interaction extends MetadataType {
19
+ class Journey extends MetadataType {
20
20
  /**
21
- * Retrieves Metadata of Interaction
21
+ * Retrieves Metadata of Journey
22
22
  *
23
23
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
24
24
  * @param {void} [_] unused parameter
@@ -72,7 +72,6 @@ class Interaction extends MetadataType {
72
72
  retrieveDir,
73
73
  `${uri}${singleKey}?extras=${extras}`,
74
74
  null,
75
- null,
76
75
  key
77
76
  );
78
77
  } else {
@@ -97,11 +96,12 @@ class Interaction extends MetadataType {
97
96
  results.items.map(async (a) => {
98
97
  try {
99
98
  return await this.client.rest.get(
100
- `${uri}key:${a[this.definition.keyField]}?extras=${extras}`
99
+ `${uri}key:${a[this.definition.keyField]}?extras=${extras}` +
100
+ `&versionNumber=${a.version}`
101
101
  );
102
102
  } catch (ex) {
103
103
  // if we do get here, we should log the error and continue instead of failing to download all automations
104
- Util.logger.error(
104
+ Util.logger.warn(
105
105
  ` ☇ skipping ${this.definition.type} ${
106
106
  a[this.definition.nameField]
107
107
  } (${a[this.definition.keyField]}): ${ex.message} (${
@@ -139,7 +139,7 @@ class Interaction extends MetadataType {
139
139
  // if the interaction does not exist, the API returns an error code which would otherwise bring execution to a hold
140
140
  if (
141
141
  [
142
- 'Interaction matching key not found.',
142
+ 'Journey matching key not found.',
143
143
  'Must provide a valid ID or Key parameter',
144
144
  ].includes(ex.message)
145
145
  ) {
@@ -201,7 +201,7 @@ class Interaction extends MetadataType {
201
201
  );
202
202
  }
203
203
  Util.logger.warn(
204
- `Deleting Interactions via this command breaks following retrieve-by-key/id requests until you've deployed/created a new draft version! You can get still get the latest available version of your journey by retrieving all interactions on this BU.`
204
+ `Deleting Journeys via this command breaks following retrieve-by-key/id requests until you've deployed/created a new draft version! You can get still get the latest available version of your journey by retrieving all interactions on this BU.`
205
205
  );
206
206
  /* eslint-enable unicorn/prefer-ternary */
207
207
  return super.deleteByKeyREST(
@@ -216,11 +216,12 @@ class Interaction extends MetadataType {
216
216
  * @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
217
217
  * @param {string} deployDir directory where deploy metadata are saved
218
218
  * @param {string} retrieveDir directory where metadata after deploy should be saved
219
+ * @param {boolean} [isRefresh] optional flag - so far not used by interaction
219
220
  * @returns {Promise.<TYPE.MetadataTypeMap>} Promise of keyField => metadata map
220
221
  */
221
- static async deploy(metadata, deployDir, retrieveDir) {
222
+ static async deploy(metadata, deployDir, retrieveDir, isRefresh) {
222
223
  Util.logBeta(this.definition.type);
223
- return super.deploy(metadata, deployDir, retrieveDir);
224
+ return super.deploy(metadata, deployDir, retrieveDir, isRefresh);
224
225
  }
225
226
 
226
227
  /**
@@ -230,7 +231,11 @@ class Interaction extends MetadataType {
230
231
  * @returns {Promise} Promise
231
232
  */
232
233
  static update(metadata) {
233
- return super.updateREST(metadata, '/interaction/v1/interactions/', true);
234
+ return super.updateREST(
235
+ metadata,
236
+ '/interaction/v1/interactions/key:' + metadata.key,
237
+ 'put'
238
+ );
234
239
  }
235
240
 
236
241
  /**
@@ -260,7 +265,7 @@ class Interaction extends MetadataType {
260
265
  }
261
266
 
262
267
  /**
263
- * helper for Interaction's {@link saveResults}. Gets executed after retreive of metadata type and
268
+ * helper for Journey's {@link saveResults}. Gets executed after retreive of metadata type and
264
269
  *
265
270
  * @param {TYPE.MetadataTypeMap} metadataMap key=customer key, value=metadata
266
271
  */
@@ -287,8 +292,8 @@ class Interaction extends MetadataType {
287
292
  * manages post retrieve steps
288
293
  * ! BETA RELEASE of journey support (v4.3.0); it so far only resolves a limited amount of dependencies and will likely break during cross-BU deployments!
289
294
  *
290
- * @param {TYPE.MetadataTypeItem} metadata a single query
291
- * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
295
+ * @param {TYPE.MetadataTypeItem} metadata a single item
296
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object
292
297
  */
293
298
  static postRetrieveTasks(metadata) {
294
299
  // folder
@@ -298,7 +303,7 @@ class Interaction extends MetadataType {
298
303
  case 'Multistep': {
299
304
  // Multi-Step Journey
300
305
  // ~~~ TRIGGERS ~~~~
301
- // eventDefinition / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
306
+ // event / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
302
307
  if (
303
308
  metadata.triggers?.length > 0 &&
304
309
  metadata.triggers[0].metaData?.eventDefinitionKey
@@ -306,14 +311,14 @@ class Interaction extends MetadataType {
306
311
  // trigger found; there can only be one entry in this array
307
312
  try {
308
313
  const edId = cache.searchForField(
309
- 'eventDefinition',
314
+ 'event',
310
315
  metadata.triggers[0].metaData.eventDefinitionKey,
311
316
  'eventDefinitionKey',
312
317
  'id'
313
318
  );
314
319
  if (metadata.triggers[0].metaData.eventDefinitionId !== edId) {
315
320
  throw new Error(
316
- `eventDefinitionId not matching Id found on eventDefinition with key in eventDefinitionKey`
321
+ `eventDefinitionId not matching Id found on event with key in eventDefinitionKey`
317
322
  );
318
323
  }
319
324
  delete metadata.triggers[0].metaData.eventDefinitionId;
@@ -328,44 +333,7 @@ class Interaction extends MetadataType {
328
333
 
329
334
  // ~~~ ACTIVITIES ~~~~
330
335
 
331
- // triggeredSend + email+asset / activities[].type === 'EMAILV2'
332
- // TODO email / asset
333
- for (const item of metadata.activities) {
334
- // check if all triggeredSends are there
335
- try {
336
- if (item.configurationArguments?.triggeredSendKey) {
337
- // triggeredSendKey is not always set but triggeredSendId is
338
- cache.searchForField(
339
- 'triggeredSendDefinition',
340
- item.configurationArguments.triggeredSendKey,
341
- 'CustomerKey',
342
- 'CustomerKey'
343
- );
344
- delete item.configurationArguments.triggeredSendId;
345
- } else if (item.configurationArguments?.triggeredSendId) {
346
- // triggeredSendKey is not always set but triggeredSendId is
347
- item.configurationArguments.triggeredSendKey = cache.searchForField(
348
- 'triggeredSendDefinition',
349
- item.configurationArguments.triggeredSendId,
350
- 'ObjectID',
351
- 'CustomerKey'
352
- );
353
- delete item.configurationArguments.triggeredSendId;
354
- }
355
- } catch (ex) {
356
- Util.logger.warn(
357
- ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
358
- metadata[this.definition.keyField]
359
- }): Could not find triggeredSendDefinition (${ex.message})`
360
- );
361
- }
362
- }
363
-
364
- // TODO: Filters / activities[].type === 'MULTICRITERIADECISION'
365
- // - activities[].arguments.filterResult
366
- // - activities[].arguments.configurationArguments.criteria
367
-
368
- // TODO: wait activity / activities[].type === 'WAIT'
336
+ this._postRetrieveTasks_activities(metadata);
369
337
 
370
338
  // TODO: journey template id? / metaData.templateId
371
339
  break;
@@ -378,7 +346,7 @@ class Interaction extends MetadataType {
378
346
  }): definitionType Quicksend is not fully supported yet.`
379
347
  );
380
348
  // ~~~ TRIGGERS ~~~~
381
- // eventDefinition && triggers[].type === 'ContactAudience'
349
+ // event && triggers[].type === 'ContactAudience'
382
350
  if (
383
351
  metadata.triggers?.length > 0 &&
384
352
  metadata.triggers[0].metaData?.eventDefinitionKey
@@ -386,7 +354,7 @@ class Interaction extends MetadataType {
386
354
  // trigger found; there can only be one entry in this array
387
355
  try {
388
356
  const edId = cache.searchForField(
389
- 'eventDefinition',
357
+ 'event',
390
358
  metadata.triggers[0].metaData.eventDefinitionKey,
391
359
  'eventDefinitionKey',
392
360
  'id'
@@ -397,7 +365,7 @@ class Interaction extends MetadataType {
397
365
  metadata[this.definition.nameField]
398
366
  } (${
399
367
  metadata[this.definition.keyField]
400
- }): eventDefinitionId not matching Id found on eventDefinition with key in eventDefinitionKey`
368
+ }): eventDefinitionId not matching Id found on event with key in eventDefinitionKey`
401
369
  );
402
370
  }
403
371
  delete metadata.triggers[0].metaData.eventDefinitionId;
@@ -440,18 +408,16 @@ class Interaction extends MetadataType {
440
408
  metadata.activities?.length > 0 &&
441
409
  metadata.activities[0].configurationArguments?.triggeredSendKey
442
410
  ) {
411
+ const activity = metadata.activities[0];
443
412
  // trigger found; there can only be one entry in this array
444
413
  try {
445
414
  const tEmailId = cache.searchForField(
446
415
  'transactionalEmail',
447
- metadata.activities[0].configurationArguments?.triggeredSendKey,
416
+ activity.configurationArguments?.triggeredSendKey,
448
417
  'definitionKey',
449
418
  'definitionId'
450
419
  );
451
- if (
452
- tEmailId !=
453
- metadata.activities[0].configurationArguments?.triggeredSendId
454
- ) {
420
+ if (tEmailId != activity.configurationArguments?.triggeredSendId) {
455
421
  throw new Error(
456
422
  ` - ${this.definition.type} ${
457
423
  metadata[this.definition.nameField]
@@ -461,12 +427,9 @@ class Interaction extends MetadataType {
461
427
  );
462
428
  }
463
429
  if (
464
- metadata.activities[0].metaData?.highThroughput
465
- ?.definitionKey &&
466
- metadata.activities[0].metaData?.highThroughput
467
- ?.definitionKey !=
468
- metadata.activities[0].configurationArguments
469
- ?.triggeredSendKey
430
+ activity.metaData?.highThroughput?.definitionKey &&
431
+ activity.metaData?.highThroughput?.definitionKey !=
432
+ activity.configurationArguments?.triggeredSendKey
470
433
  ) {
471
434
  throw new Error(
472
435
  ` - ${this.definition.type} ${
@@ -514,6 +477,165 @@ class Interaction extends MetadataType {
514
477
 
515
478
  return metadata;
516
479
  }
480
+ /**
481
+ * helper for {@link postRetrieveTasks}
482
+ *
483
+ * @private
484
+ * @param {TYPE.MetadataTypeItem} metadata a single item
485
+ */
486
+ static _postRetrieveTasks_activities(metadata) {
487
+ for (const activity of metadata.activities) {
488
+ switch (activity.type) {
489
+ case 'EMAILV2': {
490
+ // triggeredSend + email+asset
491
+ // TODO email / asset
492
+ try {
493
+ if (activity.configurationArguments?.triggeredSendKey) {
494
+ // triggeredSendKey is not always set but triggeredSendId is
495
+ cache.searchForField(
496
+ 'triggeredSend',
497
+ activity.configurationArguments.triggeredSendKey,
498
+ 'CustomerKey',
499
+ 'CustomerKey'
500
+ );
501
+ delete activity.configurationArguments.triggeredSendId;
502
+ } else if (activity.configurationArguments?.triggeredSendId) {
503
+ // triggeredSendKey is not always set but triggeredSendId is
504
+ activity.configurationArguments.triggeredSendKey = cache.searchForField(
505
+ 'triggeredSend',
506
+ activity.configurationArguments.triggeredSendId,
507
+ 'ObjectID',
508
+ 'CustomerKey'
509
+ );
510
+ delete activity.configurationArguments.triggeredSendId;
511
+ }
512
+ } catch (ex) {
513
+ Util.logger.warn(
514
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
515
+ metadata[this.definition.keyField]
516
+ }) activity-key=${activity.key}: ${ex.message}`
517
+ );
518
+ }
519
+
520
+ break;
521
+ }
522
+ case 'SMSSYNC': {
523
+ // mobileMessage
524
+ try {
525
+ if (activity.configurationArguments?.messageId) {
526
+ activity.configurationArguments.c__mobileMessage_id =
527
+ cache.searchForField(
528
+ 'mobileMessage',
529
+ activity.configurationArguments.messageId,
530
+ 'id',
531
+ 'id'
532
+ );
533
+ delete activity.configurationArguments.messageId;
534
+ }
535
+ } catch (ex) {
536
+ Util.logger.warn(
537
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
538
+ metadata[this.definition.keyField]
539
+ }) activity-key=${activity.key}: ${ex.message}`
540
+ );
541
+ }
542
+ try {
543
+ // mobileKeyword
544
+ if (activity.configurationArguments?.keywordId) {
545
+ activity.configurationArguments.c__mobileKeyword = cache.searchForField(
546
+ 'mobileKeyword',
547
+ activity.configurationArguments.keywordId,
548
+ 'id',
549
+ 'keyword'
550
+ );
551
+ delete activity.configurationArguments.keywordId;
552
+ }
553
+ } catch (ex) {
554
+ Util.logger.warn(
555
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
556
+ metadata[this.definition.keyField]
557
+ }) activity-key=${activity.key}: ${ex.message}`
558
+ );
559
+ }
560
+ try {
561
+ if (activity.configurationArguments?.nextKeywordId) {
562
+ activity.configurationArguments.c__next_mobileKeyword =
563
+ cache.searchForField(
564
+ 'mobileKeyword',
565
+ activity.configurationArguments.nextKeywordId,
566
+ 'id',
567
+ 'keyword'
568
+ );
569
+ delete activity.configurationArguments.nextKeywordId;
570
+ }
571
+ } catch (ex) {
572
+ Util.logger.warn(
573
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
574
+ metadata[this.definition.keyField]
575
+ }) activity-key=${activity.key}: ${ex.message}`
576
+ );
577
+ }
578
+ try {
579
+ // mobileCode
580
+ if (activity.configurationArguments?.codeId) {
581
+ activity.configurationArguments.c__mobileCode = cache.searchForField(
582
+ 'mobileCode',
583
+ activity.configurationArguments.codeId,
584
+ 'id',
585
+ 'code'
586
+ );
587
+ delete activity.configurationArguments.codeId;
588
+ }
589
+ } catch (ex) {
590
+ Util.logger.warn(
591
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
592
+ metadata[this.definition.keyField]
593
+ }) activity-key=${activity.key}: ${ex.message}`
594
+ );
595
+ }
596
+
597
+ try {
598
+ // asset-asset: jsonmessage
599
+ if (activity.configurationArguments?.assetId) {
600
+ activity.configurationArguments.r__assetMessage_Name_readOnly =
601
+ cache.searchForField(
602
+ 'asset',
603
+ activity.configurationArguments.assetId,
604
+ 'id',
605
+ 'name'
606
+ );
607
+
608
+ activity.configurationArguments.r__assetMessage_Key =
609
+ cache.searchForField(
610
+ 'asset',
611
+ activity.configurationArguments.assetId,
612
+ 'id',
613
+ 'customerKey'
614
+ );
615
+ delete activity.configurationArguments.assetId;
616
+ }
617
+ } catch (ex) {
618
+ Util.logger.warn(
619
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
620
+ metadata[this.definition.keyField]
621
+ }) activity-key=${activity.key}: ${ex.message}`
622
+ );
623
+ }
624
+
625
+ // applicationExtensionId always equal "00000000-0000-0000-0000-000000000000"
626
+ delete activity.configurationArguments.applicationExtensionId;
627
+
628
+ break;
629
+ }
630
+ }
631
+ // TODO: Filters / activities[].type === 'MULTICRITERIADECISION'
632
+ // - activities[].arguments.filterResult
633
+ // - activities[].arguments.configurationArguments.criteria
634
+
635
+ // TODO: wait activity / activities[].type === 'WAIT'
636
+ }
637
+ }
638
+
517
639
  /**
518
640
  * prepares a TSD for deployment
519
641
  * ! BETA RELEASE of journey support (v4.3.0); it so far only resolves a limited amount of dependencies and will likely break during cross-BU deployments!
@@ -534,14 +656,14 @@ class Interaction extends MetadataType {
534
656
  // Multi-Step Journey
535
657
  // ~~~ TRIGGERS ~~~~
536
658
 
537
- // eventDefinition / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
659
+ // event / definitionType==='Multistep' && channel==='' && triggers[].type === 'EmailAudience'|'APIEvent'
538
660
  if (
539
661
  metadata.triggers?.length > 0 &&
540
662
  metadata.triggers[0].metaData?.eventDefinitionKey
541
663
  ) {
542
664
  // trigger found; there can only be one entry in this array
543
665
  metadata.triggers[0].metaData.eventDefinitionId = cache.searchForField(
544
- 'eventDefinition',
666
+ 'event',
545
667
  metadata.triggers[0].metaData.eventDefinitionKey,
546
668
  'eventDefinitionKey',
547
669
  'id'
@@ -552,21 +674,7 @@ class Interaction extends MetadataType {
552
674
 
553
675
  // ~~~ ACTIVITIES ~~~~
554
676
 
555
- // triggeredSend + email+asset / activities[].type === 'EMAILV2'
556
- // TODO email / asset
557
- for (const item of metadata.activities) {
558
- // check if all triggeredSends are there
559
- if (!item.configurationArguments?.triggeredSendKey) {
560
- continue;
561
- }
562
- // triggeredSendKey is not always set but triggeredSendId is
563
- item.configurationArguments.triggeredSendId = cache.searchForField(
564
- 'triggeredSendDefinition',
565
- item.configurationArguments.triggeredSendKey,
566
- 'CustomerKey',
567
- 'ObjectID'
568
- );
569
- }
677
+ this._preDeployTasks_activities(metadata);
570
678
 
571
679
  // TODO: Filters / activities[].type === 'MULTICRITERIADECISION'
572
680
  // - activities[].arguments.filterResult
@@ -585,7 +693,7 @@ class Interaction extends MetadataType {
585
693
  }): definitionType Quicksend is not supported yet and might fail to deploy.`
586
694
  );
587
695
  // ~~~ TRIGGERS ~~~~
588
- // eventDefinition && triggers[].type === 'ContactAudience'
696
+ // event && triggers[].type === 'ContactAudience'
589
697
  if (
590
698
  metadata.triggers?.length > 0 &&
591
699
  metadata.triggers[0].metaData?.eventDefinitionKey
@@ -593,7 +701,7 @@ class Interaction extends MetadataType {
593
701
  // trigger found; there can only be one entry in this array
594
702
  try {
595
703
  metadata.triggers[0].metaData.eventDefinitionId = cache.searchForField(
596
- 'eventDefinition',
704
+ 'event',
597
705
  metadata.triggers[0].metaData?.eventDefinitionKey,
598
706
  'eventDefinitionKey',
599
707
  'id'
@@ -691,80 +799,136 @@ class Interaction extends MetadataType {
691
799
  }
692
800
 
693
801
  /**
802
+ * helper for {@link preDeployTasks}
803
+ *
804
+ * @private
805
+ * @param {TYPE.MetadataTypeItem} metadata a single item
806
+ */
807
+ static _preDeployTasks_activities(metadata) {
808
+ for (const activity of metadata.activities) {
809
+ switch (activity.type) {
810
+ case 'EMAILV2': {
811
+ // triggeredSend + email+asset
812
+ // TODO email / asset
813
+ if (activity.configurationArguments?.triggeredSendKey) {
814
+ // triggeredSendKey is not always set but triggeredSendId is
815
+ activity.configurationArguments.triggeredSendId = cache.searchForField(
816
+ 'triggeredSend',
817
+ activity.configurationArguments.triggeredSendKey,
818
+ 'CustomerKey',
819
+ 'ObjectID'
820
+ );
821
+ }
822
+ break;
823
+ }
824
+ case 'SMSSYNC': {
825
+ // mobileMessage
826
+ if (activity.configurationArguments?.c__mobileMessage_id) {
827
+ activity.configurationArguments.messageId = cache.searchForField(
828
+ 'mobileMessage',
829
+ activity.configurationArguments.c__mobileMessage_id,
830
+ 'id',
831
+ 'id'
832
+ );
833
+ delete activity.configurationArguments.c__mobileMessage_id;
834
+ }
835
+ // mobileKeyword
836
+ if (activity.configurationArguments?.c__mobileKeyword) {
837
+ activity.configurationArguments.keywordId = cache.searchForField(
838
+ 'mobileKeyword',
839
+ activity.c__mobileKeyword,
840
+ 'keyword',
841
+ 'id'
842
+ );
843
+ delete activity.configurationArguments.c__mobileKeyword;
844
+ }
845
+ if (activity.configurationArguments?.c__next_mobileKeyword) {
846
+ activity.configurationArguments.nextKeywordId = cache.searchForField(
847
+ 'mobileKeyword',
848
+ activity.configurationArguments.c__next_mobileKeyword,
849
+ 'keyword',
850
+ 'id'
851
+ );
852
+ delete activity.configurationArguments.c__next_mobileKeyword;
853
+ }
854
+ // mobileCode
855
+ if (activity.configurationArguments?.c__mobileCode) {
856
+ activity.configurationArguments.codeId = cache.searchForField(
857
+ 'mobileCode',
858
+ activity.configurationArguments.c__mobileCode,
859
+ 'code',
860
+ 'id'
861
+ );
862
+ delete activity.configurationArguments.c__mobileCode;
863
+ }
864
+ // asset-asset: jsonmessage
865
+ if (activity.configurationArguments?.r__assetMessage_Key) {
866
+ activity.configurationArguments.assetId = cache.searchForField(
867
+ 'asset',
868
+ activity.configurationArguments.r__assetMessage_Key,
869
+ 'customerKey',
870
+ 'id'
871
+ );
872
+ delete activity.configurationArguments.r__assetMessage_Key;
873
+ delete activity.configurationArguments.r__assetMessage_Name_readOnly;
874
+ }
875
+
876
+ // applicationExtensionId always equal "00000000-0000-0000-0000-000000000000"
877
+ activity.configurationArguments.applicationExtensionId =
878
+ '00000000-0000-0000-0000-000000000000';
879
+ break;
880
+ }
881
+ }
882
+ }
883
+ }
884
+
885
+ /**
886
+ * helper for {@link MetadataType.upsert}
694
887
  *
695
- * @param {TYPE.MetadataTypeItem} metadata single metadata itme
888
+ * @param {TYPE.MetadataTypeMap} metadataMap list of metadata
696
889
  * @param {string} metadataKey key of item we are looking at
697
890
  * @param {boolean} hasError error flag from previous code
698
891
  * @param {TYPE.MetadataTypeItemDiff[]} metadataToUpdate list of items to update
699
892
  * @param {TYPE.MetadataTypeItem[]} metadataToCreate list of items to create
893
+ * @returns {'create' | 'update' | 'skip'} action to take
700
894
  */
701
- static createOrUpdate(metadata, metadataKey, hasError, metadataToUpdate, metadataToCreate) {
702
- const normalizedKey = File.reverseFilterIllegalFilenames(
703
- metadata[metadataKey][this.definition.keyField]
895
+ static createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate) {
896
+ const action = super.createOrUpdate(
897
+ metadataMap,
898
+ metadataKey,
899
+ hasError,
900
+ metadataToUpdate,
901
+ metadataToCreate
704
902
  );
705
- // Update if it already exists; Create it if not
706
- if (Util.logger.level === 'debug' && metadata[metadataKey][this.definition.idField]) {
707
- // TODO: re-evaluate in future releases if & when we managed to solve folder dependencies once and for all
708
- // only used if resource is excluded from cache and we still want to update it
709
- // needed e.g. to rewire lost folders
710
- Util.logger.warn(
711
- ' - Hotfix for non-cachable resource found in deploy folder. Trying update:'
903
+ if (action === 'update') {
904
+ const normalizedKey = File.reverseFilterIllegalFilenames(
905
+ metadataMap[metadataKey][this.definition.keyField]
712
906
  );
713
- Util.logger.warn(JSON.stringify(metadata[metadataKey]));
714
- if (hasError) {
715
- metadataToUpdate.push(null);
716
- } else {
717
- metadataToUpdate.push({
718
- before: {},
719
- after: metadata[metadataKey],
720
- });
721
- }
722
- } else {
723
907
  const cachedVersion = cache.getByKey(this.definition.type, normalizedKey);
724
- if (cachedVersion && cachedVersion.status === 'Draft') {
725
- // normal way of processing update files
726
- if (!this.hasChanged(cachedVersion, metadata[metadataKey])) {
727
- hasError = true;
728
- }
729
-
730
- if (hasError) {
731
- // do this in case something went wrong during pre-deploy steps to ensure the total counter is correct
732
- metadataToUpdate.push(null);
908
+ if (cachedVersion) {
909
+ if (cachedVersion.status === 'Draft') {
910
+ // add version to ensure we update the correct one
911
+ metadataMap[metadataKey].version = cachedVersion.version;
733
912
  } else {
734
- // add ObjectId to allow actual update
735
- metadata[metadataKey][this.definition.idField] =
736
- cachedVersion[this.definition.idField];
737
- // add ObjectId to allow actual update
738
- metadata[metadataKey].version = cachedVersion.version;
739
-
740
- metadataToUpdate.push({
741
- before: cachedVersion,
742
- after: metadata[metadataKey],
743
- });
744
- }
745
- } else {
746
- if (hasError) {
747
- // do this in case something went wrong during pre-deploy steps to ensure the total counter is correct
748
- metadataToCreate.push(null);
749
- } else {
750
- if (cachedVersion) {
751
- Util.logger.info(
752
- ` - Found ${this.definition.type} ${
753
- metadata[metadataKey][this.definition.nameField]
754
- } (${
755
- metadata[metadataKey][this.definition.keyField]
756
- }) on BU, but it is not in Draft status. Will create new version.`
757
- );
758
- }
759
-
760
- metadataToCreate.push(metadata[metadataKey]);
913
+ // remove last entry from metadataToUpdate again
914
+ metadataToUpdate.pop();
915
+ Util.logger.info(
916
+ ` - Found ${this.definition.type} ${
917
+ metadataMap[metadataKey][this.definition.nameField]
918
+ } (${
919
+ metadataMap[metadataKey][this.definition.keyField]
920
+ }) on BU, but it is not in Draft status. Will create new version.`
921
+ );
922
+ metadataToCreate.push(metadataMap[metadataKey]);
923
+ return 'create';
761
924
  }
762
925
  }
763
926
  }
927
+ return action;
764
928
  }
765
929
  }
766
930
 
767
931
  // Assign definition to static attributes
768
- Interaction.definition = require('../MetadataTypeDefinitions').interaction;
932
+ Journey.definition = require('../MetadataTypeDefinitions').journey;
769
933
 
770
- module.exports = Interaction;
934
+ module.exports = Journey;