mcdev 3.1.3 → 4.0.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 (134) hide show
  1. package/.eslintrc.json +67 -7
  2. package/.github/ISSUE_TEMPLATE/bug.yml +2 -1
  3. package/.github/PULL_REQUEST_TEMPLATE.md +5 -3
  4. package/.github/dependabot.yml +14 -0
  5. package/.github/workflows/code-analysis.yml +57 -0
  6. package/.husky/commit-msg +10 -0
  7. package/.husky/post-checkout +5 -0
  8. package/.husky/pre-commit +2 -1
  9. package/.prettierrc +8 -0
  10. package/.vscode/settings.json +1 -1
  11. package/LICENSE +2 -2
  12. package/README.md +134 -45
  13. package/boilerplate/config.json +5 -11
  14. package/boilerplate/files/.prettierrc +8 -0
  15. package/boilerplate/files/.vscode/extensions.json +0 -1
  16. package/boilerplate/files/.vscode/settings.json +28 -2
  17. package/boilerplate/files/README.md +2 -2
  18. package/boilerplate/forcedUpdates.json +10 -0
  19. package/boilerplate/npm-dependencies.json +5 -5
  20. package/docs/dist/documentation.md +2795 -1724
  21. package/jsconfig.json +1 -1
  22. package/lib/Builder.js +166 -75
  23. package/lib/Deployer.js +244 -96
  24. package/lib/MetadataTypeDefinitions.js +2 -0
  25. package/lib/MetadataTypeInfo.js +2 -0
  26. package/lib/Retriever.js +61 -84
  27. package/lib/cli.js +116 -11
  28. package/lib/index.js +241 -561
  29. package/lib/metadataTypes/AccountUser.js +101 -95
  30. package/lib/metadataTypes/Asset.js +677 -248
  31. package/lib/metadataTypes/AttributeGroup.js +23 -12
  32. package/lib/metadataTypes/Automation.js +451 -354
  33. package/lib/metadataTypes/Campaign.js +33 -93
  34. package/lib/metadataTypes/ContentArea.js +31 -11
  35. package/lib/metadataTypes/DataExtension.js +387 -372
  36. package/lib/metadataTypes/DataExtensionField.js +131 -54
  37. package/lib/metadataTypes/DataExtensionTemplate.js +22 -4
  38. package/lib/metadataTypes/DataExtract.js +61 -48
  39. package/lib/metadataTypes/DataExtractType.js +14 -8
  40. package/lib/metadataTypes/Discovery.js +21 -16
  41. package/lib/metadataTypes/Email.js +32 -12
  42. package/lib/metadataTypes/EmailSendDefinition.js +85 -80
  43. package/lib/metadataTypes/EventDefinition.js +61 -43
  44. package/lib/metadataTypes/FileTransfer.js +72 -52
  45. package/lib/metadataTypes/Filter.js +11 -4
  46. package/lib/metadataTypes/Folder.js +149 -117
  47. package/lib/metadataTypes/FtpLocation.js +14 -8
  48. package/lib/metadataTypes/ImportFile.js +61 -64
  49. package/lib/metadataTypes/Interaction.js +19 -4
  50. package/lib/metadataTypes/List.js +54 -13
  51. package/lib/metadataTypes/MetadataType.js +668 -454
  52. package/lib/metadataTypes/MobileCode.js +46 -0
  53. package/lib/metadataTypes/MobileKeyword.js +114 -0
  54. package/lib/metadataTypes/Query.js +204 -103
  55. package/lib/metadataTypes/Role.js +76 -61
  56. package/lib/metadataTypes/Script.js +145 -81
  57. package/lib/metadataTypes/SetDefinition.js +20 -8
  58. package/lib/metadataTypes/TriggeredSendDefinition.js +78 -58
  59. package/lib/metadataTypes/definitions/Asset.definition.js +21 -10
  60. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +12 -0
  61. package/lib/metadataTypes/definitions/Automation.definition.js +10 -5
  62. package/lib/metadataTypes/definitions/Campaign.definition.js +44 -1
  63. package/lib/metadataTypes/definitions/DataExtension.definition.js +4 -0
  64. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +6 -0
  65. package/lib/metadataTypes/definitions/DataExtract.definition.js +18 -14
  66. package/lib/metadataTypes/definitions/Discovery.definition.js +12 -0
  67. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +4 -0
  68. package/lib/metadataTypes/definitions/EventDefinition.definition.js +22 -0
  69. package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
  70. package/lib/metadataTypes/definitions/Filter.definition.js +4 -0
  71. package/lib/metadataTypes/definitions/Folder.definition.js +6 -0
  72. package/lib/metadataTypes/definitions/FtpLocation.definition.js +4 -0
  73. package/lib/metadataTypes/definitions/ImportFile.definition.js +10 -5
  74. package/lib/metadataTypes/definitions/Interaction.definition.js +4 -0
  75. package/lib/metadataTypes/definitions/MobileCode.definition.js +163 -0
  76. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +253 -0
  77. package/lib/metadataTypes/definitions/Query.definition.js +4 -0
  78. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  79. package/lib/metadataTypes/definitions/Script.definition.js +4 -0
  80. package/lib/metadataTypes/definitions/SetDefinition.definition.js +28 -0
  81. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +4 -0
  82. package/lib/retrieveChangelog.js +7 -6
  83. package/lib/util/auth.js +117 -0
  84. package/lib/util/businessUnit.js +55 -66
  85. package/lib/util/cache.js +194 -0
  86. package/lib/util/cli.js +90 -116
  87. package/lib/util/config.js +302 -0
  88. package/lib/util/devops.js +240 -50
  89. package/lib/util/file.js +120 -191
  90. package/lib/util/init.config.js +195 -69
  91. package/lib/util/init.git.js +45 -50
  92. package/lib/util/init.js +72 -59
  93. package/lib/util/init.npm.js +48 -39
  94. package/lib/util/util.js +280 -564
  95. package/package.json +44 -33
  96. package/test/dataExtension.test.js +152 -0
  97. package/test/mockRoot/.mcdev-auth.json +8 -0
  98. package/test/mockRoot/.mcdevrc.json +67 -0
  99. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json +39 -0
  100. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testDataExtension.dataExtension-meta.json +23 -0
  101. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +11 -0
  102. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql +4 -0
  103. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json +11 -0
  104. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql +4 -0
  105. package/test/query.test.js +149 -0
  106. package/test/resourceFactory.js +142 -0
  107. package/test/resources/1111111/dataFolder/retrieve-response.xml +43 -0
  108. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +18 -0
  109. package/test/resources/9999999/automation/v1/queries/get-response.json +24 -0
  110. package/test/resources/9999999/automation/v1/queries/post-response.json +18 -0
  111. package/test/resources/9999999/dataExtension/build-expected.json +51 -0
  112. package/test/resources/9999999/dataExtension/create-expected.json +23 -0
  113. package/test/resources/9999999/dataExtension/create-response.xml +54 -0
  114. package/test/resources/9999999/dataExtension/retrieve-expected.json +51 -0
  115. package/test/resources/9999999/dataExtension/retrieve-response.xml +47 -0
  116. package/test/resources/9999999/dataExtension/template-expected.json +51 -0
  117. package/test/resources/9999999/dataExtension/update-expected.json +55 -0
  118. package/test/resources/9999999/dataExtension/update-response.xml +52 -0
  119. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +93 -0
  120. package/test/resources/9999999/dataExtensionTemplate/retrieve-response.xml +303 -0
  121. package/test/resources/9999999/dataFolder/retrieve-response.xml +65 -0
  122. package/test/resources/9999999/query/build-expected.json +8 -0
  123. package/test/resources/9999999/query/get-expected.json +11 -0
  124. package/test/resources/9999999/query/patch-expected.json +11 -0
  125. package/test/resources/9999999/query/post-expected.json +11 -0
  126. package/test/resources/9999999/query/template-expected.json +8 -0
  127. package/test/resources/auth.json +32 -0
  128. package/test/resources/rest404-response.json +5 -0
  129. package/test/resources/retrieve-response.xml +21 -0
  130. package/test/utils.js +107 -0
  131. package/types/mcdev.d.js +301 -0
  132. package/CHANGELOG.md +0 -126
  133. package/PULL_REQUEST_TEMPLATE.md +0 -19
  134. 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
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
16
- * @returns {Promise} Promise
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
- * @returns {Promise} Promise
31
+ *
32
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
24
33
  */
25
34
  static async retrieveForCache() {
26
- return super.retrieveREST(null, '/automation/v1/filetransfers/', null);
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
- * @param {String} templateDir Directory where retrieved metadata directory will be saved
32
- * @param {String} name name of the metadata file
33
- * @param {Object} templateVariables variables to be replaced in the metadata
34
- * @returns {Promise} Promise
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 options = {
38
- uri: '/automation/v1/filetransfers/?$filter=name%20eq%20' + name.split(' ').join('%20'),
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 [metadata] = res.body.items.filter((item) => item.name === name);
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.RestClient.get({
52
- uri: '/automation/v1/filetransfers/' + metadata.id,
53
- });
54
- const originalKey = extended.body[this.definition.keyField];
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.body)),
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.body && res.body.items) {
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.body)}`
85
+ } "${name}": ${JSON.stringify(res)}`
80
86
  );
81
87
  }
82
88
  }
83
89
 
84
90
  /**
85
91
  * manages post retrieve steps
86
- * @param {Object} metadata a single fileTransfer activity definition
87
- * @returns {Object[]} metadata
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
- * @param {Object} fileTransfer a single File Transfer
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
- * @param {Object} fileTransfer a single File Transfer
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
- * @param {Object} metadata a single fileTransfer activity definition
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.fileTransferLocationId = Util.getFromCache(
119
- this.cache,
120
- 'ftpLocation',
121
- metadata.r__ftpLocation_name,
122
- 'name',
123
- 'id'
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
- * @param {Object} metadata a single fileTransfer activity definition
130
- * @returns {Array} Array with one metadata object and one sql string
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
- metadata.r__ftpLocation_name = Util.getFromCache(
134
- this.cache,
135
- 'ftpLocation',
136
- metadata.fileTransferLocationId,
137
- 'id',
138
- 'name'
139
- );
140
- delete metadata.fileTransferLocationId;
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
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
16
- * @returns {Promise} Promise
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