mcdev 7.10.1 → 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 (166) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/.github/workflows/code-test.yml +8 -100
  3. package/.github/workflows/coverage-base-update.yml +2 -2
  4. package/.github/workflows/coverage.yml +1 -1
  5. package/@types/lib/Deployer.d.ts.map +1 -1
  6. package/@types/lib/Retriever.d.ts.map +1 -1
  7. package/@types/lib/index.d.ts +17 -4
  8. package/@types/lib/index.d.ts.map +1 -1
  9. package/@types/lib/metadataTypes/Asset.d.ts +46 -8
  10. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  11. package/@types/lib/metadataTypes/Automation.d.ts +14 -4
  12. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  13. package/@types/lib/metadataTypes/DataExtension.d.ts +1 -0
  14. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  15. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  16. package/@types/lib/metadataTypes/DataExtract.d.ts +1 -0
  17. package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
  18. package/@types/lib/metadataTypes/Event.d.ts +8 -0
  19. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  20. package/@types/lib/metadataTypes/FileTransfer.d.ts +1 -0
  21. package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
  22. package/@types/lib/metadataTypes/Folder.d.ts +49 -12
  23. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
  24. package/@types/lib/metadataTypes/ImportFile.d.ts +15 -0
  25. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  26. package/@types/lib/metadataTypes/Journey.d.ts +166 -6
  27. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  28. package/@types/lib/metadataTypes/MetadataType.d.ts +6 -3
  29. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  30. package/@types/lib/metadataTypes/MobileKeyword.d.ts +1 -0
  31. package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
  32. package/@types/lib/metadataTypes/Query.d.ts +1 -0
  33. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  34. package/@types/lib/metadataTypes/Script.d.ts +1 -0
  35. package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
  36. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts +45 -8
  37. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts +6 -0
  38. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +6 -0
  39. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts +49 -12
  40. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts +3 -0
  41. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +159 -6
  42. package/@types/lib/util/cache.d.ts +2 -1
  43. package/@types/lib/util/cache.d.ts.map +1 -1
  44. package/@types/lib/util/devops.d.ts.map +1 -1
  45. package/@types/lib/util/util.d.ts +8 -1
  46. package/@types/lib/util/util.d.ts.map +1 -1
  47. package/@types/types/mcdev.d.d.ts +16 -0
  48. package/@types/types/mcdev.d.d.ts.map +1 -1
  49. package/boilerplate/files/.vscode/settings.json +5 -0
  50. package/eslint.config.js +2 -2
  51. package/lib/Deployer.js +3 -0
  52. package/lib/Retriever.js +8 -2
  53. package/lib/cli.js +29 -0
  54. package/lib/index.js +27 -31
  55. package/lib/metadataTypes/Asset.js +155 -17
  56. package/lib/metadataTypes/Automation.js +137 -40
  57. package/lib/metadataTypes/DataExtension.js +2 -10
  58. package/lib/metadataTypes/DataExtensionField.js +9 -15
  59. package/lib/metadataTypes/DataExtract.js +2 -0
  60. package/lib/metadataTypes/Event.js +63 -32
  61. package/lib/metadataTypes/FileTransfer.js +2 -0
  62. package/lib/metadataTypes/Folder.js +99 -27
  63. package/lib/metadataTypes/ImportFile.js +92 -29
  64. package/lib/metadataTypes/Journey.js +184 -24
  65. package/lib/metadataTypes/MetadataType.js +53 -25
  66. package/lib/metadataTypes/MobileKeyword.js +2 -0
  67. package/lib/metadataTypes/Query.js +2 -0
  68. package/lib/metadataTypes/Script.js +2 -0
  69. package/lib/metadataTypes/definitions/Asset.definition.js +196 -142
  70. package/lib/metadataTypes/definitions/Automation.definition.js +6 -0
  71. package/lib/metadataTypes/definitions/DataExtension.definition.js +7 -6
  72. package/lib/metadataTypes/definitions/Event.definition.js +6 -0
  73. package/lib/metadataTypes/definitions/Folder.definition.js +69 -22
  74. package/lib/metadataTypes/definitions/ImportFile.definition.js +3 -0
  75. package/lib/metadataTypes/definitions/Journey.definition.js +165 -11
  76. package/lib/util/cache.js +41 -8
  77. package/lib/util/devops.js +20 -5
  78. package/lib/util/file.js +10 -1
  79. package/lib/util/util.js +26 -12
  80. package/package.json +18 -19
  81. package/test/general.test.js +8 -8
  82. package/test/mockRoot/.mcdev-validations.js +2 -3
  83. package/test/mockRoot/.mcdevrc.json +1 -1
  84. package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +2 -1
  85. package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +2 -1
  86. package/test/resourceFactory.js +31 -5
  87. package/test/resources/1111111/dataExtension/update-expected.json +1 -1
  88. package/test/resources/9999999/asset/test_coderesource_js-retrieve-expected.js +1 -0
  89. package/test/resources/9999999/asset/test_coderesource_js-retrieve-expected.json +45 -0
  90. package/test/resources/9999999/asset/test_coderesource_json-retrieve-expected.json +45 -0
  91. package/test/resources/9999999/asset/test_coderesource_json-retrieve-expected.jsonc +1 -0
  92. package/test/resources/9999999/asset/test_coderesource_xml-retrieve-expected.json +44 -0
  93. package/test/resources/9999999/asset/test_coderesource_xml-retrieve-expected.xml +1 -0
  94. package/test/resources/9999999/asset/test_interactivecontent-retrieve-expected.json +41 -0
  95. package/test/resources/9999999/asset/test_landingpage-retrieve-expected.json +40 -0
  96. package/test/resources/9999999/asset/test_microsite-retrieve-expected.json +41 -0
  97. package/test/resources/9999999/asset/v1/content/assets/9451/get-response.json +61 -0
  98. package/test/resources/9999999/asset/v1/content/assets/9456/get-response.json +56 -0
  99. package/test/resources/9999999/asset/v1/content/assets/9458/get-response.json +56 -0
  100. package/test/resources/9999999/asset/v1/content/assets/9460/get-response.json +59 -0
  101. package/test/resources/9999999/asset/v1/content/assets/9463/get-response.json +61 -0
  102. package/test/resources/9999999/asset/v1/content/assets/9465/get-response.json +54 -0
  103. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN1,3,4,14,15,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,205,206,210,211,212,213,214,215,216,217,218,219,220,221,222.json +94 -1
  104. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN219,220,221,222,223,224,225,226,227,228,230,232,240,241,242,243,244,245.json +168 -0
  105. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN240,241,242,243,244,245.json +144 -0
  106. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN246,247,248,249.json +132 -0
  107. package/test/resources/9999999/dataExtension/update-callout-afterCreatedViaEvent-expected.xml +1 -1
  108. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-sha,automatio,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,triggered,triggered,useriniti-response.xml → retrieve-ContentTypeINasset,asset-sha,automatio,cloudpage,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,triggered,triggered,useriniti-response.xml} +44 -1
  109. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-sha,automatio,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,useriniti-response.xml → retrieve-ContentTypeINasset,asset-sha,automatio,cloudpage,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,useriniti-response.xml} +44 -0
  110. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,dataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages,dataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +44 -0
  111. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,journey-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages,journey-response.xml} +44 -0
  112. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,cloudpages,ssjsactivity-response.xml +136 -0
  113. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,ssjsactivity-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages-response.xml} +29 -7
  114. package/test/resources/9999999/dataFolder/{+retrieve-response.xml → retrieve-response.xml} +23 -0
  115. package/test/resources/9999999/dataFolder/update-response.xml +31 -0
  116. package/test/resources/9999999/event/build-expected.json +0 -1
  117. package/test/resources/9999999/event/get-automation-expected.json +0 -1
  118. package/test/resources/9999999/event/get-expected.json +0 -2
  119. package/test/resources/9999999/event/get-published-expected.json +0 -2
  120. package/test/resources/9999999/event/post_withExistingDE-expected.json +0 -2
  121. package/test/resources/9999999/event/post_withSchema-callout-expected.json +3 -0
  122. package/test/resources/9999999/event/post_withSchema-expected.json +0 -2
  123. package/test/resources/9999999/event/put-callout-expected.json +3 -0
  124. package/test/resources/9999999/event/put-expected.json +0 -2
  125. package/test/resources/9999999/event/template-expected.json +0 -1
  126. package/test/resources/9999999/folder-deploy/Data Extensions/testExisting_folder.folder-meta.json +9 -0
  127. package/test/resources/9999999/importFile/get-dataImport-expected.json +1 -1
  128. package/test/resources/9999999/importFile/get-expected.json +4 -1
  129. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=1.json +86 -0
  130. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=2.json +101 -0
  131. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=3.json +86 -0
  132. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/delete-response-versionNumber=1.txt +1 -0
  133. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/get-response-versionNumber=1.json +461 -0
  134. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/get-response-versionNumber=3.json +461 -0
  135. package/test/resources/9999999/interaction/v1/interactions/dsfdsafdsa-922c-4568-85a5-e5cc77efc3be/audit/all/get-response-versionNumber=1.json +38 -0
  136. package/test/resources/9999999/interaction/v1/interactions/dsfdsafdsa-922c-4568-85a5-e5cc77efc3be/audit/all/get-response-versionNumber=2.json +53 -0
  137. package/test/resources/9999999/interaction/v1/interactions/get-response.json +2 -2
  138. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Multistep/get-response-versionNumber=1.json +461 -0
  139. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Quicksend/get-response-versionNumber=1.json +253 -0
  140. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail/get-response-versionNumber=1.json +219 -0
  141. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail_notPublished/get-response-versionNumber=1.json +226 -0
  142. package/test/resources/9999999/interaction/v1/interactions/publishAsync/0175b971-71a3-4d8e-98ac-48121f3fbf4f/post-response-versionNumber=3.json +4 -0
  143. package/test/resources/9999999/journey/build-expected.json +0 -1
  144. package/test/resources/9999999/journey/create-transactionaEmail-publish-expected.json +0 -1
  145. package/test/resources/9999999/journey/get-multistep-expected.json +0 -4
  146. package/test/resources/9999999/journey/get-published-expected.json +0 -1
  147. package/test/resources/9999999/journey/get-quicksend-expected.json +0 -1
  148. package/test/resources/9999999/journey/get-quicksend-rcb-id-expected.json +0 -1
  149. package/test/resources/9999999/journey/get-quicksend-rcb-key-expected.json +0 -1
  150. package/test/resources/9999999/journey/get-quicksend-rcb-name-expected.json +0 -1
  151. package/test/resources/9999999/journey/get-transactionalEmail-expected.json +0 -1
  152. package/test/resources/9999999/journey/template-expected.json +0 -1
  153. package/test/resources/9999999/query/patch-expected.sql +1 -1
  154. package/test/resources/9999999/query/post-expected.sql +1 -1
  155. package/test/resources/9999999/script/patch-expected.ssjs +1 -0
  156. package/test/type.asset.test.js +123 -13
  157. package/test/type.automation.test.js +3 -1
  158. package/test/type.folder.test.js +12 -2
  159. package/test/type.journey.test.js +130 -1
  160. package/test/type.script.test.js +1 -0
  161. package/test/type.senderProfile.test.js +1 -0
  162. package/test/utils.js +2 -0
  163. package/types/mcdev.d.js +4 -0
  164. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN219,220,221,222,223,224,225,226,227,228,230,232.json +0 -32
  165. /package/test/resources/9999999/dataFolder/{+retrieve-QAA-response.xml → retrieve-QAA-response.xml} +0 -0
  166. /package/test/resources/9999999/interaction/v1/interactions/publishAsync/0175b971-71a3-4d8e-98ac-48121f3fbf4f/{post-response.json → post-response-versionNumber=1.json} +0 -0
@@ -79,10 +79,10 @@ export default {
79
79
  template: true,
80
80
  },
81
81
  'activities[].id': {
82
- isCreateable: true,
83
- isUpdateable: true,
84
- retrieving: true,
85
- template: true,
82
+ isCreateable: false,
83
+ isUpdateable: false,
84
+ retrieving: false,
85
+ template: false,
86
86
  },
87
87
  'activities[].key': {
88
88
  isCreateable: true,
@@ -112,6 +112,147 @@ export default {
112
112
  skipValidation: true,
113
113
  },
114
114
  'activities[].arguments': {
115
+ isCreateable: true,
116
+ isUpdateable: true,
117
+ retrieving: true,
118
+ template: true,
119
+ },
120
+ 'activities[].arguments.waitEndDateAttributeDataBound': {
121
+ isCreateable: true,
122
+ isUpdateable: true,
123
+ retrieving: true,
124
+ template: true,
125
+ },
126
+ 'activities[].arguments.waitDefinitionId': {
127
+ isCreateable: false,
128
+ isUpdateable: false,
129
+ retrieving: false,
130
+ template: false,
131
+ },
132
+ 'activities[].arguments.waitForEventId': {
133
+ isCreateable: true,
134
+ isUpdateable: true,
135
+ retrieving: true,
136
+ template: true,
137
+ },
138
+ 'activities[].arguments.executionMode': {
139
+ isCreateable: true,
140
+ isUpdateable: true,
141
+ retrieving: true,
142
+ template: true,
143
+ },
144
+ 'activities[].arguments.startActivityKey': {
145
+ isCreateable: true,
146
+ isUpdateable: true,
147
+ retrieving: true,
148
+ template: true,
149
+ },
150
+ 'activities[].arguments.waitQueueId': {
151
+ isCreateable: true,
152
+ isUpdateable: true,
153
+ retrieving: true,
154
+ template: true,
155
+ },
156
+ 'activities[].arguments.activityId': {
157
+ isCreateable: true,
158
+ isUpdateable: true,
159
+ retrieving: true,
160
+ template: true,
161
+ },
162
+ 'activities[].arguments.definitionId': {
163
+ isCreateable: true,
164
+ isUpdateable: true,
165
+ retrieving: true,
166
+ template: true,
167
+ },
168
+ 'activities[].arguments.emailSubjectDataBound': {
169
+ isCreateable: true,
170
+ isUpdateable: true,
171
+ retrieving: true,
172
+ template: true,
173
+ },
174
+ 'activities[].arguments.contactId': {
175
+ isCreateable: true,
176
+ isUpdateable: true,
177
+ retrieving: true,
178
+ template: true,
179
+ },
180
+ 'activities[].arguments.contactKey': {
181
+ isCreateable: true,
182
+ isUpdateable: true,
183
+ retrieving: true,
184
+ template: true,
185
+ },
186
+ 'activities[].arguments.emailAddress': {
187
+ isCreateable: true,
188
+ isUpdateable: true,
189
+ retrieving: true,
190
+ template: true,
191
+ },
192
+ 'activities[].arguments.sourceCustomObjectId': {
193
+ isCreateable: true,
194
+ isUpdateable: true,
195
+ retrieving: true,
196
+ template: true,
197
+ },
198
+ 'activities[].arguments.sourceCustomObjectKey': {
199
+ isCreateable: true,
200
+ isUpdateable: true,
201
+ retrieving: true,
202
+ template: true,
203
+ },
204
+ 'activities[].arguments.fieldType': {
205
+ isCreateable: true,
206
+ isUpdateable: true,
207
+ retrieving: true,
208
+ template: true,
209
+ },
210
+ 'activities[].arguments.eventData': {
211
+ isCreateable: true,
212
+ isUpdateable: true,
213
+ retrieving: true,
214
+ template: true,
215
+ },
216
+ 'activities[].arguments.obfuscationProperties': {
217
+ isCreateable: true,
218
+ isUpdateable: true,
219
+ retrieving: true,
220
+ template: true,
221
+ },
222
+ 'activities[].arguments.customObjectKey': {
223
+ isCreateable: true,
224
+ isUpdateable: true,
225
+ retrieving: true,
226
+ template: true,
227
+ },
228
+ 'activities[].arguments.definitionInstanceId': {
229
+ isCreateable: true,
230
+ isUpdateable: true,
231
+ retrieving: true,
232
+ template: true,
233
+ },
234
+ 'activities[].arguments.filterResult': {
235
+ isCreateable: true,
236
+ isUpdateable: true,
237
+ retrieving: true,
238
+ template: true,
239
+ },
240
+ 'activities[].arguments.version': {
241
+ isCreateable: true,
242
+ isUpdateable: true,
243
+ retrieving: true,
244
+ template: true,
245
+ },
246
+ 'activities[].arguments.requestObjectId': {
247
+ isCreateable: true,
248
+ isUpdateable: true,
249
+ retrieving: true,
250
+ template: true,
251
+ },
252
+ 'activities[].arguments.activityData': {
253
+ skipValidation: true,
254
+ },
255
+ 'activities[].arguments.objectMap': {
115
256
  skipValidation: true,
116
257
  },
117
258
  'activities[].configurationArguments': {
@@ -120,6 +261,12 @@ export default {
120
261
  retrieving: true,
121
262
  template: true,
122
263
  },
264
+ 'activities[].configurationArguments.isActivityBatchValidated': {
265
+ isCreateable: true,
266
+ isUpdateable: true,
267
+ retrieving: true,
268
+ template: true,
269
+ },
123
270
  'activities[].configurationArguments.triggeredSendKey': {
124
271
  // if used during create then we are stuck with old data
125
272
  isCreateable: false,
@@ -437,6 +584,12 @@ export default {
437
584
  retrieving: true,
438
585
  template: true,
439
586
  },
587
+ 'activities[].configurationArguments.triggeredSend.updateSubscriber': {
588
+ isCreateable: true,
589
+ isUpdateable: true,
590
+ retrieving: true,
591
+ template: true,
592
+ },
440
593
  'activities[].configurationArguments.applicationExtensionKey': {
441
594
  isCreateable: true,
442
595
  isUpdateable: true,
@@ -752,7 +905,6 @@ export default {
752
905
  retrieving: true,
753
906
  template: true,
754
907
  },
755
-
756
908
  'triggers[].arguments.dequeueReason': {
757
909
  isCreateable: true,
758
910
  isUpdateable: true,
@@ -834,7 +986,15 @@ export default {
834
986
  retrieving: true,
835
987
  template: true,
836
988
  },
989
+ 'triggers[].configurationArguments.objectApiName': {
990
+ // journey capitalization; rewritten to event way of writing it by mcdev
991
+ isCreateable: true,
992
+ isUpdateable: true,
993
+ retrieving: true,
994
+ template: true,
995
+ },
837
996
  'triggers[].configurationArguments.objectAPIName': {
997
+ // capitalization like on event, customly created by mcdev in journey
838
998
  isCreateable: true,
839
999
  isUpdateable: true,
840
1000
  retrieving: true,
@@ -913,12 +1073,6 @@ export default {
913
1073
  retrieving: true,
914
1074
  template: true,
915
1075
  },
916
- 'triggers[].configurationArguments.objectApiName': {
917
- isCreateable: true,
918
- isUpdateable: true,
919
- retrieving: true,
920
- template: true,
921
- },
922
1076
  'triggers[].configurationArguments.additionalObjectFilterCriteria': {
923
1077
  isCreateable: true,
924
1078
  isUpdateable: true,
package/lib/util/cache.js CHANGED
@@ -122,15 +122,34 @@ export default {
122
122
  * @param {string} searchField field name (key in object) which contains the unique identifer
123
123
  * @param {string} returnField field which should be returned
124
124
  * @param {number} [overrideMID] ignore currentMID and use alternative (for example parent MID)
125
+ * @param {boolean} caseInsensitive optional; if true, search is case insensitive
125
126
  * @returns {string} value of specified field. Error is thrown if not found
126
127
  */
127
- searchForField(metadataType, searchValue, searchField, returnField, overrideMID) {
128
+ searchForField(
129
+ metadataType,
130
+ searchValue,
131
+ searchField,
132
+ returnField,
133
+ overrideMID,
134
+ caseInsensitive = false
135
+ ) {
136
+ if (caseInsensitive) {
137
+ searchValue = (searchValue + '').toLowerCase();
138
+ }
128
139
  for (const key in dataStore[overrideMID || currentMID]?.[metadataType]) {
129
140
  if (
130
- Util.resolveObjPath(
131
- searchField,
132
- dataStore[overrideMID || currentMID][metadataType][key]
133
- ) == searchValue
141
+ (caseInsensitive &&
142
+ (
143
+ Util.resolveObjPath(
144
+ searchField,
145
+ dataStore[overrideMID || currentMID][metadataType][key]
146
+ ) + ''
147
+ ).toLowerCase() == searchValue) ||
148
+ (!caseInsensitive &&
149
+ Util.resolveObjPath(
150
+ searchField,
151
+ dataStore[overrideMID || currentMID][metadataType][key]
152
+ ) == searchValue)
134
153
  ) {
135
154
  try {
136
155
  if (
@@ -167,6 +186,19 @@ export default {
167
186
  * @returns {number} folder ID
168
187
  */
169
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) {
170
202
  if (!r__folder_Path) {
171
203
  throw new Error('r__folder_Path not set');
172
204
  }
@@ -175,18 +207,19 @@ export default {
175
207
  if (!folderMap) {
176
208
  throw new Error('No folders found in cache');
177
209
  }
210
+ const folderPath_lower = r__folder_Path.toLowerCase();
178
211
  const potentialFolders = [];
179
212
  for (const folder of Object.values(folderMap)) {
180
- if (folder.Path === r__folder_Path) {
213
+ if (folder.Path.toLowerCase() === folderPath_lower) {
181
214
  if (folder?.Client?.ID === (overrideMID || currentMID)) {
182
- return folder.ID;
215
+ return folder;
183
216
  } else if (allowOtherBu) {
184
217
  potentialFolders.push(folder);
185
218
  }
186
219
  }
187
220
  }
188
221
  if (potentialFolders.length >= 1) {
189
- return potentialFolders[0].ID;
222
+ return potentialFolders[0];
190
223
  } else {
191
224
  throw new Error(`No folders found with path ${r__folder_Path}`);
192
225
  }
@@ -100,7 +100,17 @@ const DevOps = {
100
100
  'add/update': 0,
101
101
  move: 0,
102
102
  };
103
- const diffSummary = await git.diffSummary([range]);
103
+ let diffSummary;
104
+ try {
105
+ diffSummary = await git.diffSummary([range]);
106
+ } catch (ex) {
107
+ const error = ex.message.startsWith('fatal: ambiguous argument')
108
+ ? new Error(
109
+ `Make sure you checked out the branches mentioned in your git range (${rangeUserInput})`
110
+ )
111
+ : ex;
112
+ throw error;
113
+ }
104
114
  Util.logger.info(`Found ${diffSummary.files.length} changed files in the commit range`);
105
115
  /**
106
116
  * @type {DeltaPkgItem[]}
@@ -486,10 +496,15 @@ const DevOps = {
486
496
  // skip this source-target mapping
487
497
  continue;
488
498
  }
489
-
490
- const delta = Array.isArray(diffArr)
491
- ? diffArr
492
- : await DevOps.getDeltaList(properties, range, false, sourceBU, commitHistory);
499
+ let delta;
500
+ try {
501
+ delta = Array.isArray(diffArr)
502
+ ? diffArr
503
+ : await DevOps.getDeltaList(properties, range, false, sourceBU, commitHistory);
504
+ } catch (ex) {
505
+ Util.logger.error(ex.message);
506
+ return;
507
+ }
493
508
  // If only chaing templating and buildDefinition if required
494
509
  if (!delta || delta.length === 0) {
495
510
  // skip this source-target mapping
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": "7.10.1",
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",
@@ -45,7 +45,7 @@
45
45
  "mcdev": "./lib/cli.js"
46
46
  },
47
47
  "engines": {
48
- "node": ">=18.18.2"
48
+ "node": "^18.20.0 || ^20.10.0 || >=21.0.0"
49
49
  },
50
50
  "scripts": {
51
51
  "start": "node lib/cli.js",
@@ -74,12 +74,12 @@
74
74
  "console.table": "0.10.0",
75
75
  "deep-equal": "2.2.3",
76
76
  "fs-extra": "11.3.0",
77
- "inquirer": "12.4.2",
77
+ "inquirer": "12.6.0",
78
78
  "json-to-table": "4.2.1",
79
79
  "mustache": "4.2.0",
80
80
  "p-limit": "6.2.0",
81
81
  "prettier": "3.5.3",
82
- "prettier-plugin-sql": "0.18.1",
82
+ "prettier-plugin-sql": "0.19.0",
83
83
  "semver": "7.7.1",
84
84
  "sfmc-sdk": "2.1.2",
85
85
  "simple-git": "3.27.0",
@@ -87,36 +87,35 @@
87
87
  "update-notifier": "7.3.1",
88
88
  "winston": "3.17.0",
89
89
  "yargs": "17.7.2",
90
- "yocto-spinner": "0.2.0"
90
+ "yocto-spinner": "0.2.2"
91
91
  },
92
92
  "devDependencies": {
93
- "@eslint/js": "9.21.0",
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.13.9",
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.21.0",
105
- "eslint-config-prettier": "10.0.1",
104
+ "eslint": "9.28.0",
106
105
  "eslint-config-ssjs": "2.0.0",
107
- "eslint-plugin-jsdoc": "50.6.3",
108
- "eslint-plugin-mocha": "10.5.0",
109
- "eslint-plugin-prettier": "5.2.3",
110
- "eslint-plugin-unicorn": "56.0.1",
111
- "fast-xml-parser": "5.0.8",
112
- "globals": "16.0.0",
106
+ "eslint-plugin-jsdoc": "50.7.1",
107
+ "eslint-plugin-mocha": "11.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",
113
112
  "husky": "9.1.7",
114
- "lint-staged": "15.4.3",
115
- "mocha": "11.1.0",
113
+ "lint-staged": "15.5.1",
114
+ "mocha": "11.5.0",
116
115
  "mock-fs": "5.3.0",
117
116
  "npm-run-all": "4.1.5",
118
- "prettier-eslint": "16.3.0",
119
- "typescript": "5.7.3"
117
+ "prettier-eslint": "16.4.1",
118
+ "typescript": "5.8.3"
120
119
  },
121
120
  "optionalDependencies": {
122
121
  "fsevents": "*"
@@ -226,7 +226,7 @@ describe('GENERAL', () => {
226
226
 
227
227
  assert.equal(
228
228
  testUtils.getAPIHistoryLength(),
229
- 76,
229
+ 80,
230
230
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
231
231
  );
232
232
  return;
@@ -286,7 +286,7 @@ describe('GENERAL', () => {
286
286
 
287
287
  assert.equal(
288
288
  testUtils.getAPIHistoryLength(),
289
- 76,
289
+ 80,
290
290
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
291
291
  );
292
292
  return;
@@ -346,7 +346,7 @@ describe('GENERAL', () => {
346
346
 
347
347
  assert.equal(
348
348
  testUtils.getAPIHistoryLength(),
349
- 76,
349
+ 80,
350
350
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
351
351
  );
352
352
  return;
@@ -987,7 +987,7 @@ describe('GENERAL', () => {
987
987
  // download first before we test buildTemplate
988
988
  await handler.retrieve('testInstance/testBU');
989
989
 
990
- const expectedApiCallsRetrieve = 97;
990
+ const expectedApiCallsRetrieve = 101;
991
991
  assert.equal(
992
992
  testUtils.getAPIHistoryLength(),
993
993
  expectedApiCallsRetrieve,
@@ -1229,7 +1229,7 @@ describe('GENERAL', () => {
1229
1229
  await testUtils.getActualDeployFile('testTemplated_query', 'query', 'sql')
1230
1230
  ).to.equal(await testUtils.getExpectedFile('9999999', 'query', 'build', 'sql'));
1231
1231
 
1232
- const expectedApiCallsRetrieve = 101;
1232
+ const expectedApiCallsRetrieve = 105;
1233
1233
  assert.equal(
1234
1234
  testUtils.getAPIHistoryLength(),
1235
1235
  expectedApiCallsRetrieve,
@@ -1603,7 +1603,7 @@ describe('GENERAL', () => {
1603
1603
  // download everything before we test buildTemplate
1604
1604
  await handler.retrieve('testInstance/testBU');
1605
1605
 
1606
- const expectedApiCallsRetrieve = 97;
1606
+ const expectedApiCallsRetrieve = 101;
1607
1607
  assert.equal(
1608
1608
  testUtils.getAPIHistoryLength(),
1609
1609
  expectedApiCallsRetrieve,
@@ -1814,7 +1814,7 @@ describe('GENERAL', () => {
1814
1814
  await testUtils.getActualDeployFile('testTemplated_query', 'query', 'sql')
1815
1815
  ).to.equal(await testUtils.getExpectedFile('9999999', 'query', 'build', 'sql'));
1816
1816
 
1817
- const expectedApiCallsRetrieve = 101;
1817
+ const expectedApiCallsRetrieve = 105;
1818
1818
  assert.equal(
1819
1819
  testUtils.getAPIHistoryLength(),
1820
1820
  expectedApiCallsRetrieve,
@@ -2005,7 +2005,7 @@ describe('GENERAL', () => {
2005
2005
  // download first before we test buildTemplate
2006
2006
  await handler.retrieve('testInstance/testBU');
2007
2007
 
2008
- const expectedApiCallsRetrieve = 97;
2008
+ const expectedApiCallsRetrieve = 101;
2009
2009
  assert.equal(
2010
2010
  testUtils.getAPIHistoryLength(),
2011
2011
  expectedApiCallsRetrieve,
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-unused-vars */
1
2
  'use strict';
2
3
  /**
3
4
  * @typedef {Object.<string, any>} MetadataTypeItem generic metadata item
@@ -39,13 +40,11 @@ const buPrefixBlacklistMap = {
39
40
  * @returns {validationRuleList} MetadataItem
40
41
  */
41
42
  export function validation(definition, item, targetDir, codeExtractItemArr, Util) {
42
- Util.logger.verbose('just here to not get a warning about the unused property Util');
43
-
44
43
  const bu =
45
44
  (targetDir.includes('/') ? targetDir.split('/').pop() : targetDir.split('\\').pop()) ||
46
45
  'not-found';
47
46
  const prefixBlacklist = buPrefixBlacklistMap[bu] || [];
48
- // eslint-disable-next-line no-unused-vars -- codeExtractItemArr is not used in this example
47
+
49
48
  const temp = codeExtractItemArr;
50
49
 
51
50
  return {
@@ -175,5 +175,5 @@
175
175
  "verification"
176
176
  ]
177
177
  },
178
- "version": "7.10.1"
178
+ "version": "8.0.1"
179
179
  }
@@ -26,10 +26,11 @@
26
26
  "c__dataAction": "AddUpdate",
27
27
  "c__subscriberImportType": "DataExtension",
28
28
  "destination": {
29
- "c__destinationType": "DataExtension",
29
+ "c__type": "DataExtension",
30
30
  "r__dataExtension_key": "testExisting_dataExtension"
31
31
  },
32
32
  "source": {
33
+ "c__type": "File Location",
33
34
  "r__fileLocation_name": "ExactTarget Enhanced FTP"
34
35
  }
35
36
  }
@@ -24,10 +24,11 @@
24
24
  "c__subscriberImportType": "DataExtension",
25
25
  "c__dataAction": "AddUpdate",
26
26
  "destination": {
27
- "c__destinationType": "DataExtension",
27
+ "c__type": "DataExtension",
28
28
  "r__dataExtension_key": "testExisting_dataExtension"
29
29
  },
30
30
  "source": {
31
+ "c__type": "File Location",
31
32
  "r__fileLocation_name": "ExactTarget Enhanced FTP"
32
33
  }
33
34
  }