mcdev 8.0.0 → 8.0.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 (61) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  2. package/.github/workflows/coverage-base-update.yml +2 -2
  3. package/.github/workflows/coverage.yml +1 -1
  4. package/@types/lib/index.d.ts +1 -0
  5. package/@types/lib/index.d.ts.map +1 -1
  6. package/@types/lib/metadataTypes/Asset.d.ts +1 -0
  7. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  8. package/@types/lib/metadataTypes/Automation.d.ts +1 -0
  9. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  10. package/@types/lib/metadataTypes/DataExtension.d.ts +1 -0
  11. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  12. package/@types/lib/metadataTypes/DataExtract.d.ts +1 -0
  13. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
  14. package/@types/lib/metadataTypes/Event.d.ts +2 -0
  15. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  16. package/@types/lib/metadataTypes/FileTransfer.d.ts +1 -0
  17. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
  18. package/@types/lib/metadataTypes/ImportFile.d.ts +1 -0
  19. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  20. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/MetadataType.d.ts +1 -0
  22. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  23. package/@types/lib/metadataTypes/MobileKeyword.d.ts +1 -0
  24. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  25. package/@types/lib/metadataTypes/Query.d.ts +1 -0
  26. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  27. package/@types/lib/metadataTypes/Script.d.ts +1 -0
  28. package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
  29. package/@types/lib/util/util.d.ts +8 -1
  30. package/@types/lib/util/util.d.ts.map +1 -1
  31. package/lib/index.js +2 -3
  32. package/lib/metadataTypes/Asset.js +29 -7
  33. package/lib/metadataTypes/Automation.js +2 -0
  34. package/lib/metadataTypes/DataExtension.js +2 -0
  35. package/lib/metadataTypes/DataExtract.js +2 -0
  36. package/lib/metadataTypes/Event.js +21 -13
  37. package/lib/metadataTypes/FileTransfer.js +2 -0
  38. package/lib/metadataTypes/Folder.js +7 -21
  39. package/lib/metadataTypes/ImportFile.js +2 -0
  40. package/lib/metadataTypes/Journey.js +2 -1
  41. package/lib/metadataTypes/MetadataType.js +15 -13
  42. package/lib/metadataTypes/MobileKeyword.js +2 -0
  43. package/lib/metadataTypes/Query.js +2 -0
  44. package/lib/metadataTypes/Script.js +2 -0
  45. package/lib/util/cache.js +17 -3
  46. package/lib/util/file.js +10 -1
  47. package/lib/util/util.js +26 -12
  48. package/package.json +10 -10
  49. package/test/mockRoot/.mcdevrc.json +1 -1
  50. package/test/resources/9999999/asset/test_coderesource_js-retrieve-expected.json +2 -4
  51. package/test/resources/9999999/asset/test_coderesource_json-retrieve-expected.json +2 -4
  52. package/test/resources/9999999/asset/test_coderesource_xml-retrieve-expected.json +2 -4
  53. package/test/resources/9999999/asset/test_interactivecontent-retrieve-expected.json +2 -4
  54. package/test/resources/9999999/asset/test_landingpage-retrieve-expected.json +2 -4
  55. package/test/resources/9999999/asset/test_microsite-retrieve-expected.json +2 -4
  56. package/test/resources/9999999/asset/v1/content/assets/9451/get-response.json +3 -3
  57. package/test/resources/9999999/asset/v1/content/assets/9456/get-response.json +3 -3
  58. package/test/resources/9999999/asset/v1/content/assets/9458/get-response.json +3 -3
  59. package/test/resources/9999999/asset/v1/content/assets/9460/get-response.json +3 -3
  60. package/test/resources/9999999/asset/v1/content/assets/9463/get-response.json +3 -3
  61. package/test/resources/9999999/asset/v1/content/assets/9465/get-response.json +3 -3
@@ -33,6 +33,7 @@ import pLimit from 'p-limit';
33
33
  */
34
34
  class Event extends MetadataType {
35
35
  static reCacheDataExtensions = [];
36
+ static createdKeys = [];
36
37
 
37
38
  /**
38
39
  * Retrieves Metadata of Event Definition.
@@ -81,12 +82,14 @@ class Event extends MetadataType {
81
82
  /**
82
83
  * Retrieve a specific Event Definition by Name
83
84
  *
85
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
84
86
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
85
87
  * @param {string} name name of the metadata file
86
88
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
87
89
  * @returns {Promise.<MetadataTypeItemObj>} Promise of metadata
88
90
  */
89
91
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
92
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
90
93
  const res = await this.client.rest.get(
91
94
  '/interaction/v1/eventDefinitions?name=' + encodeURIComponent(name)
92
95
  );
@@ -158,7 +161,10 @@ class Event extends MetadataType {
158
161
  */
159
162
  static async deploy(metadata, deployDir, retrieveDir) {
160
163
  Util.logBeta(this.definition.type);
161
- return super.deploy(metadata, deployDir, retrieveDir);
164
+ const metadataMap = await super.deploy(metadata, deployDir, retrieveDir);
165
+
166
+ this.createdKeys.length = 0; // reset createdKeys after deploy to ensure it's not used in future retrieves
167
+ return metadataMap;
162
168
  }
163
169
 
164
170
  /**
@@ -168,6 +174,7 @@ class Event extends MetadataType {
168
174
  * @returns {Promise} Promise
169
175
  */
170
176
  static create(metadata) {
177
+ this.createdKeys.push(metadata[this.definition.keyField]);
171
178
  return super.createREST(metadata, '/interaction/v1/eventDefinitions/');
172
179
  }
173
180
 
@@ -215,8 +222,7 @@ class Event extends MetadataType {
215
222
  break;
216
223
  }
217
224
  case 'SalesforceObjectTriggerV2': {
218
- metadata.iconUrl ||=
219
- '/events/js/salesforce-event/events/NetworkMember/images/SF-Event-Icon.svg';
225
+ metadata.iconUrl ||= '/events/js/salesforce-event/images/SF-Event-Icon.svg';
220
226
  break;
221
227
  }
222
228
  case 'AutomationAudience': {
@@ -601,16 +607,18 @@ class Event extends MetadataType {
601
607
  if (metadata.mode === 'Production') {
602
608
  delete metadata.mode;
603
609
  }
604
- if (metadata.interactionCount === 0 && metadata.publishedInteractionCount === 0) {
605
- Util.logger.warn(
606
- ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${metadata[this.definition.keyField]}): is no longer used and could therefore be deleted. Associated Journeys: ${metadata.interactionCount}. Active Journeys: ${metadata.publishedInteractionCount}.`
607
- );
608
- } else if (metadata.publishedInteractionCount === 0) {
609
- Util.logger.info(
610
- Util.getGrayMsg(
611
- ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${metadata[this.definition.keyField]}): is currently inactive. Associated Journeys: ${metadata.interactionCount}. Active Journeys: ${metadata.publishedInteractionCount}.`
612
- )
613
- );
610
+ if (!this.createdKeys.includes(metadata[this.definition.keyField])) {
611
+ if (metadata.interactionCount === 0 && metadata.publishedInteractionCount === 0) {
612
+ Util.logger.warn(
613
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${metadata[this.definition.keyField]}): is not used and could therefore be deleted. Associated Journeys: ${metadata.interactionCount}. Active Journeys: ${metadata.publishedInteractionCount}.`
614
+ );
615
+ } else if (metadata.publishedInteractionCount === 0) {
616
+ Util.logger.info(
617
+ Util.getGrayMsg(
618
+ ` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${metadata[this.definition.keyField]}): is currently inactive. Associated Journeys: ${metadata.interactionCount}. Active Journeys: ${metadata.publishedInteractionCount}.`
619
+ )
620
+ );
621
+ }
614
622
  }
615
623
 
616
624
  try {
@@ -50,12 +50,14 @@ class FileTransfer extends MetadataType {
50
50
  /**
51
51
  * Retrieve a specific File Transfer Definition by Name
52
52
  *
53
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
53
54
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
54
55
  * @param {string} name name of the metadata file
55
56
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
56
57
  * @returns {Promise.<MetadataTypeItemObj>} Promise
57
58
  */
58
59
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
60
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
59
61
  const res = await this.client.rest.get(
60
62
  '/automation/v1/filetransfers/?$filter=name%20eq%20' + encodeURIComponent(name)
61
63
  );
@@ -101,8 +101,8 @@ class Folder extends MetadataType {
101
101
  idMap[id].Path = idMap[id].Name;
102
102
  }
103
103
  } else {
104
- Util.logger.warn(
105
- ` - Skipping folder ${idMap[id].Name} (${id}, type: ${idMap[id].ContentType}): Cannot find parent folder (${idMap[id].ParentFolder.ID})`
104
+ Util.logger.info(
105
+ ` skipping folder ${idMap[id].Name} (${id}, type: ${idMap[id].ContentType}): Cannot find parent folder (${idMap[id].ParentFolder.ID})`
106
106
  );
107
107
  }
108
108
  }
@@ -110,7 +110,7 @@ class Folder extends MetadataType {
110
110
  else if (idMap[id].Name !== '<ROOT>') {
111
111
  idMap[id].Path = '';
112
112
  Util.logger.warn(
113
- ` - Skipping folder ${idMap[id].Name} (${id}, type: ${idMap[id].ContentType}): Does not have a parent folder`
113
+ ` skipping folder ${idMap[id].Name} (${id}, type: ${idMap[id].ContentType}): Does not have a parent folder`
114
114
  );
115
115
  }
116
116
  }
@@ -220,25 +220,11 @@ class Folder extends MetadataType {
220
220
  let existingId;
221
221
  try {
222
222
  // perform a secondary check based on path
223
- existingId = cache.searchForField(
224
- 'folder',
225
- deployableMetadata.Path,
226
- 'Path',
227
- 'ID',
228
- undefined,
229
- true
230
- );
231
- const cachedVersion = cache.getByKey(
232
- 'folder',
233
- cache.searchForField(
234
- 'folder',
235
- deployableMetadata.Path,
236
- 'Path',
237
- this.definition.keyField,
238
- undefined,
239
- true
240
- )
223
+
224
+ const cachedVersion = cache.getFolderByPath(
225
+ deployableMetadata.Path
241
226
  );
227
+ existingId = cachedVersion?.ID;
242
228
  if (
243
229
  existingId &&
244
230
  !this.hasChangedGeneric(
@@ -133,12 +133,14 @@ class ImportFile extends MetadataType {
133
133
  /**
134
134
  * Retrieve a specific Import Definition by Name
135
135
  *
136
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
136
137
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
137
138
  * @param {string} name name of the metadata file
138
139
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
139
140
  * @returns {Promise.<MetadataTypeItemObj>} Promise
140
141
  */
141
142
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
143
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
142
144
  // using '?$filter=name%20eq%20' + encodeURIComponent(name) would also work but that just retrieves more data for no reason
143
145
  const cache = await this.retrieveForCache(null, null, 'name:' + name);
144
146
  const metadataArr = Object.values(cache?.metadata);
@@ -182,7 +182,8 @@ class Journey extends MetadataType {
182
182
  // if the interaction does not exist, the API returns an error code which would otherwise bring execution to a hold
183
183
  if (
184
184
  [
185
- 'Interaction matching key not found.',
185
+ 'Interaction matching key not found.', // might be outdated
186
+ 'Interaction matching criteria not found.', // seen in 2025-05
186
187
  'Must provide a valid ID or Key parameter',
187
188
  ].includes(ex.message) ||
188
189
  (key && ex.code === 'ERR_BAD_REQUEST')
@@ -299,7 +299,7 @@ class MetadataType {
299
299
  * @returns {Promise.<MetadataTypeMapObj>} metadata
300
300
  */
301
301
  static async retrieve(retrieveDir, additionalFields, subTypeArr, key) {
302
- Util.notSupportedError(this.definition, 'retrieve');
302
+ Util.logNotSupported(this.definition, 'retrieve');
303
303
  return { metadata: {}, type: this.definition.type };
304
304
  }
305
305
 
@@ -329,6 +329,7 @@ class MetadataType {
329
329
  /**
330
330
  * Gets metadata cache with limited fields and does not store value to disk
331
331
  *
332
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
332
333
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
333
334
  * @param {string} name name of the metadata file
334
335
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
@@ -336,7 +337,8 @@ class MetadataType {
336
337
  * @returns {Promise.<MetadataTypeItemObj>} metadata
337
338
  */
338
339
  static async retrieveAsTemplate(templateDir, name, templateVariables, subType) {
339
- Util.notSupportedError(this.definition, 'retrieveAsTemplate');
340
+ Util.logNotSupported(this.definition, 'retrieveAsTemplate');
341
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
340
342
  return { metadata: null, type: this.definition.type };
341
343
  }
342
344
 
@@ -499,7 +501,7 @@ class MetadataType {
499
501
  * @returns {Promise.<object> | null} Promise of API response or null in case of an error
500
502
  */
501
503
  static async create(metadata, deployDir) {
502
- Util.notSupportedError(this.definition, 'retrieveAsTemplate', metadata);
504
+ Util.logNotSupported(this.definition, 'create', metadata);
503
505
  return;
504
506
  }
505
507
 
@@ -511,7 +513,7 @@ class MetadataType {
511
513
  * @returns {Promise.<object> | null} Promise of API response or null in case of an error
512
514
  */
513
515
  static async update(metadata, metadataBefore) {
514
- Util.notSupportedError(this.definition, 'retrieveAsTemplate', metadata);
516
+ Util.logNotSupported(this.definition, 'update', metadata);
515
517
  return;
516
518
  }
517
519
 
@@ -524,7 +526,7 @@ class MetadataType {
524
526
  * @returns {Promise.<string[]>} Returns list of keys that were refreshed
525
527
  */
526
528
  static async refresh(keyArr, checkKey = true, upsertResults) {
527
- Util.notSupportedError(this.definition, 'refresh');
529
+ Util.logNotSupported(this.definition, 'refresh');
528
530
  return [];
529
531
  }
530
532
 
@@ -630,7 +632,7 @@ class MetadataType {
630
632
  * @returns {Promise.<MetadataTypeItem | CodeExtractItem>} key of the item that was updated
631
633
  */
632
634
  static async replaceCbReference(item, retrieveDir, findAssetKeys) {
633
- Util.notSupportedError(this.definition, 'replaceCbReference');
635
+ Util.logNotSupported(this.definition, 'replaceCbReference');
634
636
  return [];
635
637
  }
636
638
 
@@ -642,7 +644,7 @@ class MetadataType {
642
644
  * @returns {Promise.<string[]>} Returns list of keys that were executed
643
645
  */
644
646
  static async execute(keyArr, cache) {
645
- Util.notSupportedError(this.definition, 'execute');
647
+ Util.logNotSupported(this.definition, 'execute');
646
648
  return [];
647
649
  }
648
650
 
@@ -654,7 +656,7 @@ class MetadataType {
654
656
  * @returns {Promise.<string[]>} Returns list of keys that were executed
655
657
  */
656
658
  static async schedule(keyArr, cache) {
657
- Util.notSupportedError(this.definition, 'schedule');
659
+ Util.logNotSupported(this.definition, 'schedule');
658
660
  return [];
659
661
  }
660
662
 
@@ -666,7 +668,7 @@ class MetadataType {
666
668
  * @returns {Promise.<string[]>} Returns list of keys that were paused
667
669
  */
668
670
  static async pause(keyArr, cache) {
669
- Util.notSupportedError(this.definition, 'pause');
671
+ Util.logNotSupported(this.definition, 'pause');
670
672
  return [];
671
673
  }
672
674
 
@@ -677,7 +679,7 @@ class MetadataType {
677
679
  * @returns {Promise.<string[]>} Returns list of keys that were stopped
678
680
  */
679
681
  static async stop(keyArr) {
680
- Util.notSupportedError(this.definition, 'stop');
682
+ Util.logNotSupported(this.definition, 'stop');
681
683
  return [];
682
684
  }
683
685
 
@@ -2464,7 +2466,7 @@ class MetadataType {
2464
2466
  */
2465
2467
  static document(metadata, isDeploy) {
2466
2468
  if (!isDeploy) {
2467
- Util.notSupportedError(this.definition, 'document');
2469
+ Util.logNotSupported(this.definition, 'document');
2468
2470
  }
2469
2471
  }
2470
2472
 
@@ -2475,7 +2477,7 @@ class MetadataType {
2475
2477
  * @returns {Promise.<{key:string, name:string}>} key, name and path of metadata; null if not found
2476
2478
  */
2477
2479
  static async resolveId(id) {
2478
- Util.notSupportedError(this.definition, 'resolveId');
2480
+ Util.logNotSupported(this.definition, 'resolveId');
2479
2481
  return;
2480
2482
  }
2481
2483
 
@@ -2486,7 +2488,7 @@ class MetadataType {
2486
2488
  * @returns {Promise.<boolean>} deletion success status
2487
2489
  */
2488
2490
  static async deleteByKey(customerKey) {
2489
- Util.notSupportedError(this.definition, 'delete');
2491
+ Util.logNotSupported(this.definition, 'delete');
2490
2492
  return false;
2491
2493
  }
2492
2494
 
@@ -137,12 +137,14 @@ class MobileKeyword extends MetadataType {
137
137
  /**
138
138
  * retrieve an item and create a template from it
139
139
  *
140
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
140
141
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
141
142
  * @param {string} key name of the metadata file
142
143
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
143
144
  * @returns {Promise.<MetadataTypeItemObj>} Promise of metadata
144
145
  */
145
146
  static async retrieveAsTemplate(templateDir, key, templateVariables) {
147
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
146
148
  try {
147
149
  let queryParams;
148
150
  [key, queryParams] = this.#getRetrieveKeyAndUrl(key);
@@ -127,12 +127,14 @@ class Query extends MetadataType {
127
127
  /**
128
128
  * Retrieve a specific Query by Name
129
129
  *
130
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
130
131
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
131
132
  * @param {string} name name of the metadata file
132
133
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
133
134
  * @returns {Promise.<{metadata: Query, type: string}>} Promise of metadata
134
135
  */
135
136
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
137
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
136
138
  await File.initPrettier('sql');
137
139
  return super.retrieveREST(
138
140
  templateDir,
@@ -57,12 +57,14 @@ class Script extends MetadataType {
57
57
  /**
58
58
  * Retrieve a specific Script by Name
59
59
  *
60
+ * @deprecated Use `retrieve` followed by `build` instead. `retrieveAsTemplate` will be removed in a future version.
60
61
  * @param {string} templateDir Directory where retrieved metadata directory will be saved
61
62
  * @param {string} name name of the metadata file
62
63
  * @param {TemplateMap} templateVariables variables to be replaced in the metadata
63
64
  * @returns {Promise.<{metadata: ScriptItem, type: string}>} Promise
64
65
  */
65
66
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
67
+ Util.logDeprecated('retrieveAsTemplate', `'retrieve' followed by 'build'`);
66
68
  await File.initPrettier('ssjs');
67
69
  return super.retrieveREST(
68
70
  templateDir,
package/lib/util/cache.js CHANGED
@@ -186,6 +186,19 @@ export default {
186
186
  * @returns {number} folder ID
187
187
  */
188
188
  getFolderId(r__folder_Path, overrideMID, allowOtherBu = true) {
189
+ const folder = this.getFolderByPath(r__folder_Path, overrideMID, allowOtherBu);
190
+ return folder?.ID;
191
+ },
192
+
193
+ /**
194
+ * helper for setFolderId
195
+ *
196
+ * @param {string} r__folder_Path folder path value
197
+ * @param {number} [overrideMID] ignore currentMID and use alternative (for example parent MID)
198
+ * @param {boolean} allowOtherBu getting folder from other BU; FALSE for folder parent search
199
+ * @returns {object} folder item
200
+ */
201
+ getFolderByPath(r__folder_Path, overrideMID, allowOtherBu = true) {
189
202
  if (!r__folder_Path) {
190
203
  throw new Error('r__folder_Path not set');
191
204
  }
@@ -194,18 +207,19 @@ export default {
194
207
  if (!folderMap) {
195
208
  throw new Error('No folders found in cache');
196
209
  }
210
+ const folderPath_lower = r__folder_Path.toLowerCase();
197
211
  const potentialFolders = [];
198
212
  for (const folder of Object.values(folderMap)) {
199
- if (folder.Path === r__folder_Path) {
213
+ if (folder.Path.toLowerCase() === folderPath_lower) {
200
214
  if (folder?.Client?.ID === (overrideMID || currentMID)) {
201
- return folder.ID;
215
+ return folder;
202
216
  } else if (allowOtherBu) {
203
217
  potentialFolders.push(folder);
204
218
  }
205
219
  }
206
220
  }
207
221
  if (potentialFolders.length >= 1) {
208
- return potentialFolders[0].ID;
222
+ return potentialFolders[0];
209
223
  } else {
210
224
  throw new Error(`No folders found with path ${r__folder_Path}`);
211
225
  }
package/lib/util/file.js CHANGED
@@ -571,6 +571,15 @@ const File = {
571
571
  * @returns {Promise.<boolean>} success of config load
572
572
  */
573
573
  async initPrettier(filetype = 'html') {
574
+ if (Util.OPTIONS.format === false) {
575
+ // auto-formatting was disabled via CLI option
576
+ return;
577
+ }
578
+ const properties = await config.getProperties();
579
+ if (Util.OPTIONS.format !== true && properties.options.formatOnSave === false) {
580
+ // auto-formatting was disabled via config file
581
+ return;
582
+ }
574
583
  if (FileFs.prettierConfig === null || FileFs.prettierConfigFileType !== filetype) {
575
584
  // run this if no config was yet found or if the filetype previously used to initialize it differs (because it results in a potentially different config!)
576
585
  FileFs.prettierConfigFileType = filetype;
@@ -591,7 +600,7 @@ const File = {
591
600
  return true;
592
601
  } catch (ex) {
593
602
  FileFs.prettierConfig = false;
594
- Util.logger.error('Cannot apply auto-formatting to your code:' + ex.message);
603
+ Util.logger.error('Cannot apply auto-formatting to your code: ' + ex.message);
595
604
  return false;
596
605
  }
597
606
  } else {
package/lib/util/util.js CHANGED
@@ -904,6 +904,32 @@ export const Util = {
904
904
  ` - 🚧 ${type} support is currently still in beta. Please report any issues here: https://github.com/Accenture/sfmc-devtools/issues/new/choose`
905
905
  );
906
906
  },
907
+
908
+ /**
909
+ * outputs a warning that the given method is deprecated
910
+ *
911
+ * @param {string} method name of the method
912
+ * @param {string} [useInstead] optionally specify which method to use instead
913
+ */
914
+ logDeprecated(method, useInstead = '') {
915
+ Util.logger.warn(
916
+ ` 💥 '${method}' is deprecated and will be sunset in a future version. ${useInstead ? `Please use ${useInstead} instead.` : ''}`
917
+ );
918
+ },
919
+
920
+ /**
921
+ * helper for MetadataType class to issue a similar error message for unsupported methods
922
+ *
923
+ * @param {any} definition type definition object
924
+ * @param {string} method name of the method thats not supported
925
+ * @param {MetadataTypeItem} [item] metadata item
926
+ */
927
+ logNotSupported: function (definition, method, item) {
928
+ Util.logger.error(
929
+ ` ☇ skipping ${item ? Util.getTypeKeyName(definition, item) : definition.type}: ${method} is not supported for ${definition.type}`
930
+ );
931
+ },
932
+
907
933
  // defined colors for logging things in different colors
908
934
  color: {
909
935
  reset: '\x1B[0m',
@@ -1317,18 +1343,6 @@ export const Util = {
1317
1343
  return acc;
1318
1344
  }, {});
1319
1345
  },
1320
- /**
1321
- * helper for MetadataType class to issue a similar error message for unsupported methods
1322
- *
1323
- * @param {any} definition type definition object
1324
- * @param {string} method name of the method thats not supported
1325
- * @param {MetadataTypeItem} [item] metadata item
1326
- */
1327
- notSupportedError: function (definition, method, item) {
1328
- Util.logger.error(
1329
- ` ☇ skipping ${item ? Util.getTypeKeyName(definition, item) : definition.type}: ${method} is not supported yet for ${definition.type}`
1330
- );
1331
- },
1332
1346
  };
1333
1347
 
1334
1348
  Util.startLogger(false, true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcdev",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "description": "Accenture Salesforce Marketing Cloud DevTools",
5
5
  "author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
6
6
  "license": "MIT",
@@ -90,28 +90,28 @@
90
90
  "yocto-spinner": "0.2.2"
91
91
  },
92
92
  "devDependencies": {
93
- "@eslint/js": "9.25.1",
93
+ "@eslint/js": "9.28.0",
94
94
  "@types/fs-extra": "11.0.4",
95
95
  "@types/inquirer": "9.0.7",
96
96
  "@types/mocha": "10.0.8",
97
- "@types/node": "22.15.3",
97
+ "@types/node": "22.15.29",
98
98
  "@types/yargs": "17.0.33",
99
99
  "assert": "2.1.0",
100
100
  "axios-mock-adapter": "2.0.0",
101
101
  "c8": "10.1.3",
102
102
  "chai": "5.2.0",
103
103
  "chai-files": "1.4.0",
104
- "eslint": "9.25.1",
104
+ "eslint": "9.28.0",
105
105
  "eslint-config-ssjs": "2.0.0",
106
- "eslint-plugin-jsdoc": "50.6.11",
106
+ "eslint-plugin-jsdoc": "50.7.1",
107
107
  "eslint-plugin-mocha": "11.0.0",
108
- "eslint-plugin-prettier": "5.2.6",
109
- "eslint-plugin-unicorn": "59.0.0",
110
- "fast-xml-parser": "5.2.1",
111
- "globals": "16.0.0",
108
+ "eslint-plugin-prettier": "5.4.1",
109
+ "eslint-plugin-unicorn": "59.0.1",
110
+ "fast-xml-parser": "5.2.3",
111
+ "globals": "16.2.0",
112
112
  "husky": "9.1.7",
113
113
  "lint-staged": "15.5.1",
114
- "mocha": "11.1.0",
114
+ "mocha": "11.5.0",
115
115
  "mock-fs": "5.3.0",
116
116
  "npm-run-all": "4.1.5",
117
117
  "prettier-eslint": "16.4.1",
@@ -175,5 +175,5 @@
175
175
  "verification"
176
176
  ]
177
177
  },
178
- "version": "8.0.0"
178
+ "version": "8.0.1"
179
179
  }
@@ -4,9 +4,6 @@
4
4
  "name": "jscoderesource"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "contentType": "application/javascript",
11
8
  "createdBy": {
12
9
  "email": "joern.berkefeld@accenture.com",
@@ -43,5 +40,6 @@
43
40
  "status": {
44
41
  "name": "Draft"
45
42
  },
46
- "version": 1
43
+ "version": 1,
44
+ "r__folder_Path": "Content Builder/Test Folder"
47
45
  }
@@ -4,9 +4,6 @@
4
4
  "name": "jsoncoderesource"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "contentType": "application/json",
11
8
  "createdBy": {
12
9
  "email": "joern.berkefeld@accenture.com",
@@ -43,5 +40,6 @@
43
40
  "status": {
44
41
  "name": "Draft"
45
42
  },
46
- "version": 1
43
+ "version": 1,
44
+ "r__folder_Path": "Content Builder/Test Folder"
47
45
  }
@@ -4,9 +4,6 @@
4
4
  "name": "xmlcoderesource"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "contentType": "application/xml",
11
8
  "createdBy": {
12
9
  "email": "joern.berkefeld@accenture.com",
@@ -42,5 +39,6 @@
42
39
  "status": {
43
40
  "name": "Draft"
44
41
  },
45
- "version": 1
42
+ "version": 1,
43
+ "r__folder_Path": "Content Builder/Test Folder"
46
44
  }
@@ -4,9 +4,6 @@
4
4
  "name": "interactivecontent"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "content": {
11
8
  "url": "https://oss-test.accenture.com/test_interactivecontent"
12
9
  },
@@ -39,5 +36,6 @@
39
36
  "status": {
40
37
  "name": "Draft"
41
38
  },
42
- "version": 1
39
+ "version": 1,
40
+ "r__folder_Path": "Content Builder/Test Folder"
43
41
  }
@@ -4,9 +4,6 @@
4
4
  "name": "landingpage"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "content": {
11
8
  "url": "https://oss-test.accenture.com/test_landingpage"
12
9
  },
@@ -38,5 +35,6 @@
38
35
  "status": {
39
36
  "name": "Draft"
40
37
  },
41
- "version": 1
38
+ "version": 1,
39
+ "r__folder_Path": "Content Builder/Test Folder"
42
40
  }
@@ -4,9 +4,6 @@
4
4
  "name": "microsite"
5
5
  },
6
6
  "availableViews": [],
7
- "category": {
8
- "name": "mcdev"
9
- },
10
7
  "content": {
11
8
  "url": "https://cloud.eu.randstad.com/test_microsite"
12
9
  },
@@ -39,5 +36,6 @@
39
36
  "status": {
40
37
  "name": "Draft"
41
38
  },
42
- "version": 1
39
+ "version": 1,
40
+ "r__folder_Path": "Content Builder/Test Folder"
43
41
  }
@@ -41,9 +41,9 @@
41
41
  "thumbnailUrl": "/v1/assets/9451/thumbnail"
42
42
  },
43
43
  "category": {
44
- "id": 27675,
45
- "name": "mcdev",
46
- "parentId": 14914
44
+ "id": 90888,
45
+ "name": "Test Folder",
46
+ "parentId": 89397
47
47
  },
48
48
  "content": "/* insert code here */\n",
49
49
  "meta": {