mcdev 4.2.1 → 4.3.1

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 (98) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +3 -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 +702 -284
  9. package/lib/Deployer.js +21 -15
  10. package/lib/Retriever.js +41 -34
  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 +36 -48
  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 +40 -39
  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 +743 -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 +4 -3
  58. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +4 -3
  59. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +4 -3
  60. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +10 -2
  61. package/lib/util/auth.js +15 -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 +173 -11
  66. package/package.json +23 -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 +30 -14
  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/key_0b76dccf-594c-b6dc-1acf-10c4493dcb84/get-response.json +219 -0
  87. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +280 -0
  88. package/test/resources/9999999/interaction/v1/interactions/post-response.json +280 -0
  89. package/test/resources/9999999/interaction/v1/interactions/put-response.json +280 -0
  90. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  91. package/test/resources/9999999/query/post-expected.sql +1 -1
  92. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  93. package/test/resources/9999999/triggeredSendDefinition/retrieve-response.xml +68 -0
  94. package/test/transactionalEmail.test.js +7 -7
  95. package/test/transactionalPush.test.js +7 -7
  96. package/test/transactionalSMS.test.js +7 -7
  97. package/test/utils.js +50 -0
  98. package/types/mcdev.d.js +1 -0
@@ -18,12 +18,11 @@ class List extends MetadataType {
18
18
  *
19
19
  * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
20
20
  * @param {void} [_] unused parameter
21
- * @param {TYPE.BuObject} buObject properties for auth
22
- * @param {void} [___] unused parameter
21
+ * @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, _, buObject, ___, key) {
25
+ static async retrieve(retrieveDir, _, __, key) {
27
26
  /** @type {TYPE.SoapRequestParams} */
28
27
  let requestParams = null;
29
28
  if (key) {
@@ -44,29 +43,31 @@ class List extends MetadataType {
44
43
  },
45
44
  };
46
45
  }
47
- const results = await super.retrieveSOAP(retrieveDir, null, requestParams);
48
- return await this._retrieveParentAllSubs(buObject, results);
46
+ const results = await super.retrieveSOAP(retrieveDir, requestParams);
47
+ return await this._retrieveParentAllSubs(results);
49
48
  }
50
49
  /**
51
50
  * Gets metadata cache with limited fields and does not store value to disk
52
51
  *
53
- * @param {TYPE.BuObject} buObject properties for auth
54
52
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
55
53
  */
56
- static async retrieveForCache(buObject) {
57
- const results = await this.retrieve(null, null, buObject);
54
+ static async retrieveForCache() {
55
+ const results = await this.retrieve();
58
56
  if (!cache.getCache()?.folder) {
59
- Util.logger.debug('folders not cached but required for list');
60
- Util.logger.info(' - Caching dependent Metadata: folder');
61
- Folder.client = this.client;
62
- Folder.properties = this.properties;
63
- const result = await Folder.retrieveForCache(buObject, [
57
+ const subTypeArr = [
64
58
  'list',
65
59
  'mysubs',
66
60
  'suppression_list',
67
61
  'publication',
68
62
  'contextual_suppression_list',
69
- ]);
63
+ ];
64
+ Util.logger.debug('folders not cached but required for list');
65
+ Util.logger.info(' - Caching dependent Metadata: folder');
66
+ Util.logSubtypes(subTypeArr);
67
+ Folder.client = this.client;
68
+ Folder.buObject = this.buObject;
69
+ Folder.properties = this.properties;
70
+ const result = await Folder.retrieveForCache(null, subTypeArr);
70
71
  cache.setMetadata('folder', result.metadata);
71
72
  }
72
73
  for (const metadataEntry in results.metadata) {
@@ -78,27 +79,30 @@ class List extends MetadataType {
78
79
  /**
79
80
  * helper for @link retrieveForCache and @link retrieve
80
81
  *
81
- * @param {TYPE.BuObject} buObject properties for auth
82
+ * @private
82
83
  * @param {TYPE.MetadataTypeMapObj} results metadata from retrieve for current BU
83
84
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
84
85
  */
85
- static async _retrieveParentAllSubs(buObject, results) {
86
- if (buObject.eid !== buObject.mid) {
86
+ static async _retrieveParentAllSubs(results) {
87
+ if (this.buObject.eid !== this.buObject.mid) {
87
88
  // for caching, we want to get the All Subscriber List from the Parent Account
88
89
  Util.logger.debug(' - Checking MasterUnsubscribeBehavior for current BU');
89
90
  /** @type {TYPE.BuObject} */
90
91
  const buObjectParentBu = {
91
- eid: this.properties.credentials[buObject.credential].eid,
92
- mid: this.properties.credentials[buObject.credential].eid,
92
+ eid: this.properties.credentials[this.buObject.credential].eid,
93
+ mid: this.properties.credentials[this.buObject.credential].eid,
93
94
  businessUnit: Util.parentBuName,
94
- credential: buObject.credential,
95
+ credential: this.buObject.credential,
95
96
  };
97
+ const clientBackup = this.client;
98
+ const buObjectBackup = this.buObject;
96
99
  try {
97
100
  this.client = auth.getSDK(buObjectParentBu);
98
101
  } catch (ex) {
99
102
  Util.logger.error(ex.message);
100
103
  return;
101
104
  }
105
+ this.buObject = buObjectParentBu;
102
106
  const buResult = await this.client.soap.retrieve(
103
107
  'BusinessUnit',
104
108
  ['MasterUnsubscribeBehavior'],
@@ -107,7 +111,7 @@ class List extends MetadataType {
107
111
  filter: {
108
112
  leftOperand: 'ID',
109
113
  operator: 'equals',
110
- rightOperand: this.properties.credentials[buObject.credential].eid,
114
+ rightOperand: this.properties.credentials[this.buObject.credential].eid,
111
115
  },
112
116
  }
113
117
  );
@@ -117,13 +121,8 @@ class List extends MetadataType {
117
121
  Util.logger.info(
118
122
  ' - Caching dependent Metadata: All Subscriber list (on _ParentBU_)'
119
123
  );
120
- const metadataParentBu = await this.retrieve(
121
- null,
122
- null,
123
- buObjectParentBu,
124
- null,
125
- 'All Subscribers'
126
- );
124
+ // do not use retrieveForCache here because (a) it does not support key-filtering and (b) it would cache folders on top which we do not need for the global all subscriber list
125
+ const metadataParentBu = await this.retrieve(null, null, null, 'All Subscribers');
127
126
  // manually set folder path of parent's All Subscriber List to avoid retrieving folders
128
127
  for (const key of Object.keys(metadataParentBu.metadata)) {
129
128
  metadataParentBu.metadata[key].r__folder_Path = 'my subscribers';
@@ -136,16 +135,21 @@ class List extends MetadataType {
136
135
  }
137
136
  }
138
137
 
138
+ // revert to current default
139
+ this.client = clientBackup;
140
+ this.buObject = buObjectBackup;
141
+
139
142
  // make sure to overwrite parent bu DEs with local ones
140
143
  return {
141
144
  metadata: { ...metadataParentBu.metadata, ...results.metadata },
142
145
  type: results.type,
143
146
  };
144
147
  } else if (masterUnsubscribeBehavior === 'BUSINESS_UNIT_ONLY') {
148
+ // revert client to current default
149
+ this.client = clientBackup;
150
+
145
151
  Util.logger.debug(' - BU uses own All Subscriber List');
146
152
  }
147
- // revert client to current default
148
- this.client = auth.getSDK(this.buObject);
149
153
  }
150
154
  return results;
151
155
  }
@@ -153,12 +157,11 @@ class List extends MetadataType {
153
157
  /**
154
158
  * Delete a metadata item from the specified business unit
155
159
  *
156
- * @param {TYPE.BuObject} buObject references credentials
157
160
  * @param {string} customerKey Identifier of data extension
158
161
  * @returns {Promise.<boolean>} deletion success status
159
162
  */
160
- static deleteByKey(buObject, customerKey) {
161
- return super.deleteByKeySOAP(buObject, customerKey, false);
163
+ static deleteByKey(customerKey) {
164
+ return super.deleteByKeySOAP(customerKey, false);
162
165
  }
163
166
 
164
167
  /**