mcdev 5.2.0 → 6.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 (191) hide show
  1. package/.eslintrc.json +1 -1
  2. package/.fork/custom-commands.json +12 -0
  3. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  4. package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +19 -0
  5. package/.github/workflows/code-test.yml +1 -1
  6. package/.github/workflows/coverage-base-update.yml +1 -1
  7. package/.github/workflows/coverage-develop-branch.yml +2 -2
  8. package/.github/workflows/coverage-main-branch.yml +2 -2
  9. package/.github/workflows/coverage.yml +2 -2
  10. package/.github/workflows/npm-publish.yml +2 -2
  11. package/.prettierrc +7 -0
  12. package/docs/dist/documentation.md +388 -482
  13. package/jsconfig.json +5 -1
  14. package/lib/Builder.js +8 -8
  15. package/lib/Deployer.js +10 -10
  16. package/lib/MetadataTypeDefinitions.js +73 -38
  17. package/lib/MetadataTypeInfo.js +72 -37
  18. package/lib/Retriever.js +8 -8
  19. package/lib/cli.js +12 -7
  20. package/lib/index.js +28 -18
  21. package/lib/metadataTypes/Asset.js +12 -10
  22. package/lib/metadataTypes/AttributeGroup.js +7 -6
  23. package/lib/metadataTypes/AttributeSet.js +126 -18
  24. package/lib/metadataTypes/Automation.js +107 -78
  25. package/lib/metadataTypes/Campaign.js +7 -6
  26. package/lib/metadataTypes/ContentArea.js +7 -6
  27. package/lib/metadataTypes/DataExtension.js +475 -78
  28. package/lib/metadataTypes/DataExtensionField.js +36 -18
  29. package/lib/metadataTypes/DataExtensionTemplate.js +5 -4
  30. package/lib/metadataTypes/DataExtract.js +8 -7
  31. package/lib/metadataTypes/DataExtractType.js +5 -4
  32. package/lib/metadataTypes/Discovery.js +6 -5
  33. package/lib/metadataTypes/Email.js +6 -5
  34. package/lib/metadataTypes/EmailSend.js +7 -6
  35. package/lib/metadataTypes/Event.js +8 -7
  36. package/lib/metadataTypes/FileLocation.js +5 -4
  37. package/lib/metadataTypes/FileTransfer.js +8 -7
  38. package/lib/metadataTypes/Filter.js +5 -4
  39. package/lib/metadataTypes/Folder.js +9 -8
  40. package/lib/metadataTypes/ImportFile.js +8 -7
  41. package/lib/metadataTypes/Journey.js +17 -9
  42. package/lib/metadataTypes/List.js +9 -8
  43. package/lib/metadataTypes/MetadataType.js +100 -34
  44. package/lib/metadataTypes/MobileCode.js +5 -4
  45. package/lib/metadataTypes/MobileKeyword.js +9 -8
  46. package/lib/metadataTypes/MobileMessage.js +8 -7
  47. package/lib/metadataTypes/Query.js +9 -8
  48. package/lib/metadataTypes/Role.js +8 -7
  49. package/lib/metadataTypes/Script.js +7 -6
  50. package/lib/metadataTypes/SendClassification.js +5 -4
  51. package/lib/metadataTypes/TransactionalEmail.js +101 -23
  52. package/lib/metadataTypes/TransactionalMessage.js +9 -7
  53. package/lib/metadataTypes/TransactionalPush.js +7 -6
  54. package/lib/metadataTypes/TransactionalSMS.js +9 -8
  55. package/lib/metadataTypes/TriggeredSend.js +15 -12
  56. package/lib/metadataTypes/User.js +8 -7
  57. package/lib/metadataTypes/Verification.js +230 -0
  58. package/lib/metadataTypes/definitions/Asset.definition.js +1 -1
  59. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +3 -3
  60. package/lib/metadataTypes/definitions/AttributeSet.definition.js +75 -22
  61. package/lib/metadataTypes/definitions/Automation.definition.js +2 -1
  62. package/lib/metadataTypes/definitions/Campaign.definition.js +1 -1
  63. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -1
  64. package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -1
  65. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -1
  66. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -1
  67. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -1
  68. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -1
  69. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -1
  70. package/lib/metadataTypes/definitions/Email.definition.js +1 -1
  71. package/lib/metadataTypes/definitions/EmailSend.definition.js +1 -1
  72. package/lib/metadataTypes/definitions/Event.definition.js +1 -1
  73. package/lib/metadataTypes/definitions/FileLocation.definition.js +1 -1
  74. package/lib/metadataTypes/definitions/FileTransfer.definition.js +1 -1
  75. package/lib/metadataTypes/definitions/Filter.definition.js +1 -1
  76. package/lib/metadataTypes/definitions/Folder.definition.js +1 -1
  77. package/lib/metadataTypes/definitions/ImportFile.definition.js +1 -1
  78. package/lib/metadataTypes/definitions/Journey.definition.js +1 -1
  79. package/lib/metadataTypes/definitions/List.definition.js +1 -1
  80. package/lib/metadataTypes/definitions/MobileCode.definition.js +1 -1
  81. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +1 -1
  82. package/lib/metadataTypes/definitions/MobileMessage.definition.js +1 -1
  83. package/lib/metadataTypes/definitions/Query.definition.js +1 -1
  84. package/lib/metadataTypes/definitions/Role.definition.js +1 -1
  85. package/lib/metadataTypes/definitions/Script.definition.js +1 -1
  86. package/lib/metadataTypes/definitions/SendClassification.definition.js +1 -1
  87. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +20 -2
  88. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +1 -1
  89. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +1 -1
  90. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +1 -1
  91. package/lib/metadataTypes/definitions/User.definition.js +1 -1
  92. package/lib/metadataTypes/definitions/Verification.definition.js +88 -0
  93. package/lib/retrieveChangelog.js +4 -3
  94. package/lib/util/auth.js +11 -8
  95. package/lib/util/businessUnit.js +5 -5
  96. package/lib/util/cache.js +3 -3
  97. package/lib/util/cli.js +15 -13
  98. package/lib/util/config.js +10 -7
  99. package/lib/util/devops.js +12 -11
  100. package/lib/util/file.js +15 -14
  101. package/lib/util/init.config.js +11 -9
  102. package/lib/util/init.git.js +8 -7
  103. package/lib/util/init.js +12 -12
  104. package/lib/util/init.npm.js +7 -5
  105. package/lib/util/util.js +14 -12
  106. package/package.json +32 -27
  107. package/test/general.test.js +4 -6
  108. package/test/mockRoot/.mcdevrc.json +1 -1
  109. package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testExisting_dataExtensionShared.dataExtension-meta.json +59 -0
  110. package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testNew_dataExtensionShared.dataExtension-meta.json +23 -0
  111. package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +4 -0
  112. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testExisting_dataExtension.dataExtension-meta.json +1 -0
  113. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +3 -4
  114. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -6
  115. package/test/mockRoot/deploy/testInstance/testBU/verification/testExisting_39f6a488-20eb-4ba0-b0b9.verification-meta.json +11 -0
  116. package/test/mockRoot/deploy/testInstance/testBU/verification/testNew_39f6a488-20eb-4ba0-b0b9.verification-meta.json +11 -0
  117. package/test/resourceFactory.js +52 -26
  118. package/test/resources/1111111/data/v1/customobjectdata/key/testExisting_dataExtensionShared/rowset/get-response.json +13 -0
  119. package/test/resources/1111111/dataExtension/create-expected.json +23 -0
  120. package/test/resources/1111111/dataExtension/create-response.xml +59 -0
  121. package/test/resources/1111111/dataExtension/retrieve-expected.json +55 -0
  122. package/test/resources/1111111/dataExtension/retrieve-expected.md +18 -0
  123. package/test/resources/1111111/dataExtension/retrieve-response.xml +27 -1
  124. package/test/resources/1111111/dataExtension/update-expected.json +55 -0
  125. package/test/resources/1111111/dataExtension/update-response.xml +57 -0
  126. package/test/resources/1111111/dataExtensionField/retrieve-CustomerKey=[testExisting_dataExtensionShared].[TriggerUpdate_randomNumber_]-response.xml +45 -0
  127. package/test/resources/1111111/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtensionShared-response.xml +98 -0
  128. package/test/resources/1111111/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_dataExtensionSharedORDataExtension.CustomerKey=testExisting_dataExtensionShared-response.xml +98 -0
  129. package/test/resources/1111111/dataExtensionField/retrieve-response.xml +98 -0
  130. package/test/resources/1111111/dataExtensionTemplate/retrieve-response.xml +303 -0
  131. package/test/resources/1111111/dataFolder/retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml +387 -0
  132. package/test/resources/1111111/dataFolder/retrieve-response.xml +353 -9
  133. package/test/resources/9999999/attributeSet/retrieve-expected.json +89 -694
  134. package/test/resources/9999999/automation/build-expected.json +4 -0
  135. package/test/resources/9999999/automation/create-expected.json +4 -0
  136. package/test/resources/9999999/automation/create-testNew_automation-expected.md +1 -0
  137. package/test/resources/9999999/automation/retrieve-expected.json +4 -0
  138. package/test/resources/9999999/automation/retrieve-testExisting_automation-expected.md +1 -0
  139. package/test/resources/9999999/automation/template-expected.json +4 -0
  140. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +7 -0
  141. package/test/resources/9999999/automation/v1/automations/post-response.json +7 -0
  142. package/test/resources/9999999/automation/v1/dataverifications/post-response.json +12 -0
  143. package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/delete-response.json +0 -0
  144. package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/get-response.json +12 -0
  145. package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/patch-response.json +12 -0
  146. package/test/resources/9999999/dataExtension/build-expected.json +16 -0
  147. package/test/resources/9999999/dataExtension/delete-response.xml +42 -0
  148. package/test/resources/9999999/dataExtension/retrieve-expected.json +16 -0
  149. package/test/resources/9999999/dataExtension/retrieve-expected.md +3 -1
  150. package/test/resources/9999999/dataExtension/template-expected.json +16 -0
  151. package/test/resources/9999999/dataExtension/update-expected.json +17 -1
  152. package/test/resources/9999999/dataExtensionField/retrieve-CustomerKey=[testExisting_dataExtension].[LastName]-response.xml +44 -0
  153. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtension-response.xml +36 -1
  154. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +36 -1
  155. package/test/resources/9999999/dataFolder/retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml +117 -0
  156. package/test/resources/9999999/hub/v1/contacts/schema/attributeGroups/get-response.json +43 -0
  157. package/test/resources/9999999/hub/v1/contacts/schema/setDefinitions/get-response.json +387 -0
  158. package/test/resources/9999999/interaction/v1/interactions/233d4413-922c-4568-85a5-e5cc77efc3be/delete-response.json +1 -0
  159. package/test/resources/9999999/legacy/v1/beta/bulk/automations/automation/definition/get-response.json +1 -1
  160. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  161. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/delete-response.json +6 -0
  162. package/test/resources/9999999/transactionalEmail/build-expected.json +3 -7
  163. package/test/resources/9999999/transactionalEmail/get-expected.json +3 -7
  164. package/test/resources/9999999/transactionalEmail/patch-expected.json +3 -7
  165. package/test/resources/9999999/transactionalEmail/post-expected.json +3 -7
  166. package/test/resources/9999999/transactionalEmail/template-expected.json +3 -7
  167. package/test/resources/9999999/verification/build-expected.json +11 -0
  168. package/test/resources/9999999/verification/get-expected.json +11 -0
  169. package/test/resources/9999999/verification/patch-expected.json +11 -0
  170. package/test/resources/9999999/verification/post-expected.json +11 -0
  171. package/test/resources/9999999/verification/template-expected.json +11 -0
  172. package/test/type.attributeGroup.test.js +9 -12
  173. package/test/type.attributeSet.test.js +10 -13
  174. package/test/type.automation.test.js +34 -32
  175. package/test/type.dataExtension.test.js +210 -54
  176. package/test/type.dataExtract.test.js +15 -9
  177. package/test/type.fileTransfer.test.js +15 -9
  178. package/test/type.importFile.test.js +15 -9
  179. package/test/type.journey.test.js +43 -17
  180. package/test/type.mobileKeyword.test.js +11 -11
  181. package/test/type.mobileMessage.test.js +11 -11
  182. package/test/type.query.test.js +13 -14
  183. package/test/type.script.test.js +11 -9
  184. package/test/type.transactionalEmail.test.js +17 -17
  185. package/test/type.transactionalPush.test.js +7 -10
  186. package/test/type.transactionalSMS.test.js +7 -11
  187. package/test/type.triggeredSend.test.js +11 -10
  188. package/test/type.user.test.js +6 -8
  189. package/test/type.verification.test.js +172 -0
  190. package/test/utils.js +68 -48
  191. package/types/mcdev.d.js +16 -2
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- const TYPE = require('../../types/mcdev.d');
4
- const TransactionalMessage = require('./TransactionalMessage');
5
- const Util = require('../util/util');
6
- const File = require('../util/file');
7
- const beautifier = require('beauty-amp-core');
8
- const cache = require('../util/cache');
3
+ import TYPE from '../../types/mcdev.d.js';
4
+ import TransactionalMessage from './TransactionalMessage.js';
5
+ import { Util } from '../util/util.js';
6
+ import File from '../util/file.js';
7
+ import beautifier from 'beauty-amp-core';
8
+ import cache from '../util/cache.js';
9
9
 
10
10
  /**
11
11
  * TransactionalSMS MetadataType
@@ -341,6 +341,7 @@ class TransactionalSMS extends TransactionalMessage {
341
341
  }
342
342
 
343
343
  // Assign definition to static attributes
344
- TransactionalSMS.definition = require('../MetadataTypeDefinitions').transactionalSMS;
344
+ import MetadataTypeDefinitions from '../MetadataTypeDefinitions.js';
345
+ TransactionalSMS.definition = MetadataTypeDefinitions.transactionalSMS;
345
346
 
346
- module.exports = TransactionalSMS;
347
+ export default TransactionalSMS;
@@ -1,15 +1,12 @@
1
1
  'use strict';
2
2
 
3
- const TYPE = require('../../types/mcdev.d');
4
- const MetadataType = require('./MetadataType');
5
- const Util = require('../util/util');
6
- const cache = require('../util/cache');
7
-
8
- const cacheTypes = {
9
- asset: require('./Asset'),
10
- folder: require('./Folder'),
11
- list: require('./List'),
12
- };
3
+ import TYPE from '../../types/mcdev.d.js';
4
+ import MetadataType from './MetadataType.js';
5
+ import { Util } from '../util/util.js';
6
+ import cache from '../util/cache.js';
7
+ import asset from './Asset.js';
8
+ import folder from './Folder.js';
9
+ import list from './List.js';
13
10
 
14
11
  /**
15
12
  * MessageSendActivity MetadataType
@@ -273,6 +270,11 @@ class TriggeredSend extends MetadataType {
273
270
  asset: ['message'],
274
271
  list: null,
275
272
  };
273
+ const cacheTypes = {
274
+ asset,
275
+ folder,
276
+ list,
277
+ };
276
278
  for (const [type, subTypeArr] of Object.entries(requiredCache)) {
277
279
  if (type === 'asset' && assetLoaded) {
278
280
  continue;
@@ -406,6 +408,7 @@ class TriggeredSend extends MetadataType {
406
408
  }
407
409
 
408
410
  // Assign definition to static attributes
409
- TriggeredSend.definition = require('../MetadataTypeDefinitions').triggeredSend;
411
+ import MetadataTypeDefinitions from '../MetadataTypeDefinitions.js';
412
+ TriggeredSend.definition = MetadataTypeDefinitions.triggeredSend;
410
413
 
411
- module.exports = TriggeredSend;
414
+ export default TriggeredSend;
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- const TYPE = require('../../types/mcdev.d');
4
- const MetadataType = require('./MetadataType');
5
- const Util = require('../util/util');
6
- const File = require('../util/file');
7
- const cache = require('../util/cache');
3
+ import TYPE from '../../types/mcdev.d.js';
4
+ import MetadataType from './MetadataType.js';
5
+ import { Util } from '../util/util.js';
6
+ import File from '../util/file.js';
7
+ import cache from '../util/cache.js';
8
8
 
9
9
  /**
10
10
  * MetadataType
@@ -1169,6 +1169,7 @@ class User extends MetadataType {
1169
1169
  }
1170
1170
 
1171
1171
  // Assign definition to static attributes
1172
- User.definition = require('../MetadataTypeDefinitions').user;
1172
+ import MetadataTypeDefinitions from '../MetadataTypeDefinitions.js';
1173
+ User.definition = MetadataTypeDefinitions.user;
1173
1174
 
1174
- module.exports = User;
1175
+ export default User;
@@ -0,0 +1,230 @@
1
+ 'use strict';
2
+
3
+ import Automation from './Automation.js';
4
+ import MetadataType from './MetadataType.js';
5
+ import TYPE from '../../types/mcdev.d.js';
6
+ import { Util } from '../util/util.js';
7
+ import cache from '../util/cache.js';
8
+ /**
9
+ * Verification MetadataType
10
+ *
11
+ * @augments MetadataType
12
+ */
13
+ class Verification extends MetadataType {
14
+ /**
15
+ * Retrieves Metadata of Data Verification Activity.
16
+ *
17
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
18
+ * @param {void} [_] unused parameter
19
+ * @param {void} [__] unused parameter
20
+ * @param {string} key customer key of single item to retrieve
21
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
22
+ */
23
+ static async retrieve(retrieveDir, _, __, key) {
24
+ let paramArr = [];
25
+ if (key?.startsWith('id:')) {
26
+ paramArr = [key.slice(3)];
27
+ } else if (key) {
28
+ paramArr = [key];
29
+ }
30
+ if (!paramArr.length) {
31
+ // there is no API endpoint to retrieve all dataVerification items, so we need to retrieve all automations and iterate over their activities
32
+ Util.logger.info(` - Caching dependent Metadata: automation`);
33
+ Automation.client = this.client;
34
+ Automation.buObject = this.buObject;
35
+ Automation.properties = this.properties;
36
+ Automation._skipNotificationRetrieve = true;
37
+ delete Automation._cachedMetadataMap;
38
+ const automationsMapObj = await Automation.retrieve();
39
+ delete Automation._skipNotificationRetrieve;
40
+ if (automationsMapObj?.metadata && Object.keys(automationsMapObj?.metadata).length) {
41
+ if (!key) {
42
+ // if we are not retrieving a single item, cache the automations for later use during retrieval of automations
43
+ Automation._cachedMetadataMap = automationsMapObj?.metadata;
44
+ }
45
+ // automations found, lets iterate over their activities to find the dataVerification items
46
+ const dataVerificationIds = [];
47
+ for (const automation of Object.values(automationsMapObj.metadata)) {
48
+ if (automation.steps) {
49
+ for (const step of automation.steps) {
50
+ for (const activity of step.activities) {
51
+ if (
52
+ activity.objectTypeId === 1000 &&
53
+ activity.activityObjectId &&
54
+ activity.activityObjectId !==
55
+ '00000000-0000-0000-0000-000000000000'
56
+ ) {
57
+ dataVerificationIds.push(activity.activityObjectId);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ if (dataVerificationIds.length) {
64
+ paramArr.push(...dataVerificationIds);
65
+ }
66
+ }
67
+ }
68
+ const results = {};
69
+ if (paramArr.length) {
70
+ const response = await this.retrieveRESTcollection(
71
+ paramArr.map((id) => ({ id, uri: '/automation/v1/dataverifications/' + id })),
72
+ undefined,
73
+ !key
74
+ );
75
+ if (response?.metadata) {
76
+ Object.assign(results, response.metadata);
77
+ }
78
+ }
79
+ if (retrieveDir) {
80
+ const savedMetadata = await this.saveResults(results, retrieveDir, null, null);
81
+ Util.logger.info(
82
+ `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` +
83
+ Util.getKeysString(key)
84
+ );
85
+ }
86
+
87
+ return {
88
+ metadata: results,
89
+ type: this.definition.type,
90
+ };
91
+ }
92
+ /**
93
+ * helper for {@link this.retrieveRESTcollection}
94
+ *
95
+ * @param {Error} ex exception
96
+ * @param {string} id id or key of item
97
+ * @returns {null} -
98
+ */
99
+ static handleRESTErrors(ex, id) {
100
+ if (ex.message === 'Not Found' || ex.message === 'Request failed with status code 400') {
101
+ // if the ID is too short, the system will throw the 400 error
102
+ Util.logger.debug(
103
+ ` ☇ skipping ${this.definition.type} ${id}: ${ex.message} ${ex.code}`
104
+ );
105
+ } else {
106
+ // if we do get here, we should log the error and continue instead of failing to download all automations
107
+ Util.logger.error(
108
+ ` ☇ skipping ${this.definition.type} ${id}: ${ex.message} ${ex.code}`
109
+ );
110
+ }
111
+ return null;
112
+ }
113
+
114
+ /**
115
+ * Retrieves Metadata of Data Extract Activity for caching
116
+ *
117
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
118
+ */
119
+ static async retrieveForCache() {
120
+ return this.retrieve();
121
+ }
122
+
123
+ /**
124
+ * Creates a single Data Extract
125
+ *
126
+ * @param {TYPE.VerificationItem} metadata a single Data Extract
127
+ * @returns {Promise} Promise
128
+ */
129
+ static create(metadata) {
130
+ return super.createREST(metadata, '/automation/v1/dataverifications/');
131
+ }
132
+
133
+ /**
134
+ * helper for {@link MetadataType.createREST}
135
+ *
136
+ * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
137
+ * @param {object} apiResponse varies depending on the API call
138
+ * @param {TYPE.MetadataTypeItem} metadataEntryWithAllFields like metadataEntry but before non-creatable fields were stripped
139
+ * @returns {void}
140
+ */
141
+ static async postCreateTasks(metadataEntry, apiResponse, metadataEntryWithAllFields) {
142
+ if (!apiResponse?.[this.definition.idField]) {
143
+ return;
144
+ }
145
+ Util.logger.warn(
146
+ ` - ${this.definition.type} ${
147
+ metadataEntryWithAllFields?.[this.definition.idField]
148
+ }: new key ${
149
+ apiResponse?.[this.definition.idField]
150
+ } automatically assigned during creation`
151
+ );
152
+ metadataEntry[this.definition.idField] = apiResponse?.[this.definition.idField];
153
+
154
+ // map structure: cred/bu --> type --> old key --> new key
155
+ const buName = this.buObject.credential + '/' + this.buObject.businessUnit;
156
+ Automation.createdKeyMap ||= {};
157
+ Automation.createdKeyMap[buName] ||= {};
158
+ Automation.createdKeyMap[buName][this.definition.type] ||= {};
159
+ Automation.createdKeyMap[buName][this.definition.type][
160
+ metadataEntryWithAllFields[this.definition.idField]
161
+ ] = metadataEntry[this.definition.idField];
162
+ }
163
+
164
+ /**
165
+ * Updates a single Data Extract
166
+ *
167
+ * @param {TYPE.VerificationItem} metadata a single Data Extract
168
+ * @returns {Promise} Promise
169
+ */
170
+ static update(metadata) {
171
+ return super.updateREST(
172
+ metadata,
173
+ '/automation/v1/dataverifications/' + metadata.dataVerificationDefinitionId
174
+ );
175
+ }
176
+
177
+ /**
178
+ * prepares a verification for deployment
179
+ *
180
+ * @param {TYPE.VerificationItem} metadata a single verification activity definition
181
+ * @returns {TYPE.VerificationItem} metadata object
182
+ */
183
+ static preDeployTasks(metadata) {
184
+ metadata.targetObjectId = cache.searchForField(
185
+ 'dataExtension',
186
+ metadata.r__dataExtension_CustomerKey,
187
+ 'CustomerKey',
188
+ 'ObjectID'
189
+ );
190
+ delete metadata.r__dataExtension_CustomerKey;
191
+ return metadata;
192
+ }
193
+ /**
194
+ * parses retrieved Metadata before saving
195
+ *
196
+ * @param {TYPE.VerificationItem} metadata a single verification activity definition
197
+ * @returns {TYPE.VerificationItem} Array with one metadata object and one sql string
198
+ */
199
+ static postRetrieveTasks(metadata) {
200
+ try {
201
+ metadata.r__dataExtension_CustomerKey = cache.searchForField(
202
+ 'dataExtension',
203
+ metadata.targetObjectId,
204
+ 'ObjectID',
205
+ 'CustomerKey'
206
+ );
207
+ delete metadata.targetObjectId;
208
+ } catch (ex) {
209
+ Util.logger.warn(
210
+ ` - ${this.definition.type} ${metadata[this.definition.keyField]}: ${ex.message}`
211
+ );
212
+ }
213
+ return metadata;
214
+ }
215
+ /**
216
+ * Delete a metadata item from the specified business unit
217
+ *
218
+ * @param {string} key Identifier of item
219
+ * @returns {Promise.<boolean>} deletion success status
220
+ */
221
+ static deleteByKey(key) {
222
+ return super.deleteByKeyREST('/automation/v1/dataverifications/' + key, key);
223
+ }
224
+ }
225
+
226
+ // Assign definition to static attributes
227
+ import MetadataTypeDefinitions from '../MetadataTypeDefinitions.js';
228
+ Verification.definition = MetadataTypeDefinitions.verification;
229
+
230
+ export default Verification;
@@ -1,5 +1,5 @@
1
1
  // asset types https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/base-asset-types.htm
2
- module.exports = {
2
+ export default {
3
3
  bodyIteratorField: 'items',
4
4
  dependencies: ['folder-asset', 'folder-asset-shared'],
5
5
  folderType: 'asset',
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'attributeGroupDefinitions',
3
3
  dependencies: ['attributeSet'], // future may have dependency on Data Extensions
4
4
  hasExtended: false,
@@ -8,8 +8,8 @@ module.exports = {
8
8
  nameField: 'definitionName.value',
9
9
  restPagination: false, // Hub API does not support pagination and returns everything instead
10
10
  type: 'attributeGroup',
11
- typeDescription: 'BETA: Groupings of Set Definitions (Data Extensions) in Data Designer.',
12
- typeRetrieveByDefault: false,
11
+ typeDescription: 'Groupings of Attribute Sets (Data Extensions) in Data Designer.',
12
+ typeRetrieveByDefault: true,
13
13
  typeName: 'Data Designer Attribute Groups',
14
14
  fields: {
15
15
  applicationID: {
@@ -1,6 +1,15 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'setDefinition',
3
- dependencies: ['folder-hidden', 'folder-dataextension', 'dataExtension'], // future may have dependency on Data Extensions
3
+ dependencies: [
4
+ 'folder-hidden',
5
+ 'folder-dataextension',
6
+ 'folder-salesforcedataextension',
7
+ 'folder-shared_data',
8
+ 'folder-shared_dataextension',
9
+ 'folder-shared_salesforcedataextension',
10
+ 'folder-synchronizeddataextension',
11
+ 'dataExtension',
12
+ ],
4
13
  hasExtended: false,
5
14
  idField: 'definitionID',
6
15
  keyIsFixed: null,
@@ -13,9 +22,9 @@ module.exports = {
13
22
  lastmodNameField: null,
14
23
  restPagination: false, // Hub API does not support pagination and returns everything instead
15
24
  type: 'attributeSet',
16
- typeDescription: 'BETA: Data Extensions linked to Attribute Groups in Data Designer.',
17
- typeRetrieveByDefault: false,
18
- typeName: 'Data Designer Set Definitions',
25
+ typeDescription: 'Data Extensions linked together in Attribute Groups in Data Designer.',
26
+ typeRetrieveByDefault: true,
27
+ typeName: 'Data Designer Attribute Sets',
19
28
  fields: {
20
29
  applicationID: {
21
30
  isCreateable: null,
@@ -119,6 +128,12 @@ module.exports = {
119
128
  retrieving: true,
120
129
  template: null,
121
130
  },
131
+ 'dataRetentionProperties.periodLength': {
132
+ isCreateable: null,
133
+ isUpdateable: null,
134
+ retrieving: true,
135
+ template: null,
136
+ },
122
137
  definitionID: {
123
138
  isCreateable: null,
124
139
  isUpdateable: null,
@@ -138,14 +153,14 @@ module.exports = {
138
153
  template: false,
139
154
  },
140
155
  'definitionName.value': {
141
- // equal to 'name'; auto-populated by preDeployTasks
156
+ // equal to 'name'
142
157
  isCreateable: true,
143
158
  isUpdateable: true,
144
159
  retrieving: false,
145
160
  template: false,
146
161
  },
147
162
  fullyQualifiedName: {
148
- // equal to 'name'; auto-populated by preDeployTasks
163
+ // equal to 'name'
149
164
  isCreateable: true,
150
165
  isUpdateable: true,
151
166
  retrieving: false,
@@ -602,9 +617,10 @@ module.exports = {
602
617
  template: null,
603
618
  },
604
619
  'valueDefinitions[].baseType': {
620
+ // "Numeric", "Text", ... valueDefinitions[].dataType is more relevant
605
621
  isCreateable: null,
606
622
  isUpdateable: null,
607
- retrieving: true,
623
+ retrieving: false,
608
624
  template: null,
609
625
  },
610
626
  'valueDefinitions[].customerDataID': {
@@ -613,6 +629,12 @@ module.exports = {
613
629
  retrieving: true,
614
630
  template: null,
615
631
  },
632
+ 'valueDefinitions[].connectingID': {
633
+ isCreateable: null,
634
+ isUpdateable: null,
635
+ retrieving: false,
636
+ template: null,
637
+ },
616
638
  'valueDefinitions[].dataSourceID': {
617
639
  isCreateable: null,
618
640
  isUpdateable: null,
@@ -622,7 +644,7 @@ module.exports = {
622
644
  'valueDefinitions[].dataSourceName': {
623
645
  isCreateable: null,
624
646
  isUpdateable: null,
625
- retrieving: true,
647
+ retrieving: false,
626
648
  template: null,
627
649
  },
628
650
  'valueDefinitions[].dataType': {
@@ -638,9 +660,10 @@ module.exports = {
638
660
  template: null,
639
661
  },
640
662
  'valueDefinitions[].definitionID': {
663
+ // likely the main ID of the value definition. No use for simple checks on git though as long as we cannot update it
641
664
  isCreateable: null,
642
665
  isUpdateable: null,
643
- retrieving: true,
666
+ retrieving: false,
644
667
  template: null,
645
668
  },
646
669
  'valueDefinitions[].definitionKey': {
@@ -649,10 +672,11 @@ module.exports = {
649
672
  retrieving: true,
650
673
  template: null,
651
674
  },
652
- 'valueDefinitions[].definitionName.value': {
675
+ 'valueDefinitions[].definitionName': {
676
+ // equal to valueDefinitions[].name
653
677
  isCreateable: null,
654
678
  isUpdateable: null,
655
- retrieving: true,
679
+ retrieving: false,
656
680
  template: null,
657
681
  },
658
682
  'valueDefinitions[].description': {
@@ -662,15 +686,17 @@ module.exports = {
662
686
  template: null,
663
687
  },
664
688
  'valueDefinitions[].displayOrder': {
689
+ // merely a numeric counter; equal to valueDefinitions[].ordinal; not given for isHidden:true entries
665
690
  isCreateable: null,
666
691
  isUpdateable: null,
667
- retrieving: true,
692
+ retrieving: false,
668
693
  template: null,
669
694
  },
670
695
  'valueDefinitions[].fullyQualifiedName': {
696
+ // dataExtension name + field name
671
697
  isCreateable: null,
672
698
  isUpdateable: null,
673
- retrieving: true,
699
+ retrieving: false,
674
700
  template: null,
675
701
  },
676
702
  'valueDefinitions[].identifierType': {
@@ -727,10 +753,11 @@ module.exports = {
727
753
  retrieving: true,
728
754
  template: null,
729
755
  },
730
- 'valueDefinitions[].localizedDescription.value': {
756
+ 'valueDefinitions[].localizedDescription': {
757
+ // always equal to { value: "" }
731
758
  isCreateable: null,
732
759
  isUpdateable: null,
733
- retrieving: true,
760
+ retrieving: false,
734
761
  template: null,
735
762
  },
736
763
  'valueDefinitions[].name': {
@@ -739,6 +766,13 @@ module.exports = {
739
766
  retrieving: true,
740
767
  template: null,
741
768
  },
769
+ 'valueDefinitions[].obfuscationProperties': {
770
+ // might become relevant when fields are encrypted but for most cases we should simply skip it
771
+ isCreateable: null,
772
+ isUpdateable: null,
773
+ retrieving: false,
774
+ template: null,
775
+ },
742
776
  'valueDefinitions[].obfuscationProperties.maskType': {
743
777
  isCreateable: null,
744
778
  isUpdateable: null,
@@ -770,9 +804,10 @@ module.exports = {
770
804
  template: null,
771
805
  },
772
806
  'valueDefinitions[].ordinal': {
807
+ // merely a numeric counter; equal to valueDefinitions[].displayOrder; not given for isHidden:true entries
773
808
  isCreateable: null,
774
809
  isUpdateable: null,
775
- retrieving: true,
810
+ retrieving: false,
776
811
  template: null,
777
812
  },
778
813
  'valueDefinitions[].parentDefinition': {
@@ -788,9 +823,10 @@ module.exports = {
788
823
  template: null,
789
824
  },
790
825
  'valueDefinitions[].parentType': {
826
+ // always "Set"
791
827
  isCreateable: null,
792
828
  isUpdateable: null,
793
- retrieving: true,
829
+ retrieving: false,
794
830
  template: null,
795
831
  },
796
832
  'valueDefinitions[].restrictionLookupListID': {
@@ -817,40 +853,51 @@ module.exports = {
817
853
  retrieving: false,
818
854
  template: null,
819
855
  },
820
- 'valueDefinitions[].setDefinitionName.value': {
856
+ 'valueDefinitions[].setDefinitionName': {
857
+ isCreateable: null,
858
+ isUpdateable: null,
859
+ retrieving: false,
860
+ template: null,
861
+ },
862
+ 'valueDefinitions[].storageFieldReferenceID': {
821
863
  isCreateable: null,
822
864
  isUpdateable: null,
823
865
  retrieving: false,
824
866
  template: null,
825
867
  },
826
868
  'valueDefinitions[].storageFieldReferenceID.type': {
869
+ // always "guid"
827
870
  isCreateable: null,
828
871
  isUpdateable: null,
829
872
  retrieving: true,
830
873
  template: null,
831
874
  },
832
875
  'valueDefinitions[].storageFieldReferenceID.value': {
876
+ // unknown GUID
833
877
  isCreateable: null,
834
878
  isUpdateable: null,
835
879
  retrieving: true,
836
880
  template: null,
837
881
  },
838
882
  'valueDefinitions[].storageName': {
883
+ // always equal valueDefinitions[].definitionKey, except for when that is CustomObjectKey - then this will be _CustomObjectKey (with an underscore)
839
884
  isCreateable: null,
840
885
  isUpdateable: null,
841
- retrieving: true,
886
+ retrieving: false,
842
887
  template: null,
843
888
  },
844
889
  'valueDefinitions[].valueDefinitionID': {
890
+ // equal to valueDefinitions[].definitionID
845
891
  isCreateable: null,
846
892
  isUpdateable: null,
847
- retrieving: true,
893
+ retrieving: false,
848
894
  template: null,
849
895
  },
850
896
  'valueDefinitions[].valueDefinitionKey': {
897
+ // equal to valueDefinitions[].definitionKey
851
898
  isCreateable: null,
852
899
  isUpdateable: null,
853
- retrieving: true,
900
+ retrieving: false,
854
901
  template: null,
855
902
  },
856
903
  r__folder_Path: {
@@ -859,5 +906,11 @@ module.exports = {
859
906
  retrieving: true,
860
907
  template: null,
861
908
  },
909
+ r__dataExtension_CustomerKey: {
910
+ isCreateable: null,
911
+ isUpdateable: null,
912
+ retrieving: true,
913
+ template: null,
914
+ },
862
915
  },
863
916
  };
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  activityTypeMapping: {
3
3
  dataExtract: 73,
4
4
  dataFactoryUtility: 425,
@@ -31,6 +31,7 @@ module.exports = {
31
31
  'importFile',
32
32
  'query',
33
33
  'script',
34
+ 'verification',
34
35
  ],
35
36
  folderType: 'automation',
36
37
  hasExtended: false,
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'entry',
3
3
  dependencies: [],
4
4
  hasExtended: false,
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'Results',
3
3
  dependencies: ['folder'],
4
4
  hasExtended: false,
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'Results',
3
3
  dependencies: [
4
4
  'folder-hidden',
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'Results',
3
3
  dependencies: [],
4
4
  filter: {},
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'Results',
3
3
  dependencies: [],
4
4
  filter: {},
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: 'items',
3
3
  dependencies: ['dataExtension', 'dataExtractType'],
4
4
  hasExtended: true,
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  bodyIteratorField: [],
3
3
  dependencies: [],
4
4
  hasExtended: false,