mcdev 7.0.3 → 7.0.4
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 +1 -0
- package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +1 -0
- package/.github/workflows/code-test.yml +48 -0
- package/.husky/pre-commit +1 -1
- package/@types/lib/Builder.d.ts +13 -13
- package/@types/lib/Builder.d.ts.map +1 -1
- package/@types/lib/Deployer.d.ts +16 -16
- package/@types/lib/Deployer.d.ts.map +1 -1
- package/@types/lib/Retriever.d.ts +15 -15
- package/@types/lib/Retriever.d.ts.map +1 -1
- package/@types/lib/cli.d.ts +1 -1
- package/@types/lib/cli.d.ts.map +1 -1
- package/@types/lib/index.d.ts +34 -34
- package/@types/lib/index.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Asset.d.ts +18 -43
- package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
- package/@types/lib/metadataTypes/AttributeGroup.d.ts +3 -8
- package/@types/lib/metadataTypes/AttributeGroup.d.ts.map +1 -1
- package/@types/lib/metadataTypes/AttributeSet.d.ts +5 -21
- package/@types/lib/metadataTypes/AttributeSet.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Automation.d.ts +36 -49
- package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Campaign.d.ts +11 -18
- package/@types/lib/metadataTypes/Campaign.d.ts.map +1 -1
- package/@types/lib/metadataTypes/ContentArea.d.ts +12 -31
- package/@types/lib/metadataTypes/ContentArea.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DataExtension.d.ts +23 -31
- package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DataExtensionField.d.ts +12 -18
- package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts +11 -11
- package/@types/lib/metadataTypes/DataExtensionTemplate.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DataExtract.d.ts +12 -28
- package/@types/lib/metadataTypes/DataExtract.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DataExtractType.d.ts +10 -10
- package/@types/lib/metadataTypes/DataExtractType.d.ts.map +1 -1
- package/@types/lib/metadataTypes/DeliveryProfile.d.ts +10 -10
- package/@types/lib/metadataTypes/DeliveryProfile.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Discovery.d.ts +10 -10
- package/@types/lib/metadataTypes/Discovery.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Email.d.ts +13 -34
- package/@types/lib/metadataTypes/Email.d.ts.map +1 -1
- package/@types/lib/metadataTypes/EmailSend.d.ts +10 -10
- package/@types/lib/metadataTypes/EmailSend.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Event.d.ts +19 -16
- package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
- package/@types/lib/metadataTypes/FileLocation.d.ts +10 -10
- package/@types/lib/metadataTypes/FileLocation.d.ts.map +1 -1
- package/@types/lib/metadataTypes/FileTransfer.d.ts +11 -18
- package/@types/lib/metadataTypes/FileTransfer.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Filter.d.ts +10 -10
- package/@types/lib/metadataTypes/Filter.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Folder.d.ts +10 -10
- package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
- package/@types/lib/metadataTypes/ImportFile.d.ts +11 -15
- package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Journey.d.ts +13 -32
- package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
- package/@types/lib/metadataTypes/List.d.ts +12 -12
- package/@types/lib/metadataTypes/List.d.ts.map +1 -1
- package/@types/lib/metadataTypes/MetadataType.d.ts +23 -23
- package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
- package/@types/lib/metadataTypes/MobileCode.d.ts +11 -20
- package/@types/lib/metadataTypes/MobileCode.d.ts.map +1 -1
- package/@types/lib/metadataTypes/MobileKeyword.d.ts +14 -14
- package/@types/lib/metadataTypes/MobileKeyword.d.ts.map +1 -1
- package/@types/lib/metadataTypes/MobileMessage.d.ts +14 -42
- package/@types/lib/metadataTypes/MobileMessage.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Query.d.ts +12 -12
- package/@types/lib/metadataTypes/Query.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Role.d.ts +11 -11
- package/@types/lib/metadataTypes/Role.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Script.d.ts +15 -24
- package/@types/lib/metadataTypes/Script.d.ts.map +1 -1
- package/@types/lib/metadataTypes/SendClassification.d.ts +10 -10
- package/@types/lib/metadataTypes/SendClassification.d.ts.map +1 -1
- package/@types/lib/metadataTypes/SenderProfile.d.ts +11 -19
- package/@types/lib/metadataTypes/SenderProfile.d.ts.map +1 -1
- package/@types/lib/metadataTypes/TransactionalEmail.d.ts +12 -12
- package/@types/lib/metadataTypes/TransactionalEmail.d.ts.map +1 -1
- package/@types/lib/metadataTypes/TransactionalMessage.d.ts +11 -32
- package/@types/lib/metadataTypes/TransactionalMessage.d.ts.map +1 -1
- package/@types/lib/metadataTypes/TransactionalPush.d.ts +12 -21
- package/@types/lib/metadataTypes/TransactionalPush.d.ts.map +1 -1
- package/@types/lib/metadataTypes/TransactionalSMS.d.ts +12 -18
- package/@types/lib/metadataTypes/TransactionalSMS.d.ts.map +1 -1
- package/@types/lib/metadataTypes/TriggeredSend.d.ts +13 -18
- package/@types/lib/metadataTypes/TriggeredSend.d.ts.map +1 -1
- package/@types/lib/metadataTypes/User.d.ts +22 -40
- package/@types/lib/metadataTypes/User.d.ts.map +1 -1
- package/@types/lib/metadataTypes/Verification.d.ts +13 -13
- package/@types/lib/metadataTypes/Verification.d.ts.map +1 -1
- package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +7 -1
- package/@types/lib/util/auth.d.ts +19 -18
- package/@types/lib/util/auth.d.ts.map +1 -1
- package/@types/lib/util/businessUnit.d.ts +17 -17
- package/@types/lib/util/businessUnit.d.ts.map +1 -1
- package/@types/lib/util/cache.d.ts +24 -32
- package/@types/lib/util/cache.d.ts.map +1 -1
- package/@types/lib/util/cli.d.ts +27 -27
- package/@types/lib/util/cli.d.ts.map +1 -1
- package/@types/lib/util/config.d.ts +20 -20
- package/@types/lib/util/config.d.ts.map +1 -1
- package/@types/lib/util/devops.d.ts +21 -21
- package/@types/lib/util/devops.d.ts.map +1 -1
- package/@types/lib/util/file.d.ts +179 -18
- package/@types/lib/util/file.d.ts.map +1 -1
- package/@types/lib/util/init.config.d.ts +19 -19
- package/@types/lib/util/init.config.d.ts.map +1 -1
- package/@types/lib/util/init.d.ts +20 -20
- package/@types/lib/util/init.d.ts.map +1 -1
- package/@types/lib/util/init.git.d.ts +2 -2
- package/@types/lib/util/init.git.d.ts.map +1 -1
- package/@types/lib/util/init.npm.d.ts +2 -2
- package/@types/lib/util/init.npm.d.ts.map +1 -1
- package/@types/lib/util/replaceContentBlockReference.d.ts +28 -28
- package/@types/lib/util/replaceContentBlockReference.d.ts.map +1 -1
- package/@types/lib/util/util.d.ts +33 -37
- package/@types/lib/util/util.d.ts.map +1 -1
- package/@types/types/mcdev.d.d.ts +73 -52
- package/@types/types/mcdev.d.d.ts.map +1 -1
- package/eslint.config.js +0 -1
- package/lib/Deployer.js +1 -1
- package/lib/Retriever.js +4 -1
- package/lib/cli.js +209 -278
- package/lib/index.js +89 -43
- package/lib/metadataTypes/Asset.js +1 -0
- package/lib/metadataTypes/DataExtension.js +3 -3
- package/lib/metadataTypes/DataExtensionField.js +0 -1
- package/lib/metadataTypes/Event.js +199 -35
- package/lib/metadataTypes/Folder.js +1 -1
- package/lib/metadataTypes/Journey.js +10 -2
- package/lib/metadataTypes/MetadataType.js +3 -4
- package/lib/metadataTypes/Role.js +9 -7
- package/lib/metadataTypes/SenderProfile.js +1 -0
- package/lib/metadataTypes/TransactionalEmail.js +2 -2
- package/lib/metadataTypes/TriggeredSend.js +1 -0
- package/lib/metadataTypes/User.js +31 -27
- package/lib/metadataTypes/definitions/Event.definition.js +8 -8
- package/lib/util/auth.js +0 -1
- package/lib/util/cli.js +0 -1
- package/lib/util/devops.js +2 -3
- package/lib/util/file.js +7 -10
- package/lib/util/replaceContentBlockReference.js +3 -1
- package/package.json +11 -9
- package/test/general.test.js +20 -2
- package/test/mockRoot/.mcdevrc.json +1 -1
- package/test/mockRoot/deploy/testInstance/testBU/event/testExisting_event.event-meta.json +201 -0
- package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withExistingDE.event-meta.json +232 -0
- package/test/mockRoot/deploy/testInstance/testBU/event/testNew_event_withSchema.event-meta.json +193 -0
- package/test/resources/9999999/dataExtension/retrieve-CustomerKey=testNew_event_withSchema-response.xml +50 -0
- package/test/resources/9999999/dataExtension/retrieve-createdViaEvent-response.xml +50 -0
- package/test/resources/9999999/dataExtension/retrieve-response.xml +48 -0
- package/test/resources/9999999/dataExtension/retrieve_event_withSchema-expected.json +219 -0
- package/test/resources/9999999/dataExtension/update-afterCreatedViaEvent-response.xml +55 -0
- package/test/resources/9999999/dataExtension/update-callout-afterCreatedViaEvent-expected.xml +1 -0
- package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_event_withSchema-response.xml +461 -0
- package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKeyINtestExisting_dataExtension,testNew_dataExtension-response.xml +133 -0
- package/test/resources/9999999/dataExtensionField/retrieve-response.xml +870 -0
- package/test/resources/9999999/event/build-expected.json +228 -0
- package/test/resources/9999999/event/get-expected.json +235 -0
- package/test/resources/9999999/event/post_withExistingDE-callout-expected.json +17 -0
- package/test/resources/9999999/event/post_withExistingDE-expected.json +21 -0
- package/test/resources/9999999/event/post_withSchema-callout-expected.json +196 -0
- package/test/resources/9999999/event/post_withSchema-expected.json +232 -0
- package/test/resources/9999999/event/put-callout-expected.json +202 -0
- package/test/resources/9999999/event/put-expected.json +233 -0
- package/test/resources/9999999/event/template-expected.json +228 -0
- package/test/resources/9999999/interaction/v1/eventDefinitions/get-response.json +252 -2
- package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/delete-response.txt +0 -0
- package/test/resources/9999999/interaction/v1/eventDefinitions/key_testExisting_event/put-response.json +241 -0
- package/test/resources/9999999/interaction/v1/eventDefinitions/post_withExistingDE-response.json +26 -0
- package/test/resources/9999999/interaction/v1/eventDefinitions/post_withSchema-response.json +241 -0
- package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/delete-response.txt +1 -0
- package/test/type.asset.test.js +0 -3
- package/test/type.automation.test.js +1 -1
- package/test/type.dataExtension.test.js +4 -4
- package/test/type.event.test.js +287 -6
- package/test/type.journey.test.js +13 -0
- package/test/type.user.test.js +1 -1
- package/test/utils.js +18 -6
- package/tsconfig.json +6 -1
- package/{jsconfig.json → tsconfig.npmScripts.json} +1 -1
- package/tsconfig.precommit.json +26 -0
- package/types/mcdev.d.js +12 -13
|
@@ -169,13 +169,15 @@ class Role extends MetadataType {
|
|
|
169
169
|
}
|
|
170
170
|
if (!metadata) {
|
|
171
171
|
try {
|
|
172
|
-
metadata =
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
172
|
+
metadata = (
|
|
173
|
+
await this.readBUMetadataForType(
|
|
174
|
+
File.normalizePath([
|
|
175
|
+
this.properties.directories.retrieve,
|
|
176
|
+
this.buObject.credential,
|
|
177
|
+
Util.parentBuName,
|
|
178
|
+
]),
|
|
179
|
+
true
|
|
180
|
+
)
|
|
179
181
|
).role;
|
|
180
182
|
} catch (ex) {
|
|
181
183
|
Util.logger.error(ex.message);
|
|
@@ -117,9 +117,9 @@ class TransactionalEmail extends TransactionalMessage {
|
|
|
117
117
|
/**
|
|
118
118
|
* Gets executed after deployment of metadata type
|
|
119
119
|
*
|
|
120
|
-
* @returns {void}
|
|
120
|
+
* @returns {Promise.<void>} -
|
|
121
121
|
*/
|
|
122
|
-
static postDeployTasks() {
|
|
122
|
+
static async postDeployTasks() {
|
|
123
123
|
if (this._createdJourneyKeys?.length) {
|
|
124
124
|
Util.logger.warn(
|
|
125
125
|
`Please download related journeys via: mcdev r ${this.buObject.credential}/${
|
|
@@ -340,7 +340,6 @@ class User extends MetadataType {
|
|
|
340
340
|
if (configs.length > 0) {
|
|
341
341
|
Util.logger.info('Deploying: BU assignment changes');
|
|
342
342
|
// run update
|
|
343
|
-
// @ts-expect-error bad jsodc in SFMC-SDK
|
|
344
343
|
const buResponse = await this.client.soap.configure('AccountUser', configs);
|
|
345
344
|
// process response
|
|
346
345
|
if (buResponse.OverallStatus === 'OK') {
|
|
@@ -745,6 +744,7 @@ class User extends MetadataType {
|
|
|
745
744
|
installedPackage: 0,
|
|
746
745
|
};
|
|
747
746
|
for (const id in savedMetadata) {
|
|
747
|
+
/** @typedef {UserDocument} */
|
|
748
748
|
const item = savedMetadata[id];
|
|
749
749
|
if (item.c__type === 'Installed Package') {
|
|
750
750
|
counter.installedPackage++;
|
|
@@ -974,13 +974,15 @@ class User extends MetadataType {
|
|
|
974
974
|
if (!metadata) {
|
|
975
975
|
// load users from disk if document was called directly and not part of a retrieve
|
|
976
976
|
try {
|
|
977
|
-
metadata =
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
977
|
+
metadata = (
|
|
978
|
+
await this.readBUMetadataForType(
|
|
979
|
+
File.normalizePath([
|
|
980
|
+
this.properties.directories.retrieve,
|
|
981
|
+
this.buObject.credential,
|
|
982
|
+
Util.parentBuName,
|
|
983
|
+
]),
|
|
984
|
+
true
|
|
985
|
+
)
|
|
984
986
|
).user;
|
|
985
987
|
} catch (ex) {
|
|
986
988
|
Util.logger.error(ex.message);
|
|
@@ -1015,7 +1017,9 @@ class User extends MetadataType {
|
|
|
1015
1017
|
}
|
|
1016
1018
|
const defaultBUName = this._getBuName(user.DefaultBusinessUnit);
|
|
1017
1019
|
const LastSuccessfulLogin = user.LastSuccessfulLogin.split('.')[0];
|
|
1020
|
+
|
|
1018
1021
|
users.push({
|
|
1022
|
+
...user, // keep that here to satisfy the type
|
|
1019
1023
|
TYPE: user.c__type,
|
|
1020
1024
|
UserID: user.UserID,
|
|
1021
1025
|
AccountUserID: user.c__AccountUserID,
|
|
@@ -1023,13 +1027,13 @@ class User extends MetadataType {
|
|
|
1023
1027
|
Name: user.Name,
|
|
1024
1028
|
Email: user.Email,
|
|
1025
1029
|
NotificationEmailAddress: user.NotificationEmailAddress,
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1030
|
+
ActiveFlagDocs: user.ActiveFlag === true ? '✓' : '-',
|
|
1031
|
+
IsLockedDocs: user.IsLocked === true ? '✓' : '-',
|
|
1032
|
+
IsAPIUserDocs: user.IsAPIUser === true ? '✓' : '-',
|
|
1033
|
+
MustChangePasswordDocs: user.MustChangePassword === true ? '✓' : '-',
|
|
1034
|
+
DefaultBusinessUnitDocs: defaultBUName,
|
|
1035
|
+
AssociatedBusDocs: associatedBus,
|
|
1036
|
+
RolesDocs: roles,
|
|
1033
1037
|
LastSuccessfulLogin: user.LastSuccessfulLogin
|
|
1034
1038
|
? // on create & update, LastSuccessfulLogin often gets overwritten with the current date
|
|
1035
1039
|
LastSuccessfulLogin === user.CreatedDate.split('.')[0] ||
|
|
@@ -1041,39 +1045,39 @@ class User extends MetadataType {
|
|
|
1041
1045
|
ModifiedDate: user.ModifiedDate ? user.ModifiedDate.split('T').join(' ') : 'n/a',
|
|
1042
1046
|
ModifiedBy: user.Client.ModifiedBy || 'n/a',
|
|
1043
1047
|
TimeZoneName: user.c__TimeZoneName.slice(1, 10),
|
|
1044
|
-
|
|
1048
|
+
c__LocaleCode: user.c__LocaleCode,
|
|
1045
1049
|
});
|
|
1046
1050
|
}
|
|
1047
1051
|
users.sort((a, b) => (a.Name < b.Name ? -1 : a.Name > b.Name ? 1 : 0));
|
|
1048
1052
|
const columnsToPrint = [
|
|
1049
1053
|
['Name', 'Name'],
|
|
1050
1054
|
['Last successful Login', 'LastSuccessfulLogin'],
|
|
1051
|
-
['Active', '
|
|
1052
|
-
['Access Locked out', '
|
|
1053
|
-
['API User', '
|
|
1054
|
-
['Must change PW', '
|
|
1055
|
-
['Default BU', '
|
|
1056
|
-
['BU Access', '
|
|
1057
|
-
['Roles', '
|
|
1055
|
+
['Active', 'ActiveFlagDocs'],
|
|
1056
|
+
['Access Locked out', 'IsLockedDocs'],
|
|
1057
|
+
['API User', 'IsAPIUserDocs'],
|
|
1058
|
+
['Must change PW', 'MustChangePasswordDocs'],
|
|
1059
|
+
['Default BU', 'DefaultBusinessUnitDocs'],
|
|
1060
|
+
['BU Access', 'AssociatedBusDocs'],
|
|
1061
|
+
['Roles', 'RolesDocs'],
|
|
1058
1062
|
['Login', 'UserID'],
|
|
1059
1063
|
['ID', 'AccountUserID'],
|
|
1060
1064
|
['Key', 'CustomerKey'],
|
|
1061
1065
|
['E-Mail', 'Email'],
|
|
1062
1066
|
['Notification E-Mail', 'NotificationEmailAddress'],
|
|
1063
1067
|
['Timezone', 'TimeZoneName'],
|
|
1064
|
-
['SFMC Locale', '
|
|
1068
|
+
['SFMC Locale', 'c__LocaleCode'],
|
|
1065
1069
|
['Modified Date', 'ModifiedDate'],
|
|
1066
1070
|
['Modified By', 'ModifiedBy'],
|
|
1067
1071
|
['Created Date', 'CreatedDate'],
|
|
1068
1072
|
];
|
|
1069
1073
|
let output = `# User Overview - ${this.buObject.credential}`;
|
|
1070
1074
|
output += this._generateDocMd(
|
|
1071
|
-
users.filter((user) => user.TYPE === 'User' && user.
|
|
1075
|
+
users.filter((user) => user.TYPE === 'User' && user.ActiveFlagDocs === '✓'),
|
|
1072
1076
|
'User',
|
|
1073
1077
|
columnsToPrint
|
|
1074
1078
|
);
|
|
1075
1079
|
output += this._generateDocMd(
|
|
1076
|
-
users.filter((user) => user.TYPE === 'User' && user.
|
|
1080
|
+
users.filter((user) => user.TYPE === 'User' && user.ActiveFlagDocs === '-'),
|
|
1077
1081
|
'Inactivated User',
|
|
1078
1082
|
columnsToPrint
|
|
1079
1083
|
);
|
|
@@ -1124,7 +1128,7 @@ class User extends MetadataType {
|
|
|
1124
1128
|
/**
|
|
1125
1129
|
* manages post retrieve steps
|
|
1126
1130
|
*
|
|
1127
|
-
* @param {
|
|
1131
|
+
* @param {UserDocument} metadata a single item
|
|
1128
1132
|
* @returns {MetadataTypeItem | void} a single item
|
|
1129
1133
|
*/
|
|
1130
1134
|
static postRetrieveTasks(metadata) {
|
|
@@ -279,12 +279,12 @@ export default {
|
|
|
279
279
|
// retrieving: false,
|
|
280
280
|
// template: false,
|
|
281
281
|
// },
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
282
|
+
'configurationArguments.unconfigured': {
|
|
283
|
+
isCreateable: false,
|
|
284
|
+
isUpdateable: false,
|
|
285
|
+
retrieving: false,
|
|
286
|
+
template: false,
|
|
287
|
+
},
|
|
288
288
|
// 'configurationArguments.version': {
|
|
289
289
|
// isCreateable: false,
|
|
290
290
|
// isUpdateable: false,
|
|
@@ -928,7 +928,7 @@ export default {
|
|
|
928
928
|
template: false,
|
|
929
929
|
},
|
|
930
930
|
'schema.name': {
|
|
931
|
-
isCreateable:
|
|
931
|
+
isCreateable: true,
|
|
932
932
|
isUpdateable: true,
|
|
933
933
|
retrieving: false,
|
|
934
934
|
template: false,
|
|
@@ -963,7 +963,7 @@ export default {
|
|
|
963
963
|
retrieving: true,
|
|
964
964
|
template: true,
|
|
965
965
|
},
|
|
966
|
-
|
|
966
|
+
r__dataExtension_key: {
|
|
967
967
|
isCreateable: false,
|
|
968
968
|
isUpdateable: false,
|
|
969
969
|
retrieving: true,
|
package/lib/util/auth.js
CHANGED
|
@@ -42,7 +42,6 @@ const Auth = {
|
|
|
42
42
|
const sdk = setupSDK(credential, authObject);
|
|
43
43
|
try {
|
|
44
44
|
// check credentials to allow clear log output and stop execution
|
|
45
|
-
// @ts-expect-error - params are optional but jsdoc in SFMC-SDK says otherwise
|
|
46
45
|
const test = await sdk.auth.getAccessToken();
|
|
47
46
|
if (test.error) {
|
|
48
47
|
throw new Error(test.error_description);
|
package/lib/util/cli.js
CHANGED
package/lib/util/devops.js
CHANGED
|
@@ -74,7 +74,6 @@ const DevOps = {
|
|
|
74
74
|
name: commit.date + ' / ' + commit.message + ' / ' + commit.author_name,
|
|
75
75
|
value: commit.hash,
|
|
76
76
|
}));
|
|
77
|
-
// @ts-expect-error type checking this push() makes things very complicated...
|
|
78
77
|
display.push(new inquirer.Separator(' ==== '));
|
|
79
78
|
|
|
80
79
|
const responses = await inquirer.prompt([
|
|
@@ -99,6 +98,7 @@ const DevOps = {
|
|
|
99
98
|
/**
|
|
100
99
|
* @type {DeltaPkgItem[]}
|
|
101
100
|
*/
|
|
101
|
+
// @ts-expect-error TODO LATER
|
|
102
102
|
const delta = (await git.diffSummary([range])).files
|
|
103
103
|
// populate additional info for all changed files
|
|
104
104
|
.map((/** @type {DeltaPkgItem} */ file) => {
|
|
@@ -317,7 +317,7 @@ const DevOps = {
|
|
|
317
317
|
const copied = delta
|
|
318
318
|
.filter((file) => !file.file.endsWith('.md')) // filter documentation files
|
|
319
319
|
.map((file) =>
|
|
320
|
-
File.
|
|
320
|
+
File.copyFileSimple(
|
|
321
321
|
file.file,
|
|
322
322
|
path
|
|
323
323
|
.normalize(file.file)
|
|
@@ -561,7 +561,6 @@ const DevOps = {
|
|
|
561
561
|
for (let i = 1; i < tabled.length; i++) {
|
|
562
562
|
for (let field of tabled[i]) {
|
|
563
563
|
if (field !== '') {
|
|
564
|
-
// @ts-expect-error bad typing in jsonToTable
|
|
565
564
|
field = field === true ? '✓' : field === false ? '✗' : field;
|
|
566
565
|
output += `| ${field} `;
|
|
567
566
|
}
|
package/lib/util/file.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/* eslint-disable no-control-regex */
|
|
2
1
|
'use strict';
|
|
3
|
-
|
|
4
2
|
import fs from 'fs-extra';
|
|
5
3
|
|
|
6
4
|
import path from 'node:path';
|
|
@@ -50,7 +48,7 @@ const File = {
|
|
|
50
48
|
* @param {string} to - full filepath including name where file should go
|
|
51
49
|
* @returns {Promise.<{status:'ok'|'skipped'|'failed', statusMessage:string, file:string}>} - results object
|
|
52
50
|
*/
|
|
53
|
-
async
|
|
51
|
+
async copyFileSimple(from, to) {
|
|
54
52
|
try {
|
|
55
53
|
await fs.copy(from, to);
|
|
56
54
|
return { status: 'ok', statusMessage: null, file: from };
|
|
@@ -321,6 +319,7 @@ const File = {
|
|
|
321
319
|
|
|
322
320
|
// save prettier errror into log file
|
|
323
321
|
// Note: we have to filter color codes from prettier's error message before saving it to file
|
|
322
|
+
/* eslint-disable no-control-regex */
|
|
324
323
|
this.writeToFile(
|
|
325
324
|
directory,
|
|
326
325
|
filename + '.error',
|
|
@@ -331,6 +330,7 @@ const File = {
|
|
|
331
330
|
''
|
|
332
331
|
)}`
|
|
333
332
|
);
|
|
333
|
+
/* eslint-enable no-control-regex */
|
|
334
334
|
|
|
335
335
|
formatted = content;
|
|
336
336
|
}
|
|
@@ -371,7 +371,7 @@ const File = {
|
|
|
371
371
|
* @param {string | string[]} directory directory where the file is stored
|
|
372
372
|
* @param {string} filename name of the file without '.json' ending
|
|
373
373
|
* @param {boolean} cleanPath filters illegal chars if true
|
|
374
|
-
* @returns {Promise.<object
|
|
374
|
+
* @returns {Promise.<object | object | void>} Promise or JSON object depending on if async or not; void on error
|
|
375
375
|
*/
|
|
376
376
|
readJSONFile: async function (directory, filename, cleanPath) {
|
|
377
377
|
try {
|
|
@@ -409,11 +409,8 @@ const File = {
|
|
|
409
409
|
try {
|
|
410
410
|
directory = this.filterIllegalPathChars(this.normalizePath(directory));
|
|
411
411
|
filename = this.filterIllegalFilenames(filename);
|
|
412
|
-
// @ts-expect-error
|
|
413
|
-
return
|
|
414
|
-
path.join(directory, filename + '.' + filetype),
|
|
415
|
-
encoding || 'utf8'
|
|
416
|
-
);
|
|
412
|
+
// @ts-expect-error somehow, the typing for fs-extra is not correct
|
|
413
|
+
return fs.readFile(path.join(directory, filename + '.' + filetype), encoding || 'utf8');
|
|
417
414
|
} catch (ex) {
|
|
418
415
|
Util.logger.debug('File.readFilteredFilename:: error | ' + ex.message);
|
|
419
416
|
}
|
|
@@ -574,6 +571,6 @@ const File = {
|
|
|
574
571
|
}
|
|
575
572
|
},
|
|
576
573
|
};
|
|
577
|
-
const FileFs = { ...fs, ...File };
|
|
578
574
|
|
|
575
|
+
const FileFs = Object.assign(fs, File);
|
|
579
576
|
export default FileFs;
|
|
@@ -93,6 +93,7 @@ export default class ReplaceContentBlockReference {
|
|
|
93
93
|
static replaceReference(str, parentName, fromList, to) {
|
|
94
94
|
if (!str) {
|
|
95
95
|
const ex = new Error('No string provided');
|
|
96
|
+
// @ts-expect-error custom error object
|
|
96
97
|
ex.code = 200;
|
|
97
98
|
throw ex;
|
|
98
99
|
}
|
|
@@ -133,6 +134,7 @@ export default class ReplaceContentBlockReference {
|
|
|
133
134
|
}
|
|
134
135
|
if (!changes) {
|
|
135
136
|
const ex = new Error('No changes made to the code.');
|
|
137
|
+
// @ts-expect-error custom error object
|
|
136
138
|
ex.code = 200;
|
|
137
139
|
throw ex;
|
|
138
140
|
}
|
|
@@ -158,7 +160,7 @@ export default class ReplaceContentBlockReference {
|
|
|
158
160
|
break;
|
|
159
161
|
}
|
|
160
162
|
case 'name': {
|
|
161
|
-
if (isSsjs) {
|
|
163
|
+
if (isSsjs && typeof identifier === 'string') {
|
|
162
164
|
identifier = identifier.replaceAll('\\\\', '\\');
|
|
163
165
|
}
|
|
164
166
|
reference = ReplaceContentBlockReference.assetCacheMap.name[identifier];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcdev",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.4",
|
|
4
4
|
"description": "Accenture Salesforce Marketing Cloud DevTools",
|
|
5
5
|
"author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
|
|
6
6
|
"license": "MIT",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"debug": "node --nolazy --inspect-brk=9229 lib/cli.js",
|
|
55
55
|
"lint:fix": "eslint --fix lib/**/*.js types/*.js test/**/*.js",
|
|
56
56
|
"lint": "eslint lib/**/*.js types/*.js test/**/*.js",
|
|
57
|
-
"lint-ts": "tsc -p
|
|
57
|
+
"lint-ts": "tsc -p tsconfig.npmScripts.json",
|
|
58
58
|
"prepare": "husky || true",
|
|
59
59
|
"lint-and-test": "run-s lint test",
|
|
60
60
|
"test": "mocha --reporter-option maxDiffSize=25000",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"prettier": "3.3.2",
|
|
79
79
|
"prettier-plugin-sql": "0.18.0",
|
|
80
80
|
"semver": "7.6.0",
|
|
81
|
-
"sfmc-sdk": "2.
|
|
81
|
+
"sfmc-sdk": "2.1.1",
|
|
82
82
|
"simple-git": "3.25.0",
|
|
83
83
|
"toposort": "2.0.2",
|
|
84
84
|
"update-notifier": "7.0.0",
|
|
@@ -87,8 +87,10 @@
|
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"@eslint/js": "9.6.0",
|
|
90
|
-
"@types/
|
|
90
|
+
"@types/fs-extra": "11.0.4",
|
|
91
|
+
"@types/mocha": "10.0.7",
|
|
91
92
|
"@types/node": "20.14.9",
|
|
93
|
+
"@types/yargs": "17.0.32",
|
|
92
94
|
"assert": "2.1.0",
|
|
93
95
|
"axios-mock-adapter": "1.22.0",
|
|
94
96
|
"c8": "10.0.0",
|
|
@@ -97,19 +99,19 @@
|
|
|
97
99
|
"eslint": "9.6.0",
|
|
98
100
|
"eslint-config-prettier": "9.1.0",
|
|
99
101
|
"eslint-config-ssjs": "2.0.0",
|
|
100
|
-
"eslint-plugin-jsdoc": "48.2
|
|
102
|
+
"eslint-plugin-jsdoc": "48.5.2",
|
|
101
103
|
"eslint-plugin-mocha": "10.4.3",
|
|
102
104
|
"eslint-plugin-prettier": "5.1.2",
|
|
103
|
-
"eslint-plugin-unicorn": "
|
|
105
|
+
"eslint-plugin-unicorn": "54.0.0",
|
|
104
106
|
"fast-xml-parser": "4.4.0",
|
|
105
|
-
"globals": "15.
|
|
107
|
+
"globals": "15.8.0",
|
|
106
108
|
"husky": "9.0.11",
|
|
107
109
|
"lint-staged": "15.2.7",
|
|
108
|
-
"mocha": "10.
|
|
110
|
+
"mocha": "10.6.0",
|
|
109
111
|
"mock-fs": "5.2.0",
|
|
110
112
|
"npm-run-all": "4.1.5",
|
|
111
113
|
"prettier-eslint": "16.3.0",
|
|
112
|
-
"typescript": "5.
|
|
114
|
+
"typescript": "5.5.3"
|
|
113
115
|
},
|
|
114
116
|
"optionalDependencies": {
|
|
115
117
|
"fsevents": "*"
|
package/test/general.test.js
CHANGED
|
@@ -461,8 +461,8 @@ describe('GENERAL', () => {
|
|
|
461
461
|
);
|
|
462
462
|
assert.equal(
|
|
463
463
|
Object.keys(result[buName]['dataExtension']).length,
|
|
464
|
-
|
|
465
|
-
'retrieve should have returned
|
|
464
|
+
7,
|
|
465
|
+
'retrieve should have returned 7 dataExtension'
|
|
466
466
|
);
|
|
467
467
|
assert.equal(
|
|
468
468
|
Object.keys(result[buName]['dataExtract']).length,
|
|
@@ -1191,6 +1191,24 @@ describe('GENERAL', () => {
|
|
|
1191
1191
|
);
|
|
1192
1192
|
});
|
|
1193
1193
|
});
|
|
1194
|
+
|
|
1195
|
+
describe('Delete --metadata ~~~', () => {
|
|
1196
|
+
it('Should delete the item', async () => {
|
|
1197
|
+
const argvMetadata = [
|
|
1198
|
+
'asset:testExisting_asset',
|
|
1199
|
+
'automation:testExisting_automation',
|
|
1200
|
+
'journey:testExisting_journey_Quicksend/1',
|
|
1201
|
+
'journey:testExisting_journey_Multistep/1',
|
|
1202
|
+
];
|
|
1203
|
+
const typeKeyCombo = handler.metadataToTypeKey(argvMetadata);
|
|
1204
|
+
// WHEN
|
|
1205
|
+
const isDeleted = await handler.deleteByKey('testInstance/testBU', typeKeyCombo);
|
|
1206
|
+
// THEN
|
|
1207
|
+
assert.equal(process.exitCode, 0, 'deleteByKey should not have thrown an error');
|
|
1208
|
+
assert.equal(isDeleted, true, 'deleteByKey should have returned true');
|
|
1209
|
+
return;
|
|
1210
|
+
});
|
|
1211
|
+
});
|
|
1194
1212
|
});
|
|
1195
1213
|
|
|
1196
1214
|
describe('without --metadata ================', () => {
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "APIEvent",
|
|
3
|
+
"name": "testExisting_event",
|
|
4
|
+
"description": "updated on deploy",
|
|
5
|
+
"mode": "Production",
|
|
6
|
+
"eventDefinitionKey": "testExisting_event",
|
|
7
|
+
"schema": {
|
|
8
|
+
"fields": [
|
|
9
|
+
{
|
|
10
|
+
"name": "ContactId",
|
|
11
|
+
"dataType": "Text",
|
|
12
|
+
"maxLength": 18,
|
|
13
|
+
"isNullable": false,
|
|
14
|
+
"isPrimaryKey": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "Type",
|
|
18
|
+
"dataType": "Text",
|
|
19
|
+
"maxLength": "50",
|
|
20
|
+
"isNullable": false,
|
|
21
|
+
"isPrimaryKey": false
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "Status",
|
|
25
|
+
"dataType": "Text",
|
|
26
|
+
"maxLength": "50",
|
|
27
|
+
"isNullable": false,
|
|
28
|
+
"isPrimaryKey": true
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "Respondent",
|
|
32
|
+
"dataType": "Text",
|
|
33
|
+
"maxLength": "256",
|
|
34
|
+
"isNullable": true,
|
|
35
|
+
"isPrimaryKey": false
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "FirstName",
|
|
39
|
+
"dataType": "Text",
|
|
40
|
+
"maxLength": "256",
|
|
41
|
+
"isNullable": true,
|
|
42
|
+
"isPrimaryKey": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "LastName",
|
|
46
|
+
"dataType": "Text",
|
|
47
|
+
"maxLength": "256",
|
|
48
|
+
"isNullable": true,
|
|
49
|
+
"isPrimaryKey": false
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "PreferredLanguage",
|
|
53
|
+
"dataType": "Text",
|
|
54
|
+
"maxLength": "50",
|
|
55
|
+
"isNullable": true,
|
|
56
|
+
"isPrimaryKey": false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "TouchPoint",
|
|
60
|
+
"dataType": "Text",
|
|
61
|
+
"maxLength": "256",
|
|
62
|
+
"isNullable": true,
|
|
63
|
+
"isPrimaryKey": false
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "Datestamp",
|
|
67
|
+
"dataType": "Date",
|
|
68
|
+
"defaultValue": "GetDate()",
|
|
69
|
+
"isNullable": true,
|
|
70
|
+
"isPrimaryKey": false
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "StartDate",
|
|
74
|
+
"dataType": "Date",
|
|
75
|
+
"isNullable": true,
|
|
76
|
+
"defaultValue": "",
|
|
77
|
+
"isPrimaryKey": false
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "EndDate",
|
|
81
|
+
"dataType": "Date",
|
|
82
|
+
"isNullable": true,
|
|
83
|
+
"isPrimaryKey": false
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "BroadcastedNotificationDate",
|
|
87
|
+
"dataType": "Date",
|
|
88
|
+
"isNullable": true,
|
|
89
|
+
"defaultValue": "",
|
|
90
|
+
"isPrimaryKey": false
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "FirstReminderDate",
|
|
94
|
+
"dataType": "Date",
|
|
95
|
+
"isNullable": true,
|
|
96
|
+
"isPrimaryKey": false
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "SecondReminderDate",
|
|
100
|
+
"dataType": "Date",
|
|
101
|
+
"isNullable": true,
|
|
102
|
+
"isPrimaryKey": false
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "Title",
|
|
106
|
+
"dataType": "Text",
|
|
107
|
+
"maxLength": "256",
|
|
108
|
+
"isNullable": true,
|
|
109
|
+
"isPrimaryKey": false
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "DisplayName",
|
|
113
|
+
"dataType": "Text",
|
|
114
|
+
"maxLength": "256",
|
|
115
|
+
"isNullable": true,
|
|
116
|
+
"isPrimaryKey": false
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"name": "Text",
|
|
120
|
+
"dataType": "Text",
|
|
121
|
+
"maxLength": "256",
|
|
122
|
+
"isNullable": true,
|
|
123
|
+
"isPrimaryKey": false
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "Description",
|
|
127
|
+
"dataType": "Text",
|
|
128
|
+
"maxLength": "4000",
|
|
129
|
+
"isNullable": true,
|
|
130
|
+
"isPrimaryKey": false
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "Channel",
|
|
134
|
+
"dataType": "Text",
|
|
135
|
+
"maxLength": "256",
|
|
136
|
+
"isNullable": true,
|
|
137
|
+
"isPrimaryKey": false
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "FirstReminderChannel",
|
|
141
|
+
"dataType": "Text",
|
|
142
|
+
"maxLength": "256",
|
|
143
|
+
"isNullable": true,
|
|
144
|
+
"isPrimaryKey": false
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "SecondReminderChannel",
|
|
148
|
+
"dataType": "Text",
|
|
149
|
+
"maxLength": "256",
|
|
150
|
+
"isNullable": true,
|
|
151
|
+
"isPrimaryKey": false
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "Email",
|
|
155
|
+
"dataType": "Email",
|
|
156
|
+
"maxLength": "",
|
|
157
|
+
"isNullable": true,
|
|
158
|
+
"isPrimaryKey": false
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "ArticleOrTaskID",
|
|
162
|
+
"dataType": "Text",
|
|
163
|
+
"maxLength": "18",
|
|
164
|
+
"isNullable": false,
|
|
165
|
+
"isPrimaryKey": true
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "Points",
|
|
169
|
+
"dataType": "Number",
|
|
170
|
+
"maxLength": "",
|
|
171
|
+
"isNullable": true,
|
|
172
|
+
"isPrimaryKey": false
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"name": "TaskType",
|
|
176
|
+
"dataType": "Text",
|
|
177
|
+
"maxLength": "255",
|
|
178
|
+
"isNullable": true,
|
|
179
|
+
"isPrimaryKey": false
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "TaskArea",
|
|
183
|
+
"dataType": "Text",
|
|
184
|
+
"maxLength": "255",
|
|
185
|
+
"isNullable": true,
|
|
186
|
+
"isPrimaryKey": false
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "AddedField",
|
|
190
|
+
"dataType": "Text",
|
|
191
|
+
"maxLength": "255",
|
|
192
|
+
"isNullable": true,
|
|
193
|
+
"isPrimaryKey": false
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
"sendableCustomObjectField": "ContactId",
|
|
197
|
+
"sendableSubscriberField": "_SubscriberKey"
|
|
198
|
+
},
|
|
199
|
+
"isVisibleInPicker": true,
|
|
200
|
+
"r__dataExtension_key": "testExisting_event - 2024-07-05T080154625"
|
|
201
|
+
}
|