mcdev 7.5.0 → 7.6.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 (53) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
  2. package/@types/lib/index.d.ts +12 -8
  3. package/@types/lib/index.d.ts.map +1 -1
  4. package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -1
  5. package/@types/lib/metadataTypes/Automation.d.ts +14 -0
  6. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  7. package/@types/lib/metadataTypes/DataExtension.d.ts +3 -1
  8. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  9. package/@types/lib/metadataTypes/Event.d.ts +2 -2
  10. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  11. package/@types/lib/metadataTypes/Journey.d.ts +17 -0
  12. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  13. package/@types/lib/metadataTypes/MetadataType.d.ts +8 -4
  14. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  15. package/@types/lib/metadataTypes/Query.d.ts +7 -0
  16. package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
  17. package/@types/lib/metadataTypes/TransactionalEmail.d.ts +1 -0
  18. package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/TriggeredSend.d.ts +0 -8
  20. package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +1 -0
  22. package/@types/lib/metadataTypes/definitions/TransactionalEmail.definition.d.ts +1 -0
  23. package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
  24. package/@types/lib/util/util.d.ts.map +1 -1
  25. package/@types/types/mcdev.d.d.ts +20 -8
  26. package/@types/types/mcdev.d.d.ts.map +1 -1
  27. package/lib/cli.js +13 -2
  28. package/lib/index.js +46 -45
  29. package/lib/metadataTypes/Automation.js +28 -0
  30. package/lib/metadataTypes/Event.js +4 -1
  31. package/lib/metadataTypes/Journey.js +472 -94
  32. package/lib/metadataTypes/MetadataType.js +12 -6
  33. package/lib/metadataTypes/TriggeredSend.js +46 -15
  34. package/lib/metadataTypes/definitions/Automation.definition.js +1 -0
  35. package/lib/metadataTypes/definitions/Journey.definition.js +1 -0
  36. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +1 -0
  37. package/package.json +15 -15
  38. package/test/general.test.js +5 -5
  39. package/test/mockRoot/.mcdevrc.json +1 -1
  40. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINcontextual_suppression_list,hidden,list,mysubs,publication,suppression_list,triggered_send,triggered_send_journeybuilder-response.xml +385 -0
  41. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/get-response.json +461 -0
  42. package/test/resources/9999999/interaction/v1/interactions/dsfdsafdsa-922c-4568-85a5-e5cc77efc3be/delete-response.txt +1 -0
  43. package/test/resources/9999999/interaction/v1/interactions/transactional/pause/post-response.json +3 -0
  44. package/test/resources/9999999/interaction/v1/interactions/transactional/resume/post-response.json +3 -0
  45. package/test/resources/9999999/triggeredSendDefinition/retrieve-CustomerKey=testExisting_triggeredSend-response.xml +72 -0
  46. package/test/resources/9999999/triggeredSendDefinition/retrieve-CustomerKey=testExisting_triggeredSend_rcb-response.xml +72 -0
  47. package/test/resources/9999999/triggeredSendDefinition/retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml +1 -1
  48. package/test/resources/9999999/triggeredSendDefinition/retrieve-TriggeredSendStatusINdummy,Active-response.xml +118 -0
  49. package/test/type.automation.test.js +13 -13
  50. package/test/type.journey.test.js +79 -5
  51. package/test/type.query.test.js +2 -2
  52. package/test/type.triggeredSend.test.js +68 -1
  53. package/types/mcdev.d.js +2 -1
package/lib/cli.js CHANGED
@@ -734,11 +734,22 @@ yargs(hideBin(process.argv))
734
734
  .positional('KEY', {
735
735
  type: 'string',
736
736
  describe: 'key(s) of the metadata component(s)',
737
+ })
738
+ .option('metadata', {
739
+ type: 'string',
740
+ array: true,
741
+ alias: 'm',
742
+ group: 'Options for execute:',
743
+ describe: 'type or type:key or type:i:id or type:n:name to fix',
737
744
  }),
738
- // TODO: add option --metadata
739
745
  (argv) => {
740
746
  Mcdev.setOptions(argv);
741
- Mcdev.refresh(argv.BU, argv.TYPE, csvToArray(argv.KEY));
747
+ const typeKeyCombo = Mcdev.metadataToTypeKey(argv.metadata);
748
+ if ('undefined' === typeof typeKeyCombo) {
749
+ Mcdev.refresh(argv.BU, csvToArray(argv.TYPE), csvToArray(argv.KEY));
750
+ } else {
751
+ Mcdev.refresh(argv.BU, typeKeyCombo);
752
+ }
742
753
  }
743
754
  )
744
755
  .command(
package/lib/index.js CHANGED
@@ -730,38 +730,12 @@ class Mcdev {
730
730
  * ensures triggered sends are restarted to ensure they pick up on changes of the underlying emails
731
731
  *
732
732
  * @param {string} businessUnit references credentials from properties.json
733
- * @param {string} type references credentials from properties.json
734
- * @param {string[]} [keyArr] metadata keys
735
- * @returns {Promise.<void>} -
733
+ * @param {string[] | TypeKeyCombo} [selectedTypes] limit to given metadata types
734
+ * @param {string[]} [keys] customerkey of the metadata
735
+ * @returns {Promise.<Object.<string, Object.<string, string[]>>>} key: business unit name, key2: type, value: list of affected item keys
736
736
  */
737
- static async refresh(businessUnit, type, keyArr) {
738
- Util.startLogger();
739
- Util.logger.info('mcdev:: refresh');
740
- if (!type || !Util._isValidType(type, true)) {
741
- type = 'triggeredSend';
742
- Util.logger.info(' - setting type to ' + type);
743
- }
744
- const properties = await config.getProperties();
745
- if (!(await config.checkProperties(properties))) {
746
- return null;
747
- }
748
- const buObject = await Cli.getCredentialObject(properties, businessUnit);
749
- if (buObject !== null) {
750
- try {
751
- MetadataTypeInfo[type].client = auth.getSDK(buObject);
752
- } catch (ex) {
753
- Util.logger.error(ex.message);
754
- return;
755
- }
756
- try {
757
- cache.initCache(buObject);
758
- MetadataTypeInfo[type].properties = properties;
759
- MetadataTypeInfo[type].buObject = buObject;
760
- await MetadataTypeInfo[type].refresh(keyArr);
761
- } catch (ex) {
762
- Util.logger.errorStack(ex, 'mcdev.refresh');
763
- }
764
- }
737
+ static async refresh(businessUnit, selectedTypes, keys) {
738
+ return this.#runMethod('refresh', businessUnit, selectedTypes, keys);
765
739
  }
766
740
 
767
741
  /**
@@ -1127,6 +1101,7 @@ class Mcdev {
1127
1101
  return;
1128
1102
  }
1129
1103
  if (!Array.isArray(typeKeyCombo[type])) {
1104
+ Util.logger.error('You need to define keys, not just types to run build');
1130
1105
  // we need an array of keys here
1131
1106
  return;
1132
1107
  }
@@ -1188,6 +1163,7 @@ class Mcdev {
1188
1163
  return;
1189
1164
  }
1190
1165
  if (!Array.isArray(selectedTypes[type])) {
1166
+ Util.logger.error('You need to define keys, not just types to run buildTemplate');
1191
1167
  // we need an array of keys here
1192
1168
  return;
1193
1169
  }
@@ -1326,6 +1302,7 @@ class Mcdev {
1326
1302
  return;
1327
1303
  }
1328
1304
  if (!Array.isArray(selectedTypes[type])) {
1305
+ Util.logger.error('You need to define keys, not just types to run buildDefinition');
1329
1306
  // we need an array of keys here
1330
1307
  return;
1331
1308
  }
@@ -1381,6 +1358,9 @@ class Mcdev {
1381
1358
  return;
1382
1359
  }
1383
1360
  if (!Array.isArray(selectedTypes[selectedType])) {
1361
+ Util.logger.error(
1362
+ 'You need to define keys, not just types to run buildDefinitionBulk'
1363
+ );
1384
1364
  // we need an array of keys here
1385
1365
  return;
1386
1366
  }
@@ -1681,7 +1661,7 @@ class Mcdev {
1681
1661
  /**
1682
1662
  * run a method across BUs
1683
1663
  *
1684
- * @param {'execute'|'pause'|'stop'|'publish'|'validate'|'fixKeys'|'replaceCbReference'} methodName what to run
1664
+ * @param {'execute'|'pause'|'stop'|'publish'|'validate'|'fixKeys'|'replaceCbReference'|'refresh'} methodName what to run
1685
1665
  * @param {string} businessUnit name of BU
1686
1666
  * @param {string[] | TypeKeyCombo} [selectedTypes] limit to given metadata types
1687
1667
  * @param {string[]} [keys] customerkey of the metadata
@@ -1746,6 +1726,13 @@ class Mcdev {
1746
1726
  checkMetadataSupport = true;
1747
1727
  break;
1748
1728
  }
1729
+ case 'refresh': {
1730
+ lang_past = 'refreshed';
1731
+ lang_present = 'refreshing';
1732
+ requireKeyOrLike = false;
1733
+ checkMetadataSupport = true;
1734
+ break;
1735
+ }
1749
1736
  }
1750
1737
 
1751
1738
  /** @typedef {string[]} */
@@ -1899,7 +1886,7 @@ class Mcdev {
1899
1886
  /**
1900
1887
  * helper for Mcdev.#runMethod
1901
1888
  *
1902
- * @param {'execute'|'pause'|'stop'|'publish'|'validate'|'fixKeys'|'replaceCbReference'} methodName what to run
1889
+ * @param {'execute'|'pause'|'stop'|'publish'|'validate'|'fixKeys'|'replaceCbReference'|'refresh'} methodName what to run
1903
1890
  * @param {string} cred name of Credential
1904
1891
  * @param {string} bu name of BU
1905
1892
  * @param {string} [type] limit execution to given metadata type
@@ -1948,9 +1935,6 @@ class Mcdev {
1948
1935
  if (Util.OPTIONS.like && Object.keys(Util.OPTIONS.like).length) {
1949
1936
  keyArr = await this.#retrieveKeysWithLike(type, buObject);
1950
1937
  }
1951
- if (!keyArr || (Array.isArray(keyArr) && !keyArr.length)) {
1952
- throw new Error('No keys were provided');
1953
- } // result will be undefined (false) if methodName is not supported for the type
1954
1938
  resultArr.push(...(await MetadataTypeInfo[type][methodName](keyArr)));
1955
1939
  }
1956
1940
  }
@@ -2215,36 +2199,53 @@ class Mcdev {
2215
2199
  }
2216
2200
  const metadataOptionMap = metadataOption.map((item) => {
2217
2201
  const itemArr = item.split(':');
2202
+ const type = itemArr.shift();
2218
2203
  switch (itemArr.length) {
2219
- case 1: {
2220
- return { type: itemArr[0] };
2204
+ case 0: {
2205
+ // no ":" found
2206
+ return { type };
2221
2207
  }
2222
- case 2: {
2208
+ case 1: {
2209
+ // 1 ":" found
2223
2210
  if (allowedIdentifiers.includes('key')) {
2224
- return { type: itemArr[0], key: itemArr[1] };
2211
+ return { type, key: itemArr[0] };
2225
2212
  }
2226
2213
  break;
2227
2214
  }
2228
- case 3: {
2229
- switch (itemArr[1]) {
2215
+ default: {
2216
+ // 2 or more ":" found
2217
+ switch (itemArr[0]) {
2230
2218
  case 'key':
2231
2219
  case 'k': {
2232
2220
  if (allowedIdentifiers.includes('key')) {
2233
- return { type: itemArr[0], key: itemArr[2] };
2221
+ // remove k/key
2222
+ itemArr.shift();
2223
+ return { type, key: itemArr.join(':') };
2234
2224
  }
2235
2225
  break;
2236
2226
  }
2237
2227
  case 'id':
2238
2228
  case 'i': {
2239
2229
  if (allowedIdentifiers.includes('id')) {
2240
- return { type: itemArr[0], id: itemArr[2] };
2230
+ // remove i/id
2231
+ itemArr.shift();
2232
+ return { type, id: itemArr.join(':') };
2241
2233
  }
2242
2234
  break;
2243
2235
  }
2244
2236
  case 'name':
2245
2237
  case 'n': {
2246
2238
  if (allowedIdentifiers.includes('name')) {
2247
- return { type: itemArr[0], name: itemArr[2] };
2239
+ // remove n/name
2240
+ itemArr.shift();
2241
+ return { type, name: itemArr.join(':') };
2242
+ }
2243
+ break;
2244
+ }
2245
+ default: {
2246
+ // assume ":" is part of the key (e.g. possible for DE-fields)
2247
+ if (allowedIdentifiers.includes('key')) {
2248
+ return { type, key: itemArr.join(':') };
2248
2249
  }
2249
2250
  }
2250
2251
  }
@@ -485,6 +485,22 @@ class Automation extends MetadataType {
485
485
  // folder
486
486
  this.setFolderPath(metadata);
487
487
  // automations are often skipped due to lack of support.
488
+ if (
489
+ metadata.type == 'automationtriggered' &&
490
+ metadata.automationTrigger?.fileTransferLocationId
491
+ ) {
492
+ try {
493
+ metadata.automationTrigger.r__fileLocation_name = cache.searchForField(
494
+ 'fileLocation',
495
+ metadata.automationTrigger.fileTransferLocationId,
496
+ 'id',
497
+ 'name'
498
+ );
499
+ delete metadata.automationTrigger.fileTransferLocationId;
500
+ } catch (ex) {
501
+ Util.logger.warn(` - automation ${metadata.key}: ${ex.message}`);
502
+ }
503
+ }
488
504
  try {
489
505
  if (metadata.type === 'scheduled' && metadata.schedule?.startDate) {
490
506
  // Starting Source == 'Schedule'
@@ -905,6 +921,18 @@ class Automation extends MetadataType {
905
921
  this.notificationUpdates[metadata.key] = [];
906
922
  }
907
923
  }
924
+ if (
925
+ metadata.type == 'automationtriggered' &&
926
+ metadata.automationTrigger?.r__fileLocation_name
927
+ ) {
928
+ metadata.automationTrigger.fileTransferLocationId = cache.searchForField(
929
+ 'fileLocation',
930
+ metadata.automationTrigger.r__fileLocation_name,
931
+ 'name',
932
+ 'id'
933
+ );
934
+ delete metadata.automationTrigger.r__fileLocation_name;
935
+ }
908
936
  if (this.validateDeployMetadata(metadata)) {
909
937
  // folder
910
938
  this.setFolderId(metadata);
@@ -828,7 +828,10 @@ class Event extends MetadataType {
828
828
  if (Util.OPTIONS.ignoreSfFields) {
829
829
  warnings.push(` (--ignoreSfFields) ` + msg);
830
830
  } else {
831
- errors.push(msg);
831
+ errors.push(
832
+ msg +
833
+ ` (you can use --ignoreSfFields to skip this error in case you are convinced it is a false positive)`
834
+ );
832
835
  }
833
836
  } else {
834
837
  // check if the fields selected in the eventDefinition are actually available