mcdev 4.0.0 → 4.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.
@@ -11,4 +11,4 @@ updates:
11
11
  interval: 'daily'
12
12
  target-branch: 'develop'
13
13
  labels:
14
- - 'chore'
14
+ - 'dependencies'
@@ -17,8 +17,10 @@
17
17
  "*.ics": "${capture}.asset-document-meta.json",
18
18
  "*.pdf": "${capture}.asset-document-meta.json",
19
19
  "*.jpg": "${capture}.asset-image-meta.json",
20
+ "*.jpeg": "${capture}.asset-image-meta.json",
20
21
  "*.png": "${capture}.asset-image-meta.json",
21
22
  "*.gif": "${capture}.asset-image-meta.json",
23
+ "*.eps": "${capture}.asset-image-meta.json",
22
24
  "*-meta.sql": "${capture}-meta.json",
23
25
  "*-meta.ssjs": "${capture}-meta.json",
24
26
  "*-meta.amp": "${capture}-meta.json",
@@ -244,7 +244,7 @@ Builds metadata from a template using market specific customisation
244
244
  * _static_
245
245
  * [.buildTemplate(businessUnit, selectedType, keyArr, market)](#Builder.buildTemplate) ⇒ <code>Promise.&lt;TYPE.MultiMetadataTypeList&gt;</code>
246
246
  * [.buildDefinition(businessUnit, selectedType, name, market)](#Builder.buildDefinition) ⇒ <code>Promise.&lt;TYPE.MultiMetadataTypeList&gt;</code>
247
- * [.buildDefinitionBulk(listName, type, name)](#Builder.buildDefinitionBulk) ⇒ <code>Promise.&lt;void&gt;</code>
247
+ * [.buildDefinitionBulk(listName, type, name)](#Builder.buildDefinitionBulk) ⇒ <code>Promise.&lt;Array.&lt;TYPE.MultiMetadataTypeList&gt;&gt;</code>
248
248
 
249
249
  <a name="new_Builder_new"></a>
250
250
 
@@ -321,11 +321,11 @@ Build a specific metadata file based on a template.
321
321
 
322
322
  <a name="Builder.buildDefinitionBulk"></a>
323
323
 
324
- ### Builder.buildDefinitionBulk(listName, type, name) ⇒ <code>Promise.&lt;void&gt;</code>
324
+ ### Builder.buildDefinitionBulk(listName, type, name) ⇒ <code>Promise.&lt;Array.&lt;TYPE.MultiMetadataTypeList&gt;&gt;</code>
325
325
  Build a specific metadata file based on a template using a list of bu-market combos
326
326
 
327
327
  **Kind**: static method of [<code>Builder</code>](#Builder)
328
- **Returns**: <code>Promise.&lt;void&gt;</code> - -
328
+ **Returns**: <code>Promise.&lt;Array.&lt;TYPE.MultiMetadataTypeList&gt;&gt;</code> - -
329
329
 
330
330
  | Param | Type | Description |
331
331
  | --- | --- | --- |
@@ -4942,7 +4942,8 @@ DevOps helper class
4942
4942
  * [.getDeltaList(properties, [range], [saveToDeployDir], [filterPaths])](#DevOps.getDeltaList) ⇒ <code>Promise.&lt;Array.&lt;TYPE.DeltaPkgItem&gt;&gt;</code>
4943
4943
  * [~delta](#DevOps.getDeltaList..delta) : <code>Array.&lt;TYPE.DeltaPkgItem&gt;</code>
4944
4944
  * [~copied](#DevOps.getDeltaList..copied) : <code>TYPE.DeltaPkgItem</code>
4945
- * [.buildDeltaDefinitions(properties, range, [skipInteraction])](#DevOps.buildDeltaDefinitions)
4945
+ * [.buildDeltaDefinitions(properties, range, [skipInteraction])](#DevOps.buildDeltaDefinitions) ⇒ <code>Promise.&lt;Array.&lt;TYPE.DeltaPkgItem&gt;&gt;</code>
4946
+ * [~deltaDeployAll](#DevOps.buildDeltaDefinitions..deltaDeployAll) : <code>Array.&lt;TYPE.DeltaPkgItem&gt;</code>
4946
4947
  * [.document(directory, jsonReport)](#DevOps.document) ⇒ <code>void</code>
4947
4948
  * [.getFilesToCommit(properties, buObject, metadataType, keyArr)](#DevOps.getFilesToCommit) ⇒ <code>Promise.&lt;Array.&lt;string&gt;&gt;</code>
4948
4949
 
@@ -4977,10 +4978,11 @@ Interactive commit selection if no commits are passed.
4977
4978
  **Kind**: inner constant of [<code>getDeltaList</code>](#DevOps.getDeltaList)
4978
4979
  <a name="DevOps.buildDeltaDefinitions"></a>
4979
4980
 
4980
- ### DevOps.buildDeltaDefinitions(properties, range, [skipInteraction])
4981
+ ### DevOps.buildDeltaDefinitions(properties, range, [skipInteraction]) ⇒ <code>Promise.&lt;Array.&lt;TYPE.DeltaPkgItem&gt;&gt;</code>
4981
4982
  wrapper around DevOps.getDeltaList, Builder.buildTemplate and M
4982
4983
 
4983
4984
  **Kind**: static method of [<code>DevOps</code>](#DevOps)
4985
+ **Returns**: <code>Promise.&lt;Array.&lt;TYPE.DeltaPkgItem&gt;&gt;</code> - -
4984
4986
 
4985
4987
  | Param | Type | Description |
4986
4988
  | --- | --- | --- |
@@ -4988,6 +4990,10 @@ wrapper around DevOps.getDeltaList, Builder.buildTemplate and M
4988
4990
  | range | <code>string</code> | git commit range |
4989
4991
  | [skipInteraction] | <code>TYPE.SkipInteraction</code> | allows to skip interactive wizard |
4990
4992
 
4993
+ <a name="DevOps.buildDeltaDefinitions..deltaDeployAll"></a>
4994
+
4995
+ #### buildDeltaDefinitions~deltaDeployAll : <code>Array.&lt;TYPE.DeltaPkgItem&gt;</code>
4996
+ **Kind**: inner constant of [<code>buildDeltaDefinitions</code>](#DevOps.buildDeltaDefinitions)
4991
4997
  <a name="DevOps.document"></a>
4992
4998
 
4993
4999
  ### DevOps.document(directory, jsonReport) ⇒ <code>void</code>
package/lib/Builder.js CHANGED
@@ -199,7 +199,7 @@ saved
199
199
  * @param {string} listName name of list of BU-market combos
200
200
  * @param {string} type supported metadata type
201
201
  * @param {string} name name of the metadata
202
- * @returns {Promise.<void>} -
202
+ * @returns {Promise.<TYPE.MultiMetadataTypeList[]>} -
203
203
  */
204
204
  static async buildDefinitionBulk(listName, type, name) {
205
205
  const properties = await config.getProperties();
@@ -212,6 +212,8 @@ saved
212
212
  return;
213
213
  }
214
214
  let i = 0;
215
+ const bdPromises = [];
216
+
215
217
  for (const businessUnit in properties.marketList[listName]) {
216
218
  if (businessUnit === 'description') {
217
219
  // skip, it's just a metadata on this list and not a BU
@@ -228,13 +230,17 @@ saved
228
230
  for (const market of marketList) {
229
231
  if (Util.checkMarket(market, properties)) {
230
232
  Util.logger.info(`Executing for '${businessUnit}': '${market}'`);
231
- this.buildDefinition(businessUnit, type, name, market);
233
+ // omitting "await" to speed up creation
234
+ bdPromises.push(this.buildDefinition(businessUnit, type, name, market));
232
235
  }
233
236
  }
234
237
  }
238
+ const response = await Promise.all(bdPromises);
239
+
235
240
  if (!i) {
236
241
  Util.logger.error('Please define properties.marketList in your config');
237
242
  }
243
+ return response;
238
244
  }
239
245
  }
240
246
 
@@ -135,32 +135,40 @@ class AccountUser extends MetadataType {
135
135
  }
136
136
  let result;
137
137
  switch (interval) {
138
- case 'years':
138
+ case 'years': {
139
139
  result = now.getFullYear() - date.getFullYear();
140
140
  break;
141
- case 'months':
141
+ }
142
+ case 'months': {
142
143
  result =
143
144
  now.getFullYear() * 12 +
144
145
  now.getMonth() -
145
146
  (date.getFullYear() * 12 + date.getMonth());
146
147
  break;
147
- case 'weeks':
148
+ }
149
+ case 'weeks': {
148
150
  result = Math.floor(timediff / week);
149
151
  break;
150
- case 'days':
152
+ }
153
+ case 'days': {
151
154
  result = Math.floor(timediff / day);
152
155
  break;
153
- case 'hours':
156
+ }
157
+ case 'hours': {
154
158
  result = Math.floor(timediff / hour);
155
159
  break;
156
- case 'minutes':
160
+ }
161
+ case 'minutes': {
157
162
  result = Math.floor(timediff / minute);
158
163
  break;
159
- case 'seconds':
164
+ }
165
+ case 'seconds': {
160
166
  result = Math.floor(timediff / second);
161
167
  break;
162
- default:
168
+ }
169
+ default: {
163
170
  return;
171
+ }
164
172
  }
165
173
  return result + ' ' + interval;
166
174
  }
@@ -375,17 +375,21 @@ class Asset extends MetadataType {
375
375
  // reset logging level
376
376
  let obj;
377
377
  switch (loggerLevelBak) {
378
- case 'info':
378
+ case 'info': {
379
379
  obj = {};
380
380
  break;
381
- case 'verbose':
381
+ }
382
+ case 'verbose': {
382
383
  obj = { verbose: true };
383
384
  break;
384
- case 'debug':
385
+ }
386
+ case 'debug': {
385
387
  obj = { debug: true };
386
388
  break;
387
- case 'error':
389
+ }
390
+ case 'error': {
388
391
  obj = { silent: true };
392
+ }
389
393
  }
390
394
  Util.setLoggingLevel(obj);
391
395
  }
@@ -708,7 +712,7 @@ class Asset extends MetadataType {
708
712
  );
709
713
  fileList.push({
710
714
  subFolder: [this.definition.type, subType],
711
- fileName: metadata.customerKey,
715
+ fileName: templateName,
712
716
  fileExt: fileExt,
713
717
  content: filecontent,
714
718
  encoding: 'base64',
@@ -774,7 +778,8 @@ class Asset extends MetadataType {
774
778
  let readDirArr;
775
779
  switch (metadata.assetType.name) {
776
780
  case 'templatebasedemail': // message
777
- case 'htmlemail': // message
781
+ case 'htmlemail': {
782
+ // message
778
783
  // this complex type always creates its own subdir per asset
779
784
  subDirArr = [this.definition.type, subType];
780
785
  readDirArr = [deployDir, ...subDirArr, templateName || metadata.customerKey];
@@ -821,7 +826,9 @@ class Asset extends MetadataType {
821
826
  );
822
827
  }
823
828
  break;
824
- case 'textonlyemail': // message
829
+ }
830
+ case 'textonlyemail': {
831
+ // message
825
832
  // metadata.views.text.content
826
833
  subDirArr = [this.definition.type, subType];
827
834
  readDirArr = [deployDir, ...subDirArr];
@@ -854,7 +861,9 @@ class Asset extends MetadataType {
854
861
  }
855
862
  }
856
863
  break;
857
- case 'webpage': // asset
864
+ }
865
+ case 'webpage': {
866
+ // asset
858
867
  // this complex type always creates its own subdir per asset
859
868
  subDirArr = [this.definition.type, subType];
860
869
  readDirArr = [deployDir, ...subDirArr, templateName || metadata.customerKey];
@@ -930,6 +939,7 @@ class Asset extends MetadataType {
930
939
  }
931
940
 
932
941
  break;
942
+ }
933
943
  case 'buttonblock': // block - Button Block
934
944
  case 'freeformblock': // block
935
945
  case 'htmlblock': // block
@@ -937,7 +947,8 @@ class Asset extends MetadataType {
937
947
  case 'imageblock': // block - Image Block
938
948
  case 'textblock': // block
939
949
  case 'smartcaptureblock': // other
940
- case 'codesnippetblock': // other
950
+ case 'codesnippetblock': {
951
+ // other
941
952
  // metadata.content
942
953
  subDirArr = [this.definition.type, subType];
943
954
  readDirArr = [deployDir, ...subDirArr];
@@ -968,7 +979,7 @@ class Asset extends MetadataType {
968
979
  // to use this method in templating, store a copy of the info in fileList
969
980
  fileList.push({
970
981
  subFolder: subDirArr,
971
- fileName: metadata.customerKey + subtypeExtension,
982
+ fileName: (templateName || metadata.customerKey) + subtypeExtension,
972
983
  fileExt: ext,
973
984
  content: metadata.content,
974
985
  });
@@ -978,6 +989,7 @@ class Asset extends MetadataType {
978
989
  }
979
990
  }
980
991
  break;
992
+ }
981
993
  }
982
994
  return fileList;
983
995
  }
@@ -1073,7 +1085,8 @@ class Asset extends MetadataType {
1073
1085
  let subType;
1074
1086
  switch (metadata.assetType.name) {
1075
1087
  case 'templatebasedemail': // message
1076
- case 'htmlemail': // message
1088
+ case 'htmlemail': {
1089
+ // message
1077
1090
  // metadata.views.html.content (mandatory)
1078
1091
  if (metadata.views?.html?.content?.length) {
1079
1092
  codeArr.push({
@@ -1091,7 +1104,9 @@ class Asset extends MetadataType {
1091
1104
  }
1092
1105
 
1093
1106
  return { json: metadata, codeArr: codeArr, subFolder: [metadata.customerKey] };
1094
- case 'textonlyemail': // message
1107
+ }
1108
+ case 'textonlyemail': {
1109
+ // message
1095
1110
  // metadata.views.text.content
1096
1111
  if (metadata.views?.text?.content?.length) {
1097
1112
  codeArr.push({
@@ -1103,7 +1118,9 @@ class Asset extends MetadataType {
1103
1118
  delete metadata.views.text.content;
1104
1119
  }
1105
1120
  return { json: metadata, codeArr: codeArr, subFolder: null };
1106
- case 'webpage': // asset
1121
+ }
1122
+ case 'webpage': {
1123
+ // asset
1107
1124
  // metadata.views.html.content (pre & post 20222)
1108
1125
  if (metadata.views?.html?.content?.length) {
1109
1126
  codeArr.push({
@@ -1133,6 +1150,7 @@ class Asset extends MetadataType {
1133
1150
  delete metadata.content;
1134
1151
  }
1135
1152
  return { json: metadata, codeArr: codeArr, subFolder: [metadata.customerKey] };
1153
+ }
1136
1154
  case 'buttonblock': // block - Button Block
1137
1155
  case 'freeformblock': // block
1138
1156
  case 'htmlblock': // block
@@ -1140,7 +1158,8 @@ class Asset extends MetadataType {
1140
1158
  case 'imageblock': // block - Image Block
1141
1159
  case 'textblock': // block
1142
1160
  case 'smartcaptureblock': // other
1143
- case 'codesnippetblock': // other
1161
+ case 'codesnippetblock': {
1162
+ // other
1144
1163
  // metadata.content
1145
1164
  let fileExt = 'html'; // eslint-disable-line no-case-declarations
1146
1165
  if (
@@ -1160,7 +1179,8 @@ class Asset extends MetadataType {
1160
1179
  delete metadata.content;
1161
1180
  }
1162
1181
  return { json: metadata, codeArr: codeArr, subFolder: null };
1163
- default:
1182
+ }
1183
+ default: {
1164
1184
  subType = this._getSubtype(metadata);
1165
1185
  if (!this.definition.binarySubtypes.includes(subType)) {
1166
1186
  Util.logger.debug(
@@ -1168,6 +1188,7 @@ class Asset extends MetadataType {
1168
1188
  );
1169
1189
  }
1170
1190
  return { json: metadata, codeArr: codeArr, subFolder: null };
1191
+ }
1171
1192
  }
1172
1193
  }
1173
1194
  /**
@@ -112,12 +112,14 @@ class Automation extends MetadataType {
112
112
  'Name',
113
113
  ]);
114
114
  const resultsConverted = {};
115
- for (const m of results.Results) {
116
- resultsConverted[m.CustomerKey] = {
117
- id: m.ObjectID,
118
- key: m.CustomerKey,
119
- name: m.Name,
120
- };
115
+ if (Array.isArray(results?.Results)) {
116
+ for (const m of results.Results) {
117
+ resultsConverted[m.CustomerKey] = {
118
+ id: m.ObjectID,
119
+ key: m.CustomerKey,
120
+ name: m.Name,
121
+ };
122
+ }
121
123
  }
122
124
  return { metadata: resultsConverted, type: this.definition.type };
123
125
  }
@@ -520,6 +522,10 @@ class Automation extends MetadataType {
520
522
  }
521
523
  if (metadata.steps) {
522
524
  for (const step of metadata.steps) {
525
+ const stepNumber = step.stepNumber || step.step;
526
+ delete step.stepNumber;
527
+ delete step.step;
528
+
523
529
  for (const activity of step.activities) {
524
530
  try {
525
531
  // get metadata type of activity
@@ -528,58 +534,52 @@ class Automation extends MetadataType {
528
534
  activity.objectTypeId
529
535
  );
530
536
  delete activity.objectTypeId;
531
- // if no activityObjectId then either serialized activity
532
- // (config in Automation ) or unconfigured so no further action to be taken
533
- if (
534
- activity.activityObjectId ===
535
- '00000000-0000-0000-0000-000000000000' ||
536
- activity.activityObjectId == null ||
537
- !this.definition.dependencies.includes(activity.r__type)
538
- ) {
539
- // empty if block
540
- }
541
- // / if managed by cache we can update references to support deployment
542
- else if (
543
- Definitions[activity.r__type]?.['idField'] &&
544
- cache.getCache(this.buObject.mid)[activity.r__type]
545
- ) {
546
- try {
547
- activity.activityObjectId = cache.searchForField(
548
- activity.r__type,
549
- activity.activityObjectId,
550
- Definitions[activity.r__type].idField,
551
- Definitions[activity.r__type].nameField
552
- );
553
- } catch (ex) {
554
- // getFromCache throws error where the dependent metadata is not found
555
- Util.logger.warn(
556
- ` - Missing ${activity.r__type} activity '${activity.name}'` +
557
- ` in step ${step.stepNumber || step.step}.${
558
- activity.displayOrder
559
- }` +
560
- ` of Automation '${metadata.name}' (${ex.message})`
561
- );
562
- return null;
563
- }
564
- } else {
537
+ } catch {
538
+ Util.logger.warn(
539
+ ` - Unknown activity type '${activity.objectTypeId}'` +
540
+ ` in step ${stepNumber}.${activity.displayOrder}` +
541
+ ` of Automation '${metadata.name}'`
542
+ );
543
+ continue;
544
+ }
545
+
546
+ // if no activityObjectId then either serialized activity
547
+ // (config in Automation ) or unconfigured so no further action to be taken
548
+ if (
549
+ activity.activityObjectId === '00000000-0000-0000-0000-000000000000' ||
550
+ activity.activityObjectId == null ||
551
+ !this.definition.dependencies.includes(activity.r__type)
552
+ ) {
553
+ // empty if block
554
+ }
555
+ // / if managed by cache we can update references to support deployment
556
+ else if (
557
+ Definitions[activity.r__type]?.['idField'] &&
558
+ cache.getCache(this.buObject.mid)[activity.r__type]
559
+ ) {
560
+ try {
561
+ activity.activityObjectId = cache.searchForField(
562
+ activity.r__type,
563
+ activity.activityObjectId,
564
+ Definitions[activity.r__type].idField,
565
+ Definitions[activity.r__type].nameField
566
+ );
567
+ } catch (ex) {
568
+ // getFromCache throws error where the dependent metadata is not found
565
569
  Util.logger.warn(
566
570
  ` - Missing ${activity.r__type} activity '${activity.name}'` +
567
- ` in step ${step.stepNumber || step.step}.${
568
- activity.displayOrder
569
- }` +
570
- ` of Automation '${metadata.name}' (Not Found in Cache)`
571
+ ` in step ${stepNumber}.${activity.displayOrder}` +
572
+ ` of Automation '${metadata.name}' (${ex.message})`
571
573
  );
572
- return null;
573
574
  }
574
- } catch {
575
+ } else {
575
576
  Util.logger.warn(
576
- ` - Excluding automation '${metadata.name}' from retrieve (ObjectType ${activity.objectTypeId} is unknown)`
577
+ ` - Missing ${activity.r__type} activity '${activity.name}'` +
578
+ ` in step ${stepNumber}.${activity.displayOrder}` +
579
+ ` of Automation '${metadata.name}' (Not Found in Cache)`
577
580
  );
578
- return null;
579
581
  }
580
582
  }
581
- delete step.stepNumber;
582
- delete step.step;
583
583
  }
584
584
  }
585
585
  return JSON.parse(JSON.stringify(metadata));
@@ -259,11 +259,7 @@ class MetadataType {
259
259
 
260
260
  try {
261
261
  // write to file
262
- await File.writeJSONToFile(
263
- [templateDir, ...typeDirArr],
264
- key + '.' + this.definition.type + suffix,
265
- metadata
266
- );
262
+ await File.writeJSONToFile([templateDir, ...typeDirArr], fileName, metadata);
267
263
  Util.logger.info(
268
264
  `- templated ${this.definition.type}: ${key} (${
269
265
  metadata[this.definition.nameField]
@@ -251,7 +251,7 @@ class Query extends MetadataType {
251
251
  } catch {
252
252
  throw new Error(
253
253
  `${this.definition.type}:: Error applying template variables on ${
254
- metadata[this.definition.keyField] + '.' + this.definition.type
254
+ templateName + '.' + this.definition.type
255
255
  }-meta.sql.`
256
256
  );
257
257
  }
@@ -263,14 +263,14 @@ class Query extends MetadataType {
263
263
  for (const targetDir of targetDirArr) {
264
264
  File.writeToFile(
265
265
  [targetDir, this.definition.type],
266
- metadata[this.definition.keyField] + '.' + this.definition.type + '-meta',
266
+ templateName + '.' + this.definition.type + '-meta',
267
267
  'sql',
268
268
  code
269
269
  );
270
270
  nestedFilePaths.push([
271
271
  targetDir,
272
272
  this.definition.type,
273
- metadata[this.definition.keyField] + '.' + this.definition.type + '-meta.sql',
273
+ templateName + '.' + this.definition.type + '-meta.sql',
274
274
  ]);
275
275
  }
276
276
  return nestedFilePaths;
@@ -225,7 +225,7 @@ class Script extends MetadataType {
225
225
  } catch {
226
226
  throw new Error(
227
227
  `${this.definition.type}:: Error applying template variables on ${
228
- metadata[this.definition.keyField] + '.' + this.definition.type
228
+ templateName + '.' + this.definition.type
229
229
  }-meta.ssjs.`
230
230
  );
231
231
  }
@@ -237,14 +237,14 @@ class Script extends MetadataType {
237
237
  for (const targetDir of targetDirArr) {
238
238
  File.writeToFile(
239
239
  [targetDir, this.definition.type],
240
- metadata[this.definition.keyField] + '.' + this.definition.type + '-meta',
240
+ templateName + '.' + this.definition.type + '-meta',
241
241
  'ssjs',
242
242
  code
243
243
  );
244
244
  nestedFilePaths.push([
245
245
  targetDir,
246
246
  this.definition.type,
247
- metadata[this.definition.keyField] + '.' + this.definition.type + '-meta.ssjs',
247
+ templateName + '.' + this.definition.type + '-meta.ssjs',
248
248
  ]);
249
249
  }
250
250
  return nestedFilePaths;
@@ -249,6 +249,7 @@ const DevOps = {
249
249
  * @param {TYPE.Mcdevrc} properties project config file
250
250
  * @param {string} range git commit range
251
251
  * @param {TYPE.SkipInteraction} [skipInteraction] allows to skip interactive wizard
252
+ * @returns {Promise.<TYPE.DeltaPkgItem[]>} -
252
253
  */
253
254
  async buildDeltaDefinitions(properties, range, skipInteraction) {
254
255
  // check if sourceTargetMapping is valid
@@ -260,7 +261,8 @@ const DevOps = {
260
261
  return;
261
262
  }
262
263
  const sourceMarketListArr = Object.keys(properties.options.deployment.sourceTargetMapping);
263
-
264
+ /** @type {TYPE.DeltaPkgItem[]} */
265
+ const deltaDeployAll = [];
264
266
  for (const sourceML of sourceMarketListArr) {
265
267
  // check if sourceTargetMapping has valid values
266
268
  // #1 check source marketlist
@@ -315,10 +317,12 @@ const DevOps = {
315
317
  const buTypeDelta = {}; // for bt, with BU info
316
318
  const typeDelta = {}; // for bdb, without BU info - thats taken from the marketList
317
319
  let deltaCounter = 0;
318
- for (const file of delta
320
+ const deltaDeploy = delta
319
321
  // Only template/build files that were added/updated/moved. no deletions
320
322
  // ! doesn't work for folder, because their name parsing doesnt work at the moment
321
- .filter((file) => file.gitAction !== 'delete' && file.name)) {
323
+ .filter((file) => file.gitAction !== 'delete' && file.name);
324
+ deltaDeployAll.push(...deltaDeploy);
325
+ for (const file of deltaDeploy) {
322
326
  const buPath = `${file._credential}/${file._businessUnit}`;
323
327
  if (!buTypeDelta[buPath]) {
324
328
  // init object
@@ -356,10 +360,10 @@ const DevOps = {
356
360
  if (deltaCounter) {
357
361
  Util.logger.info(`- ✔️ Templates created: ${deltaCounter}`);
358
362
  } else {
359
- Util.logger.error(
360
- '- ❌ No Templates or Deploy Definitions created. Check if you expected no changes.'
363
+ Util.logger.warn(
364
+ `- No Templates or Deploy Definitions created for ${sourceMlName}`
361
365
  );
362
- return;
366
+ continue;
363
367
  }
364
368
 
365
369
  // Run build definitions bulk for each type
@@ -413,6 +417,12 @@ const DevOps = {
413
417
  );
414
418
  }
415
419
  }
420
+ if (!deltaDeployAll.length) {
421
+ Util.logger.error(
422
+ '- ❌ No Templates or Deploy Definitions created. Check if you expected no changes.'
423
+ );
424
+ }
425
+ return deltaDeployAll;
416
426
  },
417
427
 
418
428
  /**
package/lib/util/file.js CHANGED
@@ -192,41 +192,52 @@ const File = {
192
192
  // load the right prettier config relative to our file
193
193
  switch (filetype) {
194
194
  case 'htm':
195
- case 'html':
195
+ case 'html': {
196
196
  FileFs.prettierConfig.parser = 'html';
197
197
  break;
198
+ }
198
199
  case 'ssjs':
199
- case 'js':
200
+ case 'js': {
200
201
  FileFs.prettierConfig.parser = 'babel';
201
202
  break;
202
- case 'json':
203
+ }
204
+ case 'json': {
203
205
  FileFs.prettierConfig.parser = 'json';
204
206
  break;
207
+ }
205
208
  case 'yaml':
206
- case 'yml':
209
+ case 'yml': {
207
210
  FileFs.prettierConfig.parser = 'yaml';
208
211
  break;
209
- case 'ts':
212
+ }
213
+ case 'ts': {
210
214
  FileFs.prettierConfig.parser = 'babel-ts';
211
215
  break;
212
- case 'css':
216
+ }
217
+ case 'css': {
213
218
  FileFs.prettierConfig.parser = 'css';
214
219
  break;
215
- case 'less':
220
+ }
221
+ case 'less': {
216
222
  FileFs.prettierConfig.parser = 'less';
217
223
  break;
224
+ }
218
225
  case 'sass':
219
- case 'scss':
226
+ case 'scss': {
220
227
  FileFs.prettierConfig.parser = 'scss';
221
228
  break;
222
- case 'md':
229
+ }
230
+ case 'md': {
223
231
  FileFs.prettierConfig.parser = 'markdown';
224
232
  break;
225
- case 'sql':
233
+ }
234
+ case 'sql': {
226
235
  FileFs.prettierConfig.parser = 'sql';
227
236
  break;
228
- default:
237
+ }
238
+ default: {
229
239
  FileFs.prettierConfig.parser = 'babel';
240
+ }
230
241
  }
231
242
  formatted = prettier.format(content, FileFs.prettierConfig);
232
243
  } catch (ex) {
@@ -35,7 +35,7 @@ const Init = {
35
35
  if (missingFields.length) {
36
36
  for (const fieldName of missingFields) {
37
37
  switch (fieldName) {
38
- case 'marketList':
38
+ case 'marketList': {
39
39
  if (properties.marketBulk) {
40
40
  upgradeMsgs.push(`- ✔️ converted 'marketBulk' to '${fieldName}'`);
41
41
  properties[fieldName] = properties.marketBulk;
@@ -45,7 +45,8 @@ const Init = {
45
45
  this._updateLeaf(properties, defaultProps, fieldName);
46
46
  }
47
47
  break;
48
- case 'directories.docs':
48
+ }
49
+ case 'directories.docs': {
49
50
  if (properties.directories.badKeys) {
50
51
  delete properties.directories.badKeys;
51
52
  upgradeMsgs.push(`- ✋ removed 'directories.badKeys'`);
@@ -75,7 +76,8 @@ const Init = {
75
76
  this._updateLeaf(properties, defaultProps, fieldName);
76
77
  upgradeMsgs.push(`- ✔️ added '${fieldName}'`);
77
78
  break;
78
- case 'metaDataTypes.documentOnRetrieve':
79
+ }
80
+ case 'metaDataTypes.documentOnRetrieve': {
79
81
  if (!properties.options.documentOnRetrieve) {
80
82
  properties.metaDataTypes.documentOnRetrieve = [];
81
83
  } else {
@@ -86,7 +88,8 @@ const Init = {
86
88
  `- ✔️ converted 'options.documentOnRetrieve' to '${fieldName}'`
87
89
  );
88
90
  break;
89
- case 'options.deployment.commitHistory':
91
+ }
92
+ case 'options.deployment.commitHistory': {
90
93
  if (properties.options.commitHistory) {
91
94
  upgradeMsgs.push(
92
95
  `- ✔️ converted 'options.commitHistory' to '${fieldName}'`
@@ -99,7 +102,8 @@ const Init = {
99
102
  this._updateLeaf(properties, defaultProps, fieldName);
100
103
  }
101
104
  break;
102
- case 'options.exclude':
105
+ }
106
+ case 'options.exclude': {
103
107
  if (properties.options.filter) {
104
108
  upgradeMsgs.push(`- ✔️ converted 'options.filter' to '${fieldName}'`);
105
109
  properties.options.exclude = properties.options.filter;
@@ -109,13 +113,16 @@ const Init = {
109
113
  this._updateLeaf(properties, defaultProps, fieldName);
110
114
  }
111
115
  break;
112
- case 'version':
116
+ }
117
+ case 'version': {
113
118
  // do nothing other than ensure we re-save the config (with the new version)
114
119
  upgradeMsgs.push(`- ✔️ version updated`);
115
120
  break;
116
- default:
121
+ }
122
+ default: {
117
123
  this._updateLeaf(properties, defaultProps, fieldName);
118
124
  upgradeMsgs.push(`- ✔️ added '${fieldName}'`);
125
+ }
119
126
  }
120
127
  }
121
128
  updateConfigNeeded = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcdev",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Accenture Salesforce Marketing Cloud DevTools",
5
5
  "author": "joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
6
6
  "license": "MIT",
@@ -42,7 +42,7 @@
42
42
  "dependencies": {
43
43
  "cli-progress": "3.11.2",
44
44
  "command-exists": "1.2.9",
45
- "conf": "10.1.2",
45
+ "conf": "10.2.0",
46
46
  "console.table": "0.10.0",
47
47
  "deep-equal": "2.0.5",
48
48
  "fs-extra": "10.1.0",
@@ -51,32 +51,32 @@
51
51
  "mustache": "4.2.0",
52
52
  "p-limit": "3.1.0",
53
53
  "prettier": "2.7.1",
54
- "prettier-plugin-sql": "0.8.3",
55
- "semver": "7.3.7",
54
+ "prettier-plugin-sql": "0.12.1",
55
+ "semver": "7.3.8",
56
56
  "sfmc-sdk": "0.6.1",
57
- "simple-git": "3.10.0",
57
+ "simple-git": "3.14.1",
58
58
  "toposort": "2.0.2",
59
59
  "update-notifier": "5.1.0",
60
- "winston": "3.8.1",
61
- "yargs": "17.5.1"
60
+ "winston": "3.8.2",
61
+ "yargs": "17.6.0"
62
62
  },
63
63
  "devDependencies": {
64
64
  "assert": "2.0.0",
65
- "axios-mock-adapter": "1.21.1",
65
+ "axios-mock-adapter": "1.21.2",
66
66
  "chai": "4.3.6",
67
- "eslint": "8.19.0",
67
+ "eslint": "8.25.0",
68
68
  "eslint-config-prettier": "8.5.0",
69
69
  "eslint-config-ssjs": "1.1.11",
70
- "eslint-plugin-jsdoc": "39.3.3",
71
- "eslint-plugin-mocha": "10.0.5",
70
+ "eslint-plugin-jsdoc": "39.3.6",
71
+ "eslint-plugin-mocha": "10.1.0",
72
72
  "eslint-plugin-prettier": "4.2.1",
73
- "eslint-plugin-unicorn": "43.0.0",
73
+ "eslint-plugin-unicorn": "44.0.2",
74
74
  "husky": "8.0.1",
75
75
  "jsdoc-to-markdown": "7.1.1",
76
76
  "lint-staged": "13.0.3",
77
77
  "mocha": "10.0.0",
78
- "mock-fs": "5.1.2",
79
- "npm-check": "5.9.2",
78
+ "mock-fs": "5.1.4",
79
+ "npm-check": "6.0.1",
80
80
  "npm-run-all": "4.1.5",
81
81
  "prettier-eslint": "15.0.1"
82
82
  },