mcdev 4.2.1 → 4.3.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.
Files changed (98) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +3 -0
  2. package/.github/PULL_REQUEST_TEMPLATE.md +1 -2
  3. package/.github/pr-labeler.yml +3 -0
  4. package/.github/workflows/close_issues_on_merge.yml +18 -0
  5. package/.github/workflows/pr-labeler.yml +19 -0
  6. package/LICENSE +1 -1
  7. package/README.md +1 -1
  8. package/docs/dist/documentation.md +702 -284
  9. package/lib/Deployer.js +21 -15
  10. package/lib/Retriever.js +41 -34
  11. package/lib/cli.js +36 -6
  12. package/lib/index.js +56 -10
  13. package/lib/metadataTypes/AccountUser.js +17 -23
  14. package/lib/metadataTypes/Asset.js +36 -48
  15. package/lib/metadataTypes/AttributeGroup.js +1 -2
  16. package/lib/metadataTypes/Automation.js +75 -37
  17. package/lib/metadataTypes/Campaign.js +4 -3
  18. package/lib/metadataTypes/ContentArea.js +2 -3
  19. package/lib/metadataTypes/DataExtension.js +56 -47
  20. package/lib/metadataTypes/DataExtensionField.js +9 -12
  21. package/lib/metadataTypes/DataExtensionTemplate.js +2 -3
  22. package/lib/metadataTypes/DataExtract.js +1 -2
  23. package/lib/metadataTypes/DataExtractType.js +1 -2
  24. package/lib/metadataTypes/Discovery.js +3 -4
  25. package/lib/metadataTypes/Email.js +20 -6
  26. package/lib/metadataTypes/EmailSendDefinition.js +40 -39
  27. package/lib/metadataTypes/EventDefinition.js +29 -2
  28. package/lib/metadataTypes/FileTransfer.js +1 -2
  29. package/lib/metadataTypes/Filter.js +1 -2
  30. package/lib/metadataTypes/Folder.js +12 -14
  31. package/lib/metadataTypes/FtpLocation.js +1 -2
  32. package/lib/metadataTypes/ImportFile.js +1 -2
  33. package/lib/metadataTypes/Interaction.js +743 -12
  34. package/lib/metadataTypes/List.js +36 -33
  35. package/lib/metadataTypes/MetadataType.js +170 -124
  36. package/lib/metadataTypes/MobileCode.js +1 -2
  37. package/lib/metadataTypes/MobileKeyword.js +1 -2
  38. package/lib/metadataTypes/Query.js +15 -6
  39. package/lib/metadataTypes/Role.js +10 -11
  40. package/lib/metadataTypes/Script.js +2 -5
  41. package/lib/metadataTypes/SetDefinition.js +1 -2
  42. package/lib/metadataTypes/TransactionalMessage.js +25 -32
  43. package/lib/metadataTypes/TransactionalSMS.js +3 -4
  44. package/lib/metadataTypes/TriggeredSendDefinition.js +232 -56
  45. package/lib/metadataTypes/definitions/Asset.definition.js +1 -1
  46. package/lib/metadataTypes/definitions/Automation.definition.js +1 -1
  47. package/lib/metadataTypes/definitions/DataExtension.definition.js +10 -1
  48. package/lib/metadataTypes/definitions/Email.definition.js +1 -1
  49. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +1 -1
  50. package/lib/metadataTypes/definitions/EventDefinition.definition.js +40 -1
  51. package/lib/metadataTypes/definitions/Folder.definition.js +31 -0
  52. package/lib/metadataTypes/definitions/ImportFile.definition.js +1 -1
  53. package/lib/metadataTypes/definitions/Interaction.definition.js +47 -26
  54. package/lib/metadataTypes/definitions/List.definition.js +1 -1
  55. package/lib/metadataTypes/definitions/Query.definition.js +1 -1
  56. package/lib/metadataTypes/definitions/Script.definition.js +1 -1
  57. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +4 -3
  58. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +4 -3
  59. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +4 -3
  60. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +10 -2
  61. package/lib/util/auth.js +15 -2
  62. package/lib/util/cli.js +4 -1
  63. package/lib/util/file.js +7 -3
  64. package/lib/util/init.js +62 -0
  65. package/lib/util/util.js +173 -11
  66. package/package.json +23 -9
  67. package/test/dataExtension.test.js +10 -10
  68. package/test/interaction.test.js +123 -0
  69. package/test/mockRoot/.mcdevrc.json +1 -1
  70. package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +266 -0
  71. package/test/mockRoot/deploy/testInstance/testBU/interaction/testNew_interaction.interaction-meta.json +266 -0
  72. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +0 -3
  73. package/test/query.test.js +8 -8
  74. package/test/resourceFactory.js +30 -14
  75. package/test/resources/1111111/dataExtension/retrieve-response.xml +26 -0
  76. package/test/resources/9999999/data/v1/customobjectdata/key/childBU_dataextension_test/rowset/get-response.json +13 -0
  77. package/test/resources/9999999/dataFolder/retrieve-response.xml +22 -0
  78. package/test/resources/9999999/eventDefinition/get-expected.json +34 -0
  79. package/test/resources/9999999/interaction/build-expected.json +260 -0
  80. package/test/resources/9999999/interaction/get-expected.json +264 -0
  81. package/test/resources/9999999/interaction/post-expected.json +264 -0
  82. package/test/resources/9999999/interaction/put-expected.json +264 -0
  83. package/test/resources/9999999/interaction/template-expected.json +260 -0
  84. package/test/resources/9999999/interaction/v1/EventDefinitions/get-response.json +43 -0
  85. package/test/resources/9999999/interaction/v1/interactions/get-response.json +222 -3
  86. package/test/resources/9999999/interaction/v1/interactions/key_0b76dccf-594c-b6dc-1acf-10c4493dcb84/get-response.json +219 -0
  87. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +280 -0
  88. package/test/resources/9999999/interaction/v1/interactions/post-response.json +280 -0
  89. package/test/resources/9999999/interaction/v1/interactions/put-response.json +280 -0
  90. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  91. package/test/resources/9999999/query/post-expected.sql +1 -1
  92. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  93. package/test/resources/9999999/triggeredSendDefinition/retrieve-response.xml +68 -0
  94. package/test/transactionalEmail.test.js +7 -7
  95. package/test/transactionalPush.test.js +7 -7
  96. package/test/transactionalSMS.test.js +7 -7
  97. package/test/utils.js +50 -0
  98. package/types/mcdev.d.js +1 -0
@@ -32,9 +32,9 @@ describe('transactionalEmail', () => {
32
32
  'returned JSON was not equal expected'
33
33
  );
34
34
  assert.equal(
35
- Object.values(testUtils.getAPIHistory()).flat().length,
35
+ testUtils.getAPIHistoryLength(),
36
36
  12,
37
- 'Unexpected number of requests made'
37
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
38
38
  );
39
39
  return;
40
40
  });
@@ -68,9 +68,9 @@ describe('transactionalEmail', () => {
68
68
  );
69
69
  // check number of API calls
70
70
  assert.equal(
71
- Object.values(testUtils.getAPIHistory()).flat().length,
72
- 13,
73
- 'Unexpected number of requests made'
71
+ testUtils.getAPIHistoryLength(),
72
+ 14,
73
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
74
74
  );
75
75
  return;
76
76
  });
@@ -110,9 +110,9 @@ describe('transactionalEmail', () => {
110
110
  'returned deployment JSON was not equal expected'
111
111
  );
112
112
  assert.equal(
113
- Object.values(testUtils.getAPIHistory()).flat().length,
113
+ testUtils.getAPIHistoryLength(),
114
114
  12,
115
- 'Unexpected number of requests made'
115
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
116
116
  );
117
117
  return;
118
118
  });
@@ -32,9 +32,9 @@ describe('transactionalPush', () => {
32
32
  'returned JSON was not equal expected'
33
33
  );
34
34
  assert.equal(
35
- Object.values(testUtils.getAPIHistory()).flat().length,
35
+ testUtils.getAPIHistoryLength(),
36
36
  3,
37
- 'Unexpected number of requests made'
37
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
38
38
  );
39
39
  return;
40
40
  });
@@ -68,9 +68,9 @@ describe('transactionalPush', () => {
68
68
  );
69
69
  // check number of API calls
70
70
  assert.equal(
71
- Object.values(testUtils.getAPIHistory()).flat().length,
72
- 4,
73
- 'Unexpected number of requests made'
71
+ testUtils.getAPIHistoryLength(),
72
+ 5,
73
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
74
74
  );
75
75
  return;
76
76
  });
@@ -110,9 +110,9 @@ describe('transactionalPush', () => {
110
110
  'returned deployment JSON was not equal expected'
111
111
  );
112
112
  assert.equal(
113
- Object.values(testUtils.getAPIHistory()).flat().length,
113
+ testUtils.getAPIHistoryLength(),
114
114
  3,
115
- 'Unexpected number of requests made'
115
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
116
116
  );
117
117
  return;
118
118
  });
@@ -39,9 +39,9 @@ describe('transactionalSMS', () => {
39
39
  file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'get', 'amp'))
40
40
  );
41
41
  assert.equal(
42
- Object.values(testUtils.getAPIHistory()).flat().length,
42
+ testUtils.getAPIHistoryLength(),
43
43
  4,
44
- 'Unexpected number of requests made'
44
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
45
45
  );
46
46
  return;
47
47
  });
@@ -85,9 +85,9 @@ describe('transactionalSMS', () => {
85
85
  );
86
86
  // check number of API calls
87
87
  assert.equal(
88
- Object.values(testUtils.getAPIHistory()).flat().length,
89
- 5,
90
- 'Unexpected number of requests made'
88
+ testUtils.getAPIHistoryLength(),
89
+ 6,
90
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
91
91
  );
92
92
  return;
93
93
  });
@@ -139,9 +139,9 @@ describe('transactionalSMS', () => {
139
139
  file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'build', 'amp'))
140
140
  );
141
141
  assert.equal(
142
- Object.values(testUtils.getAPIHistory()).flat().length,
142
+ testUtils.getAPIHistoryLength(),
143
143
  4,
144
- 'Unexpected number of requests made'
144
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
145
145
  );
146
146
  return;
147
147
  });
package/test/utils.js CHANGED
@@ -114,12 +114,29 @@ exports.mockSetup = (isDeploy) => {
114
114
  .reply((config) => resourceFactory.handleRESTRequest(config));
115
115
  const fsMockConf = {
116
116
  '.prettierrc': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.prettierrc')),
117
+ '.eslintrc': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.eslintrc')),
118
+ '.eslintignore': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.eslintignore')),
117
119
  '.mcdevrc.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdevrc.json')),
118
120
  '.mcdev-auth.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdev-auth.json')),
119
121
  'boilerplate/config.json': fsmock.load(
120
122
  path.resolve(__dirname, '../boilerplate/config.json')
121
123
  ),
122
124
  test: fsmock.load(path.resolve(__dirname)),
125
+ // the following node_modules are required for prettier's SQL parser to work
126
+ 'node_modules/prettier': fsmock.load(path.resolve(__dirname, '../node_modules/prettier')),
127
+ 'node_modules/prettier-plugin-sql': fsmock.load(
128
+ path.resolve(__dirname, '../node_modules/prettier-plugin-sql')
129
+ ),
130
+ 'node_modules/node-sql-parser': fsmock.load(
131
+ path.resolve(__dirname, '../node_modules/node-sql-parser')
132
+ ),
133
+ 'node_modules/big-integer': fsmock.load(
134
+ path.resolve(__dirname, '../node_modules/big-integer')
135
+ ),
136
+ 'node_modules/sql-formatter': fsmock.load(
137
+ path.resolve(__dirname, '../node_modules/sql-formatter')
138
+ ),
139
+ 'node_modules/nearley': fsmock.load(path.resolve(__dirname, '../node_modules/nearley')),
123
140
  };
124
141
  if (isDeploy) {
125
142
  // load files we manually prepared for a direct test of `deploy` command
@@ -138,12 +155,45 @@ exports.mockReset = () => {
138
155
  fsmock.restore();
139
156
  apimock.restore();
140
157
  };
158
+ /**
159
+ * helper to return amount of api callouts
160
+ *
161
+ * @param {boolean} [includeToken] if true, will include token calls in count
162
+ * @returns {object} of API history
163
+ */
164
+ exports.getAPIHistoryLength = (includeToken) => {
165
+ const historyArr = Object.values(apimock.history).flat();
166
+ if (includeToken) {
167
+ return historyArr.length;
168
+ }
169
+ return historyArr.filter((item) => item.url !== '/v2/token').length;
170
+ };
141
171
  /**
142
172
  * helper to return api history
143
173
  *
144
174
  * @returns {object} of API history
145
175
  */
146
176
  exports.getAPIHistory = () => apimock.history;
177
+ /**
178
+ * helper to return most important fields for each api call
179
+ *
180
+ * @returns {object} of API history
181
+ */
182
+ function getAPIHistoryDebug() {
183
+ const historyArr = Object.values(apimock.history)
184
+ .flat()
185
+ .map((item) => ({ url: item.url, data: item.data }));
186
+ return historyArr;
187
+ }
188
+ exports.getAPIHistoryDebug = getAPIHistoryDebug;
189
+ /**
190
+ * helper to return most important fields for each api call
191
+ *
192
+ * @returns {void} of API history
193
+ */
194
+ exports.logAPIHistoryDebug = () => {
195
+ console.log(getAPIHistoryDebug()); // eslint-disable-line no-console
196
+ };
147
197
 
148
198
  /**
149
199
  * escapes string for regex
package/types/mcdev.d.js CHANGED
@@ -24,6 +24,7 @@ const SDK = require('sfmc-sdk');
24
24
  * @typedef {{metadata:MetadataTypeMap,type:SupportedMetadataTypes}} MetadataTypeMapObj
25
25
  * @typedef {{metadata:MetadataTypeItem,type:SupportedMetadataTypes}} MetadataTypeItemObj
26
26
  * @typedef {Object.<number, MultiMetadataTypeMap>} Cache key=MID
27
+ * @typedef {{before: TYPE.MetadataTypeItem, after: TYPE.MetadataTypeItem}} MetadataTypeItemDiff used during update
27
28
  */
28
29
 
29
30
  /**