Plugins
jsx-email supports plugins to modify the rendering pipeline according to need. A plugin might provide custom minifcation after rendering, or replace tokens in a template before rendering, for example. For implementation examples, please see the Core Plugins below.
Core Plugins
By default, jsx-email ships with peerDependencies on several plugins:
Authoring Plugins
Plugins are extremely flexible in how they're provided to jsx-email. They can be the result of a local function, a file export, or a package export. Regardless of how a plugin is provided, all plugins are defined by a straightforward interface:
export interface JsxEmailPlugin {
afterRender?: RenderHookFn;
beforeRender?: RenderHookFn;
name: string;
process?: ProcessHookFn;
symbol: typeof pluginSymbol;
}export interface JsxEmailPlugin {
afterRender?: RenderHookFn;
beforeRender?: RenderHookFn;
name: string;
process?: ProcessHookFn;
symbol: typeof pluginSymbol;
}To instruct a render to use plugins, utilize a Configuration File and specify the plugins property:
import { defineConfig } from 'jsx-email/config';
import { somePlugin } from './plugins/some-plugin';
export const config = defineConfig({
plugins: [somePlugin]
});import { defineConfig } from 'jsx-email/config';
import { somePlugin } from './plugins/some-plugin';
export const config = defineConfig({
plugins: [somePlugin]
});Lifecycle Hooks
Plugins can affect a template at several different stages throughout the rendering process. The following hooks are supported, and are executed in the following order:
afterRenderprocessbeforeRender
Implemented hooks within plugins can be synchronous or asynchrounous and return a Promise. All hooks are exexcuted after JSX is converted to HTML.
Function definitions for both afterRender and beforeRender should match:
(params: RenderHookParams) => string | Promise<string>;(params: RenderHookParams) => string | Promise<string>;The params argument provided to these two hooks match the following definition:
interface RenderHookParams {
chalk: typeof chalk;
html: string;
log: any;
}interface RenderHookParams {
chalk: typeof chalk;
html: string;
log: any;
}As a convenience, all hooks are provided a chalk instance and a log utility for providing user feedback in the console.
afterRender
As the name suggests, this hook is run after the other hooks and after render is considered to be complete, but before the resulting HTML is written to disk.
beforeRender
This hook is run just before the HTML processing step is begun. It can be handy for replacing tokens in the HTML that may have an effect in the processing step or afterRender hooks.
process
The process hook is unique in that the return result from the hook function should return a rehype Plugin. jsx-email uses rehype for compliant and fast HTML processing and modification. The plugin-minify Core Plugin provides an example of such a rehype plugin. This hook runs between beforeRender and afterRender. The function definition for this hook should match:
interface ProcessHookParams {
chalk: typeof chalk;
log: any;
}
(params: ProcessHookParams) =>
RehypePlugin | RehypePreset | Promise<RehypePlugin> | Promise<RehypePreset>;interface ProcessHookParams {
chalk: typeof chalk;
log: any;
}
(params: ProcessHookParams) =>
RehypePlugin | RehypePreset | Promise<RehypePlugin> | Promise<RehypePreset>;