vtex-email-framework
Version:
Transactional emails development architecture
62 lines (51 loc) • 1.87 kB
JavaScript
const { existsSync, readdirSync } = require('node:fs');
const { resolve } = require('node:path');
const app = require('express')();
const hbs = require('hbs');
const cors = require('cors');
const root = (folders)=> {
return resolve(process.cwd(), ...folders.split('/'));
}
const helper = readdirSync(root('emails/helpers'))[0].replace('.js', '');
require(resolve(process.cwd(),'emails', 'helpers', helper));
hbs.registerHelper('clearText', (value) => value.replace(/\W+/g, ' '));
hbs.registerPartials(root('emails/templates/custom/partials'), function (err) { });
function findModel(templateName) {
if (existsSync(root('emails/templates/default'))) {
if (readdirSync(root('emails/templates/default')).includes(templateName)) return templateName
}
return null
}
const viewFiles = readdirSync(root('emails/templates/custom'));
const fileNames = viewFiles
.filter(folder => /.hbs$/gi.test(folder))
.map(template => {
return {
file: template.split('.')[0],
model: findModel(template)
}
});
app.use(cors())
app.set('views', root('emails/templates/custom'));
app.set('view engine', 'hbs');
app.get('/', (req, res) => {
res.render(resolve(__dirname, 'view'), { files: fileNames })
});
app.get('/sse', (req, res) => {
res.statusCode = 200;
res.setHeader("cache-control", "no-cache")
res.setHeader("connection", "keep-alive")
res.setHeader("content-type", "text/event-stream")
res.write('retry: 200\n');
});
fileNames.forEach(({ file }) => {
app.get(`/${file}`, (req, res) => {
res
.render(file, require(root(`emails/json/${file}.json`)))
})
app.get(`/templates/default/${file}`, (req, res) => {
res
.render(root(`emails/templates/default/${file}`), require(root(`emails/json/${file}.json`)))
})
});
module.exports = app