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
@@ -4,6 +4,7 @@ const TYPE = require('../../types/mcdev.d');
4
4
  const MetadataType = require('./MetadataType');
5
5
  const Util = require('../util/util');
6
6
  const File = require('../util/file');
7
+ const cache = require('../util/cache');
7
8
 
8
9
  /**
9
10
  * ImportFile MetadataType
@@ -28,15 +29,8 @@ class Role extends MetadataType {
28
29
  return;
29
30
  }
30
31
 
31
- const fields = Object.keys(this.definition.fields).reduce((accumulator, currentValue) => {
32
- if (this.definition.fields[currentValue].retrieving) {
33
- accumulator.push(currentValue);
34
- }
35
- return accumulator;
36
- }, []);
37
- // manually add ObjectID for retrieves as it is no longer automatically returned, and is needed for updates
38
- fields.push('ObjectID');
39
- /** @type {TYPE.SoapRequestParams} */
32
+ const fields = super.getFieldNamesToRetrieve(null, !retrieveDir);
33
+
40
34
  let requestParams = {
41
35
  // filter individual roles
42
36
  filter: {
@@ -45,24 +39,63 @@ class Role extends MetadataType {
45
39
  rightOperand: false,
46
40
  },
47
41
  };
42
+ /** @type {TYPE.SoapRequestParams} */
48
43
  if (key) {
49
44
  // move original filter down one level into rightOperand and add key filter into leftOperand
50
- requestParams = {
51
- filter: {
52
- leftOperand: {
53
- leftOperand: 'CustomerKey',
54
- operator: 'equals',
55
- rightOperand: key,
56
- },
57
- operator: 'AND',
58
- rightOperand: requestParams.filter,
59
- },
45
+ const keyFilter = {
46
+ leftOperand: 'CustomerKey',
47
+ operator: 'equals',
48
+ rightOperand: key,
60
49
  };
50
+ requestParams = requestParams
51
+ ? {
52
+ filter: {
53
+ leftOperand: keyFilter,
54
+ operator: 'AND',
55
+ rightOperand: requestParams.filter,
56
+ },
57
+ }
58
+ : keyFilter;
61
59
  }
62
60
 
63
61
  const results = await this.client.soap.retrieve('Role', fields, requestParams);
64
62
 
65
63
  const parsed = this.parseResponseBody(results);
64
+ if (!retrieveDir) {
65
+ // retrieve "Marketing Cloud%" roles not returned by SOAP API
66
+ const { roles, timeZones } = await this.client.rest.get(
67
+ '/platform/v1/setup/quickflow/data'
68
+ );
69
+ // this endpoint does not provide keys
70
+ const roleNameKeyMap = {
71
+ 'Marketing Cloud Administrator': 'SYS_DEF_IMHADMIN',
72
+ 'Marketing Cloud Channel Manager': 'SYS_DEF_CHANNELMANAGER',
73
+ 'Marketing Cloud Content Editor/Publisher': 'SYS_DEF_CONTENTEDIT',
74
+ 'Marketing Cloud Security Administrator': 'SYS_DEF_SECURITYADMIN',
75
+ 'Marketing Cloud Viewer': 'SYS_DEF_VIEWER',
76
+ };
77
+ for (const role of roles) {
78
+ if (roleNameKeyMap[role.roleName]) {
79
+ parsed[roleNameKeyMap[role.roleName]] = {
80
+ CustomerKey: roleNameKeyMap[role.roleName],
81
+ Name: role.roleName,
82
+ ObjectID: role.roleID,
83
+ Desscription: role.description,
84
+ CreatedDate: '2012-02-21T02:09:19.983',
85
+ IsSystemDefined: true,
86
+ c__notAssignable: true,
87
+ };
88
+ }
89
+ }
90
+ // the languages object is incomplete. the actual list is much longer --> ignoring it here
91
+ // convert timeZones to object
92
+ const timeZonesObj = {};
93
+ for (const timeZone of timeZones) {
94
+ timeZonesObj[timeZone.id] = timeZone;
95
+ }
96
+ // cache timeZones to share it with other type-classes
97
+ cache.setMetadata('_timezone', timeZonesObj);
98
+ }
66
99
  if (retrieveDir) {
67
100
  const savedMetadata = await super.saveResults(parsed, retrieveDir, null);
68
101
  Util.logger.info(
@@ -238,8 +271,14 @@ class Role extends MetadataType {
238
271
  // Reached end: write permission into this.allPermissions
239
272
  if (element.Operation) {
240
273
  const permSplit = _permission.split(' > ');
241
- const basePermission = permSplit.shift();
242
- const permissionName = permSplit.join(' > ');
274
+ const permOperation = permSplit.pop();
275
+ let basePermission = permSplit.shift();
276
+ if (basePermission === 'Interactive Marketing Hub') {
277
+ basePermission = 'Salesforce Marketing Cloud';
278
+ }
279
+ const permissionName = `<nobr><b>${permSplit.join(
280
+ ' > '
281
+ )}</b> > ${permOperation}</nobr>`;
243
282
  if (!this.allPermissions[basePermission]) {
244
283
  this.allPermissions[basePermission] = {};
245
284
  }
@@ -23,7 +23,7 @@ class Script extends MetadataType {
23
23
  */
24
24
  static async retrieve(retrieveDir, _, __, key) {
25
25
  await File.initPrettier('ssjs');
26
- return super.retrieveREST(retrieveDir, '/automation/v1/scripts/', null, null, key);
26
+ return super.retrieveREST(retrieveDir, '/automation/v1/scripts/', null, key);
27
27
  }
28
28
  /**
29
29
  * Retrieves script metadata for caching
@@ -47,7 +47,6 @@ class Script extends MetadataType {
47
47
  return super.retrieveREST(
48
48
  templateDir,
49
49
  '/automation/v1/scripts/?$filter=name%20eq%20' + encodeURIComponent(name),
50
- null,
51
50
  templateVariables
52
51
  );
53
52
  }
@@ -91,7 +90,7 @@ class Script extends MetadataType {
91
90
  * @returns {Promise.<string>} content for metadata.script
92
91
  */
93
92
  static async _mergeCode(metadata, deployDir, templateName) {
94
- templateName = templateName || metadata[this.definition.keyField];
93
+ templateName ||= metadata[this.definition.keyField];
95
94
  let code;
96
95
  const codePath = File.normalizePath([
97
96
  deployDir,
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ const TYPE = require('../../types/mcdev.d');
4
+ const MetadataType = require('./MetadataType');
5
+
6
+ /**
7
+ * SendClassification MetadataType
8
+ *
9
+ * @augments MetadataType
10
+ */
11
+ class SendClassification extends MetadataType {
12
+ /**
13
+ * Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
14
+ *
15
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
16
+ * @param {void} [_] unused parameter
17
+ * @param {void} [__] unused parameter
18
+ * @param {string} [key] customer key of single item to retrieve
19
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
20
+ */
21
+ static retrieve(retrieveDir, _, __, key) {
22
+ /** @type {TYPE.SoapRequestParams} */
23
+ let requestParams = null;
24
+ if (key) {
25
+ requestParams = {
26
+ filter: {
27
+ leftOperand: 'CustomerKey',
28
+ operator: 'equals',
29
+ rightOperand: key,
30
+ },
31
+ };
32
+ }
33
+ return super.retrieveSOAP(retrieveDir, requestParams, key);
34
+ }
35
+ }
36
+
37
+ // Assign definition to static attributes
38
+ SendClassification.definition = require('../MetadataTypeDefinitions').sendClassification;
39
+
40
+ module.exports = SendClassification;
@@ -19,13 +19,7 @@ class SetDefinition extends MetadataType {
19
19
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
20
20
  */
21
21
  static retrieve(retrieveDir, _, __, key) {
22
- return super.retrieveREST(
23
- retrieveDir,
24
- '/hub/v1/contacts/schema/setDefinitions',
25
- null,
26
- null,
27
- key
28
- );
22
+ return super.retrieveREST(retrieveDir, '/hub/v1/contacts/schema/setDefinitions', null, key);
29
23
  }
30
24
  /**
31
25
  * Retrieves Metadata of schema set definitions for caching.
@@ -71,8 +71,7 @@ class TransactionalEmail extends TransactionalMessage {
71
71
  // journey
72
72
  if (metadata.journey?.interactionKey) {
73
73
  // ! update & create enpoints dont accept journey.interactionKey. They only allow to create a new journey
74
- // cache.searchForField('interaction', metadata.journey.interactionKey, 'key', 'key');
75
- metadata.options = metadata.options || {};
74
+ metadata.options ||= {};
76
75
  metadata.options.createJourney = true; // only send this during create or else we might end up with an unexpected outcome
77
76
  delete metadata.journey.interactionKey;
78
77
  }
@@ -143,7 +142,7 @@ class TransactionalEmail extends TransactionalMessage {
143
142
  if (metadata.journey?.interactionKey) {
144
143
  try {
145
144
  // we merely want to be able to show a warning if it does not exist
146
- cache.searchForField('interaction', metadata.journey.interactionKey, 'key', 'key');
145
+ cache.searchForField('journey', metadata.journey.interactionKey, 'key', 'key');
147
146
  } catch (ex) {
148
147
  Util.logger.warn(
149
148
  ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
@@ -13,8 +13,7 @@ class TransactionalMessage extends MetadataType {
13
13
  // define this.subType as string here for intellisense; requires to be redefined in child class
14
14
  static subType;
15
15
  /**
16
- * Retrieves Metadata of Mobile Keywords
17
- * Endpoint /legacy/v1/beta/mobile/code/ return all Mobile Codes with all details.
16
+ * Retrieves Metadata
18
17
  *
19
18
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
20
19
  * @param {void} [_] unused parameter
@@ -21,29 +21,22 @@ class TransactionalSMS extends TransactionalMessage {
21
21
  * @returns {void}
22
22
  */
23
23
  static async postDeleteTasks(customerKey) {
24
- // delete local copy: retrieve/cred/bu/type/...json
25
- const fileName = File.normalizePath([
26
- this.properties.directories.retrieve,
27
- this.buObject.credential,
28
- this.buObject.businessUnit,
29
- this.definition.type,
30
- `${customerKey}.${this.definition.type}-meta.`,
31
- ]);
32
- await File.remove(fileName + 'json');
33
- await File.remove(fileName + 'amp');
24
+ // delete local copy: retrieve/cred/bu/type/...-meta.json
25
+ // delete local copy: retrieve/cred/bu/type/...-meta.amp
26
+ super.postDeleteTasks(customerKey, [`${this.definition.type}-meta.amp`]);
34
27
  }
35
28
 
36
29
  /**
37
30
  * prepares for deployment
38
31
  *
39
32
  * @param {TYPE.MetadataTypeItem} metadata a single item
40
- * @param {string} dir directory of deploy files
41
- * @returns {TYPE.MetadataTypeItem} Promise
33
+ * @param {string} deployDir directory of deploy files
34
+ * @returns {Promise.<TYPE.MetadataTypeItem>} Promise
42
35
  */
43
- static async preDeployTasks(metadata, dir) {
36
+ static async preDeployTasks(metadata, deployDir) {
44
37
  // code
45
38
  metadata.content = {
46
- message: await this._mergeCode(metadata, dir),
39
+ message: await this._mergeCode(metadata, deployDir),
47
40
  };
48
41
 
49
42
  if (this._isHTML(metadata.content?.message)) {
@@ -81,7 +74,7 @@ class TransactionalSMS extends TransactionalMessage {
81
74
  * @returns {Promise.<string>} content for metadata.script
82
75
  */
83
76
  static async _mergeCode(metadata, deployDir, templateName) {
84
- templateName = templateName || metadata[this.definition.keyField];
77
+ templateName ||= metadata[this.definition.keyField];
85
78
  const codePath = File.normalizePath([
86
79
  deployDir,
87
80
  this.definition.type,
@@ -16,7 +16,7 @@ const cacheTypes = {
16
16
  *
17
17
  * @augments MetadataType
18
18
  */
19
- class TriggeredSendDefinition extends MetadataType {
19
+ class TriggeredSend extends MetadataType {
20
20
  /**
21
21
  * Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
22
22
  *
@@ -50,7 +50,7 @@ class TriggeredSendDefinition extends MetadataType {
50
50
  };
51
51
  }
52
52
 
53
- return super.retrieveSOAP(retrieveDir, requestParams);
53
+ return super.retrieveSOAP(retrieveDir, requestParams, key);
54
54
  }
55
55
 
56
56
  /**
@@ -67,13 +67,12 @@ class TriggeredSendDefinition extends MetadataType {
67
67
  * Updates a single TSD.
68
68
  *
69
69
  * @param {TYPE.MetadataTypeItem} metadata single metadata entry
70
- * @param {boolean} [handleOutside] if the API reponse is irregular this allows you to handle it outside of this generic method
71
70
  * @returns {Promise} Promise
72
71
  */
73
- static update(metadata, handleOutside) {
72
+ static update(metadata) {
74
73
  // * in case of update and active definition, we need to pause first.
75
74
  // * this should be done manually to not accidentally pause production queues without restarting them
76
- return super.updateSOAP(metadata, null, handleOutside);
75
+ return super.updateSOAP(metadata);
77
76
  }
78
77
 
79
78
  /**
@@ -83,7 +82,7 @@ class TriggeredSendDefinition extends MetadataType {
83
82
  * @returns {Promise.<boolean>} deletion success status
84
83
  */
85
84
  static deleteByKey(customerKey) {
86
- return super.deleteByKeySOAP(customerKey, false);
85
+ return super.deleteByKeySOAP(customerKey);
87
86
  }
88
87
 
89
88
  /**
@@ -153,7 +152,7 @@ class TriggeredSendDefinition extends MetadataType {
153
152
  'legacyData.legacyId',
154
153
  'name'
155
154
  );
156
- metadata.r__assetMessage_Name = contentBuilderEmailName;
155
+ metadata.r__assetMessage_Name_readOnly = contentBuilderEmailName;
157
156
  const contentBuilderEmailKey = cache.searchForField(
158
157
  'asset',
159
158
  metadata.Email.ID,
@@ -213,7 +212,7 @@ class TriggeredSendDefinition extends MetadataType {
213
212
  delete metadata.r__email_Name;
214
213
  } else if (metadata.r__assetMessage_Key) {
215
214
  // content builder
216
- // * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
215
+ // * this ignores r__assetMessage_Name_readOnly on purpose as that is only unique per parent folder but useful during PR reviews
217
216
  metadata.Email = {
218
217
  ID: cache.searchForField(
219
218
  'asset',
@@ -223,7 +222,7 @@ class TriggeredSendDefinition extends MetadataType {
223
222
  ),
224
223
  };
225
224
  delete metadata.r__assetMessage_Key;
226
- delete metadata.r__assetMessage_Name;
225
+ delete metadata.r__assetMessage_Name_readOnly;
227
226
  } else if (metadata?.Email?.ID) {
228
227
  throw new Error(
229
228
  `r__assetMessage_Key / r__email_Name not defined but instead found Email.ID. Please try re-retrieving this TSD from your BU.`
@@ -247,13 +246,13 @@ class TriggeredSendDefinition extends MetadataType {
247
246
  * TSD-specific refresh method that finds active TSDs and refreshes them
248
247
  *
249
248
  * @param {string[]} [keyArr] metadata keys
249
+ * @param {boolean} [checkKey=true] whether to check if the key is valid
250
250
  * @returns {Promise.<void>} -
251
251
  */
252
- static async refresh(keyArr) {
252
+ static async refresh(keyArr, checkKey = true) {
253
253
  console.time('Time'); // eslint-disable-line no-console
254
- let checkKey = true;
255
254
  if (!keyArr) {
256
- keyArr = await this._findRefreshableItems();
255
+ keyArr = await this.getKeysForValidTSDs((await this.findRefreshableItems()).metadata);
257
256
  checkKey = false;
258
257
  }
259
258
  // then executes pause, publish, start on them.
@@ -269,16 +268,31 @@ class TriggeredSendDefinition extends MetadataType {
269
268
  }
270
269
 
271
270
  /**
272
- * 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
271
+ * helper for {@link refresh} that extracts the keys from the TSD item map and eli
273
272
  *
273
+ * @param {TYPE.MetadataTypeMapObj} metadata TSD item map
274
274
  * @returns {Promise.<string[]>} keyArr
275
275
  */
276
- static async _findRefreshableItems() {
276
+ static async getKeysForValidTSDs(metadata) {
277
+ const keyArr = Object.keys(metadata).filter((key) => {
278
+ const test = this.postRetrieveTasks(metadata[key]);
279
+ return test?.CustomerKey || false;
280
+ });
281
+ Util.logger.info(`Found ${keyArr.length} refreshable items.`);
282
+ return keyArr;
283
+ }
284
+ /**
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
286
+ *
287
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of TSD item map
288
+ */
289
+ static async findRefreshableItems() {
277
290
  Util.logger.info('Finding refreshable items...');
278
291
  // cache dependencies to test for broken links
279
292
  // skip deprecated classic emails here, assuming they cannot be updated and hence are not relevant for {@link refresh}
280
293
  const requiredCache = {
281
294
  folder: [
295
+ 'hidden',
282
296
  'list',
283
297
  'mysubs',
284
298
  'suppression_list',
@@ -311,13 +325,7 @@ class TriggeredSendDefinition extends MetadataType {
311
325
  rightOperand: ['dummy', 'Active'], // using equals does not work for this field for an unknown reason and IN requires at least 2 values, hence the 'dummy' entry
312
326
  },
313
327
  };
314
- const metadata = (await super.retrieveSOAP(null, requestParams)).metadata;
315
- const keyArr = Object.keys(metadata).filter((key) => {
316
- const test = this.postRetrieveTasks(metadata[key]);
317
- return test?.CustomerKey || false;
318
- });
319
- Util.logger.info(`Found ${keyArr.length} refreshable items.`);
320
- return keyArr;
328
+ return super.retrieveSOAP(null, requestParams);
321
329
  }
322
330
 
323
331
  /**
@@ -343,7 +351,7 @@ class TriggeredSendDefinition extends MetadataType {
343
351
  };
344
352
  try {
345
353
  test = (
346
- await super.retrieveSOAP(null, requestParams, [
354
+ await super.retrieveSOAP(null, requestParams, key, [
347
355
  'CustomerKey',
348
356
  'TriggeredSendStatus',
349
357
  ])
@@ -370,7 +378,7 @@ class TriggeredSendDefinition extends MetadataType {
370
378
  // pause
371
379
  try {
372
380
  item.TriggeredSendStatus = 'Inactive';
373
- test = await this.update(item, true);
381
+ test = await super.updateSOAP(item, true);
374
382
  if (test.OverallStatus !== 'OK') {
375
383
  throw new Error(test.Results[0].StatusMessage);
376
384
  }
@@ -388,7 +396,7 @@ class TriggeredSendDefinition extends MetadataType {
388
396
  // publish
389
397
  try {
390
398
  item.RefreshContent = 'true';
391
- test = await this.update(item, true);
399
+ test = await super.updateSOAP(item, true);
392
400
  if (test.OverallStatus !== 'OK') {
393
401
  throw new Error(test.Results[0].StatusMessage);
394
402
  }
@@ -405,7 +413,7 @@ class TriggeredSendDefinition extends MetadataType {
405
413
  // start
406
414
  try {
407
415
  item.TriggeredSendStatus = 'Active';
408
- test = await this.update(item, true);
416
+ test = await super.updateSOAP(item, true);
409
417
  if (test.OverallStatus !== 'OK') {
410
418
  throw new Error(test.Results[0].StatusMessage);
411
419
  }
@@ -423,6 +431,6 @@ class TriggeredSendDefinition extends MetadataType {
423
431
  }
424
432
 
425
433
  // Assign definition to static attributes
426
- TriggeredSendDefinition.definition = require('../MetadataTypeDefinitions').triggeredSendDefinition;
434
+ TriggeredSend.definition = require('../MetadataTypeDefinitions').triggeredSend;
427
435
 
428
- module.exports = TriggeredSendDefinition;
436
+ module.exports = TriggeredSend;