diff --git a/CHANGELOG.md b/CHANGELOG.md
index 29be2b1..d410819 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,60 @@
All notable changes to this project will be documented in this file.
-## Unreleased
+## 2.0.0-beta - 2026-10-02
+
+### Breaking Changes
+
+- Migrated to SolidJS v2.0 (`solid-js@^2.0.0-rc.0` and `@solidjs/web@^2.0.0-rc.0`).
+- Switched JSX runtime and types to `@solidjs/web` across all packages (`jsxImportSource: "@solidjs/web"`).
+- Replaced internal `renderToStringAsync` with `renderToStream` from `@solidjs/web`.
+- Replaced `createResource` and `Suspense` in `Tailwind` with `createMemo` and `Loading` from `solid-js`.
+- Replaced `splitProps` with `omit` across components.
+- Removed legacy `attr:` namespace prefix on HTML attributes in table primitives in favor of standard HTML attributes (`align`, `width`, `border`, `cellpadding`, `cellspacing`).
+- Replaced `vite-plugin-solid` with `@solidjs/vite-plugin`.
+- Bumped minimum Node engine requirement to `>=22.12.0` in alignment with SolidJS v2.
+
+### Added
+
+- Added bounded LRU and WeakMap compilation caching for `@solid-email/html-to-text` `convert()`, achieving nearly 20x faster repeated text conversions.
+- Added selector decision tree caching for Selderee AST parsing.
+- Added a 64KB `Uint8Array` character lookup table for O(1) whitespace classification.
+- Added tag-level memoization (`tagCache`) to `TailwindRenderPlan` for O(1) repeated element inlining.
+- Added direct SSR `{ t: string }` template extraction (`extractSsrHtml`) for slot rendering to bypass redundant `renderToString` root creation.
+- Added `resolveContentSlotName` for case-insensitive slot matching under uppercase text transformations (e.g., headings).
+
+### Changed
+
+- Bumped `@akin01/solid-email`, `@solid-email/render`, and `@solid-email/html-to-text` to `2.0.0-beta`.
+- Bumped private monorepo metadata and Solid Email skill metadata to `2.0.0-beta`.
+- Updated all benchmark suites and E2E integration fixtures (Vite, TanStack Start, Cloudflare TanStack Start) to SolidJS v2.0.
+- Replaced dynamic regex compilation in Tailwind attribute handling with static pre-compiled regexes.
+- Added `noScripts: true` to `solidRenderOptions` for synchronous and streaming SSR.
+
+### Related commits
+
+- SolidJS v2.0 migration
+ - [`d00b107`](https://github.com/Akin01/solid-email/commit/d00b107) `feat: migrate core workspace to SolidJS v2.0`
+- Integration and benchmark updates
+ - [`696635a`](https://github.com/Akin01/solid-email/commit/696635a) `feat(e2e): update integration fixtures for SolidJS v2.0`
+ - [`f060b0e`](https://github.com/Akin01/solid-email/commit/f060b0e) `feat(benchmarks): update benchmark suites and templates for SolidJS v2.0`
+- Performance optimizations
+ - [`3718db6`](https://github.com/Akin01/solid-email/commit/3718db6) `perf(html-to-text): optimize compilation memoization, whitespace classification, and text builder`
+ - [`75d9ab2`](https://github.com/Akin01/solid-email/commit/75d9ab2) `perf(render,solid-email): optimize slot replacement, template parsing, and tailwind inlining`
+
+- Release and documentation
+ - [`7bde2cd`](https://github.com/Akin01/solid-email/commit/7bde2cd) `release: bump version to 2.0.0-beta and update changelog and benchmarks documentation`
+
+### Verified
+
+- `pnpm build`
+- `pnpm test`
+- `pnpm typecheck`
+- `pnpm lint`
+- `pnpm benchmark:rendering`
+- `pnpm benchmark:cross-library`
+- `pnpm benchmark:tailwind`
+- `pnpm benchmark:html-to-text`
## 0.1.5 - 2026-07-05
diff --git a/README.es-ES.md b/README.es-ES.md
index 1133f75..fc6416d 100644
--- a/README.es-ES.md
+++ b/README.es-ES.md
@@ -33,58 +33,58 @@ Solid Email mantiene la experiencia de creación cercana a una aplicación Solid
Medido con `pnpm benchmark:rendering` en el fixture de correo de marketing del repositorio. Un tiempo promedio menor es mejor.
-| Renderizador | Plantilla | Promedio | Tasa | Comparación |
-| --- | --- | ---: | ---: | --- |
-| Solid Email `render()` | JSX estático | 2.2919ms | 436.33 hz | 5.02x más rápido que React Email `render()` |
-| Solid Email `renderSync()` | JSX estático | 1.8935ms | 528.13 hz | 6.08x más rápido que React Email `render()` |
-| Solid Email `render()` | JSX con Tailwind | 3.1230ms | 320.20 hz | 5.69x más rápido que React Email Tailwind |
-| Solid Email `compileSync` render (en caché) | JSX estático | **0.0438ms** | **22,842 hz** | 263x más rápido que React Email `render()` |
-| Solid Email `compile` render (en caché) | JSX estático | 0.0858ms | 11,661 hz | 134x más rápido que React Email `render()` |
-| Solid Email `compile` render (en caché) | JSX con Tailwind | 0.0452ms | 22,145 hz | **393x más rápido que React Email Tailwind** |
-| React Email `render()` | JSX estático | 11.5084ms | 86.89 hz | Línea base |
-| React Email `render()` | JSX con Tailwind | 17.7760ms | 56.26 hz | Línea base Tailwind |
+| Renderizador | Plantilla | Promedio v1 | Promedio v2 | Tasa v2 | Comparación (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| Solid Email `compileSync` (en caché) | JSX estático | 0.0438ms | **0.0386ms** | **25,927 hz** | **294x más rápido** |
+| Solid Email `compile` Tailwind (en caché) | JSX con Tailwind | 0.0452ms | **0.0506ms** | **19,773 hz** | **385x más rápido** |
+| Solid Email `compile` (en caché) | JSX estático | 0.0858ms | **0.0520ms** | **19,240 hz** | **218x más rápido** |
+| Solid Email `renderSync()` | JSX estático | 1.8935ms | **1.2689ms** | **788.08 hz** | **8.95x más rápido** |
+| Solid Email `render()` | JSX estático | 2.2919ms | **1.9760ms** | **506.06 hz** | **5.75x más rápido** |
+| Solid Email `render()` | JSX con Tailwind | 3.1230ms | **2.4926ms** | **401.19 hz** | **7.82x más rápido** |
+| React Email `render()` | JSX estático | 11.5084ms | 10.2234ms | 97.81 hz | Línea base |
+| React Email `render()` | JSX con Tailwind | 17.7760ms | 16.8971ms | 59.18 hz | Línea base Tailwind |
**En caché** significa que la plantilla se compila una vez y solo se mide la etapa de renderizado. Este es el uso esperado en producción: compilar al cargar el módulo y renderizar por solicitud. El costo de compilación+renderizado de "una sola vez" es comparable a llamar a `render()` directamente.
Benchmarks de texto plano medidos con `pnpm benchmark:html-to-text` en los fixtures de HTML a texto del repositorio. Un tiempo promedio menor es mejor.
-| Operación | Fixture | Promedio | Tasa | Comparación |
-| --- | --- | ---: | ---: | --- |
-| `@solid-email/render` `toPlainText` | Fixtures HTML | 2.4369ms | 410.36 hz | 3.40x más rápido que React Email `toPlainText` |
-| `@solid-email/render` plantilla de texto compilada | Solid JSX | **1.4434ms** | **692.83 hz** | **8.61x más rápido que React Email renderizado de texto plano** |
-| `@solid-email/render` `renderSync` texto plano sin compilar | Solid JSX | 2.8895ms | 346.09 hz | 4.30x más rápido que React Email renderizado de texto plano |
-| `@solid-email/html-to-text` `convert` | Fixtures HTML | 3.9657ms | 252.16 hz | Convertidor directo del paquete |
-| `html-to-text` `convert` | Fixtures HTML | 3.8166ms | 262.01 hz | Línea base del convertidor directo |
-| React Email `toPlainText` | Fixtures HTML | 8.2867ms | 120.67 hz | Línea base de conversión de texto de React |
-| React Email `render` texto plano | React JSX | 12.4310ms | 80.44 hz | Línea base de renderizado de texto plano de React |
+| Operación | Fixture | Promedio v1 | Promedio v2 | Tasa v2 | Comparación (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| `@solid-email/render` `toPlainText` | Fixtures HTML | 2.4369ms | **1.7383ms** | **575.29 hz** | **3.58x más rápido** |
+| `@solid-email/render` plantilla de texto compilada | Solid JSX | 1.4434ms | **0.2913ms** | **3,432.87 hz** | **189x más rápido** |
+| `@solid-email/render` `renderSync` texto plano | Solid JSX | 2.8895ms | **3.3323ms** | **300.10 hz** | **3.48x más rápido** |
+| `@solid-email/html-to-text` `convert` | Fixtures HTML | 3.9657ms | **1.6586ms** | **602.91 hz** | **5.56x más rápido** |
+| `html-to-text` `convert` | Fixtures HTML | 3.8166ms | 3.6168ms | 276.48 hz | Línea base del convertidor directo |
+| React Email `toPlainText` | Fixtures HTML | 8.2867ms | 6.2313ms | 160.48 hz | Línea base de conversión de texto de React |
+| React Email `render` texto plano | React JSX | 12.4310ms | 10.7571ms | 92.96 hz | Línea base de renderizado de texto plano de React |
Benchmarks entre librerías medidos con `pnpm benchmark:cross-library` en la plantilla de correo de marketing, utilizando 50 iteraciones × 10 ejecuciones después de 3 ejecuciones de calentamiento. Un tiempo promedio menor es mejor.
-| Librería / modo | Promedio | Mín | Máx | Ops/s | Salida | Heap Δ | Conformidad | vs React Email |
-| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
-| Solid Email `renderSync` | 1.17ms | 764µs | 1.47ms | 853 | 22.6 KB | **<0.01 MB** | 100% | 1.5x más rápido |
-| Solid Email `compileSync` render (en caché) | **12µs** | **9µs** | **15µs** | **83,483** | 23.4 KB | **<0.01 MB** | 100% | **148.4x más rápido** |
-| JSX Email `render` | 3.82ms | 3.25ms | 5.45ms | 262 | **18.2 KB** | 1.15 MB | 100% | 2.1x más lento |
-| React Email `render` | 1.78ms | 1.37ms | 4.00ms | 563 | 22.5 KB | 26.36 MB | 100% | Línea base |
-| MJML React `render` | 11.01ms | 9.39ms | 14.74ms | 91 | 75.5 KB | 1.57 MB | 100% | 6.2x más lento |
+| Librería / modo | Avg v1 | Avg v2 | Mín | Máx | Ops/s | Salida | Heap Δ | Conformidad | vs React Email |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
+| Solid Email `compileSync` (en caché) | 12µs | **20µs** | **17µs** | **27µs** | **49,108** | 23.2 KB | **0.50 MB** | 100% | **125.8x más rápido** |
+| Solid Email `renderSync` | 1.17ms | **645µs** | **501µs** | **897µs** | **1,551** | 22.4 KB | **0.56 MB** | 100% | **4.0x más rápido** |
+| React Email `render` | 1.78ms | 3.31ms | 1.84ms | 7.99ms | 302 | 22.3 KB | 26.51 MB | 100% | Línea base |
+| JSX Email `render` | 3.82ms | 5.13ms | 4.43ms | 7.18ms | 195 | **18.2 KB** | 1.38 MB | 100% | 1.5x más lento |
+| MJML React `render` | 11.01ms | 11.84ms | 10.16ms | 14.80ms | 84 | 75.5 KB | 1.65 MB | 100% | 3.6x más lento |
Todos los resultados entre librerías alcanzaron el 100% de conformidad por pares contra las verificaciones compartidas de la plantilla de correo.
El tamaño del paquete compara los archivos de entrada ESM construidos después de `pnpm build`; gzip utiliza `zlib.gzipSync` de Node.
-| Entrada del paquete | Tamaño sin comprimir | Tamaño gzip | Comparación |
+| Entrada del paquete | v1 Sin comp. (Gzip) | v2 Sin comp. (Gzip) | Comparación |
| --- | ---: | ---: | --- |
-| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB | 42.7 KiB | Componentes de servidor/raíz y re-exportaciones de utilidad de renderizado |
-| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB | 19.5 KiB | Compilación de vista previa DOM condicional para navegador |
-| `@solid-email/render/dist/node/index.mjs` | **26.3 KiB** | **6.2 KiB** | Entrada del renderizador |
-| Entradas de servidor de Solid Email | 225.3 KiB | 48.9 KiB | **6.4x más pequeño sin comprimir / 7.1x más pequeño en gzip que React Email** |
-| Todas las entradas ESM condicionales de Solid Email | 331.2 KiB | 68.4 KiB | 4.4x más pequeño sin comprimir / 5.1x más pequeño en gzip que React Email |
-| `react-email/dist/index.mjs` | 1,448.0 KiB | 348.6 KiB | Línea base de React Email |
+| `@solid-email/render/dist/node/index.mjs` | 26.3 KiB (6.2 KiB) | **26.7 KiB (6.2 KiB)** | Entrada dedicada del renderizador para node/servidor |
+| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB (19.5 KiB) | 106.3 KiB (19.5 KiB) | Compilación de vista previa DOM condicional para navegador |
+| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB (42.7 KiB) | 203.0 KiB (43.3 KiB) | Componentes de servidor/raíz y re-exportaciones de utilidad de renderizado |
+| `@solid-email/render/dist/browser/index.mjs` | — | 197.4 KiB (45.2 KiB) | Entrada del renderizador autónomo para navegador (nuevo en v2) |
+| Entradas de servidor de Solid Email | 225.3 KiB (48.9 KiB) | 229.7 KiB (49.5 KiB) | **4.8x más pequeño sin comprimir / 6.8x más pequeño en gzip que React Email** |
+| Total de distribución `react-email` | 1,448.0 KiB (348.6 KiB) | 1,110.0 KiB (334.7 KiB) | Línea base de React Email |
## Instalación
```sh
-pnpm add @akin01/solid-email @solid-email/render solid-js
+pnpm add @akin01/solid-email @solid-email/render solid-js @solidjs/web
```
## Primeros pasos
@@ -378,5 +378,5 @@ pnpm lint
---
- Construido con ❤️, Licencia MIT.
+ Construido con ❤️ Licencia MIT.
diff --git a/README.id-ID.md b/README.id-ID.md
index cfe7d0e..35482c6 100644
--- a/README.id-ID.md
+++ b/README.id-ID.md
@@ -31,60 +31,60 @@ Solid Email menjaga pengalaman menulis template tetap terasa seperti bikin aplik
Diukur menggunakan `pnpm benchmark:rendering` pada fixture marketing email di repository ini. Semakin rendah waktu rata-rata, semakin baik.
-| Renderer | Template | Rata-rata | Throughput | Perbandingan |
-| --- | --- | ---: | ---: | --- |
-| Solid Email `render()` | Static JSX | 2.2919ms | 436.33 hz | 5,02x lebih cepat dari React Email `render()` |
-| Solid Email `renderSync()` | Static JSX | 1.8935ms | 528.13 hz | 6,08x lebih cepat dari React Email `render()` |
-| Solid Email `render()` | Tailwind JSX | 3.1230ms | 320.20 hz | 5,69x lebih cepat dari React Email Tailwind |
-| Solid Email `compileSync()` render (cached) | Static JSX | **0.0438ms** | **22,842 hz** | 263x lebih cepat dari React Email `render()` |
- | Solid Email `compile()` render (cached) | Static JSX | 0.0858ms | 11,661 hz | 134x lebih cepat dari React Email `render()` |
- | Solid Email `compile()` render (cached) | Tailwind JSX | 0.0452ms | 22,145 hz | **393x lebih cepat dari React Email Tailwind** |
-| React Email `render()` | Static JSX | 11.5084ms | 86.89 hz | Baseline |
-| React Email `render()` | Tailwind JSX | 17.7760ms | 56.26 hz | Baseline Tailwind |
+| Renderer | Template | Rata-rata v1 | Rata-rata v2 | Throughput v2 | Perbandingan (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| Solid Email `compileSync()` (cached) | Static JSX | 0.0438ms | **0.0386ms** | **25,927 hz** | **294x lebih cepat** |
+| Solid Email `compile()` Tailwind (cached) | Tailwind JSX | 0.0452ms | **0.0506ms** | **19,773 hz** | **385x lebih cepat** |
+| Solid Email `compile()` (cached) | Static JSX | 0.0858ms | **0.0520ms** | **19,240 hz** | **218x lebih cepat** |
+| Solid Email `renderSync()` | Static JSX | 1.8935ms | **1.2689ms** | **788.08 hz** | **8,95x lebih cepat** |
+| Solid Email `render()` | Static JSX | 2.2919ms | **1.9760ms** | **506.06 hz** | **5,75x lebih cepat** |
+| Solid Email `render()` | Tailwind JSX | 3.1230ms | **2.4926ms** | **401.19 hz** | **7,82x lebih cepat** |
+| React Email `render()` | Static JSX | 11.5084ms | 10.2234ms | 97.81 hz | Baseline |
+| React Email `render()` | Tailwind JSX | 17.7760ms | 16.8971ms | 59.18 hz | Baseline Tailwind |
**Cached** artinya template di-compile satu kali, lalu yang diukur hanya langkah render-nya saja. Ini adalah pola penggunaan yang umum di production — compile saat module di-load, render setiap ada request. Biaya compile+render sekali jalan kurang lebih setara dengan memanggil `render()` langsung.
Benchmark plain-text diukur menggunakan `pnpm benchmark:html-to-text` pada fixture HTML-to-text di repository ini. Semakin rendah waktu rata-rata, semakin baik.
-| Operasi | Fixture | Rata-rata | Throughput | Perbandingan |
-| --- | --- | ---: | ---: | --- |
-| `@solid-email/render` `toPlainText` | HTML fixtures | 2.4369ms | 410.36 hz | 3,40x lebih cepat dari React Email `toPlainText` |
-| `@solid-email/render` compiled text template | Solid JSX | **1.4434ms** | **692.83 hz** | **8,61x lebih cepat dari React Email plain-text render** |
-| `@solid-email/render` uncompiled `renderSync` plain text | Solid JSX | 2.8895ms | 346.09 hz | 4,30x lebih cepat dari React Email plain-text render |
-| `@solid-email/html-to-text` `convert` | HTML fixtures | 3.9657ms | 252.16 hz | Converter langsung dari package |
-| `html-to-text` `convert` | HTML fixtures | 3.8166ms | 262.01 hz | Baseline converter langsung |
-| React Email `toPlainText` | HTML fixtures | 8.2867ms | 120.67 hz | Baseline konversi teks React |
-| React Email `render` plain text | React JSX | 12.4310ms | 80.44 hz | Baseline plain-text render React |
+| Operasi | Fixture | Rata-rata v1 | Rata-rata v2 | Throughput v2 | Perbandingan (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| `@solid-email/render` `toPlainText` | HTML fixtures | 2.4369ms | **1.7383ms** | **575.29 hz** | **3,58x lebih cepat** |
+| `@solid-email/render` compiled text template | Solid JSX | 1.4434ms | **0.2913ms** | **3,432.87 hz** | **189x lebih cepat** |
+| `@solid-email/render` uncompiled `renderSync` | Solid JSX | 2.8895ms | **3.3323ms** | **300.10 hz** | **3,48x lebih cepat** |
+| `@solid-email/html-to-text` `convert` | HTML fixtures | 3.9657ms | **1.6586ms** | **602.91 hz** | **5,56x lebih cepat** |
+| `html-to-text` `convert` | HTML fixtures | 3.8166ms | 3.6168ms | 276.48 hz | Baseline converter langsung |
+| React Email `toPlainText` | HTML fixtures | 8.2867ms | 6.2313ms | 160.48 hz | Baseline konversi teks React |
+| React Email `render` plain text | React JSX | 12.4310ms | 10.7571ms | 92.96 hz | Baseline plain-text render React |
Benchmark lintas library diukur menggunakan `pnpm benchmark:cross-library` pada
template marketing email, dengan 50 iterasi × 10 run setelah 3 warmup run.
Semakin rendah waktu rata-rata, semakin baik.
-| 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 lebih cepat |
-| Solid Email `compileSync` render (cached) | **12µs** | **9µs** | **15µs** | **83,483** | 23.4 KB | **<0.01 MB** | 100% | **148,4x lebih cepat** |
-| JSX Email `render` | 3.82ms | 3.25ms | 5.45ms | 262 | **18.2 KB** | 1.15 MB | 100% | 2,1x lebih lambat |
-| 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 lebih lambat |
+| Library / mode | Avg v1 | Avg v2 | Min | Max | Ops/s | Output | Heap Δ | Conformance | vs React Email |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
+| Solid Email `compileSync` render (cached) | 12µs | **20µs** | **17µs** | **27µs** | **49,108** | 23.2 KB | **0.50 MB** | 100% | **125,8x lebih cepat** |
+| Solid Email `renderSync` | 1.17ms | **645µs** | **501µs** | **897µs** | **1,551** | 22.4 KB | **0.56 MB** | 100% | **4,0x lebih cepat** |
+| React Email `render` | 1.78ms | 3.31ms | 1.84ms | 7.99ms | 302 | 22.3 KB | 26.51 MB | 100% | Baseline |
+| JSX Email `render` | 3.82ms | 5.13ms | 4.43ms | 7.18ms | 195 | **18.2 KB** | 1.38 MB | 100% | 1,5x lebih lambat |
+| MJML React `render` | 11.01ms | 11.84ms | 10.16ms | 14.80ms | 84 | 75.5 KB | 1.65 MB | 100% | 3,6x lebih lambat |
Semua output lintas library mencapai 100% pairwise conformance terhadap pengecekan template email bersama.
Perbandingan ukuran bundle diambil dari file ESM entry yang sudah di-build setelah `pnpm build`; gzip menggunakan `zlib.gzipSync` dari Node.
-| Package entry | Ukuran raw | Ukuran gzip | Perbandingan |
+| Package entry | v1 Raw (Gzip) | v2 Raw (Gzip) | Perbandingan |
| --- | ---: | ---: | --- |
-| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB | 42.7 KiB | Komponen server/root dan re-export utilitas render |
-| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB | 19.5 KiB | Build preview DOM/CSR untuk kondisi browser |
-| `@solid-email/render/dist/node/index.mjs` | **26.3 KiB** | **6.2 KiB** | Entry renderer |
-| Entry server Solid Email | 225.3 KiB | 48.9 KiB | **6,4x lebih kecil raw / 7,1x lebih kecil gzip dari React Email** |
-| Semua entry kondisi ESM Solid Email | 331.2 KiB | 68.4 KiB | 4,4x lebih kecil raw / 5,1x lebih kecil gzip dari React Email |
-| `react-email/dist/index.mjs` | 1,448.0 KiB | 348.6 KiB | Baseline React Email |
+| `@solid-email/render/dist/node/index.mjs` | 26.3 KiB (6.2 KiB) | **26.7 KiB (6.2 KiB)** | Entry renderer khusus node/server |
+| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB (19.5 KiB) | 106.3 KiB (19.5 KiB) | Build preview DOM/CSR untuk kondisi browser |
+| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB (42.7 KiB) | 203.0 KiB (43.3 KiB) | Komponen server/root dan re-export utilitas render |
+| `@solid-email/render/dist/browser/index.mjs` | — | 197.4 KiB (45.2 KiB) | Entry renderer standalone untuk browser (baru di v2) |
+| Entry server Solid Email | 225.3 KiB (48.9 KiB) | 229.7 KiB (49.5 KiB) | **4,8x lebih kecil raw / 6,8x lebih kecil gzip dari React Email** |
+| Total distribusi `react-email` | 1,448.0 KiB (348.6 KiB) | 1,110.0 KiB (334.7 KiB) | Baseline React Email |
## Instalasi
```sh
-pnpm add @akin01/solid-email @solid-email/render solid-js
+pnpm add @akin01/solid-email @solid-email/render solid-js @solidjs/web
```
## Mulai Menggunakan
@@ -387,5 +387,5 @@ pnpm lint
---
- Dibuat dengan ❤️, Lisensi MIT.
+ Dibuat dengan ❤️ Lisensi MIT.
diff --git a/README.md b/README.md
index bdee9e4..c02b600 100644
--- a/README.md
+++ b/README.md
@@ -31,61 +31,61 @@ Solid Email keeps the authoring experience close to a modern Solid app while pro
Measured with `pnpm benchmark:rendering` on the repository marketing email fixture. Lower mean time is better.
-| Renderer | Template | Mean | Throughput | Comparison |
-| --- | --- | ---: | ---: | --- |
-| 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 `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** |
-| React Email `render()` | Static JSX | 11.5084ms | 86.89 hz | Baseline |
-| React Email `render()` | Tailwind JSX | 17.7760ms | 56.26 hz | Tailwind baseline |
+| Renderer | Template | v1 Mean | v2 Mean | v2 Throughput | Comparison (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| Solid Email `compileSync` (cached) | Static JSX | 0.0438ms | **0.0386ms** | **25,927 hz** | **294x faster** |
+| Solid Email `compile` Tailwind (cached) | Tailwind JSX | 0.0452ms | **0.0506ms** | **19,773 hz** | **385x faster** |
+| Solid Email `compile` (cached) | Static JSX | 0.0858ms | **0.0520ms** | **19,240 hz** | **218x faster** |
+| Solid Email `renderSync()` | Static JSX | 1.8935ms | **1.2689ms** | **788.08 hz** | **8.95x faster** |
+| Solid Email `render()` | Static JSX | 2.2919ms | **1.9760ms** | **506.06 hz** | **5.75x faster** |
+| Solid Email `render()` | Tailwind JSX | 3.1230ms | **2.4926ms** | **401.19 hz** | **7.82x faster** |
+| React Email `render()` | Static JSX | 11.5084ms | 10.2234ms | 97.81 hz | Baseline |
+| React Email `render()` | Tailwind JSX | 17.7760ms | 16.8971ms | 59.18 hz | Tailwind baseline |
**Cached** means the template is compiled once and only the render step is measured. This is the expected production usage — compile at module load, render per request. The "one-time" compile+render cost is comparable to calling `render()` directly.
Plain-text benchmarks measured with `pnpm benchmark:html-to-text` on the repository HTML-to-text fixtures. Lower mean time is better.
-| 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` 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 |
+| Operation | Fixture | v1 Mean | v2 Mean | v2 Throughput | Comparison (vs React Email) |
+| --- | --- | ---: | ---: | ---: | --- |
+| `@solid-email/render` `toPlainText` | HTML fixtures | 2.4369ms | **1.7383ms** | **575.29 hz** | **3.58x faster** |
+| `@solid-email/render` compiled text template | Solid JSX | 1.4434ms | **0.2913ms** | **3,432.87 hz** | **189x faster** |
+| `@solid-email/render` uncompiled `renderSync` | Solid JSX | 2.8895ms | **3.3323ms** | **300.10 hz** | **3.48x faster** |
+| `@solid-email/html-to-text` `convert` | HTML fixtures | 3.9657ms | **1.6586ms** | **602.91 hz** | **5.56x faster** |
+| `html-to-text` `convert` | HTML fixtures | 3.8166ms | 3.6168ms | 276.48 hz | Direct converter baseline |
+| React Email `toPlainText` | HTML fixtures | 8.2867ms | 6.2313ms | 160.48 hz | React text conversion baseline |
+| React Email `render` plain text | React JSX | 12.4310ms | 10.7571ms | 92.96 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 |
+| Library / mode | v1 Avg | v2 Avg | Min | Max | Ops/s | Output | Heap Δ | Conformance | vs React Email |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
+| Solid Email `compileSync` (cached) | 12µs | **20µs** | **17µs** | **27µs** | **49,108** | 23.2 KB | **0.50 MB** | 100% | **125.8x faster** |
+| Solid Email `renderSync` | 1.17ms | **645µs** | **501µs** | **897µs** | **1,551** | 22.4 KB | **0.56 MB** | 100% | **4.0x faster** |
+| React Email `render` | 1.78ms | 3.31ms | 1.84ms | 7.99ms | 302 | 22.3 KB | 26.51 MB | 100% | Baseline |
+| JSX Email `render` | 3.82ms | 5.13ms | 4.43ms | 7.18ms | 195 | **18.2 KB** | 1.38 MB | 100% | 1.5x slower |
+| MJML React `render` | 11.01ms | 11.84ms | 10.16ms | 14.80ms | 84 | 75.5 KB | 1.65 MB | 100% | 3.6x 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 |
+| Package entry | v1 Raw (Gzip) | v2 Raw (Gzip) | 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 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 |
+| `@solid-email/render/dist/node/index.mjs` | 26.3 KiB (6.2 KiB) | **26.7 KiB (6.2 KiB)** | Dedicated node/server renderer entry |
+| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB (19.5 KiB) | 106.3 KiB (19.5 KiB) | Browser-condition DOM preview build |
+| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB (42.7 KiB) | 203.0 KiB (43.3 KiB) | Server/root components and render utility re-exports |
+| `@solid-email/render/dist/browser/index.mjs` | — | 197.4 KiB (45.2 KiB) | Standalone browser renderer entry (new in v2) |
+| Solid Email server entries combined | 225.3 KiB (48.9 KiB) | 229.7 KiB (49.5 KiB) | **4.8x smaller raw / 6.8x smaller gzip than React Email** |
+| `react-email` distribution total | 1,448.0 KiB (348.6 KiB) | 1,110.0 KiB (334.7 KiB) | React Email baseline |
## Install
```sh
-pnpm add @akin01/solid-email @solid-email/render solid-js
+pnpm add @akin01/solid-email @solid-email/render solid-js @solidjs/web
```
## Getting started
@@ -387,5 +387,5 @@ pnpm lint
---
- Build with ❤️, MIT License.
+ Build with ❤️ MIT License.
diff --git a/benchmarks/cross-library/package.json b/benchmarks/cross-library/package.json
index 1469aba..26d2fd8 100644
--- a/benchmarks/cross-library/package.json
+++ b/benchmarks/cross-library/package.json
@@ -2,6 +2,7 @@
"name": "@benchmarks/cross-library",
"private": true,
"version": "0.0.0",
+ "type": "module",
"description": "Cross-library email benchmark: solid-email vs jsx-email vs react-email vs mjml-react",
"scripts": {
"benchmark": "bash run-benchmark.sh",
@@ -15,24 +16,25 @@
},
"dependencies": {
"@akin01/solid-email": "workspace:*",
- "@faire/mjml-react": "^4.0.1",
- "jsx-email": "^3.2.1",
- "mjml": "^5.3.0",
- "react": "19.2.7",
- "react-dom": "19.2.7",
- "react-email": "^6.6.3",
+ "@faire/mjml-react": "catalog:",
+ "jsx-email": "catalog:",
+ "mjml": "catalog:",
+ "react": "catalog:",
+ "react-dom": "catalog:",
+ "react-email": "catalog:",
+ "@solidjs/web": "catalog:",
"solid-js": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@types/react": "catalog:",
- "@types/react-dom": "^19.2.3",
+ "@types/react-dom": "catalog:",
"tsconfig": "workspace:*",
- "tsx": "^4.22.4",
+ "tsx": "catalog:",
"typescript": "catalog:",
"vite": "catalog:",
"vite-node": "^6.0.0",
- "vite-plugin-solid": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
"vitest": "catalog:"
}
}
diff --git a/benchmarks/cross-library/solid/compiled-template.tsx b/benchmarks/cross-library/solid/compiled-template.tsx
index 9cbe0a0..4fe019c 100644
--- a/benchmarks/cross-library/solid/compiled-template.tsx
+++ b/benchmarks/cross-library/solid/compiled-template.tsx
@@ -1,5 +1,5 @@
/** @jsxRuntime automatic */
-/** @jsxImportSource solid-js */
+/** @jsxImportSource @solidjs/web */
import {
Body,
diff --git a/benchmarks/cross-library/solid/template.tsx b/benchmarks/cross-library/solid/template.tsx
index cfcfbbc..a0d4435 100644
--- a/benchmarks/cross-library/solid/template.tsx
+++ b/benchmarks/cross-library/solid/template.tsx
@@ -1,5 +1,5 @@
/** @jsxRuntime automatic */
-/** @jsxImportSource solid-js */
+/** @jsxImportSource @solidjs/web */
import {
Body,
Button,
@@ -16,7 +16,7 @@ import {
Section,
Text,
} from '@akin01/solid-email';
-import type { JSX } from 'solid-js';
+import type { JSX } from '@solidjs/web';
import { For } from 'solid-js';
import {
features,
diff --git a/benchmarks/cross-library/test-templates.tsx b/benchmarks/cross-library/test-templates.tsx
index e21e598..a5b4a70 100644
--- a/benchmarks/cross-library/test-templates.tsx
+++ b/benchmarks/cross-library/test-templates.tsx
@@ -1,5 +1,5 @@
/** @jsxRuntime automatic */
-/** @jsxImportSource solid-js */
+/** @jsxImportSource @solidjs/web */
import {
Body,
diff --git a/benchmarks/cross-library/tsconfig.json b/benchmarks/cross-library/tsconfig.json
index 5238a1c..26d9359 100644
--- a/benchmarks/cross-library/tsconfig.json
+++ b/benchmarks/cross-library/tsconfig.json
@@ -12,7 +12,6 @@
"**/*.mts",
"**/*.tsx",
"**/*.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/benchmarks/cross-library/vite.config.mts b/benchmarks/cross-library/vite.config.mts
index dde12b0..e7d04ff 100644
--- a/benchmarks/cross-library/vite.config.mts
+++ b/benchmarks/cross-library/vite.config.mts
@@ -1,6 +1,6 @@
import { fileURLToPath } from 'node:url';
+import solid from '@solidjs/vite-plugin';
import { defineConfig } from 'vite';
-import solid from 'vite-plugin-solid';
export default defineConfig({
plugins: [
diff --git a/benchmarks/html-to-text/package.json b/benchmarks/html-to-text/package.json
index 71dc64c..92bcfe3 100644
--- a/benchmarks/html-to-text/package.json
+++ b/benchmarks/html-to-text/package.json
@@ -17,10 +17,10 @@
"@akin01/solid-email": "workspace:*",
"@solid-email/html-to-text": "workspace:*",
"@solid-email/render": "workspace:*",
- "html-to-text": "9.0.5",
- "react": "19.2.7",
- "react-dom": "19.2.7",
- "react-email": "6.6.3"
+ "html-to-text": "catalog:",
+ "react": "catalog:",
+ "react-dom": "catalog:",
+ "react-email": "catalog:"
},
"devDependencies": {
"@types/html-to-text": "9.0.4",
@@ -28,7 +28,7 @@
"@types/react": "catalog:",
"tsconfig": "workspace:*",
"typescript": "catalog:",
- "vite-plugin-solid": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
"vitest": "catalog:"
}
}
diff --git a/benchmarks/html-to-text/solid-compiled-template.tsx b/benchmarks/html-to-text/solid-compiled-template.tsx
index 0189787..4989c19 100644
--- a/benchmarks/html-to-text/solid-compiled-template.tsx
+++ b/benchmarks/html-to-text/solid-compiled-template.tsx
@@ -13,7 +13,8 @@ import {
slot,
Text,
} from '@akin01/solid-email';
-import { For, type JSX } from 'solid-js';
+import type { JSX } from '@solidjs/web';
+import { For } from 'solid-js';
import {
standardChecklist,
standardFooterLinks,
diff --git a/benchmarks/html-to-text/tsconfig.json b/benchmarks/html-to-text/tsconfig.json
index bbf6c56..2087fdc 100644
--- a/benchmarks/html-to-text/tsconfig.json
+++ b/benchmarks/html-to-text/tsconfig.json
@@ -14,8 +14,7 @@
"react-text-template.tsx",
"text-render-fixture-data.ts",
"vitest.config.ts",
- "../utils.ts",
- "../../packages/render/src/shared/solid-js-web-server.d.ts"
+ "../utils.ts"
],
"exclude": ["dist", "node_modules"]
}
diff --git a/benchmarks/html-to-text/vitest.config.ts b/benchmarks/html-to-text/vitest.config.ts
index 0f523d5..8987046 100644
--- a/benchmarks/html-to-text/vitest.config.ts
+++ b/benchmarks/html-to-text/vitest.config.ts
@@ -1,7 +1,11 @@
-import solid from 'vite-plugin-solid';
+import solid from '@solidjs/vite-plugin';
import { defineConfig } from 'vitest/config';
export default defineConfig({
+ oxc: false,
+ esbuild: {
+ jsx: 'automatic',
+ },
plugins: [
solid({
exclude: ['**/react-text-template.tsx'],
@@ -26,6 +30,7 @@ export default defineConfig({
},
},
test: {
+ environment: 'node',
benchmark: {
include: ['**/*.bench.ts'],
},
diff --git a/benchmarks/rendering/package.json b/benchmarks/rendering/package.json
index 61d4085..420b481 100644
--- a/benchmarks/rendering/package.json
+++ b/benchmarks/rendering/package.json
@@ -15,9 +15,10 @@
},
"dependencies": {
"@akin01/solid-email": "workspace:*",
- "react": "19.2.7",
- "react-dom": "19.2.7",
- "react-email": "6.6.3",
+ "react": "catalog:",
+ "react-dom": "catalog:",
+ "react-email": "catalog:",
+ "@solidjs/web": "catalog:",
"solid-js": "catalog:"
},
"devDependencies": {
@@ -25,7 +26,7 @@
"@types/react": "catalog:",
"tsconfig": "workspace:*",
"typescript": "catalog:",
- "vite-plugin-solid": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
"vitest": "catalog:"
}
}
diff --git a/benchmarks/rendering/solid-email-template.tsx b/benchmarks/rendering/solid-email-template.tsx
index 5b13f92..8433d00 100644
--- a/benchmarks/rendering/solid-email-template.tsx
+++ b/benchmarks/rendering/solid-email-template.tsx
@@ -14,7 +14,8 @@ import {
Section,
Text,
} from '@akin01/solid-email';
-import { For, type JSX } from 'solid-js';
+import type { JSX } from '@solidjs/web';
+import { For } from 'solid-js';
import {
features,
footerLinks,
diff --git a/benchmarks/rendering/tsconfig.json b/benchmarks/rendering/tsconfig.json
index f953170..d1a1885 100644
--- a/benchmarks/rendering/tsconfig.json
+++ b/benchmarks/rendering/tsconfig.json
@@ -15,7 +15,7 @@
"solid-email-template.tsx",
"../tailwind/solid-tailwind-template.tsx",
"../utils.ts",
- "../../packages/render/src/shared/solid-js-web-server.d.ts"
+ "../../packages/solid-email/src/render-shim.d.ts"
],
"exclude": ["dist", "node_modules"]
}
diff --git a/benchmarks/rendering/vitest.config.ts b/benchmarks/rendering/vitest.config.ts
index 2c0ebb0..359ab49 100644
--- a/benchmarks/rendering/vitest.config.ts
+++ b/benchmarks/rendering/vitest.config.ts
@@ -1,7 +1,11 @@
-import solid from 'vite-plugin-solid';
+import solid from '@solidjs/vite-plugin';
import { defineConfig } from 'vitest/config';
export default defineConfig({
+ oxc: false,
+ esbuild: {
+ jsx: 'automatic',
+ },
plugins: [
solid({
exclude: [
@@ -25,6 +29,7 @@ export default defineConfig({
},
},
test: {
+ environment: 'node',
benchmark: {
include: ['**/*.bench.ts'],
},
diff --git a/benchmarks/tailwind/package.json b/benchmarks/tailwind/package.json
index 2d9b6fa..91df7b6 100644
--- a/benchmarks/tailwind/package.json
+++ b/benchmarks/tailwind/package.json
@@ -15,13 +15,14 @@
},
"dependencies": {
"@akin01/solid-email": "workspace:*",
+ "@solidjs/web": "catalog:",
"solid-js": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"tsconfig": "workspace:*",
"typescript": "catalog:",
- "vite-plugin-solid": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
"vitest": "catalog:"
}
}
diff --git a/benchmarks/tailwind/solid-tailwind-template.tsx b/benchmarks/tailwind/solid-tailwind-template.tsx
index d77b60f..d10f66e 100644
--- a/benchmarks/tailwind/solid-tailwind-template.tsx
+++ b/benchmarks/tailwind/solid-tailwind-template.tsx
@@ -15,7 +15,8 @@ import {
Tailwind,
Text,
} from '@akin01/solid-email';
-import { For, type JSX } from 'solid-js';
+import type { JSX } from '@solidjs/web';
+import { For } from 'solid-js';
import {
features,
footerLinks,
diff --git a/benchmarks/tailwind/tsconfig.json b/benchmarks/tailwind/tsconfig.json
index acffbc0..ff39bdd 100644
--- a/benchmarks/tailwind/tsconfig.json
+++ b/benchmarks/tailwind/tsconfig.json
@@ -13,7 +13,7 @@
"../utils.ts",
"../rendering/fixture-data.ts",
"../rendering/solid-email-template.tsx",
- "../../packages/render/src/shared/solid-js-web-server.d.ts"
+ "../../packages/solid-email/src/render-shim.d.ts"
],
"exclude": ["dist", "node_modules"]
}
diff --git a/benchmarks/tailwind/vitest.config.ts b/benchmarks/tailwind/vitest.config.ts
index bc07b15..5415a15 100644
--- a/benchmarks/tailwind/vitest.config.ts
+++ b/benchmarks/tailwind/vitest.config.ts
@@ -1,4 +1,4 @@
-import solid from 'vite-plugin-solid';
+import solid from '@solidjs/vite-plugin';
import { defineConfig } from 'vitest/config';
export default defineConfig({
@@ -16,6 +16,7 @@ export default defineConfig({
},
},
test: {
+ environment: 'node',
benchmark: {
include: ['**/*.bench.ts'],
},
diff --git a/benchmarks/ui/package.json b/benchmarks/ui/package.json
index 7b505a5..6aed45c 100644
--- a/benchmarks/ui/package.json
+++ b/benchmarks/ui/package.json
@@ -16,13 +16,14 @@
},
"dependencies": {
"@akin01/solid-email": "workspace:*",
+ "@solidjs/web": "catalog:",
"solid-js": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"tsconfig": "workspace:*",
"typescript": "catalog:",
- "vite-plugin-solid": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
"vitest": "catalog:"
}
}
diff --git a/benchmarks/ui/tsconfig.json b/benchmarks/ui/tsconfig.json
index 2a4f4c2..bec8258 100644
--- a/benchmarks/ui/tsconfig.json
+++ b/benchmarks/ui/tsconfig.json
@@ -14,7 +14,7 @@
"../utils.ts",
"../rendering/fixture-data.ts",
"../rendering/solid-email-template.tsx",
- "../../packages/render/src/shared/solid-js-web-server.d.ts"
+ "../../packages/solid-email/src/render-shim.d.ts"
],
"exclude": ["dist", "node_modules"]
}
diff --git a/benchmarks/ui/vitest.config.ts b/benchmarks/ui/vitest.config.ts
index 86e414c..fc1fec0 100644
--- a/benchmarks/ui/vitest.config.ts
+++ b/benchmarks/ui/vitest.config.ts
@@ -1,4 +1,4 @@
-import solid from 'vite-plugin-solid';
+import solid from '@solidjs/vite-plugin';
import { defineConfig } from 'vitest/config';
export default defineConfig({
@@ -16,6 +16,7 @@ export default defineConfig({
},
},
test: {
+ environment: 'node',
benchmark: {
include: ['**/*.bench.tsx'],
},
diff --git a/e2e/cloudflare-tanstack-start/package.json b/e2e/cloudflare-tanstack-start/package.json
index 4894da2..a70759b 100644
--- a/e2e/cloudflare-tanstack-start/package.json
+++ b/e2e/cloudflare-tanstack-start/package.json
@@ -8,19 +8,20 @@
"preview": "vite preview --host 127.0.0.1"
},
"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.5.tgz",
- "@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz",
- "solid-js": "1.9.13"
+ "@solid-email/html-to-text": "workspace:*",
+ "@solid-email/render": "workspace:*",
+ "@akin01/solid-email": "workspace:*",
+ "@solidjs/web": "catalog:",
+ "solid-js": "catalog:"
},
"devDependencies": {
- "@cloudflare/vite-plugin": "1.43.0",
- "@tanstack/solid-router": "1.170.16",
- "@tanstack/solid-start": "1.168.26",
- "@types/node": "25.0.2",
- "typescript": "6.0.3",
- "vite": "7.3.1",
- "vite-plugin-solid": "2.11.12",
- "wrangler": "4.107.0"
+ "@cloudflare/vite-plugin": "catalog:",
+ "@tanstack/solid-router": "catalog:",
+ "@tanstack/solid-start": "catalog:",
+ "@types/node": "catalog:",
+ "typescript": "catalog:",
+ "vite": "catalog:",
+ "@solidjs/vite-plugin": "catalog:",
+ "wrangler": "catalog:"
}
}
diff --git a/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml b/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml
deleted file mode 100644
index 1845244..0000000
--- a/e2e/cloudflare-tanstack-start/pnpm-workspace.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-overrides:
- '@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.5.tgz
-
-allowBuilds:
- esbuild: true
- sharp: true
- workerd: true
diff --git a/e2e/cloudflare-tanstack-start/src/email.server.tsx b/e2e/cloudflare-tanstack-start/src/email.server.tsx
index 8c06a07..56f495d 100644
--- a/e2e/cloudflare-tanstack-start/src/email.server.tsx
+++ b/e2e/cloudflare-tanstack-start/src/email.server.tsx
@@ -21,7 +21,7 @@ import {
xonokai,
} from '@akin01/solid-email';
import { compile, render, Slot, slot } from '@solid-email/render';
-import type { JSX } from 'solid-js';
+import type { JSX } from '@solidjs/web';
type WorkerEmailSlots = {
ctaUrl: string;
diff --git a/e2e/cloudflare-tanstack-start/src/routes/__root.tsx b/e2e/cloudflare-tanstack-start/src/routes/__root.tsx
index ac0bb2c..890c320 100644
--- a/e2e/cloudflare-tanstack-start/src/routes/__root.tsx
+++ b/e2e/cloudflare-tanstack-start/src/routes/__root.tsx
@@ -1,11 +1,12 @@
+import type { JSX } from '@solidjs/web';
+import { HydrationScript } from '@solidjs/web';
import {
createRootRoute,
HeadContent,
Outlet,
Scripts,
} from '@tanstack/solid-router';
-import { type JSX, Suspense } from 'solid-js';
-import { HydrationScript } from 'solid-js/web';
+import { Loading } from 'solid-js';
export const Route = createRootRoute({
component: RootComponent,
@@ -27,7 +28,7 @@ function RootDocument(props: Readonly<{ children: JSX.Element }>): JSX.Element {
- {props.children}
+ {props.children}