mcdev 7.0.3 → 7.0.4

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 (185) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  2. package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +1 -0
  3. package/.github/workflows/code-test.yml +48 -0
  4. package/.husky/pre-commit +1 -1
  5. package/@types/lib/Builder.d.ts +13 -13
  6. package/@types/lib/Builder.d.ts.map +1 -1
  7. package/@types/lib/Deployer.d.ts +16 -16
  8. package/@types/lib/Deployer.d.ts.map +1 -1
  9. package/@types/lib/Retriever.d.ts +15 -15
  10. package/@types/lib/Retriever.d.ts.map +1 -1
  11. package/@types/lib/cli.d.ts +1 -1
  12. package/@types/lib/cli.d.ts.map +1 -1
  13. package/@types/lib/index.d.ts +34 -34
  14. package/@types/lib/index.d.ts.map +1 -1
  15. package/@types/lib/metadataTypes/Asset.d.ts +18 -43
  16. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  17. package/@types/lib/metadataTypes/AttributeGroup.d.ts +3 -8
  18. package/@types/lib/metadataTypes/AttributeGroup.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/AttributeSet.d.ts +5 -21
  20. package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/Automation.d.ts +36 -49
  22. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  23. package/@types/lib/metadataTypes/Campaign.d.ts +11 -18
  24. package/@types/lib/metadataTypes/Campaign.d.ts.map +1 -1
  25. package/@types/lib/metadataTypes/ContentArea.d.ts +12 -31
  26. package/@types/lib/metadataTypes/ContentArea.d.ts.map +1 -1
  27. package/@types/lib/metadataTypes/DataExtension.d.ts +23 -31
  28. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  29. package/@types/lib/metadataTypes/DataExtensionField.d.ts +12 -18
  30. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  31. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts +11 -11
  32. package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts.map +1 -1
  33. package/@types/lib/metadataTypes/DataExtract.d.ts +12 -28
  34. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
  35. package/@types/lib/metadataTypes/DataExtractType.d.ts +10 -10
  36. package/@types/lib/metadataTypes/DataExtractType.d.ts.map +1 -1
  37. package/@types/lib/metadataTypes/DeliveryProfile.d.ts +10 -10
  38. package/@types/lib/metadataTypes/DeliveryProfile.d.ts.map +1 -1
  39. package/@types/lib/metadataTypes/Discovery.d.ts +10 -10
  40. package/@types/lib/metadataTypes/Discovery.d.ts.map +1 -1
  41. package/@types/lib/metadataTypes/Email.d.ts +13 -34
  42. package/@types/lib/metadataTypes/Email.d.ts.map +1 -1
  43. package/@types/lib/metadataTypes/EmailSend.d.ts +10 -10
  44. package/@types/lib/metadataTypes/EmailSend.d.ts.map +1 -1
  45. package/@types/lib/metadataTypes/Event.d.ts +19 -16
  46. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  47. package/@types/lib/metadataTypes/FileLocation.d.ts +10 -10
  48. package/@types/lib/metadataTypes/FileLocation.d.ts.map +1 -1
  49. package/@types/lib/metadataTypes/FileTransfer.d.ts +11 -18
  50. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
  51. package/@types/lib/metadataTypes/Filter.d.ts +10 -10
  52. package/@types/lib/metadataTypes/Filter.d.ts.map +1 -1
  53. package/@types/lib/metadataTypes/Folder.d.ts +10 -10
  54. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
  55. package/@types/lib/metadataTypes/ImportFile.d.ts +11 -15
  56. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  57. package/@types/lib/metadataTypes/Journey.d.ts +13 -32
  58. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  59. package/@types/lib/metadataTypes/List.d.ts +12 -12
  60. package/@types/lib/metadataTypes/List.d.ts.map +1 -1
  61. package/@types/lib/metadataTypes/MetadataType.d.ts +23 -23
  62. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  63. package/@types/lib/metadataTypes/MobileCode.d.ts +11 -20
  64. package/@types/lib/metadataTypes/MobileCode.d.ts.map +1 -1
  65. package/@types/lib/metadataTypes/MobileKeyword.d.ts +14 -14
  66. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  67. package/@types/lib/metadataTypes/MobileMessage.d.ts +14 -42
  68. package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -1
  69. package/@types/lib/metadataTypes/Query.d.ts +12 -12
  70. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  71. package/@types/lib/metadataTypes/Role.d.ts +11 -11
  72. package/@types/lib/metadataTypes/Role.d.ts.map +1 -1
  73. package/@types/lib/metadataTypes/Script.d.ts +15 -24
  74. package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
  75. package/@types/lib/metadataTypes/SendClassification.d.ts +10 -10
  76. package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -1
  77. package/@types/lib/metadataTypes/SenderProfile.d.ts +11 -19
  78. package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -1
  79. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +12 -12
  80. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
  81. package/@types/lib/metadataTypes/TransactionalMessage.d.ts +11 -32
  82. package/@types/lib/metadataTypes/TransactionalMessage.d.ts.map +1 -1
  83. package/@types/lib/metadataTypes/TransactionalPush.d.ts +12 -21
  84. package/@types/lib/metadataTypes/TransactionalPush.d.ts.map +1 -1
  85. package/@types/lib/metadataTypes/TransactionalSMS.d.ts +12 -18
  86. package/@types/lib/metadataTypes/TransactionalSMS.d.ts.map +1 -1
  87. package/@types/lib/metadataTypes/TriggeredSend.d.ts +13 -18
  88. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
  89. package/@types/lib/metadataTypes/User.d.ts +22 -40
  90. package/@types/lib/metadataTypes/User.d.ts.map +1 -1
  91. package/@types/lib/metadataTypes/Verification.d.ts +13 -13
  92. package/@types/lib/metadataTypes/Verification.d.ts.map +1 -1
  93. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +7 -1
  94. package/@types/lib/util/auth.d.ts +19 -18
  95. package/@types/lib/util/auth.d.ts.map +1 -1
  96. package/@types/lib/util/businessUnit.d.ts +17 -17
  97. package/@types/lib/util/businessUnit.d.ts.map +1 -1
  98. package/@types/lib/util/cache.d.ts +24 -32
  99. package/@types/lib/util/cache.d.ts.map +1 -1
  100. package/@types/lib/util/cli.d.ts +27 -27
  101. package/@types/lib/util/cli.d.ts.map +1 -1
  102. package/@types/lib/util/config.d.ts +20 -20
  103. package/@types/lib/util/config.d.ts.map +1 -1
  104. package/@types/lib/util/devops.d.ts +21 -21
  105. package/@types/lib/util/devops.d.ts.map +1 -1
  106. package/@types/lib/util/file.d.ts +179 -18
  107. package/@types/lib/util/file.d.ts.map +1 -1
  108. package/@types/lib/util/init.config.d.ts +19 -19
  109. package/@types/lib/util/init.config.d.ts.map +1 -1
  110. package/@types/lib/util/init.d.ts +20 -20
  111. package/@types/lib/util/init.d.ts.map +1 -1
  112. package/@types/lib/util/init.git.d.ts +2 -2
  113. package/@types/lib/util/init.git.d.ts.map +1 -1
  114. package/@types/lib/util/init.npm.d.ts +2 -2
  115. package/@types/lib/util/init.npm.d.ts.map +1 -1
  116. package/@types/lib/util/replaceContentBlockReference.d.ts +28 -28
  117. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  118. package/@types/lib/util/util.d.ts +33 -37
  119. package/@types/lib/util/util.d.ts.map +1 -1
  120. package/@types/types/mcdev.d.d.ts +73 -52
  121. package/@types/types/mcdev.d.d.ts.map +1 -1
  122. package/eslint.config.js +0 -1
  123. package/lib/Deployer.js +1 -1
  124. package/lib/Retriever.js +4 -1
  125. package/lib/cli.js +209 -278
  126. package/lib/index.js +89 -43
  127. package/lib/metadataTypes/Asset.js +1 -0
  128. package/lib/metadataTypes/DataExtension.js +3 -3
  129. package/lib/metadataTypes/DataExtensionField.js +0 -1
  130. package/lib/metadataTypes/Event.js +199 -35
  131. package/lib/metadataTypes/Folder.js +1 -1
  132. package/lib/metadataTypes/Journey.js +10 -2
  133. package/lib/metadataTypes/MetadataType.js +3 -4
  134. package/lib/metadataTypes/Role.js +9 -7
  135. package/lib/metadataTypes/SenderProfile.js +1 -0
  136. package/lib/metadataTypes/TransactionalEmail.js +2 -2
  137. package/lib/metadataTypes/TriggeredSend.js +1 -0
  138. package/lib/metadataTypes/User.js +31 -27
  139. package/lib/metadataTypes/definitions/Event.definition.js +8 -8
  140. package/lib/util/auth.js +0 -1
  141. package/lib/util/cli.js +0 -1
  142. package/lib/util/devops.js +2 -3
  143. package/lib/util/file.js +7 -10
  144. package/lib/util/replaceContentBlockReference.js +3 -1
  145. package/package.json +11 -9
  146. package/test/general.test.js +20 -2
  147. package/test/mockRoot/.mcdevrc.json +1 -1
  148. package/test/mockRoot/deploy/testInstance/testBU/event/testExisting_event.event-meta.json +201 -0
  149. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withExistingDE.event-meta.json +232 -0
  150. package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withSchema.event-meta.json +193 -0
  151. package/test/resources/9999999/dataExtension/retrieve-CustomerKey=testNew_event_withSchema-response.xml +50 -0
  152. package/test/resources/9999999/dataExtension/retrieve-createdViaEvent-response.xml +50 -0
  153. package/test/resources/9999999/dataExtension/retrieve-response.xml +48 -0
  154. package/test/resources/9999999/dataExtension/retrieve_event_withSchema-expected.json +219 -0
  155. package/test/resources/9999999/dataExtension/update-afterCreatedViaEvent-response.xml +55 -0
  156. package/test/resources/9999999/dataExtension/update-callout-afterCreatedViaEvent-expected.xml +1 -0
  157. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_event_withSchema-response.xml +461 -0
  158. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKeyINtestExisting_dataExtension,testNew_dataExtension-response.xml +133 -0
  159. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +870 -0
  160. package/test/resources/9999999/event/build-expected.json +228 -0
  161. package/test/resources/9999999/event/get-expected.json +235 -0
  162. package/test/resources/9999999/event/post_withExistingDE-callout-expected.json +17 -0
  163. package/test/resources/9999999/event/post_withExistingDE-expected.json +21 -0
  164. package/test/resources/9999999/event/post_withSchema-callout-expected.json +196 -0
  165. package/test/resources/9999999/event/post_withSchema-expected.json +232 -0
  166. package/test/resources/9999999/event/put-callout-expected.json +202 -0
  167. package/test/resources/9999999/event/put-expected.json +233 -0
  168. package/test/resources/9999999/event/template-expected.json +228 -0
  169. package/test/resources/9999999/interaction/v1/eventDefinitions/get-response.json +252 -2
  170. package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/delete-response.txt +0 -0
  171. package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/put-response.json +241 -0
  172. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withExistingDE-response.json +26 -0
  173. package/test/resources/9999999/interaction/v1/eventDefinitions/post_withSchema-response.json +241 -0
  174. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/delete-response.txt +1 -0
  175. package/test/type.asset.test.js +0 -3
  176. package/test/type.automation.test.js +1 -1
  177. package/test/type.dataExtension.test.js +4 -4
  178. package/test/type.event.test.js +287 -6
  179. package/test/type.journey.test.js +13 -0
  180. package/test/type.user.test.js +1 -1
  181. package/test/utils.js +18 -6
  182. package/tsconfig.json +6 -1
  183. package/{jsconfig.json → tsconfig.npmScripts.json} +1 -1
  184. package/tsconfig.precommit.json +26 -0
  185. package/types/mcdev.d.js +12 -13
@@ -169,13 +169,15 @@ class Role extends MetadataType {
169
169
  }
170
170
  if (!metadata) {
171
171
  try {
172
- metadata = await this.readBUMetadataForType(
173
- File.normalizePath([
174
- this.properties.directories.retrieve,
175
- this.buObject.credential,
176
- Util.parentBuName,
177
- ]),
178
- true
172
+ metadata = (
173
+ await this.readBUMetadataForType(
174
+ File.normalizePath([
175
+ this.properties.directories.retrieve,
176
+ this.buObject.credential,
177
+ Util.parentBuName,
178
+ ]),
179
+ true
180
+ )
179
181
  ).role;
180
182
  } catch (ex) {
181
183
  Util.logger.error(ex.message);
@@ -161,6 +161,7 @@ class SenderProfile extends MetadataType {
161
161
 
162
162
  if (!changes) {
163
163
  const ex = new Error('No changes made to the code.');
164
+ // @ts-expect-error custom error object
164
165
  ex.code = 200;
165
166
  throw ex;
166
167
  }
@@ -117,9 +117,9 @@ class TransactionalEmail extends TransactionalMessage {
117
117
  /**
118
118
  * Gets executed after deployment of metadata type
119
119
  *
120
- * @returns {void}
120
+ * @returns {Promise.<void>} -
121
121
  */
122
- static postDeployTasks() {
122
+ static async postDeployTasks() {
123
123
  if (this._createdJourneyKeys?.length) {
124
124
  Util.logger.warn(
125
125
  `Please download related journeys via: mcdev r ${this.buObject.credential}/${
@@ -544,6 +544,7 @@ class TriggeredSend extends MetadataType {
544
544
 
545
545
  if (!changes) {
546
546
  const ex = new Error('No changes made to the code.');
547
+ // @ts-expect-error custom error object
547
548
  ex.code = 200;
548
549
  throw ex;
549
550
  }
@@ -340,7 +340,6 @@ class User extends MetadataType {
340
340
  if (configs.length > 0) {
341
341
  Util.logger.info('Deploying: BU assignment changes');
342
342
  // run update
343
- // @ts-expect-error bad jsodc in SFMC-SDK
344
343
  const buResponse = await this.client.soap.configure('AccountUser', configs);
345
344
  // process response
346
345
  if (buResponse.OverallStatus === 'OK') {
@@ -745,6 +744,7 @@ class User extends MetadataType {
745
744
  installedPackage: 0,
746
745
  };
747
746
  for (const id in savedMetadata) {
747
+ /** @typedef {UserDocument} */
748
748
  const item = savedMetadata[id];
749
749
  if (item.c__type === 'Installed Package') {
750
750
  counter.installedPackage++;
@@ -974,13 +974,15 @@ class User extends MetadataType {
974
974
  if (!metadata) {
975
975
  // load users from disk if document was called directly and not part of a retrieve
976
976
  try {
977
- metadata = await this.readBUMetadataForType(
978
- File.normalizePath([
979
- this.properties.directories.retrieve,
980
- this.buObject.credential,
981
- Util.parentBuName,
982
- ]),
983
- true
977
+ metadata = (
978
+ await this.readBUMetadataForType(
979
+ File.normalizePath([
980
+ this.properties.directories.retrieve,
981
+ this.buObject.credential,
982
+ Util.parentBuName,
983
+ ]),
984
+ true
985
+ )
984
986
  ).user;
985
987
  } catch (ex) {
986
988
  Util.logger.error(ex.message);
@@ -1015,7 +1017,9 @@ class User extends MetadataType {
1015
1017
  }
1016
1018
  const defaultBUName = this._getBuName(user.DefaultBusinessUnit);
1017
1019
  const LastSuccessfulLogin = user.LastSuccessfulLogin.split('.')[0];
1020
+
1018
1021
  users.push({
1022
+ ...user, // keep that here to satisfy the type
1019
1023
  TYPE: user.c__type,
1020
1024
  UserID: user.UserID,
1021
1025
  AccountUserID: user.c__AccountUserID,
@@ -1023,13 +1027,13 @@ class User extends MetadataType {
1023
1027
  Name: user.Name,
1024
1028
  Email: user.Email,
1025
1029
  NotificationEmailAddress: user.NotificationEmailAddress,
1026
- ActiveFlag: user.ActiveFlag === true ? '✓' : '-',
1027
- IsLocked: user.IsLocked === true ? '✓' : '-',
1028
- IsAPIUser: user.IsAPIUser === true ? '✓' : '-',
1029
- MustChangePassword: user.MustChangePassword === true ? '✓' : '-',
1030
- DefaultBusinessUnit: defaultBUName,
1031
- AssociatedBus: associatedBus,
1032
- Roles: roles,
1030
+ ActiveFlagDocs: user.ActiveFlag === true ? '✓' : '-',
1031
+ IsLockedDocs: user.IsLocked === true ? '✓' : '-',
1032
+ IsAPIUserDocs: user.IsAPIUser === true ? '✓' : '-',
1033
+ MustChangePasswordDocs: user.MustChangePassword === true ? '✓' : '-',
1034
+ DefaultBusinessUnitDocs: defaultBUName,
1035
+ AssociatedBusDocs: associatedBus,
1036
+ RolesDocs: roles,
1033
1037
  LastSuccessfulLogin: user.LastSuccessfulLogin
1034
1038
  ? // on create & update, LastSuccessfulLogin often gets overwritten with the current date
1035
1039
  LastSuccessfulLogin === user.CreatedDate.split('.')[0] ||
@@ -1041,39 +1045,39 @@ class User extends MetadataType {
1041
1045
  ModifiedDate: user.ModifiedDate ? user.ModifiedDate.split('T').join(' ') : 'n/a',
1042
1046
  ModifiedBy: user.Client.ModifiedBy || 'n/a',
1043
1047
  TimeZoneName: user.c__TimeZoneName.slice(1, 10),
1044
- LocaleCode: user.c__LocaleCode,
1048
+ c__LocaleCode: user.c__LocaleCode,
1045
1049
  });
1046
1050
  }
1047
1051
  users.sort((a, b) => (a.Name < b.Name ? -1 : a.Name > b.Name ? 1 : 0));
1048
1052
  const columnsToPrint = [
1049
1053
  ['Name', 'Name'],
1050
1054
  ['Last successful Login', 'LastSuccessfulLogin'],
1051
- ['Active', 'ActiveFlag'],
1052
- ['Access Locked out', 'IsLocked'],
1053
- ['API User', 'IsAPIUser'],
1054
- ['Must change PW', 'MustChangePassword'],
1055
- ['Default BU', 'DefaultBusinessUnit'],
1056
- ['BU Access', 'AssociatedBus'],
1057
- ['Roles', 'Roles'],
1055
+ ['Active', 'ActiveFlagDocs'],
1056
+ ['Access Locked out', 'IsLockedDocs'],
1057
+ ['API User', 'IsAPIUserDocs'],
1058
+ ['Must change PW', 'MustChangePasswordDocs'],
1059
+ ['Default BU', 'DefaultBusinessUnitDocs'],
1060
+ ['BU Access', 'AssociatedBusDocs'],
1061
+ ['Roles', 'RolesDocs'],
1058
1062
  ['Login', 'UserID'],
1059
1063
  ['ID', 'AccountUserID'],
1060
1064
  ['Key', 'CustomerKey'],
1061
1065
  ['E-Mail', 'Email'],
1062
1066
  ['Notification E-Mail', 'NotificationEmailAddress'],
1063
1067
  ['Timezone', 'TimeZoneName'],
1064
- ['SFMC Locale', 'LocaleCode'],
1068
+ ['SFMC Locale', 'c__LocaleCode'],
1065
1069
  ['Modified Date', 'ModifiedDate'],
1066
1070
  ['Modified By', 'ModifiedBy'],
1067
1071
  ['Created Date', 'CreatedDate'],
1068
1072
  ];
1069
1073
  let output = `# User Overview - ${this.buObject.credential}`;
1070
1074
  output += this._generateDocMd(
1071
- users.filter((user) => user.TYPE === 'User' && user.ActiveFlag === '✓'),
1075
+ users.filter((user) => user.TYPE === 'User' && user.ActiveFlagDocs === '✓'),
1072
1076
  'User',
1073
1077
  columnsToPrint
1074
1078
  );
1075
1079
  output += this._generateDocMd(
1076
- users.filter((user) => user.TYPE === 'User' && user.ActiveFlag === '-'),
1080
+ users.filter((user) => user.TYPE === 'User' && user.ActiveFlagDocs === '-'),
1077
1081
  'Inactivated User',
1078
1082
  columnsToPrint
1079
1083
  );
@@ -1124,7 +1128,7 @@ class User extends MetadataType {
1124
1128
  /**
1125
1129
  * manages post retrieve steps
1126
1130
  *
1127
- * @param {MetadataTypeItem} metadata a single item
1131
+ * @param {UserDocument} metadata a single item
1128
1132
  * @returns {MetadataTypeItem | void} a single item
1129
1133
  */
1130
1134
  static postRetrieveTasks(metadata) {
@@ -279,12 +279,12 @@ export default {
279
279
  // retrieving: false,
280
280
  // template: false,
281
281
  // },
282
- // 'configurationArguments.unconfigured': {
283
- // isCreateable: false,
284
- // isUpdateable: false,
285
- // retrieving: false,
286
- // template: false,
287
- // },
282
+ 'configurationArguments.unconfigured': {
283
+ isCreateable: false,
284
+ isUpdateable: false,
285
+ retrieving: false,
286
+ template: false,
287
+ },
288
288
  // 'configurationArguments.version': {
289
289
  // isCreateable: false,
290
290
  // isUpdateable: false,
@@ -928,7 +928,7 @@ export default {
928
928
  template: false,
929
929
  },
930
930
  'schema.name': {
931
- isCreateable: false,
931
+ isCreateable: true,
932
932
  isUpdateable: true,
933
933
  retrieving: false,
934
934
  template: false,
@@ -963,7 +963,7 @@ export default {
963
963
  retrieving: true,
964
964
  template: true,
965
965
  },
966
- r__dataExtension_CustomerKey: {
966
+ r__dataExtension_key: {
967
967
  isCreateable: false,
968
968
  isUpdateable: false,
969
969
  retrieving: true,
package/lib/util/auth.js CHANGED
@@ -42,7 +42,6 @@ const Auth = {
42
42
  const sdk = setupSDK(credential, authObject);
43
43
  try {
44
44
  // check credentials to allow clear log output and stop execution
45
- // @ts-expect-error - params are optional but jsdoc in SFMC-SDK says otherwise
46
45
  const test = await sdk.auth.getAccessToken();
47
46
  if (test.error) {
48
47
  throw new Error(test.error_description);
package/lib/util/cli.js CHANGED
@@ -557,7 +557,6 @@ const Cli = {
557
557
  return 0;
558
558
  });
559
559
  // add end-of-list marker
560
- // @ts-expect-error type checking this push() makes things very complicated...
561
560
  typeChoices.push(new inquirer.Separator(' ==== '));
562
561
  responses = await inquirer.prompt([
563
562
  {
@@ -74,7 +74,6 @@ const DevOps = {
74
74
  name: commit.date + ' / ' + commit.message + ' / ' + commit.author_name,
75
75
  value: commit.hash,
76
76
  }));
77
- // @ts-expect-error type checking this push() makes things very complicated...
78
77
  display.push(new inquirer.Separator(' ==== '));
79
78
 
80
79
  const responses = await inquirer.prompt([
@@ -99,6 +98,7 @@ const DevOps = {
99
98
  /**
100
99
  * @type {DeltaPkgItem[]}
101
100
  */
101
+ // @ts-expect-error TODO LATER
102
102
  const delta = (await git.diffSummary([range])).files
103
103
  // populate additional info for all changed files
104
104
  .map((/** @type {DeltaPkgItem} */ file) => {
@@ -317,7 +317,7 @@ const DevOps = {
317
317
  const copied = delta
318
318
  .filter((file) => !file.file.endsWith('.md')) // filter documentation files
319
319
  .map((file) =>
320
- File.copyFile(
320
+ File.copyFileSimple(
321
321
  file.file,
322
322
  path
323
323
  .normalize(file.file)
@@ -561,7 +561,6 @@ const DevOps = {
561
561
  for (let i = 1; i < tabled.length; i++) {
562
562
  for (let field of tabled[i]) {
563
563
  if (field !== '') {
564
- // @ts-expect-error bad typing in jsonToTable
565
564
  field = field === true ? '✓' : field === false ? '✗' : field;
566
565
  output += `| ${field} `;
567
566
  }
package/lib/util/file.js CHANGED
@@ -1,6 +1,4 @@
1
- /* eslint-disable no-control-regex */
2
1
  'use strict';
3
-
4
2
  import fs from 'fs-extra';
5
3
 
6
4
  import path from 'node:path';
@@ -50,7 +48,7 @@ const File = {
50
48
  * @param {string} to - full filepath including name where file should go
51
49
  * @returns {Promise.<{status:'ok'|'skipped'|'failed', statusMessage:string, file:string}>} - results object
52
50
  */
53
- async copyFile(from, to) {
51
+ async copyFileSimple(from, to) {
54
52
  try {
55
53
  await fs.copy(from, to);
56
54
  return { status: 'ok', statusMessage: null, file: from };
@@ -321,6 +319,7 @@ const File = {
321
319
 
322
320
  // save prettier errror into log file
323
321
  // Note: we have to filter color codes from prettier's error message before saving it to file
322
+ /* eslint-disable no-control-regex */
324
323
  this.writeToFile(
325
324
  directory,
326
325
  filename + '.error',
@@ -331,6 +330,7 @@ const File = {
331
330
  ''
332
331
  )}`
333
332
  );
333
+ /* eslint-enable no-control-regex */
334
334
 
335
335
  formatted = content;
336
336
  }
@@ -371,7 +371,7 @@ const File = {
371
371
  * @param {string | string[]} directory directory where the file is stored
372
372
  * @param {string} filename name of the file without '.json' ending
373
373
  * @param {boolean} cleanPath filters illegal chars if true
374
- * @returns {Promise.<object> | object | void} Promise or JSON object depending on if async or not; void on error
374
+ * @returns {Promise.<object | object | void>} Promise or JSON object depending on if async or not; void on error
375
375
  */
376
376
  readJSONFile: async function (directory, filename, cleanPath) {
377
377
  try {
@@ -409,11 +409,8 @@ const File = {
409
409
  try {
410
410
  directory = this.filterIllegalPathChars(this.normalizePath(directory));
411
411
  filename = this.filterIllegalFilenames(filename);
412
- // @ts-expect-error - somehow, the declared type does not allow for encoding to be passed in as a string, despite that working and being stated in the docs.
413
- return await fs.readFile(
414
- path.join(directory, filename + '.' + filetype),
415
- encoding || 'utf8'
416
- );
412
+ // @ts-expect-error somehow, the typing for fs-extra is not correct
413
+ return fs.readFile(path.join(directory, filename + '.' + filetype), encoding || 'utf8');
417
414
  } catch (ex) {
418
415
  Util.logger.debug('File.readFilteredFilename:: error | ' + ex.message);
419
416
  }
@@ -574,6 +571,6 @@ const File = {
574
571
  }
575
572
  },
576
573
  };
577
- const FileFs = { ...fs, ...File };
578
574
 
575
+ const FileFs = Object.assign(fs, File);
579
576
  export default FileFs;
@@ -93,6 +93,7 @@ export default class ReplaceContentBlockReference {
93
93
  static replaceReference(str, parentName, fromList, to) {
94
94
  if (!str) {
95
95
  const ex = new Error('No string provided');
96
+ // @ts-expect-error custom error object
96
97
  ex.code = 200;
97
98
  throw ex;
98
99
  }
@@ -133,6 +134,7 @@ export default class ReplaceContentBlockReference {
133
134
  }
134
135
  if (!changes) {
135
136
  const ex = new Error('No changes made to the code.');
137
+ // @ts-expect-error custom error object
136
138
  ex.code = 200;
137
139
  throw ex;
138
140
  }
@@ -158,7 +160,7 @@ export default class ReplaceContentBlockReference {
158
160
  break;
159
161
  }
160
162
  case 'name': {
161
- if (isSsjs) {
163
+ if (isSsjs && typeof identifier === 'string') {
162
164
  identifier = identifier.replaceAll('\\\\', '\\');
163
165
  }
164
166
  reference = ReplaceContentBlockReference.assetCacheMap.name[identifier];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcdev",
3
- "version": "7.0.3",
3
+ "version": "7.0.4",
4
4
  "description": "Accenture Salesforce Marketing Cloud DevTools",
5
5
  "author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
6
6
  "license": "MIT",
@@ -54,7 +54,7 @@
54
54
  "debug": "node --nolazy --inspect-brk=9229 lib/cli.js",
55
55
  "lint:fix": "eslint --fix lib/**/*.js types/*.js test/**/*.js",
56
56
  "lint": "eslint lib/**/*.js types/*.js test/**/*.js",
57
- "lint-ts": "tsc -p jsconfig.json --maxNodeModuleJsDepth 1 --noEmit",
57
+ "lint-ts": "tsc -p tsconfig.npmScripts.json",
58
58
  "prepare": "husky || true",
59
59
  "lint-and-test": "run-s lint test",
60
60
  "test": "mocha --reporter-option maxDiffSize=25000",
@@ -78,7 +78,7 @@
78
78
  "prettier": "3.3.2",
79
79
  "prettier-plugin-sql": "0.18.0",
80
80
  "semver": "7.6.0",
81
- "sfmc-sdk": "2.0.1",
81
+ "sfmc-sdk": "2.1.1",
82
82
  "simple-git": "3.25.0",
83
83
  "toposort": "2.0.2",
84
84
  "update-notifier": "7.0.0",
@@ -87,8 +87,10 @@
87
87
  },
88
88
  "devDependencies": {
89
89
  "@eslint/js": "9.6.0",
90
- "@types/mocha": "10.0.6",
90
+ "@types/fs-extra": "11.0.4",
91
+ "@types/mocha": "10.0.7",
91
92
  "@types/node": "20.14.9",
93
+ "@types/yargs": "17.0.32",
92
94
  "assert": "2.1.0",
93
95
  "axios-mock-adapter": "1.22.0",
94
96
  "c8": "10.0.0",
@@ -97,19 +99,19 @@
97
99
  "eslint": "9.6.0",
98
100
  "eslint-config-prettier": "9.1.0",
99
101
  "eslint-config-ssjs": "2.0.0",
100
- "eslint-plugin-jsdoc": "48.2.7",
102
+ "eslint-plugin-jsdoc": "48.5.2",
101
103
  "eslint-plugin-mocha": "10.4.3",
102
104
  "eslint-plugin-prettier": "5.1.2",
103
- "eslint-plugin-unicorn": "53.0.0",
105
+ "eslint-plugin-unicorn": "54.0.0",
104
106
  "fast-xml-parser": "4.4.0",
105
- "globals": "15.6.0",
107
+ "globals": "15.8.0",
106
108
  "husky": "9.0.11",
107
109
  "lint-staged": "15.2.7",
108
- "mocha": "10.4.0",
110
+ "mocha": "10.6.0",
109
111
  "mock-fs": "5.2.0",
110
112
  "npm-run-all": "4.1.5",
111
113
  "prettier-eslint": "16.3.0",
112
- "typescript": "5.4.5"
114
+ "typescript": "5.5.3"
113
115
  },
114
116
  "optionalDependencies": {
115
117
  "fsevents": "*"
@@ -461,8 +461,8 @@ describe('GENERAL', () => {
461
461
  );
462
462
  assert.equal(
463
463
  Object.keys(result[buName]['dataExtension']).length,
464
- 5,
465
- 'retrieve should have returned 5 dataExtension'
464
+ 7,
465
+ 'retrieve should have returned 7 dataExtension'
466
466
  );
467
467
  assert.equal(
468
468
  Object.keys(result[buName]['dataExtract']).length,
@@ -1191,6 +1191,24 @@ describe('GENERAL', () => {
1191
1191
  );
1192
1192
  });
1193
1193
  });
1194
+
1195
+ describe('Delete --metadata ~~~', () => {
1196
+ it('Should delete the item', async () => {
1197
+ const argvMetadata = [
1198
+ 'asset:testExisting_asset',
1199
+ 'automation:testExisting_automation',
1200
+ 'journey:testExisting_journey_Quicksend/1',
1201
+ 'journey:testExisting_journey_Multistep/1',
1202
+ ];
1203
+ const typeKeyCombo = handler.metadataToTypeKey(argvMetadata);
1204
+ // WHEN
1205
+ const isDeleted = await handler.deleteByKey('testInstance/testBU', typeKeyCombo);
1206
+ // THEN
1207
+ assert.equal(process.exitCode, 0, 'deleteByKey should not have thrown an error');
1208
+ assert.equal(isDeleted, true, 'deleteByKey should have returned true');
1209
+ return;
1210
+ });
1211
+ });
1194
1212
  });
1195
1213
 
1196
1214
  describe('without --metadata ================', () => {
@@ -100,5 +100,5 @@
100
100
  "verification"
101
101
  ]
102
102
  },
103
- "version": "7.0.3"
103
+ "version": "7.0.4"
104
104
  }
@@ -0,0 +1,201 @@
1
+ {
2
+ "type": "APIEvent",
3
+ "name": "testExisting_event",
4
+ "description": "updated on deploy",
5
+ "mode": "Production",
6
+ "eventDefinitionKey": "testExisting_event",
7
+ "schema": {
8
+ "fields": [
9
+ {
10
+ "name": "ContactId",
11
+ "dataType": "Text",
12
+ "maxLength": 18,
13
+ "isNullable": false,
14
+ "isPrimaryKey": true
15
+ },
16
+ {
17
+ "name": "Type",
18
+ "dataType": "Text",
19
+ "maxLength": "50",
20
+ "isNullable": false,
21
+ "isPrimaryKey": false
22
+ },
23
+ {
24
+ "name": "Status",
25
+ "dataType": "Text",
26
+ "maxLength": "50",
27
+ "isNullable": false,
28
+ "isPrimaryKey": true
29
+ },
30
+ {
31
+ "name": "Respondent",
32
+ "dataType": "Text",
33
+ "maxLength": "256",
34
+ "isNullable": true,
35
+ "isPrimaryKey": false
36
+ },
37
+ {
38
+ "name": "FirstName",
39
+ "dataType": "Text",
40
+ "maxLength": "256",
41
+ "isNullable": true,
42
+ "isPrimaryKey": false
43
+ },
44
+ {
45
+ "name": "LastName",
46
+ "dataType": "Text",
47
+ "maxLength": "256",
48
+ "isNullable": true,
49
+ "isPrimaryKey": false
50
+ },
51
+ {
52
+ "name": "PreferredLanguage",
53
+ "dataType": "Text",
54
+ "maxLength": "50",
55
+ "isNullable": true,
56
+ "isPrimaryKey": false
57
+ },
58
+ {
59
+ "name": "TouchPoint",
60
+ "dataType": "Text",
61
+ "maxLength": "256",
62
+ "isNullable": true,
63
+ "isPrimaryKey": false
64
+ },
65
+ {
66
+ "name": "Datestamp",
67
+ "dataType": "Date",
68
+ "defaultValue": "GetDate()",
69
+ "isNullable": true,
70
+ "isPrimaryKey": false
71
+ },
72
+ {
73
+ "name": "StartDate",
74
+ "dataType": "Date",
75
+ "isNullable": true,
76
+ "defaultValue": "",
77
+ "isPrimaryKey": false
78
+ },
79
+ {
80
+ "name": "EndDate",
81
+ "dataType": "Date",
82
+ "isNullable": true,
83
+ "isPrimaryKey": false
84
+ },
85
+ {
86
+ "name": "BroadcastedNotificationDate",
87
+ "dataType": "Date",
88
+ "isNullable": true,
89
+ "defaultValue": "",
90
+ "isPrimaryKey": false
91
+ },
92
+ {
93
+ "name": "FirstReminderDate",
94
+ "dataType": "Date",
95
+ "isNullable": true,
96
+ "isPrimaryKey": false
97
+ },
98
+ {
99
+ "name": "SecondReminderDate",
100
+ "dataType": "Date",
101
+ "isNullable": true,
102
+ "isPrimaryKey": false
103
+ },
104
+ {
105
+ "name": "Title",
106
+ "dataType": "Text",
107
+ "maxLength": "256",
108
+ "isNullable": true,
109
+ "isPrimaryKey": false
110
+ },
111
+ {
112
+ "name": "DisplayName",
113
+ "dataType": "Text",
114
+ "maxLength": "256",
115
+ "isNullable": true,
116
+ "isPrimaryKey": false
117
+ },
118
+ {
119
+ "name": "Text",
120
+ "dataType": "Text",
121
+ "maxLength": "256",
122
+ "isNullable": true,
123
+ "isPrimaryKey": false
124
+ },
125
+ {
126
+ "name": "Description",
127
+ "dataType": "Text",
128
+ "maxLength": "4000",
129
+ "isNullable": true,
130
+ "isPrimaryKey": false
131
+ },
132
+ {
133
+ "name": "Channel",
134
+ "dataType": "Text",
135
+ "maxLength": "256",
136
+ "isNullable": true,
137
+ "isPrimaryKey": false
138
+ },
139
+ {
140
+ "name": "FirstReminderChannel",
141
+ "dataType": "Text",
142
+ "maxLength": "256",
143
+ "isNullable": true,
144
+ "isPrimaryKey": false
145
+ },
146
+ {
147
+ "name": "SecondReminderChannel",
148
+ "dataType": "Text",
149
+ "maxLength": "256",
150
+ "isNullable": true,
151
+ "isPrimaryKey": false
152
+ },
153
+ {
154
+ "name": "Email",
155
+ "dataType": "Email",
156
+ "maxLength": "",
157
+ "isNullable": true,
158
+ "isPrimaryKey": false
159
+ },
160
+ {
161
+ "name": "ArticleOrTaskID",
162
+ "dataType": "Text",
163
+ "maxLength": "18",
164
+ "isNullable": false,
165
+ "isPrimaryKey": true
166
+ },
167
+ {
168
+ "name": "Points",
169
+ "dataType": "Number",
170
+ "maxLength": "",
171
+ "isNullable": true,
172
+ "isPrimaryKey": false
173
+ },
174
+ {
175
+ "name": "TaskType",
176
+ "dataType": "Text",
177
+ "maxLength": "255",
178
+ "isNullable": true,
179
+ "isPrimaryKey": false
180
+ },
181
+ {
182
+ "name": "TaskArea",
183
+ "dataType": "Text",
184
+ "maxLength": "255",
185
+ "isNullable": true,
186
+ "isPrimaryKey": false
187
+ },
188
+ {
189
+ "name": "AddedField",
190
+ "dataType": "Text",
191
+ "maxLength": "255",
192
+ "isNullable": true,
193
+ "isPrimaryKey": false
194
+ }
195
+ ],
196
+ "sendableCustomObjectField": "ContactId",
197
+ "sendableSubscriberField": "_SubscriberKey"
198
+ },
199
+ "isVisibleInPicker": true,
200
+ "r__dataExtension_key": "testExisting_event - 2024-07-05T080154625"
201
+ }