mcdev 5.1.0 → 5.2.0

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 (192) hide show
  1. package/.eslintrc.json +4 -4
  2. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +2 -2
  4. package/.github/workflows/coverage-develop-branch.yml +0 -2
  5. package/.github/workflows/coverage-main-branch.yml +0 -2
  6. package/.github/workflows/coverage.yml +0 -2
  7. package/.husky/post-checkout +1 -0
  8. package/.husky/post-merge +1 -0
  9. package/.vscode/extensions.json +4 -0
  10. package/docs/dist/documentation.md +633 -286
  11. package/lib/Deployer.js +25 -25
  12. package/lib/MetadataTypeDefinitions.js +1 -1
  13. package/lib/MetadataTypeInfo.js +1 -1
  14. package/lib/Retriever.js +1 -1
  15. package/lib/cli.js +159 -9
  16. package/lib/index.js +395 -95
  17. package/lib/metadataTypes/Asset.js +10 -11
  18. package/lib/metadataTypes/AttributeGroup.js +76 -2
  19. package/lib/metadataTypes/AttributeSet.js +260 -0
  20. package/lib/metadataTypes/Automation.js +413 -96
  21. package/lib/metadataTypes/DataExtension.js +2 -2
  22. package/lib/metadataTypes/DataExtensionField.js +1 -1
  23. package/lib/metadataTypes/Event.js +2 -3
  24. package/lib/metadataTypes/Folder.js +1 -1
  25. package/lib/metadataTypes/Journey.js +5 -6
  26. package/lib/metadataTypes/MetadataType.js +149 -49
  27. package/lib/metadataTypes/MobileKeyword.js +8 -8
  28. package/lib/metadataTypes/MobileMessage.js +5 -5
  29. package/lib/metadataTypes/Query.js +26 -10
  30. package/lib/metadataTypes/Script.js +3 -3
  31. package/lib/metadataTypes/TransactionalSMS.js +5 -5
  32. package/lib/metadataTypes/TriggeredSend.js +25 -50
  33. package/lib/metadataTypes/User.js +7 -4
  34. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +117 -106
  35. package/lib/metadataTypes/definitions/{SetDefinition.definition.js → AttributeSet.definition.js} +54 -27
  36. package/lib/metadataTypes/definitions/Automation.definition.js +22 -15
  37. package/lib/metadataTypes/definitions/ImportFile.definition.js +36 -6
  38. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +1 -0
  39. package/lib/util/cache.js +9 -4
  40. package/lib/util/cli.js +40 -0
  41. package/lib/util/file.js +2 -2
  42. package/lib/util/init.js +84 -0
  43. package/lib/util/util.js +121 -13
  44. package/package.json +11 -11
  45. package/test/mockRoot/.mcdevrc.json +1 -1
  46. package/test/mockRoot/deploy/testInstance/testBU/automation/testExisting_automation.automation-meta.json +1 -2
  47. package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +5 -6
  48. package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testExisting_dataExtract.dataExtract-meta.json +35 -0
  49. package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testNew_dataExtract.dataExtract-meta.json +35 -0
  50. package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testExisting_fileTransfer.fileTransfer-meta.json +17 -0
  51. package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testNew_fileTransfer.fileTransfer-meta.json +17 -0
  52. package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +29 -0
  53. package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +29 -0
  54. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.json +11 -0
  55. package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.sql +6 -0
  56. package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.json +6 -0
  57. package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.ssjs +1 -0
  58. package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.json +6 -0
  59. package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.ssjs +1 -0
  60. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testExisting_triggeredSend.triggeredSend-meta.json +29 -0
  61. package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testNew_triggeredSend.triggeredSend-meta.json +29 -0
  62. package/test/resourceFactory.js +77 -12
  63. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-response.xml +27 -0
  64. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDEmaillike@-response.xml +156 -0
  65. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +87 -0
  66. package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmaillike@-response.xml +156 -0
  67. package/test/resources/1111111/accountUser/retrieve-CustomerKey=testExisting_userANDActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +27 -0
  68. package/test/resources/1111111/accountUserAccount/retrieve-AccountUser.AccountUserID=700301950-response.xml +60 -0
  69. package/test/resources/1111111/user/retrieve-expected.md +4 -2
  70. package/test/resources/9999999/attributeGroup/retrieve-expected.json +25 -0
  71. package/test/resources/9999999/attributeSet/retrieve-expected.json +748 -0
  72. package/test/resources/9999999/automation/build-expected.json +1 -2
  73. package/test/resources/9999999/automation/create-expected.json +7 -8
  74. package/test/resources/9999999/automation/create-testNew_automation-expected.md +4 -4
  75. package/test/resources/9999999/automation/patch_fixKeys-pause-expected.json +44 -0
  76. package/test/resources/9999999/automation/patch_fixKeys-schedule-expected.json +44 -0
  77. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
  78. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_pause-response.xml +42 -0
  79. package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +42 -0
  80. package/test/resources/9999999/automation/perform-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
  81. package/test/resources/9999999/automation/retrieve-expected.json +1 -2
  82. package/test/resources/9999999/automation/retrieve-testExisting_automation-expected.md +2 -2
  83. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
  84. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-pause-response.xml +38 -0
  85. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_pause-response.xml +52 -0
  86. package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +52 -0
  87. package/test/resources/9999999/automation/schedule-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
  88. package/test/resources/9999999/automation/template-expected.json +1 -2
  89. package/test/resources/9999999/automation/update-expected.json +1 -2
  90. package/test/resources/9999999/automation/update-testExisting_automation-expected.md +2 -2
  91. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/get-response.json +85 -0
  92. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/patch-response.json +85 -0
  93. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/get-response.json +85 -0
  94. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/patch-response.json +85 -0
  95. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/get-response.json +85 -0
  96. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/patch-response.json +85 -0
  97. package/test/resources/9999999/automation/v1/automations/a8afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +1 -1
  98. package/test/resources/9999999/automation/v1/automations/post-response.json +20 -19
  99. package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/patch-response.json +38 -0
  100. package/test/resources/9999999/automation/v1/dataextracts/post-response.json +38 -0
  101. package/test/resources/9999999/automation/v1/dataextracttypes/get-response.json +50 -0
  102. package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/patch-response.json +18 -0
  103. package/test/resources/9999999/automation/v1/filetransfers/post-response.json +18 -0
  104. package/test/resources/9999999/automation/v1/ftplocations/get-response.json +18 -0
  105. package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/patch-response.json +31 -0
  106. package/test/resources/9999999/automation/v1/imports/get-response.json +1 -1
  107. package/test/resources/9999999/automation/v1/imports/post-response.json +30 -0
  108. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dae/actions/start/post-response.txt +1 -0
  109. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/get-response.json +17 -0
  110. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/patch-response.json +18 -0
  111. package/test/resources/9999999/automation/v1/queries/get-response.json +18 -1
  112. package/test/resources/9999999/automation/v1/scripts/39f6a488-20eb-4ba0-b0b9-023725b574e4/patch-response.json +10 -0
  113. package/test/resources/9999999/automation/v1/scripts/get-response.json +12 -2
  114. package/test/resources/9999999/automation/v1/scripts/post-response.json +10 -0
  115. package/test/resources/9999999/dataExtension/retrieve-Name=testExisting_dataExtension-response.xml +52 -0
  116. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtension-response.xml +98 -0
  117. package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_dataExtensionORDataExtension.CustomerKey=testExisting_dataExtension-response.xml +99 -0
  118. package/test/resources/9999999/dataExtract/build-expected.json +35 -0
  119. package/test/resources/9999999/dataExtract/get-expected.json +39 -0
  120. package/test/resources/9999999/dataExtract/patch-expected.json +37 -0
  121. package/test/resources/9999999/dataExtract/post-expected.json +37 -0
  122. package/test/resources/9999999/dataExtract/template-expected.json +35 -0
  123. package/test/resources/9999999/dataFolder/retrieve-ContentType=contextual_suppression_listORContentType=publicationORContentType=suppression_listORContentType=mysubsORContentType=list-response.xml +136 -0
  124. package/test/resources/9999999/dataFolder/retrieve-ContentType=ssjsactivity-response.xml +48 -0
  125. package/test/resources/9999999/dataFolder/retrieve-ContentType=triggered_send_journeybuilderORContentType=triggered_sendORContentType=hidden-response.xml +276 -0
  126. package/test/resources/9999999/dataFolder/retrieve-response.xml +23 -0
  127. package/test/resources/9999999/email/retrieve-response.xml +203 -0
  128. package/test/resources/9999999/fileTransfer/build-expected.json +15 -0
  129. package/test/resources/9999999/fileTransfer/get-expected.json +17 -0
  130. package/test/resources/9999999/fileTransfer/patch-expected.json +17 -0
  131. package/test/resources/9999999/fileTransfer/post-expected.json +17 -0
  132. package/test/resources/9999999/fileTransfer/template-expected.json +15 -0
  133. package/test/resources/9999999/hub/v1/contacts/schema/attributeGroups/get-response.json +585 -0
  134. package/test/resources/9999999/hub/v1/contacts/schema/setDefinitions/get-response.json +19807 -0
  135. package/test/resources/9999999/importFile/build-expected.json +27 -0
  136. package/test/resources/9999999/importFile/get-expected.json +29 -0
  137. package/test/resources/9999999/importFile/patch-expected.json +29 -0
  138. package/test/resources/9999999/importFile/post-expected.json +29 -0
  139. package/test/resources/9999999/importFile/template-expected.json +27 -0
  140. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_pause-response.xml +32 -0
  141. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_schedule-response.xml +32 -0
  142. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_paused-response.xml +32 -0
  143. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_scheduled-response.xml +32 -0
  144. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_pause-response.xml +30 -0
  145. package/test/resources/9999999/program/retrieve-response.xml +21 -3
  146. package/test/resources/9999999/query/patch_fixKeys-expected.json +11 -0
  147. package/test/resources/9999999/query/patch_fixKeys-expected.sql +6 -0
  148. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixKeysANDStatus=Active-response.xml +30 -0
  149. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixedKeysANDStatus=Active-response.xml +30 -0
  150. package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testNew_queryANDStatus=Active-response.xml +30 -0
  151. package/test/resources/9999999/script/build-expected.json +6 -0
  152. package/test/resources/9999999/script/build-expected.ssjs +1 -0
  153. package/test/resources/9999999/script/get-expected.json +8 -0
  154. package/test/resources/9999999/script/get-expected.ssjs +1 -0
  155. package/test/resources/9999999/script/get_noScriptTag-expected.html +1 -0
  156. package/test/resources/9999999/script/get_noScriptTag-expected.json +8 -0
  157. package/test/resources/9999999/script/patch-expected.json +8 -0
  158. package/test/resources/9999999/script/patch-expected.ssjs +1 -0
  159. package/test/resources/9999999/script/post-expected.json +8 -0
  160. package/test/resources/9999999/script/post-expected.ssjs +1 -0
  161. package/test/resources/9999999/script/template-expected.json +6 -0
  162. package/test/resources/9999999/script/template-expected.ssjs +1 -0
  163. package/test/resources/9999999/triggeredSend/build-expected.json +29 -0
  164. package/test/resources/9999999/triggeredSend/get-expected.json +29 -0
  165. package/test/resources/9999999/triggeredSend/patch-expected.json +29 -0
  166. package/test/resources/9999999/triggeredSend/post-expected.json +29 -0
  167. package/test/resources/9999999/triggeredSend/template-expected.json +29 -0
  168. package/test/resources/9999999/triggeredSendDefinition/create-response.xml +75 -0
  169. package/test/resources/9999999/triggeredSendDefinition/delete-response.xml +36 -0
  170. package/test/resources/9999999/triggeredSendDefinition/{retrieve-response.xml → retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml} +4 -4
  171. package/test/resources/9999999/triggeredSendDefinition/update-response.xml +74 -0
  172. package/test/type.attributeGroup.test.js +55 -0
  173. package/test/type.attributeSet.test.js +55 -0
  174. package/test/type.automation.test.js +638 -11
  175. package/test/type.dataExtension.test.js +0 -1
  176. package/test/type.dataExtract.test.js +187 -0
  177. package/test/type.fileTransfer.test.js +185 -0
  178. package/test/type.importFile.test.js +186 -0
  179. package/test/type.mobileKeyword.test.js +0 -1
  180. package/test/type.query.test.js +464 -13
  181. package/test/type.script.test.js +367 -0
  182. package/test/type.triggeredSend.test.js +152 -0
  183. package/test/type.user.test.js +22 -10
  184. package/test/utils.js +4 -1
  185. package/lib/metadataTypes/SetDefinition.js +0 -37
  186. /package/test/resources/1111111/accountUser/{retrieve-response.xml → retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-response.xml} +0 -0
  187. /package/test/resources/1111111/accountUserAccount/{retrieve-response.xml → retrieve-AccountUser.AccountUserIDIN700301950,700301951,7471228-response.xml} +0 -0
  188. /package/test/resources/1111111/businessUnit/{retrieve-response.xml → retrieve-ID=1111111-response.xml} +0 -0
  189. /package/test/resources/1111111/list/{retrieve-response.xml → retrieve-CustomerKey=All SubscribersORListName=All Subscribers-response.xml} +0 -0
  190. /package/test/resources/1111111/role/{retrieve-response.xml → retrieve-IsPrivate=false-response.xml} +0 -0
  191. /package/test/resources/9999999/emailSendDefinition/{retrieve-response.xml → retrieve-IsPlatformObject=falseANDDescriptionnotEqualsSFSendDefinition-response.xml} +0 -0
  192. /package/test/resources/9999999/queryDefinition/{retrieve-response.xml → retrieve-CustomerKey=testExisting_queryANDStatus=Active-response.xml} +0 -0
@@ -38,7 +38,9 @@ class Query extends MetadataType {
38
38
  objectId = await this._getObjectIdForSingleRetrieve(key);
39
39
  if (!objectId) {
40
40
  // avoid running the rest request below by returning early
41
- Util.logger.info(`Downloaded: ${this.definition.type} (0) - Key: ${key}`);
41
+ Util.logger.info(
42
+ `Downloaded: ${this.definition.type} (0)${Util.getKeysString(key)}`
43
+ );
42
44
  return { metadata: {}, type: this.definition.type };
43
45
  }
44
46
  }
@@ -54,7 +56,7 @@ class Query extends MetadataType {
54
56
  * a function to start query execution via API
55
57
  *
56
58
  * @param {string[]} keyArr customerkey of the metadata
57
- * @returns {Promise.<boolean>} Returns true if all items were executed successfully, otherwise false
59
+ * @returns {Promise.<string[]>} Returns list of keys that were executed successfully
58
60
  */
59
61
  static async execute(keyArr) {
60
62
  const results = [];
@@ -65,16 +67,18 @@ class Query extends MetadataType {
65
67
  objectId = await this._getObjectIdForSingleRetrieve(key);
66
68
  if (!objectId) {
67
69
  Util.logger.info(`Skipping ${key} - did not find an item with such key`);
68
- break;
70
+ continue;
69
71
  }
70
72
  }
71
73
  results.push(
72
74
  super.executeREST(`/automation/v1/queries/${objectId}/actions/start/`, key)
73
75
  );
74
76
  }
75
- const successCounter = (await Promise.all(results)).filter((r) => r === 'OK').length;
76
- Util.logger.info(`Executed ${successCounter} of ${keyArr.length} items`);
77
- return successCounter === keyArr.length;
77
+ const executedKeyArr = (await Promise.all(results))
78
+ .filter((r) => r.response === 'OK')
79
+ .map((r) => r.key);
80
+ Util.logger.info(`Executed ${executedKeyArr.length} of ${keyArr.length} items`);
81
+ return executedKeyArr;
78
82
  }
79
83
  /**
80
84
  * helper to allow us to select single metadata entries via REST
@@ -250,7 +254,7 @@ class Query extends MetadataType {
250
254
  return metadata;
251
255
  }
252
256
  /**
253
- * helper for {@link buildDefinitionForNested}
257
+ * helper for {@link Query.buildDefinitionForNested}
254
258
  * searches extracted SQL file for template variables and applies the market values
255
259
  *
256
260
  * @param {string} code code from extracted code
@@ -328,7 +332,7 @@ class Query extends MetadataType {
328
332
  );
329
333
  }
330
334
  /**
331
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
335
+ * helper for {@link Query.buildTemplateForNested} / {@link Query.buildDefinitionForNested}
332
336
  * handles extracted code if any are found for complex types
333
337
  *
334
338
  * @private
@@ -420,11 +424,12 @@ class Query extends MetadataType {
420
424
  * @param {object} ex response payload from REST API
421
425
  * @returns {string[] | void} formatted Error Message
422
426
  */
423
- static checkForErrors(ex) {
424
- const errors = super.checkForErrors(ex);
427
+ static getErrorsREST(ex) {
428
+ const errors = super.getErrorsREST(ex);
425
429
  if (errors?.length > 0) {
426
430
  return errors.map((msg) => msg.split('Error saving the Query field.').join(''));
427
431
  }
432
+ return errors;
428
433
  }
429
434
  /**
430
435
  * Delete a metadata item from the specified business unit
@@ -452,6 +457,17 @@ class Query extends MetadataType {
452
457
  // delete local copy: retrieve/cred/bu/.../...-meta.sql
453
458
  await super.postDeleteTasks(customerKey, [`${this.definition.type}-meta.sql`]);
454
459
  }
460
+ /**
461
+ * Gets executed after deployment of metadata type
462
+ *
463
+ * @param {TYPE.MetadataTypeMap} upsertResults metadata mapped by their keyField as returned by update/create
464
+ */
465
+ static async postDeployTasks(upsertResults) {
466
+ if (Util.OPTIONS.execute) {
467
+ Util.logger.info(`Executing: ${this.definition.type}`);
468
+ await this.execute(Object.keys(upsertResults));
469
+ }
470
+ }
455
471
  }
456
472
 
457
473
  // Assign definition & cache to static attributes
@@ -82,7 +82,7 @@ class Script extends MetadataType {
82
82
  }
83
83
 
84
84
  /**
85
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
85
+ * helper for {@link Script.preDeployTasks} that loads extracted code content back into JSON
86
86
  *
87
87
  * @param {TYPE.ScriptItem} metadata a single asset definition
88
88
  * @param {string} deployDir directory of deploy files
@@ -189,7 +189,7 @@ class Script extends MetadataType {
189
189
  }
190
190
 
191
191
  /**
192
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
192
+ * helper for {@link Script.buildTemplateForNested} / {@link Script.buildDefinitionForNested}
193
193
  * handles extracted code if any are found for complex types
194
194
  *
195
195
  * @param {string} templateDir Directory where metadata templates are stored
@@ -279,7 +279,7 @@ class Script extends MetadataType {
279
279
  return { json: metadata, codeArr: codeArr, subFolder: null };
280
280
  }
281
281
  /**
282
- * helper for {@link parseMetadata} and {@link _buildForNested}
282
+ * helper for {@link Script.parseMetadata} and {@link Script._buildForNested}
283
283
  *
284
284
  * @param {string} metadataScript the code of the file
285
285
  * @param {string} metadataName the name of the metadata
@@ -66,7 +66,7 @@ class TransactionalSMS extends TransactionalMessage {
66
66
  return metadata;
67
67
  }
68
68
  /**
69
- * helper for {@link preDeployTasks} that loads extracted code content back into JSON
69
+ * helper for {@link TransactionalSMS.preDeployTasks} that loads extracted code content back into JSON
70
70
  *
71
71
  * @param {TYPE.MetadataTypeItem} metadata a single definition
72
72
  * @param {string} deployDir directory of deploy files
@@ -158,7 +158,7 @@ class TransactionalSMS extends TransactionalMessage {
158
158
  return { json: metadata, codeArr: codeArr, subFolder: null };
159
159
  }
160
160
  /**
161
- * helper for {@link parseMetadata} and {@link _buildForNested}
161
+ * helper for {@link TransactionalSMS.postRetrieveTasks} and {@link TransactionalSMS._buildForNested}
162
162
  *
163
163
  * @param {string} metadataScript the code of the file
164
164
  * @returns {{fileExt:string,code:string}} returns found extension and file content
@@ -189,7 +189,7 @@ class TransactionalSMS extends TransactionalMessage {
189
189
  return { fileExt, code };
190
190
  }
191
191
  /**
192
- * helper for {@link MetadataType.buildDefinition}
192
+ * helper for {@link TransactionalMessage.buildDefinition}
193
193
  * handles extracted code if any are found for complex types
194
194
  *
195
195
  * @param {string} templateDir Directory where metadata templates are stored
@@ -216,7 +216,7 @@ class TransactionalSMS extends TransactionalMessage {
216
216
  );
217
217
  }
218
218
  /**
219
- * helper for {@link MetadataType.buildTemplate}
219
+ * helper for {@link TransactionalMessage.buildTemplate}
220
220
  * handles extracted code if any are found for complex types
221
221
  *
222
222
  * @example scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating
@@ -245,7 +245,7 @@ class TransactionalSMS extends TransactionalMessage {
245
245
  }
246
246
 
247
247
  /**
248
- * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
248
+ * helper for {@link TransactionalSMS.buildTemplateForNested} / {@link TransactionalSMS.buildDefinitionForNested}
249
249
  * handles extracted code if any are found for complex types
250
250
  *
251
251
  * @param {string} templateDir Directory where metadata templates are stored
@@ -85,51 +85,19 @@ class TriggeredSend extends MetadataType {
85
85
  return super.deleteByKeySOAP(customerKey);
86
86
  }
87
87
 
88
- /**
89
- * manages post retrieve steps
90
- *
91
- * @param {TYPE.MetadataTypeItem} metadata a single query
92
- * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
93
- */
94
- static postRetrieveTasks(metadata) {
95
- return this.parseMetadata(metadata);
96
- }
97
- /**
98
- * generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
99
- *
100
- * @param {TYPE.MetadataTypeItem} metadata a single script activity definition
101
- */
102
- static setFolderPath(metadata) {
103
- try {
104
- metadata.r__folder_Path = cache.searchForField(
105
- 'folder',
106
- metadata[this.definition.folderIdField],
107
- 'ID',
108
- 'Path'
109
- );
110
- delete metadata[this.definition.folderIdField];
111
- } catch (ex) {
112
- Util.logger.verbose(
113
- ` - skipping ${this.definition.type} '${metadata[this.definition.nameField]}' (${
114
- metadata[this.definition.keyField]
115
- }): Could not find folder (${ex.message})`
116
- );
117
- throw ex;
118
- }
119
- }
120
88
  /**
121
89
  * parses retrieved Metadata before saving
122
90
  *
123
- * @param {TYPE.MetadataTypeItem} metadata a single query activity definition
91
+ * @param {TYPE.MetadataTypeItem} metadata a single item
124
92
  * @returns {TYPE.MetadataTypeItem | void} Array with one metadata object and one sql string
125
93
  */
126
- static parseMetadata(metadata) {
94
+ static postRetrieveTasks(metadata) {
127
95
  // remove IsPlatformObject, always has to be 'false'
128
96
  delete metadata.IsPlatformObject;
97
+
129
98
  // folder
130
- try {
131
- this.setFolderPath(metadata);
132
- } catch {
99
+ this.setFolderPath(metadata);
100
+ if (!metadata.r__folder_Path) {
133
101
  Util.logger.verbose(
134
102
  ` ☇ skipping ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find folder.`
135
103
  );
@@ -163,7 +131,7 @@ class TriggeredSend extends MetadataType {
163
131
  delete metadata.Email;
164
132
  } catch {
165
133
  Util.logger.verbose(
166
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder. This TSD cannot be replublished but potentially restarted with its cached version of the email.`
134
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder. This TSD cannot be republished but potentially restarted with its cached version of the email.`
167
135
  );
168
136
  // save this TSD because it could be fixed by the user or potentially restarted without a fix; also, it might be used by a journey
169
137
  }
@@ -246,7 +214,7 @@ class TriggeredSend extends MetadataType {
246
214
  * TSD-specific refresh method that finds active TSDs and refreshes them
247
215
  *
248
216
  * @param {string[]} [keyArr] metadata keys
249
- * @param {boolean} [checkKey=true] whether to check if the key is valid
217
+ * @param {boolean} [checkKey] whether to check if the key is valid
250
218
  * @returns {Promise.<void>} -
251
219
  */
252
220
  static async refresh(keyArr, checkKey = true) {
@@ -268,7 +236,7 @@ class TriggeredSend extends MetadataType {
268
236
  }
269
237
 
270
238
  /**
271
- * helper for {@link refresh} that extracts the keys from the TSD item map and eli
239
+ * helper for {@link TriggeredSend.refresh} that extracts the keys from the TSD item map and eli
272
240
  *
273
241
  * @param {TYPE.MetadataTypeMapObj} metadata TSD item map
274
242
  * @returns {Promise.<string[]>} keyArr
@@ -282,11 +250,12 @@ class TriggeredSend extends MetadataType {
282
250
  return keyArr;
283
251
  }
284
252
  /**
285
- * helper for {@link refresh} that finds active TSDs on the server and filters it by the same rules that {@link retrieve} is using to avoid refreshing TSDs with broken dependencies
253
+ * helper for {@link TriggeredSend.refresh} that finds active TSDs on the server and filters it by the same rules that {@link TriggeredSend.retrieve} is using to avoid refreshing TSDs with broken dependencies
286
254
  *
255
+ * @param {boolean} [assetLoaded] if run after Asset.deploy via --refresh option this will skip caching assets
287
256
  * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of TSD item map
288
257
  */
289
- static async findRefreshableItems() {
258
+ static async findRefreshableItems(assetLoaded = false) {
290
259
  Util.logger.info('Finding refreshable items...');
291
260
  // cache dependencies to test for broken links
292
261
  // skip deprecated classic emails here, assuming they cannot be updated and hence are not relevant for {@link refresh}
@@ -305,14 +274,20 @@ class TriggeredSend extends MetadataType {
305
274
  list: null,
306
275
  };
307
276
  for (const [type, subTypeArr] of Object.entries(requiredCache)) {
308
- if (!cache.getCache()?.[type]) {
309
- Util.logger.info(` - Caching dependent Metadata: ${type}`);
310
- Util.logSubtypes(subTypeArr);
311
- cacheTypes[type].client = this.client;
312
- cacheTypes[type].buObject = this.buObject;
313
- cacheTypes[type].properties = this.properties;
277
+ if (type === 'asset' && assetLoaded) {
278
+ continue;
279
+ }
280
+ Util.logger.info(` - Caching dependent Metadata: ${type}`);
281
+ Util.logSubtypes(subTypeArr);
282
+ cacheTypes[type].client = this.client;
283
+ cacheTypes[type].buObject = this.buObject;
284
+ cacheTypes[type].properties = this.properties;
314
285
 
315
- const result = await cacheTypes[type].retrieveForCache(null, subTypeArr);
286
+ const result = await cacheTypes[type].retrieveForCache(null, subTypeArr);
287
+ if (cache.getCache()?.[type]) {
288
+ // re-run caching to merge with existing cache, assuming we might have missed subtypes
289
+ cache.mergeMetadata(type, result.metadata);
290
+ } else {
316
291
  cache.setMetadata(type, result.metadata);
317
292
  }
318
293
  }
@@ -329,7 +304,7 @@ class TriggeredSend extends MetadataType {
329
304
  }
330
305
 
331
306
  /**
332
- * helper for {@link refresh} that pauses, publishes and starts a triggered send
307
+ * helper for {@link TriggeredSend.refresh} that pauses, publishes and starts a triggered send
333
308
  *
334
309
  * @param {string} key external key of triggered send item
335
310
  * @param {boolean} checkKey whether to check if key exists on the server
@@ -404,8 +404,11 @@ class User extends MetadataType {
404
404
  if (!metadata.Password) {
405
405
  metadata.Password = this._generatePassword();
406
406
  Util.logger.info(
407
- ` - Password for ${metadata.UserID} was not given. Generated password: ${metadata.Password}`
407
+ ` - Password for ${metadata.UserID} was not given. Generated password:`
408
408
  );
409
+ // use console.log here to print the generated password to bypass the logfile
410
+ // eslint-disable-next-line no-console
411
+ console.log(metadata.Password);
409
412
  }
410
413
  }
411
414
 
@@ -510,7 +513,7 @@ class User extends MetadataType {
510
513
  * @param {string} roleName role.Name
511
514
  * @param {number} userId user.AccountUserID
512
515
  * @param {boolean} assignmentOnly if true, only assignment configuration will be returned
513
- * @param {boolean} [isRoleRemovale=false] if true, role will be removed from user; otherwise added
516
+ * @param {boolean} [isRoleRemovale] if true, role will be removed from user; otherwise added
514
517
  * @returns {object} format needed by API
515
518
  */
516
519
  static _getRoleObjectForDeploy(
@@ -737,7 +740,7 @@ class User extends MetadataType {
737
740
  }
738
741
 
739
742
  /**
740
- * helper for {@link retrieveSOAP}
743
+ * helper for {@link User.retrieveSOAP}
741
744
  *
742
745
  * @private
743
746
  * @param {TYPE.SoapRequestParams} [requestParams] required for the specific request (filter for example)
@@ -897,7 +900,7 @@ class User extends MetadataType {
897
900
  }
898
901
  }
899
902
  /**
900
- * helper for {@link createOrUpdate} to generate a random initial password for new users
903
+ * helper for {@link User.createOrUpdate} to generate a random initial password for new users
901
904
  * note: possible minimum length values in SFMC are 6, 8, 10, 15 chars. Therefore we should default here to 15 chars.
902
905
  *
903
906
  * @private