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.
Files changed (47) hide show
  1. package/bin/cli.js +58 -870
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.client.cjs +1 -1
  5. package/dist/index.client.cjs.map +1 -1
  6. package/dist/index.client.js +2 -2
  7. package/dist/index.client.js.map +1 -1
  8. package/dist/index.js +116 -133
  9. package/dist/index.js.map +1 -1
  10. package/dist/jsx-runtime.cjs.map +1 -1
  11. package/dist/jsx-runtime.js.map +1 -1
  12. package/dist/renderer-DaVfBeVi.cjs +2 -0
  13. package/dist/renderer-DaVfBeVi.cjs.map +1 -0
  14. package/dist/renderer-nfT7XSpo.js +61 -0
  15. package/dist/renderer-nfT7XSpo.js.map +1 -0
  16. package/dist/server-renderer-B5b0Q0ck.cjs +2 -0
  17. package/dist/server-renderer-B5b0Q0ck.cjs.map +1 -0
  18. package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C4MB-jAp.js} +89 -96
  19. package/dist/server-renderer-C4MB-jAp.js.map +1 -0
  20. package/dist/server-renderer.cjs +1 -1
  21. package/dist/server-renderer.js +1 -1
  22. package/package.json +1 -1
  23. package/templates/basic-app/src/App.tsx +397 -19
  24. package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
  25. package/templates/ssr-template/dist/client/index.html +23 -0
  26. package/templates/ssr-template/dist/client.js +951 -0
  27. package/templates/ssr-template/dist/server.js +739 -0
  28. package/templates/ssr-template/package.json +22 -22
  29. package/templates/ssr-template/src/App.tsx +874 -11
  30. package/templates/ssr-template/tsconfig.json +14 -10
  31. package/templates/ssr-template/vite.config.ts +19 -17
  32. package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
  33. package/templates/wasm/dist/example.wasm +0 -0
  34. package/templates/wasm/dist/index.html +53 -0
  35. package/templates/wasm/dist/wasm_exec.js +572 -0
  36. package/templates/wasm/package-lock.json +4577 -5307
  37. package/templates/wasm/package.json +25 -42
  38. package/templates/wasm/public/wasm_exec.js +12 -1
  39. package/templates/wasm/src/App.tsx +41 -55
  40. package/templates/wasm/vite.config.ts +24 -42
  41. package/dist/renderer-Bo9zkUZ_.js +0 -52
  42. package/dist/renderer-Bo9zkUZ_.js.map +0 -1
  43. package/dist/renderer-Din1y3YM.cjs +0 -2
  44. package/dist/renderer-Din1y3YM.cjs.map +0 -1
  45. package/dist/server-renderer-CqIpQ-od.cjs +0 -2
  46. package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
  47. package/dist/server-renderer-QHt45Ip2.js.map +0 -1
@@ -1,42 +1,25 @@
1
- {
2
- "name": "frontend-hamroun-wasm-app",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "description": "Frontend Hamroun + Go WebAssembly integration example",
7
- "scripts": {
8
- "dev": "vite",
9
- "build": "vite build",
10
- "preview": "vite preview",
11
- "build:wasm": "node build-wasm.js",
12
- "dev:wasm": "npm run build:wasm && npm run dev",
13
- "build:go": "node build-wasm.js",
14
- "clean": "rimraf dist public/*.wasm",
15
- "test": "echo \"No tests specified\" && exit 0"
16
- },
17
- "dependencies": {
18
- "express": "^4.18.2",
19
- "frontend-hamroun": "^1.2.80"
20
- },
21
- "devDependencies": {
22
- "@types/express": "^4.17.17",
23
- "@types/node": "^20.5.0",
24
- "cross-env": "^7.0.3",
25
- "esbuild": "^0.19.12",
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
- this.exit(code);
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 'frontend-hamroun';
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
- // Check if Go WASM runtime is available
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
- // Initialize Go runtime
34
- const go = new window.Go();
35
- const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);
36
-
37
- // Run the Go program
38
- go.run(wasmModule.instance);
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 loaded successfully');
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
- }, []); // Empty dependency array to run only once
47
+ }, []);
62
48
 
63
- const callWasmFunction = (funcName: string, ...args: any[]) => {
49
+ // Use baraqex callWasmFunction API
50
+ const callFunction = (funcName: string, ...args: any[]) => {
64
51
  try {
65
- const func = (window as any)[funcName];
66
- if (typeof func !== 'function') {
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 = callWasmFunction('goHello', name);
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 = callWasmFunction('goAdd', inputA, inputB);
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 = callWasmFunction('goMultiply', inputA, inputB);
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 = callWasmFunction('goFibonacci', fibInput);
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 = callWasmFunction('goIsPrime', primeInput);
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>⚡ WebAssembly Benefits</h2>
245
+ <h2>⚡ Baraqex WASM Benefits</h2>
260
246
  <div className="benefits-grid">
261
247
  <div className="benefit">
262
- <h4>🚀 Performance</h4>
263
- <p>Near-native execution speed for compute-intensive tasks</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>🔒 Security</h4>
267
- <p>Sandboxed execution environment with memory safety</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>🌐 Portability</h4>
271
- <p>Run the same code across different platforms and browsers</p>
256
+ <h4>🛠️ Go Integration</h4>
257
+ <p>Seamless Go + JavaScript interoperability</p>
272
258
  </div>
273
259
  <div className="benefit">
274
- <h4>🛠️ Language Choice</h4>
275
- <p>Write performance-critical code in Go, Rust, or C++</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
- jsxFactory: '_jsx',
30
- jsxFragment: '_Fragment',
31
- jsxInject: `import { jsx as _jsx, Fragment as _Fragment } from 'frontend-hamroun'`
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-Opener-Policy': 'same-origin',
39
- 'Cross-Origin-Embedder-Policy': 'require-corp'
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
- optimizeDeps: {
52
- exclude: ['frontend-hamroun']
24
+ build: {
25
+ target: 'esnext',
26
+ rollupOptions: {
27
+ output: {
28
+ format: 'es'
29
+ }
30
+ }
53
31
  },
54
- // Prevent Vite from processing WASM files
55
- assetsInclude: ['**/*.wasm']
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}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, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\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, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n}\r\n"],"names":["index","state","setState","effectIndex","ref"],"mappings":"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"}