Releases: Accenture/sfmc-devtools
v7.5.0
Features
- #37 add support to
deploy
(update/create) automation wait activities by @JoernBerkefeld in #1829 - #1729 option to disable auto-formatting on save via config (
options.formatOnSave
) and--no-format
option for when you want or need to retain whatever manual formatting you applied. inspired by @AndrewEllis91, code by @JoernBerkefeld in #1846 - #1850 add method
validate journey
for multi-step journeys by @JoernBerkefeld in #1860 - #1851 add
--ignoreFolder
option todeploy --matchName
by @JoernBerkefeld in #1863 - #1852 add option
--ignoreSfFields
/--isf
to deploy, allowing you to skip false-positive errors about missing Salesforce fields for Salesforce-triggered journeys/events by @JoernBerkefeld in #1864 - #1294 include dataExtension retention policy in the created markdown file by @JoernBerkefeld in #1865
- #1825 add auto-renaming to avoid duplicate-name error for automation, query and senderProfile if
deployed
without--matchName
. This already existed for dataExtension and asset before. by @JoernBerkefeld in #1827
Bugfixes
- #1802
publishing
multiple non-Salesforce-triggered journeys looked messy by @JoernBerkefeld in #1817 - #1806 fix
createDeltaPackage
failing due to incorrect call tobuildTemplate
by @dnivara-0 and @JoernBerkefeld in #1821 - #1868 fix
createDeltaPackage
failing due to incorrect call tobuildDefinitionBulk
by @anasilva105 and @JoernBerkefeld in #1869 - #1826 fix importFile no longer deployable since last SFMC release by @JoernBerkefeld in #1828
- #1839 limit
noRootFolder validation rule
to types other than cloudpages by @JoernBerkefeld in #1843 - #1866 fix
buildTemplate
/buildDefintiion
/build
creating SSJS files with unwanted <script> tags by @PriyajitGhosh1995 & @JoernBerkefeld in #1867 - #1805 move purge-deploy-folder logic to handle multi-type templating with
build
by @JoernBerkefeld in #1820
Chores
- #1805
build
now asks if the BU's deploy folder should be emptied before runningbuildDefinition
, making it easier to run a clean deployment afterwards by @JoernBerkefeld in #1815 - #1814 filter journey builder triggeredSends from being saved to disk as all relevant info is also present in the journey itself by @JoernBerkefeld in #1816
- #1818 no longer include triggeredSend keys in templated journeys to ensure the resulting journey metadata shows most current info. Otherwise, journey builder will reference the latest triggeredSend but show the info from the first version of it instead. by @JoernBerkefeld in #1819
- #1808 set newly introduced iconUrl of events during
deploy
/retrieve
by @JoernBerkefeld in #1822 - #1800 improved error messages issues by
deploy
in general and bydeploy --matchName
errors by @JoernBerkefeld in #1823 - #1842 groundwork for supporting automation-triggered events by resolving the
automationid
in event by @JoernBerkefeld in #1845 - #1807 cross-check salesforce-triggered events with associated dataExtensions to ensure all required fields are present by @JoernBerkefeld in #1849
Dependencies
- Bump @types/node from 22.5.5 to 22.9.0 by @dependabot in #1862
- Bump axios-mock-adapter from 2.0.0 to 2.1.0 by @dependabot in #1789
- Bump eslint-plugin-jsdoc from 50.2.4 to 50.5.0 by @dependabot in #1773 & #1870
- Bump eslint-plugin-unicorn from 55.0.0 to 56.0.0 by @dependabot in #1777
- Bump globals from 15.9.0 to 15.12.0 by @dependabot in #1832
- Bump inquirer from 11.0.2 to 12.1.0 by @dependabot in #1861
- Bump mock-fs from 5.2.0 to 5.3.0 by @dependabot in #1756
- Bump simple-git from 3.25.0 to 3.27.0 by @dependabot in #1733
- Bump typescript from 5.6.2 to 5.6.3 by @dependabot in #1783
- Bump winston from 3.14.2 to 3.15.0 by @dependabot in #1775
- Bump yocto-spinner from 0.1.0 to 0.1.1 by @dependabot in #1786
Full Changelog: v7.4.4...v7.5.0
Details
Standard Commands
retrieve
Command: mcdev retrieve [business unit] [metadata type] [metadata key] [--like] [--metadata] [--format] [--no-format]
...
retrieve with --format or --no-format option:
If you need to retrieve code in a raw format, you may use mcdev retrieve --no-format
to disable auto-formatting. On the other hand, if options.formatOnSave
is set to false, then mcdev retrieve --format
enables formatting.
deploy
Command: mcdev deploy [business unit] [metadata type] [metadata key] [--metadata] [--fromRetrieve] [--refresh] [--keySuffix] [--noMidSuffix] [--changeKeyValue=yourNewKey] [--changeKeyField=otherFieldInJson] [--execute] [--schedule] [--fixShared] [--noUpdate] [--publish] [--skipStatusCheck] [--matchName] [--ignoreFolder] [--skipValidation] [--format] [--no-format] [--ignoreSfFields]
...
deploy with --format or --no-format option:
After deploying, the deployed item is saved in the respective retrieve folder. If you need to retrieve code in a raw format, you may use mcdev deploy --no-format
to disable auto-formatting. On the other hand, if options.formatOnSave
is set to false, then mcdev deploy --format
enables formatting.
deploy with --matchName (and --ignoreFolder):
...
If running --matchName returns many single matches but the found items reside in a different folder, using --ignoreFolder lets you still override these items automatically, easing your cleanup job. So far, this is supported for dataExtensions only.
deploy with --ignoreSfFields:
When deploying Salesforce-triggered journeys you might encounter false positives regarding missing fields for a Salesforce object. In these cases, the option --ignoreSfFields allows you to reduce the error to a warning and deploy it.
validate
Command: mcdev validate <business unit> [metadata type] [metadata key] [--like] [--metadata]
Alias: n/a
Currently supported types:
Name | CLI Argument | Effect |
---|---|---|
Journey | journey |
Validates a Draft-version of a journey |
You can validate a draft journey using this command, without having to actually publish it. This is the same as clicking on the Validate-button in the web interface.
mcdev validate cred/bu journey myJourneyKey
mcdev validate cred/bu journey id:myJourneyId
mcdev validate cred/bu -m journey:myJourneyKey -m journey:id:myJourneyId
Advanced Configuration
Config Options
Setting | Default | Description |
---|---|---|
options.formatOnSave | true | Allows disabling auto-formatting for all retrieve/deploy operations |
v7.4.4
Bugfixes
- #1761 fix validation rules for deploy and ensure they work on a clone by @JoernBerkefeld in #1762
- #1763 correctly cache transactionalEmail during journey deployment by @JoernBerkefeld in #1764
Chores
- #1748 resolve send classification in transactionalemail by @JoernBerkefeld in #1755
- #1749 update journey with data from transactionalEmail by @JoernBerkefeld in #1760
- #1754 add new validation rule to warn about ampscript getting wrapped in script tags by @JoernBerkefeld in #1766
Full Changelog: v7.4.3...v7.4.4
v7.4.3
Bugfixes
- #1738 stop if all publish actions failed and do not re-retrieve
journey
&transactionalEmails
by @JoernBerkefeld in #1739 - #1740 fix javascript error for ccEmail by adding missing preDeployment handling for
journey
activities by @JoernBerkefeld in #1741 - #1742 correctly retrieve all related
transactionalEmails
after publishing a transactional sendjourney
instead of just the first one by @JoernBerkefeld in #1744 - #1323 ensure newly mcdev-created
senderProfiles
are selectable in journey message configuration by @JoernBerkefeld in #1745
Chores
- #1730 resolve
deliveryProfile
injourneys
by @JoernBerkefeld in #1731 - #1708 resolve createdby and modifiedby user ids on
dataExtract
,event
,senderProfile
andverification
by @JoernBerkefeld in #1737 - #1726 improve linting for .mcdev-validations.js by @JoernBerkefeld in #1727
- #1750 improve debug logging for .mcdev-validations.js by @JoernBerkefeld in #1751
Full Changelog: v7.4.2...v7.4.3
v7.4.2
Bugfixes
- #1717
--skipValidation
does not work for retrieve by @JoernBerkefeld in #1718 - #126
folders
saved to retrieve during deploy even if not listed for retrieval by @JoernBerkefeld in #1720
Chores
- #1716 update
journey
-triggeredSendStatus and suppressTracking by @JoernBerkefeld and @SanskarVaidya in #1719 - #1721 disable auto-opening markdown renderer to enable VSCode's diff viewer for git by @JoernBerkefeld in #1722
Dependencies
- Bump @types/node from 22.5.4 to 22.5.5 by @dependabot in #1711
- Bump @types/mocha from 10.0.7 to 10.0.8 by @dependabot in #1714
- Bump husky from 9.1.5 to 9.1.6 by @dependabot in #1712
- Bump inquirer from 10.2.2 to 11.0.2 by @dependabot in #1724
- Bump eslint-plugin-jsdoc from 50.2.2 to 50.2.4 by @dependabot in #1723
Full Changelog: v7.4.1...v7.4.2
v7.4.1
Bugfixes
- #1676 graceful handling of "key not found" error for
journey
andevent
by @JoernBerkefeld in #1677 - #1177 make
dataExtension
-field add/update check case insensitive and remove redundant caching by @JoernBerkefeld in #1694 - #1690 show info how to fix mcdev-config issues in VSCE logs by @JoernBerkefeld and @Dipasree-ghosh in #1696
- #1692 don't flag common-vs-contact issue on currently running (active/published)
journeys
andevents
by @JoernBerkefeld and @Dipasree-ghosh in #1698 - #1545 fix "Upserting folder failed"-error by cleaning up the auto-created
folder
-directory before each deployment by @JoernBerkefeld in #1701
Chores
- #1679 gitignore .BAK files in project folders. These get created by mcdev upgrade. by @JoernBerkefeld in #1691
- #1695 properly warn about potentially missing SF object access and how to fix it in
journey
andevent
by @JoernBerkefeld in #1697 - #1680 list CC and BCC values on
journey
email activities as arrays and remove them fromtriggeredSend
(because those fields were always returned empty by the API) by @JoernBerkefeld in #1699 - #1674 ensure
journey
activities and entry-event
fields are sorted alphabetically to ease pull request reviews by @JoernBerkefeld in #1700
Dependencies
- Bump @eslint/js from 9.9.0 to 9.10.0 by @dependabot in #1684
- Bump @types/node from 22.4.2 to 22.5.4 by @dependabot in #1686
- Bump eslint from 9.9.0 to 9.10.0 by @dependabot in #1687
- Bump inquirer from 10.1.8 to 10.2.2 by @dependabot in #1683
- Bump lint-staged from 15.2.9 to 15.2.10 by @dependabot in #1655
- Bump typescript from 5.5.4 to 5.6.2 by @dependabot in #1688
- Bump update-notifier from 7.2.0 to 7.3.1 by @dependabot in #1682
Special Thanks
Thank you to community member @Dipasree-ghosh for supporting the research around how common-fields are used in Salesforce-triggered journeys (#1692) and for pointing out an issue regarding missing hints for how to fix config issues when the command was run via VSCode extension (#1690).
Full Changelog: v7.4.0...v7.4.1
v7.4.0 - Validation rules
Features
- #1643 validation rules for retrieve, buildDefinition and deploy by @JoernBerkefeld in #1648
- #1645 option to define custom validation rules for retrieve, buildDefinition and deploy by @JoernBerkefeld in #1649
- #1666 optional validation rule overrides per types via .mcdevrc config by @JoernBerkefeld in #1667
- #1671 add option to reduce validation rule errors to warnings via option
--skipValidation
for deploy, build, buildDefinition, buildDefinitionBulk by @JoernBerkefeld in #1672 - #1434 add
resume journey
viaexecute
-method (including adding an aliasresume
for that command) by @JoernBerkefeld in #1630 - #1651: allow using
--matchName
withdeploy dataExtension
(this previously only worked withasset
) by @JoernBerkefeld in #1656
Bugfixes
- #1505 fix incorrect asset links in
journeys
when retrieved together withtriggeredSends
by @JoernBerkefeld in #1640 - #1472 fix dependency-not-found deploy-error by adapting order in which
assets
are deployed, solving the inter-type dependencies by @JoernBerkefeld in #1502 - #1646 fix config files not actually getting updated during mcdev upgrade when it was presented as optional by @JoernBerkefeld in #1647
- #1644 automatic workaround, not solution for the "string or binary data would be truncated"-error by @JoernBerkefeld in #1660
- #1657 fix
journey
/event
eventDataSummary not getting saved correctly by @JoernBerkefeld in #1658 - #1668 sf object checks for
events
andjourneys
fail if multiple entries are retrieved-by-key due to race conditions by @JoernBerkefeld in #1669
Chores
- #1637 enable syntax highlighting for SSJS files in GitLab by @JoernBerkefeld in #1638
Full Changelog: v7.3.1...v7.4.0
Details
Standard Commands
deploy
Command: mcdev deploy [business unit] [metadata type] [metadata key] [--metadata] [--fromRetrieve] [--refresh] [--keySuffix] [--noMidSuffix] [--changeKeyValue=yourNewKey] [--changeKeyField=otherFieldInJson] [--execute] [--schedule] [--fixShared] [--noUpdate] [--publish] [--skipStatusCheck] [--matchName] [--skipValidation]
New option --skipValidation
deploy with --matchName:
Currently supported types:
Name | CLI Argument |
---|---|
Asset | asset |
Data Extension | dataExtension |
deploy --matchName
now supports dataExtensions
execute
Command: mcdev execute <business unit> [type] [key] [--like] [--schedule] [--metadata]
Alias: mcdev exec
/ mcdev start
/ mcdev resume
Currently supported types:
Name | CLI Argument | Effect |
---|---|---|
Automation | automation |
RunOnce or Schedules automation according to already existing schedule |
Query | query |
Starts query execution |
Journey | journey |
Resumes a paused journey |
Now supports
journey
publish
Command: mcdev publish <business unit> [metadata type] [metadata key] [--like] [--skipStatusCheck] [--metadata]
Alias: mcdev activate
Currently supported types:
Name | CLI Argument | Effect |
---|---|---|
Journey | journey |
Activates a Draft-version of a journey (creates related transactionalEmail or event record) |
New alias
activate
to mimic the lingo in Journey Builder
Templating Commands
build
Command: mcdev build <--buFrom> <--marketFrom> <--buTo> <--marketTo> <--metadata> [--bulk] [--dependencies] [--retrieve] [--skipValidation]
New option --skipValidation
buildDefinition
Command: mcdev buildDefinition <business unit> [type] [template name] [market] [--metadata] [--market] [--skipValidation]
New option --skipValidation
buildDefinitionBulk
Command: mcdev buildDefinitionBulk <market list name> <type> <template name> [--metadata] [--skipValidation]
New option --skipValidation
Advanced Configuration
.mcdevrc.json
The central config in .mcdevrc.json
holds multiple adjustable settings:
{
"options": {
"validation": {
"retrieve": {
"noGuidKeys": "warn",
"noRootFolder": "warn",
"overrides": [
{
"type": [
"journey"
],
"options": {
"noGuidKeys": "off",
}
}
]
},
"buildDefinition": {
"noGuidKeys": "warn",
"noRootFolder": "warn",
"overrides": [
{
"type": [
"journey"
],
"options": {
"noGuidKeys": "off",
}
}
]
},
"deploy": {
"noGuidKeys": "error",
"noRootFolder": "error",
"overrides": [
{
"type": [
"journey"
],
"options": {
"noGuidKeys": "off",
}
}
]
}
},
},
}
Setting | Default | Description |
---|---|---|
options.validation | current default and custom rules | Allows setting validation rules to "off", "warn" or "error |
Validation rules
You can define validation rules for retrieve
, buildDefinition
and deploy
.
The following rules exist out of the box:
- noGuidKeys: test for metadata that has a GUID / UUID as key.
- noRootFolder: test if metadata that does exist in a folder resides in the root for that particular type or in a subfolder.
Possible rule settings are:
- not set, which implicitly turns off the rule
- "off" explicitly turns off the rule
- "warn" shows a log message of type warning
- "error" shows a log message of type error AND blocks further execution
- for
retrieve
that prevents download - for
buildDefintion
(andbuild
) that prevents the creation of the corresponding file in the deploy folder - for
deploy
this will prevent deployment.
- for
Please keep in mind that you can always skip validation rules all together at run-time by adding --skipValidation to your command (deploy / build / buildDefinition / buildDefinitionBulk)
Custom Validation rules - .mcdev-validation.js
Optionally one can create a file named .mcdev-validations.js
in the root of your project to specify your own validation rules. That gives you full flexibility to test for whatever guidelines you might have as you can literally parse the JSON of the metadata yourself.
One example that depends on BU names and hence is not part of the standard set could look like this:
'use strict';
const buSuffixMap = {
_ParentBU_: '',
DEV: '_DEV',
QA: '_QA',
PROD: '',
};
/**
*
* @param {any} definition type defintiion
* @param {any} item metadata json
* @param {string} targetDir where the metadata is stored ("deploy/cred/bu")
* @param {any} Util helper methods
* @returns {Promise.<any>} validation rule
*/
export function validation(definition, item, targetDir, Util) {
const bu = targetDir.includes('/') ? targetDir.split('/').pop() : targetDir.split('\\').pop();
const suffix = buSuffixMap[bu];
if (suffix === undefined) {
Util.logger.error(
`BU '${bu}' not defined for keySuffix validation in .mcdev-validations.js`
);
}
return {
keySuffix: {
failedMsg: 'Key Suffix expected but not found: ' + suffix,
/**
* @returns {boolean} true=test passed
*/
passed: function () {
// exclude non-relevant items
const relevantTypes = ['asset', 'dataExtension'];
if (!relevantTypes.includes(definition.type)) {
return true;
}
if (
definition.type === 'dataExtension' &&
item.r__folder_ContentType !== 'shared_dataextension'
) {
// only shared DEs need a suffix
return true;
}
// actual test
const key = item[definition.keyField] + '';
if (key) {
return key.endsWith(suffix);
} else {
Util.logger.debug('validation-keySuffix: key not found');
return true;
}
},
},
};
}
To control how a custom rule is applied, simply add its name (in the above example, keySuffix
) to options.validation like you would for the default rules. Because custom rules are configured in the same way as default rules, you can also use the same override logic for them
"validation": {
"retrieve": {
"keySuffix": "warn",
"noGuidKeys": "warn",
"noRootFolder": "warn",
},
"buildDefinition": {
"keySuffix": "warn",
"noGuidKeys": "warn",
"no...
v7.3.1 - Fixes for Salesforce-Entry-Event journeys and for users
Bugfixes
- #1627 run publish journey action sequentially for multi-step
journeys
to fix race condition for sf-journeys by @JoernBerkefeld in #1629 - #1510 fix retrieving
users
androles
together failing due to missing timezones by @JoernBerkefeld and @stijnhoste in #1634
Chores
- #1631 improve configurationArgument checks incl. common vs contact logic for salesforce data entry
events
by @JoernBerkefeld in #1632
Special Thanks
Thank you @stijnhoste for pointing out and analyzing the issue of missing timezones that only occurred if you tried to download users and roles together (#1510)!
Full Changelog: v7.3.0...v7.3.1
v7.3.0 - manage journeys
Features
- #1020 pause journey and stop journey features added by @JoernBerkefeld in #1618
- #1619 allow using names instead of just keys for buildTemplate and build by @JoernBerkefeld in #1623
- #1522 allow specifying multiple markets at once in bt, bd, bdb and build by @JoernBerkefeld in #1625
- #1611 allow deleting entire journey by specifying the version with /* by @JoernBerkefeld in #1612
Bugfixes
- #1599 ensure required eventDefinition fields are send to API by @JoernBerkefeld in #1600
- #1570 salesforce triggered journeys cannot be published after deploy by @JoernBerkefeld in #1604
Chores
- #1608 find related sendClassification and senderProfile by ID, not by key by @JoernBerkefeld in #1609
- #1614 speed up multi-key deletes & equalize delete-errors by @JoernBerkefeld in #1615
- #1616 have CreatedDate and ModifiedDate in deploy response by @JoernBerkefeld in #1617
Full Changelog: v7.2.0...v7.3.0
Details
Standard Commands
delete
Command: mcdev delete <business unit> [type] [external key] [--metadata]
Alias: mcdev del
Deletes the given metadata from your server. This needs to be run with care as any data stored in the deleted meta-data will be lost.
Currently supported types: Metadata Type Support
Example:
mcdev delete MyProject/_ParentBU_ dataExtension MyUserTable
You can also delete multiple keys at once, even across types:
mcdev delete MyProject/_ParentBU_ -m dataExtension:MyUserTable -m query:myKey -m query:myKey2
mcdev delete MyProject/_ParentBU_ dataExtensionField MyUserTable.MyFieldName
Journeys are somewhat special because they are the only metadata type in SFMC that has versions stored in the platform itself. Therefore, when deleting a journey, you need to specify what version you want to delete - or if you want to delete the journey with all its versions. You achieve that by appending "/3" for deleting version 3 or "/*" for deleting all versions.
You can even provide the journey ID instead of the key. In the first example below, we are trying to delete version 4 of ID "5cfb1bcb-9cb7-42c9-81de-033943bbc18c".
mcdev del MyProject/_ParentBU_ journey id:%235cfb1bcb-9cb7-42c9-81de-033943bbc18c/4
mcdev del MyProject/_ParentBU_ journey id:5cfb1bcb-9cb7-42c9-81de-033943bbc18c/4
mcdev del MyProject/_ParentBU_ -m journey:id:5cfb1bcb-9cb7-42c9-81de-033943bbc18c/4
mcdev del MyProject/_ParentBU_ -m journey:myJourneyKey/4
mcdev del MyProject/_ParentBU_ -m journey:myJourneyKey/*
Note for nerds: When copying the ID from the URL, you might notice it's prefixed with "%23". If you do copy that together with the Id,
mcdev del
will automatically filter it for you. It, therefore, works with or without the leading "%23".
pause
Command: mcdev pause <business unit> [type] [key] [--like] [--metadata]
Alias: mcdev p
This command lets you pause metadata of a given type and key.
Currently supported types:
Name | CLI Argument | Effect |
---|---|---|
Automation | automation |
pauses scheduled automation |
Journey | journey |
pauses running journey |
Example:
mcdev pause MyProject/DEV automation key1
mcdev pause MyProject/DEV journey key3
mcdev pause MyProject/DEV journey key3/4
mcdev pause MyProject/DEV journey key3/*
mcdev pause MyProject/DEV automation "key1,key2,key3"
mcdev pause MyProject/DEV -m automation:key1 -m automation:key2
mcdev pause MyProject/DEV -m automation:key1 automation:key2 journey:key3
For journeys
you can choose to specify a specific version to pause by appending "/4" (to pause version 4) or all versions by appending "/*". If you do not append a version, mcdev will attempt to pause the latest version.
pause with --like operator:
mcdev pause MyProject/DEV automation --like.key "myprefix_%"
mcdev pause MyProject/DEV automation --like.key "myprefix_%" --like.r__folder_Path "Query/Testing%"
pause on all BUs:
This is a variation of pause command that allows you to pause specified items on all BUs. mcdev will look for the items of specified types and keys on all BUs and pause them.
Example:
mcdev pause MyProject/* automation key1
mcdev pause MyProject/* automation "key1,key2,key3"
stop
Command: mcdev stop <business unit> [type] [key] [--like] [--metadata]
Alias: -
This command lets you stop metadata of a given type and key.
Currently supported types:
Name | CLI Argument | Effect |
---|---|---|
Journey | journey |
stops running journey |
Example:
mcdev stop MyProject/DEV journey key3
mcdev stop MyProject/DEV journey "key1,key2,key3"
mcdev stop MyProject/DEV -m journey:key1 journey:key2
For journeys
you can choose to specify a specific version to stop by appending "/4" (to stop version 4). If you do not append a version, mcdev will attempt to stop the latest version. Currently, you cannot stop all versions at once with a single command.
stop with --like operator:
mcdev stop MyProject/DEV journey --like.key "myprefix_%"
mcdev stop MyProject/DEV journey --like.key "myprefix_%" --like.r__folder_Path "my Journeys/Testing%"
stop on all BUs:
This is a variation of stop command that allows you to stop specified items on all BUs. mcdev will look for the items of specified types and keys on all BUs and stop hem.
Example:
mcdev stop MyProject/* journey key1
mcdev stop MyProject/* journey "key1,key2,key3"
mcdev stop MyProject/* -m journey:key1 journey:key2 journey:key3
Templating Commands
build
Command: mcdev build <--buFrom> <--marketFrom> <--buTo> <--marketTo> <--metadata> [--bulk] [--dependencies] [--retrieve]
This combines the power of buildTemplate
and buildDefinition
in one command, making it easier if you continuously use both commands sequentially.
Example:
// before
mcdev bt MyProject/DEV --market pilotMarketDEV1 -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
mcdev bd MyProject/QA --market pilotMarketQA1 -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
// after
mcdev build --buFrom MyProject/DEV --buTo MyProject/QA --marketFrom pilotMarketDEV1 --marketTo pilotMarketQA1 -m dataExtension:name:table1 dataExtension:table2 dataExtension:table3 query:sql1 query:name:sql2
Note how you can also use names instead of keys to select metadata by prefixing the name with "name" (e.g query:name:sql2
). That however, only works if the name exists only once. Otherwise, the system will show an error, providing the found keys for you to select.
And if you already have market lists set up and want to use buildDefinitionBulk
instead all you need to do is append --bulk
:
Example:
// before
mcdev bt MyProject/DEV --market pilotMarketDEV1 -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
mcdev bdb pilotMarketsQA -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
// after
mcdev build --buFrom MyProject/DEV --marketFrom pilotMarketDEV1 --marketTo pilotMarketsQA --bulk -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
Note how in this bulk-example the parameter --buTo MyProject/QA
was omitted and that --marketTo pilotMarketsQA
now holds the name of the market list that bdb
needs to work.
build with --dependencies (and with --retrieve):
These two parameters are passed through to buildTemplate. Please see that commands documentation for details. The resulting list of types & keys of whatever buildTemplate will create are then handed over to buildDefinition(Bulk), making this a powerful solution.
build with multiple chained markets
If you have more complex scenarios that would otherwise require setting up lots of mostly cloned markets. Instead, you may define multiple markets that can combined to form one new set of variables that then get applied.
mcdev build --buFrom MyProject/DEV --marketFrom pilotMarketDEV1 addtionalMarketDEV --marketTo pilotMarketsQA addtionalMarketQA --bulk -m dataExtension:table1 -m dataExtension:table2 -m dataExtension:table3 -m query:sql1 -m query:sql2
This will take pilotMarketDEV1 and add whatever is defined in addtionalMarketDEV. If there is an overlap in defined attributes, whatever market is set second, overwrites what is set first in the command. You can chain as many markets as you want. The order of how the markets are defined in the config does not have an effect.
"markets": {
"addtionalMarketDEV": {
"c": 6,
"d": 4,
"e": 5,
},
"pilotMarketDEV1": {
"a": 1,
"b": 2,
"c": 3,
}
}
The resulting market would be
{
"a": 1,
"b": 2,
"c": 6,
"d": 4,
"e": 5,
}
buildTemplate
Command: mcdev buildTemplate <business unit> [type] [key] [market] [--metadata] [--market] [--dependencies] [--retrieve]
Alias: mcdev bt
The bt
command uses previously retrieved metadata on your local computer and uses your market
c...
v7.2.0 - Transactional Send Journeys
Feautures
- #1589 allow creating transactionalEmail by publishing a transactional journey by @JoernBerkefeld and @SanskarVaidya in #1596
Bugfixes
- #1588 fix post-retrieve processing of transactional email journeys by @JoernBerkefeld in #1591
Chores
- #1558 add custom git-fork commands pull and switch & pull by @JoernBerkefeld in #1559
- #1558 fixes around orgin/branch vs branch by @JoernBerkefeld in #1560
- #1574 allow overriding prettier parser in config by @BlakeTnr in #1575
- #1592 remove transactionalEmail from journey dependencyGraph by @JoernBerkefeld in #1594
- #1590 warn users not to create transactionalEmail directly by @JoernBerkefeld in #1595
Dependencies
- Bump @eslint/js from 9.8.0 to 9.9.0 by @dependabot in #1565
- Bump @types/node from 22.0.2 to 22.4.2 by @dependabot in #1577 & #1585
- Bump @types/yargs from 17.0.32 to 17.0.33 by @dependabot in #1581
- Bump axios from 1.7.2 to 1.7.4 by @dependabot in #1598
- Bump eslint from 9.8.0 to 9.9.0 by @dependabot in #1583
- Bump eslint-plugin-jsdoc from 49.0.0 to 50.2.2 by @dependabot in #1582
- Bump husky from 9.1.4 to 9.1.5 by @dependabot in #1584
- Bump lint-staged from 15.2.7 to 15.2.9 by @dependabot in #1571
- Bump mocha from 10.7.0 to 10.7.3 by @dependabot in #1579
- Bump typescript from 5.5.3 to 5.5.4 by @dependabot in #1564
- Bump update-notifier from 7.0.0 to 7.2.0 by @dependabot in #1580
- Bump winston from 3.13.1 to 3.14.2 by @dependabot in #1578
New Contributors
Special Thanks
Community member @SanskarVaidya inspired me to revisit how transactionalEmails
are created, highlighting that SFMC's GUI creates the journey
first, and the transactionalEmail
second, once you click on 'Activate', triggering a complete rewrite of the logic for Transactional Journeys in #1592, #1590, #1588, and #1589
Full Changelog: v7.1.4...v7.2.0
v7.1.4
Bugfixes
- #1536 (regression) fixed error during folder deployments claiming it cannot find the parent folder (which was just created) by @JoernBerkefeld in #1556
Dependencies
- Bump @eslint/js from 9.7.0 to 9.8.0 by @dependabot in #1547
- Bump globals from 15.8.0 to 15.9.0 by @dependabot in #1549
- Bump eslint-plugin-jsdoc from 48.8.3 to 49.0.0 by @dependabot in #1551
- Bump axios-mock-adapter from 1.22.0 to 2.0.0 by @dependabot in #1548
- Bump inquirer from 10.0.1 to 10.1.8 by @dependabot in #1552
Full Changelog: v7.1.3...v7.1.4