UNPKG

@pomofficial/mailgun

Version:

Mailgun API connector for the Pomegranate framework

102 lines 4.46 kB
"use strict"; /** * @file MailTemplates * @author Jim Bulkowski <jim.b@paperelectron.com> * @project Mailgun * @license MIT {@link http://opensource.org/licenses/MIT} */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const plugin_tools_1 = require("@pomegranate/plugin-tools"); const bluebird_1 = __importDefault(require("bluebird")); const fp_1 = require("lodash/fp"); const pug_1 = require("pug"); const filterJsIndex = fp_1.compose(fp_1.first, fp_1.filter((i) => i.filename === 'index.js')); const filterPugIndex = fp_1.compose(fp_1.first, fp_1.filter((i) => i.filename === 'index.pug')); const validJs = fp_1.compose(fp_1.isEmpty, fp_1.difference(['expects', 'subject', 'body']), fp_1.keys); const templateCache = new Map(); class templateBuilder { constructor(pugPath, transformers) { this.pugCompiler = pug_1.compileFile(pugPath); this.expects = transformers.expects; this.generateSubject = transformers.subject; this.generateBody = transformers.body; } compile(payload) { let templateData = payload.templateData; let diff = fp_1.difference(this.expects, fp_1.keys(templateData)); let valid = fp_1.isEmpty(diff); if (!valid) { throw new Error(`templateBuilder missing required properties: ${diff.join(',')}`); } if (!payload.address) { throw new Error('payload is missing address prop.'); } return { address: payload.address, subject: this.generateSubject(templateData), text: this.generateBody(templateData), html: this.pugCompiler(templateData) }; } } class MailTemplate { constructor(payload) { let template = templateCache.get(payload.template); let generated = template.compile(payload); this.address = generated.address; this.subject = generated.subject; this.text = generated.text; this.html = generated.html; } } exports.MailTemplatePlugin = plugin_tools_1.CreatePlugin('anything') .configuration({ name: 'MailTemplates', injectableParam: 'MailTemplate', }) .directories(['templates', 'helpers', 'mixins']) .variables({}) .hooks({ load: (PluginFiles) => __awaiter(this, void 0, void 0, function* () { let pf = PluginFiles('templates'); let files = yield pf.fileList({ directories: true }); let rawTemplateData = yield bluebird_1.default.map(files, (f) => __awaiter(this, void 0, void 0, function* () { let templateFiles = yield pf.ctors.fileList(f.path)(); let tJS = filterJsIndex(templateFiles); let tPug = filterPugIndex(templateFiles); if (!tJS) { throw new Error('Mail Templates require an index.js file in their directory'); } if (!tPug) { throw new Error('Mail Templates require an index.pug file in their directory'); } let transformers = require(tJS.path); if (!validJs(transformers)) { throw new Error('template index file must export expects, subject and body properties.'); } // return transformers return [f.filename, transformers, tPug.path]; })); fp_1.reduce((acc, [key, transformers, pugPath]) => { // console.log(key) // console.log(transformers) // console.log(pugPath) acc.set(key, new templateBuilder(pugPath, transformers)); return acc; }, templateCache, rawTemplateData); // console.log(rawTemplateData) return MailTemplate; }) }); //# sourceMappingURL=MailTemplates.js.map