From ae65b0b3e91ed19ab620904d56a28f8cee079b5e Mon Sep 17 00:00:00 2001 From: akin01 Date: Sun, 5 Jul 2026 08:39:57 +0700 Subject: [PATCH] chore(release): prepare solid-email 0.1.5 --- CHANGELOG.md | 27 ++++++++++++++++--- README.md | 25 +++++++++++++---- benchmarks/cross-library/tsconfig.json | 3 ++- e2e/cloudflare-tanstack-start/package.json | 4 +-- .../pnpm-workspace.yaml | 4 +-- e2e/tanstack-start/package.json | 4 +-- e2e/tanstack-start/pnpm-workspace.yaml | 4 +-- e2e/vite/package.json | 4 +-- e2e/vite/pnpm-workspace.yaml | 4 +-- package.json | 2 +- packages/render/package.json | 2 +- packages/solid-email/package.json | 2 +- skills/solid-email/SKILL.md | 2 +- 13 files changed, 62 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b7a954..29be2b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,25 @@ All notable changes to this project will be documented in this file. ## Unreleased +## 0.1.5 - 2026-07-05 + +### Added + +- Added a cross-library email benchmark suite comparing Solid Email with React + Email, JSX Email, and MJML React across render latency, throughput, heap + usage, output size, and pairwise HTML conformance. +- Added the `pnpm benchmark:cross-library` script for running the + cross-library benchmark suite from the workspace root. + ### Changed +- Bumped `@solid-email/render` and `@akin01/solid-email` to `0.1.5` so both + publishable packages can be released together with the benchmark and Workerd + compatibility updates. +- Bumped the private monorepo metadata and Solid Email skill metadata to + `0.1.5`. +- Updated e2e fixture tarball references to `0.1.5` so published-package + integration tests install the current release artifacts. - Browser-condition imports from `@akin01/solid-email` now resolve to the DOM/CSR preview build, replacing the public `@akin01/solid-email/client` subpath while keeping server, Workerd, and default imports on the SSR/email @@ -20,6 +37,9 @@ All notable changes to this project will be documented in this file. ### Related commits +- Cross-library benchmark suite + - [`03d9a87069f3`](https://github.com/Akin01/solid-email/commit/03d9a87069f37a15870428525aec9cd18614b580) Merged PR #14 for `feat/add-cross-library-benchmark`. + - [`47352df6af85`](https://github.com/Akin01/solid-email/commit/47352df6af851df8920ee7f7a73ba4e8d6b52396) Addressed cross-library benchmark review feedback. - Workerd-safe root exports and rendering - [`691ed9560834`](https://github.com/Akin01/solid-email/commit/691ed95608341c664c8d80335e001faea667cf9a) Added Workerd-safe root export conditions, server/runtime fixes, and Cloudflare TanStack Start coverage. - [`9c6bb421f37b`](https://github.com/Akin01/solid-email/commit/9c6bb421f37b427bc9f05305a3bac63a886d4857) Added the TypeScript shim for CSS Tree's dist ESM entry used by Workerd-safe Tailwind imports. @@ -28,11 +48,12 @@ All notable changes to this project will be documented in this file. ### Verified +- `pnpm exec biome check package.json packages/solid-email/package.json packages/render/package.json skills/solid-email/SKILL.md README.md CHANGELOG.md benchmarks/cross-library/tsconfig.json e2e/vite/package.json e2e/tanstack-start/package.json e2e/cloudflare-tanstack-start/package.json e2e/vite/pnpm-workspace.yaml e2e/tanstack-start/pnpm-workspace.yaml e2e/cloudflare-tanstack-start/pnpm-workspace.yaml` - `pnpm test` - `pnpm test:e2e` -- `pnpm typecheck` -- `pnpm build` -- `pnpm lint` +- `pnpm --filter @benchmarks/cross-library run typecheck` +- `pnpm benchmark:cross-library` +- `node scripts/create-github-releases.mjs --dry-run --package-version @solid-email/render@0.1.5 --package-version @akin01/solid-email@0.1.5` ## 0.1.4 - 2026-06-26 diff --git a/README.md b/README.md index d60ee9e..bdee9e4 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,9 @@ Measured with `pnpm benchmark:rendering` on the repository marketing email fixtu | Solid Email `render()` | Static JSX | 2.2919ms | 436.33 hz | 5.02x faster than React Email `render()` | | Solid Email `renderSync()` | Static JSX | 1.8935ms | 528.13 hz | 6.08x faster than React Email `render()` | | Solid Email `render()` | Tailwind JSX | 3.1230ms | 320.20 hz | 5.69x faster than React Email Tailwind | -| Solid Email `compileSync` render (cached) | Static JSX | 0.0438ms | 22,842 hz | 263x faster than React Email `render()` | +| Solid Email `compileSync` render (cached) | Static JSX | **0.0438ms** | **22,842 hz** | 263x faster than React Email `render()` | | Solid Email `compile` render (cached) | Static JSX | 0.0858ms | 11,661 hz | 134x faster than React Email `render()` | -| Solid Email `compile` render (cached) | Tailwind JSX | 0.0452ms | 22,145 hz | 393x faster than React Email Tailwind | +| Solid Email `compile` render (cached) | Tailwind JSX | 0.0452ms | 22,145 hz | **393x faster than React Email Tailwind** | | React Email `render()` | Static JSX | 11.5084ms | 86.89 hz | Baseline | | React Email `render()` | Tailwind JSX | 17.7760ms | 56.26 hz | Tailwind baseline | @@ -49,21 +49,36 @@ Plain-text benchmarks measured with `pnpm benchmark:html-to-text` on the reposit | Operation | Fixture | Mean | Throughput | Comparison | | --- | --- | ---: | ---: | --- | | `@solid-email/render` `toPlainText` | HTML fixtures | 2.4369ms | 410.36 hz | 3.40x faster than React Email `toPlainText` | -| `@solid-email/render` compiled text template | Solid JSX | 1.4434ms | 692.83 hz | 8.61x faster than React Email plain-text render | +| `@solid-email/render` compiled text template | Solid JSX | **1.4434ms** | **692.83 hz** | **8.61x faster than React Email plain-text render** | | `@solid-email/render` uncompiled `renderSync` plain text | Solid JSX | 2.8895ms | 346.09 hz | 4.30x faster than React Email plain-text render | | `@solid-email/html-to-text` `convert` | HTML fixtures | 3.9657ms | 252.16 hz | Direct package converter | | `html-to-text` `convert` | HTML fixtures | 3.8166ms | 262.01 hz | Direct converter baseline | | React Email `toPlainText` | HTML fixtures | 8.2867ms | 120.67 hz | React text conversion baseline | | React Email `render` plain text | React JSX | 12.4310ms | 80.44 hz | React plain-text render baseline | +Cross-library benchmarks measured with `pnpm benchmark:cross-library` on the +marketing email template, using 50 iterations × 10 runs after 3 warmup runs. +Lower average time is better. + +| Library / mode | Avg | Min | Max | Ops/s | Output | Heap Δ | Conformance | vs React Email | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| Solid Email `renderSync` | 1.17ms | 764µs | 1.47ms | 853 | 22.6 KB | **<0.01 MB** | 100% | 1.5x faster | +| Solid Email `compileSync` render (cached) | **12µs** | **9µs** | **15µs** | **83,483** | 23.4 KB | **<0.01 MB** | 100% | **148.4x faster** | +| JSX Email `render` | 3.82ms | 3.25ms | 5.45ms | 262 | **18.2 KB** | 1.15 MB | 100% | 2.1x slower | +| React Email `render` | 1.78ms | 1.37ms | 4.00ms | 563 | 22.5 KB | 26.36 MB | 100% | Baseline | +| MJML React `render` | 11.01ms | 9.39ms | 14.74ms | 91 | 75.5 KB | 1.57 MB | 100% | 6.2x slower | + +All cross-library outputs reached 100% pairwise conformance against the shared +email template checks. + Bundle size compares built ESM entry files after `pnpm build`; gzip uses Node's `zlib.gzipSync`. | Package entry | Raw size | Gzip size | Comparison | | --- | ---: | ---: | --- | | `@akin01/solid-email/dist/index.mjs` | 199.0 KiB | 42.7 KiB | Server/root components and render utility re-exports | | `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB | 19.5 KiB | Browser-condition DOM preview build | -| `@solid-email/render/dist/node/index.mjs` | 26.3 KiB | 6.2 KiB | Renderer entry | -| Solid Email server entries | 225.3 KiB | 48.9 KiB | 6.4x smaller raw / 7.1x smaller gzip than React Email | +| `@solid-email/render/dist/node/index.mjs` | **26.3 KiB** | **6.2 KiB** | Renderer entry | +| Solid Email server entries | 225.3 KiB | 48.9 KiB | **6.4x smaller raw / 7.1x smaller gzip than React Email** | | Solid Email all ESM condition entries | 331.2 KiB | 68.4 KiB | 4.4x smaller raw / 5.1x smaller gzip than React Email | | `react-email/dist/index.mjs` | 1,448.0 KiB | 348.6 KiB | React Email baseline | diff --git a/benchmarks/cross-library/tsconfig.json b/benchmarks/cross-library/tsconfig.json index d391009..5238a1c 100644 --- a/benchmarks/cross-library/tsconfig.json +++ b/benchmarks/cross-library/tsconfig.json @@ -12,7 +12,8 @@ "**/*.mts", "**/*.tsx", "**/*.d.ts", - "../../packages/render/src/shared/solid-js-web-server.d.ts" + "../../packages/render/src/shared/solid-js-web-server.d.ts", + "../../packages/solid-email/src/render-shim.d.ts" ], "exclude": ["dist", "node_modules", "results"] } diff --git a/e2e/cloudflare-tanstack-start/package.json b/e2e/cloudflare-tanstack-start/package.json index a78ad7a..4894da2 100644 --- a/e2e/cloudflare-tanstack-start/package.json +++ b/e2e/cloudflare-tanstack-start/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz", - "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz", - "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz", + "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz", + "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz", "solid-js": "1.9.13" }, "devDependencies": { diff --git a/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml b/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml index 005d266..1845244 100644 --- a/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml +++ b/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml @@ -1,7 +1,7 @@ overrides: - '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz + '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz '@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz - '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz + '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz allowBuilds: esbuild: true diff --git a/e2e/tanstack-start/package.json b/e2e/tanstack-start/package.json index ab37028..110eb01 100644 --- a/e2e/tanstack-start/package.json +++ b/e2e/tanstack-start/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz", - "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz", - "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz", + "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz", + "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz", "solid-js": "1.9.13" }, "devDependencies": { diff --git a/e2e/tanstack-start/pnpm-workspace.yaml b/e2e/tanstack-start/pnpm-workspace.yaml index 8993b4f..922fe16 100644 --- a/e2e/tanstack-start/pnpm-workspace.yaml +++ b/e2e/tanstack-start/pnpm-workspace.yaml @@ -1,7 +1,7 @@ overrides: - '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz + '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz '@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz - '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz + '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz allowBuilds: esbuild: true diff --git a/e2e/vite/package.json b/e2e/vite/package.json index 054e34d..c3d7746 100644 --- a/e2e/vite/package.json +++ b/e2e/vite/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz", - "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz", - "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz", + "@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz", + "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz", "solid-js": "1.9.13" }, "devDependencies": { diff --git a/e2e/vite/pnpm-workspace.yaml b/e2e/vite/pnpm-workspace.yaml index 8993b4f..922fe16 100644 --- a/e2e/vite/pnpm-workspace.yaml +++ b/e2e/vite/pnpm-workspace.yaml @@ -1,7 +1,7 @@ overrides: - '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz + '@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz '@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz - '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz + '@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz allowBuilds: esbuild: true diff --git a/package.json b/package.json index 94a1567..9682a43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solid-email-monorepo", - "version": "0.1.4", + "version": "0.1.5", "private": true, "repository": { "type": "git", diff --git a/packages/render/package.json b/packages/render/package.json index 38b4531..c008dca 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -1,6 +1,6 @@ { "name": "@solid-email/render", - "version": "0.1.4", + "version": "0.1.5", "description": "Transform Solid components into HTML email templates", "repository": { "type": "git", diff --git a/packages/solid-email/package.json b/packages/solid-email/package.json index db12714..7baf630 100644 --- a/packages/solid-email/package.json +++ b/packages/solid-email/package.json @@ -1,6 +1,6 @@ { "name": "@akin01/solid-email", - "version": "0.1.4", + "version": "0.1.5", "description": "High-quality Solid components for creating emails", "repository": { "type": "git", diff --git a/skills/solid-email/SKILL.md b/skills/solid-email/SKILL.md index c89dd6e..2a0640b 100644 --- a/skills/solid-email/SKILL.md +++ b/skills/solid-email/SKILL.md @@ -4,7 +4,7 @@ description: Use when building, reviewing, testing, or documenting HTML email te license: MIT metadata: author: Ainul Yaqin - version: "0.1.4" + version: "0.1.5" homepage: https://github.com/akin01/solid-email source: https://github.com/akin01/solid-email ---