frontend-hamroun 1.2.82 → 1.2.84
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/bin/cli.js +58 -870
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.client.cjs +1 -1
- package/dist/index.client.cjs.map +1 -1
- package/dist/index.client.js +2 -2
- package/dist/index.client.js.map +1 -1
- package/dist/index.js +116 -133
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime.cjs.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/renderer-DaVfBeVi.cjs +2 -0
- package/dist/renderer-DaVfBeVi.cjs.map +1 -0
- package/dist/renderer-nfT7XSpo.js +61 -0
- package/dist/renderer-nfT7XSpo.js.map +1 -0
- package/dist/server-renderer-B5b0Q0ck.cjs +2 -0
- package/dist/server-renderer-B5b0Q0ck.cjs.map +1 -0
- package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C4MB-jAp.js} +89 -96
- package/dist/server-renderer-C4MB-jAp.js.map +1 -0
- package/dist/server-renderer.cjs +1 -1
- package/dist/server-renderer.js +1 -1
- package/package.json +1 -1
- package/templates/basic-app/src/App.tsx +397 -19
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
- package/templates/ssr-template/dist/client/index.html +23 -0
- package/templates/ssr-template/dist/client.js +951 -0
- package/templates/ssr-template/dist/server.js +739 -0
- package/templates/ssr-template/package.json +22 -22
- package/templates/ssr-template/src/App.tsx +874 -11
- package/templates/ssr-template/tsconfig.json +14 -10
- package/templates/ssr-template/vite.config.ts +19 -17
- package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
- package/templates/wasm/dist/example.wasm +0 -0
- package/templates/wasm/dist/index.html +53 -0
- package/templates/wasm/dist/wasm_exec.js +572 -0
- package/templates/wasm/package-lock.json +4577 -5307
- package/templates/wasm/package.json +25 -42
- package/templates/wasm/public/wasm_exec.js +12 -1
- package/templates/wasm/src/App.tsx +41 -55
- package/templates/wasm/vite.config.ts +24 -42
- package/dist/renderer-Bo9zkUZ_.js +0 -52
- package/dist/renderer-Bo9zkUZ_.js.map +0 -1
- package/dist/renderer-Din1y3YM.cjs +0 -2
- package/dist/renderer-Din1y3YM.cjs.map +0 -1
- package/dist/server-renderer-CqIpQ-od.cjs +0 -2
- package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
- package/dist/server-renderer-QHt45Ip2.js.map +0 -1
@@ -1,42 +1,25 @@
|
|
1
|
-
{
|
2
|
-
"name": "
|
3
|
-
"
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"scripts": {
|
8
|
-
"dev": "vite",
|
9
|
-
"build": "vite build",
|
10
|
-
"
|
11
|
-
"
|
12
|
-
"
|
13
|
-
"
|
14
|
-
"
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
"
|
23
|
-
"
|
24
|
-
|
25
|
-
|
26
|
-
"rimraf": "^5.0.0",
|
27
|
-
"typescript": "^5.0.0",
|
28
|
-
"vite": "^5.0.0"
|
29
|
-
},
|
30
|
-
"engines": {
|
31
|
-
"node": ">=18.0.0"
|
32
|
-
},
|
33
|
-
"keywords": [
|
34
|
-
"frontend-hamroun",
|
35
|
-
"webassembly",
|
36
|
-
"wasm",
|
37
|
-
"go",
|
38
|
-
"javascript",
|
39
|
-
"ssr",
|
40
|
-
"performance"
|
41
|
-
]
|
42
|
-
}
|
1
|
+
{
|
2
|
+
"name": "wasm-app",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "Frontend Hamroun WASM Application",
|
5
|
+
"main": "src/App.tsx",
|
6
|
+
"type": "module",
|
7
|
+
"scripts": {
|
8
|
+
"dev": "vite",
|
9
|
+
"build": "vite build",
|
10
|
+
"build:wasm": "cd wasm && set GOOS=js && set GOARCH=wasm && go build -o ../public/example.wasm main.go",
|
11
|
+
"copy:wasm-exec": "copy \"%GOROOT%\\misc\\wasm\\wasm_exec.js\" public\\",
|
12
|
+
"setup:wasm": "npm run copy:wasm-exec && npm run build:wasm",
|
13
|
+
"preview": "vite preview",
|
14
|
+
"type-check": "tsc --noEmit"
|
15
|
+
},
|
16
|
+
"dependencies": {
|
17
|
+
"baraqex": "^1.0.36",
|
18
|
+
"frontend-hamroun": "^1.2.35"
|
19
|
+
},
|
20
|
+
"devDependencies": {
|
21
|
+
"@types/node": "^20.0.0",
|
22
|
+
"typescript": "^5.0.0",
|
23
|
+
"vite": "^5.0.0"
|
24
|
+
}
|
25
|
+
}
|
@@ -229,7 +229,18 @@
|
|
229
229
|
delete this._goRefCounts;
|
230
230
|
delete this._ids;
|
231
231
|
delete this._idPool;
|
232
|
-
|
232
|
+
|
233
|
+
// Modified: Don't call process.exit in Node.js testing environment
|
234
|
+
// Instead, just call the exit handler and resolve the promise
|
235
|
+
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production') {
|
236
|
+
// In development/testing, just log and continue
|
237
|
+
console.log('[WASM] Go program finished with exit code:', code);
|
238
|
+
this.exit(code);
|
239
|
+
this._resolveExitPromise();
|
240
|
+
} else {
|
241
|
+
// In production, call the original exit behavior
|
242
|
+
this.exit(code);
|
243
|
+
}
|
233
244
|
},
|
234
245
|
|
235
246
|
// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import { jsx, useState, useEffect } from '
|
1
|
+
import { jsx, useState, useEffect } from 'baraqex';
|
2
|
+
import { loadGoWasm, callWasmFunction } from 'baraqex';
|
2
3
|
|
3
4
|
export default function App() {
|
4
5
|
const [wasmReady, setWasmReady] = useState(false);
|
@@ -15,35 +16,20 @@ export default function App() {
|
|
15
16
|
|
16
17
|
async function loadWasm() {
|
17
18
|
try {
|
18
|
-
|
19
|
-
if (typeof window === 'undefined' || !window.Go) {
|
20
|
-
throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');
|
21
|
-
}
|
22
|
-
|
23
|
-
// Load the WASM file
|
24
|
-
const wasmUrl = '/example.wasm';
|
25
|
-
const response = await fetch(wasmUrl);
|
26
|
-
|
27
|
-
if (!response.ok) {
|
28
|
-
throw new Error(`Failed to fetch WASM file: ${response.status}`);
|
29
|
-
}
|
30
|
-
|
31
|
-
const wasmBytes = await response.arrayBuffer();
|
19
|
+
console.log('Loading Go WASM module using baraqex API...');
|
32
20
|
|
33
|
-
//
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
// Wait a bit for Go functions to be registered
|
41
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
21
|
+
// Use baraqex API to load WASM
|
22
|
+
await loadGoWasm('/example.wasm', {
|
23
|
+
debug: true,
|
24
|
+
onLoad: () => {
|
25
|
+
console.log('WASM module loaded successfully via baraqex');
|
26
|
+
}
|
27
|
+
});
|
42
28
|
|
43
29
|
if (mounted) {
|
44
30
|
setWasmReady(true);
|
45
31
|
setWasmError(null);
|
46
|
-
console.log('WASM module
|
32
|
+
console.log('WASM module ready');
|
47
33
|
}
|
48
34
|
} catch (error) {
|
49
35
|
console.error('WASM loading error:', error);
|
@@ -58,15 +44,13 @@ export default function App() {
|
|
58
44
|
return () => {
|
59
45
|
mounted = false;
|
60
46
|
};
|
61
|
-
}, []);
|
47
|
+
}, []);
|
62
48
|
|
63
|
-
|
49
|
+
// Use baraqex callWasmFunction API
|
50
|
+
const callFunction = (funcName: string, ...args: any[]) => {
|
64
51
|
try {
|
65
|
-
|
66
|
-
|
67
|
-
throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);
|
68
|
-
}
|
69
|
-
return func(...args);
|
52
|
+
// Call using baraqex API
|
53
|
+
return callWasmFunction(funcName, ...args);
|
70
54
|
} catch (error) {
|
71
55
|
const errorMsg = error instanceof Error ? error.message : 'Function call failed';
|
72
56
|
setWasmError(errorMsg);
|
@@ -75,7 +59,7 @@ export default function App() {
|
|
75
59
|
};
|
76
60
|
|
77
61
|
const handleHello = () => {
|
78
|
-
const greeting =
|
62
|
+
const greeting = callFunction('goHello', name);
|
79
63
|
if (greeting !== null) {
|
80
64
|
setResult({ type: 'hello', value: greeting, input: name });
|
81
65
|
setWasmError(null);
|
@@ -83,7 +67,7 @@ export default function App() {
|
|
83
67
|
};
|
84
68
|
|
85
69
|
const handleAddition = () => {
|
86
|
-
const sum =
|
70
|
+
const sum = callFunction('goAdd', inputA, inputB);
|
87
71
|
if (sum !== null) {
|
88
72
|
setResult({ type: 'addition', value: sum, inputs: [inputA, inputB] });
|
89
73
|
setWasmError(null);
|
@@ -91,7 +75,7 @@ export default function App() {
|
|
91
75
|
};
|
92
76
|
|
93
77
|
const handleMultiplication = () => {
|
94
|
-
const product =
|
78
|
+
const product = callFunction('goMultiply', inputA, inputB);
|
95
79
|
if (product !== null) {
|
96
80
|
setResult({ type: 'multiplication', value: product, inputs: [inputA, inputB] });
|
97
81
|
setWasmError(null);
|
@@ -103,7 +87,7 @@ export default function App() {
|
|
103
87
|
setWasmError('Fibonacci input too large (max 40)');
|
104
88
|
return;
|
105
89
|
}
|
106
|
-
const fibResult =
|
90
|
+
const fibResult = callFunction('goFibonacci', fibInput);
|
107
91
|
if (fibResult !== null) {
|
108
92
|
setResult({ type: 'fibonacci', value: fibResult, input: fibInput });
|
109
93
|
setWasmError(null);
|
@@ -111,7 +95,7 @@ export default function App() {
|
|
111
95
|
};
|
112
96
|
|
113
97
|
const handlePrimeCheck = () => {
|
114
|
-
const isPrime =
|
98
|
+
const isPrime = callFunction('goIsPrime', primeInput);
|
115
99
|
if (isPrime !== null) {
|
116
100
|
setResult({ type: 'prime', value: isPrime, input: primeInput });
|
117
101
|
setWasmError(null);
|
@@ -150,11 +134,11 @@ export default function App() {
|
|
150
134
|
return (
|
151
135
|
<div className="app">
|
152
136
|
<header>
|
153
|
-
<h1>Frontend Hamroun + Go WASM</h1>
|
154
|
-
<p>High-performance computing with WebAssembly</p>
|
137
|
+
<h1>Frontend Hamroun + Go WASM (Baraqex)</h1>
|
138
|
+
<p>High-performance computing with WebAssembly via Baraqex API</p>
|
155
139
|
<div className="status">
|
156
140
|
<span className="status-indicator ready"></span>
|
157
|
-
WASM Ready
|
141
|
+
WASM Ready via Baraqex
|
158
142
|
</div>
|
159
143
|
</header>
|
160
144
|
|
@@ -167,11 +151,12 @@ export default function App() {
|
|
167
151
|
<input
|
168
152
|
type="text"
|
169
153
|
value={name}
|
170
|
-
onChange={(e) => setName(e.target.value)}
|
154
|
+
onChange={(e:any) => setName(e.target.value)}
|
171
155
|
placeholder="Enter your name"
|
172
156
|
/>
|
173
157
|
<button onClick={handleHello}>Say Hello</button>
|
174
158
|
</div>
|
159
|
+
<small>callWasmFunction('goHello', '{name}')</small>
|
175
160
|
</div>
|
176
161
|
|
177
162
|
{/* Math Operations */}
|
@@ -181,13 +166,13 @@ export default function App() {
|
|
181
166
|
<input
|
182
167
|
type="number"
|
183
168
|
value={inputA}
|
184
|
-
onChange={(e) => setInputA(Number(e.target.value))}
|
169
|
+
onChange={(e: { target: { value: any; }; }) => setInputA(Number(e.target.value))}
|
185
170
|
placeholder="First number"
|
186
171
|
/>
|
187
172
|
<input
|
188
173
|
type="number"
|
189
174
|
value={inputB}
|
190
|
-
onChange={(e) => setInputB(Number(e.target.value))}
|
175
|
+
onChange={(e: { target: { value: any; }; }) => setInputB(Number(e.target.value))}
|
191
176
|
placeholder="Second number"
|
192
177
|
/>
|
193
178
|
</div>
|
@@ -195,6 +180,7 @@ export default function App() {
|
|
195
180
|
<button onClick={handleAddition}>Add</button>
|
196
181
|
<button onClick={handleMultiplication}>Multiply</button>
|
197
182
|
</div>
|
183
|
+
<small>callWasmFunction('goAdd', {inputA}, {inputB})</small>
|
198
184
|
</div>
|
199
185
|
|
200
186
|
{/* Fibonacci */}
|
@@ -204,7 +190,7 @@ export default function App() {
|
|
204
190
|
<input
|
205
191
|
type="number"
|
206
192
|
value={fibInput}
|
207
|
-
onChange={(e) => setFibInput(Number(e.target.value))}
|
193
|
+
onChange={(e: { target: { value: any; }; }) => setFibInput(Number(e.target.value))}
|
208
194
|
placeholder="Fibonacci number"
|
209
195
|
min="0"
|
210
196
|
max="40"
|
@@ -221,7 +207,7 @@ export default function App() {
|
|
221
207
|
<input
|
222
208
|
type="number"
|
223
209
|
value={primeInput}
|
224
|
-
onChange={(e) => setPrimeInput(Number(e.target.value))}
|
210
|
+
onChange={(e: { target: { value: any; }; }) => setPrimeInput(Number(e.target.value))}
|
225
211
|
placeholder="Number to check"
|
226
212
|
min="1"
|
227
213
|
/>
|
@@ -233,7 +219,7 @@ export default function App() {
|
|
233
219
|
{/* Results Display */}
|
234
220
|
{result && (
|
235
221
|
<section className="results">
|
236
|
-
<h2>📊 Result</h2>
|
222
|
+
<h2>📊 Baraqex WASM Result</h2>
|
237
223
|
<div className="result-card">
|
238
224
|
{result.type === 'hello' && (
|
239
225
|
<p><strong>Greeting:</strong> <span className="result-value">{result.value}</span></p>
|
@@ -256,23 +242,23 @@ export default function App() {
|
|
256
242
|
|
257
243
|
{/* Info Section */}
|
258
244
|
<section className="info-section">
|
259
|
-
<h2>⚡
|
245
|
+
<h2>⚡ Baraqex WASM Benefits</h2>
|
260
246
|
<div className="benefits-grid">
|
261
247
|
<div className="benefit">
|
262
|
-
<h4>🚀
|
263
|
-
<p>
|
248
|
+
<h4>🚀 Simple API</h4>
|
249
|
+
<p>Easy-to-use loadGoWasm() and callWasmFunction() API</p>
|
264
250
|
</div>
|
265
251
|
<div className="benefit">
|
266
|
-
<h4
|
267
|
-
<p>
|
252
|
+
<h4>🔄 Cross-Platform</h4>
|
253
|
+
<p>Works in browser and Node.js with same API</p>
|
268
254
|
</div>
|
269
255
|
<div className="benefit">
|
270
|
-
<h4
|
271
|
-
<p>
|
256
|
+
<h4>🛠️ Go Integration</h4>
|
257
|
+
<p>Seamless Go + JavaScript interoperability</p>
|
272
258
|
</div>
|
273
259
|
<div className="benefit">
|
274
|
-
<h4
|
275
|
-
<p>
|
260
|
+
<h4>📊 Debug Support</h4>
|
261
|
+
<p>Built-in debugging and function discovery</p>
|
276
262
|
</div>
|
277
263
|
</div>
|
278
264
|
</section>
|
@@ -2,55 +2,37 @@ import { defineConfig } from 'vite';
|
|
2
2
|
import path from 'path';
|
3
3
|
|
4
4
|
export default defineConfig({
|
5
|
-
resolve: {
|
6
|
-
alias: {
|
7
|
-
'frontend-hamroun': path.resolve(__dirname, 'node_modules/frontend-hamroun')
|
8
|
-
}
|
9
|
-
},
|
10
|
-
build: {
|
11
|
-
outDir: 'dist',
|
12
|
-
ssr: 'src/server.ts',
|
13
|
-
rollupOptions: {
|
14
|
-
input: {
|
15
|
-
client: './src/client.tsx',
|
16
|
-
server: './src/server.ts'
|
17
|
-
},
|
18
|
-
output: {
|
19
|
-
entryFileNames: '[name].js',
|
20
|
-
chunkFileNames: 'assets/[name]-[hash].js',
|
21
|
-
assetFileNames: 'assets/[name]-[hash].[ext]'
|
22
|
-
},
|
23
|
-
// Exclude WASM build script from hot reload and external dependencies
|
24
|
-
external: ['./build-wasm.js']
|
25
|
-
},
|
26
|
-
target: 'esnext'
|
27
|
-
},
|
28
5
|
esbuild: {
|
29
|
-
|
30
|
-
|
31
|
-
|
6
|
+
jsx: 'transform',
|
7
|
+
jsxFactory: 'jsx',
|
8
|
+
jsxFragment: 'Fragment',
|
9
|
+
jsxImportSource: 'frontend-hamroun',
|
10
|
+
},
|
11
|
+
optimizeDeps: {
|
12
|
+
include: ['frontend-hamroun'],
|
13
|
+
exclude: []
|
32
14
|
},
|
33
15
|
server: {
|
34
16
|
fs: {
|
35
|
-
allow: ['..']
|
17
|
+
allow: ['..', '../..']
|
36
18
|
},
|
37
19
|
headers: {
|
38
|
-
'Cross-Origin-
|
39
|
-
'Cross-Origin-
|
40
|
-
},
|
41
|
-
watch: {
|
42
|
-
// Prevent watching go directory and wasm files to avoid infinite loops
|
43
|
-
ignored: [
|
44
|
-
'**/go/**',
|
45
|
-
'**/*.wasm',
|
46
|
-
'**/build-wasm.js',
|
47
|
-
'**/wasm_exec.js'
|
48
|
-
]
|
20
|
+
'Cross-Origin-Embedder-Policy': 'require-corp',
|
21
|
+
'Cross-Origin-Opener-Policy': 'same-origin'
|
49
22
|
}
|
50
23
|
},
|
51
|
-
|
52
|
-
|
24
|
+
build: {
|
25
|
+
target: 'esnext',
|
26
|
+
rollupOptions: {
|
27
|
+
output: {
|
28
|
+
format: 'es'
|
29
|
+
}
|
30
|
+
}
|
53
31
|
},
|
54
|
-
|
55
|
-
|
32
|
+
resolve: {
|
33
|
+
alias: {
|
34
|
+
'frontend-hamroun/jsx-dev-runtime': 'frontend-hamroun',
|
35
|
+
'frontend-hamroun/jsx-runtime': 'frontend-hamroun'
|
36
|
+
}
|
37
|
+
}
|
56
38
|
});
|
@@ -1,52 +0,0 @@
|
|
1
|
-
import { createElement } from "./jsx-runtime.js";
|
2
|
-
import { b as batchUpdates, p as prepareRender, s as setRenderCallback, f as finishRender } from "./server-renderer-QHt45Ip2.js";
|
3
|
-
function createContext(defaultValue) {
|
4
|
-
const context = {
|
5
|
-
Provider: ({ value, children }) => {
|
6
|
-
return children;
|
7
|
-
},
|
8
|
-
Consumer: ({ children }) => {
|
9
|
-
return children(defaultValue);
|
10
|
-
},
|
11
|
-
_id: Symbol(),
|
12
|
-
useSelector: (selector) => {
|
13
|
-
return selector(defaultValue);
|
14
|
-
}
|
15
|
-
};
|
16
|
-
return context;
|
17
|
-
}
|
18
|
-
function useContext(context) {
|
19
|
-
return context;
|
20
|
-
}
|
21
|
-
let isHydrating = false;
|
22
|
-
async function hydrate(element, container) {
|
23
|
-
isHydrating = true;
|
24
|
-
try {
|
25
|
-
await render(element, container);
|
26
|
-
} finally {
|
27
|
-
isHydrating = false;
|
28
|
-
}
|
29
|
-
}
|
30
|
-
async function render(element, container) {
|
31
|
-
console.log("Rendering to:", container.id);
|
32
|
-
batchUpdates(async () => {
|
33
|
-
const rendererId = prepareRender();
|
34
|
-
try {
|
35
|
-
setRenderCallback(render, element, container);
|
36
|
-
const domNode = await createElement(element);
|
37
|
-
if (!isHydrating) {
|
38
|
-
container.innerHTML = "";
|
39
|
-
}
|
40
|
-
container.appendChild(domNode);
|
41
|
-
} finally {
|
42
|
-
finishRender();
|
43
|
-
}
|
44
|
-
});
|
45
|
-
}
|
46
|
-
export {
|
47
|
-
createContext as c,
|
48
|
-
hydrate as h,
|
49
|
-
render as r,
|
50
|
-
useContext as u
|
51
|
-
};
|
52
|
-
//# sourceMappingURL=renderer-Bo9zkUZ_.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"renderer-Bo9zkUZ_.js","sources":["../src/context.ts","../src/renderer.ts"],"sourcesContent":["\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { batchUpdates } from './batch.js';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n"],"names":[],"mappings":";;AAYO,SAAS,cAAiB,cAA6B;AAC5D,QAAM,UAAU;AAAA,IACd,UAAU,CAAC,EAAE,OAAO,eAA6C;AACxD,aAAA;AAAA,IACT;AAAA,IACA,UAAU,CAAC,EAAE,eAAgD;AAC3D,aAAO,SAAS,YAAY;AAAA,IAC9B;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,aAAa,CAAI,aAA8B;AAC7C,aAAO,SAAS,YAAY;AAAA,IAAA;AAAA,EAEhC;AAEO,SAAA;AACT;AAEO,SAAS,WAAc,SAAiB;AACtC,SAAA;AACT;AC3BA,IAAI,cAAc;AAEI,eAAA,QAAQ,SAAc,WAAwB;AACpD,gBAAA;AACV,MAAA;AACI,UAAA,OAAO,SAAS,SAAS;AAAA,EAAA,UAC/B;AACc,kBAAA;AAAA,EAAA;AAElB;AAEsB,eAAA,OAAO,SAAc,WAAwB;AACzD,UAAA,IAAI,iBAAiB,UAAU,EAAE;AAEzC,eAAa,YAAY;AACvB,UAAM,aAAa,cAAc;AAC7B,QAAA;AACgB,wBAAA,QAAQ,SAAS,SAAS;AACtC,YAAA,UAAU,MAAM,cAAc,OAAO;AAE3C,UAAI,CAAC,aAAa;AAChB,kBAAU,YAAY;AAAA,MAAA;AAExB,gBAAU,YAAY,OAAO;AAAA,IAAA,UAE7B;AACa,mBAAA;AAAA,IAAA;AAAA,EACf,CACD;AACH;"}
|
@@ -1,2 +0,0 @@
|
|
1
|
-
"use strict";const e=require("./jsx-runtime.cjs"),r=require("./server-renderer-CqIpQ-od.cjs");let n=!1;async function t(i,s){console.log("Rendering to:",s.id),r.batchUpdates((async()=>{r.prepareRender();try{r.setRenderCallback(t,i,s);const c=await e.createElement(i);n||(s.innerHTML=""),s.appendChild(c)}finally{r.finishRender()}}))}exports.createContext=function(e){return{Provider:({value:e,children:r})=>r,Consumer:({children:r})=>r(e),_id:Symbol(),useSelector:r=>r(e)}},exports.hydrate=async function(e,r){n=!0;try{await t(e,r)}finally{n=!1}},exports.render=t,exports.useContext=function(e){return e};
|
2
|
-
//# sourceMappingURL=renderer-Din1y3YM.cjs.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"renderer-Din1y3YM.cjs","sources":["../src/renderer.ts","../src/context.ts"],"sourcesContent":["import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { batchUpdates } from './batch.js';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n","\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n"],"names":["isHydrating","async","render","element","container","console","log","id","batchUpdates","prepareRender","domNode","createElement","innerHTML","appendChild","finishRender","defaultValue","Provider","value","children","Consumer","_id","Symbol","useSelector","selector","context"],"mappings":"8FAIA,IAAIA,GAAc,EAWIC,eAAAC,EAAOC,EAAcC,GACjCC,QAAAC,IAAI,gBAAiBF,EAAUG,IAEvCC,EAAAA,cAAaP,UACQQ,EAAAA,gBACf,wBACgBP,EAAQC,EAASC,GAC7B,MAAAM,QAAgBC,EAAAA,cAAcR,GAE/BH,IACHI,EAAUQ,UAAY,IAExBR,EAAUS,YAAYH,EAAO,CAE7B,QACaI,gBAAA,IAGnB,uBCrBO,SAA0BC,GAcxB,MAbS,CACdC,SAAU,EAAGC,QAAOC,cACXA,EAETC,SAAU,EAAGD,cACJA,EAASH,GAElBK,IAAKC,SACLC,YAAiBC,GACRA,EAASR,GAKtB,kBDrBsBd,eAAQE,EAAcC,GAC5BJ,GAAA,EACV,UACIE,EAAOC,EAASC,EAAS,CAC/B,QACcJ,GAAA,CAAA,CAElB,sCCgBO,SAAuBwB,GACrB,OAAAA,CACT"}
|
@@ -1,2 +0,0 @@
|
|
1
|
-
"use strict";exports.isBatching=!1;const e=[];function t(t){if(exports.isBatching)e.push(t);else{exports.isBatching=!0;try{for(t();e.length>0;){const t=e.shift();t?.()}}finally{exports.isBatching=!1}}}let r=0;const n=new Map,s=new Map,o=new Map,c=new Map,i=new Map,p="undefined"==typeof window,u=new Map;let a=null,l=null,f=null;function h(){return r++,s.set(r,0),r}function d(){p&&u.delete(r),r=0}function g(e){if(!r)throw new Error("useState must be called within a render");if(p){u.has(r)||u.set(r,new Map);const t=u.get(r),n=s.get(r)||0;t.has(n)||t.set(n,e);const o=t.get(n),c=e=>{};return s.set(r,n+1),[o,c]}n.has(r)||n.set(r,[]);const o=n.get(r),c=s.get(r)||0;c>=o.length&&o.push(e);const i=o[c];return s.set(r,c+1),[i,e=>{const n="function"==typeof e?e(o[c]):e;o[c]!==n&&(o[c]=n,exports.isBatching?t((()=>y(r))):y(r))}]}async function y(e){try{const t=o.get(e);t&&(t.forEach((e=>{e.cleanup&&e.cleanup()})),o.set(e,[])),a&&l&&f&&await a(f,l)}catch(t){console.error("Error during rerender:",t)}}function w(e){if(null==e)return"";if("boolean"==typeof e)return"";if("number"==typeof e||"string"==typeof e)return m(String(e));if("function"==typeof e.type){return w((0,e.type)(e.props||{}))}if("string"==typeof e.type){const t=e.type;let r="",n="";if(e.props)for(const[o,c]of Object.entries(e.props))"children"!==o&&(o.startsWith("on")||("className"!==o?"string"==typeof c||"number"==typeof c?r+=` ${o}="${m(String(c))}"`:!0===c&&(r+=` ${o}`):r+=` class="${m(c)}"`));const s=e.props?.children?Array.isArray(e.props.children)?e.props.children:[e.props.children]:[];for(const e of s)n+=w(e);return["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"].includes(t)?`<${t}${r}/>`:`<${t}${r}>${n}</${t}>`}if(e.type===Symbol.for("react.fragment")){let t="";const r=Array.isArray(e.props?.children)?e.props.children:e.props?.children?[e.props.children]:[];for(const e of r)t+=w(e);return t}return console.warn("Unknown vnode type:",e.type),""}function m(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}exports.batchUpdates=t,exports.finishRender=d,exports.getIsBatching=function(){return exports.isBatching},exports.prepareRender=h,exports.renderToString=function(e){h();const t=w(e);return d(),t},exports.setRenderCallback=function(e,t,r){a=e,l=r,f=t},exports.useEffect=function(e,t){if(!r)throw new Error("useEffect must be called within a render");if(p){const e=s.get(r)||0;return void s.set(r,e+1)}const n=s.get(r)||0;o.has(r)||o.set(r,[]);const c=o.get(r),i=c[n];i&&t&&i.deps&&!t.some(((e,t)=>e!==i.deps[t]))||(i?.cleanup&&i.cleanup(),queueMicrotask((()=>{const r=e()||void 0;c[n]={cleanup:r,deps:t||[]}}))),s.set(r,n+1)},exports.useErrorBoundary=function(){const[e,t]=g(null);return[e,()=>t(null)]},exports.useMemo=function(e,t){if(!r)throw new Error("useMemo must be called within a render");const n=s.get(r)||0;c.has(r)||c.set(r,[]);const o=c.get(r),i=o[n];if(!i||t&&t.some(((e,t)=>!Object.is(e,i.deps[t])))){const c=e();return o[n]={value:c,deps:t||[]},s.set(r,n+1),c}return s.set(r,n+1),i.value},exports.useRef=function(e){if(!r)throw new Error("useRef must be called within a render");const t=s.get(r)||0;i.has(r)||i.set(r,[]);const n=i.get(r);if(t>=n.length){const o={current:e};return n.push(o),s.set(r,t+1),o}const o=n[t];return s.set(r,t+1),o},exports.useState=g;
|
2
|
-
//# sourceMappingURL=server-renderer-CqIpQ-od.cjs.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server-renderer-CqIpQ-od.cjs","sources":["../src/batch.ts","../src/hooks.ts","../src/server-renderer.ts"],"sourcesContent":["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { batchUpdates, isBatching } from './batch.js';\r\nimport { diff } from './vdom.js';\r\nimport { createContext, useContext } from './context.js';\r\n\r\n// Current render ID counter\r\nlet currentRender = 0;\r\n\r\n// State storage\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, any[]>();\r\nconst memos = new Map<number, any[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\n// Server-side rendering detection\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, Map<number, any>>();\r\n\r\n// Rendering callbacks\r\nlet globalRenderCallback: any = null;\r\nlet globalContainer: any = null;\r\nlet currentElement: any = null;\r\n\r\nexport function setRenderCallback(callback: any, element: any, container: any): void {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender(): number {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (newValue: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error(\"useState must be called within a render\");\r\n }\r\n\r\n // Handle server-side rendering separately\r\n if (isServer) {\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n \r\n const state = componentState.get(index);\r\n // In SSR, setState is a no-op\r\n const setState = (_newValue: T | ((prev: T) => T)) => {};\r\n \r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n // Client-side implementation\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n \r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n \r\n const state = componentStates[index];\r\n \r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function'\r\n ? (newValue as ((prev: T) => T))(componentStates[index])\r\n : newValue;\r\n \r\n if (componentStates[index] === nextValue) return;\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n \r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => void | (() => void), deps?: any[]): void {\r\n if (!currentRender) throw new Error(\"useEffect must be called within a render\");\r\n\r\n // Skip effects on server\r\n if (isServer) {\r\n const effectIndex = stateIndices.get(currentRender) || 0;\r\n stateIndices.set(currentRender, effectIndex + 1);\r\n return;\r\n }\r\n\r\n const effectIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n \r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n \r\n // Schedule effect execution after render is complete\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup, deps: deps || [] };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps?: any[]): T {\r\n if (!currentRender) throw new Error(\"useMemo must be called within a render\");\r\n \r\n const memoIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n \r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps: deps || [] };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n \r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T): { current: T } {\r\n if (!currentRender) throw new Error(\"useRef must be called within a render\");\r\n \r\n const refIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n \r\n const componentRefs = refs.get(currentRender)!;\r\n \r\n if (refIndex >= componentRefs.length) {\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n \r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\nasync function rerender(rendererId: number): Promise<void> {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n \r\n // Trigger re-render\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\nexport function useErrorBoundary() {\r\n const [error, setError] = useState(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Re-export from context to match index.js\r\nexport { createContext, useContext };\r\n","import { VNode } from './types.js';\r\nimport { prepareRender, finishRender } from './hooks.js';\r\n\r\ntype Component = (props: any) => any;\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n"],"names":["isBatching","queue","batchUpdates","fn","push","length","nextFn","shift","currentRender","states","Map","stateIndices","effects","memos","refs","isServer","window","serverStates","globalRenderCallback","globalContainer","currentElement","prepareRender","set","finishRender","delete","useState","initial","Error","has","componentState","get","index","state","setState","_newValue","componentStates","newValue","nextValue","rerender","async","rendererId","componentEffects","forEach","effect","cleanup","error","console","renderNodeToString","vnode","escapeHtml","String","type","Component","props","tag","attrs","children","key","value","Object","entries","startsWith","childrenArray","Array","isArray","child","includes","Symbol","for","fragmentOutput","warn","text","replace","html","callback","element","container","deps","effectIndex","prevEffect","some","dep","i","queueMicrotask","setError","factory","memoIndex","componentMemos","prevMemo","is","refIndex","componentRefs","ref","current"],"mappings":"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"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server-renderer-QHt45Ip2.js","sources":["../src/batch.ts","../src/hooks.ts","../src/server-renderer.ts"],"sourcesContent":["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { batchUpdates, isBatching } from './batch.js';\r\nimport { diff } from './vdom.js';\r\nimport { createContext, useContext } from './context.js';\r\n\r\n// Current render ID counter\r\nlet currentRender = 0;\r\n\r\n// State storage\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, any[]>();\r\nconst memos = new Map<number, any[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\n// Server-side rendering detection\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, Map<number, any>>();\r\n\r\n// Rendering callbacks\r\nlet globalRenderCallback: any = null;\r\nlet globalContainer: any = null;\r\nlet currentElement: any = null;\r\n\r\nexport function setRenderCallback(callback: any, element: any, container: any): void {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender(): number {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (newValue: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error(\"useState must be called within a render\");\r\n }\r\n\r\n // Handle server-side rendering separately\r\n if (isServer) {\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n \r\n const state = componentState.get(index);\r\n // In SSR, setState is a no-op\r\n const setState = (_newValue: T | ((prev: T) => T)) => {};\r\n \r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n // Client-side implementation\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n \r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n \r\n const state = componentStates[index];\r\n \r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function'\r\n ? (newValue as ((prev: T) => T))(componentStates[index])\r\n : newValue;\r\n \r\n if (componentStates[index] === nextValue) return;\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n \r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => void | (() => void), deps?: any[]): void {\r\n if (!currentRender) throw new Error(\"useEffect must be called within a render\");\r\n\r\n // Skip effects on server\r\n if (isServer) {\r\n const effectIndex = stateIndices.get(currentRender) || 0;\r\n stateIndices.set(currentRender, effectIndex + 1);\r\n return;\r\n }\r\n\r\n const effectIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n \r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n \r\n // Schedule effect execution after render is complete\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup, deps: deps || [] };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps?: any[]): T {\r\n if (!currentRender) throw new Error(\"useMemo must be called within a render\");\r\n \r\n const memoIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n \r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps: deps || [] };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n \r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T): { current: T } {\r\n if (!currentRender) throw new Error(\"useRef must be called within a render\");\r\n \r\n const refIndex = stateIndices.get(currentRender) || 0;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n \r\n const componentRefs = refs.get(currentRender)!;\r\n \r\n if (refIndex >= componentRefs.length) {\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n \r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\nasync function rerender(rendererId: number): Promise<void> {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n \r\n // Trigger re-render\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\nexport function useErrorBoundary() {\r\n const [error, setError] = useState(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Re-export from context to match index.js\r\nexport { createContext, useContext };\r\n","import { VNode } from './types.js';\r\nimport { prepareRender, finishRender } from './hooks.js';\r\n\r\ntype Component = (props: any) => any;\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n"],"names":["index","state","setState","effectIndex","ref"],"mappings":"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"}
|