frontend-hamroun 1.2.85 → 1.2.88

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 (96) hide show
  1. package/dist/batch.d.ts +4 -0
  2. package/dist/batch.d.ts.map +1 -0
  3. package/dist/batch.js +22 -0
  4. package/dist/client-router.d.ts +61 -0
  5. package/dist/client-router.d.ts.map +1 -0
  6. package/dist/client-router.js +209 -0
  7. package/dist/component.d.ts +15 -0
  8. package/dist/component.d.ts.map +1 -0
  9. package/dist/component.js +84 -0
  10. package/dist/components/Counter.d.ts +1 -0
  11. package/dist/components/Counter.d.ts.map +1 -0
  12. package/dist/components/Counter.js +2 -0
  13. package/dist/context.d.ts +5 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +23 -0
  16. package/dist/event-bus.d.ts +24 -0
  17. package/dist/event-bus.d.ts.map +1 -0
  18. package/dist/event-bus.js +74 -0
  19. package/dist/forms.d.ts +41 -0
  20. package/dist/forms.d.ts.map +1 -0
  21. package/dist/forms.js +147 -0
  22. package/dist/hooks.d.ts +12 -0
  23. package/dist/hooks.d.ts.map +1 -0
  24. package/dist/hooks.js +142 -0
  25. package/dist/index.cjs +1118 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.client.d.ts +13 -0
  28. package/dist/index.client.d.ts.map +1 -0
  29. package/dist/index.client.js +12 -25
  30. package/dist/index.d.ts +65 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +1040 -264
  33. package/dist/index.js.map +1 -1
  34. package/dist/jsx-dev-runtime.cjs +102 -0
  35. package/dist/jsx-dev-runtime.cjs.map +1 -0
  36. package/dist/jsx-dev-runtime.d.ts +3 -0
  37. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  38. package/dist/jsx-dev-runtime.js +96 -0
  39. package/dist/jsx-dev-runtime.js.map +1 -0
  40. package/dist/jsx-runtime/jsx-runtime.d.ts +5 -0
  41. package/dist/jsx-runtime/jsx-runtime.d.ts.map +1 -0
  42. package/dist/jsx-runtime/jsx-runtime.js +40 -0
  43. package/dist/jsx-runtime.cjs +112 -1
  44. package/dist/jsx-runtime.cjs.map +1 -1
  45. package/dist/jsx-runtime.d.ts +18 -0
  46. package/dist/jsx-runtime.d.ts.map +1 -0
  47. package/dist/jsx-runtime.js +90 -79
  48. package/dist/jsx-runtime.js.map +1 -1
  49. package/dist/lifecycle-events.d.ts +109 -0
  50. package/dist/lifecycle-events.d.ts.map +1 -0
  51. package/dist/lifecycle-events.js +176 -0
  52. package/dist/renderComponent.d.ts +14 -0
  53. package/dist/renderComponent.d.ts.map +1 -0
  54. package/dist/renderComponent.js +29 -0
  55. package/dist/renderer.d.ts +4 -0
  56. package/dist/renderer.d.ts.map +1 -0
  57. package/dist/renderer.js +49 -0
  58. package/dist/router.d.ts +56 -0
  59. package/dist/router.d.ts.map +1 -0
  60. package/dist/router.js +165 -0
  61. package/dist/server-renderer.d.ts +2 -0
  62. package/dist/server-renderer.d.ts.map +1 -0
  63. package/dist/server-renderer.js +111 -5
  64. package/dist/server-types.d.ts +43 -0
  65. package/dist/server-types.d.ts.map +1 -0
  66. package/dist/server-types.js +5 -0
  67. package/dist/store.d.ts +42 -0
  68. package/dist/store.d.ts.map +1 -0
  69. package/dist/store.js +98 -0
  70. package/dist/types.d.ts +272 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/utils.d.ts +47 -0
  74. package/dist/utils.d.ts.map +1 -0
  75. package/dist/utils.js +143 -0
  76. package/dist/vdom.d.ts +9 -0
  77. package/dist/vdom.d.ts.map +1 -0
  78. package/dist/vdom.js +21 -0
  79. package/dist/wasm.d.ts +37 -0
  80. package/dist/wasm.d.ts.map +1 -0
  81. package/dist/wasm.js +158 -0
  82. package/package.json +54 -83
  83. package/dist/index.client.cjs +0 -2
  84. package/dist/index.client.cjs.map +0 -1
  85. package/dist/index.client.js.map +0 -1
  86. package/dist/renderer-DaVfBeVi.cjs +0 -2
  87. package/dist/renderer-DaVfBeVi.cjs.map +0 -1
  88. package/dist/renderer-nfT7XSpo.js +0 -61
  89. package/dist/renderer-nfT7XSpo.js.map +0 -1
  90. package/dist/server-renderer-B5b0Q0ck.cjs +0 -2
  91. package/dist/server-renderer-B5b0Q0ck.cjs.map +0 -1
  92. package/dist/server-renderer-C4MB-jAp.js +0 -248
  93. package/dist/server-renderer-C4MB-jAp.js.map +0 -1
  94. package/dist/server-renderer.cjs +0 -2
  95. package/dist/server-renderer.cjs.map +0 -1
  96. package/dist/server-renderer.js.map +0 -1
package/dist/wasm.js ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Go WebAssembly Integration Utilities
3
+ *
4
+ * This module provides tools for loading and interacting with Go WASM modules
5
+ * in browser and server environments.
6
+ */
7
+ const DEFAULT_GO_WASM_PATH = '/wasm_exec.js';
8
+ /**
9
+ * Load a Go WASM module from a URL
10
+ */
11
+ export async function loadGoWasm(wasmUrl, options = {}) {
12
+ const { importObject = {}, goWasmPath = DEFAULT_GO_WASM_PATH, loadGo = true, onLoad, debug = false } = options;
13
+ // In browser environment, load the Go WASM runtime
14
+ if (typeof window !== 'undefined' && loadGo) {
15
+ await loadGoRuntime(goWasmPath);
16
+ }
17
+ try {
18
+ // Create Go instance for WASM
19
+ // @ts-ignore - Go is loaded from the global scope
20
+ const go = typeof Go !== 'undefined' ? new Go() : null;
21
+ // Fetch and instantiate the WASM module
22
+ if (debug)
23
+ console.log(`[WASM] Loading module from ${wasmUrl}`);
24
+ const response = await fetch(wasmUrl);
25
+ if (!response.ok) {
26
+ throw new Error(`Failed to fetch WASM module: ${response.statusText}`);
27
+ }
28
+ const buffer = await response.arrayBuffer();
29
+ const module = await WebAssembly.compile(buffer);
30
+ // Create imports object, combining Go runtime with custom imports
31
+ const finalImportObject = go ? {
32
+ ...go.importObject,
33
+ ...importObject
34
+ } : importObject;
35
+ // Instantiate the WASM module
36
+ const instance = await WebAssembly.instantiate(module, finalImportObject);
37
+ // Initialize Go runtime if available
38
+ if (go) {
39
+ go.run(instance);
40
+ }
41
+ // Extract exported functions
42
+ const exports = instance.exports;
43
+ const functions = {};
44
+ // Generate wrapper functions for all exports that are functions
45
+ for (const key in exports) {
46
+ if (typeof exports[key] === 'function') {
47
+ // Type assertion to ensure the exports[key] is callable
48
+ const exportedFn = exports[key];
49
+ functions[key] = (...args) => exportedFn(...args);
50
+ if (debug) {
51
+ const originalFn = functions[key];
52
+ functions[key] = (...args) => {
53
+ console.log(`[WASM] Calling ${key}(${args.join(', ')})`);
54
+ const result = originalFn(...args);
55
+ console.log(`[WASM] ${key} returned:`, result);
56
+ return result;
57
+ };
58
+ }
59
+ }
60
+ }
61
+ // Add any globally exported functions from Go
62
+ if (typeof window !== 'undefined') {
63
+ for (const key in window) {
64
+ if (key.startsWith('go') && typeof window[key] === 'function') {
65
+ // Type assertion to ensure the window[key] is callable
66
+ const globalFn = window[key];
67
+ functions[key] = (...args) => globalFn(...args);
68
+ if (debug) {
69
+ const originalFn = functions[key];
70
+ functions[key] = (...args) => {
71
+ console.log(`[WASM] Calling global ${key}(${args.join(', ')})`);
72
+ const result = originalFn(...args);
73
+ console.log(`[WASM] ${key} returned:`, result);
74
+ return result;
75
+ };
76
+ }
77
+ }
78
+ }
79
+ }
80
+ const wasmInstance = {
81
+ instance,
82
+ module,
83
+ exports,
84
+ functions
85
+ };
86
+ // Run onLoad callback if provided
87
+ if (onLoad) {
88
+ onLoad(wasmInstance);
89
+ }
90
+ return wasmInstance;
91
+ }
92
+ catch (error) {
93
+ console.error('[WASM] Failed to load Go WASM module:', error);
94
+ throw error;
95
+ }
96
+ }
97
+ /**
98
+ * Load the Go WASM runtime script
99
+ */
100
+ async function loadGoRuntime(path = DEFAULT_GO_WASM_PATH) {
101
+ if (typeof window === 'undefined')
102
+ return;
103
+ // Check if Go runtime is already loaded
104
+ if (typeof window.Go !== 'undefined') {
105
+ return;
106
+ }
107
+ // Load the Go WASM runtime script
108
+ return new Promise((resolve, reject) => {
109
+ const script = document.createElement('script');
110
+ script.src = path;
111
+ script.onload = () => resolve();
112
+ script.onerror = () => reject(new Error(`Failed to load Go WASM runtime from ${path}`));
113
+ document.head.appendChild(script);
114
+ });
115
+ }
116
+ /**
117
+ * Create a TypeScript-friendly wrapper for Go WASM functions
118
+ */
119
+ export function createTypedWasmFunction(instance, functionName) {
120
+ if (!instance.functions[functionName]) {
121
+ throw new Error(`WASM function "${functionName}" not found`);
122
+ }
123
+ return instance.functions[functionName];
124
+ }
125
+ /**
126
+ * Helper to convert JavaScript values to Go-compatible formats
127
+ */
128
+ export const goValues = {
129
+ // Convert JS string to Go string (returns memory pointer)
130
+ stringToGo: (instance, str) => {
131
+ if (!instance.functions.__stringToGo) {
132
+ throw new Error('__stringToGo function not found in WASM module');
133
+ }
134
+ return instance.functions.__stringToGo(str);
135
+ },
136
+ // Convert Go string (memory pointer) to JS string
137
+ stringFromGo: (instance, ptr) => {
138
+ if (!instance.functions.__stringFromGo) {
139
+ throw new Error('__stringFromGo function not found in WASM module');
140
+ }
141
+ return instance.functions.__stringFromGo(ptr);
142
+ },
143
+ // Convert JS object to Go (returns memory pointer)
144
+ objectToGo: (instance, obj) => {
145
+ if (!instance.functions.__objectToGo) {
146
+ throw new Error('__objectToGo function not found in WASM module');
147
+ }
148
+ return instance.functions.__objectToGo(JSON.stringify(obj));
149
+ },
150
+ // Convert Go object (memory pointer) to JS object
151
+ objectFromGo: (instance, ptr) => {
152
+ if (!instance.functions.__objectFromGo) {
153
+ throw new Error('__objectFromGo function not found in WASM module');
154
+ }
155
+ const str = instance.functions.__objectFromGo(ptr);
156
+ return JSON.parse(str);
157
+ }
158
+ };
package/package.json CHANGED
@@ -1,65 +1,65 @@
1
1
  {
2
2
  "name": "frontend-hamroun",
3
- "version": "1.2.85",
4
- "description": "A lightweight full-stack JavaScript framework",
5
- "type": "module",
6
- "main": "dist/index.cjs",
3
+ "version": "1.2.88",
4
+ "description": "A lightweight frontend JavaScript framework with React-like syntax",
5
+ "main": "dist/index.js",
7
6
  "module": "dist/index.js",
8
7
  "types": "dist/index.d.ts",
8
+ "type": "module",
9
9
  "exports": {
10
10
  ".": {
11
+ "types": "./dist/index.d.ts",
11
12
  "import": "./dist/index.js",
12
13
  "require": "./dist/index.cjs",
13
- "types": "./dist/index.d.ts"
14
- },
15
- "./client": {
16
- "import": "./dist/index.client.js",
17
- "require": "./dist/index.client.cjs",
18
- "types": "./dist/index.client.d.ts"
19
- },
20
- "./server": {
21
- "import": "./dist/server-renderer.js",
22
- "require": "./dist/server-renderer.cjs",
23
- "types": "./dist/server-renderer.d.ts"
14
+ "default": "./dist/index.js"
24
15
  },
25
16
  "./jsx-runtime": {
17
+ "types": "./dist/jsx-runtime.d.ts",
26
18
  "import": "./dist/jsx-runtime.js",
27
- "require": "./dist/jsx-runtime.cjs",
28
- "types": "./dist/jsx-runtime.d.ts"
19
+ "default": "./dist/jsx-runtime.js"
20
+ },
21
+ "./jsx-dev-runtime": {
22
+ "types": "./dist/jsx-runtime.d.ts",
23
+ "import": "./dist/jsx-runtime.js",
24
+ "default": "./dist/jsx-runtime.js"
25
+ },
26
+ "./types": {
27
+ "types": "./dist/types.d.ts",
28
+ "default": "./dist/types.d.ts"
29
29
  }
30
30
  },
31
- "bin": {
32
- "frontend-hamroun": "./bin/cli.js"
33
- },
34
31
  "files": [
35
32
  "dist",
36
- "bin",
37
33
  "templates",
34
+ "bin",
38
35
  "README.md",
39
36
  "LICENSE"
40
37
  ],
38
+ "bin": {
39
+ "frontend-hamroun": "./bin/cli.js"
40
+ },
41
41
  "scripts": {
42
- "build": "tsc && vite build",
43
- "dev": "vite",
42
+ "build": "npm run clean && npm run build:main && npm run build:rollup",
43
+ "build:main": "tsc --project tsconfig.json",
44
+ "build:rollup": "rollup -c",
45
+ "dev": "tsc --watch",
44
46
  "test": "jest",
45
- "test:watch": "jest --watch",
46
- "test:coverage": "jest --coverage",
47
47
  "lint": "eslint src --ext .ts,.tsx",
48
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
49
- "format": "prettier --write src/**/*.{ts,tsx}",
50
- "type-check": "tsc --noEmit",
51
- "prepublishOnly": "npm run build",
52
- "clean": "rimraf dist"
48
+ "prepare": "npm run build",
49
+ "clean": "rimraf dist",
50
+ "prepublishOnly": "npm run build"
53
51
  },
54
52
  "keywords": [
55
- "javascript",
56
53
  "frontend",
57
54
  "framework",
58
- "ssr",
59
- "reactive",
55
+ "react",
56
+ "jsx",
57
+ "hooks",
58
+ "spa",
59
+ "client-side",
60
60
  "lightweight"
61
61
  ],
62
- "author": "Hamroun",
62
+ "author": "Frontend Hamroun Team",
63
63
  "license": "MIT",
64
64
  "repository": {
65
65
  "type": "git",
@@ -69,59 +69,30 @@
69
69
  "url": "https://github.com/hamroun/frontend-hamroun/issues"
70
70
  },
71
71
  "homepage": "https://github.com/hamroun/frontend-hamroun#readme",
72
- "devDependencies": {
73
- "@types/cors": "^2.8.18",
74
- "@types/express": "^5.0.2",
75
- "@types/jest": "^29.5.5",
76
- "@types/jsonwebtoken": "^9.0.9",
77
- "@types/node": "^20.6.3",
78
- "@types/pg": "^8.15.2",
79
- "@typescript-eslint/eslint-plugin": "^6.7.2",
80
- "@typescript-eslint/parser": "^6.7.2",
81
- "eslint": "^8.49.0",
82
- "eslint-config-prettier": "^9.0.0",
83
- "eslint-plugin-prettier": "^5.0.0",
84
- "jest": "^29.7.0",
85
- "prettier": "^3.0.3",
86
- "rimraf": "^5.0.1",
87
- "terser": "^5.19.4",
88
- "ts-jest": "^29.1.1",
89
- "typescript": "^5.2.2",
90
- "vite": "^5.0.0"
91
- },
92
- "dependencies": {
93
- "bcryptjs": "^3.0.2",
94
- "boxen": "^7.1.1",
95
- "chalk": "^5.3.0",
96
- "commander": "^11.0.0",
97
- "express": "^5.1.0",
98
- "figlet": "^1.6.0",
99
- "fs-extra": "^11.1.1",
100
- "gradient-string": "^2.0.2",
101
- "inquirer": "^9.2.11",
102
- "jsonwebtoken": "^9.0.2",
103
- "mongodb": "^6.16.0",
104
- "mysql2": "^3.14.1",
105
- "nanospinner": "^1.1.0",
106
- "ora": "^7.0.1",
107
- "pg": "^8.16.0",
108
- "terminal-link": "^3.0.0",
109
- "update-notifier": "^7.0.0"
110
- },
111
72
  "peerDependencies": {
112
- "react": ">=16.8.0",
113
- "react-dom": ">=16.8.0"
73
+ "typescript": "^4.0.0 || ^5.0.0"
114
74
  },
115
75
  "peerDependenciesMeta": {
116
- "react": {
117
- "optional": true
118
- },
119
- "react-dom": {
76
+ "typescript": {
120
77
  "optional": true
121
78
  }
122
79
  },
123
- "engines": {
124
- "node": ">=18.0.0",
125
- "npm": ">=8.0.0"
80
+ "devDependencies": {
81
+ "@types/node": "^20.0.0",
82
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
83
+ "@typescript-eslint/parser": "^6.0.0",
84
+ "eslint": "^8.0.0",
85
+ "jest": "^29.0.0",
86
+ "rimraf": "^5.0.0",
87
+ "rollup": "^3.0.0",
88
+ "rollup-plugin-typescript2": "^0.36.0",
89
+ "typescript": "^5.0.0"
90
+ },
91
+ "dependencies": {
92
+ "commander": "^11.0.0",
93
+ "inquirer": "^9.0.0",
94
+ "chalk": "^5.0.0",
95
+ "boxen": "^7.0.0",
96
+ "nanospinner": "^1.1.0"
126
97
  }
127
- }
98
+ }
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./server-renderer-B5b0Q0ck.cjs"),r=require("./renderer-DaVfBeVi.cjs"),t=require("./jsx-runtime.cjs"),s={async getServer(){throw new Error("Server module can only be used in Node.js environment")}};exports.batchUpdates=e.batchUpdates,exports.renderToString=e.renderToString,exports.useEffect=e.useEffect,exports.useErrorBoundary=e.useErrorBoundary,exports.useMemo=e.useMemo,exports.useRef=e.useRef,exports.useState=e.useState,exports.createContext=r.createContext,exports.hydrate=r.hydrate,exports.render=r.render,exports.useContext=r.useContext,exports.Fragment=t.Fragment,exports.jsx=t.jsx,exports.jsxs=t.jsx,exports.server=s;
2
- //# sourceMappingURL=index.client.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.client.cjs","sources":["../src/index.client.ts"],"sourcesContent":["import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks.js';\r\n\r\nexport { createContext, useContext } from './context.js';\r\nexport { batchUpdates } from './batch.js';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime.js';\r\nexport { render, hydrate } from './renderer.js';\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './types.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types.js';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n"],"names":["server","getServer","Error"],"mappings":"sMA+BaA,EAAS,CACpB,eAAMC,GACE,MAAA,IAAIC,MAAM,wDAAuD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.client.js","sources":["../src/index.client.ts"],"sourcesContent":["import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks.js';\r\n\r\nexport { createContext, useContext } from './context.js';\r\nexport { batchUpdates } from './batch.js';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime.js';\r\nexport { render, hydrate } from './renderer.js';\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './types.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types.js';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n"],"names":[],"mappings":";;;AA+BO,MAAM,SAAS;AAAA,EACpB,MAAM,YAAY;AACV,UAAA,IAAI,MAAM,uDAAuD;AAAA,EAAA;AAE3E;"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("./jsx-runtime.cjs"),r=require("./server-renderer-B5b0Q0ck.cjs"),n=new Map;async function t(n,o){try{r.setRenderCallback(t,n,o);r.prepareRender(n);const s=await e.createElement(n);if(o instanceof Element)o.innerHTML="";else for(;o.firstChild;)o.removeChild(o.firstChild);o.appendChild(s),r.finishRender(),console.log("Render completed successfully")}catch(s){throw console.error("Error during render:",s),r.finishRender(),s}}exports.createContext=function(e){const r=Symbol("context");return{Provider:({value:e,children:t})=>(n.set(r,e),t),Consumer:({children:t})=>t(n.get(r)??e),displayName:"Context"}},exports.hydrate=async function(e,r){try{console.log("Starting hydration..."),await t(e,r),console.log("Hydration completed successfully")}catch(n){throw console.error("Error during hydration:",n),n}},exports.render=t,exports.useContext=function(e){return{}};
2
- //# sourceMappingURL=renderer-DaVfBeVi.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer-DaVfBeVi.cjs","sources":["../src/context.ts","../src/renderer.ts"],"sourcesContent":["import type { Context, ComponentType } from './types.js';\r\n\r\nconst contexts = new Map<symbol, any>();\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const contextId = Symbol('context');\r\n \r\n const Provider: ComponentType<{ value: T; children?: any }> = ({ value, children }) => {\r\n contexts.set(contextId, value);\r\n return children;\r\n };\r\n \r\n const Consumer: ComponentType<{ children: (value: T) => any }> = ({ children }) => {\r\n const value = contexts.get(contextId) ?? defaultValue;\r\n return children(value);\r\n };\r\n\r\n const context: Context<T> = {\r\n Provider,\r\n Consumer,\r\n displayName: 'Context'\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: Context<T>): T {\r\n // In a real implementation, this would access the context value from the component tree\r\n // For now, returning a default value to satisfy TypeScript\r\n return {} as T;\r\n}\r\n\r\n// Export the Context type for external use\r\nexport type { Context } from './types.js';\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport type { ReactElement } from './types.js';\r\n\r\n// Render function for client-side rendering\r\nexport async function render(element: ReactElement, container: Element | DocumentFragment): Promise<void> {\r\n try {\r\n // Set up render callback for state updates\r\n setRenderCallback(render, element, container);\r\n \r\n // Prepare render context\r\n const renderId = prepareRender(element);\r\n \r\n // Create DOM nodes from virtual elements\r\n const domNode = await createElement(element);\r\n \r\n // Clear container and append new content\r\n // Handle both Element and DocumentFragment cases\r\n if (container instanceof Element) {\r\n container.innerHTML = '';\r\n } else {\r\n // For DocumentFragment, clear all children\r\n while (container.firstChild) {\r\n container.removeChild(container.firstChild);\r\n }\r\n }\r\n container.appendChild(domNode);\r\n \r\n // Finish render\r\n finishRender();\r\n \r\n console.log('Render completed successfully');\r\n } catch (error) {\r\n console.error('Error during render:', error);\r\n // Clean up render context on error\r\n finishRender();\r\n throw error;\r\n }\r\n}\r\n\r\n// Hydrate function for client-side hydration of SSR content\r\nexport async function hydrate(element: ReactElement, container: Element): Promise<void> {\r\n try {\r\n console.log('Starting hydration...');\r\n \r\n // For now, hydrate works the same as render\r\n // In a more advanced implementation, this would preserve existing DOM\r\n // and only attach event listeners and initialize state\r\n await render(element, container);\r\n \r\n console.log('Hydration completed successfully');\r\n } catch (error) {\r\n console.error('Error during hydration:', error);\r\n throw error;\r\n }\r\n}\r\n"],"names":["contexts","Map","async","render","element","container","prepareRender","domNode","createElement","Element","innerHTML","firstChild","removeChild","appendChild","finishRender","console","log","error","defaultValue","contextId","Symbol","Provider","value","children","set","Consumer","get","displayName","context"],"mappings":"8FAEMA,MAAeC,ICGCC,eAAAC,EAAOC,EAAuBC,GAC9C,wBAEgBF,EAAQC,EAASC,GAGlBC,gBAAcF,GAAzB,MAGAG,QAAgBC,EAAAA,cAAcJ,GAIpC,GAAIC,aAAqBI,QACvBJ,EAAUK,UAAY,QAGtB,KAAOL,EAAUM,YACLN,EAAAO,YAAYP,EAAUM,YAGpCN,EAAUQ,YAAYN,GAGTO,iBAEbC,QAAQC,IAAI,uCACLC,GAID,MAHEF,QAAAE,MAAM,uBAAwBA,GAEzBH,iBACPG,CAAA,CAEV,uBDlCO,SAA0BC,GACzB,MAAAC,EAAYC,OAAO,WAkBlB,MANqB,CAC1BC,SAX4D,EAAGC,QAAOC,eAC7DvB,EAAAwB,IAAIL,EAAWG,GACjBC,GAUPE,SAP+D,EAAGF,cAE3DA,EADOvB,EAAS0B,IAAIP,IAAcD,GAOzCS,YAAa,UAIjB,kBCiBsBzB,eAAQE,EAAuBC,GAC/C,IACFU,QAAQC,IAAI,+BAKNb,EAAOC,EAASC,GAEtBU,QAAQC,IAAI,0CACLC,GAED,MADEF,QAAAE,MAAM,0BAA2BA,GACnCA,CAAA,CAEV,sCD7BO,SAAuBW,GAG5B,MAAO,CAAC,CACV"}
@@ -1,61 +0,0 @@
1
- import { createElement } from "./jsx-runtime.js";
2
- import { s as setRenderCallback, p as prepareRender, f as finishRender } from "./server-renderer-C4MB-jAp.js";
3
- const contexts = /* @__PURE__ */ new Map();
4
- function createContext(defaultValue) {
5
- const contextId = Symbol("context");
6
- const Provider = ({ value, children }) => {
7
- contexts.set(contextId, value);
8
- return children;
9
- };
10
- const Consumer = ({ children }) => {
11
- const value = contexts.get(contextId) ?? defaultValue;
12
- return children(value);
13
- };
14
- const context = {
15
- Provider,
16
- Consumer,
17
- displayName: "Context"
18
- };
19
- return context;
20
- }
21
- function useContext(context) {
22
- return {};
23
- }
24
- async function render(element, container) {
25
- try {
26
- setRenderCallback(render, element, container);
27
- const renderId = prepareRender(element);
28
- const domNode = await createElement(element);
29
- if (container instanceof Element) {
30
- container.innerHTML = "";
31
- } else {
32
- while (container.firstChild) {
33
- container.removeChild(container.firstChild);
34
- }
35
- }
36
- container.appendChild(domNode);
37
- finishRender();
38
- console.log("Render completed successfully");
39
- } catch (error) {
40
- console.error("Error during render:", error);
41
- finishRender();
42
- throw error;
43
- }
44
- }
45
- async function hydrate(element, container) {
46
- try {
47
- console.log("Starting hydration...");
48
- await render(element, container);
49
- console.log("Hydration completed successfully");
50
- } catch (error) {
51
- console.error("Error during hydration:", error);
52
- throw error;
53
- }
54
- }
55
- export {
56
- createContext as c,
57
- hydrate as h,
58
- render as r,
59
- useContext as u
60
- };
61
- //# sourceMappingURL=renderer-nfT7XSpo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer-nfT7XSpo.js","sources":["../src/context.ts","../src/renderer.ts"],"sourcesContent":["import type { Context, ComponentType } from './types.js';\r\n\r\nconst contexts = new Map<symbol, any>();\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const contextId = Symbol('context');\r\n \r\n const Provider: ComponentType<{ value: T; children?: any }> = ({ value, children }) => {\r\n contexts.set(contextId, value);\r\n return children;\r\n };\r\n \r\n const Consumer: ComponentType<{ children: (value: T) => any }> = ({ children }) => {\r\n const value = contexts.get(contextId) ?? defaultValue;\r\n return children(value);\r\n };\r\n\r\n const context: Context<T> = {\r\n Provider,\r\n Consumer,\r\n displayName: 'Context'\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: Context<T>): T {\r\n // In a real implementation, this would access the context value from the component tree\r\n // For now, returning a default value to satisfy TypeScript\r\n return {} as T;\r\n}\r\n\r\n// Export the Context type for external use\r\nexport type { Context } from './types.js';\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport type { ReactElement } from './types.js';\r\n\r\n// Render function for client-side rendering\r\nexport async function render(element: ReactElement, container: Element | DocumentFragment): Promise<void> {\r\n try {\r\n // Set up render callback for state updates\r\n setRenderCallback(render, element, container);\r\n \r\n // Prepare render context\r\n const renderId = prepareRender(element);\r\n \r\n // Create DOM nodes from virtual elements\r\n const domNode = await createElement(element);\r\n \r\n // Clear container and append new content\r\n // Handle both Element and DocumentFragment cases\r\n if (container instanceof Element) {\r\n container.innerHTML = '';\r\n } else {\r\n // For DocumentFragment, clear all children\r\n while (container.firstChild) {\r\n container.removeChild(container.firstChild);\r\n }\r\n }\r\n container.appendChild(domNode);\r\n \r\n // Finish render\r\n finishRender();\r\n \r\n console.log('Render completed successfully');\r\n } catch (error) {\r\n console.error('Error during render:', error);\r\n // Clean up render context on error\r\n finishRender();\r\n throw error;\r\n }\r\n}\r\n\r\n// Hydrate function for client-side hydration of SSR content\r\nexport async function hydrate(element: ReactElement, container: Element): Promise<void> {\r\n try {\r\n console.log('Starting hydration...');\r\n \r\n // For now, hydrate works the same as render\r\n // In a more advanced implementation, this would preserve existing DOM\r\n // and only attach event listeners and initialize state\r\n await render(element, container);\r\n \r\n console.log('Hydration completed successfully');\r\n } catch (error) {\r\n console.error('Error during hydration:', error);\r\n throw error;\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAEA,MAAM,+BAAe,IAAiB;AAE/B,SAAS,cAAiB,cAA6B;AACtD,QAAA,YAAY,OAAO,SAAS;AAElC,QAAM,WAAwD,CAAC,EAAE,OAAO,eAAe;AAC5E,aAAA,IAAI,WAAW,KAAK;AACtB,WAAA;AAAA,EACT;AAEA,QAAM,WAA2D,CAAC,EAAE,eAAe;AACjF,UAAM,QAAQ,SAAS,IAAI,SAAS,KAAK;AACzC,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,QAAM,UAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf;AAEO,SAAA;AACT;AAEO,SAAS,WAAc,SAAwB;AAGpD,SAAO,CAAC;AACV;ACzBsB,eAAA,OAAO,SAAuB,WAAsD;AACpG,MAAA;AAEgB,sBAAA,QAAQ,SAAS,SAAS;AAGtC,UAAA,WAAW,cAAc,OAAO;AAGhC,UAAA,UAAU,MAAM,cAAc,OAAO;AAI3C,QAAI,qBAAqB,SAAS;AAChC,gBAAU,YAAY;AAAA,IAAA,OACjB;AAEL,aAAO,UAAU,YAAY;AACjB,kBAAA,YAAY,UAAU,UAAU;AAAA,MAAA;AAAA,IAC5C;AAEF,cAAU,YAAY,OAAO;AAGhB,iBAAA;AAEb,YAAQ,IAAI,+BAA+B;AAAA,WACpC,OAAO;AACN,YAAA,MAAM,wBAAwB,KAAK;AAE9B,iBAAA;AACP,UAAA;AAAA,EAAA;AAEV;AAGsB,eAAA,QAAQ,SAAuB,WAAmC;AAClF,MAAA;AACF,YAAQ,IAAI,uBAAuB;AAK7B,UAAA,OAAO,SAAS,SAAS;AAE/B,YAAQ,IAAI,kCAAkC;AAAA,WACvC,OAAO;AACN,YAAA,MAAM,2BAA2B,KAAK;AACxC,UAAA;AAAA,EAAA;AAEV;"}
@@ -1,2 +0,0 @@
1
- "use strict";let e=!1;const t=[];function n(n){if(e)t.push(n);else{e=!0;try{for(n();t.length>0;){const e=t.shift();e?.()}}finally{e=!1}}}let r=0;const s=new Map,o=new Map,c=new Map,i=new Map,u=new Map;let a=null,l=null,f=null;function p(e=null){return r++,o.set(r,0),r}function h(){r=0}function y(t){if(!r)throw new Error("useState must be called within a render");s.has(r)||s.set(r,[]);const c=s.get(r),i=o.get(r)||0;i>=c.length&&c.push(t);const u=c[i];return o.set(r,i+1),[u,t=>{const s="function"==typeof t?t(c[i]):t;c[i]!==s&&(c[i]=s,e?n((()=>g(r))):g(r))}]}async function g(e){try{const t=c.get(e);t&&(t.forEach((e=>{e.cleanup&&e.cleanup()})),c.set(e,[])),a&&l&&f&&await a(f,l)}catch(t){console.error("Error during rerender:",t)}}async function w(e){if(null==e||"boolean"==typeof e)return"";if("string"==typeof e||"number"==typeof e)return d(String(e));if(Array.isArray(e)){return(await Promise.all(e.map((e=>w(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 w(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="${d(Object.entries(t).map((([e,t])=>{return`${n=e,n.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))}:${t}`;var n})).join(";"))}"`}return`${e}="${d(String(t))}"`})).join(" "),c=`<${e}${o?" "+o:""}>`;if(s.has(e))return c.slice(0,-1)+"/>";const i=`</${e}>`;if(null!=n){return c+await w(n)+i}return c+i}(n,r)}return d("object"==typeof e?JSON.stringify(e):String(e))}function d(e){const t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"};return e.replace(/[&<>"'/]/g,(e=>t[e]))}exports.batchUpdates=n,exports.finishRender=h,exports.prepareRender=p,exports.renderToString=async function(e){p(!0);try{return await w(e)}finally{h()}},exports.setRenderCallback=function(e,t,n){a=e,l=n,f=t},exports.useEffect=function(e,t){if(!r)throw new Error("useEffect must be called within a render");const n=o.get(r)||0;c.has(r)||c.set(r,[]);const s=c.get(r),i=s[n];i&&t&&i.deps&&!t.some(((e,t)=>e!==i.deps[t]))||(i?.cleanup&&i.cleanup(),queueMicrotask((()=>{const r=e()||void 0;s[n]={cleanup:r,deps:t||[]}}))),o.set(r,n+1)},exports.useErrorBoundary=function(){const[e,t]=y(null);return[e,()=>t(null)]},exports.useMemo=function(e,t){if(!r)throw new Error("useMemo must be called within a render");const n=o.get(r)||0;i.has(r)||i.set(r,[]);const s=i.get(r),c=s[n];if(!c||t&&t.some(((e,t)=>!Object.is(e,c.deps[t])))){const c=e();return s[n]={value:c,deps:t||[]},o.set(r,n+1),c}return o.set(r,n+1),c.value},exports.useRef=function(e){if(!r)throw new Error("useRef must be called within a render");const t=o.get(r)||0;u.has(r)||u.set(r,[]);const n=u.get(r);if(t>=n.length){const s={current:e};return n.push(s),o.set(r,t+1),s}const s=n[t];return o.set(r,t+1),s},exports.useState=y;
2
- //# sourceMappingURL=server-renderer-B5b0Q0ck.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-renderer-B5b0Q0ck.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 { batchUpdates, isBatching } from './batch.js';\r\n\r\n// Current render ID counter\r\nlet currentRender = 0;\r\nlet renderContext: any = null;\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// 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(component: any = null): number {\r\n currentRender++;\r\n renderContext = component;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\r\n renderContext = null;\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 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 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(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Re-export from context\r\nexport { createContext, useContext } from './context.js';\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 '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#x27;',\r\n '/': '&#x2F;'\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","states","Map","stateIndices","effects","memos","refs","globalRenderCallback","globalContainer","currentElement","prepareRender","component","set","finishRender","useState","initial","Error","has","componentStates","get","index","state","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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"}