TryGhost/Ghost

View on GitHub
ghost/email-content-generator/lib/EmailContentGenerator.js

Summary

Maintainability
A
1 hr
Test Coverage
const _ = require('lodash').runInContext();
const fs = require('fs-extra');
const path = require('path');

_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;

class EmailContentGenerator {
    /**
     *
     * @param {Object} options
     * @param {function} options.getSiteUrl
     * @param {function} options.getSiteTitle
     * @param {string} options.templatesDir - path to the directory containing email templates
     */
    constructor({getSiteUrl, getSiteTitle, templatesDir}) {
        this.getSiteUrl = getSiteUrl;
        this.getSiteTitle = getSiteTitle;
        this.templatesDir = templatesDir;
    }

    /**
     *
     * @param {Object} options
     * @param {string} options.template - HTML template name to use for generation
     * @param {Object} [options.data] - variable data to use during HTML template compilation
     * @returns {Promise<{html: String, text: String}>} resolves with an object containing html and text properties
     */
    async getContent(options) {
        const defaults = {
            siteUrl: this.getSiteUrl(),
            siteTitle: this.getSiteTitle()
        };

        const data = _.defaults(defaults, options.data);

        // read the proper email body template
        const content = await fs.readFile(path.join(this.templatesDir, options.template + '.html'), 'utf8');

        // insert user-specific data into the email
        const compiled = _.template(content);
        const htmlContent = compiled(data);

        // lazyload the lib, and generate a plain-text version of the same email
        const htmlToText = require('html-to-text');
        const textContent = htmlToText.fromString(htmlContent);

        return {
            html: htmlContent,
            text: textContent
        };
    }
}

module.exports = EmailContentGenerator;