Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/cli/email/email-template-export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ export default function setup() {
'Does not include metadata in the export file.'
)
)
.addOption(
new Option(
'-x, --no-extract',
'Do not extract HTML and CSS to a separate file'
)
)
.action(
// implement command logic inside action handler
async (host, realm, user, password, options, command) => {
Expand All @@ -79,6 +85,7 @@ export default function setup() {
}" from realm "${state.getRealm()}"...`
);
const outcome = await exportEmailTemplateToFile(
options.extract,
options.templateId,
options.file,
options.metadata
Expand All @@ -92,6 +99,7 @@ export default function setup() {
) {
verboseMessage('Exporting all email templates to a single file...');
const outcome = await exportEmailTemplatesToFile(
options.extract,
options.file,
options.metadata
);
Expand All @@ -103,7 +111,10 @@ export default function setup() {
(await getTokens(false, true, deploymentTypes))
) {
verboseMessage('Exporting all email templates to separate files...');
const outcome = await exportEmailTemplatesToFiles(options.metadata);
const outcome = await exportEmailTemplatesToFiles(
options.extract,
options.metadata
);
if (!outcome) process.exitCode = 1;
}
// unrecognized combination of options or no options
Expand Down
79 changes: 78 additions & 1 deletion src/ops/EmailTemplateOps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,17 @@ const regexEmailTemplateType = new RegExp(`${EMAIL_TEMPLATE_TYPE}/`, 'g');
// use a function vs a template variable to avoid problems in loops
function getFileDataTemplate() {
return {
meta: {},
emailTemplate: {},
};
}

function getFileDataHTMLTemplate() {
return {
html: {},
css: {},
};
}

/**
* Get a one-line description of the email template
* @param {EmailTemplateSkeleton} templateObj email template object to describe
Expand Down Expand Up @@ -167,6 +173,7 @@ export async function listEmailTemplates(
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
*/
export async function exportEmailTemplateToFile(
extract: boolean = false,
templateId: string,
file: string,
includeMeta: boolean = true
Expand All @@ -187,6 +194,26 @@ export async function exportEmailTemplateToFile(
updateProgressIndicator(indicatorId, `Writing file ${filePath}`);
const fileData = getFileDataTemplate();
fileData.emailTemplate[templateId] = templateData;

if (extract && (templateData.html || templateData.styles)) {
const fileThemeName = file ? file.replace('.json', '') + '.theme.json' : getTypedFilename(
templateId,
EMAIL_TEMPLATE_FILE_TYPE + '.theme'
);
const fileHTMLData = getFileDataHTMLTemplate();
fileHTMLData.html[templateId] = templateData.html ?? {};
fileHTMLData.css[templateId] = templateData.styles ?? {};

saveJsonToFile(fileHTMLData, getFilePath(fileThemeName, true), includeMeta);

const formattedTemplate = templateData;

if (formattedTemplate.html) delete formattedTemplate.html;
if (formattedTemplate.styles) delete formattedTemplate.styles;

fileData.emailTemplate[templateId] = formattedTemplate;
}

saveJsonToFile(fileData, filePath, includeMeta);
stopProgressIndicator(
indicatorId,
Expand All @@ -207,6 +234,7 @@ export async function exportEmailTemplateToFile(
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
*/
export async function exportEmailTemplatesToFile(
extract: boolean = false,
file: string,
includeMeta: boolean = true
): Promise<boolean> {
Expand All @@ -220,6 +248,33 @@ export async function exportEmailTemplatesToFile(
}
const filePath = getFilePath(fileName, true);
const exportData = await exportEmailTemplates(true);

if (extract) {
const fileHTMLData = getFileDataHTMLTemplate();
const fileThemeName = file ? file.replace('.json', '') + '.theme.json' : getTypedFilename(
`allEmailTemplates`,
EMAIL_TEMPLATE_FILE_TYPE + '.theme'
);

Object.keys(exportData.emailTemplate).forEach((templateId) => {
const templateData = exportData.emailTemplate[templateId];

if (templateData.html || templateData.styles) {
fileHTMLData.html[templateId] = templateData.html ?? {};
fileHTMLData.css[templateId] = templateData.styles ?? {};

const formattedTemplate = templateData;

if (formattedTemplate.html) delete formattedTemplate.html;
if (formattedTemplate.styles) delete formattedTemplate.styles;

exportData.emailTemplate[templateId] = formattedTemplate;
}
});

saveJsonToFile(fileHTMLData, getFilePath(fileThemeName, true), includeMeta);
}

saveJsonToFile(exportData, filePath, includeMeta);
return true;
} catch (error) {
Expand All @@ -234,6 +289,7 @@ export async function exportEmailTemplatesToFile(
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
*/
export async function exportEmailTemplatesToFiles(
extract: boolean = false,
includeMeta: boolean = true
): Promise<boolean> {
let indicatorId;
Expand All @@ -251,6 +307,27 @@ export async function exportEmailTemplatesToFiles(
const fileData = getFileDataTemplate();
updateProgressIndicator(indicatorId, `Exporting ${templateId}`);
fileData.emailTemplate[templateId] = template;

// Separate html and styles into a different file by default
if (extract && (template.html || template.styles)) {
const fileThemeName = getTypedFilename(
templateId,
EMAIL_TEMPLATE_FILE_TYPE + '.theme'
);
const fileHTMLData = getFileDataHTMLTemplate();
fileHTMLData.html[templateId] = template.html ?? {};
fileHTMLData.css[templateId] = template.styles ?? {};

saveJsonToFile(fileHTMLData, getFilePath(fileThemeName, true), includeMeta);

const formattedTemplate = template;

if (formattedTemplate.html) delete formattedTemplate.html;
if (formattedTemplate.styles) delete formattedTemplate.styles;

fileData.emailTemplate[templateId] = formattedTemplate;
}

saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);
}
stopProgressIndicator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ Options:
-i, --template-id <template-id> Email template id/name. If specified, -a and
-A are ignored.
-N, --no-metadata Does not include metadata in the export file.
-x, --no-extract Do not extract HTML and CSS to a separate
file
-h, --help Help
-hh, --help-more Help with all options.
-hhh, --help-all Help with all options, environment variables,
Expand Down
Loading