@punkestu/react-html 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,9 +33,12 @@ npm link
33
33
  ### CLI Usage
34
34
 
35
35
  ```bash
36
- # Build static site to dist/
36
+ # Build static site to dist/ (with code splitting, islands are ~800 B each)
37
37
  react-html build
38
38
 
39
+ # Ultra-light Preact mode (drops total framework chunk to ~24 KB!)
40
+ react-html build --preact
41
+
39
42
  # Build with custom pages or output directory
40
43
  react-html build --pages src/pages --out dist
41
44
 
@@ -114,20 +117,15 @@ export default function AboutPage() {
114
117
 
115
118
  ---
116
119
 
117
- ### 2. Reactive Components (Islands Architecture)
120
+ ### 2. Reactive Components (Island Auto-Discovery)
118
121
 
119
- When a component needs client-side state and interactivity, wrap it with `island()`:
122
+ When a component needs client-side state and interactivity, simply name the file `*.island.tsx` (or place it inside an `islands/` directory) and **export default** your pure React component. Zero wrapping required!
120
123
 
121
124
  ```tsx
122
- // src/components/Counter.island.tsx
125
+ // src/components/Counter.island.tsx (or src/islands/Counter.tsx)
123
126
  import React, { useState } from 'react';
124
- import { island } from 'react-html';
125
-
126
- export interface CounterProps {
127
- initial?: number;
128
- }
129
127
 
130
- function CounterComponent({ initial = 0 }: CounterProps) {
128
+ export default function Counter({ initial = 0 }: { initial?: number }) {
131
129
  const [count, setCount] = useState(initial);
132
130
 
133
131
  return (
@@ -138,10 +136,6 @@ function CounterComponent({ initial = 0 }: CounterProps) {
138
136
  </div>
139
137
  );
140
138
  }
141
-
142
- // Export the island with its unique name and source path
143
- export const Counter = island(CounterComponent, import.meta.url, 'Counter');
144
- export default Counter;
145
139
  ```
146
140
 
147
141
  Now import and use it in any page just like a normal React component:
@@ -150,7 +144,7 @@ Now import and use it in any page just like a normal React component:
150
144
  // src/pages/index.tsx
151
145
  import React from 'react';
152
146
  import { Layout } from '../components/Layout.js';
153
- import { Counter } from '../components/Counter.island.js';
147
+ import Counter from '../components/Counter.island.js';
154
148
 
155
149
  export default function HomePage() {
156
150
  return (
@@ -163,6 +157,8 @@ export default function HomePage() {
163
157
  }
164
158
  ```
165
159
 
160
+ > 💡 **Manual Island Wrapping (Optional)**: If you prefer explicit wrapping or have dynamic component references, `island(Component, import.meta.url, 'Name')` and `<Island component={...} />` are also supported for full backward compatibility.
161
+
166
162
  **What the engine does:**
167
163
  1. Renders the initial static markup during SSR for instant paint.
168
164
  2. Compiles a dedicated micro-bundle `dist/assets/islands/Counter.js`.
@@ -171,6 +167,53 @@ export default function HomePage() {
171
167
 
172
168
  ---
173
169
 
170
+ ### 3. Pure Vanilla DOM Islands (Zero-React Client Compilation)
171
+
172
+ Want client-side interactivity but **zero React or VDOM runtime on the client**?
173
+
174
+ You can write standard React JSX on the server for DRY markup, and export a native `client(element, props)` controller function in the same island file:
175
+
176
+ ```tsx
177
+ // src/components/VanillaCounter.island.tsx
178
+ import React from 'react';
179
+
180
+ // 1. Server: Pure modular HTML via standard React JSX
181
+ export default function VanillaCounter({ initialCount = 0, step = 1 }: { initialCount?: number; step?: number }) {
182
+ return (
183
+ <div className="counter-box">
184
+ <span className="counter-value">{initialCount}</span>
185
+ <button data-action="dec">- {step}</button>
186
+ <button data-action="inc">+ {step}</button>
187
+ </div>
188
+ );
189
+ }
190
+
191
+ // 2. Client: Pure native DOM controller (Zero React/VDOM runtime!)
192
+ export function client(el: HTMLElement, props: { initialCount?: number; step?: number }) {
193
+ let count = props.initialCount || 0;
194
+ const step = props.step || 1;
195
+ const display = el.querySelector('.counter-value');
196
+
197
+ el.querySelector('[data-action="dec"]')?.addEventListener('click', () => {
198
+ count -= step;
199
+ if (display) display.textContent = String(count);
200
+ });
201
+
202
+ el.querySelector('[data-action="inc"]')?.addEventListener('click', () => {
203
+ count += step;
204
+ if (display) display.textContent = String(count);
205
+ });
206
+ }
207
+ ```
208
+
209
+ **Why this is huge:**
210
+ - **0 KB React, 0 KB ReactDOM, 0 KB Preact**: The engine completely stubs React in the client bundle.
211
+ - **Zero Chunk Imports**: Outputs a single, self-contained standalone `.js` file (~1 KB uncompressed, ~450 bytes gzipped).
212
+ - **Zero Hydration Overhead**: Bypasses VDOM reconciliation and binds native event listeners directly to existing DOM nodes.
213
+ - **Mix & Match**: You can use Pure Vanilla DOM islands and standard React/Preact islands in the very same project without conflict!
214
+
215
+ ---
216
+
174
217
  ## 🛠️ Hydration Directives
175
218
 
176
219
  `react-html` supports client loading directives to maximize performance:
@@ -183,6 +226,20 @@ export default function HomePage() {
183
226
 
184
227
  ---
185
228
 
229
+ ## ⚡ Tiny Island Bundles & Preact Ultra-Light Mode
230
+
231
+ `react-html` uses ESM multi-entry code splitting and comment stripping to keep island bundles tiny:
232
+
233
+ - **Code Splitting by Default**: Component logic is separated from runtime code. `Counter.js` and `Tabs.js` weigh only **~800 bytes to 1 KB** each, importing a shared vendor chunk that the browser caches across all pages.
234
+ - **Ultra-Light Preact Mode (`--preact`)**: Want microscopic client bundles? Pass `--preact` to alias client hydration to `preact/compat`. You still write standard React JSX, but the shared runtime shrinks by **90%** down to **~24 KB uncompressed (~8 KB gzipped)**!
235
+
236
+ ```bash
237
+ # Build with Preact ultra-light runtime
238
+ react-html build --preact
239
+ ```
240
+
241
+ ---
242
+
186
243
  ## 💻 Programmatic API
187
244
 
188
245
  You can also run `react-html` programmatically from your Node.js scripts:
@@ -1 +1 @@
1
- {"version":3,"file":"docs-content.d.ts","sourceRoot":"","sources":["../../src/cli/docs-content.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,UAAU,EAmQpC,CAAC"}
1
+ {"version":3,"file":"docs-content.d.ts","sourceRoot":"","sources":["../../src/cli/docs-content.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,UAAU,EAsUpC,CAAC"}
@@ -90,44 +90,88 @@ export const DOC_SECTIONS = [
90
90
  },
91
91
  {
92
92
  id: 'islands',
93
- title: '4. Reactive Islands Architecture',
94
- summary: 'Compiling interactive React components to tiny client-side JavaScript.',
93
+ title: '4. Reactive Islands Architecture (Auto-Discovery)',
94
+ summary: 'Zero-boilerplate islands: export default pure React components from *.island.tsx.',
95
95
  content: [
96
- '# 4. Reactive Islands Architecture',
96
+ '# 4. Reactive Islands Architecture (Auto-Discovery)',
97
97
  '',
98
98
  'When you need client-side state (useState, useEffect, event listeners):',
99
99
  '',
100
- '1. Create the component and wrap it using island():',
100
+ '1. Simply name your file *.island.tsx (or place in islands/) and export default:',
101
101
  '// src/components/Counter.island.tsx',
102
102
  'import React, { useState } from "react";',
103
- 'import { island } from "react-html";',
104
103
  '',
105
- 'function CounterComponent({ initial = 0 }) {',
104
+ 'export default function Counter({ initial = 0 }) {',
106
105
  ' const [count, setCount] = useState(initial);',
107
106
  ' return (',
108
107
  ' <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>',
109
108
  ' );',
110
109
  '}',
111
110
  '',
112
- 'export const Counter = island(CounterComponent, import.meta.url, "Counter");',
113
- 'export default Counter;',
111
+ 'No island() wrapping required! The engine auto-discovers and wraps it for SSR.',
114
112
  '',
115
113
  '2. Use it in any page just like a normal React component:',
116
114
  '// src/pages/index.tsx',
115
+ 'import Counter from "../components/Counter.island.js";',
117
116
  '<Counter initial={10} />',
118
117
  '',
119
118
  '* HOW THE ENGINE COMPILES IT:',
120
119
  ' - Initial HTML is pre-rendered for instant paint and SEO.',
121
- ' - esbuild bundles ONLY CounterComponent into dist/assets/islands/Counter.js.',
120
+ ' - esbuild bundles ONLY Counter into dist/assets/islands/Counter.js.',
122
121
  ' - Only pages containing <Counter> will have the <script> tag injected.'
123
122
  ]
124
123
  },
124
+ {
125
+ id: 'vanilla-islands',
126
+ title: '5. Pure Vanilla DOM Islands (Zero-React Client)',
127
+ summary: 'Compile islands to pure native DOM JavaScript with zero React/VDOM runtime.',
128
+ content: [
129
+ '# 5. Pure Vanilla DOM Islands (Zero-React Client)',
130
+ '',
131
+ 'Author layouts and components with React JSX on the server, but compile to',
132
+ 'pure native DOM JavaScript on the client with ZERO React or VDOM overhead!',
133
+ '',
134
+ '* HOW TO WRITE A VANILLA ISLAND:',
135
+ ' In your *.island.tsx file, export both:',
136
+ ' 1. `export default function`: React JSX markup rendered on the server.',
137
+ ' 2. `export function client(el, props)`: Pure native DOM controller on the client.',
138
+ '',
139
+ ' // src/components/VanillaCounter.island.tsx',
140
+ ' import React from "react";',
141
+ '',
142
+ ' export default function VanillaCounter({ initialCount = 0, step = 1 }) {',
143
+ ' return (',
144
+ ' <div className="counter-box">',
145
+ ' <span className="counter-value">{initialCount}</span>',
146
+ ' <button data-action="dec">- {step}</button>',
147
+ ' <button data-action="inc">+ {step}</button>',
148
+ ' </div>',
149
+ ' );',
150
+ ' }',
151
+ '',
152
+ ' export function client(el: HTMLElement, props: { initialCount?: number; step?: number }) {',
153
+ ' let count = props.initialCount || 0;',
154
+ ' const step = props.step || 1;',
155
+ ' const display = el.querySelector(".counter-value");',
156
+ ' el.querySelector(\'[data-action="inc"]\')?.addEventListener("click", () => {',
157
+ ' count += step;',
158
+ ' if (display) display.textContent = String(count);',
159
+ ' });',
160
+ ' }',
161
+ '',
162
+ '* THE COMPILED OUTPUT:',
163
+ ' - 0 KB React, 0 KB ReactDOM, 0 KB Preact (React is completely stubbed).',
164
+ ' - Self-contained standalone bundle (~1 KB uncompressed, ~450 B gzipped).',
165
+ ' - Zero framework chunk dependencies (no imports).',
166
+ ' - Full support for client="load", client="idle", and client="visible".'
167
+ ]
168
+ },
125
169
  {
126
170
  id: 'directives',
127
- title: '5. Hydration Directives (Performance)',
171
+ title: '6. Hydration Directives (Performance)',
128
172
  summary: 'Controlling client hydration timing with load, idle, and visible.',
129
173
  content: [
130
- '# 5. Hydration Directives (Performance)',
174
+ '# 6. Hydration Directives (Performance)',
131
175
  '',
132
176
  'Control when JavaScript executes on the user\'s device with the `client` prop:',
133
177
  '',
@@ -146,20 +190,42 @@ export const DOC_SECTIONS = [
146
190
  ' Ideal for carousels, comment sections, or widgets further down the page.'
147
191
  ]
148
192
  },
193
+ {
194
+ id: 'optimization',
195
+ title: '7. Island Size Optimization (Code Splitting & Preact)',
196
+ summary: 'Multi-entry code splitting (~800 B islands) and optional Preact ultra-light mode (~24 KB).',
197
+ content: [
198
+ '# 7. Island Size Optimization',
199
+ '',
200
+ '* MULTI-ENTRY CODE SPLITTING (DEFAULT):',
201
+ ' - react-html automatically splits shared dependencies (React, ReactDOM) into',
202
+ ' a shared chunk (chunks/chunk-[hash].js).',
203
+ ' - Individual island files (Counter.js, Tabs.js) drop to ~800 bytes to 1 KB each!',
204
+ ' - The browser downloads the framework chunk once and caches it across all pages.',
205
+ '',
206
+ '* PREACT ULTRA-LIGHT MODE (--preact):',
207
+ ' - Pass `--preact` to drop the entire framework chunk to ~24 KB uncompressed (~8 KB gzipped):',
208
+ ' $ react-html build --preact',
209
+ ' - Automatically aliases react and react-dom to preact/compat for hydration.',
210
+ ' - Zero component changes needed: write standard React JSX and hooks!'
211
+ ]
212
+ },
149
213
  {
150
214
  id: 'cli',
151
- title: '6. CLI Commands & Options',
215
+ title: '8. CLI Commands & Options',
152
216
  summary: 'Full guide for build, dev, and docs commands.',
153
217
  content: [
154
- '# 6. CLI Commands & Options',
218
+ '# 8. CLI Commands & Options',
155
219
  '',
156
220
  '* BUILD PRODUCTION STATIC SITE:',
157
221
  ' $ react-html build [options]',
158
222
  ' Flags:',
159
- ' --pages <dir> Directory containing pages (default: src/pages or pages)',
160
- ' --out <dir> Output directory (default: dist)',
161
- ' --root <dir> Root directory of the project (default: cwd)',
162
- ' --no-minify Disable JS minification for debugging',
223
+ ' --pages <dir> Directory containing pages (default: src/pages or pages)',
224
+ ' --out <dir> Output directory (default: dist)',
225
+ ' --root <dir> Root directory of the project (default: cwd)',
226
+ ' --client-runtime <type> Island hydration runtime (react | preact, default: react)',
227
+ ' --preact Shortcut for --client-runtime preact (ultra-light ~24 KB)',
228
+ ' --no-minify Disable JS minification for debugging',
163
229
  '',
164
230
  '* START DEV SERVER (LIVE PREVIEW & WATCH):',
165
231
  ' $ react-html dev [options]',
@@ -175,10 +241,10 @@ export const DOC_SECTIONS = [
175
241
  },
176
242
  {
177
243
  id: 'api',
178
- title: '7. Programmatic API Reference',
244
+ title: '9. Programmatic API Reference',
179
245
  summary: 'Using build(), renderPageToHtml(), and createDevServer() in Node.js.',
180
246
  content: [
181
- '# 7. Programmatic API Reference',
247
+ '# 9. Programmatic API Reference',
182
248
  '',
183
249
  'import { build, renderPageToHtml, island, Island } from "react-html";',
184
250
  '',
@@ -187,7 +253,8 @@ export const DOC_SECTIONS = [
187
253
  ' root: process.cwd(),',
188
254
  ' pagesDir: "src/pages",',
189
255
  ' outDir: "dist",',
190
- ' minify: true',
256
+ ' minify: true,',
257
+ ' clientRuntime: "preact" // optional ultra-light mode',
191
258
  ' });',
192
259
  ' // Returns: { pages: [...], islands: [...], outDir: string }',
193
260
  '',
@@ -202,10 +269,10 @@ export const DOC_SECTIONS = [
202
269
  },
203
270
  {
204
271
  id: 'server',
205
- title: '8. Server App Integration (Express, Fastify, Node HTTP)',
272
+ title: '10. Server App Integration (Express, Fastify, Node HTTP)',
206
273
  summary: 'Using createEngine() for production static hosting and development live rebuilds.',
207
274
  content: [
208
- '# 8. Server App Integration (Express, Fastify, Node HTTP)',
275
+ '# 10. Server App Integration (Express, Fastify, Node HTTP)',
209
276
  '',
210
277
  'You can import and use react-html directly inside your backend server application:',
211
278
  '',
@@ -240,10 +307,10 @@ export const DOC_SECTIONS = [
240
307
  },
241
308
  {
242
309
  id: 'troubleshooting',
243
- title: '9. Best Practices & Troubleshooting',
310
+ title: '11. Best Practices & Troubleshooting',
244
311
  summary: 'Avoiding hydration mismatch, React error #418, and styling rules.',
245
312
  content: [
246
- '# 8. Best Practices & Troubleshooting',
313
+ '# 11. Best Practices & Troubleshooting',
247
314
  '',
248
315
  '* PREVENTING HYDRATION MISMATCH (React Error #418):',
249
316
  ' - Ensure server and initial client props match.',
@@ -1 +1 @@
1
- {"version":3,"file":"docs-content.js","sourceRoot":"","sources":["../../src/cli/docs-content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs-content.js","sourceRoot":"","sources":["../../src/cli/docs-content.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAWA,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHlF"}
package/dist/cli/index.js CHANGED
@@ -1,7 +1,13 @@
1
+ import fs from 'node:fs/promises';
1
2
  import path from 'node:path';
2
3
  import { build } from '../index.js';
3
4
  import { createDevServer } from '../server/dev-server.js';
4
5
  import { launchDocsTui } from './tui-docs.js';
6
+ function formatBytes(bytes) {
7
+ if (bytes < 1024)
8
+ return `${bytes} B`;
9
+ return `${(bytes / 1024).toFixed(1)} KB`;
10
+ }
5
11
  export async function runCli(args = process.argv.slice(2)) {
6
12
  const command = args[0] || 'help';
7
13
  function getArgValue(flag) {
@@ -23,12 +29,14 @@ Commands:
23
29
  help Show this help message
24
30
 
25
31
  Options:
26
- --pages <dir> Pages directory (default: src/pages or pages)
27
- --out <dir> Output directory (default: dist)
28
- --port <number> Dev server port (default: 3000)
29
- --host <string> Dev server host (default: localhost)
30
- --no-minify Disable minification for island bundles
31
- --root <path> Project root directory (default: cwd)
32
+ --pages <dir> Pages directory (default: src/pages or pages)
33
+ --out <dir> Output directory (default: dist)
34
+ --port <number> Dev server port (default: 3000)
35
+ --host <string> Dev server host (default: localhost)
36
+ --client-runtime <type> Island hydration runtime ('react' | 'preact', default: 'react')
37
+ --preact Shortcut for '--client-runtime preact' (ultra-light ~4 KB runtime)
38
+ --no-minify Disable minification for island bundles
39
+ --root <path> Project root directory (default: cwd)
32
40
 
33
41
  Docs Options:
34
42
  react-html docs Launch interactive Terminal UI
@@ -38,22 +46,26 @@ Docs Options:
38
46
  return;
39
47
  }
40
48
  if (hasFlag('--version') || hasFlag('-v')) {
41
- console.log(`react-html v0.1.0`);
49
+ console.log(`react-html v0.1.1`);
42
50
  return;
43
51
  }
44
52
  const root = getArgValue('--root') || process.cwd();
45
53
  const pagesDir = getArgValue('--pages');
46
54
  const outDir = getArgValue('--out') || 'dist';
47
55
  const minify = !hasFlag('--no-minify');
56
+ const clientRuntime = (hasFlag('--preact') || getArgValue('--client-runtime') === 'preact')
57
+ ? 'preact'
58
+ : 'react';
48
59
  if (command === 'build') {
49
- console.log(`\n🚀 [react-html] Building static site...`);
60
+ console.log(`\n🚀 [react-html] Building static site (${clientRuntime === 'preact' ? '⚡ Preact Ultra-Light' : 'React 19'})...`);
50
61
  const startTime = Date.now();
51
62
  try {
52
63
  const result = await build({
53
64
  root,
54
65
  pagesDir,
55
66
  outDir,
56
- minify
67
+ minify,
68
+ clientRuntime
57
69
  });
58
70
  console.log(`✅ [react-html] Build successful in ${Date.now() - startTime}ms`);
59
71
  console.log(`📄 Pages compiled (${result.pages.length}):`);
@@ -62,9 +74,19 @@ Docs Options:
62
74
  });
63
75
  if (result.islands.length > 0) {
64
76
  console.log(`🏝️ Reactive islands bundled (${result.islands.length}):`);
65
- result.islands.forEach(isl => {
66
- console.log(` - ${path.relative(root, isl)}`);
67
- });
77
+ for (const isl of result.islands) {
78
+ let sizeStr = '';
79
+ try {
80
+ const st = await fs.stat(isl);
81
+ sizeStr = ` (${formatBytes(st.size)})`;
82
+ }
83
+ catch {
84
+ // ignore
85
+ }
86
+ const isChunk = isl.includes('/chunks/') || isl.includes('\\chunks\\');
87
+ const chunkLabel = isChunk ? ' [shared chunk]' : '';
88
+ console.log(` - ${path.relative(root, isl)}${sizeStr}${chunkLabel}`);
89
+ }
68
90
  }
69
91
  else {
70
92
  console.log(`✨ Pure 100% HTML generated (0 KB JavaScript overhead)`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { IslandInstance } from './island-registry.js';
2
+ export type ClientRuntime = 'react' | 'preact';
2
3
  export interface BundlerOptions {
3
4
  outDir: string;
4
5
  minify?: boolean;
6
+ clientRuntime?: ClientRuntime;
5
7
  }
6
8
  export declare function bundleIslands(islands: IslandInstance[], options: BundlerOptions): Promise<string[]>;
7
9
  //# sourceMappingURL=bundler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/core/bundler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EAAE,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CA0GnB"}
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/core/bundler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EAAE,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgQnB"}
@@ -4,7 +4,7 @@ import { existsSync } from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  export async function bundleIslands(islands, options) {
7
- const { outDir, minify = true } = options;
7
+ const { outDir, minify = true, clientRuntime = 'react' } = options;
8
8
  const islandsOutputDir = path.join(outDir, 'assets', 'islands');
9
9
  await fs.mkdir(islandsOutputDir, { recursive: true });
10
10
  const tempDir = path.resolve(process.cwd(), '.react-html/temp-islands');
@@ -15,7 +15,9 @@ export async function bundleIslands(islands, options) {
15
15
  uniqueIslandsMap.set(island.name, island);
16
16
  }
17
17
  }
18
- const bundledFiles = [];
18
+ if (uniqueIslandsMap.size === 0) {
19
+ return [];
20
+ }
19
21
  // Locate hydrate module
20
22
  const currentDir = import.meta.dirname || path.dirname(fileURLToPath(import.meta.url));
21
23
  let hydratePath = path.resolve(currentDir, '../client/hydrate.js');
@@ -26,6 +28,8 @@ export async function bundleIslands(islands, options) {
26
28
  if (!existsSync(islandClientPath)) {
27
29
  islandClientPath = path.resolve(currentDir, './island-client.ts');
28
30
  }
31
+ const vanillaEntries = {};
32
+ const reactEntries = {};
29
33
  for (const [name, island] of uniqueIslandsMap.entries()) {
30
34
  let resolvedEntry = island.entryPath;
31
35
  if (resolvedEntry.startsWith('file://')) {
@@ -34,48 +38,181 @@ export async function bundleIslands(islands, options) {
34
38
  else {
35
39
  resolvedEntry = path.resolve(resolvedEntry);
36
40
  }
41
+ let fileContent = '';
37
42
  try {
38
- await fs.access(resolvedEntry);
43
+ fileContent = await fs.readFile(resolvedEntry, 'utf8');
39
44
  }
40
45
  catch {
41
46
  console.warn(`[react-html] Warning: Island source file not found for "${name}" at "${resolvedEntry}". Skipping client bundle.`);
42
47
  continue;
43
48
  }
44
- // Create a virtual client entrypoint for this island
49
+ // Check if the island exports a vanilla DOM client function
50
+ const isVanilla = /\bexport\s+(function|const|let|var)\s+client\b/.test(fileContent);
45
51
  const virtualEntryFile = path.join(tempDir, `${name}.entry.ts`);
46
- const virtualEntryCode = `
52
+ if (isVanilla) {
53
+ // Pure Vanilla DOM Island entrypoint
54
+ const virtualEntryCode = `
55
+ import { client } from ${JSON.stringify(resolvedEntry)};
56
+
57
+ function init() {
58
+ document.querySelectorAll(${JSON.stringify(`[data-island="${name}"]`)}).forEach((el) => {
59
+ if (el.hasAttribute('data-hydrated')) return;
60
+
61
+ const rawProps = el.getAttribute('data-props');
62
+ let props = {};
63
+ if (rawProps) {
64
+ try { props = JSON.parse(rawProps); } catch (e) {}
65
+ }
66
+
67
+ const directive = el.getAttribute('data-client') || 'load';
68
+ const doMount = () => {
69
+ if (el.hasAttribute('data-hydrated')) return;
70
+ el.setAttribute('data-hydrated', 'true');
71
+ client(el as HTMLElement, props);
72
+ };
73
+
74
+ switch (directive) {
75
+ case 'idle': {
76
+ if ('requestIdleCallback' in window) {
77
+ (window as any).requestIdleCallback(doMount);
78
+ } else {
79
+ setTimeout(doMount, 200);
80
+ }
81
+ break;
82
+ }
83
+ case 'visible': {
84
+ if ('IntersectionObserver' in window) {
85
+ const obs = new IntersectionObserver((entries, observer) => {
86
+ entries.forEach((entry) => {
87
+ if (entry.isIntersecting) {
88
+ observer.disconnect();
89
+ doMount();
90
+ }
91
+ });
92
+ });
93
+ obs.observe(el);
94
+ } else {
95
+ doMount();
96
+ }
97
+ break;
98
+ }
99
+ case 'load':
100
+ default: {
101
+ if (document.readyState === 'loading') {
102
+ window.addEventListener('DOMContentLoaded', doMount, { once: true });
103
+ } else {
104
+ doMount();
105
+ }
106
+ break;
107
+ }
108
+ }
109
+ });
110
+ }
111
+
112
+ if (document.readyState === 'loading') {
113
+ window.addEventListener('DOMContentLoaded', init, { once: true });
114
+ } else {
115
+ init();
116
+ }
117
+ `;
118
+ await fs.writeFile(virtualEntryFile, virtualEntryCode, 'utf8');
119
+ vanillaEntries[name] = virtualEntryFile;
120
+ }
121
+ else {
122
+ // React / Preact Island entrypoint
123
+ const virtualEntryCode = `
47
124
  import React from 'react';
48
125
  import { hydrateIsland } from ${JSON.stringify(hydratePath)};
49
126
  import * as Module from ${JSON.stringify(resolvedEntry)};
50
127
 
51
- const raw = Module.default || Module[${JSON.stringify(name)}] || Module;
128
+ const mod: Record<string, any> = { ...Module };
129
+ const raw = mod.default ?? mod[${JSON.stringify(name)}] ?? mod;
52
130
  const Component = (raw && raw.__rawComponent) ? raw.__rawComponent : raw;
53
131
 
54
132
  hydrateIsland(${JSON.stringify(name)}, Component);
55
133
  `;
56
- await fs.writeFile(virtualEntryFile, virtualEntryCode, 'utf8');
57
- const outfile = path.join(islandsOutputDir, `${name}.js`);
58
- await esbuild.build({
59
- entryPoints: [virtualEntryFile],
60
- outfile,
134
+ await fs.writeFile(virtualEntryFile, virtualEntryCode, 'utf8');
135
+ reactEntries[name] = virtualEntryFile;
136
+ }
137
+ }
138
+ const bundledFiles = [];
139
+ // 1. Bundle Vanilla Islands: completely stub React so ZERO bytes of React/VDOM are included!
140
+ if (Object.keys(vanillaEntries).length > 0) {
141
+ const vanillaResult = await esbuild.build({
142
+ entryPoints: vanillaEntries,
143
+ outdir: islandsOutputDir,
61
144
  bundle: true,
62
145
  format: 'esm',
63
146
  platform: 'browser',
64
147
  target: ['es2022'],
65
148
  minify,
66
149
  treeShaking: true,
150
+ legalComments: 'none',
151
+ plugins: [
152
+ {
153
+ name: 'stub-react-for-vanilla',
154
+ setup(build) {
155
+ // Stub react, react/jsx-runtime and react-html
156
+ build.onResolve({ filter: /^(react|react\/.*|react-html|@punkestu\/react-html)$/ }, (args) => {
157
+ return { path: args.path, namespace: 'vanilla-empty-stub' };
158
+ });
159
+ build.onLoad({ filter: /.*/, namespace: 'vanilla-empty-stub' }, () => {
160
+ return {
161
+ contents: 'export default {}; export const jsx = () => {}; export const jsxs = () => {}; export const Fragment = ""; export function island(c){return c;}',
162
+ loader: 'js'
163
+ };
164
+ });
165
+ }
166
+ }
167
+ ],
168
+ loader: {
169
+ '.tsx': 'tsx',
170
+ '.ts': 'ts',
171
+ '.jsx': 'jsx',
172
+ '.js': 'js',
173
+ '.css': 'empty'
174
+ },
175
+ metafile: true
176
+ });
177
+ if (vanillaResult.metafile) {
178
+ for (const outPath of Object.keys(vanillaResult.metafile.outputs)) {
179
+ bundledFiles.push(path.resolve(process.cwd(), outPath));
180
+ }
181
+ }
182
+ }
183
+ // 2. Bundle React / Preact Islands with ESM code splitting
184
+ if (Object.keys(reactEntries).length > 0) {
185
+ const alias = {
186
+ 'react-html': islandClientPath,
187
+ ...(clientRuntime === 'preact'
188
+ ? {
189
+ react: 'preact/compat',
190
+ 'react-dom/client': 'preact/compat/client',
191
+ 'react-dom': 'preact/compat'
192
+ }
193
+ : {})
194
+ };
195
+ const reactResult = await esbuild.build({
196
+ entryPoints: reactEntries,
197
+ outdir: islandsOutputDir,
198
+ bundle: true,
199
+ format: 'esm',
200
+ platform: 'browser',
201
+ target: ['es2022'],
202
+ splitting: true,
203
+ chunkNames: 'chunks/[name]-[hash]',
204
+ minify,
205
+ treeShaking: true,
206
+ legalComments: 'none',
67
207
  define: {
68
208
  'process.env.NODE_ENV': '"production"'
69
209
  },
70
- alias: {
71
- 'react-html': islandClientPath
72
- },
210
+ alias,
73
211
  plugins: [
74
212
  {
75
213
  name: 'redirect-react-html-imports',
76
214
  setup(build) {
77
- // Redirect any import of react-html or root index to island-client
78
- build.onResolve({ filter: /(react-html|(\/|\\)(src|dist)(\/|\\)index(\.js|\.mjs|\.ts)?)$/ }, () => {
215
+ build.onResolve({ filter: /(react-html|@punkestu\/react-html|(\/|\\)(src|dist)(\/|\\)index(\.js|\.mjs|\.ts)?)$/ }, () => {
79
216
  return { path: islandClientPath };
80
217
  });
81
218
  }
@@ -87,9 +224,14 @@ hydrateIsland(${JSON.stringify(name)}, Component);
87
224
  '.jsx': 'jsx',
88
225
  '.js': 'js',
89
226
  '.css': 'empty'
90
- }
227
+ },
228
+ metafile: true
91
229
  });
92
- bundledFiles.push(outfile);
230
+ if (reactResult.metafile) {
231
+ for (const outPath of Object.keys(reactResult.metafile.outputs)) {
232
+ bundledFiles.push(path.resolve(process.cwd(), outPath));
233
+ }
234
+ }
93
235
  }
94
236
  // Cleanup virtual entry files
95
237
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/core/bundler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/core/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Checks whether a given file path should be treated as a reactive island.
3
+ * Matches:
4
+ * - *.island.tsx, *.island.jsx, *.island.ts, *.island.js
5
+ * - Any component located in an `islands/` or `src/islands/` folder
6
+ */
7
+ export declare function isIslandFile(filePath: string): boolean;
8
+ /**
9
+ * Derives a clean PascalCase island identifier name from a file path.
10
+ * e.g. "Counter.island.tsx" -> "Counter"
11
+ * e.g. "dropdown-menu.island.jsx" -> "DropdownMenu"
12
+ */
13
+ export declare function getIslandName(filePath: string): string;
14
+ /**
15
+ * Transforms an island component source code to automatically wrap its default export
16
+ * with `island(...)` for server-side rendering, if not already wrapped.
17
+ */
18
+ export declare function transformIslandSource(code: string, filePath: string): string;
19
+ //# sourceMappingURL=island-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-discovery.d.ts","sourceRoot":"","sources":["../../src/core/island-discovery.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6E5E"}
@@ -0,0 +1,92 @@
1
+ import path from 'node:path';
2
+ import { pathToFileURL, fileURLToPath } from 'node:url';
3
+ /**
4
+ * Checks whether a given file path should be treated as a reactive island.
5
+ * Matches:
6
+ * - *.island.tsx, *.island.jsx, *.island.ts, *.island.js
7
+ * - Any component located in an `islands/` or `src/islands/` folder
8
+ */
9
+ export function isIslandFile(filePath) {
10
+ if (filePath.includes('node_modules') || filePath.includes('.test.')) {
11
+ return false;
12
+ }
13
+ const isIslandExt = /\.island\.(tsx|ts|jsx|js)$/i.test(filePath);
14
+ const isInIslandsDir = /(?:^|[\\/])islands[\\/].*?\.(tsx|ts|jsx|js)$/i.test(filePath);
15
+ return isIslandExt || isInIslandsDir;
16
+ }
17
+ /**
18
+ * Derives a clean PascalCase island identifier name from a file path.
19
+ * e.g. "Counter.island.tsx" -> "Counter"
20
+ * e.g. "dropdown-menu.island.jsx" -> "DropdownMenu"
21
+ */
22
+ export function getIslandName(filePath) {
23
+ const base = path.basename(filePath)
24
+ .replace(/\.island\.(tsx|ts|jsx|js)$/i, '')
25
+ .replace(/\.(tsx|ts|jsx|js)$/i, '');
26
+ // Convert kebab-case or snake_case to PascalCase
27
+ const pascal = base.replace(/(?:^|[-_])([a-z0-9])/gi, (_, char) => char.toUpperCase());
28
+ // Ensure it is a valid JavaScript identifier
29
+ return pascal.replace(/[^a-zA-Z0-9_$]/g, '') || 'AnonymousIsland';
30
+ }
31
+ /**
32
+ * Transforms an island component source code to automatically wrap its default export
33
+ * with `island(...)` for server-side rendering, if not already wrapped.
34
+ */
35
+ export function transformIslandSource(code, filePath) {
36
+ // If the file already manually uses island() or createIsland(), preserve it as is
37
+ if (/\bisland\s*\(/i.test(code) || /\bcreateIsland\s*\(/i.test(code)) {
38
+ return code;
39
+ }
40
+ // Must have an export default to auto-wrap
41
+ if (!code.includes('export default')) {
42
+ return code;
43
+ }
44
+ const islandName = getIslandName(filePath);
45
+ const fileUrl = pathToFileURL(path.resolve(filePath)).href;
46
+ let transformed = code;
47
+ let targetIdentifier = '__react_html_island_target__';
48
+ // Case 1: export default function [Name](...) or export default function(...)
49
+ const fnMatch = transformed.match(/export\s+default\s+function(?:\s+([a-zA-Z0-9_$]+))?\s*\(/);
50
+ if (fnMatch) {
51
+ const existingName = fnMatch[1];
52
+ if (existingName) {
53
+ targetIdentifier = existingName;
54
+ transformed = transformed.replace(/export\s+default\s+function\s+([a-zA-Z0-9_$]+)/, 'function $1');
55
+ }
56
+ else {
57
+ transformed = transformed.replace(/export\s+default\s+function\s*\(/, `function ${targetIdentifier}(`);
58
+ }
59
+ }
60
+ // Case 2: export default class [Name]
61
+ else if (/export\s+default\s+class\s+([a-zA-Z0-9_$]+)/.test(transformed)) {
62
+ const classMatch = transformed.match(/export\s+default\s+class\s+([a-zA-Z0-9_$]+)/);
63
+ targetIdentifier = classMatch[1];
64
+ transformed = transformed.replace(/export\s+default\s+class\s+([a-zA-Z0-9_$]+)/, 'class $1');
65
+ }
66
+ // Case 3: export default Identifier;
67
+ else if (/export\s+default\s+([a-zA-Z0-9_$]+)\s*;?$/.test(transformed.trim())) {
68
+ const idMatch = transformed.trim().match(/export\s+default\s+([a-zA-Z0-9_$]+)\s*;?$/);
69
+ if (idMatch) {
70
+ targetIdentifier = idMatch[1];
71
+ transformed = transformed.replace(new RegExp(`export\\s+default\\s+${targetIdentifier}\\s*;?`), '');
72
+ }
73
+ }
74
+ // Case 4: export default <Expression> (e.g. arrow function or memo call)
75
+ else {
76
+ transformed = transformed.replace(/export\s+default\s+/, `const ${targetIdentifier} = `);
77
+ }
78
+ const islandHelperPath = fileURLToPath(new URL('./island.js', import.meta.url));
79
+ // Append island wrapping code
80
+ const wrapperCode = `
81
+ import { island as __react_html_auto_island__ } from ${JSON.stringify(islandHelperPath)};
82
+ const __react_html_wrapped_island__ = __react_html_auto_island__(
83
+ ${targetIdentifier},
84
+ ${JSON.stringify(fileUrl)},
85
+ ${JSON.stringify(islandName)}
86
+ );
87
+ export default __react_html_wrapped_island__;
88
+ export { __react_html_wrapped_island__ as ${islandName} };
89
+ `;
90
+ return `${transformed}\n${wrapperCode}`;
91
+ }
92
+ //# sourceMappingURL=island-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-discovery.js","sourceRoot":"","sources":["../../src/core/island-discovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAyBD,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C9E;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AA2CD,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C9E;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
@@ -3,18 +3,32 @@ import fs from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import crypto from 'node:crypto';
5
5
  import { pathToFileURL } from 'node:url';
6
+ import { isIslandFile, transformIslandSource } from './island-discovery.js';
6
7
  const CACHE_DIR = path.resolve(process.cwd(), '.react-html/cache');
7
- // Plugin to replace import.meta.url with the real source file URL
8
- const importMetaUrlPlugin = {
9
- name: 'preserve-import-meta-url',
8
+ // Plugin to auto-wrap island components and preserve import.meta.url
9
+ const islandAndMetaPlugin = {
10
+ name: 'island-auto-discovery-and-meta',
10
11
  setup(build) {
11
12
  build.onLoad({ filter: /\.(tsx|ts|jsx|js)$/ }, async (args) => {
12
13
  if (args.path.includes('node_modules'))
13
14
  return null;
14
15
  let text = await fs.readFile(args.path, 'utf8');
16
+ let modified = false;
17
+ // 1. Auto-wrap island files if they match island conventions
18
+ if (isIslandFile(args.path)) {
19
+ const transformed = transformIslandSource(text, args.path);
20
+ if (transformed !== text) {
21
+ text = transformed;
22
+ modified = true;
23
+ }
24
+ }
25
+ // 2. Preserve real file URL for any import.meta.url
15
26
  if (text.includes('import.meta.url')) {
16
27
  const fileUrl = pathToFileURL(args.path).href;
17
28
  text = text.replaceAll('import.meta.url', JSON.stringify(fileUrl));
29
+ modified = true;
30
+ }
31
+ if (modified) {
18
32
  const ext = path.extname(args.path).slice(1);
19
33
  return {
20
34
  contents: text,
@@ -40,7 +54,7 @@ export async function loadPageModule(pageFilePath) {
40
54
  target: 'node22',
41
55
  packages: 'external',
42
56
  sourcemap: 'inline',
43
- plugins: [importMetaUrlPlugin],
57
+ plugins: [islandAndMetaPlugin],
44
58
  loader: {
45
59
  '.tsx': 'tsx',
46
60
  '.ts': 'ts',
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,9 @@ export { Island, island } from './core/island.js';
2
2
  export type { IslandProps } from './core/island.js';
3
3
  export { hydrateIsland } from './client/hydrate.js';
4
4
  export { renderPageToHtml } from './core/renderer.js';
5
+ export { isIslandFile, getIslandName, transformIslandSource } from './core/island-discovery.js';
6
+ export { bundleIslands } from './core/bundler.js';
7
+ export type { ClientRuntime, BundlerOptions } from './core/bundler.js';
5
8
  export { createEngine, ReactHtmlEngine } from './server/engine.js';
6
9
  export type { EngineOptions } from './server/engine.js';
7
10
  export interface BuildConfig {
@@ -10,6 +13,7 @@ export interface BuildConfig {
10
13
  outDir?: string;
11
14
  publicDir?: string;
12
15
  minify?: boolean;
16
+ clientRuntime?: 'react' | 'preact';
13
17
  }
14
18
  export interface BuildResult {
15
19
  pages: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,KAAK,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyF1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,KAAK,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6F1E"}
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ import { bundleIslands } from './core/bundler.js';
6
6
  export { Island, island } from './core/island.js';
7
7
  export { hydrateIsland } from './client/hydrate.js';
8
8
  export { renderPageToHtml } from './core/renderer.js';
9
+ export { isIslandFile, getIslandName, transformIslandSource } from './core/island-discovery.js';
10
+ export { bundleIslands } from './core/bundler.js';
9
11
  export { createEngine, ReactHtmlEngine } from './server/engine.js';
10
12
  async function findFilesRecursively(dir, extensions) {
11
13
  const entries = await fs.readdir(dir, { withFileTypes: true });
@@ -91,7 +93,11 @@ export async function build(config = {}) {
91
93
  // Bundle reactive islands
92
94
  let bundledIslands = [];
93
95
  if (allDiscoveredIslands.length > 0) {
94
- bundledIslands = await bundleIslands(allDiscoveredIslands, { outDir, minify });
96
+ bundledIslands = await bundleIslands(allDiscoveredIslands, {
97
+ outDir,
98
+ minify,
99
+ clientRuntime: config.clientRuntime
100
+ });
95
101
  }
96
102
  // Cleanup compile cache
97
103
  await clearCache();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { ClientRuntime } from '../core/bundler.js';
2
3
  export interface EngineOptions {
3
4
  /** Project root directory (default: process.cwd()) */
4
5
  root?: string;
@@ -12,6 +13,8 @@ export interface EngineOptions {
12
13
  isProduction?: boolean;
13
14
  /** Base asset URL prefix (default: '/') */
14
15
  basePath?: string;
16
+ /** Client runtime for island hydration ('react' | 'preact', default: 'react') */
17
+ clientRuntime?: ClientRuntime;
15
18
  }
16
19
  export declare class ReactHtmlEngine {
17
20
  readonly root: string;
@@ -20,6 +23,7 @@ export declare class ReactHtmlEngine {
20
23
  readonly publicDir: string;
21
24
  readonly isProduction: boolean;
22
25
  readonly basePath: string;
26
+ readonly clientRuntime: ClientRuntime;
23
27
  constructor(options?: EngineOptions);
24
28
  /**
25
29
  * Render a page by name or route.
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/server/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAMjE,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD,qBAAa,eAAe;IAC1B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,YAAY,EAAE,OAAO,CAAC;IACtC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,OAAO,GAAE,aAAkB;IA6BvC;;;;OAIG;IACU,MAAM,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAgDlB;;;OAGG;IACI,UAAU,GACf,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,OAAO,MAAM,IAAI,KAChB,OAAO,CAAC,IAAI,CAAC,CAoEd;IAEF;;OAEG;IACI,MAAM,GAAI,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CAExE;YAEY,iBAAiB;YAejB,mBAAmB;CA4BlC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,eAAe,CAEzE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/server/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,EAAiB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGlE,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAiBD,qBAAa,eAAe;IAC1B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,YAAY,EAAE,OAAO,CAAC;IACtC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,aAAa,EAAE,aAAa,CAAC;gBAEjC,OAAO,GAAE,aAAkB;IA8BvC;;;;OAIG;IACU,MAAM,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAiDlB;;;OAGG;IACI,UAAU,GACf,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,OAAO,MAAM,IAAI,KAChB,OAAO,CAAC,IAAI,CAAC,CAoEd;IAEF;;OAEG;IACI,MAAM,GAAI,KAAK,eAAe,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CAExE;YAEY,iBAAiB;YAejB,mBAAmB;CA4BlC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,eAAe,CAEzE"}
@@ -25,6 +25,7 @@ export class ReactHtmlEngine {
25
25
  publicDir;
26
26
  isProduction;
27
27
  basePath;
28
+ clientRuntime;
28
29
  constructor(options = {}) {
29
30
  this.root = path.resolve(options.root || process.cwd());
30
31
  this.isProduction =
@@ -32,6 +33,7 @@ export class ReactHtmlEngine {
32
33
  ? options.isProduction
33
34
  : process.env.NODE_ENV === 'production';
34
35
  this.basePath = options.basePath || '/';
36
+ this.clientRuntime = options.clientRuntime || 'react';
35
37
  // Resolve distDir
36
38
  this.distDir = path.resolve(this.root, options.distDir || 'dist');
37
39
  this.publicDir = path.resolve(this.root, options.publicDir || 'public');
@@ -90,7 +92,8 @@ export class ReactHtmlEngine {
90
92
  if (islands.length > 0) {
91
93
  await bundleIslands(islands, {
92
94
  outDir: this.distDir,
93
- minify: this.isProduction
95
+ minify: this.isProduction,
96
+ clientRuntime: this.clientRuntime
94
97
  });
95
98
  }
96
99
  return html;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/server/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/server/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAiB,MAAM,oBAAoB,CAAC;AAoBlE,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,uCAAuC;IAC9C,MAAM,EAAE,uCAAuC;IAC/C,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,YAAY;CACvB,CAAC;AAEF,MAAM,OAAO,eAAe;IACV,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,YAAY,CAAU;IACtB,QAAQ,CAAS;IACjB,aAAa,CAAgB;IAE7C,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY;YACf,OAAO,CAAC,YAAY,KAAK,SAAS;gBAChC,CAAC,CAAC,OAAO,CAAC,YAAY;gBACtB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC;QAEtD,kBAAkB;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;QAExE,mBAAmB;QACnB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClB,KAAK,GAAG,CAAC,CAAC;oBACV,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CACjB,SAAiB,EACjB,QAAiC,EAAE,EACnC,WAAoC,EAAE;QAEtC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QAEhE,iDAAiD;QACjD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG;gBACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,cAAc,OAAO,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,CAAC;aACtD,CAAC;YAEF,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;gBACvC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,sBAAsB,SAAS,mBAAmB,IAAI,CAAC,QAAQ,IAAI,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;QAEpD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC;YACzC,QAAQ,EAAE,cAAc;YACxB,SAAS;YACT,KAAK;YACL,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,iFAAiF;QACjF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,aAAa,CAAC,OAAO,EAAE;gBAC3B,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,UAAU,GAAG,KAAK,EACvB,GAAoB,EACpB,GAAmB,EACnB,IAAiB,EACF,EAAE;QACjB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACjF,IAAI,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhD,2DAA2D;QAC3D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,aAAa,CAAC,WAAW;gBACzC,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;aAC/C,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,0BAA0B;QAC1B,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;QAClD,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC;YACH,2CAA2C;YAC3C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,cAAc,GAAG;oBACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC;iBAC7C,CAAC;gBACF,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;oBACvC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;4BACjB,cAAc,EAAE,0BAA0B;4BAC1C,gBAAgB,EAAE,OAAO,CAAC,MAAM;yBACjC,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACjB,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACvD,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACzC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;wBACjB,cAAc,EAAE,0BAA0B;wBAC1C,gBAAgB,EAAE,MAAM,CAAC,MAAM;qBAChC,CAAC,CAAC;oBACH,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAChB,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,kDAAkD,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC;YACnF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,8BAA8B,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,mCAAmC,QAAQ,kBAAkB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACI,MAAM,GAAG,CAAC,GAAoB,EAAE,GAAmB,EAAiB,EAAE;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,cAAsB;QACpD,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG;YACjB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC;YAC7E,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;SAClF,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,QAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;SACrC,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;wBAClB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBAC5C,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;wBAClE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@punkestu/react-html",
3
- "version": "0.1.1",
3
+ "version": "1.0.0",
4
4
  "description": "Engine to convert React/JSX to pure HTML with selective reactive island compilation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,6 +38,7 @@
38
38
  "license": "MIT",
39
39
  "dependencies": {
40
40
  "esbuild": "^0.25.0",
41
+ "preact": "^11.1.1",
41
42
  "react": "^19.0.0",
42
43
  "react-dom": "^19.0.0"
43
44
  },