@punkestu/react-html 0.1.0 → 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.
Files changed (93) hide show
  1. package/README.md +72 -15
  2. package/dist/cli/docs-content.d.ts +8 -0
  3. package/dist/cli/docs-content.d.ts.map +1 -0
  4. package/dist/cli/docs-content.js +328 -0
  5. package/dist/cli/docs-content.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +135 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/tui-docs.d.ts +5 -0
  11. package/dist/cli/tui-docs.d.ts.map +1 -0
  12. package/dist/cli/tui-docs.js +191 -0
  13. package/dist/cli/tui-docs.js.map +1 -0
  14. package/dist/client/hydrate.d.ts +4 -0
  15. package/dist/client/hydrate.d.ts.map +1 -0
  16. package/dist/client/hydrate.js +80 -0
  17. package/dist/client/hydrate.js.map +1 -0
  18. package/dist/core/bundler.d.ts +9 -0
  19. package/dist/core/bundler.d.ts.map +1 -0
  20. package/dist/core/bundler.js +245 -0
  21. package/dist/core/bundler.js.map +1 -0
  22. package/dist/core/formatter.d.ts +6 -0
  23. package/dist/core/formatter.d.ts.map +1 -0
  24. package/dist/core/formatter.js +74 -0
  25. package/dist/core/formatter.js.map +1 -0
  26. package/dist/core/island-client.d.ts +9 -0
  27. package/dist/core/island-client.d.ts.map +1 -0
  28. package/dist/core/island-client.js +8 -0
  29. package/dist/core/island-client.js.map +1 -0
  30. package/dist/core/island-discovery.d.ts +19 -0
  31. package/dist/core/island-discovery.d.ts.map +1 -0
  32. package/dist/core/island-discovery.js +92 -0
  33. package/dist/core/island-discovery.js.map +1 -0
  34. package/dist/core/island-registry.d.ts +15 -0
  35. package/dist/core/island-registry.d.ts.map +1 -0
  36. package/dist/core/island-registry.js +17 -0
  37. package/dist/core/island-registry.js.map +1 -0
  38. package/dist/core/island.d.ts +32 -0
  39. package/dist/core/island.d.ts.map +1 -0
  40. package/dist/core/island.js +47 -0
  41. package/dist/core/island.js.map +1 -0
  42. package/dist/core/loader.d.ts +11 -0
  43. package/dist/core/loader.d.ts.map +1 -0
  44. package/dist/core/loader.js +87 -0
  45. package/dist/core/loader.js.map +1 -0
  46. package/dist/core/renderer.d.ts +20 -0
  47. package/dist/core/renderer.d.ts.map +1 -0
  48. package/dist/core/renderer.js +53 -0
  49. package/dist/core/renderer.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +110 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/server/dev-server.d.ts +8 -0
  55. package/dist/server/dev-server.d.ts.map +1 -0
  56. package/dist/server/dev-server.js +112 -0
  57. package/dist/server/dev-server.js.map +1 -0
  58. package/dist/server/engine.d.ts +50 -0
  59. package/dist/server/engine.d.ts.map +1 -0
  60. package/dist/server/engine.js +225 -0
  61. package/dist/server/engine.js.map +1 -0
  62. package/{src/server/index.ts → dist/server/index.d.ts} +1 -1
  63. package/dist/server/index.d.ts.map +1 -0
  64. package/dist/server/index.js +3 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/package.json +5 -1
  67. package/.react-html/cache/page-fefe905ae5d2.mjs +0 -9
  68. package/DOCS.md +0 -317
  69. package/example/public/styles.css +0 -184
  70. package/example/src/components/Card.tsx +0 -17
  71. package/example/src/components/Counter.island.tsx +0 -35
  72. package/example/src/components/Footer.tsx +0 -13
  73. package/example/src/components/Header.tsx +0 -20
  74. package/example/src/components/Layout.tsx +0 -39
  75. package/example/src/components/Tabs.island.tsx +0 -59
  76. package/example/src/pages/index.tsx +0 -49
  77. package/example/src/pages/pure.tsx +0 -56
  78. package/src/cli/docs-content.ts +0 -268
  79. package/src/cli/index.ts +0 -113
  80. package/src/cli/tui-docs.ts +0 -214
  81. package/src/client/hydrate.ts +0 -84
  82. package/src/core/bundler.ts +0 -122
  83. package/src/core/formatter.ts +0 -92
  84. package/src/core/island-client.ts +0 -23
  85. package/src/core/island-registry.ts +0 -35
  86. package/src/core/island.tsx +0 -110
  87. package/src/core/loader.ts +0 -89
  88. package/src/core/renderer.ts +0 -80
  89. package/src/index.ts +0 -138
  90. package/src/server/dev-server.ts +0 -125
  91. package/src/server/engine.ts +0 -270
  92. package/tests/engine.test.mjs +0 -288
  93. package/tsconfig.json +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import http from 'node:http';
2
+ import { BuildConfig } from '../index.js';
3
+ export interface DevServerOptions extends BuildConfig {
4
+ port?: number;
5
+ host?: string;
6
+ }
7
+ export declare function createDevServer(options?: DevServerOptions): Promise<http.Server>;
8
+ //# sourceMappingURL=dev-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAS,WAAW,EAAE,MAAM,aAAa,CAAC;AAiBjD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAiG1F"}
@@ -0,0 +1,112 @@
1
+ import http from 'node:http';
2
+ import fs from 'node:fs/promises';
3
+ import { existsSync, watch } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { build } from '../index.js';
6
+ const MIME_TYPES = {
7
+ '.html': 'text/html; charset=utf-8',
8
+ '.js': 'application/javascript; charset=utf-8',
9
+ '.mjs': 'application/javascript; charset=utf-8',
10
+ '.css': 'text/css; charset=utf-8',
11
+ '.json': 'application/json; charset=utf-8',
12
+ '.png': 'image/png',
13
+ '.jpg': 'image/jpeg',
14
+ '.jpeg': 'image/jpeg',
15
+ '.gif': 'image/gif',
16
+ '.svg': 'image/svg+xml',
17
+ '.ico': 'image/x-icon',
18
+ '.woff2': 'font/woff2'
19
+ };
20
+ export async function createDevServer(options = {}) {
21
+ const port = options.port || 3000;
22
+ const host = options.host || 'localhost';
23
+ const root = path.resolve(options.root || process.cwd());
24
+ const outDir = path.resolve(root, options.outDir || 'dist');
25
+ console.log(`[react-html] Performing initial build...`);
26
+ await build({ ...options, minify: false });
27
+ console.log(`[react-html] Build completed.`);
28
+ // Setup file watcher with debounce
29
+ let isRebuilding = false;
30
+ let rebuildTimeout = null;
31
+ const triggerRebuild = () => {
32
+ if (rebuildTimeout)
33
+ clearTimeout(rebuildTimeout);
34
+ rebuildTimeout = setTimeout(async () => {
35
+ if (isRebuilding)
36
+ return;
37
+ isRebuilding = true;
38
+ try {
39
+ console.log(`[react-html] Change detected, rebuilding...`);
40
+ const startTime = Date.now();
41
+ await build({ ...options, minify: false });
42
+ console.log(`[react-html] Rebuild finished in ${Date.now() - startTime}ms`);
43
+ }
44
+ catch (err) {
45
+ console.error(`[react-html] Rebuild error:`, err);
46
+ }
47
+ finally {
48
+ isRebuilding = false;
49
+ }
50
+ }, 100);
51
+ };
52
+ const watchDirs = ['src', 'pages', 'public'].map(d => path.join(root, d)).filter(existsSync);
53
+ for (const dir of watchDirs) {
54
+ try {
55
+ watch(dir, { recursive: true }, (event, filename) => {
56
+ if (filename && !filename.includes('.react-html') && !filename.includes('dist')) {
57
+ triggerRebuild();
58
+ }
59
+ });
60
+ }
61
+ catch {
62
+ // Fallback
63
+ }
64
+ }
65
+ const server = http.createServer(async (req, res) => {
66
+ try {
67
+ const url = new URL(req.url || '/', `http://${host}:${port}`);
68
+ let pathname = decodeURIComponent(url.pathname);
69
+ if (pathname.endsWith('/')) {
70
+ pathname += 'index.html';
71
+ }
72
+ let filePath = path.join(outDir, pathname);
73
+ // If no extension, check if an .html file exists
74
+ if (!path.extname(filePath)) {
75
+ if (existsSync(`${filePath}.html`)) {
76
+ filePath = `${filePath}.html`;
77
+ }
78
+ else if (existsSync(path.join(filePath, 'index.html'))) {
79
+ filePath = path.join(filePath, 'index.html');
80
+ }
81
+ }
82
+ if (!existsSync(filePath)) {
83
+ res.writeHead(404, { 'Content-Type': 'text/html' });
84
+ res.end(`<h1>404 Not Found</h1><p>File not found: ${pathname}</p>`);
85
+ return;
86
+ }
87
+ const stat = await fs.stat(filePath);
88
+ if (stat.isDirectory()) {
89
+ filePath = path.join(filePath, 'index.html');
90
+ }
91
+ const ext = path.extname(filePath).toLowerCase();
92
+ const contentType = MIME_TYPES[ext] || 'application/octet-stream';
93
+ const content = await fs.readFile(filePath);
94
+ res.writeHead(200, {
95
+ 'Content-Type': contentType,
96
+ 'Content-Length': content.length
97
+ });
98
+ res.end(content);
99
+ }
100
+ catch (err) {
101
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
102
+ res.end(`500 Internal Server Error: ${err?.message || err}`);
103
+ }
104
+ });
105
+ return new Promise((resolve) => {
106
+ server.listen(port, host, () => {
107
+ console.log(`[react-html] Dev server running at http://${host}:${port}/`);
108
+ resolve(server);
109
+ });
110
+ });
111
+ }
112
+ //# sourceMappingURL=dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { ClientRuntime } from '../core/bundler.js';
3
+ export interface EngineOptions {
4
+ /** Project root directory (default: process.cwd()) */
5
+ root?: string;
6
+ /** Source pages directory (default: 'src/pages' or 'pages') */
7
+ pagesDir?: string;
8
+ /** Production build output directory (default: 'dist') */
9
+ distDir?: string;
10
+ /** Static public directory (default: 'public') */
11
+ publicDir?: string;
12
+ /** Force production mode. If omitted, checks process.env.NODE_ENV === 'production' */
13
+ isProduction?: boolean;
14
+ /** Base asset URL prefix (default: '/') */
15
+ basePath?: string;
16
+ /** Client runtime for island hydration ('react' | 'preact', default: 'react') */
17
+ clientRuntime?: ClientRuntime;
18
+ }
19
+ export declare class ReactHtmlEngine {
20
+ readonly root: string;
21
+ readonly pagesDir: string;
22
+ readonly distDir: string;
23
+ readonly publicDir: string;
24
+ readonly isProduction: boolean;
25
+ readonly basePath: string;
26
+ readonly clientRuntime: ClientRuntime;
27
+ constructor(options?: EngineOptions);
28
+ /**
29
+ * Render a page by name or route.
30
+ * - In production: checks for pre-built static HTML in dist/ first.
31
+ * - In development: recompiles the TSX page on the fly and bundles any needed reactive islands.
32
+ */
33
+ render(pageRoute: string, props?: Record<string, unknown>, metadata?: Record<string, unknown>): Promise<string>;
34
+ /**
35
+ * Universal Connect / Express / Node.js HTTP middleware.
36
+ * Handles page routes and static assets according to environment mode.
37
+ */
38
+ middleware: (req: IncomingMessage, res: ServerResponse, next?: () => void) => Promise<void>;
39
+ /**
40
+ * Standalone HTTP request handler suitable for http.createServer(engine.handle)
41
+ */
42
+ handle: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
43
+ private resolveSourcePage;
44
+ private tryServeStaticAsset;
45
+ }
46
+ /**
47
+ * Factory function to create a new ReactHtmlEngine instance
48
+ */
49
+ export declare function createEngine(options?: EngineOptions): ReactHtmlEngine;
50
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +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;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"}
@@ -0,0 +1,225 @@
1
+ import fs from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { loadPageModule } from '../core/loader.js';
5
+ import { renderPageToHtml } from '../core/renderer.js';
6
+ import { bundleIslands } from '../core/bundler.js';
7
+ const MIME_TYPES = {
8
+ '.html': 'text/html; charset=utf-8',
9
+ '.js': 'application/javascript; charset=utf-8',
10
+ '.mjs': 'application/javascript; charset=utf-8',
11
+ '.css': 'text/css; charset=utf-8',
12
+ '.json': 'application/json; charset=utf-8',
13
+ '.png': 'image/png',
14
+ '.jpg': 'image/jpeg',
15
+ '.jpeg': 'image/jpeg',
16
+ '.gif': 'image/gif',
17
+ '.svg': 'image/svg+xml',
18
+ '.ico': 'image/x-icon',
19
+ '.woff2': 'font/woff2'
20
+ };
21
+ export class ReactHtmlEngine {
22
+ root;
23
+ pagesDir;
24
+ distDir;
25
+ publicDir;
26
+ isProduction;
27
+ basePath;
28
+ clientRuntime;
29
+ constructor(options = {}) {
30
+ this.root = path.resolve(options.root || process.cwd());
31
+ this.isProduction =
32
+ options.isProduction !== undefined
33
+ ? options.isProduction
34
+ : process.env.NODE_ENV === 'production';
35
+ this.basePath = options.basePath || '/';
36
+ this.clientRuntime = options.clientRuntime || 'react';
37
+ // Resolve distDir
38
+ this.distDir = path.resolve(this.root, options.distDir || 'dist');
39
+ this.publicDir = path.resolve(this.root, options.publicDir || 'public');
40
+ // Resolve pagesDir
41
+ if (options.pagesDir) {
42
+ this.pagesDir = path.resolve(this.root, options.pagesDir);
43
+ }
44
+ else {
45
+ const candidates = ['src/pages', 'pages'];
46
+ let found = path.join(this.root, 'src/pages');
47
+ for (const cand of candidates) {
48
+ const p = path.join(this.root, cand);
49
+ if (existsSync(p)) {
50
+ found = p;
51
+ break;
52
+ }
53
+ }
54
+ this.pagesDir = found;
55
+ }
56
+ }
57
+ /**
58
+ * Render a page by name or route.
59
+ * - In production: checks for pre-built static HTML in dist/ first.
60
+ * - In development: recompiles the TSX page on the fly and bundles any needed reactive islands.
61
+ */
62
+ async render(pageRoute, props = {}, metadata = {}) {
63
+ const cleanRoute = pageRoute.replace(/^\/+/, '').replace(/\.html$/, '');
64
+ const normalizedName = cleanRoute === '' ? 'index' : cleanRoute;
65
+ // In production, check for pre-built static HTML
66
+ if (this.isProduction) {
67
+ const candidatePaths = [
68
+ path.join(this.distDir, `${normalizedName}.html`),
69
+ path.join(this.distDir, normalizedName, 'index.html')
70
+ ];
71
+ for (const candidate of candidatePaths) {
72
+ if (existsSync(candidate)) {
73
+ return await fs.readFile(candidate, 'utf8');
74
+ }
75
+ }
76
+ }
77
+ // In development (or if production pre-build not found), compile on-the-fly
78
+ const sourceFilePath = await this.resolveSourcePage(normalizedName);
79
+ if (!sourceFilePath) {
80
+ throw new Error(`[react-html] Page "${pageRoute}" not found in "${this.pagesDir}".`);
81
+ }
82
+ const { Component, metadata: pageMeta } = await loadPageModule(sourceFilePath);
83
+ const mergedMetadata = { ...pageMeta, ...metadata };
84
+ const { html, islands } = renderPageToHtml({
85
+ pagePath: sourceFilePath,
86
+ Component,
87
+ props,
88
+ metadata: mergedMetadata,
89
+ basePath: this.basePath
90
+ });
91
+ // In development, bundle reactive islands on-the-fly into distDir/assets/islands
92
+ if (islands.length > 0) {
93
+ await bundleIslands(islands, {
94
+ outDir: this.distDir,
95
+ minify: this.isProduction,
96
+ clientRuntime: this.clientRuntime
97
+ });
98
+ }
99
+ return html;
100
+ }
101
+ /**
102
+ * Universal Connect / Express / Node.js HTTP middleware.
103
+ * Handles page routes and static assets according to environment mode.
104
+ */
105
+ middleware = async (req, res, next) => {
106
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
107
+ let pathname = decodeURIComponent(url.pathname);
108
+ // 1. Check if request matches an asset in dist/ or public/
109
+ const assetResponse = await this.tryServeStaticAsset(pathname);
110
+ if (assetResponse) {
111
+ res.writeHead(200, {
112
+ 'Content-Type': assetResponse.contentType,
113
+ 'Content-Length': assetResponse.content.length
114
+ });
115
+ res.end(assetResponse.content);
116
+ return;
117
+ }
118
+ // 2. Normalize page route
119
+ let route = pathname.replace(/^\/+/, '').replace(/\/+$/, '');
120
+ if (route === '' || route.endsWith('.html')) {
121
+ route = route.replace(/\.html$/, '') || 'index';
122
+ }
123
+ // 3. Try rendering the page
124
+ try {
125
+ // In production: check if dist HTML exists
126
+ if (this.isProduction) {
127
+ const candidatePaths = [
128
+ path.join(this.distDir, `${route}.html`),
129
+ path.join(this.distDir, route, 'index.html')
130
+ ];
131
+ for (const candidate of candidatePaths) {
132
+ if (existsSync(candidate)) {
133
+ const content = await fs.readFile(candidate);
134
+ res.writeHead(200, {
135
+ 'Content-Type': 'text/html; charset=utf-8',
136
+ 'Content-Length': content.length
137
+ });
138
+ res.end(content);
139
+ return;
140
+ }
141
+ }
142
+ }
143
+ else {
144
+ // In development: check if source page exists
145
+ const sourcePath = await this.resolveSourcePage(route);
146
+ if (sourcePath) {
147
+ const html = await this.render(route);
148
+ const buffer = Buffer.from(html, 'utf8');
149
+ res.writeHead(200, {
150
+ 'Content-Type': 'text/html; charset=utf-8',
151
+ 'Content-Length': buffer.length
152
+ });
153
+ res.end(buffer);
154
+ return;
155
+ }
156
+ }
157
+ }
158
+ catch (err) {
159
+ console.error(`[react-html] Engine rendering error for route "${pathname}":`, err);
160
+ res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
161
+ res.end(`500 Internal Server Error: ${err?.message || err}`);
162
+ return;
163
+ }
164
+ // If not handled, pass to next middleware if available
165
+ if (typeof next === 'function') {
166
+ next();
167
+ }
168
+ else {
169
+ res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
170
+ res.end(`<h1>404 Not Found</h1><p>Route "${pathname}" not found.</p>`);
171
+ }
172
+ };
173
+ /**
174
+ * Standalone HTTP request handler suitable for http.createServer(engine.handle)
175
+ */
176
+ handle = (req, res) => {
177
+ return this.middleware(req, res);
178
+ };
179
+ async resolveSourcePage(normalizedName) {
180
+ const extensions = ['.tsx', '.jsx', '.ts', '.js'];
181
+ const candidates = [
182
+ ...extensions.map(ext => path.join(this.pagesDir, `${normalizedName}${ext}`)),
183
+ ...extensions.map(ext => path.join(this.pagesDir, normalizedName, `index${ext}`))
184
+ ];
185
+ for (const cand of candidates) {
186
+ if (existsSync(cand)) {
187
+ return cand;
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ async tryServeStaticAsset(pathname) {
193
+ const ext = path.extname(pathname).toLowerCase();
194
+ if (!ext || ext === '.html')
195
+ return null;
196
+ const cleanPath = pathname.replace(/^\/+/, '');
197
+ const candidateFiles = [
198
+ path.join(this.distDir, cleanPath),
199
+ path.join(this.publicDir, cleanPath)
200
+ ];
201
+ for (const filePath of candidateFiles) {
202
+ if (existsSync(filePath)) {
203
+ try {
204
+ const stat = await fs.stat(filePath);
205
+ if (stat.isFile()) {
206
+ const content = await fs.readFile(filePath);
207
+ const contentType = MIME_TYPES[ext] || 'application/octet-stream';
208
+ return { content, contentType };
209
+ }
210
+ }
211
+ catch {
212
+ // Continue searching
213
+ }
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ }
219
+ /**
220
+ * Factory function to create a new ReactHtmlEngine instance
221
+ */
222
+ export function createEngine(options = {}) {
223
+ return new ReactHtmlEngine(options);
224
+ }
225
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
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"}
@@ -2,4 +2,4 @@ export { ReactHtmlEngine, createEngine } from './engine.js';
2
2
  export type { EngineOptions } from './engine.js';
3
3
  export { createDevServer } from './dev-server.js';
4
4
  export type { DevServerOptions } from './dev-server.js';
5
-
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ReactHtmlEngine, createEngine } from './engine.js';
2
+ export { createDevServer } from './dev-server.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@punkestu/react-html",
3
- "version": "0.1.0",
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": {
@@ -8,6 +8,9 @@
8
8
  },
9
9
  "main": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
11
14
  "exports": {
12
15
  ".": {
13
16
  "import": "./dist/index.js",
@@ -35,6 +38,7 @@
35
38
  "license": "MIT",
36
39
  "dependencies": {
37
40
  "esbuild": "^0.25.0",
41
+ "preact": "^11.1.1",
38
42
  "react": "^19.0.0",
39
43
  "react-dom": "^19.0.0"
40
44
  },
@@ -1,9 +0,0 @@
1
- // .server-test-fixture/src/pages/index.tsx
2
- import { jsx } from "react/jsx-runtime";
3
- function Home() {
4
- return /* @__PURE__ */ jsx("h1", { children: "UPDATED LIVE IN DEV" });
5
- }
6
- export {
7
- Home as default
8
- };
9
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLnNlcnZlci10ZXN0LWZpeHR1cmUvc3JjL3BhZ2VzL2luZGV4LnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiXG4gICAgICAgIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAgICAgIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEhvbWUoKSB7XG4gICAgICAgICAgcmV0dXJuIDxoMT5VUERBVEVEIExJVkUgSU4gREVWPC9oMT47XG4gICAgICAgIH1cbiAgICAgICAgIl0sCiAgIm1hcHBpbmdzIjogIjtBQUdpQjtBQURNLFNBQVIsT0FBd0I7QUFDN0IsU0FBTyxvQkFBQyxRQUFHLGlDQUFtQjtBQUNoQzsiLAogICJuYW1lcyI6IFtdCn0K