mcdev 7.6.3 → 7.7.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 (147) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/.github/ISSUE_TEMPLATE/task.md +1 -1
  3. package/.github/workflows/coverage-base-update.yml +2 -2
  4. package/.github/workflows/coverage-develop-branch.yml +3 -1
  5. package/.github/workflows/coverage-main-branch.yml +3 -1
  6. package/.github/workflows/coverage.yml +5 -3
  7. package/.mcdev-validations.js +0 -0
  8. package/@types/lib/Builder.d.ts +14 -0
  9. package/@types/lib/Builder.d.ts.map +1 -1
  10. package/@types/lib/MetadataTypeDefinitions.d.ts +2 -0
  11. package/@types/lib/MetadataTypeDefinitions.d.ts.map +1 -1
  12. package/@types/lib/MetadataTypeInfo.d.ts +2 -0
  13. package/@types/lib/MetadataTypeInfo.d.ts.map +1 -1
  14. package/@types/lib/index.d.ts +17 -8
  15. package/@types/lib/index.d.ts.map +1 -1
  16. package/@types/lib/metadataTypes/Asset.d.ts +11 -3
  17. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  18. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/DomainVerification.d.ts +180 -0
  20. package/@types/lib/metadataTypes/DomainVerification.d.ts.map +1 -0
  21. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  22. package/@types/lib/metadataTypes/Journey.d.ts +7 -4
  23. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  24. package/@types/lib/metadataTypes/MetadataType.d.ts +15 -7
  25. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  26. package/@types/lib/metadataTypes/MobileKeyword.d.ts +2 -10
  27. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  28. package/@types/lib/metadataTypes/MobileMessage.d.ts +2 -10
  29. package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -1
  30. package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -1
  31. package/@types/lib/metadataTypes/SenderProfile.d.ts +7 -0
  32. package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -1
  33. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +2 -2
  34. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
  35. package/@types/lib/metadataTypes/TriggeredSend.d.ts +8 -0
  36. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
  37. package/@types/lib/metadataTypes/Verification.d.ts +0 -9
  38. package/@types/lib/metadataTypes/Verification.d.ts.map +1 -1
  39. package/@types/lib/metadataTypes/definitions/DomainVerification.definition.d.ts +100 -0
  40. package/@types/lib/metadataTypes/definitions/DomainVerification.definition.d.ts.map +1 -0
  41. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +1 -1
  42. package/@types/lib/util/devops.d.ts.map +1 -1
  43. package/@types/lib/util/replaceContentBlockReference.d.ts +2 -1
  44. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  45. package/@types/lib/util/util.d.ts +42 -1
  46. package/@types/lib/util/util.d.ts.map +1 -1
  47. package/@types/lib/util/validations.d.ts.map +1 -1
  48. package/@types/types/mcdev.d.d.ts +34 -0
  49. package/@types/types/mcdev.d.d.ts.map +1 -1
  50. package/boilerplate/config.json +11 -0
  51. package/boilerplate/files/eslint.config.js +98 -3
  52. package/boilerplate/forcedUpdates.json +4 -0
  53. package/boilerplate/gitignore-template +1 -1
  54. package/boilerplate/npm-dependencies.json +1 -0
  55. package/eslint.config.js +4 -3
  56. package/lib/Builder.js +114 -54
  57. package/lib/Deployer.js +2 -2
  58. package/lib/MetadataTypeDefinitions.js +2 -0
  59. package/lib/MetadataTypeInfo.js +2 -0
  60. package/lib/cli.js +127 -3
  61. package/lib/index.js +217 -164
  62. package/lib/metadataTypes/Asset.js +76 -22
  63. package/lib/metadataTypes/DataExtension.js +10 -2
  64. package/lib/metadataTypes/DomainVerification.js +246 -0
  65. package/lib/metadataTypes/Event.js +21 -9
  66. package/lib/metadataTypes/Journey.js +339 -223
  67. package/lib/metadataTypes/MetadataType.js +153 -106
  68. package/lib/metadataTypes/MobileKeyword.js +5 -2
  69. package/lib/metadataTypes/MobileMessage.js +5 -2
  70. package/lib/metadataTypes/SendClassification.js +5 -0
  71. package/lib/metadataTypes/SenderProfile.js +102 -3
  72. package/lib/metadataTypes/TransactionalEmail.js +3 -1
  73. package/lib/metadataTypes/Verification.js +3 -1
  74. package/lib/metadataTypes/definitions/DomainVerification.definition.js +71 -0
  75. package/lib/metadataTypes/definitions/Journey.definition.js +7 -1
  76. package/lib/metadataTypes/definitions/SendClassification.definition.js +2 -2
  77. package/lib/metadataTypes/definitions/SenderProfile.definition.js +1 -1
  78. package/lib/util/config.js +6 -0
  79. package/lib/util/devops.js +130 -154
  80. package/lib/util/file.js +3 -3
  81. package/lib/util/replaceContentBlockReference.js +10 -3
  82. package/lib/util/util.js +96 -14
  83. package/lib/util/validations.js +34 -14
  84. package/package.json +10 -10
  85. package/test/general.test.js +339 -96
  86. package/test/mockRoot/.mcdev-validations.js +66 -0
  87. package/test/mockRoot/.mcdevrc.json +30 -2
  88. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_htmlblock.asset-block-meta.html +1 -0
  89. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_htmlblock.asset-block-meta.json +39 -0
  90. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_withCBBK_notexisting.asset-block-meta.html +4 -0
  91. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_withCBBK_notexisting.asset-block-meta.json +39 -0
  92. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_withCBBK_preexisting.asset-block-meta.html +4 -0
  93. package/test/mockRoot/deploy/testInstance/testBU/asset/block/testNew_asset_withCBBK_preexisting.asset-block-meta.json +39 -0
  94. package/test/mockRoot/deploy/testInstance/testBU/asset/message/testNew_assetMessage/testNew_assetMessage.asset-message-meta.json +435 -0
  95. package/test/mockRoot/deploy/testInstance/testBU/asset/message/testNew_assetMessage/views.html.content.asset-message-meta.html +150 -0
  96. package/test/mockRoot/deploy/testInstance/testBU/asset/message/testNew_asset_templatebasedemail/testNew_asset_templatebasedemail.asset-message-meta.json +305 -0
  97. package/test/mockRoot/deploy/testInstance/testBU/asset/message/testNew_asset_templatebasedemail/views.html.content.asset-message-meta.html +150 -0
  98. package/test/mockRoot/deploy/testInstance/testBU/asset/template/testNew_asset_template/content.asset-template-meta.html +150 -0
  99. package/test/mockRoot/deploy/testInstance/testBU/asset/template/testNew_asset_template/testNew_asset_template.asset-template-meta.json +116 -0
  100. package/test/mockRoot/deploy/testInstance/testBU/domainVerification/joern.berkefeld.New@accenture.com.domainVerification-meta.json +6 -0
  101. package/test/mockRoot/deploy/testInstance/testBU/domainVerification/joern.berkefeld@accenture.com.domainVerification-meta.json +6 -0
  102. package/test/mockRoot/deploy/testInstance/testBU/domainVerification/mcdev.accenture.com.domainVerification-meta.json +6 -0
  103. package/test/mockRoot/deploy/testInstance/testBU/journey/testNew_temail_notPublished.journey-meta.json +213 -0
  104. package/test/mockRoot/deploy/testInstance/testBU/senderProfile/testExisting_senderProfile.senderProfile-meta.json +1 -0
  105. package/test/mockRoot/deploy/testInstance/testBU/senderProfile/testNew_senderProfile.senderProfile-meta.json +1 -0
  106. package/test/resourceFactory.js +7 -24
  107. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_assetMessage.json +441 -0
  108. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_asset_htmlblock.json +59 -0
  109. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_asset_template.json +147 -0
  110. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_asset_templatebasedemail.json +322 -0
  111. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_asset_withCBBK_notexisting.json +59 -0
  112. package/test/resources/9999999/asset/v1/content/assets/post-response-key=testNew_asset_withCBBK_preexisting.json +59 -0
  113. package/test/resources/9999999/asset-deploy2/block/testBlacklist_asset_htmlblock.asset-block-meta.html +1 -0
  114. package/test/resources/9999999/asset-deploy2/block/testBlacklist_asset_htmlblock.asset-block-meta.json +39 -0
  115. package/test/resources/9999999/automation/clone-expected.json +61 -0
  116. package/test/resources/9999999/dataExtension/retrieve-CustomerKey=testExisting_dataExtension-response.xml +52 -0
  117. package/test/resources/9999999/dataExtension-deploy/testBlacklist_dataExtension.dataExtension-meta.json +20 -0
  118. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,dataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml +137 -0
  119. package/test/resources/9999999/domainVerification/create-expected.json +3 -0
  120. package/test/resources/9999999/domainVerification/get-sap-expected.json +6 -0
  121. package/test/resources/9999999/domainVerification/update-expected.json +6 -0
  122. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail/put-response-paused.json +219 -0
  123. package/test/resources/9999999/interaction/v1/interactions/key_testNew_temail_notPublished/get-response.json +218 -0
  124. package/test/resources/9999999/interaction/v1/interactions/post-response.json +216 -0
  125. package/test/resources/9999999/journey/create-transactionaEmail-publish-expected.json +217 -0
  126. package/test/resources/9999999/messaging/v1/domainverification/delete/post-response.txt +1 -0
  127. package/test/resources/9999999/messaging/v1/domainverification/get-response.json +43 -0
  128. package/test/resources/9999999/messaging/v1/domainverification/post-response.txt +1 -0
  129. package/test/resources/9999999/messaging/v1/domainverification/update/post-response.txt +1 -0
  130. package/test/resources/9999999/messaging/v1/email/definitions/get-response.json +7 -0
  131. package/test/resources/9999999/messaging/v1/email/definitions/testNew_temail_notPublished/get-response.json +26 -0
  132. package/test/resources/9999999/query/clone-expected.json +8 -0
  133. package/test/resources/9999999/query/clone-expected.sql +7 -0
  134. package/test/resources/9999999/senderProfile/create-response.xml +1 -1
  135. package/test/resources/9999999/senderProfile/post-expected.json +1 -1
  136. package/test/resources/9999999/transactionalEmail/create-publish-expected.json +20 -0
  137. package/test/type.asset.test.js +216 -9
  138. package/test/type.automation.test.js +1 -1
  139. package/test/type.domainVerification.test.js +169 -0
  140. package/test/type.journey.test.js +107 -21
  141. package/test/type.script.test.js +1 -1
  142. package/test/type.sendClassification.test.js +3 -3
  143. package/test/type.senderProfile.test.js +26 -6
  144. package/test/type.transactionalEmail.test.js +5 -5
  145. package/test/type.triggeredSend.test.js +1 -1
  146. package/test/utils.js +8 -0
  147. package/types/mcdev.d.js +12 -0
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  import MetadataType from './MetadataType.js';
4
+ import File from '../util/file.js';
5
+ import DomainVerification from './DomainVerification.js';
4
6
  import cache from '../util/cache.js';
5
7
  import { Util } from '../util/util.js';
6
8
  import ReplaceCbReference from '../util/replaceContentBlockReference.js';
@@ -119,9 +121,56 @@ class SenderProfile extends MetadataType {
119
121
 
120
122
  delete metadata.Client;
121
123
  }
124
+
125
+ // check if email address is verified. Otherwise this SenderProfile (and Send Classifications using it) will not be usable in Journey Builder
126
+ this.verifySenderEmailAddresses(metadata);
127
+
122
128
  return metadata;
123
129
  }
124
130
 
131
+ /**
132
+ *
133
+ * @param {MetadataTypeItem} metadata a single item
134
+ * @param {MetadataTypeItem} [metadataCaller] if called from SendClassification this can be used to adjust logs
135
+ * @param {any} [definition] type defintiion from SendClassification
136
+ */
137
+ static verifySenderEmailAddresses(metadata, metadataCaller, definition) {
138
+ if (!metadataCaller) {
139
+ metadataCaller = metadata;
140
+ }
141
+ if (!definition) {
142
+ definition = this.definition;
143
+ }
144
+ const emailsToCheck = {
145
+ FromAddress: metadata.FromAddress.trim() + '',
146
+ FallbackFromAddress: metadata.FallbackFromAddress.trim() + '',
147
+ };
148
+ for (const [field, email] of Object.entries(emailsToCheck)) {
149
+ if (email && !email.startsWith('%%') && email.includes('@')) {
150
+ const domainVerification = cache.getByKey('domainVerification', email);
151
+ if (domainVerification) {
152
+ if (domainVerification.status !== 'Verified') {
153
+ Util.logger.warn(
154
+ Util.getMsgPrefix(definition, metadataCaller) +
155
+ `: ${field} ${email} is currently in status ${domainVerification.status}. This ${definition.typeName} will not be usable in Journey Builder. To fix, please go to Setup > Feature Settings > Email Studio > From Address Management to verify the email.`
156
+ );
157
+ }
158
+ if (domainVerification.isSendable === false) {
159
+ Util.logger.warn(
160
+ Util.getMsgPrefix(definition, metadataCaller) +
161
+ `: ${field} ${email} is currently not sendable. This ${definition.typeName} will not be usable in Journey Builder. To auto-fix run any update on senderProfile:"${metadata[this.definition.keyField]}" via mcdev.`
162
+ );
163
+ }
164
+ } else {
165
+ Util.logger.warn(
166
+ Util.getMsgPrefix(definition, metadataCaller) +
167
+ `: ${field} ${email} is not verified. This ${definition.typeName} will not be usable in Journey Builder. To auto-fix run any update on senderProfile:"${metadata[this.definition.keyField]}" via mcdev. Alternatively, please go to Setup > Feature Settings > Email Studio > From Address Management.`
168
+ );
169
+ }
170
+ }
171
+ }
172
+ }
173
+
125
174
  /**
126
175
  * prepares a single item for deployment
127
176
  *
@@ -138,9 +187,8 @@ class SenderProfile extends MetadataType {
138
187
  (metadata.AutoForwardToEmailAddress !== '' || metadata.AutoForwardToName !== '')
139
188
  ) {
140
189
  Util.logger.warn(
141
- ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
142
- metadata[this.definition.keyField]
143
- }): AutoForwardToEmailAddress and AutoForwardToName will be ignored because UseDefaultRMMRules is set to true; setting UseDefaultRMMRules to false`
190
+ Util.getMsgPrefix(this.definition, metadata) +
191
+ `AutoForwardToEmailAddress and AutoForwardToName will be ignored because UseDefaultRMMRules is set to true; setting UseDefaultRMMRules to false`
144
192
  );
145
193
  metadata.UseDefaultRMMRules = false;
146
194
  }
@@ -173,12 +221,63 @@ class SenderProfile extends MetadataType {
173
221
  Util.logger.debug(
174
222
  `Caching all ${this.definition.type} post-deploy to ensure we have all fields`
175
223
  );
224
+ const domainVerificationEmails = new Set();
225
+
176
226
  const typeCache = await this.retrieveForCache();
177
227
  // update values in upsertResults with retrieved values before saving to disk
178
228
  for (const key of Object.keys(upsertResults)) {
179
229
  if (typeCache.metadata[key]) {
180
230
  upsertResults[key] = typeCache.metadata[key];
181
231
  }
232
+
233
+ // ensure the FromAddress is verified or else attempt to create it
234
+ const emailsToCheck = [
235
+ upsertResults[key].FromAddress.trim() + '',
236
+ upsertResults[key].FallbackFromAddress.trim() + '',
237
+ ];
238
+
239
+ for (const email of emailsToCheck) {
240
+ if (email && !email.startsWith('%%') && email.includes('@')) {
241
+ const domainVerification = cache.getByKey('domainVerification', email);
242
+ if (!domainVerification) {
243
+ domainVerificationEmails.add(email);
244
+ }
245
+ }
246
+ }
247
+ }
248
+
249
+ if (domainVerificationEmails.size) {
250
+ Util.logger.info(
251
+ Util.getGrayMsg(`Setting up required E-Mail Addresses for Sender Profiles:`)
252
+ );
253
+
254
+ const domainVerificationCreateMap = {};
255
+ for (const email of domainVerificationEmails) {
256
+ domainVerificationCreateMap[email] = {
257
+ domain: email,
258
+ isSendable: true,
259
+ };
260
+ }
261
+
262
+ const deployDir = File.normalizePath([
263
+ this.properties.directories.deploy,
264
+ this.buObject.credential,
265
+ this.buObject.businessUnit,
266
+ ]);
267
+ const retrieveDir = File.normalizePath([
268
+ this.properties.directories.retrieve,
269
+ this.buObject.credential,
270
+ this.buObject.businessUnit,
271
+ ]);
272
+ DomainVerification.buObject = this.buObject;
273
+ DomainVerification.client = this.client;
274
+ DomainVerification.properties = this.properties;
275
+ const domainVerificationCreateResult = await DomainVerification.deploy(
276
+ domainVerificationCreateMap,
277
+ deployDir,
278
+ retrieveDir
279
+ );
280
+ cache.mergeMetadata('domainVerification', domainVerificationCreateResult);
182
281
  }
183
282
  }
184
283
 
@@ -129,7 +129,7 @@ class TransactionalEmail extends TransactionalMessage {
129
129
  *
130
130
  * @param {MetadataTypeItem} _ not used
131
131
  * @param {object} apiResponse varies depending on the API call
132
- * @returns {Promise.<void>} -
132
+ * @returns {Promise.<object>} apiResponse
133
133
  */
134
134
  static async postCreateTasks(_, apiResponse) {
135
135
  if (apiResponse.journey?.interactionKey) {
@@ -144,6 +144,8 @@ class TransactionalEmail extends TransactionalMessage {
144
144
  apiResponse.r__journey_key = apiResponse.journey.interactionKey;
145
145
  delete apiResponse.journey;
146
146
  }
147
+
148
+ return apiResponse;
147
149
  }
148
150
 
149
151
  /**
@@ -155,7 +155,7 @@ class Verification extends MetadataType {
155
155
  * @param {MetadataTypeItem} metadataEntry a single metadata Entry
156
156
  * @param {object} apiResponse varies depending on the API call
157
157
  * @param {MetadataTypeItem} metadataEntryWithAllFields like metadataEntry but before non-creatable fields were stripped
158
- * @returns {Promise.<void>} -
158
+ * @returns {Promise.<object>} apiResponse
159
159
  */
160
160
  static async postCreateTasks(metadataEntry, apiResponse, metadataEntryWithAllFields) {
161
161
  if (!apiResponse?.[this.definition.idField]) {
@@ -178,6 +178,8 @@ class Verification extends MetadataType {
178
178
  Automation.createdKeyMap[buName][this.definition.type][
179
179
  metadataEntryWithAllFields[this.definition.idField]
180
180
  ] = metadataEntry[this.definition.idField];
181
+
182
+ return apiResponse;
181
183
  }
182
184
 
183
185
  /**
@@ -0,0 +1,71 @@
1
+ export default {
2
+ bodyIteratorField: 'items',
3
+ dependencies: [],
4
+ dependencyGraph: null,
5
+ hasExtended: false,
6
+ idField: 'domain',
7
+ keyIsFixed: true, // you can only change the "isSendable" property
8
+ keyField: 'domain',
9
+ createdDateField: null,
10
+ createdNameField: null,
11
+ lastmodDateField: null,
12
+ lastmodNameField: null,
13
+ nameField: 'domain',
14
+ restPagination: true,
15
+ maxKeyLength: 254, // assumed max length
16
+ type: 'domainVerification',
17
+ typeDescription: 'Domains emails that are verified for sending',
18
+ typeRetrieveByDefault: true,
19
+ typeName: 'Domain Verification',
20
+ fields: {
21
+ domain: {
22
+ isCreateable: true,
23
+ isUpdateable: false,
24
+ retrieving: true,
25
+ template: true,
26
+ },
27
+ emailAddress: {
28
+ // this is the same as domain, but the update API uses this field name instead
29
+ isCreateable: false,
30
+ isUpdateable: true,
31
+ retrieving: false,
32
+ template: false,
33
+ },
34
+ enterpriseId: {
35
+ isCreateable: false,
36
+ isUpdateable: false,
37
+ retrieving: false,
38
+ template: false,
39
+ },
40
+ memberId: {
41
+ isCreateable: false,
42
+ isUpdateable: false,
43
+ retrieving: false,
44
+ template: false,
45
+ },
46
+ domainType: {
47
+ isCreateable: false,
48
+ isUpdateable: false,
49
+ retrieving: true,
50
+ template: true,
51
+ },
52
+ isSendable: {
53
+ isCreateable: false,
54
+ isUpdateable: true,
55
+ retrieving: true,
56
+ template: true,
57
+ },
58
+ status: {
59
+ isCreateable: false,
60
+ isUpdateable: false,
61
+ retrieving: true,
62
+ template: false,
63
+ },
64
+ emailSendTime: {
65
+ isCreateable: false,
66
+ isUpdateable: false,
67
+ retrieving: false,
68
+ template: false,
69
+ },
70
+ },
71
+ };
@@ -358,7 +358,7 @@ export default {
358
358
  retrieving: true,
359
359
  template: true,
360
360
  },
361
- ' activities[].configurationArguments.triggeredSend.sendClassificationId': {
361
+ 'activities[].configurationArguments.triggeredSend.sendClassificationId': {
362
362
  isCreateable: true,
363
363
  isUpdateable: true,
364
364
  retrieving: true,
@@ -990,6 +990,12 @@ export default {
990
990
  retrieving: true,
991
991
  template: true,
992
992
  },
993
+ 'triggers[].metaData.scheduleState': {
994
+ isCreateable: true,
995
+ isUpdateable: true,
996
+ retrieving: true,
997
+ template: true,
998
+ },
993
999
  version: {
994
1000
  isCreateable: false,
995
1001
  isUpdateable: true,
@@ -1,7 +1,7 @@
1
1
  // https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/sendclassification.html
2
2
  export default {
3
3
  bodyIteratorField: 'Results',
4
- dependencies: ['senderProfile', 'deliveryProfile'],
4
+ dependencies: ['senderProfile', 'deliveryProfile', 'domainVerification'],
5
5
  dependencyGraph: {
6
6
  senderProfile: ['r__senderProfile_key'],
7
7
  // deliveryProfile: ['r__deliveryProfile_key'], // deliveryProfile cannot be deployed
@@ -21,7 +21,7 @@ export default {
21
21
  type: 'sendClassification',
22
22
  typeDescription:
23
23
  'Lets admins define Delivery Profile, Sender Profile and CAN-SPAM for an email job in a central location.',
24
- typeRetrieveByDefault: false,
24
+ typeRetrieveByDefault: true,
25
25
  typeName: 'Send Classification',
26
26
  sendClassificationTypeMapping: {
27
27
  Commercial: 'Marketing',
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  bodyIteratorField: 'Results',
3
- dependencies: ['user'],
3
+ dependencies: ['user', 'domainVerification'],
4
4
  dependencyGraph: null,
5
5
  filter: {},
6
6
  hasExtended: false,
@@ -46,6 +46,9 @@ const config = {
46
46
  if (await File.pathExists(Util.configFileName)) {
47
47
  try {
48
48
  config.properties = await File.readJSON(Util.configFileName);
49
+ if (!isInit && !(await this.checkProperties(config.properties, silent))) {
50
+ return;
51
+ }
49
52
  } catch (ex) {
50
53
  Util.logger.error(`${ex.code}: ${ex.message}`);
51
54
  return;
@@ -94,6 +97,9 @@ const config = {
94
97
  );
95
98
  return;
96
99
  }
100
+ } else if (!silent && !isInit) {
101
+ Util.logger.error(`Could not find ${Util.configFileName} in ${process.cwd()}.`);
102
+ Util.logger.error(`Run 'mcdev init' to initialize your project.\n`);
97
103
  }
98
104
  return config.properties;
99
105
  },