mcdev 3.1.3 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +67 -7
- package/.github/ISSUE_TEMPLATE/bug.yml +2 -1
- package/.github/PULL_REQUEST_TEMPLATE.md +5 -3
- package/.github/dependabot.yml +14 -0
- package/.github/workflows/code-analysis.yml +57 -0
- package/.husky/commit-msg +10 -0
- package/.husky/post-checkout +5 -0
- package/.husky/pre-commit +2 -1
- package/.prettierrc +8 -0
- package/.vscode/settings.json +1 -1
- package/LICENSE +2 -2
- package/README.md +134 -45
- package/boilerplate/config.json +5 -11
- package/boilerplate/files/.prettierrc +8 -0
- package/boilerplate/files/.vscode/extensions.json +0 -1
- package/boilerplate/files/.vscode/settings.json +30 -2
- package/boilerplate/files/README.md +2 -2
- package/boilerplate/forcedUpdates.json +10 -0
- package/boilerplate/npm-dependencies.json +5 -5
- package/docs/dist/documentation.md +2807 -1730
- package/jsconfig.json +1 -1
- package/lib/Builder.js +171 -74
- package/lib/Deployer.js +244 -96
- package/lib/MetadataTypeDefinitions.js +2 -0
- package/lib/MetadataTypeInfo.js +2 -0
- package/lib/Retriever.js +61 -84
- package/lib/cli.js +116 -11
- package/lib/index.js +241 -561
- package/lib/metadataTypes/AccountUser.js +117 -103
- package/lib/metadataTypes/Asset.js +705 -255
- package/lib/metadataTypes/AttributeGroup.js +23 -12
- package/lib/metadataTypes/Automation.js +489 -392
- package/lib/metadataTypes/Campaign.js +33 -93
- package/lib/metadataTypes/ContentArea.js +31 -11
- package/lib/metadataTypes/DataExtension.js +387 -372
- package/lib/metadataTypes/DataExtensionField.js +131 -54
- package/lib/metadataTypes/DataExtensionTemplate.js +22 -4
- package/lib/metadataTypes/DataExtract.js +61 -48
- package/lib/metadataTypes/DataExtractType.js +14 -8
- package/lib/metadataTypes/Discovery.js +21 -16
- package/lib/metadataTypes/Email.js +32 -12
- package/lib/metadataTypes/EmailSendDefinition.js +85 -80
- package/lib/metadataTypes/EventDefinition.js +61 -43
- package/lib/metadataTypes/FileTransfer.js +72 -52
- package/lib/metadataTypes/Filter.js +11 -4
- package/lib/metadataTypes/Folder.js +149 -117
- package/lib/metadataTypes/FtpLocation.js +14 -8
- package/lib/metadataTypes/ImportFile.js +61 -64
- package/lib/metadataTypes/Interaction.js +19 -4
- package/lib/metadataTypes/List.js +54 -13
- package/lib/metadataTypes/MetadataType.js +664 -454
- package/lib/metadataTypes/MobileCode.js +46 -0
- package/lib/metadataTypes/MobileKeyword.js +114 -0
- package/lib/metadataTypes/Query.js +206 -105
- package/lib/metadataTypes/Role.js +76 -61
- package/lib/metadataTypes/Script.js +147 -83
- package/lib/metadataTypes/SetDefinition.js +20 -8
- package/lib/metadataTypes/TriggeredSendDefinition.js +78 -58
- package/lib/metadataTypes/definitions/Asset.definition.js +21 -10
- package/lib/metadataTypes/definitions/AttributeGroup.definition.js +12 -0
- package/lib/metadataTypes/definitions/Automation.definition.js +10 -5
- package/lib/metadataTypes/definitions/Campaign.definition.js +44 -1
- package/lib/metadataTypes/definitions/DataExtension.definition.js +4 -0
- package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +6 -0
- package/lib/metadataTypes/definitions/DataExtract.definition.js +18 -14
- package/lib/metadataTypes/definitions/Discovery.definition.js +12 -0
- package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +4 -0
- package/lib/metadataTypes/definitions/EventDefinition.definition.js +22 -0
- package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
- package/lib/metadataTypes/definitions/Filter.definition.js +4 -0
- package/lib/metadataTypes/definitions/Folder.definition.js +6 -0
- package/lib/metadataTypes/definitions/FtpLocation.definition.js +4 -0
- package/lib/metadataTypes/definitions/ImportFile.definition.js +10 -5
- package/lib/metadataTypes/definitions/Interaction.definition.js +4 -0
- package/lib/metadataTypes/definitions/MobileCode.definition.js +163 -0
- package/lib/metadataTypes/definitions/MobileKeyword.definition.js +253 -0
- package/lib/metadataTypes/definitions/Query.definition.js +4 -0
- package/lib/metadataTypes/definitions/Role.definition.js +5 -0
- package/lib/metadataTypes/definitions/Script.definition.js +4 -0
- package/lib/metadataTypes/definitions/SetDefinition.definition.js +28 -0
- package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +4 -0
- package/lib/retrieveChangelog.js +7 -6
- package/lib/util/auth.js +117 -0
- package/lib/util/businessUnit.js +55 -66
- package/lib/util/cache.js +194 -0
- package/lib/util/cli.js +90 -116
- package/lib/util/config.js +302 -0
- package/lib/util/devops.js +250 -50
- package/lib/util/file.js +141 -201
- package/lib/util/init.config.js +208 -75
- package/lib/util/init.git.js +45 -50
- package/lib/util/init.js +72 -59
- package/lib/util/init.npm.js +48 -39
- package/lib/util/util.js +280 -564
- package/package.json +45 -34
- package/test/dataExtension.test.js +152 -0
- package/test/mockRoot/.mcdev-auth.json +8 -0
- package/test/mockRoot/.mcdevrc.json +67 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json +39 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testDataExtension.dataExtension-meta.json +23 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql +4 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql +4 -0
- package/test/query.test.js +149 -0
- package/test/resourceFactory.js +142 -0
- package/test/resources/1111111/dataFolder/retrieve-response.xml +43 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +18 -0
- package/test/resources/9999999/automation/v1/queries/get-response.json +24 -0
- package/test/resources/9999999/automation/v1/queries/post-response.json +18 -0
- package/test/resources/9999999/dataExtension/build-expected.json +51 -0
- package/test/resources/9999999/dataExtension/create-expected.json +23 -0
- package/test/resources/9999999/dataExtension/create-response.xml +54 -0
- package/test/resources/9999999/dataExtension/retrieve-expected.json +51 -0
- package/test/resources/9999999/dataExtension/retrieve-response.xml +47 -0
- package/test/resources/9999999/dataExtension/template-expected.json +51 -0
- package/test/resources/9999999/dataExtension/update-expected.json +55 -0
- package/test/resources/9999999/dataExtension/update-response.xml +52 -0
- package/test/resources/9999999/dataExtensionField/retrieve-response.xml +93 -0
- package/test/resources/9999999/dataExtensionTemplate/retrieve-response.xml +303 -0
- package/test/resources/9999999/dataFolder/retrieve-response.xml +65 -0
- package/test/resources/9999999/query/build-expected.json +8 -0
- package/test/resources/9999999/query/get-expected.json +11 -0
- package/test/resources/9999999/query/patch-expected.json +11 -0
- package/test/resources/9999999/query/post-expected.json +11 -0
- package/test/resources/9999999/query/template-expected.json +8 -0
- package/test/resources/auth.json +32 -0
- package/test/resources/rest404-response.json +5 -0
- package/test/resources/retrieve-response.xml +21 -0
- package/test/utils.js +107 -0
- package/types/mcdev.d.js +301 -0
- package/CHANGELOG.md +0 -126
- package/PULL_REQUEST_TEMPLATE.md +0 -19
- package/test/util/file.js +0 -51
|
@@ -1,90 +1,97 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
const Util = require('../util/util');
|
|
5
6
|
const File = require('../util/file');
|
|
7
|
+
const cache = require('../util/cache');
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* FileTransfer MetadataType
|
|
11
|
+
*
|
|
9
12
|
* @augments MetadataType
|
|
10
13
|
*/
|
|
11
14
|
class FileTransfer extends MetadataType {
|
|
12
15
|
/**
|
|
13
16
|
* Retrieves Metadata of FileTransfer Activity.
|
|
14
17
|
* Endpoint /automation/v1/filetransfers/ returns all File Transfers
|
|
15
|
-
*
|
|
16
|
-
* @
|
|
18
|
+
*
|
|
19
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
20
|
+
* @param {void} [_] unused parameter
|
|
21
|
+
* @param {void} [__] unused parameter
|
|
22
|
+
* @param {void} [___] unused parameter
|
|
23
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
24
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
17
25
|
*/
|
|
18
|
-
static async retrieve(retrieveDir) {
|
|
19
|
-
return super.retrieveREST(retrieveDir, '/automation/v1/filetransfers/', null);
|
|
26
|
+
static async retrieve(retrieveDir, _, __, ___, key) {
|
|
27
|
+
return super.retrieveREST(retrieveDir, '/automation/v1/filetransfers/', null, null, key);
|
|
20
28
|
}
|
|
21
29
|
/**
|
|
22
30
|
* Retrieves Metadata of FileTransfer Activity for caching
|
|
23
|
-
*
|
|
31
|
+
*
|
|
32
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
24
33
|
*/
|
|
25
34
|
static async retrieveForCache() {
|
|
26
|
-
return super.retrieveREST(null, '/automation/v1/filetransfers/'
|
|
35
|
+
return super.retrieveREST(null, '/automation/v1/filetransfers/');
|
|
27
36
|
}
|
|
28
37
|
|
|
29
38
|
/**
|
|
30
39
|
* Retrieve a specific File Transfer Definition by Name
|
|
31
|
-
*
|
|
32
|
-
* @param {
|
|
33
|
-
* @param {
|
|
34
|
-
* @
|
|
40
|
+
*
|
|
41
|
+
* @param {string} templateDir Directory where retrieved metadata directory will be saved
|
|
42
|
+
* @param {string} name name of the metadata file
|
|
43
|
+
* @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
|
|
44
|
+
* @returns {Promise.<TYPE.MetadataTypeItemObj>} Promise
|
|
35
45
|
*/
|
|
36
46
|
static async retrieveAsTemplate(templateDir, name, templateVariables) {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const res = await this.client.RestClient.get(options);
|
|
42
|
-
if (res.body && Array.isArray(res.body.items) && res.body.items.length) {
|
|
47
|
+
const res = await this.client.rest.get(
|
|
48
|
+
'/automation/v1/filetransfers/?$filter=name%20eq%20' + encodeURIComponent(name)
|
|
49
|
+
);
|
|
50
|
+
if (Array.isArray(res?.items) && res?.items?.length) {
|
|
43
51
|
// eq-operator returns a similar, not exact match and hence might return more than 1 entry
|
|
44
|
-
const
|
|
52
|
+
const metadata = res.items.find((item) => item.name === name);
|
|
45
53
|
if (!metadata) {
|
|
46
54
|
Util.logger.error(`No ${this.definition.typeName} found with name "${name}"`);
|
|
47
55
|
return;
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
// get full definition
|
|
51
|
-
const extended = await this.client.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const originalKey = extended
|
|
59
|
+
const extended = await this.client.rest.get(
|
|
60
|
+
'/automation/v1/filetransfers/' + metadata[this.definition.idField]
|
|
61
|
+
);
|
|
62
|
+
const originalKey = extended[this.definition.keyField];
|
|
55
63
|
const val = JSON.parse(
|
|
56
64
|
Util.replaceByObject(
|
|
57
|
-
JSON.stringify(this.parseMetadata(extended
|
|
65
|
+
JSON.stringify(this.parseMetadata(extended)),
|
|
58
66
|
templateVariables
|
|
59
67
|
)
|
|
60
68
|
);
|
|
61
69
|
|
|
62
70
|
// remove all fields listed in Definition for templating
|
|
63
71
|
this.keepTemplateFields(val);
|
|
64
|
-
File.writeJSONToFile(
|
|
72
|
+
await File.writeJSONToFile(
|
|
65
73
|
[templateDir, this.definition.type].join('/'),
|
|
66
74
|
originalKey + '.' + this.definition.type + '-meta',
|
|
67
75
|
JSON.parse(Util.replaceByObject(JSON.stringify(val), templateVariables))
|
|
68
76
|
);
|
|
69
|
-
Util.logger.info(
|
|
70
|
-
`FileTransfer.retrieveAsTemplate:: Written Metadata to filesystem (${name})`
|
|
71
|
-
);
|
|
77
|
+
Util.logger.info(`- templated ${this.definition.type}: ${name}`);
|
|
72
78
|
return { metadata: val, type: this.definition.type };
|
|
73
|
-
} else if (res
|
|
79
|
+
} else if (res?.items) {
|
|
74
80
|
Util.logger.error(`No ${this.definition.typeName} found with name "${name}"`);
|
|
75
81
|
} else {
|
|
76
82
|
throw new Error(
|
|
77
83
|
`Encountered unknown error when retrieveing ${
|
|
78
84
|
this.definition.typeName
|
|
79
|
-
} "${name}": ${JSON.stringify(res
|
|
85
|
+
} "${name}": ${JSON.stringify(res)}`
|
|
80
86
|
);
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
/**
|
|
85
91
|
* manages post retrieve steps
|
|
86
|
-
*
|
|
87
|
-
* @
|
|
92
|
+
*
|
|
93
|
+
* @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
|
|
94
|
+
* @returns {object[]} metadata
|
|
88
95
|
*/
|
|
89
96
|
static postRetrieveTasks(metadata) {
|
|
90
97
|
const values = this.parseMetadata(metadata);
|
|
@@ -93,7 +100,8 @@ class FileTransfer extends MetadataType {
|
|
|
93
100
|
|
|
94
101
|
/**
|
|
95
102
|
* Creates a single File Transfer
|
|
96
|
-
*
|
|
103
|
+
*
|
|
104
|
+
* @param {TYPE.MetadataTypeItem} fileTransfer a single File Transfer
|
|
97
105
|
* @returns {Promise} Promise
|
|
98
106
|
*/
|
|
99
107
|
static create(fileTransfer) {
|
|
@@ -102,7 +110,8 @@ class FileTransfer extends MetadataType {
|
|
|
102
110
|
|
|
103
111
|
/**
|
|
104
112
|
* Updates a single File Transfer
|
|
105
|
-
*
|
|
113
|
+
*
|
|
114
|
+
* @param {TYPE.MetadataTypeItem} fileTransfer a single File Transfer
|
|
106
115
|
* @returns {Promise} Promise
|
|
107
116
|
*/
|
|
108
117
|
static update(fileTransfer) {
|
|
@@ -111,40 +120,51 @@ class FileTransfer extends MetadataType {
|
|
|
111
120
|
|
|
112
121
|
/**
|
|
113
122
|
* prepares a fileTransfer for deployment
|
|
114
|
-
*
|
|
123
|
+
*
|
|
124
|
+
* @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
|
|
115
125
|
* @returns {Promise} Promise
|
|
116
126
|
*/
|
|
117
127
|
static async preDeployTasks(metadata) {
|
|
118
|
-
metadata.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
if (metadata.r__ftpLocation_name) {
|
|
129
|
+
metadata.fileTransferLocationId = cache.searchForField(
|
|
130
|
+
'ftpLocation',
|
|
131
|
+
metadata.r__ftpLocation_name,
|
|
132
|
+
'name',
|
|
133
|
+
'id'
|
|
134
|
+
);
|
|
135
|
+
} else {
|
|
136
|
+
throw new Error(
|
|
137
|
+
'r__ftpLocation_name not set. Please ensure the source is properly set up and re-retrieve it first.'
|
|
138
|
+
);
|
|
139
|
+
}
|
|
125
140
|
return metadata;
|
|
126
141
|
}
|
|
127
142
|
/**
|
|
128
143
|
* parses retrieved Metadata before saving
|
|
129
|
-
*
|
|
130
|
-
* @
|
|
144
|
+
*
|
|
145
|
+
* @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
|
|
146
|
+
* @returns {TYPE.MetadataTypeItem} parsed metadata
|
|
131
147
|
*/
|
|
132
148
|
static parseMetadata(metadata) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
149
|
+
try {
|
|
150
|
+
metadata.r__ftpLocation_name = cache.searchForField(
|
|
151
|
+
'ftpLocation',
|
|
152
|
+
metadata.fileTransferLocationId,
|
|
153
|
+
'id',
|
|
154
|
+
'name'
|
|
155
|
+
);
|
|
156
|
+
delete metadata.fileTransferLocationId;
|
|
157
|
+
} catch (ex) {
|
|
158
|
+
Util.logger.warn(
|
|
159
|
+
` - FileTransfer '${metadata[this.definition.keyField]}': ${ex.message}`
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
141
163
|
return metadata;
|
|
142
164
|
}
|
|
143
165
|
}
|
|
144
166
|
|
|
145
167
|
// Assign definition to static attributes
|
|
146
168
|
FileTransfer.definition = require('../MetadataTypeDefinitions').fileTransfer;
|
|
147
|
-
FileTransfer.cache = {};
|
|
148
|
-
FileTransfer.client = undefined;
|
|
149
169
|
|
|
150
170
|
module.exports = FileTransfer;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Filter MetadataType
|
|
8
|
+
*
|
|
7
9
|
* @augments MetadataType
|
|
8
10
|
*/
|
|
9
11
|
class Filter extends MetadataType {
|
|
@@ -12,11 +14,16 @@ class Filter extends MetadataType {
|
|
|
12
14
|
* Endpoint /automation/v1/filters/ returns all Filters,
|
|
13
15
|
* but only with some of the fields. So it is needed to loop over
|
|
14
16
|
* Filters with the endpoint /automation/v1/filters/{id}
|
|
15
|
-
*
|
|
16
|
-
* @
|
|
17
|
+
*
|
|
18
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
19
|
+
* @param {void} [_] unused parameter
|
|
20
|
+
* @param {void} [__] unused parameter
|
|
21
|
+
* @param {void} [___] unused parameter
|
|
22
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
23
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
17
24
|
*/
|
|
18
|
-
static async retrieve(retrieveDir) {
|
|
19
|
-
return super.retrieveREST(retrieveDir, '/automation/v1/filters/', null);
|
|
25
|
+
static async retrieve(retrieveDir, _, __, ___, key) {
|
|
26
|
+
return super.retrieveREST(retrieveDir, '/automation/v1/filters/', null, null, key);
|
|
20
27
|
}
|
|
21
28
|
}
|
|
22
29
|
|