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,41 +1,47 @@
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
 
6
7
  /**
7
8
  * ImportFile MetadataType
9
+ *
8
10
  * @augments MetadataType
9
11
  */
10
12
  class Discovery extends MetadataType {
11
13
  /**
12
14
  * Retrieves API endpoint
13
15
  * documentation: https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/routes.htm
14
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
15
- * @param {String[]} [_] not used
16
- * @param {Object} buObject properties for auth
17
- * @returns {Promise} Promise
16
+ *
17
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
18
+ * @param {void} [_] not used
19
+ * @param {TYPE.BuObject} buObject properties for auth
20
+ * @param {void} [___] unused parameter
21
+ * @param {string} [key] customer key of single item to retrieve
22
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
18
23
  */
19
- static async retrieve(retrieveDir, _, buObject) {
24
+ static async retrieve(retrieveDir, _, buObject, ___, key) {
25
+ if (key) {
26
+ Util.logger.error('Discovery.retrieve() does not support key parameter');
27
+ }
20
28
  if (buObject.eid !== buObject.mid) {
21
29
  // don't run for BUs other than Parent BU
22
- Util.logger.warn('Skipping Discovery retrieval on non-parent BU');
30
+ Util.logger.warn(' - Skipping Discovery retrieval on non-parent BU');
23
31
  return;
24
32
  } else {
25
- const res = await Promise.all(
26
- Object.keys(this.definition.endPointMapping).map((endpoint) =>
27
- this.client.RestClient.get({
28
- uri: this.definition.endPointMapping[endpoint],
29
- headers: {},
30
- })
33
+ const res = await this.client.rest.getCollection(
34
+ Object.keys(this.definition.endPointMapping).map(
35
+ (endpoint) => this.definition.endPointMapping[endpoint]
31
36
  )
32
37
  );
38
+
33
39
  const metadataStructure = {};
34
40
  for (const [i, v] of res.entries()) {
35
- v.body.key = Object.keys(this.definition.endPointMapping)[i];
36
- metadataStructure[v.body.key] = v.body;
41
+ v.key = Object.keys(this.definition.endPointMapping)[i];
42
+ metadataStructure[v.key] = v;
37
43
  }
38
- await this.saveResults(metadataStructure, retrieveDir, null);
44
+ await super.saveResults(metadataStructure, retrieveDir, null);
39
45
  Util.logger.info('Downloaded: ' + this.definition.type);
40
46
  return { metadata: metadataStructure, type: this.definition.type };
41
47
  }
@@ -44,6 +50,5 @@ class Discovery extends MetadataType {
44
50
 
45
51
  // Assign definition to static attributes
46
52
  Discovery.definition = require('../MetadataTypeDefinitions').discovery;
47
- Discovery.client = undefined;
48
53
 
49
54
  module.exports = Discovery;
@@ -1,43 +1,63 @@
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');
6
+ const cache = require('../util/cache');
5
7
 
6
8
  /**
7
9
  * Email MetadataType
10
+ *
8
11
  * @augments MetadataType
9
12
  */
10
13
  class Email extends MetadataType {
11
14
  /**
12
15
  * Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
13
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
14
- * @returns {Promise<Object>} Promise of metadata
16
+ *
17
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
18
+ * @param {void} [_] unused parameter
19
+ * @param {void} [__] unused parameter
20
+ * @param {void} [___] unused parameter
21
+ * @param {string} [key] customer key of single item to retrieve
22
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
15
23
  */
16
- static retrieve(retrieveDir) {
24
+ static retrieve(retrieveDir, _, __, ___, key) {
17
25
  Util.logger.warn(
18
- 'Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
26
+ ' - Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
19
27
  );
28
+ /** @type {TYPE.SoapRequestParams} */
29
+ let requestParams = null;
30
+ if (key) {
31
+ requestParams = {
32
+ filter: {
33
+ leftOperand: 'CustomerKey',
34
+ operator: 'equals',
35
+ rightOperand: key,
36
+ },
37
+ };
38
+ }
20
39
  // !dont activate `await File.initPrettier('html');` as we only want to retrieve for migration and formatting might mess with the outcome
21
- return super.retrieveSOAPgeneric(retrieveDir, null);
40
+ return super.retrieveSOAP(retrieveDir, null, requestParams);
22
41
  }
23
42
  /**
24
43
  * manages post retrieve steps
25
- * @param {Object} metadata a single query
26
- * @returns {Object[]} Array with one metadata object and one query string
44
+ *
45
+ * @param {TYPE.MetadataTypeItem} metadata a single query
46
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
27
47
  */
28
48
  static postRetrieveTasks(metadata) {
29
49
  return this.parseMetadata(metadata);
30
50
  }
31
51
  /**
32
52
  * parses retrieved Metadata before saving
33
- * @param {Object} metadata a single query activity definition
34
- * @returns {Array} Array with one metadata object and one sql string
53
+ *
54
+ * @param {TYPE.MetadataTypeItem} metadata a single query activity definition
55
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
35
56
  */
36
57
  static parseMetadata(metadata) {
37
58
  // folder
38
59
  try {
39
- metadata.r__folder_Path = Util.getFromCache(
40
- this.cache,
60
+ metadata.r__folder_Path = cache.searchForField(
41
61
  'folder',
42
62
  metadata.CategoryID,
43
63
  'ID',
@@ -46,7 +66,7 @@ class Email extends MetadataType {
46
66
  delete metadata.CategoryID;
47
67
  } catch (ex) {
48
68
  Util.logger.warn(
49
- `Classic E-Mail '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
69
+ ` - Classic E-Mail '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
50
70
  );
51
71
  }
52
72
 
@@ -1,22 +1,29 @@
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');
6
+ const cache = require('../util/cache');
5
7
 
6
8
  /**
7
9
  * MessageSendActivity MetadataType
10
+ *
8
11
  * @augments MetadataType
9
12
  */
10
13
  class EmailSendDefinition extends MetadataType {
11
14
  /**
12
15
  * Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
13
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
14
- * @param {void} _ -
15
- * @param {Object} buObject properties for auth
16
- * @returns {Promise<Object>} Promise of metadata
16
+ *
17
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
18
+ * @param {void} [_] unused parameter
19
+ * @param {void} [__] unused parameter
20
+ * @param {void} [___] unused parameter
21
+ * @param {string} [key] customer key of single item to retrieve
22
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
17
23
  */
18
- static retrieve(retrieveDir, _, buObject) {
19
- const options = {
24
+ static retrieve(retrieveDir, _, __, ___, key) {
25
+ /** @type {TYPE.SoapRequestParams} */
26
+ let requestParams = {
20
27
  filter: {
21
28
  leftOperand: {
22
29
  // somehow that parameter controls visible (non deleted?) email send activities
@@ -32,12 +39,27 @@ class EmailSendDefinition extends MetadataType {
32
39
  },
33
40
  },
34
41
  };
35
- return super.retrieveSOAPgeneric(retrieveDir, buObject, options);
42
+ if (key) {
43
+ // move original filter down one level into rightOperand and add key filter into leftOperand
44
+ requestParams = {
45
+ filter: {
46
+ leftOperand: {
47
+ leftOperand: 'CustomerKey',
48
+ operator: 'equals',
49
+ rightOperand: key,
50
+ },
51
+ operator: 'AND',
52
+ rightOperand: requestParams.filter,
53
+ },
54
+ };
55
+ }
56
+ return super.retrieveSOAP(retrieveDir, null, requestParams);
36
57
  }
37
58
 
38
59
  /**
39
60
  * Updates a single item
40
- * @param {Object} metadataItem a single item
61
+ *
62
+ * @param {TYPE.MetadataTypeItem} metadataItem a single item
41
63
  * @returns {Promise} Promise
42
64
  */
43
65
  static update(metadataItem) {
@@ -46,62 +68,54 @@ class EmailSendDefinition extends MetadataType {
46
68
 
47
69
  /**
48
70
  * Creates a single item
49
- * @param {Object} metadataItem a single item
71
+ *
72
+ * @param {TYPE.MetadataTypeItem} metadataItem a single item
50
73
  * @returns {Promise} Promise
51
74
  */
52
75
  static create(metadataItem) {
53
76
  return super.createSOAP(metadataItem);
54
77
  }
55
78
 
79
+ /**
80
+ * Delete a metadata item from the specified business unit
81
+ *
82
+ * @param {TYPE.BuObject} buObject references credentials
83
+ * @param {string} customerKey Identifier of data extension
84
+ * @returns {Promise.<boolean>} deletion success status
85
+ */
86
+ static deleteByKey(buObject, customerKey) {
87
+ return super.deleteByKeySOAP(buObject, customerKey, false);
88
+ }
89
+
56
90
  /**
57
91
  * prepares a single item for deployment
58
- * @param {Object} metadata a single script activity definition
59
- * @returns {Promise} Promise
92
+ *
93
+ * @param {TYPE.MetadataTypeItem} metadata a single script activity definition
94
+ * @returns {Promise.<TYPE.MetadataTypeItem>} Promise
60
95
  */
61
96
  static async preDeployTasks(metadata) {
62
97
  // re-add IsPlatformObject, required for visibility
63
98
  metadata.IsPlatformObject = false;
64
99
  // folder
65
- try {
66
- metadata.CategoryID = Util.getFromCache(
67
- this.cache,
68
- 'folder',
69
- metadata.r__folder_Path,
70
- 'Path',
71
- 'ID'
72
- );
73
- delete metadata.r__folder_Path;
74
- } catch (ex) {
75
- Util.logger.error(`${this.definition.typeName} '${metadata.key}': ${ex.message}`);
76
- }
100
+ metadata.CategoryID = cache.searchForField('folder', metadata.r__folder_Path, 'Path', 'ID');
101
+ delete metadata.r__folder_Path;
77
102
  // email
78
- try {
79
- metadata.Email = {};
80
- if (metadata.r__email_Name) {
81
- // classic
82
- metadata.Email.ID = Util.getFromCache(
83
- this.cache,
84
- 'email',
85
- metadata.r__email_Name,
86
- 'Name',
87
- 'ID'
88
- );
89
- delete metadata.r__email_Name;
90
- } else if (metadata.r__assetMessage_Key) {
91
- // content builder
92
- // * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
93
- metadata.Email.ID = Util.getFromCache(
94
- this.cache,
95
- 'asset',
96
- metadata.r__assetMessage_Key,
97
- 'customerKey',
98
- 'legacyData.legacyId'
99
- );
100
- delete metadata.r__assetMessage_Key;
101
- delete metadata.r__assetMessage_Name;
102
- }
103
- } catch (ex) {
104
- Util.logger.error(`${this.definition.typeName} '${metadata.key}': ${ex.message}`);
103
+ metadata.Email = {};
104
+ if (metadata.r__email_Name) {
105
+ // classic
106
+ metadata.Email.ID = cache.searchForField('email', metadata.r__email_Name, 'Name', 'ID');
107
+ delete metadata.r__email_Name;
108
+ } else if (metadata.r__assetMessage_Key) {
109
+ // content builder
110
+ // * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
111
+ metadata.Email.ID = cache.searchForField(
112
+ 'asset',
113
+ metadata.r__assetMessage_Key,
114
+ 'customerKey',
115
+ 'legacyData.legacyId'
116
+ );
117
+ delete metadata.r__assetMessage_Key;
118
+ delete metadata.r__assetMessage_Name;
105
119
  }
106
120
  // Target Audience DataExtension
107
121
  // normalize first because this can be an array
@@ -121,8 +135,7 @@ class EmailSendDefinition extends MetadataType {
121
135
  `Skipping ${metadata.Name} (${metadata.CustomerKey}): Expecting DataSourceTypeID to equal 'CustomObject' when r__dataExtension_Key is defined; Found '${sdl.DataSourceTypeID}'`
122
136
  );
123
137
  }
124
- sdl.CustomObjectID = Util.getFromCache(
125
- this.cache,
138
+ sdl.CustomObjectID = cache.searchForField(
126
139
  'dataExtension',
127
140
  sdl.r__dataExtension_Key,
128
141
  'CustomerKey',
@@ -137,7 +150,7 @@ class EmailSendDefinition extends MetadataType {
137
150
  // get List (required)
138
151
  if (sdl.r__list_PathName) {
139
152
  sdl.List = {
140
- ID: Util.getListObjectIdFromCache(this.cache, sdl.r__list_PathName, 'ID'),
153
+ ID: cache.getListObjectId(sdl.r__list_PathName, 'ID'),
141
154
  };
142
155
  delete sdl.r__list_PathName;
143
156
  } else {
@@ -152,24 +165,25 @@ class EmailSendDefinition extends MetadataType {
152
165
 
153
166
  /**
154
167
  * manages post retrieve steps
155
- * @param {Object} metadata a single query
156
- * @returns {Object[]} Array with one metadata object and one query string
168
+ *
169
+ * @param {TYPE.MetadataTypeItem} metadata a single query
170
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
157
171
  */
158
172
  static postRetrieveTasks(metadata) {
159
173
  return this.parseMetadata(metadata);
160
174
  }
161
175
  /**
162
176
  * parses retrieved Metadata before saving
163
- * @param {Object} metadata a single query activity definition
164
- * @returns {Array} Array with one metadata object and one sql string
177
+ *
178
+ * @param {TYPE.MetadataTypeItem} metadata a single query activity definition
179
+ * @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
165
180
  */
166
181
  static parseMetadata(metadata) {
167
182
  // remove IsPlatformObject, always has to be 'false'
168
183
  delete metadata.IsPlatformObject;
169
184
  // folder
170
185
  try {
171
- metadata.r__folder_Path = Util.getFromCache(
172
- this.cache,
186
+ metadata.r__folder_Path = cache.searchForField(
173
187
  'folder',
174
188
  metadata.CategoryID,
175
189
  'ID',
@@ -178,34 +192,26 @@ class EmailSendDefinition extends MetadataType {
178
192
  delete metadata.CategoryID;
179
193
  } catch (ex) {
180
194
  Util.logger.warn(
181
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
195
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
182
196
  );
183
197
  }
184
198
  // email
185
199
  try {
186
200
  // classic
187
- const classicEmail = Util.getFromCache(
188
- this.cache,
189
- 'email',
190
- metadata.Email.ID,
191
- 'ID',
192
- 'Name'
193
- );
201
+ const classicEmail = cache.searchForField('email', metadata.Email.ID, 'ID', 'Name');
194
202
  metadata.r__email_Name = classicEmail;
195
203
  delete metadata.Email;
196
- } catch (ex) {
204
+ } catch {
197
205
  try {
198
206
  // content builder
199
- const contentBuilderEmailName = Util.getFromCache(
200
- this.cache,
207
+ const contentBuilderEmailName = cache.searchForField(
201
208
  'asset',
202
209
  metadata.Email.ID,
203
210
  'legacyData.legacyId',
204
211
  'name'
205
212
  );
206
213
  metadata.r__assetMessage_Name = contentBuilderEmailName;
207
- const contentBuilderEmailKey = Util.getFromCache(
208
- this.cache,
214
+ const contentBuilderEmailKey = cache.searchForField(
209
215
  'asset',
210
216
  metadata.Email.ID,
211
217
  'legacyData.legacyId',
@@ -213,9 +219,9 @@ class EmailSendDefinition extends MetadataType {
213
219
  );
214
220
  metadata.r__assetMessage_Key = contentBuilderEmailKey;
215
221
  delete metadata.Email;
216
- } catch (ex) {
222
+ } catch {
217
223
  Util.logger.warn(
218
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
224
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
219
225
  );
220
226
  }
221
227
  }
@@ -231,27 +237,26 @@ class EmailSendDefinition extends MetadataType {
231
237
  // get DataExtension keys
232
238
  if (sdl.CustomObjectID) {
233
239
  try {
234
- sdl.r__dataExtension_Key = Util.getFromCache(
235
- this.cache,
240
+ sdl.r__dataExtension_Key = cache.searchForField(
236
241
  'dataExtension',
237
242
  sdl.CustomObjectID,
238
243
  'ObjectID',
239
244
  'CustomerKey'
240
245
  );
241
246
  delete sdl.CustomObjectID;
242
- } catch (ex) {
247
+ } catch {
243
248
  Util.logger.warn(
244
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find Target Audience (DataExtension) with ObjectID ${sdl.CustomObjectID}.`
249
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find Target Audience (DataExtension) with ObjectID ${sdl.CustomObjectID}.`
245
250
  );
246
251
  }
247
252
  }
248
253
  // List
249
254
  try {
250
- sdl.r__list_PathName = Util.getListPathNameFromCache(this.cache, sdl.List.ID, 'ID');
255
+ sdl.r__list_PathName = cache.getListPathName(sdl.List.ID, 'ID');
251
256
  delete sdl.List;
252
257
  } catch (ex) {
253
258
  Util.logger.warn(
254
- `${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
259
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
255
260
  );
256
261
  }
257
262
  }
@@ -1,11 +1,14 @@
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
  * EventDefinition MetadataType
11
+ *
9
12
  * @augments MetadataType
10
13
  */
11
14
  class EventDefinition extends MetadataType {
@@ -13,35 +16,48 @@ class EventDefinition extends MetadataType {
13
16
  * Retrieves Metadata of Event Definition.
14
17
  * Endpoint /interaction/v1/EventDefinitions return all Event Definitions with all details.
15
18
  * Currently it is not needed to loop over Imports with endpoint /interaction/v1/EventDefinitions/{id}
16
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
17
- * @returns {Promise<Object>} Promise of metadata
19
+ *
20
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
21
+ * @param {void} [_] unused parameter
22
+ * @param {void} [__] unused parameter
23
+ * @param {void} [___] unused parameter
24
+ * @param {string} [key] customer key of single item to retrieve
25
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
18
26
  */
19
- static retrieve(retrieveDir) {
20
- return super.retrieveREST(retrieveDir, '/interaction/v1/EventDefinitions/', null);
27
+ static retrieve(retrieveDir, _, __, ___, key) {
28
+ return super.retrieveREST(
29
+ retrieveDir,
30
+ `/interaction/v1/EventDefinitions${
31
+ key ? '/key:' + encodeURIComponent(key) : ''
32
+ }?extras=all`,
33
+ null,
34
+ null,
35
+ key
36
+ );
21
37
  }
22
38
 
23
39
  /**
24
40
  * Retrieves event definition metadata for caching
25
- * @returns {Promise<Object>} Promise of metadata
41
+ *
42
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
26
43
  */
27
44
  static retrieveForCache() {
28
- return super.retrieveREST(null, '/interaction/v1/EventDefinitions/', null);
45
+ return super.retrieveREST(null, '/interaction/v1/EventDefinitions/');
29
46
  }
30
47
 
31
48
  /**
32
49
  * Retrieve a specific Event Definition by Name
33
- * @param {String} templateDir Directory where retrieved metadata directory will be saved
34
- * @param {String} name name of the metadata file
35
- * @param {Object} templateVariables variables to be replaced in the metadata
36
- * @returns {Promise<Object>} Promise of metadata
50
+ *
51
+ * @param {string} templateDir Directory where retrieved metadata directory will be saved
52
+ * @param {string} name name of the metadata file
53
+ * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
54
+ * @returns {Promise.<TYPE.MetadataTypeItemObj>} Promise of metadata
37
55
  */
38
56
  static async retrieveAsTemplate(templateDir, name, templateVariables) {
39
- // todo template based on name
40
- const options = {
41
- uri: '/interaction/v1/EventDefinitions?name=' + encodeURIComponent(name),
42
- };
43
- const res = await this.client.RestClient.get(options);
44
- const event = res.body.items.filter((item) => item.name === name);
57
+ const res = await this.client.rest.get(
58
+ '/interaction/v1/EventDefinitions?name=' + encodeURIComponent(name)
59
+ );
60
+ const event = res.items.filter((item) => item.name === name);
45
61
  try {
46
62
  if (!event || event.length === 0) {
47
63
  throw new Error(`No Event Definitions Found with name "${name}"`);
@@ -50,7 +66,7 @@ class EventDefinition extends MetadataType {
50
66
  `Multiple Event Definitions with name "${name}"` +
51
67
  `please rename to be unique to avoid issues`
52
68
  );
53
- } else if (event && event.length === 1) {
69
+ } else if (event?.length === 1) {
54
70
  const originalKey = event[0][this.definition.keyField];
55
71
  const eventDef = JSON.parse(
56
72
  Util.replaceByObject(
@@ -69,14 +85,12 @@ class EventDefinition extends MetadataType {
69
85
 
70
86
  // remove all fields listed in Definition for templating
71
87
  this.keepTemplateFields(eventDef);
72
- File.writeJSONToFile(
88
+ await File.writeJSONToFile(
73
89
  [templateDir, this.definition.type].join('/'),
74
90
  originalKey + '.' + this.definition.type + '-meta',
75
91
  JSON.parse(Util.replaceByObject(JSON.stringify(eventDef), templateVariables))
76
92
  );
77
- Util.logger.info(
78
- `EventDefinition.retrieveAsTemplate:: Written Metadata to filesystem (${name})`
79
- );
93
+ Util.logger.info(`- templated ${this.definition.type}: ${name}`);
80
94
  return { metadata: eventDef, type: this.definition.type };
81
95
  } else {
82
96
  throw new Error(
@@ -93,8 +107,9 @@ class EventDefinition extends MetadataType {
93
107
 
94
108
  /**
95
109
  * manages post retrieve steps
96
- * @param {Object} eventDef a single importDef
97
- * @returns {Object[]} metadata
110
+ *
111
+ * @param {TYPE.MetadataTypeItem} eventDef a single item of Event Definition
112
+ * @returns {TYPE.MetadataTypeItem} metadata
98
113
  */
99
114
  static postRetrieveTasks(eventDef) {
100
115
  const val = this.parseMetadata(eventDef);
@@ -104,7 +119,8 @@ class EventDefinition extends MetadataType {
104
119
 
105
120
  /**
106
121
  * Creates a single Event Definition
107
- * @param {Object} EventDefinition a single Event Definition
122
+ *
123
+ * @param {TYPE.MetadataTypeItem} EventDefinition a single Event Definition
108
124
  * @returns {Promise} Promise
109
125
  */
110
126
  static create(EventDefinition) {
@@ -113,18 +129,22 @@ class EventDefinition extends MetadataType {
113
129
 
114
130
  /**
115
131
  * Updates a single Event Definition (using PUT method since PATCH isn't supported)
116
- * @param {Object} EventDefinition a single Event Definition
132
+ *
133
+ * @param {TYPE.MetadataTypeItem} metadataEntry a single Event Definition
117
134
  * @returns {Promise} Promise
118
135
  */
119
- static async update(EventDefinition) {
120
- this.removeNotUpdateableFields(EventDefinition);
136
+ static async update(metadataEntry) {
137
+ if (metadataEntry === null || metadataEntry === undefined) {
138
+ return null;
139
+ }
140
+ this.removeNotUpdateableFields(metadataEntry);
121
141
  const options = {
122
- uri: '/interaction/v1/EventDefinitions/' + EventDefinition.id,
123
- json: EventDefinition,
142
+ uri: '/interaction/v1/EventDefinitions/' + metadataEntry.id,
143
+ json: metadataEntry,
124
144
  headers: {},
125
145
  };
126
146
  try {
127
- const response = await this.client.RestClient.put(options);
147
+ const response = await this.client.rest.put(options);
128
148
  super.checkForErrors(response);
129
149
  return response;
130
150
  } catch (ex) {
@@ -133,7 +153,7 @@ class EventDefinition extends MetadataType {
133
153
  this.definition.type,
134
154
  'updateREST',
135
155
  ex,
136
- EventDefinition.name
156
+ metadataEntry.name
137
157
  );
138
158
  return null;
139
159
  }
@@ -141,12 +161,12 @@ class EventDefinition extends MetadataType {
141
161
 
142
162
  /**
143
163
  * prepares an event definition for deployment
144
- * @param {Object} metadata a single eventDefinition
145
- * @returns {Promise} Promise
164
+ *
165
+ * @param {TYPE.MetadataTypeItem} metadata a single eventDefinition
166
+ * @returns {TYPE.MetadataTypeItem} parsed version
146
167
  */
147
- static async preDeployTasks(metadata) {
148
- metadata.dataExtensionId = Util.getFromCache(
149
- this.cache,
168
+ static preDeployTasks(metadata) {
169
+ metadata.dataExtensionId = cache.searchForField(
150
170
  'dataExtension',
151
171
  metadata.dataExtensionName,
152
172
  'Name',
@@ -158,13 +178,13 @@ class EventDefinition extends MetadataType {
158
178
 
159
179
  /**
160
180
  * parses retrieved Metadata before saving
161
- * @param {Object} metadata a single event definition
162
- * @returns {Array} Array with one metadata object and one sql string
181
+ *
182
+ * @param {TYPE.MetadataTypeItem} metadata a single event definition
183
+ * @returns {TYPE.MetadataTypeItem} parsed metadata
163
184
  */
164
185
  static parseMetadata(metadata) {
165
186
  try {
166
- metadata.dataExtensionId = Util.getFromCache(
167
- this.cache,
187
+ metadata.dataExtensionId = cache.searchForField(
168
188
  'dataExtension',
169
189
  metadata.dataExtensionId,
170
190
  'ObjectID',
@@ -172,7 +192,7 @@ class EventDefinition extends MetadataType {
172
192
  );
173
193
  metadata.arguments.dataExtensionId = metadata.dataExtensionId;
174
194
  return JSON.parse(JSON.stringify(metadata));
175
- } catch (ex) {
195
+ } catch {
176
196
  Util.metadataLogger(
177
197
  'verbose',
178
198
  this.definition.type,
@@ -186,7 +206,5 @@ class EventDefinition extends MetadataType {
186
206
 
187
207
  // Assign definition to static attributes
188
208
  EventDefinition.definition = require('../MetadataTypeDefinitions').eventDefinition;
189
- EventDefinition.cache = {};
190
- EventDefinition.client = undefined;
191
209
 
192
210
  module.exports = EventDefinition;