mcdev 3.1.3 → 4.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 (134) hide show
  1. package/.eslintrc.json +67 -7
  2. package/.github/ISSUE_TEMPLATE/bug.yml +2 -1
  3. package/.github/PULL_REQUEST_TEMPLATE.md +5 -3
  4. package/.github/dependabot.yml +14 -0
  5. package/.github/workflows/code-analysis.yml +57 -0
  6. package/.husky/commit-msg +10 -0
  7. package/.husky/post-checkout +5 -0
  8. package/.husky/pre-commit +2 -1
  9. package/.prettierrc +8 -0
  10. package/.vscode/settings.json +1 -1
  11. package/LICENSE +2 -2
  12. package/README.md +134 -45
  13. package/boilerplate/config.json +5 -11
  14. package/boilerplate/files/.prettierrc +8 -0
  15. package/boilerplate/files/.vscode/extensions.json +0 -1
  16. package/boilerplate/files/.vscode/settings.json +28 -2
  17. package/boilerplate/files/README.md +2 -2
  18. package/boilerplate/forcedUpdates.json +10 -0
  19. package/boilerplate/npm-dependencies.json +5 -5
  20. package/docs/dist/documentation.md +2795 -1724
  21. package/jsconfig.json +1 -1
  22. package/lib/Builder.js +166 -75
  23. package/lib/Deployer.js +244 -96
  24. package/lib/MetadataTypeDefinitions.js +2 -0
  25. package/lib/MetadataTypeInfo.js +2 -0
  26. package/lib/Retriever.js +61 -84
  27. package/lib/cli.js +116 -11
  28. package/lib/index.js +241 -561
  29. package/lib/metadataTypes/AccountUser.js +101 -95
  30. package/lib/metadataTypes/Asset.js +677 -248
  31. package/lib/metadataTypes/AttributeGroup.js +23 -12
  32. package/lib/metadataTypes/Automation.js +451 -354
  33. package/lib/metadataTypes/Campaign.js +33 -93
  34. package/lib/metadataTypes/ContentArea.js +31 -11
  35. package/lib/metadataTypes/DataExtension.js +387 -372
  36. package/lib/metadataTypes/DataExtensionField.js +131 -54
  37. package/lib/metadataTypes/DataExtensionTemplate.js +22 -4
  38. package/lib/metadataTypes/DataExtract.js +61 -48
  39. package/lib/metadataTypes/DataExtractType.js +14 -8
  40. package/lib/metadataTypes/Discovery.js +21 -16
  41. package/lib/metadataTypes/Email.js +32 -12
  42. package/lib/metadataTypes/EmailSendDefinition.js +85 -80
  43. package/lib/metadataTypes/EventDefinition.js +61 -43
  44. package/lib/metadataTypes/FileTransfer.js +72 -52
  45. package/lib/metadataTypes/Filter.js +11 -4
  46. package/lib/metadataTypes/Folder.js +149 -117
  47. package/lib/metadataTypes/FtpLocation.js +14 -8
  48. package/lib/metadataTypes/ImportFile.js +61 -64
  49. package/lib/metadataTypes/Interaction.js +19 -4
  50. package/lib/metadataTypes/List.js +54 -13
  51. package/lib/metadataTypes/MetadataType.js +668 -454
  52. package/lib/metadataTypes/MobileCode.js +46 -0
  53. package/lib/metadataTypes/MobileKeyword.js +114 -0
  54. package/lib/metadataTypes/Query.js +204 -103
  55. package/lib/metadataTypes/Role.js +76 -61
  56. package/lib/metadataTypes/Script.js +145 -81
  57. package/lib/metadataTypes/SetDefinition.js +20 -8
  58. package/lib/metadataTypes/TriggeredSendDefinition.js +78 -58
  59. package/lib/metadataTypes/definitions/Asset.definition.js +21 -10
  60. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +12 -0
  61. package/lib/metadataTypes/definitions/Automation.definition.js +10 -5
  62. package/lib/metadataTypes/definitions/Campaign.definition.js +44 -1
  63. package/lib/metadataTypes/definitions/DataExtension.definition.js +4 -0
  64. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +6 -0
  65. package/lib/metadataTypes/definitions/DataExtract.definition.js +18 -14
  66. package/lib/metadataTypes/definitions/Discovery.definition.js +12 -0
  67. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +4 -0
  68. package/lib/metadataTypes/definitions/EventDefinition.definition.js +22 -0
  69. package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
  70. package/lib/metadataTypes/definitions/Filter.definition.js +4 -0
  71. package/lib/metadataTypes/definitions/Folder.definition.js +6 -0
  72. package/lib/metadataTypes/definitions/FtpLocation.definition.js +4 -0
  73. package/lib/metadataTypes/definitions/ImportFile.definition.js +10 -5
  74. package/lib/metadataTypes/definitions/Interaction.definition.js +4 -0
  75. package/lib/metadataTypes/definitions/MobileCode.definition.js +163 -0
  76. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +253 -0
  77. package/lib/metadataTypes/definitions/Query.definition.js +4 -0
  78. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  79. package/lib/metadataTypes/definitions/Script.definition.js +4 -0
  80. package/lib/metadataTypes/definitions/SetDefinition.definition.js +28 -0
  81. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +4 -0
  82. package/lib/retrieveChangelog.js +7 -6
  83. package/lib/util/auth.js +117 -0
  84. package/lib/util/businessUnit.js +55 -66
  85. package/lib/util/cache.js +194 -0
  86. package/lib/util/cli.js +90 -116
  87. package/lib/util/config.js +302 -0
  88. package/lib/util/devops.js +240 -50
  89. package/lib/util/file.js +120 -191
  90. package/lib/util/init.config.js +195 -69
  91. package/lib/util/init.git.js +45 -50
  92. package/lib/util/init.js +72 -59
  93. package/lib/util/init.npm.js +48 -39
  94. package/lib/util/util.js +280 -564
  95. package/package.json +44 -33
  96. package/test/dataExtension.test.js +152 -0
  97. package/test/mockRoot/.mcdev-auth.json +8 -0
  98. package/test/mockRoot/.mcdevrc.json +67 -0
  99. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json +39 -0
  100. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testDataExtension.dataExtension-meta.json +23 -0
  101. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +11 -0
  102. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql +4 -0
  103. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json +11 -0
  104. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql +4 -0
  105. package/test/query.test.js +149 -0
  106. package/test/resourceFactory.js +142 -0
  107. package/test/resources/1111111/dataFolder/retrieve-response.xml +43 -0
  108. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +18 -0
  109. package/test/resources/9999999/automation/v1/queries/get-response.json +24 -0
  110. package/test/resources/9999999/automation/v1/queries/post-response.json +18 -0
  111. package/test/resources/9999999/dataExtension/build-expected.json +51 -0
  112. package/test/resources/9999999/dataExtension/create-expected.json +23 -0
  113. package/test/resources/9999999/dataExtension/create-response.xml +54 -0
  114. package/test/resources/9999999/dataExtension/retrieve-expected.json +51 -0
  115. package/test/resources/9999999/dataExtension/retrieve-response.xml +47 -0
  116. package/test/resources/9999999/dataExtension/template-expected.json +51 -0
  117. package/test/resources/9999999/dataExtension/update-expected.json +55 -0
  118. package/test/resources/9999999/dataExtension/update-response.xml +52 -0
  119. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +93 -0
  120. package/test/resources/9999999/dataExtensionTemplate/retrieve-response.xml +303 -0
  121. package/test/resources/9999999/dataFolder/retrieve-response.xml +65 -0
  122. package/test/resources/9999999/query/build-expected.json +8 -0
  123. package/test/resources/9999999/query/get-expected.json +11 -0
  124. package/test/resources/9999999/query/patch-expected.json +11 -0
  125. package/test/resources/9999999/query/post-expected.json +11 -0
  126. package/test/resources/9999999/query/template-expected.json +8 -0
  127. package/test/resources/auth.json +32 -0
  128. package/test/resources/rest404-response.json +5 -0
  129. package/test/resources/retrieve-response.xml +21 -0
  130. package/test/utils.js +107 -0
  131. package/types/mcdev.d.js +301 -0
  132. package/CHANGELOG.md +0 -126
  133. package/PULL_REQUEST_TEMPLATE.md +0 -19
  134. package/test/util/file.js +0 -51
@@ -1,32 +1,44 @@
1
1
  'use strict';
2
2
 
3
+ const TYPE = require('../../types/mcdev.d');
3
4
  const MetadataType = require('./MetadataType');
4
5
 
5
6
  /**
6
7
  * SetDefinition MetadataType
8
+ *
7
9
  * @augments MetadataType
8
10
  */
9
11
  class SetDefinition extends MetadataType {
10
12
  /**
11
13
  * Retrieves Metadata of schema set Definitions.
12
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
13
- * @returns {Promise} Promise
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 {void} [___] unused parameter
19
+ * @param {string} [key] customer key of single item to retrieve
20
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
14
21
  */
15
- static retrieve(retrieveDir) {
16
- return super.retrieveREST(retrieveDir, '/hub/v1/contacts/schema/setDefinitions', null);
22
+ static retrieve(retrieveDir, _, __, ___, key) {
23
+ return super.retrieveREST(
24
+ retrieveDir,
25
+ '/hub/v1/contacts/schema/setDefinitions',
26
+ null,
27
+ null,
28
+ key
29
+ );
17
30
  }
18
31
  /**
19
32
  * Retrieves Metadata of schema set definitions for caching.
20
- * @returns {Promise} Promise
33
+ *
34
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
21
35
  */
22
36
  static retrieveForCache() {
23
- return super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions', null);
37
+ return super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions');
24
38
  }
25
39
  }
26
40
 
27
41
  // Assign definition to static attributes
28
42
  SetDefinition.definition = require('../MetadataTypeDefinitions').setDefinition;
29
- SetDefinition.cache = {};
30
- SetDefinition.client = undefined;
31
43
 
32
44
  module.exports = SetDefinition;
@@ -1,20 +1,29 @@
1
1
  'use strict';
2
2
 
3
+ const TYPE = require('../../types/mcdev.d');
3
4
  const MetadataType = require('./MetadataType');
4
5
  const Util = require('../util/util');
6
+ const cache = require('../util/cache');
5
7
 
6
8
  /**
7
9
  * MessageSendActivity MetadataType
10
+ *
8
11
  * @augments MetadataType
9
12
  */
10
13
  class TriggeredSendDefinition extends MetadataType {
11
14
  /**
12
15
  * Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
13
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
14
- * @returns {Promise<Object>} Promise of metadata
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 {void} [___] unused parameter
21
+ * @param {string} [key] customer key of single item to retrieve
22
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
15
23
  */
16
- static retrieve(retrieveDir) {
17
- const options = {
24
+ static retrieve(retrieveDir, _, __, ___, key) {
25
+ /** @type {TYPE.SoapRequestParams} */
26
+ let requestParams = {
18
27
  filter: {
19
28
  leftOperand: {
20
29
  // somehow that parameter controls visible (non deleted?) email send activities
@@ -30,12 +39,28 @@ class TriggeredSendDefinition extends MetadataType {
30
39
  },
31
40
  },
32
41
  };
33
- return super.retrieveSOAPgeneric(retrieveDir, null, options);
42
+ if (key) {
43
+ // move original filter down one level into rightOperand and add key filter into leftOperand
44
+ requestParams = {
45
+ filter: {
46
+ leftOperand: {
47
+ leftOperand: 'CustomerKey',
48
+ operator: 'equals',
49
+ rightOperand: key,
50
+ },
51
+ operator: 'AND',
52
+ rightOperand: requestParams.filter,
53
+ },
54
+ };
55
+ }
56
+
57
+ return super.retrieveSOAP(retrieveDir, null, requestParams);
34
58
  }
35
59
 
36
60
  /**
37
61
  * Create a single TSD.
38
- * @param {Object} metadata single metadata entry
62
+ *
63
+ * @param {TYPE.MetadataTypeItem} metadata single metadata entry
39
64
  * @returns {Promise} Promise
40
65
  */
41
66
  static create(metadata) {
@@ -44,7 +69,8 @@ class TriggeredSendDefinition extends MetadataType {
44
69
 
45
70
  /**
46
71
  * Updates a single TSD.
47
- * @param {Object} metadata single metadata entry
72
+ *
73
+ * @param {TYPE.MetadataTypeItem} metadata single metadata entry
48
74
  * @returns {Promise} Promise
49
75
  */
50
76
  static update(metadata) {
@@ -52,29 +78,41 @@ class TriggeredSendDefinition extends MetadataType {
52
78
  // * this should be done manually to not accidentally purge production queues
53
79
  return super.updateSOAP(metadata);
54
80
  }
81
+
82
+ /**
83
+ * Delete a metadata item from the specified business unit
84
+ *
85
+ * @param {TYPE.BuObject} buObject references credentials
86
+ * @param {string} customerKey Identifier of data extension
87
+ * @returns {Promise.<boolean>} deletion success status
88
+ */
89
+ static deleteByKey(buObject, customerKey) {
90
+ return super.deleteByKeySOAP(buObject, customerKey, false);
91
+ }
92
+
55
93
  /**
56
94
  * checks if the current metadata entry should be saved on retrieve or not
95
+ *
57
96
  * @static
58
- * @param {Object} metadataEntry metadata entry
97
+ * @param {object} metadataEntry metadata entry
59
98
  * @returns {boolean} if false, do not save
60
99
  * @memberof MetadataType
61
100
  */
62
101
  static isFiltered(metadataEntry) {
63
102
  try {
64
103
  // get folder path to be able to filter journey-created TSDs
65
- const folderPath = Util.getFromCache(
66
- this.cache,
104
+ const folderPath = cache.searchForField(
67
105
  'folder',
68
106
  metadataEntry.CategoryID,
69
107
  'ID',
70
108
  'Path'
71
109
  );
72
110
 
73
- if (folderPath && folderPath.startsWith('Journey Builder Sends/')) {
111
+ if (folderPath?.startsWith('Journey Builder Sends/')) {
74
112
  // filter out any triggered sends that were auto-created by journeys
75
113
  return true;
76
114
  }
77
- } catch (ex) {
115
+ } catch {
78
116
  // handle it in parseMetadata()
79
117
  }
80
118
  return false;
@@ -82,24 +120,25 @@ class TriggeredSendDefinition extends MetadataType {
82
120
 
83
121
  /**
84
122
  * manages post retrieve steps
85
- * @param {Object} metadata a single query
86
- * @returns {Object[]} Array with one metadata object and one query string
123
+ *
124
+ * @param {TYPE.MetadataTypeItem} metadata a single query
125
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
87
126
  */
88
127
  static postRetrieveTasks(metadata) {
89
128
  return this.parseMetadata(metadata);
90
129
  }
91
130
  /**
92
131
  * parses retrieved Metadata before saving
93
- * @param {Object} metadata a single query activity definition
94
- * @returns {Array} Array with one metadata object and one sql string
132
+ *
133
+ * @param {TYPE.MetadataTypeItem} metadata a single query activity definition
134
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
95
135
  */
96
136
  static parseMetadata(metadata) {
97
137
  // remove IsPlatformObject, always has to be 'false'
98
138
  delete metadata.IsPlatformObject;
99
139
  // folder
100
140
  try {
101
- metadata.r__folder_Path = Util.getFromCache(
102
- this.cache,
141
+ metadata.r__folder_Path = cache.searchForField(
103
142
  'folder',
104
143
  metadata.CategoryID,
105
144
  'ID',
@@ -108,34 +147,26 @@ class TriggeredSendDefinition extends MetadataType {
108
147
  delete metadata.CategoryID;
109
148
  } catch (ex) {
110
149
  Util.logger.warn(
111
- `Triggered Send '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
150
+ ` - Triggered Send '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
112
151
  );
113
152
  }
114
153
  // email
115
154
  try {
116
155
  // classic
117
- const classicEmail = Util.getFromCache(
118
- this.cache,
119
- 'email',
120
- metadata.Email.ID,
121
- 'ID',
122
- 'Name'
123
- );
156
+ const classicEmail = cache.searchForField('email', metadata.Email.ID, 'ID', 'Name');
124
157
  metadata.r__email_Name = classicEmail;
125
158
  delete metadata.Email;
126
- } catch (ex) {
159
+ } catch {
127
160
  try {
128
161
  // content builder
129
- const contentBuilderEmailName = Util.getFromCache(
130
- this.cache,
162
+ const contentBuilderEmailName = cache.searchForField(
131
163
  'asset',
132
164
  metadata.Email.ID,
133
165
  'legacyData.legacyId',
134
166
  'name'
135
167
  );
136
168
  metadata.r__assetMessage_Name = contentBuilderEmailName;
137
- const contentBuilderEmailKey = Util.getFromCache(
138
- this.cache,
169
+ const contentBuilderEmailKey = cache.searchForField(
139
170
  'asset',
140
171
  metadata.Email.ID,
141
172
  'legacyData.legacyId',
@@ -143,23 +174,19 @@ class TriggeredSendDefinition extends MetadataType {
143
174
  );
144
175
  metadata.r__assetMessage_Key = contentBuilderEmailKey;
145
176
  delete metadata.Email;
146
- } catch (ex) {
177
+ } catch {
147
178
  Util.logger.warn(
148
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
179
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
149
180
  );
150
181
  }
151
182
  }
152
183
  // List
153
184
  try {
154
- metadata.r__list_PathName = Util.getListPathNameFromCache(
155
- this.cache,
156
- metadata.List.ID,
157
- 'ID'
158
- );
185
+ metadata.r__list_PathName = cache.getListPathName(metadata.List.ID, 'ID');
159
186
  delete metadata.List;
160
187
  } catch (ex) {
161
188
  Util.logger.warn(
162
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
189
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
163
190
  );
164
191
  }
165
192
 
@@ -167,15 +194,15 @@ class TriggeredSendDefinition extends MetadataType {
167
194
  }
168
195
  /**
169
196
  * prepares a TSD for deployment
170
- * @param {Object} metadata of a single TSD
171
- * @returns {Object} metadata object
197
+ *
198
+ * @param {TYPE.MetadataTypeItem} metadata of a single TSD
199
+ * @returns {TYPE.MetadataTypeItem} metadata object
172
200
  */
173
201
  static async preDeployTasks(metadata) {
174
- const cachedVersion = this.cache[this.definition.type][metadata.CustomerKey];
202
+ const cachedVersion = cache.getByKey(this.definition.type, metadata.CustomerKey);
175
203
  if (
176
- cachedVersion &&
177
- cachedVersion.TriggeredSendStatus === 'Active' &&
178
- cachedVersion.TriggeredSendStatus === metadata.TriggeredSendStatus
204
+ cachedVersion?.TriggeredSendStatus === 'Active' &&
205
+ cachedVersion?.TriggeredSendStatus === metadata.TriggeredSendStatus
179
206
  ) {
180
207
  throw new Error(
181
208
  `Please pause the Triggered Send '${metadata.Name}' before updating it. You may do so via GUI; or via Accenture SFMC DevTools by setting TriggeredSendStatus to 'Inactive'.`
@@ -184,27 +211,20 @@ class TriggeredSendDefinition extends MetadataType {
184
211
  // re-add IsPlatformObject, required for visibility
185
212
  metadata.IsPlatformObject = false;
186
213
  // folder
187
- metadata.CategoryID = Util.getFromCache(
188
- this.cache,
189
- 'folder',
190
- metadata.r__folder_Path,
191
- 'Path',
192
- 'ID'
193
- );
214
+ metadata.CategoryID = cache.searchForField('folder', metadata.r__folder_Path, 'Path', 'ID');
194
215
  delete metadata.r__folder_Path;
195
216
  // email
196
217
  if (metadata.r__email_Name) {
197
218
  // classic
198
219
  metadata.Email = {
199
- ID: Util.getFromCache(this.cache, 'email', metadata.r__email_Name, 'Name', 'ID'),
220
+ ID: cache.searchForField('email', metadata.r__email_Name, 'Name', 'ID'),
200
221
  };
201
222
  delete metadata.r__email_Name;
202
223
  } else if (metadata.r__assetMessage_Key) {
203
224
  // content builder
204
225
  // * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
205
226
  metadata.Email = {
206
- ID: Util.getFromCache(
207
- this.cache,
227
+ ID: cache.searchForField(
208
228
  'asset',
209
229
  metadata.r__assetMessage_Key,
210
230
  'customerKey',
@@ -213,7 +233,7 @@ class TriggeredSendDefinition extends MetadataType {
213
233
  };
214
234
  delete metadata.r__assetMessage_Key;
215
235
  delete metadata.r__assetMessage_Name;
216
- } else if (metadata.Email && metadata.Email.ID) {
236
+ } else if (metadata?.Email?.ID) {
217
237
  throw new Error(
218
238
  `r__assetMessage_Key / r__email_Name not defined but instead found Email.ID. Please try re-retrieving this TSD from your BU.`
219
239
  );
@@ -221,10 +241,10 @@ class TriggeredSendDefinition extends MetadataType {
221
241
  // get List
222
242
  if (metadata.r__list_PathName) {
223
243
  metadata.List = {
224
- ID: Util.getListObjectIdFromCache(this.cache, metadata.r__list_PathName, 'ID'),
244
+ ID: cache.getListObjectId(metadata.r__list_PathName, 'ID'),
225
245
  };
226
246
  delete metadata.r__list_PathName;
227
- } else if (metadata.List && metadata.List.ID) {
247
+ } else if (metadata?.List?.ID) {
228
248
  throw new Error(
229
249
  `r__list_PathName not defined but instead found List.ID. Please try re-retrieving this TSD from your BU.`
230
250
  );
@@ -7,6 +7,10 @@ module.exports = {
7
7
  idField: 'id',
8
8
  keyField: 'customerKey',
9
9
  nameField: 'name',
10
+ createdDateField: 'createdDate',
11
+ createdNameField: 'createdBy.name',
12
+ lastmodDateField: 'modifiedDate',
13
+ lastmodNameField: 'modifiedBy.name',
10
14
  restPagination: true,
11
15
  type: 'asset',
12
16
  typeDescription: 'Assets from Content Builder grouped into subtypes.',
@@ -68,7 +72,10 @@ module.exports = {
68
72
  template: true,
69
73
  },
70
74
  businessUnitAvailability: {
71
- skipValidation: true,
75
+ isCreateable: false,
76
+ isUpdateable: true,
77
+ retrieving: true,
78
+ template: true,
72
79
  },
73
80
  category: {
74
81
  isCreateable: true,
@@ -160,7 +167,7 @@ module.exports = {
160
167
  'data.approvals': {
161
168
  skipValidation: true,
162
169
  },
163
- 'data.email.options': {
170
+ 'data.email.attributes': {
164
171
  skipValidation: true,
165
172
  },
166
173
  'data.email.legacy': {
@@ -169,6 +176,9 @@ module.exports = {
169
176
  retrieving: false,
170
177
  template: false,
171
178
  },
179
+ 'data.email.options': {
180
+ skipValidation: true,
181
+ },
172
182
  'data.portfolio': {
173
183
  isCreateable: false,
174
184
  isUpdateable: false,
@@ -278,8 +288,8 @@ module.exports = {
278
288
  memberId: {
279
289
  isCreateable: false,
280
290
  isUpdateable: false,
281
- retrieving: false,
282
- template: false,
291
+ retrieving: true,
292
+ template: true,
283
293
  },
284
294
  meta: {
285
295
  skipValidation: true,
@@ -363,8 +373,8 @@ module.exports = {
363
373
  template: false,
364
374
  },
365
375
  sharingProperties: {
366
- isCreateable: true,
367
- isUpdateable: true,
376
+ isCreateable: false,
377
+ isUpdateable: false,
368
378
  retrieving: true,
369
379
  template: true,
370
380
  },
@@ -372,14 +382,14 @@ module.exports = {
372
382
  skipValidation: true,
373
383
  },
374
384
  'sharingProperties.sharedWith': {
375
- isCreateable: true,
376
- isUpdateable: true,
385
+ isCreateable: false,
386
+ isUpdateable: false,
377
387
  retrieving: true,
378
388
  template: true,
379
389
  },
380
390
  'sharingProperties.sharingType': {
381
- isCreateable: true,
382
- isUpdateable: true,
391
+ isCreateable: false,
392
+ isUpdateable: false,
383
393
  retrieving: true,
384
394
  template: true,
385
395
  },
@@ -448,6 +458,7 @@ module.exports = {
448
458
  'textfile',
449
459
  'video',
450
460
  ],
461
+ binarySubtypes: ['archive', 'audio', 'document', 'image', 'rawimage', 'video'],
451
462
  extendedSubTypes: {
452
463
  asset: ['webpage', 'webtemplate', 'jsonmessage', 'icemailformblock'],
453
464
  image: [
@@ -191,6 +191,18 @@ module.exports = {
191
191
  retrieving: true,
192
192
  template: null,
193
193
  },
194
+ 'localizedDescription.resourceSetKey': {
195
+ isCreateable: null,
196
+ isUpdateable: null,
197
+ retrieving: true,
198
+ template: null,
199
+ },
200
+ 'localizedDescription.resourceValueKey': {
201
+ isCreateable: null,
202
+ isUpdateable: null,
203
+ retrieving: true,
204
+ template: null,
205
+ },
194
206
  'localizedDescription.value': {
195
207
  isCreateable: null,
196
208
  isUpdateable: null,
@@ -32,6 +32,7 @@ module.exports = {
32
32
  'query',
33
33
  'script',
34
34
  ],
35
+ folderType: 'automation',
35
36
  hasExtended: false,
36
37
  filter: {
37
38
  description: ['Event Definition Automation'],
@@ -39,6 +40,10 @@ module.exports = {
39
40
  idField: 'id',
40
41
  keyField: 'key',
41
42
  nameField: 'name',
43
+ createdDateField: 'createdDate',
44
+ createdNameField: 'createdByName',
45
+ lastmodDateField: 'lastSavedDate',
46
+ lastmodNameField: 'lastSavedByName',
42
47
  restPagination: false,
43
48
  statusMapping: {
44
49
  AwaitingTrigger: 7,
@@ -303,7 +308,7 @@ module.exports = {
303
308
  },
304
309
  key: {
305
310
  isCreateable: true,
306
- isUpdateable: false,
311
+ isUpdateable: true,
307
312
  retrieving: true,
308
313
  template: true,
309
314
  },
@@ -469,8 +474,8 @@ module.exports = {
469
474
  'steps[].activities[].displayOrder': {
470
475
  isCreateable: true,
471
476
  isUpdateable: true,
472
- retrieving: true,
473
- template: true,
477
+ retrieving: false,
478
+ template: false,
474
479
  },
475
480
  'steps[].activities[].id': {
476
481
  isCreateable: true,
@@ -536,8 +541,8 @@ module.exports = {
536
541
  template: true,
537
542
  },
538
543
  'steps[].step': {
539
- isCreateable: true,
540
- isUpdateable: true,
544
+ isCreateable: false,
545
+ isUpdateable: false,
541
546
  retrieving: true,
542
547
  template: true,
543
548
  },
@@ -10,5 +10,48 @@ module.exports = {
10
10
  typeDescription: 'Way of tagging/categorizing emails, journeys and alike.',
11
11
  typeRetrieveByDefault: false,
12
12
  typeName: 'Campaign Tag',
13
- fields: {},
13
+ fields: {
14
+ createdDate: {
15
+ isCreateable: false,
16
+ isUpdateable: false,
17
+ retrieving: true,
18
+ templating: false,
19
+ },
20
+ modifiedDate: {
21
+ isCreateable: false,
22
+ isUpdateable: false,
23
+ retrieving: true,
24
+ templating: false,
25
+ },
26
+ name: {
27
+ isCreateable: false,
28
+ isUpdateable: false,
29
+ retrieving: true,
30
+ templating: false,
31
+ },
32
+ description: {
33
+ isCreateable: false,
34
+ isUpdateable: false,
35
+ retrieving: true,
36
+ templating: false,
37
+ },
38
+ campaignCode: {
39
+ isCreateable: false,
40
+ isUpdateable: false,
41
+ retrieving: true,
42
+ templating: false,
43
+ },
44
+ color: {
45
+ isCreateable: false,
46
+ isUpdateable: false,
47
+ retrieving: true,
48
+ templating: false,
49
+ },
50
+ favorite: {
51
+ isCreateable: false,
52
+ isUpdateable: false,
53
+ retrieving: true,
54
+ templating: false,
55
+ },
56
+ },
14
57
  };
@@ -80,6 +80,10 @@ module.exports = {
80
80
  idField: 'ObjectID',
81
81
  keyField: 'CustomerKey',
82
82
  nameField: 'Name',
83
+ createdDateField: 'CreatedDate',
84
+ createdNameField: null,
85
+ lastmodDateField: 'ModifiedDate',
86
+ lastmodNameField: null,
83
87
  restPagination: false,
84
88
  type: 'dataExtension',
85
89
  typeDescription: 'Database table schemas.',
@@ -60,6 +60,12 @@ module.exports = {
60
60
  retrieving: false,
61
61
  template: false,
62
62
  },
63
+ PartnerProperties: {
64
+ isCreateable: false,
65
+ isUpdateable: false,
66
+ retrieving: false,
67
+ template: false,
68
+ },
63
69
  IsSendable: { isCreateable: false, isUpdateable: false, retrieving: true, template: false },
64
70
  IsTestable: { isCreateable: false, isUpdateable: false, retrieving: true, template: false },
65
71
  SendableCustomObjectField: {
@@ -4,6 +4,10 @@ module.exports = {
4
4
  hasExtended: true,
5
5
  idField: 'dataExtractDefinitionId',
6
6
  keyField: 'key',
7
+ createdDateField: 'createdDate',
8
+ createdNameField: 'createdBy',
9
+ lastmodDateField: 'modifiedDate',
10
+ lastmodNameField: 'modifiedBy',
7
11
  nameField: 'name',
8
12
  restPagination: true,
9
13
  type: 'dataExtract',
@@ -30,8 +34,8 @@ module.exports = {
30
34
  template: false,
31
35
  },
32
36
  dataExtractTypeId: {
33
- isCreateable: null,
34
- isUpdateable: null,
37
+ isCreateable: true,
38
+ isUpdateable: true,
35
39
  retrieving: true,
36
40
  template: true,
37
41
  },
@@ -39,20 +43,20 @@ module.exports = {
39
43
  skipValidation: true,
40
44
  },
41
45
  description: {
42
- isCreateable: null,
43
- isUpdateable: null,
46
+ isCreateable: true,
47
+ isUpdateable: true,
44
48
  retrieving: true,
45
49
  template: true,
46
50
  },
47
51
  endDate: {
48
- isCreateable: null,
49
- isUpdateable: null,
52
+ isCreateable: true,
53
+ isUpdateable: true,
50
54
  retrieving: true,
51
55
  template: true,
52
56
  },
53
57
  fileSpec: {
54
- isCreateable: null,
55
- isUpdateable: null,
58
+ isCreateable: true,
59
+ isUpdateable: true,
56
60
  retrieving: true,
57
61
  template: true,
58
62
  },
@@ -63,8 +67,8 @@ module.exports = {
63
67
  template: true,
64
68
  },
65
69
  key: {
66
- isCreateable: null,
67
- isUpdateable: false,
70
+ isCreateable: true,
71
+ isUpdateable: true,
68
72
  retrieving: true,
69
73
  template: true,
70
74
  },
@@ -81,14 +85,14 @@ module.exports = {
81
85
  template: false,
82
86
  },
83
87
  name: {
84
- isCreateable: null,
85
- isUpdateable: false,
88
+ isCreateable: true,
89
+ isUpdateable: true,
86
90
  retrieving: true,
87
91
  template: true,
88
92
  },
89
93
  startDate: {
90
- isCreateable: null,
91
- isUpdateable: null,
94
+ isCreateable: true,
95
+ isUpdateable: true,
92
96
  retrieving: true,
93
97
  template: true,
94
98
  },
@@ -86,6 +86,18 @@ module.exports = {
86
86
  methods: {
87
87
  skipValidation: true,
88
88
  },
89
+ metadata: {
90
+ isCreateable: false,
91
+ isUpdateable: false,
92
+ retrieving: true,
93
+ template: false,
94
+ },
95
+ 'metadata.supportsResponseEncoding': {
96
+ isCreateable: false,
97
+ isUpdateable: false,
98
+ retrieving: true,
99
+ template: false,
100
+ },
89
101
  name: {
90
102
  isCreateable: false,
91
103
  isUpdateable: false,