mcdev 4.2.1 → 4.3.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 (95) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/.github/PULL_REQUEST_TEMPLATE.md +1 -2
  3. package/.github/pr-labeler.yml +3 -0
  4. package/.github/workflows/close_issues_on_merge.yml +18 -0
  5. package/.github/workflows/pr-labeler.yml +19 -0
  6. package/LICENSE +1 -1
  7. package/README.md +1 -1
  8. package/docs/dist/documentation.md +700 -281
  9. package/lib/Deployer.js +21 -15
  10. package/lib/Retriever.js +23 -19
  11. package/lib/cli.js +36 -6
  12. package/lib/index.js +56 -10
  13. package/lib/metadataTypes/AccountUser.js +17 -23
  14. package/lib/metadataTypes/Asset.js +28 -21
  15. package/lib/metadataTypes/AttributeGroup.js +1 -2
  16. package/lib/metadataTypes/Automation.js +75 -37
  17. package/lib/metadataTypes/Campaign.js +4 -3
  18. package/lib/metadataTypes/ContentArea.js +2 -3
  19. package/lib/metadataTypes/DataExtension.js +56 -47
  20. package/lib/metadataTypes/DataExtensionField.js +9 -12
  21. package/lib/metadataTypes/DataExtensionTemplate.js +2 -3
  22. package/lib/metadataTypes/DataExtract.js +1 -2
  23. package/lib/metadataTypes/DataExtractType.js +1 -2
  24. package/lib/metadataTypes/Discovery.js +3 -4
  25. package/lib/metadataTypes/Email.js +20 -6
  26. package/lib/metadataTypes/EmailSendDefinition.js +5 -8
  27. package/lib/metadataTypes/EventDefinition.js +29 -2
  28. package/lib/metadataTypes/FileTransfer.js +1 -2
  29. package/lib/metadataTypes/Filter.js +1 -2
  30. package/lib/metadataTypes/Folder.js +12 -14
  31. package/lib/metadataTypes/FtpLocation.js +1 -2
  32. package/lib/metadataTypes/ImportFile.js +1 -2
  33. package/lib/metadataTypes/Interaction.js +678 -12
  34. package/lib/metadataTypes/List.js +36 -33
  35. package/lib/metadataTypes/MetadataType.js +170 -124
  36. package/lib/metadataTypes/MobileCode.js +1 -2
  37. package/lib/metadataTypes/MobileKeyword.js +1 -2
  38. package/lib/metadataTypes/Query.js +15 -6
  39. package/lib/metadataTypes/Role.js +10 -11
  40. package/lib/metadataTypes/Script.js +2 -5
  41. package/lib/metadataTypes/SetDefinition.js +1 -2
  42. package/lib/metadataTypes/TransactionalMessage.js +25 -32
  43. package/lib/metadataTypes/TransactionalSMS.js +3 -4
  44. package/lib/metadataTypes/TriggeredSendDefinition.js +232 -56
  45. package/lib/metadataTypes/definitions/Asset.definition.js +1 -1
  46. package/lib/metadataTypes/definitions/Automation.definition.js +1 -1
  47. package/lib/metadataTypes/definitions/DataExtension.definition.js +10 -1
  48. package/lib/metadataTypes/definitions/Email.definition.js +1 -1
  49. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +1 -1
  50. package/lib/metadataTypes/definitions/EventDefinition.definition.js +40 -1
  51. package/lib/metadataTypes/definitions/Folder.definition.js +31 -0
  52. package/lib/metadataTypes/definitions/ImportFile.definition.js +1 -1
  53. package/lib/metadataTypes/definitions/Interaction.definition.js +47 -26
  54. package/lib/metadataTypes/definitions/List.definition.js +1 -1
  55. package/lib/metadataTypes/definitions/Query.definition.js +1 -1
  56. package/lib/metadataTypes/definitions/Script.definition.js +1 -1
  57. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -1
  58. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +2 -1
  59. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +2 -1
  60. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +10 -2
  61. package/lib/util/auth.js +10 -2
  62. package/lib/util/cli.js +4 -1
  63. package/lib/util/file.js +7 -3
  64. package/lib/util/init.js +62 -0
  65. package/lib/util/util.js +131 -11
  66. package/package.json +22 -9
  67. package/test/dataExtension.test.js +10 -10
  68. package/test/interaction.test.js +123 -0
  69. package/test/mockRoot/.mcdevrc.json +1 -1
  70. package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +266 -0
  71. package/test/mockRoot/deploy/testInstance/testBU/interaction/testNew_interaction.interaction-meta.json +266 -0
  72. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +0 -3
  73. package/test/query.test.js +8 -8
  74. package/test/resourceFactory.js +12 -7
  75. package/test/resources/1111111/dataExtension/retrieve-response.xml +26 -0
  76. package/test/resources/9999999/data/v1/customobjectdata/key/childBU_dataextension_test/rowset/get-response.json +13 -0
  77. package/test/resources/9999999/dataFolder/retrieve-response.xml +22 -0
  78. package/test/resources/9999999/eventDefinition/get-expected.json +34 -0
  79. package/test/resources/9999999/interaction/build-expected.json +260 -0
  80. package/test/resources/9999999/interaction/get-expected.json +264 -0
  81. package/test/resources/9999999/interaction/post-expected.json +264 -0
  82. package/test/resources/9999999/interaction/put-expected.json +264 -0
  83. package/test/resources/9999999/interaction/template-expected.json +260 -0
  84. package/test/resources/9999999/interaction/v1/EventDefinitions/get-response.json +43 -0
  85. package/test/resources/9999999/interaction/v1/interactions/get-response.json +222 -3
  86. package/test/resources/9999999/interaction/v1/interactions/post-response.json +280 -0
  87. package/test/resources/9999999/interaction/v1/interactions/put-response.json +280 -0
  88. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  89. package/test/resources/9999999/query/post-expected.sql +1 -1
  90. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  91. package/test/transactionalEmail.test.js +7 -7
  92. package/test/transactionalPush.test.js +7 -7
  93. package/test/transactionalSMS.test.js +7 -7
  94. package/test/utils.js +50 -0
  95. package/types/mcdev.d.js +1 -0
@@ -16,14 +16,10 @@ class Email extends MetadataType {
16
16
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
17
17
  * @param {void} [_] unused parameter
18
18
  * @param {void} [__] unused parameter
19
- * @param {void} [___] unused parameter
20
19
  * @param {string} [key] customer key of single item to retrieve
21
20
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
22
21
  */
23
- static retrieve(retrieveDir, _, __, ___, key) {
24
- Util.logger.warn(
25
- ' - Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
26
- );
22
+ static retrieve(retrieveDir, _, __, key) {
27
23
  /** @type {TYPE.SoapRequestParams} */
28
24
  let requestParams = null;
29
25
  if (key) {
@@ -36,7 +32,25 @@ class Email extends MetadataType {
36
32
  };
37
33
  }
38
34
  // !dont activate `await File.initPrettier('html');` as we only want to retrieve for migration and formatting might mess with the outcome
39
- return super.retrieveSOAP(retrieveDir, null, requestParams);
35
+ return super.retrieveSOAP(retrieveDir, requestParams);
36
+ }
37
+ /**
38
+ * Helper for writing Metadata to disk, used for Retrieve and deploy
39
+ *
40
+ * @param {TYPE.MetadataTypeMap} results metadata results from deploy
41
+ * @param {string} retrieveDir directory where metadata should be stored after deploy/retrieve
42
+ * @param {string} [overrideType] for use when there is a subtype (such as folder-queries)
43
+ * @param {TYPE.TemplateMap} [templateVariables] variables to be replaced in the metadata
44
+ * @returns {Promise.<TYPE.MetadataTypeMap>} Promise of saved metadata
45
+ */
46
+ static async saveResults(results, retrieveDir, overrideType, templateVariables) {
47
+ if (Object.keys(results).length) {
48
+ // only execute the following if records were found
49
+ Util.logger.warn(
50
+ ' - Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
51
+ );
52
+ }
53
+ return super.saveResults(results, retrieveDir, overrideType, templateVariables);
40
54
  }
41
55
  /**
42
56
  * manages post retrieve steps
@@ -17,11 +17,10 @@ class EmailSendDefinition extends MetadataType {
17
17
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
18
18
  * @param {void} [_] unused parameter
19
19
  * @param {void} [__] unused parameter
20
- * @param {void} [___] unused parameter
21
20
  * @param {string} [key] customer key of single item to retrieve
22
21
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
23
22
  */
24
- static retrieve(retrieveDir, _, __, ___, key) {
23
+ static retrieve(retrieveDir, _, __, key) {
25
24
  /** @type {TYPE.SoapRequestParams} */
26
25
  let requestParams = {
27
26
  filter: {
@@ -53,7 +52,7 @@ class EmailSendDefinition extends MetadataType {
53
52
  },
54
53
  };
55
54
  }
56
- return super.retrieveSOAP(retrieveDir, null, requestParams);
55
+ return super.retrieveSOAP(retrieveDir, requestParams);
57
56
  }
58
57
 
59
58
  /**
@@ -79,12 +78,11 @@ class EmailSendDefinition extends MetadataType {
79
78
  /**
80
79
  * Delete a metadata item from the specified business unit
81
80
  *
82
- * @param {TYPE.BuObject} buObject references credentials
83
81
  * @param {string} customerKey Identifier of data extension
84
82
  * @returns {Promise.<boolean>} deletion success status
85
83
  */
86
- static deleteByKey(buObject, customerKey) {
87
- return super.deleteByKeySOAP(buObject, customerKey, false);
84
+ static deleteByKey(customerKey) {
85
+ return super.deleteByKeySOAP(customerKey, false);
88
86
  }
89
87
 
90
88
  /**
@@ -97,8 +95,7 @@ class EmailSendDefinition extends MetadataType {
97
95
  // re-add IsPlatformObject, required for visibility
98
96
  metadata.IsPlatformObject = false;
99
97
  // folder
100
- metadata.CategoryID = cache.searchForField('folder', metadata.r__folder_Path, 'Path', 'ID');
101
- delete metadata.r__folder_Path;
98
+ super.setFolderId(metadata);
102
99
  // email
103
100
  metadata.Email = {};
104
101
  if (metadata.r__email_Name) {
@@ -20,11 +20,11 @@ class EventDefinition extends MetadataType {
20
20
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
21
21
  * @param {void} [_] unused parameter
22
22
  * @param {void} [__] unused parameter
23
- * @param {void} [___] unused parameter
24
23
  * @param {string} [key] customer key of single item to retrieve
25
24
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
26
25
  */
27
- static retrieve(retrieveDir, _, __, ___, key) {
26
+ static retrieve(retrieveDir, _, __, key) {
27
+ Util.logBeta(this.definition.type);
28
28
  return super.retrieveREST(
29
29
  retrieveDir,
30
30
  `/interaction/v1/EventDefinitions${
@@ -54,6 +54,7 @@ class EventDefinition extends MetadataType {
54
54
  * @returns {Promise.<TYPE.MetadataTypeItemObj>} Promise of metadata
55
55
  */
56
56
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
57
+ Util.logBeta(this.definition.type);
57
58
  const res = await this.client.rest.get(
58
59
  '/interaction/v1/EventDefinitions?name=' + encodeURIComponent(name)
59
60
  );
@@ -116,6 +117,32 @@ class EventDefinition extends MetadataType {
116
117
  this.keepRetrieveFields(val);
117
118
  return val;
118
119
  }
120
+ /**
121
+ * Delete a metadata item from the specified business unit
122
+ *
123
+ * @param {string} key Identifier of item
124
+ * @returns {Promise.<boolean>} deletion success status
125
+ */
126
+ static deleteByKey(key) {
127
+ Util.logBeta(this.definition.type);
128
+ return super.deleteByKeyREST(
129
+ '/interaction/v1/eventDefinitions/key:' + encodeURIComponent(key),
130
+ key,
131
+ false
132
+ );
133
+ }
134
+ /**
135
+ * Deploys metadata - merely kept here to be able to print {@link Util.logBeta} once per deploy
136
+ *
137
+ * @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
138
+ * @param {string} deployDir directory where deploy metadata are saved
139
+ * @param {string} retrieveDir directory where metadata after deploy should be saved
140
+ * @returns {Promise.<TYPE.MetadataTypeMap>} Promise of keyField => metadata map
141
+ */
142
+ static async deploy(metadata, deployDir, retrieveDir) {
143
+ Util.logBeta(this.definition.type);
144
+ return super.deploy(metadata, deployDir, retrieveDir);
145
+ }
119
146
 
120
147
  /**
121
148
  * Creates a single Event Definition
@@ -19,11 +19,10 @@ class FileTransfer extends MetadataType {
19
19
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
20
20
  * @param {void} [_] unused parameter
21
21
  * @param {void} [__] unused parameter
22
- * @param {void} [___] unused parameter
23
22
  * @param {string} [key] customer key of single item to retrieve
24
23
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
25
24
  */
26
- static async retrieve(retrieveDir, _, __, ___, key) {
25
+ static async retrieve(retrieveDir, _, __, key) {
27
26
  return super.retrieveREST(retrieveDir, '/automation/v1/filetransfers/', null, null, key);
28
27
  }
29
28
  /**
@@ -18,11 +18,10 @@ class Filter extends MetadataType {
18
18
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
19
19
  * @param {void} [_] unused parameter
20
20
  * @param {void} [__] unused parameter
21
- * @param {void} [___] unused parameter
22
21
  * @param {string} [key] customer key of single item to retrieve
23
22
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
24
23
  */
25
- static async retrieve(retrieveDir, _, __, ___, key) {
24
+ static async retrieve(retrieveDir, _, __, key) {
26
25
  return super.retrieveREST(retrieveDir, '/automation/v1/filters/', null, null, key);
27
26
  }
28
27
  }
@@ -18,21 +18,19 @@ class Folder extends MetadataType {
18
18
  *
19
19
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
20
20
  * @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
21
- * @param {TYPE.BuObject} buObject properties for auth
22
- * @param {void} [___] unused parameter
21
+ * @param {string[]} [subTypeArr] content type of folder
23
22
  * @param {string} [key] customer key of single item to retrieve
24
- * @param {string[]} [contentTypeList] content type of folder
25
23
  * @returns {Promise} Promise
26
24
  */
27
- static async retrieve(retrieveDir, additionalFields, buObject, ___, key, contentTypeList) {
25
+ static async retrieve(retrieveDir, additionalFields, subTypeArr, key) {
28
26
  if (key) {
29
27
  Util.logger.error(`Folder.retrieve() does not support key parameter`);
30
28
  }
31
- const queryAllFolders = await this.retrieveHelper(additionalFields, true, contentTypeList);
29
+ const queryAllFolders = await this.retrieveHelper(additionalFields, true, subTypeArr);
32
30
 
33
- if (buObject.eid !== buObject.mid) {
31
+ if (this.buObject.eid !== this.buObject.mid) {
34
32
  queryAllFolders.push(
35
- ...(await this.retrieveHelper(additionalFields, false, contentTypeList))
33
+ ...(await this.retrieveHelper(additionalFields, false, subTypeArr))
36
34
  );
37
35
  }
38
36
  const sortPairs = toposort(queryAllFolders.map((a) => [a.ParentFolder.ID, a.ID]));
@@ -45,7 +43,7 @@ class Folder extends MetadataType {
45
43
  }
46
44
  // by default folders do not have an external key, we set this to ID plus EID as this will be unique
47
45
  else if (!val.CustomerKey) {
48
- val.CustomerKey = [buObject.eid, val.ID].join('-');
46
+ val.CustomerKey = [this.buObject.eid, val.ID].join('-');
49
47
  }
50
48
  // ensure name is a string and not a number (SFMC-SDK workaround)
51
49
  val.Name = val.Name + '';
@@ -108,7 +106,7 @@ class Folder extends MetadataType {
108
106
  // remove keys which are listed in other BUs and skip root
109
107
  if (
110
108
  idMap[id].Client?.ID &&
111
- (buObject.mid == idMap[id].Client.ID ||
109
+ (this.buObject.mid == idMap[id].Client.ID ||
112
110
  this.definition.folderTypesFromParent.includes(
113
111
  idMap[id].ContentType.toLowerCase()
114
112
  ))
@@ -141,7 +139,7 @@ class Folder extends MetadataType {
141
139
  }
142
140
  }
143
141
  if (retrieveDir) {
144
- const savedMetadata = await this.saveResults(metadata, retrieveDir, buObject.mid);
142
+ const savedMetadata = await this.saveResults(metadata, retrieveDir, this.buObject.mid);
145
143
  Util.logger.info(
146
144
  `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})`
147
145
  );
@@ -152,12 +150,12 @@ class Folder extends MetadataType {
152
150
  /**
153
151
  * Retrieves folder metadata for caching
154
152
  *
155
- * @param {TYPE.BuObject} buObject properties for auth
156
- * @param {string[]} [contentTypeList] content type of folder
153
+ * @param {void} _ unused
154
+ * @param {string[]} [subTypeArr] content type of folder
157
155
  * @returns {Promise} Promise
158
156
  */
159
- static retrieveForCache(buObject, contentTypeList) {
160
- return this.retrieve(null, null, buObject, null, null, contentTypeList);
157
+ static retrieveForCache(_, subTypeArr) {
158
+ return this.retrieve(null, null, subTypeArr, null);
161
159
  }
162
160
 
163
161
  /**
@@ -16,11 +16,10 @@ class FtpLocation extends MetadataType {
16
16
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
17
17
  * @param {void} [_] unused parameter
18
18
  * @param {void} [__] unused parameter
19
- * @param {void} [___] unused parameter
20
19
  * @param {string} [key] customer key of single item to retrieve
21
20
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
22
21
  */
23
- static retrieve(retrieveDir, _, __, ___, key) {
22
+ static retrieve(retrieveDir, _, __, key) {
24
23
  return super.retrieveREST(retrieveDir, '/automation/v1/ftplocations/', null, null, key);
25
24
  }
26
25
 
@@ -20,11 +20,10 @@ class ImportFile extends MetadataType {
20
20
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
21
21
  * @param {void} [_] unused parameter
22
22
  * @param {void} [__] unused parameter
23
- * @param {void} [___] unused parameter
24
23
  * @param {string} [key] customer key of single item to retrieve
25
24
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
26
25
  */
27
- static retrieve(retrieveDir, _, __, ___, key) {
26
+ static retrieve(retrieveDir, _, __, key) {
28
27
  return super.retrieveREST(retrieveDir, '/automation/v1/imports/', null, null, key);
29
28
  }
30
29