frontend-hamroun 1.2.83 → 1.2.85
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 +57 -869
- 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 -136
- 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-C1WXH-zV.js → server-renderer-C4MB-jAp.js} +6 -39
- 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/build.d.ts +2 -0
- package/templates/basic-app/build.d.ts.map +1 -0
- package/templates/basic-app/dev.d.ts +2 -0
- package/templates/basic-app/dev.d.ts.map +1 -0
- package/templates/basic-app/esbuild.config.d.ts +2 -0
- package/templates/basic-app/esbuild.config.d.ts.map +1 -0
- package/templates/basic-app/postcss.config.d.ts +8 -0
- package/templates/basic-app/postcss.config.d.ts.map +1 -0
- package/templates/basic-app/server.d.ts +2 -0
- package/templates/basic-app/server.d.ts.map +1 -0
- package/templates/basic-app/src/App.d.ts +2 -0
- package/templates/basic-app/src/App.d.ts.map +1 -0
- package/templates/basic-app/src/App.js +148 -0
- package/templates/basic-app/src/App.tsx +397 -19
- package/templates/basic-app/src/client.d.ts +2 -0
- package/templates/basic-app/src/client.d.ts.map +1 -0
- package/templates/basic-app/src/client.js +6 -0
- package/templates/basic-app/src/components/Counter.d.ts +4 -0
- package/templates/basic-app/src/components/Counter.d.ts.map +1 -0
- package/templates/basic-app/src/components/Counter.js +9 -0
- package/templates/basic-app/src/jsx-shim.d.ts +8 -0
- package/templates/basic-app/src/jsx-shim.d.ts.map +1 -0
- package/templates/basic-app/src/main.d.ts +2 -0
- package/templates/basic-app/src/main.d.ts.map +1 -0
- package/templates/basic-app/src/main.js +57 -0
- package/templates/basic-app/src/server.d.ts +2 -0
- package/templates/basic-app/src/server.d.ts.map +1 -0
- package/templates/basic-app/tailwind.config.d.ts +9 -0
- package/templates/basic-app/tailwind.config.d.ts.map +1 -0
- package/templates/basic-app/vite.config.d.ts +3 -0
- package/templates/basic-app/vite.config.d.ts.map +1 -0
- package/templates/basic-app/vite.config.js +7 -0
- package/templates/complete-app/api/hello.d.ts +1 -0
- package/templates/complete-app/api/hello.d.ts.map +1 -0
- package/templates/complete-app/client.d.ts +2 -0
- package/templates/complete-app/client.d.ts.map +1 -0
- package/templates/complete-app/lib/frontend-hamroun.d.ts +18 -0
- package/templates/complete-app/lib/frontend-hamroun.d.ts.map +1 -0
- package/templates/complete-app/pages/about.d.ts +7 -0
- package/templates/complete-app/pages/about.d.ts.map +1 -0
- package/templates/complete-app/pages/index.d.ts +7 -0
- package/templates/complete-app/pages/index.d.ts.map +1 -0
- package/templates/complete-app/pages/wasm-demo.d.ts +7 -0
- package/templates/complete-app/pages/wasm-demo.d.ts.map +1 -0
- package/templates/complete-app/public/client.d.ts +17 -0
- package/templates/complete-app/public/client.d.ts.map +1 -0
- package/templates/complete-app/server.d.ts +2 -0
- package/templates/complete-app/server.d.ts.map +1 -0
- package/templates/complete-app/server.js +236 -218
- package/templates/complete-app/src/App.d.ts +2 -0
- package/templates/complete-app/src/App.d.ts.map +1 -0
- package/templates/complete-app/src/App.js +27 -0
- package/templates/complete-app/src/client.d.ts +2 -0
- package/templates/complete-app/src/client.d.ts.map +1 -0
- package/templates/complete-app/src/client.js +52 -0
- package/templates/complete-app/src/pages/index.d.ts +2 -0
- package/templates/complete-app/src/pages/index.d.ts.map +1 -0
- package/templates/complete-app/src/pages/index.js +19 -0
- package/templates/complete-app/src/server.d.ts +2 -0
- package/templates/complete-app/src/server.d.ts.map +1 -0
- package/templates/complete-app/src/server.js +192 -0
- package/templates/complete-app/vite.config.d.ts +3 -0
- package/templates/complete-app/vite.config.d.ts.map +1 -0
- package/templates/complete-app/vite.config.js +29 -57
- package/templates/fullstack-app/api/hello.d.ts +4 -0
- package/templates/fullstack-app/api/hello.d.ts.map +1 -0
- package/templates/fullstack-app/api/hello.js +14 -11
- package/templates/fullstack-app/api/users/[id].d.ts +5 -0
- package/templates/fullstack-app/api/users/[id].d.ts.map +1 -0
- package/templates/fullstack-app/api/users/[id].js +52 -0
- package/templates/fullstack-app/api/users/index.d.ts +4 -0
- package/templates/fullstack-app/api/users/index.d.ts.map +1 -0
- package/templates/fullstack-app/api/users/index.js +25 -0
- package/templates/fullstack-app/build/main.d.ts +211 -0
- package/templates/fullstack-app/build/main.d.ts.map +1 -0
- package/templates/fullstack-app/build.d.ts +2 -0
- package/templates/fullstack-app/build.d.ts.map +1 -0
- package/templates/fullstack-app/build.js +190 -0
- package/templates/fullstack-app/postcss.config.d.ts +5 -0
- package/templates/fullstack-app/postcss.config.d.ts.map +1 -0
- package/templates/fullstack-app/process-tailwind.d.ts +2 -0
- package/templates/fullstack-app/process-tailwind.d.ts.map +1 -0
- package/templates/fullstack-app/public/route-handler.d.ts +1 -0
- package/templates/fullstack-app/public/route-handler.d.ts.map +1 -0
- package/templates/fullstack-app/server.d.ts +2 -0
- package/templates/fullstack-app/server.d.ts.map +1 -0
- package/templates/fullstack-app/server.js +428 -266
- package/templates/fullstack-app/src/client.d.ts +2 -0
- package/templates/fullstack-app/src/client.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/ClientHome.d.ts +1 -0
- package/templates/fullstack-app/src/components/ClientHome.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/ClientHome.js +1 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.d.ts +7 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.js +12 -0
- package/templates/fullstack-app/src/components/Layout.d.ts +7 -0
- package/templates/fullstack-app/src/components/Layout.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/Layout.js +4 -0
- package/templates/fullstack-app/src/components/StateDemo.d.ts +2 -0
- package/templates/fullstack-app/src/components/StateDemo.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/StateDemo.js +86 -0
- package/templates/fullstack-app/src/components/UserList.d.ts +11 -0
- package/templates/fullstack-app/src/components/UserList.d.ts.map +1 -0
- package/templates/fullstack-app/src/components/UserList.js +7 -0
- package/templates/fullstack-app/src/config.d.ts +29 -0
- package/templates/fullstack-app/src/config.d.ts.map +1 -0
- package/templates/fullstack-app/src/config.js +36 -0
- package/templates/fullstack-app/src/data/api.d.ts +35 -0
- package/templates/fullstack-app/src/data/api.d.ts.map +1 -0
- package/templates/fullstack-app/src/data/api.js +173 -0
- package/templates/fullstack-app/src/main.d.ts +7 -0
- package/templates/fullstack-app/src/main.d.ts.map +1 -0
- package/templates/fullstack-app/src/main.js +130 -0
- package/templates/fullstack-app/src/middleware.d.ts +10 -0
- package/templates/fullstack-app/src/middleware.d.ts.map +1 -0
- package/templates/fullstack-app/src/middleware.js +14 -0
- package/templates/fullstack-app/src/pages/404.d.ts +4 -0
- package/templates/fullstack-app/src/pages/404.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/404.js +4 -0
- package/templates/fullstack-app/src/pages/[id].d.ts +1 -0
- package/templates/fullstack-app/src/pages/[id].d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/[id].js +1 -0
- package/templates/fullstack-app/src/pages/_app.d.ts +6 -0
- package/templates/fullstack-app/src/pages/_app.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/_app.js +6 -0
- package/templates/fullstack-app/src/pages/_document.d.ts +7 -0
- package/templates/fullstack-app/src/pages/_document.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/_document.js +4 -0
- package/templates/fullstack-app/src/pages/_error.d.ts +4 -0
- package/templates/fullstack-app/src/pages/_error.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/_error.js +8 -0
- package/templates/fullstack-app/src/pages/about/index.d.ts +5 -0
- package/templates/fullstack-app/src/pages/about/index.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/about/index.js +6 -0
- package/templates/fullstack-app/src/pages/about.d.ts +10 -0
- package/templates/fullstack-app/src/pages/about.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/about.js +21 -0
- package/templates/fullstack-app/src/pages/api/users/[id].d.ts +6 -0
- package/templates/fullstack-app/src/pages/api/users/[id].d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/api/users/[id].js +51 -0
- package/templates/fullstack-app/src/pages/api/users/index.d.ts +4 -0
- package/templates/fullstack-app/src/pages/api/users/index.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/api/users/index.js +33 -0
- package/templates/fullstack-app/src/pages/index.d.ts +21 -0
- package/templates/fullstack-app/src/pages/index.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/index.js +66 -0
- package/templates/fullstack-app/src/pages/users/[id].d.ts +38 -0
- package/templates/fullstack-app/src/pages/users/[id].d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/users/[id].js +79 -0
- package/templates/fullstack-app/src/pages/users.d.ts +14 -0
- package/templates/fullstack-app/src/pages/users.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/users.js +14 -0
- package/templates/fullstack-app/src/pages/wasm-demo.d.ts +1 -0
- package/templates/fullstack-app/src/pages/wasm-demo.d.ts.map +1 -0
- package/templates/fullstack-app/src/pages/wasm-demo.js +2 -0
- package/templates/fullstack-app/src/router.d.ts +22 -0
- package/templates/fullstack-app/src/router.d.ts.map +1 -0
- package/templates/fullstack-app/src/router.js +210 -0
- package/templates/fullstack-app/tailwind.config.d.ts +3 -0
- package/templates/fullstack-app/tailwind.config.d.ts.map +1 -0
- package/templates/fullstack-app/vite.config.d.ts +3 -0
- package/templates/fullstack-app/vite.config.d.ts.map +1 -0
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.d.ts +2 -0
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.d.ts.map +1 -0
- package/templates/ssr-template/dist/client.d.ts +85 -0
- package/templates/ssr-template/dist/client.d.ts.map +1 -0
- package/templates/ssr-template/dist/server.d.ts +2 -0
- package/templates/ssr-template/dist/server.d.ts.map +1 -0
- package/templates/ssr-template/esbuild.config.d.ts +2 -0
- package/templates/ssr-template/esbuild.config.d.ts.map +1 -0
- package/templates/ssr-template/jsx-shim.d.ts +2 -0
- package/templates/ssr-template/jsx-shim.d.ts.map +1 -0
- package/templates/ssr-template/src/App.d.ts +2 -0
- package/templates/ssr-template/src/App.d.ts.map +1 -0
- package/templates/ssr-template/src/App.js +625 -0
- package/templates/ssr-template/src/App.tsx +43 -18
- package/templates/ssr-template/src/client.d.ts +2 -0
- package/templates/ssr-template/src/client.d.ts.map +1 -0
- package/templates/ssr-template/src/client.js +3 -0
- package/templates/ssr-template/src/server.d.ts +2 -0
- package/templates/ssr-template/src/server.d.ts.map +1 -0
- package/templates/ssr-template/src/server.js +29 -0
- package/templates/ssr-template/vite.config.d.ts +3 -0
- package/templates/ssr-template/vite.config.d.ts.map +1 -0
- package/templates/ssr-template/vite.config.js +30 -0
- package/templates/wasm/build-wasm.d.ts +2 -0
- package/templates/wasm/build-wasm.d.ts.map +1 -0
- package/templates/wasm/dist/assets/index-BNqTDBdE.d.ts +30 -0
- package/templates/wasm/dist/assets/index-BNqTDBdE.d.ts.map +1 -0
- package/templates/wasm/dist/wasm_exec.d.ts +1 -0
- package/templates/wasm/dist/wasm_exec.d.ts.map +1 -0
- package/templates/wasm/esbuild.config.d.ts +2 -0
- package/templates/wasm/esbuild.config.d.ts.map +1 -0
- package/templates/wasm/go/wasm_exec.d.ts +1 -0
- package/templates/wasm/go/wasm_exec.d.ts.map +1 -0
- package/templates/wasm/jsx-shim.d.ts +5 -0
- package/templates/wasm/jsx-shim.d.ts.map +1 -0
- package/templates/wasm/public/wasm_exec.d.ts +1 -0
- package/templates/wasm/public/wasm_exec.d.ts.map +1 -0
- package/templates/wasm/src/App.d.ts +2 -0
- package/templates/wasm/src/App.d.ts.map +1 -0
- package/templates/wasm/src/App.js +381 -0
- package/templates/wasm/src/client.d.ts +2 -0
- package/templates/wasm/src/client.d.ts.map +1 -0
- package/templates/wasm/src/client.js +210 -0
- package/templates/wasm/src/index.d.ts +2 -0
- package/templates/wasm/src/index.d.ts.map +1 -0
- package/templates/wasm/src/index.js +20 -0
- package/templates/wasm/src/server.d.ts +2 -0
- package/templates/wasm/src/server.d.ts.map +1 -0
- package/templates/wasm/src/server.js +131 -0
- package/templates/wasm/vite.config.d.ts +3 -0
- package/templates/wasm/vite.config.d.ts.map +1 -0
- package/templates/wasm/vite.config.js +36 -0
- package/templates/wasm/wasm-loader.d.ts +6 -0
- package/templates/wasm/wasm-loader.d.ts.map +1 -0
- package/dist/renderer-BL3gq8cW.cjs +0 -2
- package/dist/renderer-BL3gq8cW.cjs.map +0 -1
- package/dist/renderer-Dyy-o05F.js +0 -52
- package/dist/renderer-Dyy-o05F.js.map +0 -1
- package/dist/server-renderer-C1WXH-zV.js.map +0 -1
- package/dist/server-renderer-Chs-nmJm.cjs +0 -2
- package/dist/server-renderer-Chs-nmJm.cjs.map +0 -1
@@ -0,0 +1,131 @@
|
|
1
|
+
import { createServer } from 'frontend-hamroun';
|
2
|
+
import { loadGoWasmFromFile } from 'frontend-hamroun';
|
3
|
+
import path from 'path';
|
4
|
+
import { fileURLToPath } from 'url';
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
6
|
+
const __dirname = path.dirname(__filename);
|
7
|
+
// Create server instance
|
8
|
+
const server = createServer({
|
9
|
+
port: 3000,
|
10
|
+
staticDir: './public',
|
11
|
+
pagesDir: './src/pages',
|
12
|
+
apiDir: './src/api'
|
13
|
+
});
|
14
|
+
// Server-side WASM integration example
|
15
|
+
async function initServerWasm() {
|
16
|
+
try {
|
17
|
+
console.log('🔄 Initializing server-side Go WASM...');
|
18
|
+
const wasmPath = path.join(__dirname, '..', 'public', 'example.wasm');
|
19
|
+
const wasmInstance = await loadGoWasmFromFile(wasmPath, {
|
20
|
+
debug: true,
|
21
|
+
onLoad: (instance) => {
|
22
|
+
console.log('✅ Go WASM loaded on server side');
|
23
|
+
// Test server-side WASM functions
|
24
|
+
try {
|
25
|
+
if (instance.functions.add) {
|
26
|
+
const result = instance.functions.add(5, 3);
|
27
|
+
console.log('Server WASM test - add(5, 3):', result);
|
28
|
+
}
|
29
|
+
if (instance.functions.fibonacci) {
|
30
|
+
const fibResult = instance.functions.fibonacci(10);
|
31
|
+
console.log('Server WASM test - fibonacci(10):', fibResult);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
catch (error) {
|
35
|
+
console.log('Server WASM test functions not available:', error.message);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
});
|
39
|
+
// Make WASM instance available to API routes
|
40
|
+
server.getExpressApp().locals.wasm = wasmInstance;
|
41
|
+
}
|
42
|
+
catch (error) {
|
43
|
+
console.error('❌ Failed to initialize server-side WASM:', error);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
// API route example using server-side WASM
|
47
|
+
server.getExpressApp().get('/api/wasm/compute', async (req, res) => {
|
48
|
+
try {
|
49
|
+
const { operation, a, b } = req.query;
|
50
|
+
const wasmInstance = req.app.locals.wasm;
|
51
|
+
if (!wasmInstance) {
|
52
|
+
return res.status(500).json({ error: 'WASM not initialized' });
|
53
|
+
}
|
54
|
+
let result;
|
55
|
+
switch (operation) {
|
56
|
+
case 'add':
|
57
|
+
if (wasmInstance.functions.add) {
|
58
|
+
result = wasmInstance.functions.add(Number(a), Number(b));
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
throw new Error('Add function not available');
|
62
|
+
}
|
63
|
+
break;
|
64
|
+
case 'fibonacci':
|
65
|
+
if (wasmInstance.functions.fibonacci) {
|
66
|
+
result = wasmInstance.functions.fibonacci(Number(a));
|
67
|
+
}
|
68
|
+
else {
|
69
|
+
throw new Error('Fibonacci function not available');
|
70
|
+
}
|
71
|
+
break;
|
72
|
+
default:
|
73
|
+
throw new Error('Unknown operation');
|
74
|
+
}
|
75
|
+
res.json({
|
76
|
+
success: true,
|
77
|
+
operation,
|
78
|
+
result,
|
79
|
+
serverTime: new Date().toISOString()
|
80
|
+
});
|
81
|
+
}
|
82
|
+
catch (error) {
|
83
|
+
res.status(400).json({
|
84
|
+
success: false,
|
85
|
+
error: error.message
|
86
|
+
});
|
87
|
+
}
|
88
|
+
});
|
89
|
+
// Health check endpoint
|
90
|
+
server.getExpressApp().get('/api/health', (req, res) => {
|
91
|
+
res.json({
|
92
|
+
status: 'healthy',
|
93
|
+
wasm: !!req.app.locals.wasm,
|
94
|
+
timestamp: new Date().toISOString()
|
95
|
+
});
|
96
|
+
});
|
97
|
+
// Start server
|
98
|
+
async function startServer() {
|
99
|
+
try {
|
100
|
+
// Initialize WASM first
|
101
|
+
await initServerWasm();
|
102
|
+
// Start the server
|
103
|
+
await server.start();
|
104
|
+
console.log('🚀 Server started successfully!');
|
105
|
+
console.log('📋 Available endpoints:');
|
106
|
+
console.log(' • http://localhost:3000 - Main app');
|
107
|
+
console.log(' • http://localhost:3000/api/health - Health check');
|
108
|
+
console.log(' • http://localhost:3000/api/wasm/compute - WASM compute API');
|
109
|
+
console.log('');
|
110
|
+
console.log('💡 Example API calls:');
|
111
|
+
console.log(' • /api/wasm/compute?operation=add&a=5&b=3');
|
112
|
+
console.log(' • /api/wasm/compute?operation=fibonacci&a=10');
|
113
|
+
}
|
114
|
+
catch (error) {
|
115
|
+
console.error('❌ Failed to start server:', error);
|
116
|
+
process.exit(1);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
// Graceful shutdown
|
120
|
+
process.on('SIGTERM', async () => {
|
121
|
+
console.log('🛑 Received SIGTERM, shutting down gracefully...');
|
122
|
+
await server.stop();
|
123
|
+
process.exit(0);
|
124
|
+
});
|
125
|
+
process.on('SIGINT', async () => {
|
126
|
+
console.log('🛑 Received SIGINT, shutting down gracefully...');
|
127
|
+
await server.stop();
|
128
|
+
process.exit(0);
|
129
|
+
});
|
130
|
+
// Start the server
|
131
|
+
startServer();
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["vite.config.ts"],"names":[],"mappings":";AAGA,wBAkCG"}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { defineConfig } from 'vite';
|
2
|
+
export default defineConfig({
|
3
|
+
esbuild: {
|
4
|
+
jsx: 'transform',
|
5
|
+
jsxFactory: 'jsx',
|
6
|
+
jsxFragment: 'Fragment',
|
7
|
+
jsxImportSource: 'frontend-hamroun',
|
8
|
+
},
|
9
|
+
optimizeDeps: {
|
10
|
+
include: ['frontend-hamroun'],
|
11
|
+
exclude: []
|
12
|
+
},
|
13
|
+
server: {
|
14
|
+
fs: {
|
15
|
+
allow: ['..', '../..']
|
16
|
+
},
|
17
|
+
headers: {
|
18
|
+
'Cross-Origin-Embedder-Policy': 'require-corp',
|
19
|
+
'Cross-Origin-Opener-Policy': 'same-origin'
|
20
|
+
}
|
21
|
+
},
|
22
|
+
build: {
|
23
|
+
target: 'esnext',
|
24
|
+
rollupOptions: {
|
25
|
+
output: {
|
26
|
+
format: 'es'
|
27
|
+
}
|
28
|
+
}
|
29
|
+
},
|
30
|
+
resolve: {
|
31
|
+
alias: {
|
32
|
+
'frontend-hamroun/jsx-dev-runtime': 'frontend-hamroun',
|
33
|
+
'frontend-hamroun/jsx-runtime': 'frontend-hamroun'
|
34
|
+
}
|
35
|
+
}
|
36
|
+
});
|
@@ -0,0 +1,6 @@
|
|
1
|
+
export function loadGoWasm(wasmPath: any, options?: {}): Promise<any>;
|
2
|
+
export function isWasmReady(): boolean;
|
3
|
+
export function getWasmInstance(): any;
|
4
|
+
export function callGoFunction(functionName: any, ...args: any[]): any;
|
5
|
+
export function waitForWasm(timeout?: number): Promise<any>;
|
6
|
+
//# sourceMappingURL=wasm-loader.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"wasm-loader.d.ts","sourceRoot":"","sources":["wasm-loader.js"],"names":[],"mappings":"AAOA,sEA6CC;AAYD,uCAEC;AAED,uCAEC;AAGD,uEAUC;AAED,4DAiBC"}
|
@@ -1,2 +0,0 @@
|
|
1
|
-
"use strict";const e=require("./jsx-runtime.cjs"),r=require("./server-renderer-Chs-nmJm.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-BL3gq8cW.cjs.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"renderer-BL3gq8cW.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,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-C1WXH-zV.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-Dyy-o05F.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"renderer-Dyy-o05F.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 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server-renderer-C1WXH-zV.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\nlet isServerRender = false;\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(isSSR: boolean = false): number {\r\n currentRender++;\r\n isServerRender = isSSR;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\r\n if (isServer || isServerRender) {\r\n serverStates.delete(currentRender);\r\n }\r\n isServerRender = false;\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 && !isServerRender) {\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 || isServerRender) {\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 && !isServerRender) throw new Error(\"useEffect must be called within a render\");\r\n\r\n // Skip effects on server\r\n if (isServer || isServerRender) {\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 && !isServerRender) 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 && !isServerRender) 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\nexport async function renderToString(element: any): Promise<string> {\r\n const renderId = prepareRender(true); // Mark as SSR\r\n \r\n try {\r\n const html = await renderNodeToString(element);\r\n return html;\r\n } finally {\r\n finishRender();\r\n }\r\n}\r\n\r\nasync function renderNodeToString(node: any): Promise<string> {\r\n // Handle null, undefined, boolean\r\n if (node == null || typeof node === 'boolean') {\r\n return '';\r\n }\r\n\r\n // Handle primitives\r\n if (typeof node === 'string' || typeof node === 'number') {\r\n return escapeHtml(String(node));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(node)) {\r\n const results = await Promise.all(node.map(child => renderNodeToString(child)));\r\n return results.join('');\r\n }\r\n\r\n // Handle objects with type and props (React-like elements)\r\n if (node && typeof node === 'object' && 'type' in node) {\r\n const { type, props = {} } = node;\r\n\r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props);\r\n return await renderNodeToString(result);\r\n } catch (error:any) {\r\n console.error('Error rendering component:', error);\r\n return `<!-- Error rendering component: ${error.message} -->`;\r\n }\r\n }\r\n\r\n // Handle DOM elements\r\n if (typeof type === 'string') {\r\n return await renderDOMElement(type, props);\r\n }\r\n }\r\n\r\n // Fallback for other objects\r\n if (typeof node === 'object') {\r\n return escapeHtml(JSON.stringify(node));\r\n }\r\n\r\n return escapeHtml(String(node));\r\n}\r\n\r\nasync function renderDOMElement(tagName: string, props: any): Promise<string> {\r\n const { children, ...attrs } = props;\r\n \r\n // Self-closing tags\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n // Build attributes string\r\n const attributeString = Object.entries(attrs)\r\n .filter(([key, value]) => {\r\n // Filter out React-specific props and event handlers\r\n if (key.startsWith('on') || key === 'key' || key === 'ref') return false;\r\n if (value == null || value === false) return false;\r\n return true;\r\n })\r\n .map(([key, value]) => {\r\n // Handle className -> class\r\n if (key === 'className') key = 'class';\r\n \r\n // Handle boolean attributes\r\n if (value === true) return key;\r\n \r\n // Handle style objects\r\n if (key === 'style' && typeof value === 'object' && value !== null) {\r\n const styleString = Object.entries(value)\r\n .map(([prop, val]) => `${kebabCase(prop)}:${val}`)\r\n .join(';');\r\n return `style=\"${escapeHtml(styleString)}\"`;\r\n }\r\n \r\n return `${key}=\"${escapeHtml(String(value))}\"`;\r\n })\r\n .join(' ');\r\n\r\n const openTag = `<${tagName}${attributeString ? ' ' + attributeString : ''}>`;\r\n \r\n // Self-closing elements\r\n if (voidElements.has(tagName)) {\r\n return openTag.slice(0, -1) + '/>';\r\n }\r\n\r\n // Elements with children\r\n const closeTag = `</${tagName}>`;\r\n \r\n if (children != null) {\r\n const childrenString = await renderNodeToString(children);\r\n return openTag + childrenString + closeTag;\r\n }\r\n \r\n return openTag + closeTag;\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n const htmlEscapes: Record<string, string> = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '/': '/'\r\n };\r\n \r\n return text.replace(/[&<>\"'/]/g, (match) => htmlEscapes[match]);\r\n}\r\n\r\nfunction kebabCase(str: string): string {\r\n return str.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n}\r\n"],"names":["index","state","setState","effectIndex","ref"],"mappings":"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"}
|
@@ -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 n=0,r=!1;const s=new Map,o=new Map,i=new Map,c=new Map,a=new Map,u="undefined"==typeof window,p=new Map;let l=null,f=null,g=null;function h(e=!1){return n++,r=e,o.set(n,0),n}function d(){(u||r)&&p.delete(n),r=!1,n=0}function w(e){if(!n&&!r)throw new Error("useState must be called within a render");if(u||r){p.has(n)||p.set(n,new Map);const t=p.get(n),r=o.get(n)||0;t.has(r)||t.set(r,e);const s=t.get(r),i=e=>{};return o.set(n,r+1),[s,i]}s.has(n)||s.set(n,[]);const i=s.get(n),c=o.get(n)||0;c>=i.length&&i.push(e);const a=i[c];return o.set(n,c+1),[a,e=>{const r="function"==typeof e?e(i[c]):e;i[c]!==r&&(i[c]=r,exports.isBatching?t((()=>y(n))):y(n))}]}async function y(e){try{const t=i.get(e);t&&(t.forEach((e=>{e.cleanup&&e.cleanup()})),i.set(e,[])),l&&f&&g&&await l(g,f)}catch(t){console.error("Error during rerender:",t)}}async function m(e){if(null==e||"boolean"==typeof e)return"";if("string"==typeof e||"number"==typeof e)return x(String(e));if(Array.isArray(e)){return(await Promise.all(e.map((e=>m(e))))).join("")}if(e&&"object"==typeof e&&"type"in e){const{type:n,props:r={}}=e;if("function"==typeof n)try{const e=await n(r);return await m(e)}catch(t){return console.error("Error rendering component:",t),`\x3c!-- Error rendering component: ${t.message} --\x3e`}if("string"==typeof n)return await async function(e,t){const{children:n,...r}=t,s=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),o=Object.entries(r).filter((([e,t])=>!e.startsWith("on")&&"key"!==e&&"ref"!==e&&(null!=t&&!1!==t))).map((([e,t])=>{if("className"===e&&(e="class"),!0===t)return e;if("style"===e&&"object"==typeof t&&null!==t){return`style="${x(Object.entries(t).map((([e,t])=>{return`${n=e,n.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))}:${t}`;var n})).join(";"))}"`}return`${e}="${x(String(t))}"`})).join(" "),i=`<${e}${o?" "+o:""}>`;if(s.has(e))return i.slice(0,-1)+"/>";const c=`</${e}>`;if(null!=n){return i+await m(n)+c}return i+c}(n,r)}return x("object"==typeof e?JSON.stringify(e):String(e))}function x(e){const t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return e.replace(/[&<>"'/]/g,(e=>t[e]))}exports.batchUpdates=t,exports.finishRender=d,exports.getIsBatching=function(){return exports.isBatching},exports.prepareRender=h,exports.renderToString=async function(e){h(!0);try{return await m(e)}finally{d()}},exports.setRenderCallback=function(e,t,n){l=e,f=n,g=t},exports.useEffect=function(e,t){if(!n&&!r)throw new Error("useEffect must be called within a render");if(u||r){const e=o.get(n)||0;return void o.set(n,e+1)}const s=o.get(n)||0;i.has(n)||i.set(n,[]);const c=i.get(n),a=c[s];a&&t&&a.deps&&!t.some(((e,t)=>e!==a.deps[t]))||(a?.cleanup&&a.cleanup(),queueMicrotask((()=>{const n=e()||void 0;c[s]={cleanup:n,deps:t||[]}}))),o.set(n,s+1)},exports.useErrorBoundary=function(){const[e,t]=w(null);return[e,()=>t(null)]},exports.useMemo=function(e,t){if(!n&&!r)throw new Error("useMemo must be called within a render");const s=o.get(n)||0;c.has(n)||c.set(n,[]);const i=c.get(n),a=i[s];if(!a||t&&t.some(((e,t)=>!Object.is(e,a.deps[t])))){const r=e();return i[s]={value:r,deps:t||[]},o.set(n,s+1),r}return o.set(n,s+1),a.value},exports.useRef=function(e){if(!n&&!r)throw new Error("useRef must be called within a render");const t=o.get(n)||0;a.has(n)||a.set(n,[]);const s=a.get(n);if(t>=s.length){const r={current:e};return s.push(r),o.set(n,t+1),r}const i=s[t];return o.set(n,t+1),i},exports.useState=w;
|
2
|
-
//# sourceMappingURL=server-renderer-Chs-nmJm.cjs.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server-renderer-Chs-nmJm.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\nlet isServerRender = false;\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(isSSR: boolean = false): number {\r\n currentRender++;\r\n isServerRender = isSSR;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\r\n if (isServer || isServerRender) {\r\n serverStates.delete(currentRender);\r\n }\r\n isServerRender = false;\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 && !isServerRender) {\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 || isServerRender) {\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 && !isServerRender) throw new Error(\"useEffect must be called within a render\");\r\n\r\n // Skip effects on server\r\n if (isServer || isServerRender) {\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 && !isServerRender) 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 && !isServerRender) 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\nexport async function renderToString(element: any): Promise<string> {\r\n const renderId = prepareRender(true); // Mark as SSR\r\n \r\n try {\r\n const html = await renderNodeToString(element);\r\n return html;\r\n } finally {\r\n finishRender();\r\n }\r\n}\r\n\r\nasync function renderNodeToString(node: any): Promise<string> {\r\n // Handle null, undefined, boolean\r\n if (node == null || typeof node === 'boolean') {\r\n return '';\r\n }\r\n\r\n // Handle primitives\r\n if (typeof node === 'string' || typeof node === 'number') {\r\n return escapeHtml(String(node));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(node)) {\r\n const results = await Promise.all(node.map(child => renderNodeToString(child)));\r\n return results.join('');\r\n }\r\n\r\n // Handle objects with type and props (React-like elements)\r\n if (node && typeof node === 'object' && 'type' in node) {\r\n const { type, props = {} } = node;\r\n\r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props);\r\n return await renderNodeToString(result);\r\n } catch (error:any) {\r\n console.error('Error rendering component:', error);\r\n return `<!-- Error rendering component: ${error.message} -->`;\r\n }\r\n }\r\n\r\n // Handle DOM elements\r\n if (typeof type === 'string') {\r\n return await renderDOMElement(type, props);\r\n }\r\n }\r\n\r\n // Fallback for other objects\r\n if (typeof node === 'object') {\r\n return escapeHtml(JSON.stringify(node));\r\n }\r\n\r\n return escapeHtml(String(node));\r\n}\r\n\r\nasync function renderDOMElement(tagName: string, props: any): Promise<string> {\r\n const { children, ...attrs } = props;\r\n \r\n // Self-closing tags\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n // Build attributes string\r\n const attributeString = Object.entries(attrs)\r\n .filter(([key, value]) => {\r\n // Filter out React-specific props and event handlers\r\n if (key.startsWith('on') || key === 'key' || key === 'ref') return false;\r\n if (value == null || value === false) return false;\r\n return true;\r\n })\r\n .map(([key, value]) => {\r\n // Handle className -> class\r\n if (key === 'className') key = 'class';\r\n \r\n // Handle boolean attributes\r\n if (value === true) return key;\r\n \r\n // Handle style objects\r\n if (key === 'style' && typeof value === 'object' && value !== null) {\r\n const styleString = Object.entries(value)\r\n .map(([prop, val]) => `${kebabCase(prop)}:${val}`)\r\n .join(';');\r\n return `style=\"${escapeHtml(styleString)}\"`;\r\n }\r\n \r\n return `${key}=\"${escapeHtml(String(value))}\"`;\r\n })\r\n .join(' ');\r\n\r\n const openTag = `<${tagName}${attributeString ? ' ' + attributeString : ''}>`;\r\n \r\n // Self-closing elements\r\n if (voidElements.has(tagName)) {\r\n return openTag.slice(0, -1) + '/>';\r\n }\r\n\r\n // Elements with children\r\n const closeTag = `</${tagName}>`;\r\n \r\n if (children != null) {\r\n const childrenString = await renderNodeToString(children);\r\n return openTag + childrenString + closeTag;\r\n }\r\n \r\n return openTag + closeTag;\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n const htmlEscapes: Record<string, string> = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n '/': '/'\r\n };\r\n \r\n return text.replace(/[&<>\"'/]/g, (match) => htmlEscapes[match]);\r\n}\r\n\r\nfunction kebabCase(str: string): string {\r\n return str.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n}\r\n"],"names":["isBatching","queue","batchUpdates","fn","push","length","nextFn","shift","currentRender","isServerRender","states","Map","stateIndices","effects","memos","refs","isServer","window","serverStates","globalRenderCallback","globalContainer","currentElement","prepareRender","isSSR","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","node","escapeHtml","String","Array","isArray","Promise","all","map","child","join","type","props","result","message","tagName","children","attrs","voidElements","Set","attributeString","Object","entries","filter","key","value","startsWith","prop","val","str","replace","match","toLowerCase","openTag","slice","closeTag","renderDOMElement","JSON","stringify","text","htmlEscapes","element","callback","container","deps","effectIndex","prevEffect","some","dep","i","queueMicrotask","setError","factory","memoIndex","componentMemos","prevMemo","is","refIndex","componentRefs","ref","current"],"mappings":"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"}
|