@pomofficial/mailgun
Version:
Mailgun API connector for the Pomegranate framework
102 lines • 4.46 kB
JavaScript
;
/**
* @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