@fusionauth/cli
Version:
109 lines (92 loc) • 5.17 kB
text/typescript
import {Command} from "@commander-js/extra-typings";
import {getEmailErrorMessage, getEmailSuccessMessage, reportError} from "../utils.js";
import {EmailTemplate, FusionAuthClient} from "@fusionauth/typescript-client";
import {mkdir, writeFile} from "fs/promises";
import chalk from "chalk";
import {emptyDir, pathExists} from "fs-extra";
import {apiKeyOption, hostOption} from "../options.js";
import {existsSync} from "fs";
// noinspection JSUnusedGlobalSymbols
export const emailDownload = new Command('email:download')
.description('Download email templates from FusionAuth')
.argument('[emailTemplateId]', 'The email template id to download. If not provided, all email templates will be downloaded')
.option('-o, --output <output>', 'The output directory', './emails/')
.addOption(apiKeyOption)
.addOption(hostOption)
.option('-c, --clean', 'Clean the output directory before downloading', false)
.action(async (emailTemplateId, {output, key: apiKey, host, clean}) => {
let clientResponse;
const errorMessage = getEmailErrorMessage('download', emailTemplateId);
if (emailTemplateId) {
console.log(`Downloading email template ${emailTemplateId} to ${output}`);
} else {
console.log(`Downloading all email templates to ${output}`);
}
try {
if (clean) {
const cleanDirectory = emailTemplateId ? `${output}/${emailTemplateId}` : output;
if (await pathExists(cleanDirectory)) {
console.log(`Cleaning ${cleanDirectory}`);
await emptyDir(cleanDirectory);
}
}
const client = new FusionAuthClient(apiKey, host);
if (emailTemplateId) {
clientResponse = await client.retrieveEmailTemplate(emailTemplateId);
} else {
clientResponse = await client.retrieveEmailTemplates();
}
if (!clientResponse.wasSuccessful()) {
reportError(errorMessage, clientResponse);
process.exit(1);
}
let emailTemplates: EmailTemplate[];
if (emailTemplateId && clientResponse.response.emailTemplate) {
emailTemplates = [clientResponse.response.emailTemplate];
} else {
emailTemplates = clientResponse.response.emailTemplates ?? []
}
for await (const emailTemplate of emailTemplates) {
const emailTemplateId = emailTemplate.id;
const emailTemplateDirectory = `${output}/${emailTemplateId}/`;
if (!existsSync(emailTemplateDirectory)) {
await mkdir(emailTemplateDirectory, {recursive: true});
}
await writeFile(`${emailTemplateDirectory}/name.txt`, emailTemplate.name ?? '');
await writeFile(`${emailTemplateDirectory}/from_email.txt`, emailTemplate.fromEmail ?? '');
// Export the default email template
await writeFile(`${emailTemplateDirectory}/body.html`, emailTemplate.defaultHtmlTemplate ?? '');
await writeFile(`${emailTemplateDirectory}/body.txt`, emailTemplate.defaultTextTemplate ?? '');
await writeFile(`${emailTemplateDirectory}/subject.txt`, emailTemplate.defaultSubject ?? '');
await writeFile(`${emailTemplateDirectory}/from_name.txt`, emailTemplate.defaultFromName ?? '');
// Export localized email templates
const locales = getLocalesFromEmailTemplates(emailTemplate);
for (const locale of locales) {
const localeDirectory = `${emailTemplateDirectory}/${locale}/`;
if (!existsSync(localeDirectory)) {
await mkdir(localeDirectory);
}
await writeFile(`${localeDirectory}/body.html`, emailTemplate.localizedHtmlTemplates?.[locale] ?? '');
await writeFile(`${localeDirectory}/body.txt`, emailTemplate.localizedTextTemplates?.[locale] ?? '');
await writeFile(`${localeDirectory}/subject.txt`, emailTemplate.localizedSubjects?.[locale] ?? '');
await writeFile(`${localeDirectory}/from_name.txt`, emailTemplate.localizedFromNames?.[locale] ?? '');
}
}
console.log(chalk.green(getEmailSuccessMessage(emailTemplateId, output)));
} catch (e: any) {
reportError(errorMessage, e);
process.exit(1);
}
});
/**
* Gets the locales from a list of email templates
* @param emailTemplate
*/
const getLocalesFromEmailTemplates = (emailTemplate: EmailTemplate): string[] => {
const locales: string[] = [];
locales.push(...Object.keys(emailTemplate.localizedFromNames ?? {}));
locales.push(...Object.keys(emailTemplate.localizedSubjects ?? {}));
locales.push(...Object.keys(emailTemplate.localizedTextTemplates ?? {}));
locales.push(...Object.keys(emailTemplate.localizedHtmlTemplates ?? {}));
return [...new Set<string>(locales)];
}