@punkestu/react-html 0.0.0-stage → 0.1.1

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 (63) hide show
  1. package/README.md +215 -2
  2. package/bin/react-html.js +8 -0
  3. package/dist/cli/docs-content.d.ts +8 -0
  4. package/dist/cli/docs-content.d.ts.map +1 -0
  5. package/dist/cli/docs-content.js +261 -0
  6. package/dist/cli/docs-content.js.map +1 -0
  7. package/dist/cli/index.d.ts +2 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +113 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/tui-docs.d.ts +5 -0
  12. package/dist/cli/tui-docs.d.ts.map +1 -0
  13. package/dist/cli/tui-docs.js +191 -0
  14. package/dist/cli/tui-docs.js.map +1 -0
  15. package/dist/client/hydrate.d.ts +4 -0
  16. package/dist/client/hydrate.d.ts.map +1 -0
  17. package/dist/client/hydrate.js +80 -0
  18. package/dist/client/hydrate.js.map +1 -0
  19. package/dist/core/bundler.d.ts +7 -0
  20. package/dist/core/bundler.d.ts.map +1 -0
  21. package/dist/core/bundler.js +103 -0
  22. package/dist/core/bundler.js.map +1 -0
  23. package/dist/core/formatter.d.ts +6 -0
  24. package/dist/core/formatter.d.ts.map +1 -0
  25. package/dist/core/formatter.js +74 -0
  26. package/dist/core/formatter.js.map +1 -0
  27. package/dist/core/island-client.d.ts +9 -0
  28. package/dist/core/island-client.d.ts.map +1 -0
  29. package/dist/core/island-client.js +8 -0
  30. package/dist/core/island-client.js.map +1 -0
  31. package/dist/core/island-registry.d.ts +15 -0
  32. package/dist/core/island-registry.d.ts.map +1 -0
  33. package/dist/core/island-registry.js +17 -0
  34. package/dist/core/island-registry.js.map +1 -0
  35. package/dist/core/island.d.ts +32 -0
  36. package/dist/core/island.d.ts.map +1 -0
  37. package/dist/core/island.js +47 -0
  38. package/dist/core/island.js.map +1 -0
  39. package/dist/core/loader.d.ts +11 -0
  40. package/dist/core/loader.d.ts.map +1 -0
  41. package/dist/core/loader.js +73 -0
  42. package/dist/core/loader.js.map +1 -0
  43. package/dist/core/renderer.d.ts +20 -0
  44. package/dist/core/renderer.d.ts.map +1 -0
  45. package/dist/core/renderer.js +53 -0
  46. package/dist/core/renderer.js.map +1 -0
  47. package/dist/index.d.ts +23 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +104 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/server/dev-server.d.ts +8 -0
  52. package/dist/server/dev-server.d.ts.map +1 -0
  53. package/dist/server/dev-server.js +112 -0
  54. package/dist/server/dev-server.js.map +1 -0
  55. package/dist/server/engine.d.ts +46 -0
  56. package/dist/server/engine.d.ts.map +1 -0
  57. package/dist/server/engine.js +222 -0
  58. package/dist/server/engine.js.map +1 -0
  59. package/dist/server/index.d.ts +5 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +3 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/package.json +47 -3
@@ -0,0 +1,222 @@
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
+ constructor(options = {}) {
29
+ this.root = path.resolve(options.root || process.cwd());
30
+ this.isProduction =
31
+ options.isProduction !== undefined
32
+ ? options.isProduction
33
+ : process.env.NODE_ENV === 'production';
34
+ this.basePath = options.basePath || '/';
35
+ // Resolve distDir
36
+ this.distDir = path.resolve(this.root, options.distDir || 'dist');
37
+ this.publicDir = path.resolve(this.root, options.publicDir || 'public');
38
+ // Resolve pagesDir
39
+ if (options.pagesDir) {
40
+ this.pagesDir = path.resolve(this.root, options.pagesDir);
41
+ }
42
+ else {
43
+ const candidates = ['src/pages', 'pages'];
44
+ let found = path.join(this.root, 'src/pages');
45
+ for (const cand of candidates) {
46
+ const p = path.join(this.root, cand);
47
+ if (existsSync(p)) {
48
+ found = p;
49
+ break;
50
+ }
51
+ }
52
+ this.pagesDir = found;
53
+ }
54
+ }
55
+ /**
56
+ * Render a page by name or route.
57
+ * - In production: checks for pre-built static HTML in dist/ first.
58
+ * - In development: recompiles the TSX page on the fly and bundles any needed reactive islands.
59
+ */
60
+ async render(pageRoute, props = {}, metadata = {}) {
61
+ const cleanRoute = pageRoute.replace(/^\/+/, '').replace(/\.html$/, '');
62
+ const normalizedName = cleanRoute === '' ? 'index' : cleanRoute;
63
+ // In production, check for pre-built static HTML
64
+ if (this.isProduction) {
65
+ const candidatePaths = [
66
+ path.join(this.distDir, `${normalizedName}.html`),
67
+ path.join(this.distDir, normalizedName, 'index.html')
68
+ ];
69
+ for (const candidate of candidatePaths) {
70
+ if (existsSync(candidate)) {
71
+ return await fs.readFile(candidate, 'utf8');
72
+ }
73
+ }
74
+ }
75
+ // In development (or if production pre-build not found), compile on-the-fly
76
+ const sourceFilePath = await this.resolveSourcePage(normalizedName);
77
+ if (!sourceFilePath) {
78
+ throw new Error(`[react-html] Page "${pageRoute}" not found in "${this.pagesDir}".`);
79
+ }
80
+ const { Component, metadata: pageMeta } = await loadPageModule(sourceFilePath);
81
+ const mergedMetadata = { ...pageMeta, ...metadata };
82
+ const { html, islands } = renderPageToHtml({
83
+ pagePath: sourceFilePath,
84
+ Component,
85
+ props,
86
+ metadata: mergedMetadata,
87
+ basePath: this.basePath
88
+ });
89
+ // In development, bundle reactive islands on-the-fly into distDir/assets/islands
90
+ if (islands.length > 0) {
91
+ await bundleIslands(islands, {
92
+ outDir: this.distDir,
93
+ minify: this.isProduction
94
+ });
95
+ }
96
+ return html;
97
+ }
98
+ /**
99
+ * Universal Connect / Express / Node.js HTTP middleware.
100
+ * Handles page routes and static assets according to environment mode.
101
+ */
102
+ middleware = async (req, res, next) => {
103
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
104
+ let pathname = decodeURIComponent(url.pathname);
105
+ // 1. Check if request matches an asset in dist/ or public/
106
+ const assetResponse = await this.tryServeStaticAsset(pathname);
107
+ if (assetResponse) {
108
+ res.writeHead(200, {
109
+ 'Content-Type': assetResponse.contentType,
110
+ 'Content-Length': assetResponse.content.length
111
+ });
112
+ res.end(assetResponse.content);
113
+ return;
114
+ }
115
+ // 2. Normalize page route
116
+ let route = pathname.replace(/^\/+/, '').replace(/\/+$/, '');
117
+ if (route === '' || route.endsWith('.html')) {
118
+ route = route.replace(/\.html$/, '') || 'index';
119
+ }
120
+ // 3. Try rendering the page
121
+ try {
122
+ // In production: check if dist HTML exists
123
+ if (this.isProduction) {
124
+ const candidatePaths = [
125
+ path.join(this.distDir, `${route}.html`),
126
+ path.join(this.distDir, route, 'index.html')
127
+ ];
128
+ for (const candidate of candidatePaths) {
129
+ if (existsSync(candidate)) {
130
+ const content = await fs.readFile(candidate);
131
+ res.writeHead(200, {
132
+ 'Content-Type': 'text/html; charset=utf-8',
133
+ 'Content-Length': content.length
134
+ });
135
+ res.end(content);
136
+ return;
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ // In development: check if source page exists
142
+ const sourcePath = await this.resolveSourcePage(route);
143
+ if (sourcePath) {
144
+ const html = await this.render(route);
145
+ const buffer = Buffer.from(html, 'utf8');
146
+ res.writeHead(200, {
147
+ 'Content-Type': 'text/html; charset=utf-8',
148
+ 'Content-Length': buffer.length
149
+ });
150
+ res.end(buffer);
151
+ return;
152
+ }
153
+ }
154
+ }
155
+ catch (err) {
156
+ console.error(`[react-html] Engine rendering error for route "${pathname}":`, err);
157
+ res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
158
+ res.end(`500 Internal Server Error: ${err?.message || err}`);
159
+ return;
160
+ }
161
+ // If not handled, pass to next middleware if available
162
+ if (typeof next === 'function') {
163
+ next();
164
+ }
165
+ else {
166
+ res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
167
+ res.end(`<h1>404 Not Found</h1><p>Route "${pathname}" not found.</p>`);
168
+ }
169
+ };
170
+ /**
171
+ * Standalone HTTP request handler suitable for http.createServer(engine.handle)
172
+ */
173
+ handle = (req, res) => {
174
+ return this.middleware(req, res);
175
+ };
176
+ async resolveSourcePage(normalizedName) {
177
+ const extensions = ['.tsx', '.jsx', '.ts', '.js'];
178
+ const candidates = [
179
+ ...extensions.map(ext => path.join(this.pagesDir, `${normalizedName}${ext}`)),
180
+ ...extensions.map(ext => path.join(this.pagesDir, normalizedName, `index${ext}`))
181
+ ];
182
+ for (const cand of candidates) {
183
+ if (existsSync(cand)) {
184
+ return cand;
185
+ }
186
+ }
187
+ return null;
188
+ }
189
+ async tryServeStaticAsset(pathname) {
190
+ const ext = path.extname(pathname).toLowerCase();
191
+ if (!ext || ext === '.html')
192
+ return null;
193
+ const cleanPath = pathname.replace(/^\/+/, '');
194
+ const candidateFiles = [
195
+ path.join(this.distDir, cleanPath),
196
+ path.join(this.publicDir, cleanPath)
197
+ ];
198
+ for (const filePath of candidateFiles) {
199
+ if (existsSync(filePath)) {
200
+ try {
201
+ const stat = await fs.stat(filePath);
202
+ if (stat.isFile()) {
203
+ const content = await fs.readFile(filePath);
204
+ const contentType = MIME_TYPES[ext] || 'application/octet-stream';
205
+ return { content, contentType };
206
+ }
207
+ }
208
+ catch {
209
+ // Continue searching
210
+ }
211
+ }
212
+ }
213
+ return null;
214
+ }
215
+ }
216
+ /**
217
+ * Factory function to create a new ReactHtmlEngine instance
218
+ */
219
+ export function createEngine(options = {}) {
220
+ return new ReactHtmlEngine(options);
221
+ }
222
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/server/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ReactHtmlEngine, createEngine } from './engine.js';
2
+ export type { EngineOptions } from './engine.js';
3
+ export { createDevServer } from './dev-server.js';
4
+ export type { DevServerOptions } from './dev-server.js';
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,50 @@
1
1
  {
2
2
  "name": "@punkestu/react-html",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Engine to convert React/JSX to pure HTML with selective reactive island compilation",
5
+ "type": "module",
6
+ "bin": {
7
+ "react-html": "./bin/react-html.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ },
19
+ "./server": {
20
+ "import": "./dist/server/index.js",
21
+ "types": "./dist/server/index.d.ts"
22
+ }
23
+ },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "prepublishOnly": "npm run build",
27
+ "test": "node --test tests/**/*.test.mjs"
28
+ },
29
+ "keywords": [
30
+ "react",
31
+ "html",
32
+ "ssg",
33
+ "static-site-generator",
34
+ "islands-architecture",
35
+ "pure-html"
36
+ ],
37
+ "author": "",
38
+ "license": "MIT",
39
+ "dependencies": {
40
+ "esbuild": "^0.25.0",
41
+ "react": "^19.0.0",
42
+ "react-dom": "^19.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.13.0",
46
+ "@types/react": "^19.0.0",
47
+ "@types/react-dom": "^19.0.0",
48
+ "typescript": "^5.7.0"
49
+ }
6
50
  }