mcdev 4.1.3 → 4.1.5
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.
- package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
- package/.github/dependabot.yml +1 -1
- package/.github/workflows/code-analysis.yml +2 -2
- package/.github/workflows/npm-publish.yml +4 -4
- package/README.md +6 -6
- package/docs/dist/documentation.md +123 -166
- package/lib/Retriever.js +8 -2
- package/lib/cli.js +1 -1
- package/lib/index.js +5 -16
- package/lib/metadataTypes/Asset.js +17 -9
- package/lib/metadataTypes/Automation.js +23 -12
- package/lib/metadataTypes/ContentArea.js +20 -7
- package/lib/metadataTypes/DataExtension.js +30 -12
- package/lib/metadataTypes/Email.js +1 -14
- package/lib/metadataTypes/EmailSendDefinition.js +2 -13
- package/lib/metadataTypes/MetadataType.js +26 -0
- package/lib/metadataTypes/Query.js +1 -12
- package/lib/metadataTypes/Script.js +1 -11
- package/lib/metadataTypes/TriggeredSendDefinition.js +2 -13
- package/lib/metadataTypes/definitions/Automation.definition.js +1 -0
- package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
- package/lib/metadataTypes/definitions/DataExtension.definition.js +1 -0
- package/lib/metadataTypes/definitions/Email.definition.js +1 -0
- package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +1 -0
- package/lib/metadataTypes/definitions/Query.definition.js +1 -0
- package/lib/metadataTypes/definitions/Script.definition.js +1 -0
- package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +1 -0
- package/lib/util/cli.js +10 -11
- package/lib/util/devops.js +2 -2
- package/lib/util/init.git.js +12 -13
- package/lib/util/init.js +13 -21
- package/package.json +3 -3
- package/test/mockRoot/.mcdevrc.json +1 -1
package/lib/Retriever.js
CHANGED
|
@@ -74,8 +74,8 @@ class Retriever {
|
|
|
74
74
|
try {
|
|
75
75
|
let result;
|
|
76
76
|
if (!metadataTypes.includes(type) && !metadataTypes.includes(metadataType)) {
|
|
77
|
-
if (changelogOnly) {
|
|
78
|
-
// no extra caching needed for list view
|
|
77
|
+
if (changelogOnly && type !== 'folder') {
|
|
78
|
+
// no extra caching needed for list view except for folders
|
|
79
79
|
continue;
|
|
80
80
|
}
|
|
81
81
|
Util.logger.info(`Caching dependent Metadata: ${metadataType}`);
|
|
@@ -115,6 +115,12 @@ class Retriever {
|
|
|
115
115
|
)
|
|
116
116
|
)
|
|
117
117
|
));
|
|
118
|
+
if (changelogOnly) {
|
|
119
|
+
// add folder to changelog
|
|
120
|
+
for (const key of Object.keys(result.metadata)) {
|
|
121
|
+
MetadataTypeInfo[type].setFolderPath(result.metadata[key]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
118
124
|
}
|
|
119
125
|
if (result) {
|
|
120
126
|
if (Array.isArray(result)) {
|
package/lib/cli.js
CHANGED
package/lib/index.js
CHANGED
|
@@ -50,12 +50,10 @@ class Mcdev {
|
|
|
50
50
|
into deploy directory
|
|
51
51
|
* @param {string} [argv.filter] filter file paths that start with any
|
|
52
52
|
* @param {TYPE.DeltaPkgItem[]} [argv.diffArr] list of files to include in delta package (skips git diff when provided)
|
|
53
|
-
* @param {TYPE.skipInteraction} [argv.skipInteraction] allows to skip interactive wizard
|
|
54
53
|
* @returns {Promise.<TYPE.DeltaPkgItem[]>} list of changed items
|
|
55
54
|
*/
|
|
56
55
|
static async createDeltaPkg(argv) {
|
|
57
56
|
Util.logger.info('Create Delta Package ::');
|
|
58
|
-
Mcdev.setSkipInteraction(argv.skipInteraction);
|
|
59
57
|
const properties = await config.getProperties();
|
|
60
58
|
if (!(await config.checkProperties(properties))) {
|
|
61
59
|
return null;
|
|
@@ -65,12 +63,7 @@ class Mcdev {
|
|
|
65
63
|
? // get source market and source BU from config
|
|
66
64
|
DevOps.getDeltaList(properties, argv.range, true, argv.filter)
|
|
67
65
|
: // If no custom filter was provided, use deployment marketLists & templating
|
|
68
|
-
DevOps.buildDeltaDefinitions(
|
|
69
|
-
properties,
|
|
70
|
-
argv.range,
|
|
71
|
-
argv.diffArr,
|
|
72
|
-
argv.skipInteraction
|
|
73
|
-
);
|
|
66
|
+
DevOps.buildDeltaDefinitions(properties, argv.range, argv.diffArr);
|
|
74
67
|
}
|
|
75
68
|
|
|
76
69
|
/**
|
|
@@ -90,17 +83,15 @@ class Mcdev {
|
|
|
90
83
|
Cli.explainTypes();
|
|
91
84
|
}
|
|
92
85
|
/**
|
|
93
|
-
* @param {boolean | TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
94
86
|
* @returns {Promise.<boolean>} success flag
|
|
95
87
|
*/
|
|
96
|
-
static async upgrade(
|
|
97
|
-
Mcdev.setSkipInteraction(skipInteraction);
|
|
88
|
+
static async upgrade() {
|
|
98
89
|
const properties = await config.getProperties();
|
|
99
90
|
if (!properties) {
|
|
100
91
|
Util.logger.error('No config found. Please run mcdev init');
|
|
101
92
|
return false;
|
|
102
93
|
}
|
|
103
|
-
if ((await InitGit.initGitRepo(
|
|
94
|
+
if ((await InitGit.initGitRepo()).status === 'error') {
|
|
104
95
|
return false;
|
|
105
96
|
}
|
|
106
97
|
|
|
@@ -295,14 +286,12 @@ class Mcdev {
|
|
|
295
286
|
* Creates template file for properties.json
|
|
296
287
|
*
|
|
297
288
|
* @param {string} [credentialsName] identifying name of the installed package / project
|
|
298
|
-
* @param {boolean | TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
299
289
|
* @returns {Promise.<void>} -
|
|
300
290
|
*/
|
|
301
|
-
static async initProject(credentialsName
|
|
291
|
+
static async initProject(credentialsName) {
|
|
302
292
|
Util.logger.info('mcdev:: Setting up project');
|
|
303
|
-
Mcdev.setSkipInteraction(skipInteraction);
|
|
304
293
|
const properties = await config.getProperties(!!credentialsName);
|
|
305
|
-
await Init.initProject(properties, credentialsName
|
|
294
|
+
await Init.initProject(properties, credentialsName);
|
|
306
295
|
}
|
|
307
296
|
|
|
308
297
|
/**
|
|
@@ -755,15 +755,12 @@ class Asset extends MetadataType {
|
|
|
755
755
|
}
|
|
756
756
|
}
|
|
757
757
|
}
|
|
758
|
-
|
|
759
758
|
/**
|
|
760
|
-
*
|
|
759
|
+
* generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
|
|
761
760
|
*
|
|
762
|
-
* @param {TYPE.
|
|
763
|
-
* @returns {TYPE.CodeExtractItem} parsed metadata definition
|
|
761
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
764
762
|
*/
|
|
765
|
-
static
|
|
766
|
-
// folder
|
|
763
|
+
static setFolderPath(metadata) {
|
|
767
764
|
try {
|
|
768
765
|
metadata.r__folder_Path = cache.searchForField(
|
|
769
766
|
'folder',
|
|
@@ -773,12 +770,23 @@ class Asset extends MetadataType {
|
|
|
773
770
|
);
|
|
774
771
|
delete metadata.category;
|
|
775
772
|
} catch (ex) {
|
|
776
|
-
// ! if we don't catch this error here we end up saving the actual asset but not its corresponding JSON
|
|
777
|
-
Util.logger.debug(ex.message);
|
|
778
773
|
Util.logger.warn(
|
|
779
|
-
` -
|
|
774
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
775
|
+
metadata[this.definition.keyField]
|
|
776
|
+
}): Could not find folder (${ex.message})`
|
|
780
777
|
);
|
|
781
778
|
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* parses retrieved Metadata before saving
|
|
783
|
+
*
|
|
784
|
+
* @param {TYPE.AssetItem} metadata a single asset definition
|
|
785
|
+
* @returns {TYPE.CodeExtractItem} parsed metadata definition
|
|
786
|
+
*/
|
|
787
|
+
static parseMetadata(metadata) {
|
|
788
|
+
// folder
|
|
789
|
+
this.setFolderPath(metadata);
|
|
782
790
|
// extract HTML for selected subtypes and convert payload for easier processing in MetadataType.saveResults()
|
|
783
791
|
metadata = this._extractCode(metadata);
|
|
784
792
|
return metadata;
|
|
@@ -73,6 +73,7 @@ class Automation extends MetadataType {
|
|
|
73
73
|
'ProgramID',
|
|
74
74
|
'Name',
|
|
75
75
|
'CustomerKey',
|
|
76
|
+
'CategoryID',
|
|
76
77
|
'LastSaveDate',
|
|
77
78
|
'LastSavedBy',
|
|
78
79
|
'CreatedBy',
|
|
@@ -457,23 +458,23 @@ class Automation extends MetadataType {
|
|
|
457
458
|
}
|
|
458
459
|
}
|
|
459
460
|
}
|
|
460
|
-
|
|
461
461
|
/**
|
|
462
|
-
*
|
|
462
|
+
* generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
|
|
463
463
|
*
|
|
464
|
-
* @param {TYPE.
|
|
465
|
-
* @returns {TYPE.AutomationItem} parsed item
|
|
464
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
466
465
|
*/
|
|
467
|
-
static
|
|
468
|
-
|
|
466
|
+
static setFolderPath(metadata) {
|
|
467
|
+
const folderIdField = metadata[this.definition.folderIdField]
|
|
468
|
+
? this.definition.folderIdField
|
|
469
|
+
: 'CategoryID';
|
|
469
470
|
try {
|
|
470
471
|
metadata.r__folder_Path = cache.searchForField(
|
|
471
472
|
'folder',
|
|
472
|
-
metadata
|
|
473
|
+
metadata[folderIdField],
|
|
473
474
|
'ID',
|
|
474
475
|
'Path'
|
|
475
476
|
);
|
|
476
|
-
delete metadata
|
|
477
|
+
delete metadata[folderIdField];
|
|
477
478
|
if (metadata.r__folder_Path !== 'my automations') {
|
|
478
479
|
Util.logger.verbose(
|
|
479
480
|
`- automation '${
|
|
@@ -484,13 +485,23 @@ class Automation extends MetadataType {
|
|
|
484
485
|
);
|
|
485
486
|
}
|
|
486
487
|
} catch (ex) {
|
|
487
|
-
// * don't exit on missing folder for automation
|
|
488
488
|
Util.logger.warn(
|
|
489
|
-
` - ${this.definition.
|
|
490
|
-
|
|
491
|
-
}`
|
|
489
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
490
|
+
metadata[this.definition.keyField]
|
|
491
|
+
}): Could not find folder (${ex.message})`
|
|
492
492
|
);
|
|
493
493
|
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* parses retrieved Metadata before saving
|
|
498
|
+
*
|
|
499
|
+
* @param {TYPE.AutomationItem} metadata a single automation definition
|
|
500
|
+
* @returns {TYPE.AutomationItem} parsed item
|
|
501
|
+
*/
|
|
502
|
+
static parseMetadata(metadata) {
|
|
503
|
+
this.setFolderPath(metadata);
|
|
504
|
+
// automations are often skipped due to lack of support.
|
|
494
505
|
try {
|
|
495
506
|
if (metadata.type === 'scheduled' && metadata.schedule?.startDate) {
|
|
496
507
|
// Starting Source == 'Schedule'
|
|
@@ -49,27 +49,40 @@ class ContentArea extends MetadataType {
|
|
|
49
49
|
return this.parseMetadata(metadata);
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
|
|
53
53
|
*
|
|
54
|
-
* @param {TYPE.MetadataTypeItem} metadata a single
|
|
55
|
-
* @returns {TYPE.MetadataTypeItem} parsed item
|
|
54
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
56
55
|
*/
|
|
57
|
-
static
|
|
58
|
-
// folder
|
|
56
|
+
static setFolderPath(metadata) {
|
|
59
57
|
try {
|
|
60
58
|
metadata.r__folder_Path = cache.searchForField(
|
|
61
59
|
'folder',
|
|
62
|
-
metadata.
|
|
60
|
+
metadata[this.definition.folderIdField],
|
|
63
61
|
'ID',
|
|
64
62
|
'Path'
|
|
65
63
|
);
|
|
64
|
+
delete metadata[this.definition.folderIdField];
|
|
66
65
|
} catch (ex) {
|
|
67
|
-
Util.logger.debug(
|
|
66
|
+
Util.logger.debug(
|
|
67
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
68
|
+
metadata[this.definition.keyField]
|
|
69
|
+
}): Could not find folder (${ex.message})`
|
|
70
|
+
);
|
|
68
71
|
// classic content blocks that reside in the main folder are
|
|
69
72
|
// saved with CategoryID=0, instead of to the actual ID of
|
|
70
73
|
// their parent root folder.
|
|
71
74
|
metadata.r__folder_Path = 'my contents';
|
|
72
75
|
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* parses retrieved Metadata before saving
|
|
79
|
+
*
|
|
80
|
+
* @param {TYPE.MetadataTypeItem} metadata a single item
|
|
81
|
+
* @returns {TYPE.MetadataTypeItem} parsed item
|
|
82
|
+
*/
|
|
83
|
+
static parseMetadata(metadata) {
|
|
84
|
+
// folder
|
|
85
|
+
this.setFolderPath(metadata);
|
|
73
86
|
|
|
74
87
|
// extract code
|
|
75
88
|
const codeArr = [
|
|
@@ -914,22 +914,20 @@ class DataExtension extends MetadataType {
|
|
|
914
914
|
|
|
915
915
|
return { metadata: metadata[customerKey], type: 'dataExtension' };
|
|
916
916
|
}
|
|
917
|
-
|
|
918
917
|
/**
|
|
919
|
-
*
|
|
918
|
+
* dataExtension logic that retrieves the folder path from cache and updates the given metadata with it after retrieve
|
|
919
|
+
* it also sets the content type which is basically the subtype
|
|
920
920
|
*
|
|
921
|
-
* @
|
|
922
|
-
* @param {TYPE.DataExtensionItem} metadata a single dataExtension definition
|
|
923
|
-
* @returns {TYPE.DataExtensionItem} a single dataExtension definition
|
|
921
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
924
922
|
*/
|
|
925
|
-
static
|
|
923
|
+
static setFolderPath(metadata) {
|
|
926
924
|
let error = false;
|
|
927
925
|
let verbose = false;
|
|
928
926
|
// data extension type (from folder)
|
|
929
927
|
try {
|
|
930
928
|
metadata.r__folder_ContentType = cache.searchForField(
|
|
931
929
|
'folder',
|
|
932
|
-
metadata.
|
|
930
|
+
metadata[this.definition.folderIdField],
|
|
933
931
|
'ID',
|
|
934
932
|
'ContentType'
|
|
935
933
|
);
|
|
@@ -939,22 +937,26 @@ class DataExtension extends MetadataType {
|
|
|
939
937
|
metadata.r__folder_ContentType = 'synchronizeddataextension';
|
|
940
938
|
} else {
|
|
941
939
|
error = true;
|
|
942
|
-
Util.logger.warn(
|
|
940
|
+
Util.logger.warn(
|
|
941
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
942
|
+
metadata[this.definition.keyField]
|
|
943
|
+
}): Could not find folder (${ex.message})`
|
|
944
|
+
);
|
|
943
945
|
}
|
|
944
946
|
}
|
|
945
947
|
// folder
|
|
946
948
|
try {
|
|
947
949
|
metadata.r__folder_Path = cache.searchForField(
|
|
948
950
|
'folder',
|
|
949
|
-
metadata.
|
|
951
|
+
metadata[this.definition.folderIdField],
|
|
950
952
|
'ID',
|
|
951
953
|
'Path'
|
|
952
954
|
);
|
|
953
|
-
delete metadata.
|
|
955
|
+
delete metadata[this.definition.folderIdField];
|
|
954
956
|
} catch (ex) {
|
|
955
957
|
if (/(_Salesforce)(_\d\d?\d?)?$/.test(metadata.Name)) {
|
|
956
958
|
metadata.r__folder_Path = 'Synchronized Data Extensions';
|
|
957
|
-
delete metadata.
|
|
959
|
+
delete metadata[this.definition.folderIdField];
|
|
958
960
|
|
|
959
961
|
if (!verbose) {
|
|
960
962
|
Util.logger.verbose(
|
|
@@ -962,9 +964,25 @@ class DataExtension extends MetadataType {
|
|
|
962
964
|
);
|
|
963
965
|
}
|
|
964
966
|
} else if (!error) {
|
|
965
|
-
Util.logger.error(
|
|
967
|
+
Util.logger.error(
|
|
968
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
969
|
+
metadata[this.definition.keyField]
|
|
970
|
+
}): ${ex.message}`
|
|
971
|
+
);
|
|
966
972
|
}
|
|
967
973
|
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* parses retrieved Metadata before saving
|
|
978
|
+
*
|
|
979
|
+
* @private
|
|
980
|
+
* @param {TYPE.DataExtensionItem} metadata a single dataExtension definition
|
|
981
|
+
* @returns {TYPE.DataExtensionItem} a single dataExtension definition
|
|
982
|
+
*/
|
|
983
|
+
static _parseMetadata(metadata) {
|
|
984
|
+
this.setFolderPath(metadata);
|
|
985
|
+
|
|
968
986
|
// DataExtensionTemplate
|
|
969
987
|
if (metadata.Template?.CustomerKey) {
|
|
970
988
|
try {
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
const TYPE = require('../../types/mcdev.d');
|
|
4
4
|
const MetadataType = require('./MetadataType');
|
|
5
5
|
const Util = require('../util/util');
|
|
6
|
-
const cache = require('../util/cache');
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Email MetadataType
|
|
@@ -56,19 +55,7 @@ class Email extends MetadataType {
|
|
|
56
55
|
*/
|
|
57
56
|
static parseMetadata(metadata) {
|
|
58
57
|
// folder
|
|
59
|
-
|
|
60
|
-
metadata.r__folder_Path = cache.searchForField(
|
|
61
|
-
'folder',
|
|
62
|
-
metadata.CategoryID,
|
|
63
|
-
'ID',
|
|
64
|
-
'Path'
|
|
65
|
-
);
|
|
66
|
-
delete metadata.CategoryID;
|
|
67
|
-
} catch (ex) {
|
|
68
|
-
Util.logger.warn(
|
|
69
|
-
` - Classic E-Mail '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
70
|
-
);
|
|
71
|
-
}
|
|
58
|
+
super.setFolderPath(metadata);
|
|
72
59
|
|
|
73
60
|
// extract code
|
|
74
61
|
const codeArr = [
|
|
@@ -182,19 +182,8 @@ class EmailSendDefinition extends MetadataType {
|
|
|
182
182
|
// remove IsPlatformObject, always has to be 'false'
|
|
183
183
|
delete metadata.IsPlatformObject;
|
|
184
184
|
// folder
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
'folder',
|
|
188
|
-
metadata.CategoryID,
|
|
189
|
-
'ID',
|
|
190
|
-
'Path'
|
|
191
|
-
);
|
|
192
|
-
delete metadata.CategoryID;
|
|
193
|
-
} catch (ex) {
|
|
194
|
-
Util.logger.warn(
|
|
195
|
-
` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
196
|
-
);
|
|
197
|
-
}
|
|
185
|
+
super.setFolderPath(metadata);
|
|
186
|
+
|
|
198
187
|
// email
|
|
199
188
|
try {
|
|
200
189
|
// classic
|
|
@@ -141,6 +141,32 @@ class MetadataType {
|
|
|
141
141
|
static postRetrieveTasks(metadata, targetDir, isTemplating) {
|
|
142
142
|
return JSON.parse(JSON.stringify(metadata));
|
|
143
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* generic script that retrieves the folder path from cache and updates the given metadata with it after retrieve
|
|
146
|
+
*
|
|
147
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
148
|
+
*/
|
|
149
|
+
static setFolderPath(metadata) {
|
|
150
|
+
if (!this.definition.folderIdField) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
metadata.r__folder_Path = cache.searchForField(
|
|
155
|
+
'folder',
|
|
156
|
+
metadata[this.definition.folderIdField],
|
|
157
|
+
'ID',
|
|
158
|
+
'Path'
|
|
159
|
+
);
|
|
160
|
+
delete metadata[this.definition.folderIdField];
|
|
161
|
+
} catch (ex) {
|
|
162
|
+
Util.logger.warn(
|
|
163
|
+
` - ${this.definition.type} '${metadata[this.definition.nameField]}' (${
|
|
164
|
+
metadata[this.definition.keyField]
|
|
165
|
+
}): Could not find folder (${ex.message})`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
144
170
|
/**
|
|
145
171
|
* Gets metadata from Marketing Cloud
|
|
146
172
|
*
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
const TYPE = require('../../types/mcdev.d');
|
|
4
4
|
const MetadataType = require('./MetadataType');
|
|
5
|
-
const Util = require('../util/util');
|
|
6
5
|
const File = require('../util/file');
|
|
7
6
|
const cache = require('../util/cache');
|
|
8
7
|
const Mustache = require('mustache');
|
|
@@ -287,17 +286,7 @@ class Query extends MetadataType {
|
|
|
287
286
|
*/
|
|
288
287
|
static parseMetadata(metadata) {
|
|
289
288
|
// folder
|
|
290
|
-
|
|
291
|
-
metadata.r__folder_Path = cache.searchForField(
|
|
292
|
-
'folder',
|
|
293
|
-
metadata.categoryId,
|
|
294
|
-
'ID',
|
|
295
|
-
'Path'
|
|
296
|
-
);
|
|
297
|
-
delete metadata.categoryId;
|
|
298
|
-
} catch (ex) {
|
|
299
|
-
Util.logger.warn(` - Query '${metadata.key}': ${ex.message}`);
|
|
300
|
-
}
|
|
289
|
+
super.setFolderPath(metadata);
|
|
301
290
|
|
|
302
291
|
// extract SQL
|
|
303
292
|
const codeArr = [
|
|
@@ -261,17 +261,7 @@ class Script extends MetadataType {
|
|
|
261
261
|
*/
|
|
262
262
|
static parseMetadata(metadata) {
|
|
263
263
|
// folder
|
|
264
|
-
|
|
265
|
-
metadata.r__folder_Path = cache.searchForField(
|
|
266
|
-
'folder',
|
|
267
|
-
metadata.categoryId,
|
|
268
|
-
'ID',
|
|
269
|
-
'Path'
|
|
270
|
-
);
|
|
271
|
-
delete metadata.categoryId;
|
|
272
|
-
} catch (ex) {
|
|
273
|
-
Util.logger.warn(` - Script '${metadata.key}': ${ex.message}`);
|
|
274
|
-
}
|
|
264
|
+
super.setFolderPath(metadata);
|
|
275
265
|
|
|
276
266
|
// extract SSJS
|
|
277
267
|
const codeArr = [];
|
|
@@ -137,19 +137,8 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
137
137
|
// remove IsPlatformObject, always has to be 'false'
|
|
138
138
|
delete metadata.IsPlatformObject;
|
|
139
139
|
// folder
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
'folder',
|
|
143
|
-
metadata.CategoryID,
|
|
144
|
-
'ID',
|
|
145
|
-
'Path'
|
|
146
|
-
);
|
|
147
|
-
delete metadata.CategoryID;
|
|
148
|
-
} catch (ex) {
|
|
149
|
-
Util.logger.warn(
|
|
150
|
-
` - Triggered Send '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
151
|
-
);
|
|
152
|
-
}
|
|
140
|
+
super.setFolderPath(metadata);
|
|
141
|
+
|
|
153
142
|
// email
|
|
154
143
|
try {
|
|
155
144
|
// classic
|
package/lib/util/cli.js
CHANGED
|
@@ -18,26 +18,25 @@ const Cli = {
|
|
|
18
18
|
* used when initially setting up a project.
|
|
19
19
|
* loads default config and adds first credential
|
|
20
20
|
*
|
|
21
|
-
* @param {TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
22
21
|
* @returns {Promise.<boolean>} success of init
|
|
23
22
|
*/
|
|
24
|
-
async initMcdevConfig(
|
|
23
|
+
async initMcdevConfig() {
|
|
25
24
|
Util.logger.info('-- Initialising server connection --');
|
|
26
25
|
Util.logger.info('Please enter a name for your "Installed Package" credentials:');
|
|
27
26
|
const propertiesTemplate = await config.getDefaultProperties();
|
|
28
27
|
delete propertiesTemplate.credentials.default;
|
|
29
28
|
|
|
30
29
|
// wait for the interaction to finish or else an outer await will run before this is done
|
|
31
|
-
return this._setCredential(propertiesTemplate, null
|
|
30
|
+
return this._setCredential(propertiesTemplate, null);
|
|
32
31
|
},
|
|
33
32
|
/**
|
|
34
33
|
* Extends template file for properties.json
|
|
35
34
|
*
|
|
36
35
|
* @param {TYPE.Mcdevrc} properties config file's json
|
|
37
|
-
* @param {TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
38
36
|
* @returns {Promise.<void>} -
|
|
39
37
|
*/
|
|
40
|
-
async addExtraCredential(properties
|
|
38
|
+
async addExtraCredential(properties) {
|
|
39
|
+
const skipInteraction = Util.skipInteraction;
|
|
41
40
|
if (!(await config.checkProperties(properties))) {
|
|
42
41
|
// return null here to avoid seeing 2 error messages for the same issue
|
|
43
42
|
return null;
|
|
@@ -54,7 +53,7 @@ const Cli = {
|
|
|
54
53
|
`Credential '${skipInteraction.credentialName}' already existing. If you tried updating please provide run 'mcdev init ${skipInteraction.credentialName}'`
|
|
55
54
|
);
|
|
56
55
|
}
|
|
57
|
-
return this._setCredential(properties, null
|
|
56
|
+
return this._setCredential(properties, null);
|
|
58
57
|
}
|
|
59
58
|
},
|
|
60
59
|
/**
|
|
@@ -63,15 +62,15 @@ const Cli = {
|
|
|
63
62
|
*
|
|
64
63
|
* @param {TYPE.Mcdevrc} properties config file's json
|
|
65
64
|
* @param {string} credName name of credential that needs updating
|
|
66
|
-
* @param {TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
67
65
|
* @returns {Promise.<boolean>} success of update
|
|
68
66
|
*/
|
|
69
|
-
async updateCredential(properties, credName
|
|
67
|
+
async updateCredential(properties, credName) {
|
|
68
|
+
const skipInteraction = Util.skipInteraction;
|
|
70
69
|
if (credName) {
|
|
71
70
|
if (!skipInteraction) {
|
|
72
71
|
Util.logger.info(`Please enter the details for '${credName}'`);
|
|
73
72
|
}
|
|
74
|
-
return await this._setCredential(properties, credName
|
|
73
|
+
return await this._setCredential(properties, credName);
|
|
75
74
|
}
|
|
76
75
|
},
|
|
77
76
|
/**
|
|
@@ -226,10 +225,10 @@ const Cli = {
|
|
|
226
225
|
*
|
|
227
226
|
* @param {TYPE.Mcdevrc} properties from config file
|
|
228
227
|
* @param {string} [credName] name of credential that needs updating
|
|
229
|
-
* @param {TYPE.skipInteraction} [skipInteraction] signals what to insert automatically for things usually asked via wizard
|
|
230
228
|
* @returns {Promise.<boolean | string>} success of refresh or credential name
|
|
231
229
|
*/
|
|
232
|
-
async _setCredential(properties, credName
|
|
230
|
+
async _setCredential(properties, credName) {
|
|
231
|
+
const skipInteraction = Util.skipInteraction;
|
|
233
232
|
// Get user input
|
|
234
233
|
let credentialsGood = null;
|
|
235
234
|
let inputData;
|
package/lib/util/devops.js
CHANGED
|
@@ -249,10 +249,10 @@ const DevOps = {
|
|
|
249
249
|
* @param {TYPE.Mcdevrc} properties project config file
|
|
250
250
|
* @param {string} range git commit range
|
|
251
251
|
* @param {TYPE.DeltaPkgItem[]} [diffArr] instead of running git diff the method can also get a list of files to process
|
|
252
|
-
* @param {TYPE.SkipInteraction} [skipInteraction] allows to skip interactive wizard
|
|
253
252
|
* @returns {Promise.<TYPE.DeltaPkgItem[]>} -
|
|
254
253
|
*/
|
|
255
|
-
async buildDeltaDefinitions(properties, range, diffArr
|
|
254
|
+
async buildDeltaDefinitions(properties, range, diffArr) {
|
|
255
|
+
const skipInteraction = Util.skipInteraction;
|
|
256
256
|
// check if sourceTargetMapping is valid
|
|
257
257
|
if (
|
|
258
258
|
!properties.options.deployment.sourceTargetMapping ||
|