mcdev 5.0.2 → 5.1.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 (88) hide show
  1. package/.coverage-comment-template.svelte +177 -161
  2. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  3. package/.github/dependabot.yml +8 -0
  4. package/.github/workflows/coverage-base-update.yml +6 -2
  5. package/.github/workflows/coverage-develop-branch.yml +7 -6
  6. package/.github/workflows/coverage-main-branch.yml +7 -6
  7. package/.github/workflows/coverage.yml +7 -2
  8. package/.husky/post-checkout +3 -2
  9. package/docs/dist/documentation.md +162 -47
  10. package/lib/Deployer.js +3 -3
  11. package/lib/cli.js +28 -0
  12. package/lib/index.js +173 -2
  13. package/lib/metadataTypes/Automation.js +400 -193
  14. package/lib/metadataTypes/DataExtension.js +5 -5
  15. package/lib/metadataTypes/MetadataType.js +42 -15
  16. package/lib/metadataTypes/Query.js +26 -0
  17. package/lib/metadataTypes/definitions/Asset.definition.js +1 -0
  18. package/lib/metadataTypes/definitions/Automation.definition.js +52 -6
  19. package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -0
  20. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
  21. package/lib/metadataTypes/definitions/EmailSend.definition.js +1 -0
  22. package/lib/metadataTypes/definitions/Event.definition.js +1 -0
  23. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  24. package/lib/metadataTypes/definitions/ImportFile.definition.js +1 -0
  25. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +1 -0
  26. package/lib/metadataTypes/definitions/Query.definition.js +1 -0
  27. package/lib/metadataTypes/definitions/Role.definition.js +1 -0
  28. package/lib/metadataTypes/definitions/TriggeredSend.definition.js +1 -0
  29. package/lib/metadataTypes/definitions/User.definition.js +1 -0
  30. package/lib/util/devops.js +13 -11
  31. package/lib/util/util.js +152 -129
  32. package/package.json +5 -5
  33. package/test/general.test.js +26 -0
  34. package/test/mockRoot/.mcdevrc.json +1 -1
  35. package/test/mockRoot/deploy/testInstance/testBU/automation/testExisting_automation.automation-meta.json +53 -0
  36. package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +46 -0
  37. package/test/mockRoot/deploy/testInstance/testBU/query/{testExistingQuery.query-meta.json → testExisting_query.query-meta.json} +2 -2
  38. package/test/mockRoot/deploy/testInstance/testBU/query/{testNewQuery.query-meta.json → testNew_query.query-meta.json} +2 -2
  39. package/test/resourceFactory.js +64 -21
  40. package/test/resources/9999999/automation/build-expected.json +58 -0
  41. package/test/resources/9999999/automation/create-expected.json +46 -0
  42. package/test/resources/9999999/automation/create-testNew_automation-expected.md +28 -0
  43. package/test/resources/9999999/automation/delete-response.xml +40 -0
  44. package/test/resources/9999999/automation/retrieve-expected.json +58 -0
  45. package/test/resources/9999999/automation/retrieve-testExisting_automation-expected.md +30 -0
  46. package/test/resources/9999999/automation/template-expected.json +58 -0
  47. package/test/resources/9999999/automation/update-expected.json +46 -0
  48. package/test/resources/9999999/automation/update-testExisting_automation-expected.md +28 -0
  49. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +85 -0
  50. package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/patch-response.json +85 -0
  51. package/test/resources/9999999/automation/v1/automations/a8afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +85 -0
  52. package/test/resources/9999999/automation/v1/automations/post-response.json +85 -0
  53. package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/get-response.json +38 -0
  54. package/test/resources/9999999/automation/v1/dataextracts/get-response.json +20 -0
  55. package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/get-response.json +18 -0
  56. package/test/resources/9999999/automation/v1/filetransfers/get-response.json +15 -0
  57. package/test/resources/9999999/automation/v1/imports/get-response.json +38 -0
  58. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/actions/start/post-response.txt +1 -0
  59. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +2 -2
  60. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +2 -2
  61. package/test/resources/9999999/automation/v1/queries/get-response.json +4 -4
  62. package/test/resources/9999999/automation/v1/queries/post-response.json +2 -2
  63. package/test/resources/9999999/automation/v1/scripts/get-response.json +17 -0
  64. package/test/resources/9999999/dataFolder/retrieve-ContentType=automations-response.xml +48 -0
  65. package/test/resources/9999999/dataFolder/retrieve-ContentType=queryactivity-response.xml +48 -0
  66. package/test/resources/9999999/dataFolder/retrieve-response.xml +22 -0
  67. package/test/resources/9999999/emailSendDefinition/retrieve-response.xml +85 -0
  68. package/test/resources/9999999/legacy/v1/beta/automations/notifications/RkpOcE9qSVh2VUdnYTVJbWFfWW14dzoyNTow/get-response.json +21 -0
  69. package/test/resources/9999999/legacy/v1/beta/automations/notifications/RkpOcE9qSVh2VUdnYTVJbWFfWW14dzoyNTow/post-response.json +0 -0
  70. package/test/resources/9999999/legacy/v1/beta/bulk/automations/automation/definition/get-response.json +30 -0
  71. package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation-response.xml +30 -0
  72. package/test/resources/9999999/program/retrieve-CustomerKey=testNew_automation-response.xml +30 -0
  73. package/test/resources/9999999/program/retrieve-Name=testExisting_automation-response.xml +31 -0
  74. package/test/resources/9999999/program/retrieve-response.xml +32 -0
  75. package/test/resources/9999999/query/build-expected.json +2 -2
  76. package/test/resources/9999999/query/get-expected.json +2 -2
  77. package/test/resources/9999999/query/get2-expected.json +2 -2
  78. package/test/resources/9999999/query/patch-expected.json +2 -2
  79. package/test/resources/9999999/query/post-expected.json +2 -2
  80. package/test/resources/9999999/query/template-expected.json +2 -2
  81. package/test/type.automation.test.js +259 -0
  82. package/test/type.dataExtension.test.js +3 -0
  83. package/test/type.query.test.js +39 -26
  84. package/test/type.user.test.js +17 -3
  85. package/test/utils.js +7 -6
  86. package/.coverage-comment-template.md +0 -20
  87. /package/test/mockRoot/deploy/testInstance/testBU/query/{testExistingQuery.query-meta.sql → testExisting_query.query-meta.sql} +0 -0
  88. /package/test/mockRoot/deploy/testInstance/testBU/query/{testNewQuery.query-meta.sql → testNew_query.query-meta.sql} +0 -0
@@ -186,17 +186,17 @@ Provides default functionality that can be overwritten by child metadata type cl
186
186
  <dt><a href="#csvToArray">csvToArray(csv)</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
187
187
  <dd><p>helper to convert CSVs into an array. if only one value was given, it&#39;s also returned as an array</p>
188
188
  </dd>
189
+ <dt><a href="#Automation.">Automation.(metadataMap, key)</a> ⇒ <code>Promise.&lt;void&gt;</code></dt>
190
+ <dd><p>helper for <a href="#Automation.postDeployTasks">postDeployTasks</a></p>
191
+ </dd>
192
+ <dt><a href="#Automation.">Automation.(metadataMap, originalMetadataMap, key)</a></dt>
193
+ <dd><p>helper for <a href="postDeployTasks">postDeployTasks</a></p>
194
+ </dd>
189
195
  <dt><a href="#getUserName">getUserName(userList, item, fieldname)</a> ⇒ <code>string</code></dt>
190
196
  <dd></dd>
191
197
  <dt><a href="#setupSDK">setupSDK(sessionKey, authObject)</a> ⇒ <code><a href="#SDK">SDK</a></code></dt>
192
198
  <dd><p>Returns an SDK instance to be used for API calls</p>
193
199
  </dd>
194
- <dt><a href="#createNewLoggerTransport">createNewLoggerTransport()</a> ⇒ <code>object</code></dt>
195
- <dd><p>wrapper around our standard winston logging to console and logfile</p>
196
- </dd>
197
- <dt><a href="#startLogger">startLogger()</a> ⇒ <code>void</code></dt>
198
- <dd><p>initiate winston logger</p>
199
- </dd>
200
200
  </dl>
201
201
 
202
202
  ## Typedefs
@@ -496,6 +496,8 @@ main class
496
496
  * [.buildDefinition(businessUnit, selectedType, name, market)](#Mcdev.buildDefinition) ⇒ <code>Promise.&lt;void&gt;</code>
497
497
  * [.buildDefinitionBulk(listName, type, name)](#Mcdev.buildDefinitionBulk) ⇒ <code>Promise.&lt;void&gt;</code>
498
498
  * [.getFilesToCommit(businessUnit, selectedType, keyArr)](#Mcdev.getFilesToCommit) ⇒ <code>Promise.&lt;Array.&lt;string&gt;&gt;</code>
499
+ * [.execute(businessUnit, [selectedTypesArr], keys)](#Mcdev.execute) ⇒ <code>Promise.&lt;boolean&gt;</code>
500
+ * [._executeBU(cred, bu, [selectedTypesArr], keyArr)](#Mcdev._executeBU) ⇒ <code>Promise.&lt;boolean&gt;</code>
499
501
 
500
502
  <a name="Mcdev.setSkipInteraction"></a>
501
503
 
@@ -748,6 +750,35 @@ Build a specific metadata file based on a template using a list of bu-market com
748
750
  | selectedType | <code>string</code> | supported metadata type |
749
751
  | keyArr | <code>Array.&lt;string&gt;</code> | customerkey of the metadata |
750
752
 
753
+ <a name="Mcdev.execute"></a>
754
+
755
+ ### Mcdev.execute(businessUnit, [selectedTypesArr], keys) ⇒ <code>Promise.&lt;boolean&gt;</code>
756
+ Start an item (query)
757
+
758
+ **Kind**: static method of [<code>Mcdev</code>](#Mcdev)
759
+ **Returns**: <code>Promise.&lt;boolean&gt;</code> - true if all started successfully, false if not
760
+
761
+ | Param | Type | Description |
762
+ | --- | --- | --- |
763
+ | businessUnit | <code>string</code> | name of BU |
764
+ | [selectedTypesArr] | <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code> | limit to given metadata types |
765
+ | keys | <code>Array.&lt;string&gt;</code> | customerkey of the metadata |
766
+
767
+ <a name="Mcdev._executeBU"></a>
768
+
769
+ ### Mcdev.\_executeBU(cred, bu, [selectedTypesArr], keyArr) ⇒ <code>Promise.&lt;boolean&gt;</code>
770
+ helper for [execute](execute)
771
+
772
+ **Kind**: static method of [<code>Mcdev</code>](#Mcdev)
773
+ **Returns**: <code>Promise.&lt;boolean&gt;</code> - true if all items were executed, false otherwise
774
+
775
+ | Param | Type | Description |
776
+ | --- | --- | --- |
777
+ | cred | <code>string</code> | name of Credential |
778
+ | bu | <code>string</code> | name of BU |
779
+ | [selectedTypesArr] | <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code> | limit execution to given metadata type |
780
+ | keyArr | <code>Array.&lt;string&gt;</code> | customerkey of the metadata |
781
+
751
782
  <a name="Asset"></a>
752
783
 
753
784
  ## Asset ⇐ [<code>MetadataType</code>](#MetadataType)
@@ -1206,7 +1237,7 @@ Automation MetadataType
1206
1237
  * [.retrieveChangelog()](#Automation.retrieveChangelog) ⇒ <code>Promise.&lt;TYPE.AutomationMapObj&gt;</code>
1207
1238
  * [.retrieveForCache()](#Automation.retrieveForCache) ⇒ <code>Promise.&lt;TYPE.AutomationMapObj&gt;</code>
1208
1239
  * [.retrieveAsTemplate(templateDir, name, templateVariables)](#Automation.retrieveAsTemplate) ⇒ <code>Promise.&lt;TYPE.AutomationItemObj&gt;</code>
1209
- * [.postRetrieveTasks(metadata)](#Automation.postRetrieveTasks) ⇒ <code>TYPE.AutomationItem</code>
1240
+ * [.postRetrieveTasks(metadata)](#Automation.postRetrieveTasks) ⇒ <code>TYPE.AutomationItem</code> \| <code>void</code>
1210
1241
  * [.deploy(metadata, targetBU, retrieveDir, [isRefresh])](#Automation.deploy) ⇒ <code>Promise.&lt;TYPE.AutomationMap&gt;</code>
1211
1242
  * [.create(metadata)](#Automation.create) ⇒ <code>Promise</code>
1212
1243
  * [.update(metadata, metadataBefore)](#Automation.update) ⇒ <code>Promise</code>
@@ -1215,7 +1246,6 @@ Automation MetadataType
1215
1246
  * [.postDeployTasks(metadataMap, originalMetadataMap)](#Automation.postDeployTasks) ⇒ <code>Promise.&lt;void&gt;</code>
1216
1247
  * [.setFolderPath(metadata)](#Automation.setFolderPath)
1217
1248
  * [.setFolderId(metadata)](#Automation.setFolderId)
1218
- * [.parseMetadata(metadata)](#Automation.parseMetadata) ⇒ <code>TYPE.AutomationItem</code> \| <code>void</code>
1219
1249
  * [._buildSchedule(scheduleObject)](#Automation._buildSchedule) ⇒ <code>TYPE.AutomationScheduleSoap</code>
1220
1250
  * [._calcTime(offsetServer, dateInput, [offsetInput])](#Automation._calcTime) ⇒ <code>string</code>
1221
1251
  * [.document([metadata])](#Automation.document) ⇒ <code>Promise.&lt;void&gt;</code>
@@ -1268,11 +1298,11 @@ Retrieve a specific Automation Definition by Name
1268
1298
 
1269
1299
  <a name="Automation.postRetrieveTasks"></a>
1270
1300
 
1271
- ### Automation.postRetrieveTasks(metadata) ⇒ <code>TYPE.AutomationItem</code>
1301
+ ### Automation.postRetrieveTasks(metadata) ⇒ <code>TYPE.AutomationItem</code> \| <code>void</code>
1272
1302
  manages post retrieve steps
1273
1303
 
1274
1304
  **Kind**: static method of [<code>Automation</code>](#Automation)
1275
- **Returns**: <code>TYPE.AutomationItem</code> - metadata
1305
+ **Returns**: <code>TYPE.AutomationItem</code> \| <code>void</code> - parsed item
1276
1306
 
1277
1307
  | Param | Type | Description |
1278
1308
  | --- | --- | --- |
@@ -1378,18 +1408,6 @@ automation-specific script that retrieves the folder ID from cache and updates t
1378
1408
  | --- | --- | --- |
1379
1409
  | metadata | <code>TYPE.MetadataTypeItem</code> | a single item |
1380
1410
 
1381
- <a name="Automation.parseMetadata"></a>
1382
-
1383
- ### Automation.parseMetadata(metadata) ⇒ <code>TYPE.AutomationItem</code> \| <code>void</code>
1384
- parses retrieved Metadata before saving
1385
-
1386
- **Kind**: static method of [<code>Automation</code>](#Automation)
1387
- **Returns**: <code>TYPE.AutomationItem</code> \| <code>void</code> - parsed item
1388
-
1389
- | Param | Type | Description |
1390
- | --- | --- | --- |
1391
- | metadata | <code>TYPE.AutomationItem</code> | a single automation definition |
1392
-
1393
1411
  <a name="Automation._buildSchedule"></a>
1394
1412
 
1395
1413
  ### Automation.\_buildSchedule(scheduleObject) ⇒ <code>TYPE.AutomationScheduleSoap</code>
@@ -3155,6 +3173,7 @@ Provides default functionality that can be overwritten by child metadata type cl
3155
3173
  * [.create(metadata, deployDir)](#MetadataType.create) ⇒ <code>void</code>
3156
3174
  * [.update(metadata, [metadataBefore])](#MetadataType.update) ⇒ <code>void</code>
3157
3175
  * [.refresh()](#MetadataType.refresh) ⇒ <code>void</code>
3176
+ * [.execute()](#MetadataType.execute) ⇒ <code>void</code>
3158
3177
  * [.hasChanged(cachedVersion, metadata, [fieldName])](#MetadataType.hasChanged) ⇒ <code>boolean</code>
3159
3178
  * [.hasChangedGeneric(cachedVersion, metadata, [fieldName], [silent])](#MetadataType.hasChangedGeneric) ⇒ <code>boolean</code>
3160
3179
  * [.upsert(metadataMap, deployDir, [isRefresh])](#MetadataType.upsert) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMap&gt;</code>
@@ -3167,6 +3186,7 @@ Provides default functionality that can be overwritten by child metadata type cl
3167
3186
  * [.getSOAPErrorMsg(ex)](#MetadataType.getSOAPErrorMsg) ⇒ <code>string</code>
3168
3187
  * [.retrieveSOAP(retrieveDir, [requestParams], [singleRetrieve], [additionalFields])](#MetadataType.retrieveSOAP) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
3169
3188
  * [.retrieveREST(retrieveDir, uri, [templateVariables], [singleRetrieve])](#MetadataType.retrieveREST) ⇒ <code>Promise.&lt;{metadata: (TYPE.MetadataTypeMap\|TYPE.MetadataTypeItem), type: string}&gt;</code>
3189
+ * [.executeREST(uri, key)](#MetadataType.executeREST) ⇒ <code>Promise.&lt;string&gt;</code>
3170
3190
  * [.runDocumentOnRetrieve([singleRetrieve], metadataMap)](#MetadataType.runDocumentOnRetrieve) ⇒ <code>Promise.&lt;void&gt;</code>
3171
3191
  * [.parseResponseBody(body, [singleRetrieve])](#MetadataType.parseResponseBody) ⇒ <code>TYPE.MetadataTypeMap</code>
3172
3192
  * [.deleteFieldByDefinition(metadataEntry, fieldPath, definitionProperty, origin)](#MetadataType.deleteFieldByDefinition) ⇒ <code>void</code>
@@ -3466,6 +3486,12 @@ Abstract update method that needs to be implemented in child metadata type
3466
3486
  ### MetadataType.refresh() ⇒ <code>void</code>
3467
3487
  Abstract refresh method that needs to be implemented in child metadata type
3468
3488
 
3489
+ **Kind**: static method of [<code>MetadataType</code>](#MetadataType)
3490
+ <a name="MetadataType.execute"></a>
3491
+
3492
+ ### MetadataType.execute() ⇒ <code>void</code>
3493
+ Abstract execute method that needs to be implemented in child metadata type
3494
+
3469
3495
  **Kind**: static method of [<code>MetadataType</code>](#MetadataType)
3470
3496
  <a name="MetadataType.hasChanged"></a>
3471
3497
 
@@ -3633,6 +3659,19 @@ Retrieves Metadata for Rest Types
3633
3659
  | [templateVariables] | <code>TYPE.TemplateMap</code> | variables to be replaced in the metadata |
3634
3660
  | [singleRetrieve] | <code>string</code> \| <code>number</code> | key of single item to filter by |
3635
3661
 
3662
+ <a name="MetadataType.executeREST"></a>
3663
+
3664
+ ### MetadataType.executeREST(uri, key) ⇒ <code>Promise.&lt;string&gt;</code>
3665
+ Used to execute a query/automation etc.
3666
+
3667
+ **Kind**: static method of [<code>MetadataType</code>](#MetadataType)
3668
+ **Returns**: <code>Promise.&lt;string&gt;</code> - 'OK' if started execution successfully, otherwise - 'Error'
3669
+
3670
+ | Param | Type | Description |
3671
+ | --- | --- | --- |
3672
+ | uri | <code>string</code> | REST endpoint where the POST request should be sent |
3673
+ | key | <code>string</code> | item key |
3674
+
3636
3675
  <a name="MetadataType.runDocumentOnRetrieve"></a>
3637
3676
 
3638
3677
  ### MetadataType.runDocumentOnRetrieve([singleRetrieve], metadataMap) ⇒ <code>Promise.&lt;void&gt;</code>
@@ -4548,6 +4587,7 @@ Query MetadataType
4548
4587
 
4549
4588
  * [Query](#Query) ⇐ [<code>MetadataType</code>](#MetadataType)
4550
4589
  * [.retrieve(retrieveDir, [_], [__], [key])](#Query.retrieve) ⇒ <code>Promise.&lt;{metadata: TYPE.QueryMap, type: string}&gt;</code>
4590
+ * [.execute(keyArr)](#Query.execute) ⇒ <code>Promise.&lt;boolean&gt;</code>
4551
4591
  * [.retrieveForCache()](#Query.retrieveForCache) ⇒ <code>Promise.&lt;{metadata: TYPE.QueryMap, type: string}&gt;</code>
4552
4592
  * [.retrieveAsTemplate(templateDir, name, templateVariables)](#Query.retrieveAsTemplate) ⇒ <code>Promise.&lt;{metadata: Query, type: string}&gt;</code>
4553
4593
  * [.postRetrieveTasks(metadata)](#Query.postRetrieveTasks) ⇒ <code>TYPE.CodeExtractItem</code>
@@ -4577,6 +4617,18 @@ Retrieves Metadata of queries
4577
4617
  | [__] | <code>void</code> | unused parameter |
4578
4618
  | [key] | <code>string</code> | customer key of single item to retrieve |
4579
4619
 
4620
+ <a name="Query.execute"></a>
4621
+
4622
+ ### Query.execute(keyArr) ⇒ <code>Promise.&lt;boolean&gt;</code>
4623
+ a function to start query execution via API
4624
+
4625
+ **Kind**: static method of [<code>Query</code>](#Query)
4626
+ **Returns**: <code>Promise.&lt;boolean&gt;</code> - Returns true if all items were executed successfully, otherwise false
4627
+
4628
+ | Param | Type | Description |
4629
+ | --- | --- | --- |
4630
+ | keyArr | <code>Array.&lt;string&gt;</code> | customerkey of the metadata |
4631
+
4580
4632
  <a name="Query.retrieveForCache"></a>
4581
4633
 
4582
4634
  ### Query.retrieveForCache() ⇒ <code>Promise.&lt;{metadata: TYPE.QueryMap, type: string}&gt;</code>
@@ -5833,19 +5885,21 @@ CLI entry for SFMC DevTools
5833
5885
  * [.includesStartsWith(arr, search)](#Util.includesStartsWith) ⇒ <code>boolean</code>
5834
5886
  * [.includesStartsWithIndex(arr, search)](#Util.includesStartsWithIndex) ⇒ <code>number</code>
5835
5887
  * [.checkMarket(market, properties)](#Util.checkMarket) ⇒ <code>boolean</code>
5836
- * [.verifyMarketList(mlName, properties)](#Util.verifyMarketList) ⇒ <code>void</code>
5888
+ * [.verifyMarketList(mlName, properties)](#Util.verifyMarketList)
5837
5889
  * [.signalFatalError()](#Util.signalFatalError) ⇒ <code>void</code>
5838
5890
  * [.isTrue(attrValue)](#Util.isTrue) ⇒ <code>boolean</code>
5839
5891
  * [.isFalse(attrValue)](#Util.isFalse) ⇒ <code>boolean</code>
5840
5892
  * [._isValidType(selectedType, [handleOutside])](#Util._isValidType) ⇒ <code>boolean</code>
5841
5893
  * [.getTypeAndSubType(selectedType)](#Util.getTypeAndSubType) ⇒ <code>Array.&lt;string&gt;</code>
5842
5894
  * [.getRetrieveTypeChoices()](#Util.getRetrieveTypeChoices) ⇒ <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code>
5895
+ * [._createNewLoggerTransport([noLogFile])](#Util._createNewLoggerTransport) ⇒ <code>object</code>
5896
+ * [.startLogger([restart], [noLogFile])](#Util.startLogger) ⇒ <code>void</code>
5843
5897
  * [.metadataLogger(level, type, method, payload, [source])](#Util.metadataLogger) ⇒ <code>void</code>
5844
5898
  * [.replaceByObject(str, obj)](#Util.replaceByObject) ⇒ <code>string</code> \| <code>object</code>
5845
5899
  * [.inverseGet(objs, val)](#Util.inverseGet) ⇒ <code>string</code>
5846
5900
  * [.getMetadataHierachy(metadataTypes)](#Util.getMetadataHierachy) ⇒ <code>Object.&lt;string, Array.&lt;string&gt;&gt;</code>
5847
5901
  * [.resolveObjPath(path, obj)](#Util.resolveObjPath) ⇒ <code>any</code>
5848
- * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ <code>string</code>
5902
+ * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ <code>string</code> \| <code>void</code>
5849
5903
  * [.templateSearchResult(results, keyToSearch, searchValue)](#Util.templateSearchResult) ⇒ <code>TYPE.MetadataTypeItem</code>
5850
5904
  * [.setLoggingLevel(argv)](#Util.setLoggingLevel) ⇒ <code>void</code>
5851
5905
  * [.logBeta(type)](#Util.logBeta)
@@ -5919,11 +5973,10 @@ check if a market name exists in current mcdev config
5919
5973
 
5920
5974
  <a name="Util.verifyMarketList"></a>
5921
5975
 
5922
- ### Util.verifyMarketList(mlName, properties) ⇒ <code>void</code>
5976
+ ### Util.verifyMarketList(mlName, properties)
5923
5977
  ensure provided MarketList exists and it's content including markets and BUs checks out
5924
5978
 
5925
5979
  **Kind**: static method of [<code>Util</code>](#Util)
5926
- **Returns**: <code>void</code> - throws errors if problems were found
5927
5980
 
5928
5981
  | Param | Type | Description |
5929
5982
  | --- | --- | --- |
@@ -5992,6 +6045,30 @@ helper for getDefaultProperties()
5992
6045
 
5993
6046
  **Kind**: static method of [<code>Util</code>](#Util)
5994
6047
  **Returns**: <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code> - type choices
6048
+ <a name="Util._createNewLoggerTransport"></a>
6049
+
6050
+ ### Util.\_createNewLoggerTransport([noLogFile]) ⇒ <code>object</code>
6051
+ wrapper around our standard winston logging to console and logfile
6052
+
6053
+ **Kind**: static method of [<code>Util</code>](#Util)
6054
+ **Returns**: <code>object</code> - initiated logger for console and file
6055
+
6056
+ | Param | Type | Default | Description |
6057
+ | --- | --- | --- | --- |
6058
+ | [noLogFile] | <code>boolean</code> | <code>false</code> | optional flag to indicate if we should log to file; CLI logs are always on |
6059
+
6060
+ <a name="Util.startLogger"></a>
6061
+
6062
+ ### Util.startLogger([restart], [noLogFile]) ⇒ <code>void</code>
6063
+ initiate winston logger
6064
+
6065
+ **Kind**: static method of [<code>Util</code>](#Util)
6066
+
6067
+ | Param | Type | Default | Description |
6068
+ | --- | --- | --- | --- |
6069
+ | [restart] | <code>boolean</code> | <code>false</code> | if true, logger will be restarted; otherwise, an existing logger will be used |
6070
+ | [noLogFile] | <code>boolean</code> | <code>false</code> | if false, logger will log to file; otherwise, only to console |
6071
+
5995
6072
  <a name="Util.metadataLogger"></a>
5996
6073
 
5997
6074
  ### Util.metadataLogger(level, type, method, payload, [source]) ⇒ <code>void</code>
@@ -6061,11 +6138,11 @@ let's you dynamically walk down an object and get a value
6061
6138
 
6062
6139
  <a name="Util.execSync"></a>
6063
6140
 
6064
- ### Util.execSync(cmd, [args], [hideOutput]) ⇒ <code>string</code>
6141
+ ### Util.execSync(cmd, [args], [hideOutput]) ⇒ <code>string</code> \| <code>void</code>
6065
6142
  helper to run other commands as if run manually by user
6066
6143
 
6067
6144
  **Kind**: static method of [<code>Util</code>](#Util)
6068
- **Returns**: <code>string</code> - output of command if hideOutput is true
6145
+ **Returns**: <code>string</code> \| <code>void</code> - output of command if hideOutput is true
6069
6146
 
6070
6147
  | Param | Type | Description |
6071
6148
  | --- | --- | --- |
@@ -7698,19 +7775,21 @@ Util that contains logger and simple util methods
7698
7775
  * [.includesStartsWith(arr, search)](#Util.includesStartsWith) ⇒ <code>boolean</code>
7699
7776
  * [.includesStartsWithIndex(arr, search)](#Util.includesStartsWithIndex) ⇒ <code>number</code>
7700
7777
  * [.checkMarket(market, properties)](#Util.checkMarket) ⇒ <code>boolean</code>
7701
- * [.verifyMarketList(mlName, properties)](#Util.verifyMarketList) ⇒ <code>void</code>
7778
+ * [.verifyMarketList(mlName, properties)](#Util.verifyMarketList)
7702
7779
  * [.signalFatalError()](#Util.signalFatalError) ⇒ <code>void</code>
7703
7780
  * [.isTrue(attrValue)](#Util.isTrue) ⇒ <code>boolean</code>
7704
7781
  * [.isFalse(attrValue)](#Util.isFalse) ⇒ <code>boolean</code>
7705
7782
  * [._isValidType(selectedType, [handleOutside])](#Util._isValidType) ⇒ <code>boolean</code>
7706
7783
  * [.getTypeAndSubType(selectedType)](#Util.getTypeAndSubType) ⇒ <code>Array.&lt;string&gt;</code>
7707
7784
  * [.getRetrieveTypeChoices()](#Util.getRetrieveTypeChoices) ⇒ <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code>
7785
+ * [._createNewLoggerTransport([noLogFile])](#Util._createNewLoggerTransport) ⇒ <code>object</code>
7786
+ * [.startLogger([restart], [noLogFile])](#Util.startLogger) ⇒ <code>void</code>
7708
7787
  * [.metadataLogger(level, type, method, payload, [source])](#Util.metadataLogger) ⇒ <code>void</code>
7709
7788
  * [.replaceByObject(str, obj)](#Util.replaceByObject) ⇒ <code>string</code> \| <code>object</code>
7710
7789
  * [.inverseGet(objs, val)](#Util.inverseGet) ⇒ <code>string</code>
7711
7790
  * [.getMetadataHierachy(metadataTypes)](#Util.getMetadataHierachy) ⇒ <code>Object.&lt;string, Array.&lt;string&gt;&gt;</code>
7712
7791
  * [.resolveObjPath(path, obj)](#Util.resolveObjPath) ⇒ <code>any</code>
7713
- * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ <code>string</code>
7792
+ * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ <code>string</code> \| <code>void</code>
7714
7793
  * [.templateSearchResult(results, keyToSearch, searchValue)](#Util.templateSearchResult) ⇒ <code>TYPE.MetadataTypeItem</code>
7715
7794
  * [.setLoggingLevel(argv)](#Util.setLoggingLevel) ⇒ <code>void</code>
7716
7795
  * [.logBeta(type)](#Util.logBeta)
@@ -7784,11 +7863,10 @@ check if a market name exists in current mcdev config
7784
7863
 
7785
7864
  <a name="Util.verifyMarketList"></a>
7786
7865
 
7787
- ### Util.verifyMarketList(mlName, properties) ⇒ <code>void</code>
7866
+ ### Util.verifyMarketList(mlName, properties)
7788
7867
  ensure provided MarketList exists and it's content including markets and BUs checks out
7789
7868
 
7790
7869
  **Kind**: static method of [<code>Util</code>](#Util)
7791
- **Returns**: <code>void</code> - throws errors if problems were found
7792
7870
 
7793
7871
  | Param | Type | Description |
7794
7872
  | --- | --- | --- |
@@ -7857,6 +7935,30 @@ helper for getDefaultProperties()
7857
7935
 
7858
7936
  **Kind**: static method of [<code>Util</code>](#Util)
7859
7937
  **Returns**: <code>Array.&lt;TYPE.SupportedMetadataTypes&gt;</code> - type choices
7938
+ <a name="Util._createNewLoggerTransport"></a>
7939
+
7940
+ ### Util.\_createNewLoggerTransport([noLogFile]) ⇒ <code>object</code>
7941
+ wrapper around our standard winston logging to console and logfile
7942
+
7943
+ **Kind**: static method of [<code>Util</code>](#Util)
7944
+ **Returns**: <code>object</code> - initiated logger for console and file
7945
+
7946
+ | Param | Type | Default | Description |
7947
+ | --- | --- | --- | --- |
7948
+ | [noLogFile] | <code>boolean</code> | <code>false</code> | optional flag to indicate if we should log to file; CLI logs are always on |
7949
+
7950
+ <a name="Util.startLogger"></a>
7951
+
7952
+ ### Util.startLogger([restart], [noLogFile]) ⇒ <code>void</code>
7953
+ initiate winston logger
7954
+
7955
+ **Kind**: static method of [<code>Util</code>](#Util)
7956
+
7957
+ | Param | Type | Default | Description |
7958
+ | --- | --- | --- | --- |
7959
+ | [restart] | <code>boolean</code> | <code>false</code> | if true, logger will be restarted; otherwise, an existing logger will be used |
7960
+ | [noLogFile] | <code>boolean</code> | <code>false</code> | if false, logger will log to file; otherwise, only to console |
7961
+
7860
7962
  <a name="Util.metadataLogger"></a>
7861
7963
 
7862
7964
  ### Util.metadataLogger(level, type, method, payload, [source]) ⇒ <code>void</code>
@@ -7926,11 +8028,11 @@ let's you dynamically walk down an object and get a value
7926
8028
 
7927
8029
  <a name="Util.execSync"></a>
7928
8030
 
7929
- ### Util.execSync(cmd, [args], [hideOutput]) ⇒ <code>string</code>
8031
+ ### Util.execSync(cmd, [args], [hideOutput]) ⇒ <code>string</code> \| <code>void</code>
7930
8032
  helper to run other commands as if run manually by user
7931
8033
 
7932
8034
  **Kind**: static method of [<code>Util</code>](#Util)
7933
- **Returns**: <code>string</code> - output of command if hideOutput is true
8035
+ **Returns**: <code>string</code> \| <code>void</code> - output of command if hideOutput is true
7934
8036
 
7935
8037
  | Param | Type | Description |
7936
8038
  | --- | --- | --- |
@@ -8064,6 +8166,32 @@ helper to convert CSVs into an array. if only one value was given, it's also ret
8064
8166
  | --- | --- | --- |
8065
8167
  | csv | <code>string</code> | potentially comma-separated value or null |
8066
8168
 
8169
+ <a name="Automation."></a>
8170
+
8171
+ ## Automation.(metadataMap, key) ⇒ <code>Promise.&lt;void&gt;</code>
8172
+ helper for [postDeployTasks](#Automation.postDeployTasks)
8173
+
8174
+ **Kind**: global function
8175
+ **Returns**: <code>Promise.&lt;void&gt;</code> - -
8176
+
8177
+ | Param | Type | Description |
8178
+ | --- | --- | --- |
8179
+ | metadataMap | <code>TYPE.AutomationMap</code> | metadata mapped by their keyField |
8180
+ | key | <code>string</code> | current customer key |
8181
+
8182
+ <a name="Automation."></a>
8183
+
8184
+ ## Automation.(metadataMap, originalMetadataMap, key)
8185
+ helper for [postDeployTasks](postDeployTasks)
8186
+
8187
+ **Kind**: global function
8188
+
8189
+ | Param | Type | Description |
8190
+ | --- | --- | --- |
8191
+ | metadataMap | <code>TYPE.AutomationMap</code> | metadata mapped by their keyField |
8192
+ | originalMetadataMap | <code>TYPE.AutomationMap</code> | metadata to be updated (contains additioanl fields) |
8193
+ | key | <code>string</code> | current customer key |
8194
+
8067
8195
  <a name="getUserName"></a>
8068
8196
 
8069
8197
  ## getUserName(userList, item, fieldname) ⇒ <code>string</code>
@@ -8089,19 +8217,6 @@ Returns an SDK instance to be used for API calls
8089
8217
  | sessionKey | <code>string</code> | key for specific BU |
8090
8218
  | authObject | <code>TYPE.AuthObject</code> | credentials for specific BU |
8091
8219
 
8092
- <a name="createNewLoggerTransport"></a>
8093
-
8094
- ## createNewLoggerTransport() ⇒ <code>object</code>
8095
- wrapper around our standard winston logging to console and logfile
8096
-
8097
- **Kind**: global function
8098
- **Returns**: <code>object</code> - initiated logger for console and file
8099
- <a name="startLogger"></a>
8100
-
8101
- ## startLogger() ⇒ <code>void</code>
8102
- initiate winston logger
8103
-
8104
- **Kind**: global function
8105
8220
  <a name="TypeKeyCombo"></a>
8106
8221
 
8107
8222
  ## TypeKeyCombo : <code>Object.&lt;string, string&gt;</code>
package/lib/Deployer.js CHANGED
@@ -103,7 +103,7 @@ class Deployer {
103
103
  buMultiMetadataTypeMap[cred + '/' + bu] = multiMetadataTypeMap;
104
104
  counter_credBu++;
105
105
  Util.logger.info('');
106
- Util.restartLogger();
106
+ Util.startLogger(true);
107
107
  }
108
108
  } else {
109
109
  // anything but "*" passed in
@@ -157,7 +157,7 @@ class Deployer {
157
157
  buMultiMetadataTypeMap[cred + '/' + buPath] = multiMetadataTypeMap;
158
158
  counter_credBu++;
159
159
  Util.logger.info('');
160
- Util.restartLogger();
160
+ Util.startLogger(true);
161
161
  }
162
162
  Util.logger.info(`\n :: ${counter_credBu} BUs for ${cred}\n`);
163
163
  } else {
@@ -387,7 +387,7 @@ class Deployer {
387
387
  const allFolders = Object.keys(metadata[metadataType])
388
388
  .filter(
389
389
  // filter out root folders (which would not have a slash in their path)
390
- (key) => metadata[metadataType][key].r__folder_Path.includes('/')
390
+ (key) => metadata[metadataType][key].r__folder_Path?.includes('/')
391
391
  )
392
392
  .filter(
393
393
  // filter out dataExtension folders other than standard & shared (--> synchronized / salesforce are not allowed)
package/lib/cli.js CHANGED
@@ -389,6 +389,30 @@ yargs
389
389
  Mcdev.refresh(argv.BU, argv.TYPE, csvToArray(argv.KEY));
390
390
  },
391
391
  })
392
+ .command({
393
+ command: 'execute <BU> <TYPE> <KEY>',
394
+ aliases: ['exec'],
395
+ desc: 'executes the entity (query/journey/automation etc.)',
396
+ builder: (yargs) => {
397
+ yargs
398
+ .positional('BU', {
399
+ type: 'string',
400
+ describe: 'the business unit where to start an item',
401
+ })
402
+ .positional('TYPE', {
403
+ type: 'string',
404
+ describe: 'metadata type',
405
+ })
406
+ .positional('KEY', {
407
+ type: 'string',
408
+ describe: 'key(s) of the metadata component(s)',
409
+ });
410
+ },
411
+ handler: (argv) => {
412
+ Mcdev.setOptions(argv);
413
+ Mcdev.execute(argv.BU, csvToArray(argv.TYPE), csvToArray(argv.KEY));
414
+ },
415
+ })
392
416
  .command({
393
417
  command: 'upgrade',
394
418
  aliases: ['up'],
@@ -410,6 +434,10 @@ yargs
410
434
  type: 'boolean',
411
435
  description: 'Only output errors to CLI',
412
436
  })
437
+ .option('noLogFile', {
438
+ type: 'boolean',
439
+ description: 'Only output log to CLI but not to files',
440
+ })
413
441
  .option('skipInteraction', {
414
442
  alias: ['yes', 'y'],
415
443
  description: 'Interactive questions where possible and go with defaults instead',