jsx-email
Version:
Render JSX email components to HTML email
69 lines • 2.52 kB
JavaScript
import { readFile, writeFile } from 'node:fs/promises';
import { dirname, basename, extname, join, resolve } from 'path';
import esbuild from 'esbuild';
import { loadConfig } from '../config.js';
import { log } from '../log.js';
// Note: after server start we change the root directory to trick vite
const originalCwd = process.cwd();
const cssPlugin = {
name: 'jsx-email/css-plugin',
setup(builder) {
builder.onLoad({ filter: /\.css$/ }, async (args) => {
const buffer = await readFile(args.path);
const css = await esbuild.transform(buffer, { loader: 'css', minify: false });
return { contents: css.code, loader: 'text' };
});
}
};
/**
* @desc Compiles a JSX/TSX template file using esbuild
* @param options CompileOptions
* @returns Promise<CompileResult[]> An array of files affected by the compilation
*/
export const compile = async (options) => {
const config = await loadConfig();
const { files, hashFiles = true, outDir, writeMeta = false } = options;
const { metafile } = await esbuild.build({
bundle: true,
define: {
'import.meta.isJsxEmailPreview': JSON.stringify(globalThis.isJsxEmailPreview || false)
},
entryNames: hashFiles ? '[dir]/[name]-[hash]' : '[dir]/[name]',
entryPoints: files,
jsx: 'automatic',
logLevel: 'error',
metafile: true,
outdir: outDir,
platform: 'node',
plugins: [cssPlugin],
write: true,
...config.esbuild
});
const { outputs } = metafile;
const outputPaths = Object.keys(outputs);
const affectedFiles = outputPaths
.map((path) => {
const { entryPoint } = metafile.outputs[path];
if (!entryPoint)
return null;
return {
entryPoint,
path: resolve('/', path)
};
})
.filter(Boolean);
// log.debug({ affectedFiles });
if (metafile && writeMeta) {
const ops = Object.entries(outputs).map(async ([path]) => {
const fileName = basename(path, extname(path));
const metaPath = join(dirname(path), `${fileName}.meta.json`);
const writePath = resolve(originalCwd, metaPath);
const json = JSON.stringify(metafile);
log.debug('meta writePath:', writePath);
await writeFile(writePath, json, 'utf8');
});
await Promise.all(ops);
}
return affectedFiles;
};
//# sourceMappingURL=compile.js.map