Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ ESLint and Prettier both run in CI. Tests are Vitest, not Jest. `markup-generato
```
src/index.ts public exports only — consumers import the package root
src/runtime/types.ts template, context, and trace types
src/runtime/render.ts public re-exports
src/runtime/renderTemplate.ts renderTemplate from @llazyemail/render-template
src/runtime/api.ts defineTemplate, slot, hasSlot
src/runtime/render.ts defineTemplate, renderTemplate, renderMany
src/runtime/api.ts slot, hasSlot
src/runtime/errors.ts DisplayError, codes, and message catalog
src/runtime/explain.ts explain()
src/templates/email/email.ts defineEmailTemplate, renderEmail
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@llazyemail/template-runtime-display",
"version": "0.9.0",
"version": "0.9.1",
"description": "Standalone runtime that renders a whole HTML email from named parts and records which part broke.",
"type": "module",
"license": "MIT",
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ export {
defineTemplate,
displayErrors,
hasSlot,
renderMany,
renderTemplate,
slot,
DisplayError,
DisplayErrorCode,
} from './runtime/render';
export { renderMany, RenderError } from '@llazyemail/render-template';
export type {
PartFailure,
PartStatus,
Expand All @@ -19,6 +19,7 @@ export type {
TemplatePart,
} from './runtime/types';
export type { RenderJob, RenderOptions } from '@llazyemail/render-template';
export { RenderError } from '@llazyemail/render-template';
export { explain } from './runtime/explain';

export { defineEmailTemplate, renderEmail } from './templates/email/email';
Expand Down
18 changes: 1 addition & 17 deletions src/runtime/api.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,8 @@
import { assertTemplate, type Template as PackageTemplate } from '@llazyemail/render-template';
import type { RenderContext, Template } from './types';
import type { RenderContext } from './types';
import { displayErrors } from './errors';

export { DisplayError, DisplayErrorCode, displayErrors } from './errors';

/**
* Validate, copy, and freeze a template. Later edits to the caller's part
* array do not change a template that has already been defined.
*/
export function defineTemplate<TProps>(template: Template<TProps>): Template<TProps> {
assertTemplate(template as PackageTemplate<TProps>);
return Object.freeze({
id: template.id,
parts: Object.freeze(
template.parts.map((part) => Object.freeze({ id: part.id, render: part.render })),
),
compose: template.compose,
});
}

/** Read a slot. A missing slot is `''`. A function slot is called with the same context. */
export function slot<TProps>(ctx: RenderContext<TProps>, id: string): string {
if (!hasSlot(ctx, id)) return '';
Expand Down
53 changes: 44 additions & 9 deletions src/runtime/render.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,44 @@
export { renderTemplate } from './renderTemplate';
export {
defineTemplate,
hasSlot,
slot,
DisplayError,
DisplayErrorCode,
displayErrors,
} from './api';
import {
assertTemplate,
renderMany,
renderTemplate as renderPackageTemplate,
type RenderOptions,
type RenderResult as PackageRenderResult,
type Template as PackageTemplate,
} from '@llazyemail/render-template';
import type { RenderResult, Template } from './types';

export { renderMany };

export { hasSlot, slot, DisplayError, DisplayErrorCode, displayErrors } from './api';

/**
* Validate, copy, and freeze a template. Later edits to the caller's part
* array do not change a template that has already been defined.
*/
export function defineTemplate<TProps>(template: Template<TProps>): Template<TProps> {
assertTemplate(template as PackageTemplate<TProps>);
return Object.freeze({
id: template.id,
parts: Object.freeze(
template.parts.map((part) => Object.freeze({ id: part.id, render: part.render })),
),
compose: template.compose,
});
}

/**
* Render one template. The same template and props produce the same HTML.
* The runtime keeps no state between calls.
*/
export function renderTemplate<TProps>(
template: Template<TProps>,
props: TProps,
options: RenderOptions<TProps> = {},
): RenderResult {
return renderPackageTemplate(
template as PackageTemplate<TProps>,
props,
options,
) as PackageRenderResult as RenderResult;
}
23 changes: 0 additions & 23 deletions src/runtime/renderTemplate.ts

This file was deleted.

Loading