mcdev 4.3.0 → 4.3.2

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 (29) hide show
  1. package/.fork/custom-commands.json +14 -0
  2. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  3. package/boilerplate/gitignore-template +1 -0
  4. package/docs/dist/documentation.md +2 -40
  5. package/lib/Retriever.js +22 -19
  6. package/lib/metadataTypes/AccountUser.js +42 -13
  7. package/lib/metadataTypes/Asset.js +37 -42
  8. package/lib/metadataTypes/Automation.js +1 -1
  9. package/lib/metadataTypes/DataExtensionField.js +5 -3
  10. package/lib/metadataTypes/EmailSendDefinition.js +84 -44
  11. package/lib/metadataTypes/Interaction.js +74 -9
  12. package/lib/metadataTypes/List.js +17 -15
  13. package/lib/metadataTypes/MetadataType.js +1 -1
  14. package/lib/metadataTypes/TriggeredSendDefinition.js +6 -5
  15. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +52 -31
  16. package/lib/metadataTypes/definitions/Interaction.definition.js +1 -1
  17. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -2
  18. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +2 -2
  19. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +2 -2
  20. package/lib/util/auth.js +8 -3
  21. package/lib/util/devops.js +8 -4
  22. package/lib/util/util.js +51 -9
  23. package/package.json +2 -1
  24. package/test/interaction.test.js +2 -2
  25. package/test/mockRoot/.mcdevrc.json +1 -1
  26. package/test/resourceFactory.js +20 -9
  27. package/test/resources/9999999/interaction/v1/interactions/key_0b76dccf-594c-b6dc-1acf-10c4493dcb84/get-response.json +219 -0
  28. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +280 -0
  29. package/test/resources/9999999/triggeredSendDefinition/retrieve-response.xml +68 -0
@@ -104,15 +104,33 @@ class EmailSendDefinition extends MetadataType {
104
104
  delete metadata.r__email_Name;
105
105
  } else if (metadata.r__assetMessage_Key) {
106
106
  // content builder
107
- // * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
108
- metadata.Email.ID = cache.searchForField(
109
- 'asset',
110
- metadata.r__assetMessage_Key,
111
- 'customerKey',
112
- 'legacyData.legacyId'
113
- );
114
- delete metadata.r__assetMessage_Key;
115
- delete metadata.r__assetMessage_Name;
107
+ // * this ignores r__assetMessage_Name on purpose\ as that is only unique per parent folder but useful during PR reviews
108
+ // will try to find the key with the bu mid at the end, if unable, will try to find the key without it
109
+ try {
110
+ // check asset key as provided
111
+ metadata.Email.ID = cache.searchForField(
112
+ 'asset',
113
+ metadata.r__assetMessage_Key,
114
+ 'customerKey',
115
+ 'legacyData.legacyId'
116
+ );
117
+ delete metadata.r__assetMessage_Key;
118
+ delete metadata.r__assetMessage_Name;
119
+ } catch {
120
+ // if we deploy to another BU, try applying the BU's MID to the end, which we do in preDeployTasks for assets
121
+
122
+ // get suffix to update customer key at the end
123
+ const suffix = '-' + this.buObject.mid;
124
+
125
+ metadata.Email.ID = cache.searchForField(
126
+ 'asset',
127
+ metadata.r__assetMessage_Key.slice(0, Math.max(0, 36 - suffix.length)) + suffix,
128
+ 'customerKey',
129
+ 'legacyData.legacyId'
130
+ );
131
+ delete metadata.r__assetMessage_Key;
132
+ delete metadata.r__assetMessage_Name;
133
+ }
116
134
  }
117
135
  // Target Audience DataExtension
118
136
  // normalize first because this can be an array
@@ -129,7 +147,7 @@ class EmailSendDefinition extends MetadataType {
129
147
  if (sdl.r__dataExtension_Key) {
130
148
  if (sdl.DataSourceTypeID !== 'CustomObject') {
131
149
  throw new Error(
132
- `Skipping ${metadata.Name} (${metadata.CustomerKey}): Expecting DataSourceTypeID to equal 'CustomObject' when r__dataExtension_Key is defined; Found '${sdl.DataSourceTypeID}'`
150
+ ` ☇ skipping ${this.definition.type} ${metadata.Name} (${metadata.CustomerKey}): Expecting DataSourceTypeID to equal 'CustomObject' when r__dataExtension_Key is defined; Found '${sdl.DataSourceTypeID}'`
133
151
  );
134
152
  }
135
153
  sdl.CustomObjectID = cache.searchForField(
@@ -141,9 +159,13 @@ class EmailSendDefinition extends MetadataType {
141
159
  delete sdl.r__dataExtension_Key;
142
160
  } else if (sdl.DataSourceTypeID === 'CustomObject') {
143
161
  throw new Error(
144
- `Skipping ${metadata.Name} (${metadata.CustomerKey}): Expecting r__dataExtension_Key to be defined if DataSourceTypeID='CustomObject'`
162
+ ` ☇ skipping ${this.definition.type} ${metadata.Name} (${metadata.CustomerKey}): Expecting r__dataExtension_Key to be defined if DataSourceTypeID='CustomObject'`
145
163
  );
146
164
  }
165
+ if (!sdl.SalesForceObjectID || sdl.SalesForceObjectID === '') {
166
+ // otherwise this causes error 42117 / invalid ObjectID
167
+ delete sdl.SalesForceObjectID;
168
+ }
147
169
  // get List (required)
148
170
  if (sdl.r__list_PathName) {
149
171
  sdl.List = {
@@ -152,7 +174,7 @@ class EmailSendDefinition extends MetadataType {
152
174
  delete sdl.r__list_PathName;
153
175
  } else {
154
176
  throw new Error(
155
- `Field SendDefinitionList.r__list_PathName was not defined. Please try re-retrieving this ESD from your source BU.`
177
+ ` ☇ skipping ${this.definition.type} ${metadata.Name} (${metadata.CustomerKey}) Field SendDefinitionList.r__list_PathName was not defined. Please try re-retrieving this ESD from your source BU.`
156
178
  );
157
179
  }
158
180
  }
@@ -182,33 +204,39 @@ class EmailSendDefinition extends MetadataType {
182
204
  super.setFolderPath(metadata);
183
205
 
184
206
  // email
185
- try {
186
- // classic
187
- const classicEmail = cache.searchForField('email', metadata.Email.ID, 'ID', 'Name');
188
- metadata.r__email_Name = classicEmail;
189
- delete metadata.Email;
190
- } catch {
207
+ if (metadata.Email?.ID) {
191
208
  try {
192
- // content builder
193
- const contentBuilderEmailName = cache.searchForField(
194
- 'asset',
195
- metadata.Email.ID,
196
- 'legacyData.legacyId',
197
- 'name'
198
- );
199
- metadata.r__assetMessage_Name = contentBuilderEmailName;
200
- const contentBuilderEmailKey = cache.searchForField(
201
- 'asset',
202
- metadata.Email.ID,
203
- 'legacyData.legacyId',
204
- 'customerKey'
205
- );
206
- metadata.r__assetMessage_Key = contentBuilderEmailKey;
209
+ // classic
210
+ const classicEmail = cache.searchForField('email', metadata.Email.ID, 'ID', 'Name');
211
+ metadata.r__email_Name = classicEmail;
207
212
  delete metadata.Email;
208
213
  } catch {
209
- Util.logger.warn(
210
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
211
- );
214
+ try {
215
+ // content builder
216
+ const contentBuilderEmailName = cache.searchForField(
217
+ 'asset',
218
+ metadata.Email.ID,
219
+ 'legacyData.legacyId',
220
+ 'name'
221
+ );
222
+ metadata.r__assetMessage_Name = contentBuilderEmailName;
223
+ const contentBuilderEmailKey = cache.searchForField(
224
+ 'asset',
225
+ metadata.Email.ID,
226
+ 'legacyData.legacyId',
227
+ 'customerKey'
228
+ );
229
+ metadata.r__assetMessage_Key = contentBuilderEmailKey;
230
+ delete metadata.Email;
231
+ } catch {
232
+ Util.logger.warn(
233
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
234
+ metadata[this.definition.keyField]
235
+ }): Could not find email with ID ${
236
+ metadata.Email.ID
237
+ } in Classic nor in Content Builder.`
238
+ );
239
+ }
212
240
  }
213
241
  }
214
242
  // Target Audience DataExtension
@@ -232,18 +260,30 @@ class EmailSendDefinition extends MetadataType {
232
260
  delete sdl.CustomObjectID;
233
261
  } catch {
234
262
  Util.logger.warn(
235
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find Target Audience (DataExtension) with ObjectID ${sdl.CustomObjectID}.`
263
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
264
+ metadata[this.definition.keyField]
265
+ }): Could not find Target Audience (DataExtension) with ObjectID ${
266
+ sdl.CustomObjectID
267
+ }.`
236
268
  );
237
269
  }
238
270
  }
239
271
  // List
240
- try {
241
- sdl.r__list_PathName = cache.getListPathName(sdl.List.ID, 'ID');
242
- delete sdl.List;
243
- } catch (ex) {
244
- Util.logger.warn(
245
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
246
- );
272
+ if (sdl.List?.ID) {
273
+ try {
274
+ sdl.r__list_PathName = cache.getListPathName(sdl.List.ID, 'ID');
275
+ delete sdl.List;
276
+ } catch (ex) {
277
+ Util.logger.warn(
278
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
279
+ metadata[this.definition.keyField]
280
+ }): ${ex.message}`
281
+ );
282
+ }
283
+ }
284
+ if (!sdl.SalesForceObjectID) {
285
+ // otherwise this causes error 42117 / invalid ObjectID
286
+ delete sdl.SalesForceObjectID;
247
287
  }
248
288
  }
249
289
 
@@ -27,6 +27,7 @@ class Interaction extends MetadataType {
27
27
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
28
28
  */
29
29
  static async retrieve(retrieveDir, _, __, key) {
30
+ const extrasDefault = 'activities';
30
31
  if (retrieveDir) {
31
32
  // only print this during retrieve, not during retrieveForCache
32
33
  Util.logBeta(this.definition.type);
@@ -59,17 +60,81 @@ class Interaction extends MetadataType {
59
60
  }
60
61
  /* eslint-enable unicorn/prefer-ternary */
61
62
  }
62
- // full details for retrieve, only base data for caching; reduces caching time from minutes to seconds
63
- const extras = retrieveDir ? 'all' : '';
64
63
 
65
64
  try {
66
- return await super.retrieveREST(
67
- retrieveDir,
68
- `/interaction/v1/interactions/${singleKey}?extras=${extras}`,
69
- null,
70
- null,
71
- key
72
- );
65
+ const uri = `/interaction/v1/interactions/`;
66
+ if (singleKey || !retrieveDir) {
67
+ // full details for retrieve, only base data for caching; reduces caching time from minutes to seconds
68
+ const extras = retrieveDir && singleKey ? extrasDefault : '';
69
+
70
+ // caching or single retrieve
71
+ return await super.retrieveREST(
72
+ retrieveDir,
73
+ `${uri}${singleKey}?extras=${extras}`,
74
+ null,
75
+ null,
76
+ key
77
+ );
78
+ } else {
79
+ // retrieve all
80
+ const results = this.definition.restPagination
81
+ ? await this.client.rest.getBulk(uri, this.definition.restPageSize || 500)
82
+ : await this.client.rest.get(uri);
83
+ // const results = this.parseResponseBody(response);
84
+ if (results.items?.length) {
85
+ // empty results will come back without "items" defined
86
+ Util.logger.info(
87
+ Util.getGrayMsg(
88
+ ` - ${results.items?.length} ${this.definition.type}s found. Retrieving details...`
89
+ )
90
+ );
91
+ }
92
+ // full details for retrieve
93
+ const extras = extrasDefault;
94
+
95
+ const details = results.items
96
+ ? await Promise.all(
97
+ results.items.map(async (a) => {
98
+ try {
99
+ return await this.client.rest.get(
100
+ `${uri}key:${a[this.definition.keyField]}?extras=${extras}`
101
+ );
102
+ } catch (ex) {
103
+ // if we do get here, we should log the error and continue instead of failing to download all automations
104
+ Util.logger.error(
105
+ ` ☇ skipping ${this.definition.type} ${
106
+ a[this.definition.nameField]
107
+ } (${a[this.definition.keyField]}): ${ex.message} (${
108
+ ex.code
109
+ })${
110
+ ex.endpoint
111
+ ? Util.getGrayMsg(
112
+ ' - ' +
113
+ ex.endpoint.split(
114
+ 'rest.marketingcloudapis.com'
115
+ )[1]
116
+ )
117
+ : ''
118
+ }`
119
+ );
120
+ return null;
121
+ }
122
+ })
123
+ )
124
+ : [];
125
+ const parsed = this.parseResponseBody({ items: details.filter(Boolean) });
126
+
127
+ // * retrieveDir is mandatory in this method as it is not used for caching (there is a seperate method for that)
128
+ const savedMetadata = await this.saveResults(parsed, retrieveDir, null, null);
129
+ Util.logger.info(
130
+ `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` +
131
+ Util.getKeysString(key)
132
+ );
133
+ return {
134
+ metadata: parsed,
135
+ type: this.definition.type,
136
+ };
137
+ }
73
138
  } catch (ex) {
74
139
  // if the interaction does not exist, the API returns an error code which would otherwise bring execution to a hold
75
140
  if (
@@ -53,21 +53,23 @@ class List extends MetadataType {
53
53
  */
54
54
  static async retrieveForCache() {
55
55
  const results = await this.retrieve();
56
- if (!cache.getCache()?.folder) {
57
- const subTypeArr = [
58
- 'list',
59
- 'mysubs',
60
- 'suppression_list',
61
- 'publication',
62
- 'contextual_suppression_list',
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);
56
+ const subTypeArr = [
57
+ 'list',
58
+ 'mysubs',
59
+ 'suppression_list',
60
+ 'publication',
61
+ 'contextual_suppression_list',
62
+ ];
63
+ Util.logger.debug('folders not cached but required for list');
64
+ Util.logger.info(' - Caching dependent Metadata: folder');
65
+ Util.logSubtypes(subTypeArr);
66
+ Folder.client = this.client;
67
+ Folder.buObject = this.buObject;
68
+ Folder.properties = this.properties;
69
+ const result = await Folder.retrieveForCache(null, subTypeArr);
70
+ if (cache.getCache()?.folder) {
71
+ cache.mergeMetadata('folder', result.metadata);
72
+ } else {
71
73
  cache.setMetadata('folder', result.metadata);
72
74
  }
73
75
  for (const metadataEntry in results.metadata) {
@@ -725,7 +725,7 @@ class MetadataType {
725
725
  Util.logger.info(
726
726
  ` - updated ${this.definition.type}: ${
727
727
  metadataEntry[this.definition.keyField]
728
- } / ${metadataEntry[this.definition.nameField]}`
728
+ } / ${metadataEntry[this.definition.nameField]}`
729
729
  );
730
730
  }
731
731
  return response;
@@ -132,8 +132,9 @@ class TriggeredSendDefinition extends MetadataType {
132
132
  this.setFolderPath(metadata);
133
133
  } catch {
134
134
  Util.logger.verbose(
135
- ` - skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find folder.`
135
+ ` skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find folder.`
136
136
  );
137
+ // do not save this TSD because it would not be visible in the user interface
137
138
  return;
138
139
  }
139
140
 
@@ -163,9 +164,9 @@ class TriggeredSendDefinition extends MetadataType {
163
164
  delete metadata.Email;
164
165
  } catch {
165
166
  Util.logger.verbose(
166
- ` - skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
167
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder. This TSD cannot be replublished but potentially restarted with its cached version of the email.`
167
168
  );
168
- return;
169
+ // save this TSD because it could be fixed by the user or potentially restarted without a fix; also, it might be used by a journey
169
170
  }
170
171
  }
171
172
  // List (optional)
@@ -175,9 +176,9 @@ class TriggeredSendDefinition extends MetadataType {
175
176
  delete metadata.List;
176
177
  } catch (ex) {
177
178
  Util.logger.verbose(
178
- ` - skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
179
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
179
180
  );
180
- return;
181
+ // save this TSD because it could be fixed by the user
181
182
  }
182
183
  }
183
184
 
@@ -1,6 +1,6 @@
1
1
  module.exports = {
2
2
  bodyIteratorField: 'Results',
3
- dependencies: ['folder-userinitiatedsends', 'email', 'asset-message', 'dataExtension', 'list'], // filter, SendClassification, SenderProfile, DeliveryProfile
3
+ dependencies: ['folder-userinitiatedsends', 'email', 'asset-message', 'dataExtension', 'list'], // filter(+), sendClassification(+), SenderProfile(n/a), DeliveryProfile(n/a)
4
4
  folderType: 'userinitiatedsends',
5
5
  hasExtended: false,
6
6
  idField: 'ObjectID',
@@ -22,31 +22,31 @@ module.exports = {
22
22
  isCreateable: true,
23
23
  isUpdateable: true,
24
24
  retrieving: true,
25
- templating: false,
25
+ templating: true,
26
26
  },
27
27
  AutoBccEmail: {
28
28
  isCreateable: true,
29
29
  isUpdateable: true,
30
30
  retrieving: true,
31
- templating: false,
31
+ templating: true,
32
32
  },
33
33
  BccEmail: {
34
34
  isCreateable: true,
35
35
  isUpdateable: true,
36
36
  retrieving: true,
37
- templating: false,
37
+ templating: true,
38
38
  },
39
39
  CategoryID: {
40
40
  isCreateable: true,
41
41
  isUpdateable: true,
42
42
  retrieving: true,
43
- templating: false,
43
+ templating: true,
44
44
  },
45
45
  CCEmail: {
46
46
  isCreateable: true,
47
47
  isUpdateable: true,
48
48
  retrieving: true,
49
- templating: false,
49
+ templating: true,
50
50
  },
51
51
  'Client.ID': {
52
52
  isCreateable: false,
@@ -61,8 +61,8 @@ module.exports = {
61
61
  templating: false,
62
62
  },
63
63
  CreatedDate: {
64
- isCreateable: true,
65
- isUpdateable: true,
64
+ isCreateable: false,
65
+ isUpdateable: false,
66
66
  retrieving: true,
67
67
  templating: false,
68
68
  },
@@ -70,19 +70,19 @@ module.exports = {
70
70
  isCreateable: true,
71
71
  isUpdateable: true,
72
72
  retrieving: true,
73
- templating: false,
73
+ templating: true,
74
74
  },
75
75
  DeduplicateByEmail: {
76
76
  isCreateable: true,
77
77
  isUpdateable: true,
78
78
  retrieving: true,
79
- templating: false,
79
+ templating: true,
80
80
  },
81
81
  'DeliveryProfile.CustomerKey': {
82
82
  isCreateable: true,
83
83
  isUpdateable: true,
84
84
  retrieving: true,
85
- templating: false,
85
+ templating: true,
86
86
  },
87
87
  'DeliveryProfile.DomainType': {
88
88
  isCreateable: false,
@@ -130,13 +130,13 @@ module.exports = {
130
130
  isCreateable: true,
131
131
  isUpdateable: true,
132
132
  retrieving: true,
133
- templating: false,
133
+ templating: true,
134
134
  },
135
135
  'DeliveryProfile.PrivateIP': {
136
136
  isCreateable: true,
137
137
  isUpdateable: true,
138
138
  retrieving: true,
139
- templating: false,
139
+ templating: true,
140
140
  },
141
141
  'DeliveryProfile.SourceAddressType': {
142
142
  isCreateable: false,
@@ -154,7 +154,7 @@ module.exports = {
154
154
  isCreateable: true,
155
155
  isUpdateable: true,
156
156
  retrieving: true,
157
- templating: false,
157
+ templating: true,
158
158
  },
159
159
  DomainType: {
160
160
  isCreateable: false,
@@ -166,13 +166,13 @@ module.exports = {
166
166
  isCreateable: true,
167
167
  isUpdateable: true,
168
168
  retrieving: true,
169
- templating: false,
169
+ templating: true,
170
170
  },
171
171
  'Email.ID': {
172
172
  isCreateable: true,
173
173
  isUpdateable: true,
174
174
  retrieving: true,
175
- templating: false,
175
+ templating: true,
176
176
  },
177
177
  'Email.ObjectID': {
178
178
  isCreateable: false,
@@ -186,17 +186,35 @@ module.exports = {
186
186
  retrieving: false,
187
187
  templating: false,
188
188
  },
189
+ 'Email.Name': {
190
+ isCreateable: true,
191
+ isUpdateable: true,
192
+ retrieving: false,
193
+ templating: false,
194
+ },
195
+ 'Email.Subject': {
196
+ isCreateable: true,
197
+ isUpdateable: true,
198
+ retrieving: false,
199
+ templating: false,
200
+ },
201
+ 'Email.Status': {
202
+ isCreateable: true,
203
+ isUpdateable: true,
204
+ retrieving: false,
205
+ templating: false,
206
+ },
189
207
  EmailSubject: {
190
208
  isCreateable: true,
191
209
  isUpdateable: true,
192
210
  retrieving: true,
193
- templating: false,
211
+ templating: true,
194
212
  },
195
213
  ExclusionFilter: {
196
214
  isCreateable: true,
197
215
  isUpdateable: true,
198
216
  retrieving: true,
199
- templating: false,
217
+ templating: true,
200
218
  },
201
219
  FooterContentArea: {
202
220
  isCreateable: false,
@@ -256,7 +274,7 @@ module.exports = {
256
274
  isCreateable: true,
257
275
  isUpdateable: true,
258
276
  retrieving: true,
259
- templating: false,
277
+ templating: true,
260
278
  },
261
279
  IsPlatformObject: {
262
280
  isCreateable: true,
@@ -280,7 +298,7 @@ module.exports = {
280
298
  isCreateable: true,
281
299
  isUpdateable: true,
282
300
  retrieving: true,
283
- templating: false,
301
+ templating: true,
284
302
  },
285
303
  Keyword: {
286
304
  isCreateable: false,
@@ -295,8 +313,8 @@ module.exports = {
295
313
  templating: false,
296
314
  },
297
315
  ModifiedDate: {
298
- isCreateable: true,
299
- isUpdateable: true,
316
+ isCreateable: false,
317
+ isUpdateable: false,
300
318
  retrieving: true,
301
319
  templating: false,
302
320
  },
@@ -304,7 +322,7 @@ module.exports = {
304
322
  isCreateable: true,
305
323
  isUpdateable: true,
306
324
  retrieving: true,
307
- templating: false,
325
+ templating: true,
308
326
  },
309
327
  ObjectID: {
310
328
  isCreateable: false,
@@ -376,7 +394,7 @@ module.exports = {
376
394
  isCreateable: true,
377
395
  isUpdateable: true,
378
396
  retrieving: true,
379
- templating: false,
397
+ templating: true,
380
398
  },
381
399
  'SendClassification.ObjectID': {
382
400
  isCreateable: false,
@@ -400,7 +418,7 @@ module.exports = {
400
418
  isCreateable: true,
401
419
  isUpdateable: true,
402
420
  retrieving: true,
403
- templating: false,
421
+ templating: true,
404
422
  },
405
423
  'SendDefinitionList[].ObjectID': {
406
424
  isCreateable: false,
@@ -414,6 +432,9 @@ module.exports = {
414
432
  retrieving: false,
415
433
  templating: false,
416
434
  },
435
+ 'SendDefinitionList[].CustomObjectID': {
436
+ skipValidation: true, // cannot be asked for but will be retrieved
437
+ },
417
438
  'SendDefinitionList[].SendDefinitionListType': {
418
439
  skipValidation: true, // cannot be asked for but will be retrieved
419
440
  },
@@ -448,7 +469,7 @@ module.exports = {
448
469
  isCreateable: true,
449
470
  isUpdateable: true,
450
471
  retrieving: true,
451
- templating: false,
472
+ templating: true,
452
473
  },
453
474
  'SenderProfile.FromAddress': {
454
475
  isCreateable: false,
@@ -478,13 +499,13 @@ module.exports = {
478
499
  isCreateable: true,
479
500
  isUpdateable: true,
480
501
  retrieving: true,
481
- templating: false,
502
+ templating: true,
482
503
  },
483
504
  SendWindowClose: {
484
505
  isCreateable: true,
485
506
  isUpdateable: true,
486
507
  retrieving: true,
487
- templating: false,
508
+ templating: true,
488
509
  },
489
510
  SendWindowDelete: {
490
511
  isCreateable: false,
@@ -496,7 +517,7 @@ module.exports = {
496
517
  isCreateable: true,
497
518
  isUpdateable: true,
498
519
  retrieving: true,
499
- templating: false,
520
+ templating: true,
500
521
  },
501
522
  SourceAddressType: {
502
523
  isCreateable: false,
@@ -508,13 +529,13 @@ module.exports = {
508
529
  isCreateable: true,
509
530
  isUpdateable: true,
510
531
  retrieving: true,
511
- templating: false,
532
+ templating: true,
512
533
  },
513
534
  TestEmailAddr: {
514
535
  isCreateable: true,
515
536
  isUpdateable: true,
516
537
  retrieving: true,
517
- templating: false,
538
+ templating: true,
518
539
  },
519
540
  TimeZone: {
520
541
  isCreateable: false,
@@ -15,7 +15,7 @@ module.exports = {
15
15
  lastmodDateField: 'modifiedDate',
16
16
  lastmodNameField: null,
17
17
  restPagination: true,
18
- restPageSize: 250,
18
+ restPageSize: 500,
19
19
  type: 'interaction',
20
20
  typeDescription: 'Journey (internally called "Interaction").',
21
21
  typeRetrieveByDefault: true,
@@ -41,8 +41,8 @@ module.exports = {
41
41
  template: false,
42
42
  },
43
43
  definitionId: {
44
- isCreateable: true,
45
- isUpdateable: true,
44
+ isCreateable: false,
45
+ isUpdateable: false,
46
46
  retrieving: false,
47
47
  template: false,
48
48
  },
@@ -41,8 +41,8 @@ module.exports = {
41
41
  template: false,
42
42
  },
43
43
  definitionId: {
44
- isCreateable: true,
45
- isUpdateable: true,
44
+ isCreateable: false,
45
+ isUpdateable: false,
46
46
  retrieving: false,
47
47
  template: false,
48
48
  },