frontend-hamroun 1.2.80 → 1.2.83
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.client.cjs +1 -1
- package/dist/index.client.js +2 -2
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/{renderer-Din1y3YM.cjs → renderer-BL3gq8cW.cjs} +2 -2
- package/dist/{renderer-Din1y3YM.cjs.map → renderer-BL3gq8cW.cjs.map} +1 -1
- package/dist/{renderer-Bo9zkUZ_.js → renderer-Dyy-o05F.js} +2 -2
- package/dist/{renderer-Bo9zkUZ_.js.map → renderer-Dyy-o05F.js.map} +1 -1
- package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C1WXH-zV.js} +99 -73
- package/dist/server-renderer-C1WXH-zV.js.map +1 -0
- package/dist/server-renderer-Chs-nmJm.cjs +2 -0
- package/dist/server-renderer-Chs-nmJm.cjs.map +1 -0
- package/dist/server-renderer.cjs +1 -1
- package/dist/server-renderer.js +1 -1
- package/package.json +1 -1
- package/templates/basic-app/src/App.jsx +16 -0
- package/templates/basic-app/src/client.jsx +5 -0
- package/templates/basic-app/src/components/Counter.jsx +13 -0
- package/templates/basic-app/src/jsx-shim.js +3 -0
- package/templates/basic-app/src/jsx-shim.ts +7 -0
- package/templates/basic-app/src/main.jsx +98 -0
- package/templates/basic-app/src/server.js +47 -0
- package/templates/complete-app/api/hello.js +0 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +18 -0
- package/templates/complete-app/pages/about.js +119 -0
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.js +157 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.js +290 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +89 -0
- package/templates/complete-app/public/index.html +118 -0
- package/templates/complete-app/public/styles.css +76 -0
- package/templates/complete-app/server.js +226 -0
- package/templates/complete-app/src/App.tsx +59 -0
- package/templates/complete-app/src/client.tsx +18 -0
- package/templates/complete-app/src/server.ts +218 -0
- package/templates/complete-app/tsconfig.json +22 -0
- package/templates/complete-app/tsconfig.server.json +19 -0
- package/templates/{ssr-template → complete-app}/vite.config.js +16 -5
- package/templates/complete-app/vite.config.ts +30 -0
- package/templates/complete-app/wasm/build.bat +0 -0
- package/templates/complete-app/wasm/build.sh +0 -0
- package/templates/complete-app/wasm/example.go +0 -0
- package/templates/fullstack-app/build/main.css +874 -874
- package/templates/fullstack-app/build/main.css.map +7 -7
- package/templates/fullstack-app/build/main.js +996 -967
- package/templates/fullstack-app/build/main.js.map +7 -7
- package/templates/fullstack-app/package-lock.json +6301 -0
- package/templates/fullstack-app/public/styles.css +768 -768
- package/templates/go/example.go +154 -99
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
- package/templates/ssr-template/dist/client/index.html +23 -0
- package/templates/ssr-template/dist/client.js +951 -0
- package/templates/ssr-template/dist/server.js +739 -0
- package/templates/ssr-template/esbuild.config.js +33 -0
- package/templates/ssr-template/jsx-shim.js +1 -0
- package/templates/ssr-template/package.json +14 -8
- package/templates/ssr-template/src/App.tsx +847 -49
- package/templates/ssr-template/src/client.tsx +3 -17
- package/templates/ssr-template/src/server.ts +21 -204
- package/templates/ssr-template/tsconfig.json +9 -8
- package/templates/ssr-template/tsconfig.server.json +6 -14
- package/templates/ssr-template/vite.config.ts +19 -17
- package/templates/wasm/build-wasm.js +228 -0
- package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
- package/templates/wasm/dist/example.wasm +0 -0
- package/templates/wasm/dist/index.html +53 -0
- package/templates/{go-wasm-app/public/wasm → wasm/dist}/wasm_exec.js +572 -561
- package/templates/wasm/esbuild.config.js +63 -0
- package/templates/wasm/go/main.go +256 -0
- package/templates/wasm/go/wasm_exec.js +0 -0
- package/templates/wasm/index.html +97 -0
- package/templates/wasm/jsx-shim.js +9 -0
- package/templates/wasm/package-lock.json +4577 -0
- package/templates/wasm/package.json +25 -0
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/public/wasm_exec.js +572 -0
- package/templates/wasm/src/App.tsx +550 -0
- package/templates/wasm/src/client.tsx +220 -0
- package/templates/wasm/src/index.tsx +21 -0
- package/templates/wasm/src/server.ts +145 -0
- package/templates/wasm/tsconfig.json +21 -0
- package/templates/wasm/tsconfig.node.json +13 -0
- package/templates/wasm/tsconfig.server.json +23 -0
- package/templates/wasm/vite.config.ts +38 -0
- package/templates/wasm/wasm-loader.js +103 -0
- package/dist/server-renderer-CqIpQ-od.cjs +0 -2
- package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
- package/dist/server-renderer-QHt45Ip2.js.map +0 -1
- package/templates/basic-app/bun.lock +0 -196
- package/templates/basic-app/docs/rapport_pfe.aux +0 -27
- package/templates/basic-app/docs/rapport_pfe.out +0 -10
- package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
- package/templates/basic-app/docs/rapport_pfe.tex +0 -68
- package/templates/basic-app/docs/rapport_pfe.toc +0 -14
- package/templates/basic-app/package-lock.json +0 -4185
- package/templates/go-wasm-app/README.md +0 -38
- package/templates/go-wasm-app/babel.config.js +0 -15
- package/templates/go-wasm-app/build-client.js +0 -49
- package/templates/go-wasm-app/build-wasm.js +0 -237
- package/templates/go-wasm-app/package.json +0 -23
- package/templates/go-wasm-app/public/index.html +0 -128
- package/templates/go-wasm-app/public/styles.css +0 -197
- package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
- package/templates/go-wasm-app/server.js +0 -521
- package/templates/go-wasm-app/src/App.jsx +0 -38
- package/templates/go-wasm-app/src/app.js +0 -153
- package/templates/go-wasm-app/src/client.js +0 -57
- package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
- package/templates/go-wasm-app/src/components/Header.jsx +0 -19
- package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
- package/templates/go-wasm-app/src/main.jsx +0 -12
- package/templates/go-wasm-app/src/wasm/example.go +0 -75
- package/templates/go-wasm-app/tsconfig.server.json +0 -18
- package/templates/go-wasm-app/vite.config.js +0 -34
- package/templates/ssr-template/package-lock.json +0 -2478
- package/templates/ssr-template/public/index.html +0 -47
- package/templates/ssr-template/server.js +0 -369
- /package/templates/{ssr-template → complete-app}/client.js +0 -0
- /package/templates/{ssr-template → complete-app}/readme.md +0 -0
- /package/templates/{ssr-template → complete-app}/server.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/client.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/pages/index.tsx +0 -0
package/dist/index.cjs
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./jsx-runtime.cjs"),t=require("./renderer-
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./jsx-runtime.cjs"),t=require("./server-renderer-Chs-nmJm.cjs"),n=require("./renderer-BL3gq8cW.cjs"),o="/wasm_exec.js";async function r(e,t={}){const{importObject:n={},goWasmPath:r=o,loadGo:s=!0,onLoad:i,debug:a=!1}=t;"undefined"!=typeof window&&s&&await async function(e=o){if("undefined"==typeof window)return;if(void 0!==window.Go)return;return new Promise(((t,n)=>{const o=document.createElement("script");o.src=e,o.onload=()=>t(),o.onerror=()=>n(new Error(`Failed to load Go WASM runtime from ${e}`)),document.head.appendChild(o)}))}(r);try{const t="undefined"!=typeof Go?new Go:null;a&&console.log(`[WASM] Loading module from ${e}`);const o=await fetch(e);if(!o.ok)throw new Error(`Failed to fetch WASM module: ${o.statusText}`);const r=await o.arrayBuffer(),s=await WebAssembly.compile(r),c=t?{...t.importObject,...n}:n,d=await WebAssembly.instantiate(s,c);t&&t.run(d);const u=d.exports,l={};for(const e in u)if("function"==typeof u[e]){const t=u[e];if(l[e]=(...e)=>t(...e),a){const t=l[e];l[e]=(...n)=>{console.log(`[WASM] Calling ${e}(${n.join(", ")})`);const o=t(...n);return console.log(`[WASM] ${e} returned:`,o),o}}}if("undefined"!=typeof window)for(const e in window)if(e.startsWith("go")&&"function"==typeof window[e]){const t=window[e];if(l[e]=(...e)=>t(...e),a){const t=l[e];l[e]=(...n)=>{console.log(`[WASM] Calling global ${e}(${n.join(", ")})`);const o=t(...n);return console.log(`[WASM] ${e} returned:`,o),o}}}const p={instance:d,module:s,exports:u,functions:l};return i&&i(p),p}catch(c){throw console.error("[WASM] Failed to load Go WASM module:",c),c}}function s(e,t){if(!e.functions[t])throw new Error(`WASM function "${t}" not found`);return e.functions[t]}const i={stringToGo:(e,t)=>{if(!e.functions.__stringToGo)throw new Error("__stringToGo function not found in WASM module");return e.functions.__stringToGo(t)},stringFromGo:(e,t)=>{if(!e.functions.__stringFromGo)throw new Error("__stringFromGo function not found in WASM module");return e.functions.__stringFromGo(t)},objectToGo:(e,t)=>{if(!e.functions.__objectToGo)throw new Error("__objectToGo function not found in WASM module");return e.functions.__objectToGo(JSON.stringify(t))},objectFromGo:(e,t)=>{if(!e.functions.__objectFromGo)throw new Error("__objectFromGo function not found in WASM module");const n=e.functions.__objectFromGo(t);return JSON.parse(n)}};function a(e,t){const n=Object.keys(e).filter((e=>"children"!==e)),o=Object.keys(t).filter((e=>"children"!==e));return n.length===o.length&&n.every((n=>e[n]===t[n]))}function c(e,t){return null==e||null==t?e!==t:typeof e!=typeof t||("string"==typeof t||"number"==typeof t?e!==t:t.type!==e.type||!a(e.props,t.props))}function d(e,t){return!a(e,t)}class u{constructor(e={}){this.state={},this.element=null,this._mounted=!1,this.props=e}componentDidMount(){}async setState(e){const t={...this.state};this.state={...t,...e},console.log(`${this.constructor.name} state updated:`,{prev:t,next:this.state}),await Promise.resolve(),this._mounted,await this.update()}_replayEvents(e,t){const n=e.__events||{};Object.entries(n).forEach((([e,n])=>{t.addEventListener(e,n)})),t.__events=n}_deepCloneWithEvents(e){const t=e.cloneNode(!1),n=e.__events||{};return t.__events=n,Object.entries(n).forEach((([e,n])=>{t.addEventListener(e,n)})),Array.from(e.childNodes).forEach((e=>{e instanceof HTMLElement?t.appendChild(this._deepCloneWithEvents(e)):t.appendChild(e.cloneNode(!0))})),t}async update(){const t=this.render();if(!t)return document.createTextNode("");const n=await e.createElement(t);if(n instanceof HTMLElement)return this._updateElement(n);const o=document.createElement("div");return o.appendChild(n),this._updateElement(o)}async _updateElement(e){const t=this._deepCloneWithEvents(e);return t.__instance=this,this.element?this.element.parentNode&&(this.element.parentNode.replaceChild(t,this.element),this.element=t):(this.element=t,this._mounted||(this._mounted=!0,queueMicrotask((()=>this.componentDidMount())))),this.element}render(){throw new Error("Component must implement render() method")}}const l={async getServer(){throw new Error("Server module can only be used in Node.js environment")}},p=r,f=s,m=i,h={loadGoWasm:r,createTypedWasmFunction:s,goValues:i};const x={Fragment:e.Fragment,jsx:e.jsx,jsxs:e.jsx,createElement:e.createElement,render:n.render,hydrate:n.hydrate,useState:t.useState,useEffect:t.useEffect,useMemo:t.useMemo,useRef:t.useRef,useContext:n.useContext,useErrorBoundary:t.useErrorBoundary,createContext:n.createContext,renderToString:t.renderToString,batchUpdates:t.batchUpdates,server:l,loadGoWasm:p,createTypedWasmFunction:f,goValues:m,wasm:h,Component:u,diff:c,shouldComponentUpdate:d,prepareRender:t.prepareRender,finishRender:t.finishRender,setRenderCallback:t.setRenderCallback};exports.Fragment=e.Fragment,exports.createElement=e.createElement,exports.jsx=e.jsx,exports.jsxDEV=e.jsx,exports.jsxs=e.jsx,exports.batchUpdates=t.batchUpdates,exports.finishRender=t.finishRender,exports.getIsBatching=t.getIsBatching,Object.defineProperty(exports,"isBatching",{enumerable:!0,get:()=>t.isBatching}),exports.prepareRender=t.prepareRender,exports.renderToString=t.renderToString,exports.setRenderCallback=t.setRenderCallback,exports.useEffect=t.useEffect,exports.useErrorBoundary=t.useErrorBoundary,exports.useMemo=t.useMemo,exports.useRef=t.useRef,exports.useState=t.useState,exports.createContext=n.createContext,exports.hydrate=n.hydrate,exports.render=n.render,exports.useContext=n.useContext,exports.Component=u,exports.createTypedWasmFunction=f,exports.default=x,exports.diff=c,exports.goValues=m,exports.isHydrating=!1,exports.loadGoWasm=p,exports.server=l,exports.shouldComponentUpdate=d,exports.wasm=h;
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/wasm.ts","../src/vdom.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Go WebAssembly Integration Utilities\r\n * \r\n * This module provides tools for loading and interacting with Go WASM modules\r\n * in browser and server environments.\r\n */\r\n\r\n// Type definitions for Go WASM integration\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: any;\r\n functions: Record<string, Function>;\r\n}\r\n\r\nexport interface GoWasmOptions {\r\n importObject?: WebAssembly.Imports;\r\n goWasmPath?: string;\r\n loadGo?: boolean;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n debug?: boolean;\r\n}\r\n\r\nconst DEFAULT_GO_WASM_PATH = '/wasm_exec.js';\r\n\r\n/**\r\n * Load a Go WASM module from a URL\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string, \r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n const {\r\n importObject = {},\r\n goWasmPath = DEFAULT_GO_WASM_PATH,\r\n loadGo = true,\r\n onLoad,\r\n debug = false\r\n } = options;\r\n\r\n // In browser environment, load the Go WASM runtime\r\n if (typeof window !== 'undefined' && loadGo) {\r\n await loadGoRuntime(goWasmPath);\r\n }\r\n\r\n try {\r\n // Create Go instance for WASM\r\n // @ts-ignore - Go is loaded from the global scope\r\n const go = typeof Go !== 'undefined' ? new Go() : null;\r\n \r\n // Fetch and instantiate the WASM module\r\n if (debug) console.log(`[WASM] Loading module from ${wasmUrl}`);\r\n \r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM module: ${response.statusText}`);\r\n }\r\n \r\n const buffer = await response.arrayBuffer();\r\n const module = await WebAssembly.compile(buffer);\r\n \r\n // Create imports object, combining Go runtime with custom imports\r\n const finalImportObject = go ? {\r\n ...go.importObject,\r\n ...importObject\r\n } : importObject;\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(module, finalImportObject);\r\n \r\n // Initialize Go runtime if available\r\n if (go) {\r\n go.run(instance);\r\n }\r\n \r\n // Extract exported functions\r\n const exports = instance.exports;\r\n const functions: Record<string, Function> = {};\r\n \r\n // Generate wrapper functions for all exports that are functions\r\n for (const key in exports) {\r\n if (typeof exports[key] === 'function') {\r\n // Type assertion to ensure the exports[key] is callable\r\n const exportedFn = exports[key] as unknown as Function;\r\n functions[key] = (...args: any[]) => exportedFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Add any globally exported functions from Go\r\n if (typeof window !== 'undefined') {\r\n for (const key in window) {\r\n if (key.startsWith('go') && typeof (window as any)[key] === 'function') {\r\n // Type assertion to ensure the window[key] is callable\r\n const globalFn = (window as any)[key] as Function;\r\n functions[key] = (...args: any[]) => globalFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling global ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module,\r\n exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (onLoad) {\r\n onLoad(wasmInstance);\r\n }\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load the Go WASM runtime script\r\n */\r\nasync function loadGoRuntime(path: string = DEFAULT_GO_WASM_PATH): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n \r\n // Check if Go runtime is already loaded\r\n if (typeof (window as any).Go !== 'undefined') {\r\n return;\r\n }\r\n \r\n // Load the Go WASM runtime script\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = path;\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error(`Failed to load Go WASM runtime from ${path}`));\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * Create a TypeScript-friendly wrapper for Go WASM functions\r\n */\r\nexport function createTypedWasmFunction<T extends (...args: any[]) => any>(\r\n instance: GoWasmInstance,\r\n functionName: string\r\n): T {\r\n if (!instance.functions[functionName]) {\r\n throw new Error(`WASM function \"${functionName}\" not found`);\r\n }\r\n \r\n return instance.functions[functionName] as T;\r\n}\r\n\r\n/**\r\n * Helper to convert JavaScript values to Go-compatible formats\r\n */\r\nexport const goValues = {\r\n // Convert JS string to Go string (returns memory pointer)\r\n stringToGo: (instance: GoWasmInstance, str: string): number => {\r\n if (!instance.functions.__stringToGo) {\r\n throw new Error('__stringToGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringToGo(str);\r\n },\r\n \r\n // Convert Go string (memory pointer) to JS string\r\n stringFromGo: (instance: GoWasmInstance, ptr: number): string => {\r\n if (!instance.functions.__stringFromGo) {\r\n throw new Error('__stringFromGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringFromGo(ptr);\r\n },\r\n \r\n // Convert JS object to Go (returns memory pointer)\r\n objectToGo: (instance: GoWasmInstance, obj: any): number => {\r\n if (!instance.functions.__objectToGo) {\r\n throw new Error('__objectToGo function not found in WASM module');\r\n }\r\n return instance.functions.__objectToGo(JSON.stringify(obj));\r\n },\r\n \r\n // Convert Go object (memory pointer) to JS object\r\n objectFromGo: (instance: GoWasmInstance, ptr: number): any => {\r\n if (!instance.functions.__objectFromGo) {\r\n throw new Error('__objectFromGo function not found in WASM module');\r\n }\r\n const str = instance.functions.__objectFromGo(ptr);\r\n return JSON.parse(str);\r\n }\r\n};\r\n","interface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n key?: string | number;\r\n}\r\n\r\nfunction arePropsEqual(oldProps: any, newProps: any): boolean {\r\n const oldKeys = Object.keys(oldProps).filter(k => k !== 'children');\r\n const newKeys = Object.keys(newProps).filter(k => k !== 'children');\r\n \r\n if (oldKeys.length !== newKeys.length) return false;\r\n return oldKeys.every(key => oldProps[key] === newProps[key]);\r\n}\r\n\r\nexport function diff(oldNode: VNode | any, newNode: VNode | any): boolean {\r\n if (oldNode == null || newNode == null) return oldNode !== newNode;\r\n if (typeof oldNode !== typeof newNode) return true;\r\n if (typeof newNode === 'string' || typeof newNode === 'number')\r\n return oldNode !== newNode;\r\n if (newNode.type !== oldNode.type) return true;\r\n return !arePropsEqual(oldNode.props, newNode.props);\r\n}\r\n\r\nexport function shouldComponentUpdate(oldProps: any, newProps: any): boolean {\r\n return !arePropsEqual(oldProps, newProps);\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\n\r\nexport class Component {\r\n state: any = {};\r\n props: any;\r\n element: HTMLElement | null = null;\r\n private _mounted: boolean = false;\r\n\r\n constructor(props: any = {}) {\r\n this.props = props;\r\n }\r\n\r\n componentDidMount() {\r\n // Hook for after component is mounted\r\n }\r\n\r\n async setState(newState: any) {\r\n const prevState = { ...this.state };\r\n this.state = { ...prevState, ...newState };\r\n console.log(`${this.constructor.name} state updated:`, {\r\n prev: prevState,\r\n next: this.state\r\n });\r\n \r\n await Promise.resolve(); // Ensure state is updated before re-render\r\n if (this._mounted) {\r\n await this.update();\r\n } else {\r\n await this.update();\r\n }\r\n }\r\n\r\n private _replayEvents(oldElement: HTMLElement, newElement: HTMLElement) {\r\n const oldEvents = (oldElement as any).__events || {};\r\n Object.entries(oldEvents).forEach(([event, handler]) => {\r\n newElement.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n (newElement as any).__events = oldEvents;\r\n }\r\n\r\n private _deepCloneWithEvents(node: HTMLElement): HTMLElement {\r\n const clone = node.cloneNode(false) as HTMLElement;\r\n \r\n // Copy events from original element\r\n const events = (node as any).__events || {};\r\n (clone as any).__events = events;\r\n Object.entries(events).forEach(([event, handler]) => {\r\n clone.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n\r\n // Clone children\r\n Array.from(node.childNodes).forEach(child => {\r\n if (child instanceof HTMLElement) {\r\n clone.appendChild(this._deepCloneWithEvents(child));\r\n } else {\r\n clone.appendChild(child.cloneNode(true));\r\n }\r\n });\r\n\r\n return clone;\r\n }\r\n\r\n async update() {\r\n const vdom = this.render();\r\n if (!vdom) return document.createTextNode('');\r\n \r\n const rendered = await createElement(vdom);\r\n if (rendered instanceof HTMLElement) {\r\n return this._updateElement(rendered);\r\n }\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.appendChild(rendered);\r\n return this._updateElement(wrapper);\r\n }\r\n\r\n private async _updateElement(rendered: HTMLElement) {\r\n const newElement = this._deepCloneWithEvents(rendered);\r\n (newElement as any).__instance = this;\r\n \r\n if (!this.element) {\r\n this.element = newElement;\r\n if (!this._mounted) {\r\n this._mounted = true;\r\n queueMicrotask(() => this.componentDidMount());\r\n }\r\n } else if (this.element.parentNode) {\r\n this.element.parentNode.replaceChild(newElement, this.element);\r\n this.element = newElement;\r\n }\r\n \r\n return this.element;\r\n }\r\n\r\n render(): any {\r\n throw new Error('Component must implement render() method');\r\n }\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { \r\n loadGoWasm as loadGoWasmImpl, \r\n createTypedWasmFunction as createTypedWasmFunctionImpl,\r\n goValues as goValuesImpl,\r\n type GoWasmInstance,\r\n type GoWasmOptions\r\n} from './wasm.js';\r\n\r\n// Import items needed for the default export\r\nimport { jsx, jsxs, jsxDEV, Fragment } from './jsx-runtime.js';\r\nimport { render, hydrate } from './renderer.js';\r\nimport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary\r\n} from './hooks.js';\r\nimport { createContext } from './context.js';\r\nimport { renderToString } from './server-renderer.js';\r\nimport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\nimport { diff, shouldComponentUpdate } from './vdom.js';\r\nimport { Component } from './component.js';\r\n\r\n// Re-export core modules with explicit names to ensure they appear in bundle\r\nexport { render, hydrate } from './renderer.js';\r\nexport { \r\n jsx, \r\n jsxs, \r\n jsxDEV,\r\n Fragment, \r\n createElement \r\n} from './jsx-runtime.js';\r\n\r\nexport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n} from './hooks.js';\r\n\r\n// Context API\r\nexport { createContext } from './context.js';\r\n\r\n// Server-side rendering\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Batch updates utility\r\nexport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\n\r\n// VDOM utilities\r\nexport { diff, shouldComponentUpdate } from './vdom.js';\r\n\r\n// Export Component class\r\nexport { Component } from './component.js';\r\n\r\n// Server module stub for browser environments\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\n// Export WASM functionality explicitly\r\nexport const loadGoWasm = loadGoWasmImpl;\r\nexport const createTypedWasmFunction = createTypedWasmFunctionImpl;\r\nexport const goValues = goValuesImpl;\r\nexport type { GoWasmInstance, GoWasmOptions } from './wasm.js';\r\n\r\n// Add wasm object to ensure compatibility with existing dist/index.js\r\nexport const wasm = {\r\n loadGoWasm: loadGoWasmImpl,\r\n createTypedWasmFunction: createTypedWasmFunctionImpl,\r\n goValues: goValuesImpl\r\n};\r\n\r\n// Re-export types\r\nexport type { Context } from './context.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types from the safe type-only file\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// Export this so it can be properly identified in the bundle\r\nexport let isHydrating = false;\r\nimport { AuthService } from './server/auth.js';\r\n// Default export for compatibility with some module systems\r\nexport default {\r\n Fragment: Fragment,\r\n jsx: jsx,\r\n jsxs: jsxs,\r\n createElement: createElement,\r\n render: render, \r\n hydrate: hydrate,\r\n useState: useState,\r\n useEffect: useEffect,\r\n useMemo: useMemo,\r\n useRef: useRef,\r\n useContext: useContext,\r\n useErrorBoundary: useErrorBoundary,\r\n createContext: createContext,\r\n renderToString: renderToString,\r\n batchUpdates: batchUpdates,\r\n server: server,\r\n loadGoWasm: loadGoWasm,\r\n createTypedWasmFunction: createTypedWasmFunction,\r\n goValues: goValues,\r\n wasm: wasm,\r\n Component: Component,\r\n diff: diff,\r\n shouldComponentUpdate: shouldComponentUpdate\r\n};\r\n"],"names":["DEFAULT_GO_WASM_PATH","async","loadGoWasm","wasmUrl","options","importObject","goWasmPath","loadGo","onLoad","debug","window","path","Go","Promise","resolve","reject","script","document","createElement","src","onload","onerror","Error","head","appendChild","loadGoRuntime","go","console","log","response","fetch","ok","statusText","buffer","arrayBuffer","module","WebAssembly","compile","finalImportObject","instance","instantiate","run","exports","functions","key","exportedFn","args","originalFn","join","result","startsWith","globalFn","wasmInstance","error","createTypedWasmFunction","functionName","goValues","stringToGo","str","__stringToGo","stringFromGo","ptr","__stringFromGo","objectToGo","obj","__objectToGo","JSON","stringify","objectFromGo","__objectFromGo","parse","arePropsEqual","oldProps","newProps","oldKeys","Object","keys","filter","k","newKeys","length","every","diff","oldNode","newNode","type","props","shouldComponentUpdate","Component","constructor","this","state","element","_mounted","componentDidMount","setState","newState","prevState","name","prev","next","update","_replayEvents","oldElement","newElement","oldEvents","__events","entries","forEach","event","handler","addEventListener","_deepCloneWithEvents","node","clone","cloneNode","events","Array","from","childNodes","child","HTMLElement","vdom","render","createTextNode","rendered","_updateElement","wrapper","__instance","parentNode","replaceChild","queueMicrotask","server","getServer","loadGoWasmImpl","createTypedWasmFunctionImpl","goValuesImpl","wasm","index","Fragment","jsx","jsxs","hydrate","useState","useEffect","useMemo","useRef","useContext","useErrorBoundary","createContext","renderToString","batchUpdates"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/wasm.ts","../src/vdom.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Go WebAssembly Integration Utilities\r\n * \r\n * This module provides tools for loading and interacting with Go WASM modules\r\n * in browser and server environments.\r\n */\r\n\r\n// Type definitions for Go WASM integration\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: any;\r\n functions: Record<string, Function>;\r\n}\r\n\r\nexport interface GoWasmOptions {\r\n importObject?: WebAssembly.Imports;\r\n goWasmPath?: string;\r\n loadGo?: boolean;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n debug?: boolean;\r\n}\r\n\r\nconst DEFAULT_GO_WASM_PATH = '/wasm_exec.js';\r\n\r\n/**\r\n * Load a Go WASM module from a URL\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string, \r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n const {\r\n importObject = {},\r\n goWasmPath = DEFAULT_GO_WASM_PATH,\r\n loadGo = true,\r\n onLoad,\r\n debug = false\r\n } = options;\r\n\r\n // In browser environment, load the Go WASM runtime\r\n if (typeof window !== 'undefined' && loadGo) {\r\n await loadGoRuntime(goWasmPath);\r\n }\r\n\r\n try {\r\n // Create Go instance for WASM\r\n // @ts-ignore - Go is loaded from the global scope\r\n const go = typeof Go !== 'undefined' ? new Go() : null;\r\n \r\n // Fetch and instantiate the WASM module\r\n if (debug) console.log(`[WASM] Loading module from ${wasmUrl}`);\r\n \r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM module: ${response.statusText}`);\r\n }\r\n \r\n const buffer = await response.arrayBuffer();\r\n const module = await WebAssembly.compile(buffer);\r\n \r\n // Create imports object, combining Go runtime with custom imports\r\n const finalImportObject = go ? {\r\n ...go.importObject,\r\n ...importObject\r\n } : importObject;\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(module, finalImportObject);\r\n \r\n // Initialize Go runtime if available\r\n if (go) {\r\n go.run(instance);\r\n }\r\n \r\n // Extract exported functions\r\n const exports = instance.exports;\r\n const functions: Record<string, Function> = {};\r\n \r\n // Generate wrapper functions for all exports that are functions\r\n for (const key in exports) {\r\n if (typeof exports[key] === 'function') {\r\n // Type assertion to ensure the exports[key] is callable\r\n const exportedFn = exports[key] as unknown as Function;\r\n functions[key] = (...args: any[]) => exportedFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Add any globally exported functions from Go\r\n if (typeof window !== 'undefined') {\r\n for (const key in window) {\r\n if (key.startsWith('go') && typeof (window as any)[key] === 'function') {\r\n // Type assertion to ensure the window[key] is callable\r\n const globalFn = (window as any)[key] as Function;\r\n functions[key] = (...args: any[]) => globalFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling global ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module,\r\n exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (onLoad) {\r\n onLoad(wasmInstance);\r\n }\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load the Go WASM runtime script\r\n */\r\nasync function loadGoRuntime(path: string = DEFAULT_GO_WASM_PATH): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n \r\n // Check if Go runtime is already loaded\r\n if (typeof (window as any).Go !== 'undefined') {\r\n return;\r\n }\r\n \r\n // Load the Go WASM runtime script\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = path;\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error(`Failed to load Go WASM runtime from ${path}`));\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * Create a TypeScript-friendly wrapper for Go WASM functions\r\n */\r\nexport function createTypedWasmFunction<T extends (...args: any[]) => any>(\r\n instance: GoWasmInstance,\r\n functionName: string\r\n): T {\r\n if (!instance.functions[functionName]) {\r\n throw new Error(`WASM function \"${functionName}\" not found`);\r\n }\r\n \r\n return instance.functions[functionName] as T;\r\n}\r\n\r\n/**\r\n * Helper to convert JavaScript values to Go-compatible formats\r\n */\r\nexport const goValues = {\r\n // Convert JS string to Go string (returns memory pointer)\r\n stringToGo: (instance: GoWasmInstance, str: string): number => {\r\n if (!instance.functions.__stringToGo) {\r\n throw new Error('__stringToGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringToGo(str);\r\n },\r\n \r\n // Convert Go string (memory pointer) to JS string\r\n stringFromGo: (instance: GoWasmInstance, ptr: number): string => {\r\n if (!instance.functions.__stringFromGo) {\r\n throw new Error('__stringFromGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringFromGo(ptr);\r\n },\r\n \r\n // Convert JS object to Go (returns memory pointer)\r\n objectToGo: (instance: GoWasmInstance, obj: any): number => {\r\n if (!instance.functions.__objectToGo) {\r\n throw new Error('__objectToGo function not found in WASM module');\r\n }\r\n return instance.functions.__objectToGo(JSON.stringify(obj));\r\n },\r\n \r\n // Convert Go object (memory pointer) to JS object\r\n objectFromGo: (instance: GoWasmInstance, ptr: number): any => {\r\n if (!instance.functions.__objectFromGo) {\r\n throw new Error('__objectFromGo function not found in WASM module');\r\n }\r\n const str = instance.functions.__objectFromGo(ptr);\r\n return JSON.parse(str);\r\n }\r\n};\r\n","interface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n key?: string | number;\r\n}\r\n\r\nfunction arePropsEqual(oldProps: any, newProps: any): boolean {\r\n const oldKeys = Object.keys(oldProps).filter(k => k !== 'children');\r\n const newKeys = Object.keys(newProps).filter(k => k !== 'children');\r\n \r\n if (oldKeys.length !== newKeys.length) return false;\r\n return oldKeys.every(key => oldProps[key] === newProps[key]);\r\n}\r\n\r\nexport function diff(oldNode: VNode | any, newNode: VNode | any): boolean {\r\n if (oldNode == null || newNode == null) return oldNode !== newNode;\r\n if (typeof oldNode !== typeof newNode) return true;\r\n if (typeof newNode === 'string' || typeof newNode === 'number')\r\n return oldNode !== newNode;\r\n if (newNode.type !== oldNode.type) return true;\r\n return !arePropsEqual(oldNode.props, newNode.props);\r\n}\r\n\r\nexport function shouldComponentUpdate(oldProps: any, newProps: any): boolean {\r\n return !arePropsEqual(oldProps, newProps);\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\n\r\nexport class Component {\r\n state: any = {};\r\n props: any;\r\n element: HTMLElement | null = null;\r\n private _mounted: boolean = false;\r\n\r\n constructor(props: any = {}) {\r\n this.props = props;\r\n }\r\n\r\n componentDidMount() {\r\n // Hook for after component is mounted\r\n }\r\n\r\n async setState(newState: any) {\r\n const prevState = { ...this.state };\r\n this.state = { ...prevState, ...newState };\r\n console.log(`${this.constructor.name} state updated:`, {\r\n prev: prevState,\r\n next: this.state\r\n });\r\n \r\n await Promise.resolve(); // Ensure state is updated before re-render\r\n if (this._mounted) {\r\n await this.update();\r\n } else {\r\n await this.update();\r\n }\r\n }\r\n\r\n private _replayEvents(oldElement: HTMLElement, newElement: HTMLElement) {\r\n const oldEvents = (oldElement as any).__events || {};\r\n Object.entries(oldEvents).forEach(([event, handler]) => {\r\n newElement.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n (newElement as any).__events = oldEvents;\r\n }\r\n\r\n private _deepCloneWithEvents(node: HTMLElement): HTMLElement {\r\n const clone = node.cloneNode(false) as HTMLElement;\r\n \r\n // Copy events from original element\r\n const events = (node as any).__events || {};\r\n (clone as any).__events = events;\r\n Object.entries(events).forEach(([event, handler]) => {\r\n clone.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n\r\n // Clone children\r\n Array.from(node.childNodes).forEach(child => {\r\n if (child instanceof HTMLElement) {\r\n clone.appendChild(this._deepCloneWithEvents(child));\r\n } else {\r\n clone.appendChild(child.cloneNode(true));\r\n }\r\n });\r\n\r\n return clone;\r\n }\r\n\r\n async update() {\r\n const vdom = this.render();\r\n if (!vdom) return document.createTextNode('');\r\n \r\n const rendered = await createElement(vdom);\r\n if (rendered instanceof HTMLElement) {\r\n return this._updateElement(rendered);\r\n }\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.appendChild(rendered);\r\n return this._updateElement(wrapper);\r\n }\r\n\r\n private async _updateElement(rendered: HTMLElement) {\r\n const newElement = this._deepCloneWithEvents(rendered);\r\n (newElement as any).__instance = this;\r\n \r\n if (!this.element) {\r\n this.element = newElement;\r\n if (!this._mounted) {\r\n this._mounted = true;\r\n queueMicrotask(() => this.componentDidMount());\r\n }\r\n } else if (this.element.parentNode) {\r\n this.element.parentNode.replaceChild(newElement, this.element);\r\n this.element = newElement;\r\n }\r\n \r\n return this.element;\r\n }\r\n\r\n render(): any {\r\n throw new Error('Component must implement render() method');\r\n }\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { \r\n loadGoWasm as loadGoWasmImpl, \r\n createTypedWasmFunction as createTypedWasmFunctionImpl,\r\n goValues as goValuesImpl,\r\n type GoWasmInstance,\r\n type GoWasmOptions\r\n} from './wasm.js';\r\n\r\n// Import items needed for the default export\r\nimport { jsx, jsxs, jsxDEV, Fragment } from './jsx-runtime.js';\r\nimport { render, hydrate } from './renderer.js';\r\nimport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n} from './hooks.js';\r\nimport { createContext } from './context.js';\r\nimport { renderToString } from './server-renderer.js';\r\nimport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\nimport { diff, shouldComponentUpdate } from './vdom.js';\r\nimport { Component } from './component.js';\r\n\r\n// Re-export core modules with explicit names to ensure they appear in bundle\r\nexport { render, hydrate } from './renderer.js';\r\nexport { \r\n jsx, \r\n jsxs, \r\n jsxDEV,\r\n Fragment, \r\n createElement \r\n} from './jsx-runtime.js';\r\n\r\nexport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n} from './hooks.js';\r\n\r\n// Context API\r\nexport { createContext } from './context.js';\r\n\r\n// Server-side rendering\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Batch updates utility\r\nexport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\n\r\n// VDOM utilities\r\nexport { diff, shouldComponentUpdate } from './vdom.js';\r\n\r\n// Export Component class\r\nexport { Component } from './component.js';\r\n\r\n// Server module stub for browser environments\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\n// Export WASM functionality explicitly\r\nexport const loadGoWasm = loadGoWasmImpl;\r\nexport const createTypedWasmFunction = createTypedWasmFunctionImpl;\r\nexport const goValues = goValuesImpl;\r\nexport type { GoWasmInstance, GoWasmOptions } from './wasm.js';\r\n\r\n// Add wasm object to ensure compatibility with existing dist/index.js\r\nexport const wasm = {\r\n loadGoWasm: loadGoWasmImpl,\r\n createTypedWasmFunction: createTypedWasmFunctionImpl,\r\n goValues: goValuesImpl\r\n};\r\n\r\n// Re-export types\r\nexport type { Context } from './context.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types from the safe type-only file\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// Export this so it can be properly identified in the bundle\r\nexport let isHydrating = false;\r\n\r\n// Default export for compatibility with some module systems\r\nexport default {\r\n Fragment,\r\n jsx,\r\n jsxs,\r\n createElement,\r\n render, \r\n hydrate,\r\n useState,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useContext,\r\n useErrorBoundary,\r\n createContext,\r\n renderToString,\r\n batchUpdates,\r\n server,\r\n loadGoWasm,\r\n createTypedWasmFunction,\r\n goValues,\r\n wasm,\r\n Component,\r\n diff,\r\n shouldComponentUpdate,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n // Server functionality is exposed through the server export\r\n};\r\n"],"names":["DEFAULT_GO_WASM_PATH","async","loadGoWasm","wasmUrl","options","importObject","goWasmPath","loadGo","onLoad","debug","window","path","Go","Promise","resolve","reject","script","document","createElement","src","onload","onerror","Error","head","appendChild","loadGoRuntime","go","console","log","response","fetch","ok","statusText","buffer","arrayBuffer","module","WebAssembly","compile","finalImportObject","instance","instantiate","run","exports","functions","key","exportedFn","args","originalFn","join","result","startsWith","globalFn","wasmInstance","error","createTypedWasmFunction","functionName","goValues","stringToGo","str","__stringToGo","stringFromGo","ptr","__stringFromGo","objectToGo","obj","__objectToGo","JSON","stringify","objectFromGo","__objectFromGo","parse","arePropsEqual","oldProps","newProps","oldKeys","Object","keys","filter","k","newKeys","length","every","diff","oldNode","newNode","type","props","shouldComponentUpdate","Component","constructor","this","state","element","_mounted","componentDidMount","setState","newState","prevState","name","prev","next","update","_replayEvents","oldElement","newElement","oldEvents","__events","entries","forEach","event","handler","addEventListener","_deepCloneWithEvents","node","clone","cloneNode","events","Array","from","childNodes","child","HTMLElement","vdom","render","createTextNode","rendered","_updateElement","wrapper","__instance","parentNode","replaceChild","queueMicrotask","server","getServer","loadGoWasmImpl","createTypedWasmFunctionImpl","goValuesImpl","wasm","index","Fragment","jsx","jsxs","hydrate","useState","useEffect","useMemo","useRef","useContext","useErrorBoundary","createContext","renderToString","batchUpdates","prepareRender","finishRender","setRenderCallback"],"mappings":"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"}
|
package/dist/index.client.cjs
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./server-renderer-
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./server-renderer-Chs-nmJm.cjs"),r=require("./renderer-BL3gq8cW.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
2
|
//# sourceMappingURL=index.client.cjs.map
|
package/dist/index.client.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { b, r, d, u, c, a, e } from "./server-renderer-
|
2
|
-
import { c as c2, h, r as r2, u as u2 } from "./renderer-
|
1
|
+
import { b, r, d, u, c, a, e } from "./server-renderer-C1WXH-zV.js";
|
2
|
+
import { c as c2, h, r as r2, u as u2 } from "./renderer-Dyy-o05F.js";
|
3
3
|
import { Fragment, jsx, jsx as jsx2 } from "./jsx-runtime.js";
|
4
4
|
const server = {
|
5
5
|
async getServer() {
|
package/dist/index.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { createElement, jsx, Fragment } from "./jsx-runtime.js";
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import {
|
2
|
+
import { s as setRenderCallback, f as finishRender, p as prepareRender, b as batchUpdates, r as renderToString, u as useErrorBoundary, a as useRef, c as useMemo, d as useEffect, e as useState } from "./server-renderer-C1WXH-zV.js";
|
3
|
+
import { g, i } from "./server-renderer-C1WXH-zV.js";
|
4
|
+
import { c as createContext, u as useContext, h as hydrate, r as render } from "./renderer-Dyy-o05F.js";
|
5
5
|
const DEFAULT_GO_WASM_PATH = "/wasm_exec.js";
|
6
6
|
async function loadGoWasm$1(wasmUrl, options = {}) {
|
7
7
|
const {
|
@@ -260,7 +260,11 @@ const index = {
|
|
260
260
|
wasm,
|
261
261
|
Component,
|
262
262
|
diff,
|
263
|
-
shouldComponentUpdate
|
263
|
+
shouldComponentUpdate,
|
264
|
+
prepareRender,
|
265
|
+
finishRender,
|
266
|
+
setRenderCallback
|
267
|
+
// Server functionality is exposed through the server export
|
264
268
|
};
|
265
269
|
export {
|
266
270
|
Component,
|
@@ -271,7 +275,7 @@ export {
|
|
271
275
|
createTypedWasmFunction,
|
272
276
|
index as default,
|
273
277
|
diff,
|
274
|
-
|
278
|
+
finishRender,
|
275
279
|
g as getIsBatching,
|
276
280
|
goValues,
|
277
281
|
hydrate,
|
@@ -281,11 +285,11 @@ export {
|
|
281
285
|
jsx as jsxDEV,
|
282
286
|
jsx as jsxs,
|
283
287
|
loadGoWasm,
|
284
|
-
|
288
|
+
prepareRender,
|
285
289
|
render,
|
286
290
|
renderToString,
|
287
291
|
server,
|
288
|
-
|
292
|
+
setRenderCallback,
|
289
293
|
shouldComponentUpdate,
|
290
294
|
useContext,
|
291
295
|
useEffect,
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/wasm.ts","../src/vdom.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Go WebAssembly Integration Utilities\r\n * \r\n * This module provides tools for loading and interacting with Go WASM modules\r\n * in browser and server environments.\r\n */\r\n\r\n// Type definitions for Go WASM integration\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: any;\r\n functions: Record<string, Function>;\r\n}\r\n\r\nexport interface GoWasmOptions {\r\n importObject?: WebAssembly.Imports;\r\n goWasmPath?: string;\r\n loadGo?: boolean;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n debug?: boolean;\r\n}\r\n\r\nconst DEFAULT_GO_WASM_PATH = '/wasm_exec.js';\r\n\r\n/**\r\n * Load a Go WASM module from a URL\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string, \r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n const {\r\n importObject = {},\r\n goWasmPath = DEFAULT_GO_WASM_PATH,\r\n loadGo = true,\r\n onLoad,\r\n debug = false\r\n } = options;\r\n\r\n // In browser environment, load the Go WASM runtime\r\n if (typeof window !== 'undefined' && loadGo) {\r\n await loadGoRuntime(goWasmPath);\r\n }\r\n\r\n try {\r\n // Create Go instance for WASM\r\n // @ts-ignore - Go is loaded from the global scope\r\n const go = typeof Go !== 'undefined' ? new Go() : null;\r\n \r\n // Fetch and instantiate the WASM module\r\n if (debug) console.log(`[WASM] Loading module from ${wasmUrl}`);\r\n \r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM module: ${response.statusText}`);\r\n }\r\n \r\n const buffer = await response.arrayBuffer();\r\n const module = await WebAssembly.compile(buffer);\r\n \r\n // Create imports object, combining Go runtime with custom imports\r\n const finalImportObject = go ? {\r\n ...go.importObject,\r\n ...importObject\r\n } : importObject;\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(module, finalImportObject);\r\n \r\n // Initialize Go runtime if available\r\n if (go) {\r\n go.run(instance);\r\n }\r\n \r\n // Extract exported functions\r\n const exports = instance.exports;\r\n const functions: Record<string, Function> = {};\r\n \r\n // Generate wrapper functions for all exports that are functions\r\n for (const key in exports) {\r\n if (typeof exports[key] === 'function') {\r\n // Type assertion to ensure the exports[key] is callable\r\n const exportedFn = exports[key] as unknown as Function;\r\n functions[key] = (...args: any[]) => exportedFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Add any globally exported functions from Go\r\n if (typeof window !== 'undefined') {\r\n for (const key in window) {\r\n if (key.startsWith('go') && typeof (window as any)[key] === 'function') {\r\n // Type assertion to ensure the window[key] is callable\r\n const globalFn = (window as any)[key] as Function;\r\n functions[key] = (...args: any[]) => globalFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling global ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module,\r\n exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (onLoad) {\r\n onLoad(wasmInstance);\r\n }\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load the Go WASM runtime script\r\n */\r\nasync function loadGoRuntime(path: string = DEFAULT_GO_WASM_PATH): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n \r\n // Check if Go runtime is already loaded\r\n if (typeof (window as any).Go !== 'undefined') {\r\n return;\r\n }\r\n \r\n // Load the Go WASM runtime script\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = path;\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error(`Failed to load Go WASM runtime from ${path}`));\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * Create a TypeScript-friendly wrapper for Go WASM functions\r\n */\r\nexport function createTypedWasmFunction<T extends (...args: any[]) => any>(\r\n instance: GoWasmInstance,\r\n functionName: string\r\n): T {\r\n if (!instance.functions[functionName]) {\r\n throw new Error(`WASM function \"${functionName}\" not found`);\r\n }\r\n \r\n return instance.functions[functionName] as T;\r\n}\r\n\r\n/**\r\n * Helper to convert JavaScript values to Go-compatible formats\r\n */\r\nexport const goValues = {\r\n // Convert JS string to Go string (returns memory pointer)\r\n stringToGo: (instance: GoWasmInstance, str: string): number => {\r\n if (!instance.functions.__stringToGo) {\r\n throw new Error('__stringToGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringToGo(str);\r\n },\r\n \r\n // Convert Go string (memory pointer) to JS string\r\n stringFromGo: (instance: GoWasmInstance, ptr: number): string => {\r\n if (!instance.functions.__stringFromGo) {\r\n throw new Error('__stringFromGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringFromGo(ptr);\r\n },\r\n \r\n // Convert JS object to Go (returns memory pointer)\r\n objectToGo: (instance: GoWasmInstance, obj: any): number => {\r\n if (!instance.functions.__objectToGo) {\r\n throw new Error('__objectToGo function not found in WASM module');\r\n }\r\n return instance.functions.__objectToGo(JSON.stringify(obj));\r\n },\r\n \r\n // Convert Go object (memory pointer) to JS object\r\n objectFromGo: (instance: GoWasmInstance, ptr: number): any => {\r\n if (!instance.functions.__objectFromGo) {\r\n throw new Error('__objectFromGo function not found in WASM module');\r\n }\r\n const str = instance.functions.__objectFromGo(ptr);\r\n return JSON.parse(str);\r\n }\r\n};\r\n","interface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n key?: string | number;\r\n}\r\n\r\nfunction arePropsEqual(oldProps: any, newProps: any): boolean {\r\n const oldKeys = Object.keys(oldProps).filter(k => k !== 'children');\r\n const newKeys = Object.keys(newProps).filter(k => k !== 'children');\r\n \r\n if (oldKeys.length !== newKeys.length) return false;\r\n return oldKeys.every(key => oldProps[key] === newProps[key]);\r\n}\r\n\r\nexport function diff(oldNode: VNode | any, newNode: VNode | any): boolean {\r\n if (oldNode == null || newNode == null) return oldNode !== newNode;\r\n if (typeof oldNode !== typeof newNode) return true;\r\n if (typeof newNode === 'string' || typeof newNode === 'number')\r\n return oldNode !== newNode;\r\n if (newNode.type !== oldNode.type) return true;\r\n return !arePropsEqual(oldNode.props, newNode.props);\r\n}\r\n\r\nexport function shouldComponentUpdate(oldProps: any, newProps: any): boolean {\r\n return !arePropsEqual(oldProps, newProps);\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\n\r\nexport class Component {\r\n state: any = {};\r\n props: any;\r\n element: HTMLElement | null = null;\r\n private _mounted: boolean = false;\r\n\r\n constructor(props: any = {}) {\r\n this.props = props;\r\n }\r\n\r\n componentDidMount() {\r\n // Hook for after component is mounted\r\n }\r\n\r\n async setState(newState: any) {\r\n const prevState = { ...this.state };\r\n this.state = { ...prevState, ...newState };\r\n console.log(`${this.constructor.name} state updated:`, {\r\n prev: prevState,\r\n next: this.state\r\n });\r\n \r\n await Promise.resolve(); // Ensure state is updated before re-render\r\n if (this._mounted) {\r\n await this.update();\r\n } else {\r\n await this.update();\r\n }\r\n }\r\n\r\n private _replayEvents(oldElement: HTMLElement, newElement: HTMLElement) {\r\n const oldEvents = (oldElement as any).__events || {};\r\n Object.entries(oldEvents).forEach(([event, handler]) => {\r\n newElement.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n (newElement as any).__events = oldEvents;\r\n }\r\n\r\n private _deepCloneWithEvents(node: HTMLElement): HTMLElement {\r\n const clone = node.cloneNode(false) as HTMLElement;\r\n \r\n // Copy events from original element\r\n const events = (node as any).__events || {};\r\n (clone as any).__events = events;\r\n Object.entries(events).forEach(([event, handler]) => {\r\n clone.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n\r\n // Clone children\r\n Array.from(node.childNodes).forEach(child => {\r\n if (child instanceof HTMLElement) {\r\n clone.appendChild(this._deepCloneWithEvents(child));\r\n } else {\r\n clone.appendChild(child.cloneNode(true));\r\n }\r\n });\r\n\r\n return clone;\r\n }\r\n\r\n async update() {\r\n const vdom = this.render();\r\n if (!vdom) return document.createTextNode('');\r\n \r\n const rendered = await createElement(vdom);\r\n if (rendered instanceof HTMLElement) {\r\n return this._updateElement(rendered);\r\n }\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.appendChild(rendered);\r\n return this._updateElement(wrapper);\r\n }\r\n\r\n private async _updateElement(rendered: HTMLElement) {\r\n const newElement = this._deepCloneWithEvents(rendered);\r\n (newElement as any).__instance = this;\r\n \r\n if (!this.element) {\r\n this.element = newElement;\r\n if (!this._mounted) {\r\n this._mounted = true;\r\n queueMicrotask(() => this.componentDidMount());\r\n }\r\n } else if (this.element.parentNode) {\r\n this.element.parentNode.replaceChild(newElement, this.element);\r\n this.element = newElement;\r\n }\r\n \r\n return this.element;\r\n }\r\n\r\n render(): any {\r\n throw new Error('Component must implement render() method');\r\n }\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { \r\n loadGoWasm as loadGoWasmImpl, \r\n createTypedWasmFunction as createTypedWasmFunctionImpl,\r\n goValues as goValuesImpl,\r\n type GoWasmInstance,\r\n type GoWasmOptions\r\n} from './wasm.js';\r\n\r\n// Import items needed for the default export\r\nimport { jsx, jsxs, jsxDEV, Fragment } from './jsx-runtime.js';\r\nimport { render, hydrate } from './renderer.js';\r\nimport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary\r\n} from './hooks.js';\r\nimport { createContext } from './context.js';\r\nimport { renderToString } from './server-renderer.js';\r\nimport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\nimport { diff, shouldComponentUpdate } from './vdom.js';\r\nimport { Component } from './component.js';\r\n\r\n// Re-export core modules with explicit names to ensure they appear in bundle\r\nexport { render, hydrate } from './renderer.js';\r\nexport { \r\n jsx, \r\n jsxs, \r\n jsxDEV,\r\n Fragment, \r\n createElement \r\n} from './jsx-runtime.js';\r\n\r\nexport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n} from './hooks.js';\r\n\r\n// Context API\r\nexport { createContext } from './context.js';\r\n\r\n// Server-side rendering\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Batch updates utility\r\nexport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\n\r\n// VDOM utilities\r\nexport { diff, shouldComponentUpdate } from './vdom.js';\r\n\r\n// Export Component class\r\nexport { Component } from './component.js';\r\n\r\n// Server module stub for browser environments\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\n// Export WASM functionality explicitly\r\nexport const loadGoWasm = loadGoWasmImpl;\r\nexport const createTypedWasmFunction = createTypedWasmFunctionImpl;\r\nexport const goValues = goValuesImpl;\r\nexport type { GoWasmInstance, GoWasmOptions } from './wasm.js';\r\n\r\n// Add wasm object to ensure compatibility with existing dist/index.js\r\nexport const wasm = {\r\n loadGoWasm: loadGoWasmImpl,\r\n createTypedWasmFunction: createTypedWasmFunctionImpl,\r\n goValues: goValuesImpl\r\n};\r\n\r\n// Re-export types\r\nexport type { Context } from './context.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types from the safe type-only file\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// Export this so it can be properly identified in the bundle\r\nexport let isHydrating = false;\r\nimport { AuthService } from './server/auth.js';\r\n// Default export for compatibility with some module systems\r\nexport default {\r\n Fragment: Fragment,\r\n jsx: jsx,\r\n jsxs: jsxs,\r\n createElement: createElement,\r\n render: render, \r\n hydrate: hydrate,\r\n useState: useState,\r\n useEffect: useEffect,\r\n useMemo: useMemo,\r\n useRef: useRef,\r\n useContext: useContext,\r\n useErrorBoundary: useErrorBoundary,\r\n createContext: createContext,\r\n renderToString: renderToString,\r\n batchUpdates: batchUpdates,\r\n server: server,\r\n loadGoWasm: loadGoWasm,\r\n createTypedWasmFunction: createTypedWasmFunction,\r\n goValues: goValues,\r\n wasm: wasm,\r\n Component: Component,\r\n diff: diff,\r\n shouldComponentUpdate: shouldComponentUpdate\r\n};\r\n"],"names":["loadGoWasm","createTypedWasmFunction","goValues","loadGoWasmImpl","createTypedWasmFunctionImpl","goValuesImpl","jsxs"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/wasm.ts","../src/vdom.ts","../src/component.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Go WebAssembly Integration Utilities\r\n * \r\n * This module provides tools for loading and interacting with Go WASM modules\r\n * in browser and server environments.\r\n */\r\n\r\n// Type definitions for Go WASM integration\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: any;\r\n functions: Record<string, Function>;\r\n}\r\n\r\nexport interface GoWasmOptions {\r\n importObject?: WebAssembly.Imports;\r\n goWasmPath?: string;\r\n loadGo?: boolean;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n debug?: boolean;\r\n}\r\n\r\nconst DEFAULT_GO_WASM_PATH = '/wasm_exec.js';\r\n\r\n/**\r\n * Load a Go WASM module from a URL\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string, \r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n const {\r\n importObject = {},\r\n goWasmPath = DEFAULT_GO_WASM_PATH,\r\n loadGo = true,\r\n onLoad,\r\n debug = false\r\n } = options;\r\n\r\n // In browser environment, load the Go WASM runtime\r\n if (typeof window !== 'undefined' && loadGo) {\r\n await loadGoRuntime(goWasmPath);\r\n }\r\n\r\n try {\r\n // Create Go instance for WASM\r\n // @ts-ignore - Go is loaded from the global scope\r\n const go = typeof Go !== 'undefined' ? new Go() : null;\r\n \r\n // Fetch and instantiate the WASM module\r\n if (debug) console.log(`[WASM] Loading module from ${wasmUrl}`);\r\n \r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM module: ${response.statusText}`);\r\n }\r\n \r\n const buffer = await response.arrayBuffer();\r\n const module = await WebAssembly.compile(buffer);\r\n \r\n // Create imports object, combining Go runtime with custom imports\r\n const finalImportObject = go ? {\r\n ...go.importObject,\r\n ...importObject\r\n } : importObject;\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(module, finalImportObject);\r\n \r\n // Initialize Go runtime if available\r\n if (go) {\r\n go.run(instance);\r\n }\r\n \r\n // Extract exported functions\r\n const exports = instance.exports;\r\n const functions: Record<string, Function> = {};\r\n \r\n // Generate wrapper functions for all exports that are functions\r\n for (const key in exports) {\r\n if (typeof exports[key] === 'function') {\r\n // Type assertion to ensure the exports[key] is callable\r\n const exportedFn = exports[key] as unknown as Function;\r\n functions[key] = (...args: any[]) => exportedFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Add any globally exported functions from Go\r\n if (typeof window !== 'undefined') {\r\n for (const key in window) {\r\n if (key.startsWith('go') && typeof (window as any)[key] === 'function') {\r\n // Type assertion to ensure the window[key] is callable\r\n const globalFn = (window as any)[key] as Function;\r\n functions[key] = (...args: any[]) => globalFn(...args);\r\n \r\n if (debug) {\r\n const originalFn = functions[key];\r\n functions[key] = (...args: any[]) => {\r\n console.log(`[WASM] Calling global ${key}(${args.join(', ')})`);\r\n const result = originalFn(...args);\r\n console.log(`[WASM] ${key} returned:`, result);\r\n return result;\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module,\r\n exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (onLoad) {\r\n onLoad(wasmInstance);\r\n }\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load the Go WASM runtime script\r\n */\r\nasync function loadGoRuntime(path: string = DEFAULT_GO_WASM_PATH): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n \r\n // Check if Go runtime is already loaded\r\n if (typeof (window as any).Go !== 'undefined') {\r\n return;\r\n }\r\n \r\n // Load the Go WASM runtime script\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = path;\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error(`Failed to load Go WASM runtime from ${path}`));\r\n document.head.appendChild(script);\r\n });\r\n}\r\n\r\n/**\r\n * Create a TypeScript-friendly wrapper for Go WASM functions\r\n */\r\nexport function createTypedWasmFunction<T extends (...args: any[]) => any>(\r\n instance: GoWasmInstance,\r\n functionName: string\r\n): T {\r\n if (!instance.functions[functionName]) {\r\n throw new Error(`WASM function \"${functionName}\" not found`);\r\n }\r\n \r\n return instance.functions[functionName] as T;\r\n}\r\n\r\n/**\r\n * Helper to convert JavaScript values to Go-compatible formats\r\n */\r\nexport const goValues = {\r\n // Convert JS string to Go string (returns memory pointer)\r\n stringToGo: (instance: GoWasmInstance, str: string): number => {\r\n if (!instance.functions.__stringToGo) {\r\n throw new Error('__stringToGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringToGo(str);\r\n },\r\n \r\n // Convert Go string (memory pointer) to JS string\r\n stringFromGo: (instance: GoWasmInstance, ptr: number): string => {\r\n if (!instance.functions.__stringFromGo) {\r\n throw new Error('__stringFromGo function not found in WASM module');\r\n }\r\n return instance.functions.__stringFromGo(ptr);\r\n },\r\n \r\n // Convert JS object to Go (returns memory pointer)\r\n objectToGo: (instance: GoWasmInstance, obj: any): number => {\r\n if (!instance.functions.__objectToGo) {\r\n throw new Error('__objectToGo function not found in WASM module');\r\n }\r\n return instance.functions.__objectToGo(JSON.stringify(obj));\r\n },\r\n \r\n // Convert Go object (memory pointer) to JS object\r\n objectFromGo: (instance: GoWasmInstance, ptr: number): any => {\r\n if (!instance.functions.__objectFromGo) {\r\n throw new Error('__objectFromGo function not found in WASM module');\r\n }\r\n const str = instance.functions.__objectFromGo(ptr);\r\n return JSON.parse(str);\r\n }\r\n};\r\n","interface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n key?: string | number;\r\n}\r\n\r\nfunction arePropsEqual(oldProps: any, newProps: any): boolean {\r\n const oldKeys = Object.keys(oldProps).filter(k => k !== 'children');\r\n const newKeys = Object.keys(newProps).filter(k => k !== 'children');\r\n \r\n if (oldKeys.length !== newKeys.length) return false;\r\n return oldKeys.every(key => oldProps[key] === newProps[key]);\r\n}\r\n\r\nexport function diff(oldNode: VNode | any, newNode: VNode | any): boolean {\r\n if (oldNode == null || newNode == null) return oldNode !== newNode;\r\n if (typeof oldNode !== typeof newNode) return true;\r\n if (typeof newNode === 'string' || typeof newNode === 'number')\r\n return oldNode !== newNode;\r\n if (newNode.type !== oldNode.type) return true;\r\n return !arePropsEqual(oldNode.props, newNode.props);\r\n}\r\n\r\nexport function shouldComponentUpdate(oldProps: any, newProps: any): boolean {\r\n return !arePropsEqual(oldProps, newProps);\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\n\r\nexport class Component {\r\n state: any = {};\r\n props: any;\r\n element: HTMLElement | null = null;\r\n private _mounted: boolean = false;\r\n\r\n constructor(props: any = {}) {\r\n this.props = props;\r\n }\r\n\r\n componentDidMount() {\r\n // Hook for after component is mounted\r\n }\r\n\r\n async setState(newState: any) {\r\n const prevState = { ...this.state };\r\n this.state = { ...prevState, ...newState };\r\n console.log(`${this.constructor.name} state updated:`, {\r\n prev: prevState,\r\n next: this.state\r\n });\r\n \r\n await Promise.resolve(); // Ensure state is updated before re-render\r\n if (this._mounted) {\r\n await this.update();\r\n } else {\r\n await this.update();\r\n }\r\n }\r\n\r\n private _replayEvents(oldElement: HTMLElement, newElement: HTMLElement) {\r\n const oldEvents = (oldElement as any).__events || {};\r\n Object.entries(oldEvents).forEach(([event, handler]) => {\r\n newElement.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n (newElement as any).__events = oldEvents;\r\n }\r\n\r\n private _deepCloneWithEvents(node: HTMLElement): HTMLElement {\r\n const clone = node.cloneNode(false) as HTMLElement;\r\n \r\n // Copy events from original element\r\n const events = (node as any).__events || {};\r\n (clone as any).__events = events;\r\n Object.entries(events).forEach(([event, handler]) => {\r\n clone.addEventListener(event as keyof HTMLElementEventMap, handler as EventListener);\r\n });\r\n\r\n // Clone children\r\n Array.from(node.childNodes).forEach(child => {\r\n if (child instanceof HTMLElement) {\r\n clone.appendChild(this._deepCloneWithEvents(child));\r\n } else {\r\n clone.appendChild(child.cloneNode(true));\r\n }\r\n });\r\n\r\n return clone;\r\n }\r\n\r\n async update() {\r\n const vdom = this.render();\r\n if (!vdom) return document.createTextNode('');\r\n \r\n const rendered = await createElement(vdom);\r\n if (rendered instanceof HTMLElement) {\r\n return this._updateElement(rendered);\r\n }\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.appendChild(rendered);\r\n return this._updateElement(wrapper);\r\n }\r\n\r\n private async _updateElement(rendered: HTMLElement) {\r\n const newElement = this._deepCloneWithEvents(rendered);\r\n (newElement as any).__instance = this;\r\n \r\n if (!this.element) {\r\n this.element = newElement;\r\n if (!this._mounted) {\r\n this._mounted = true;\r\n queueMicrotask(() => this.componentDidMount());\r\n }\r\n } else if (this.element.parentNode) {\r\n this.element.parentNode.replaceChild(newElement, this.element);\r\n this.element = newElement;\r\n }\r\n \r\n return this.element;\r\n }\r\n\r\n render(): any {\r\n throw new Error('Component must implement render() method');\r\n }\r\n}\r\n","import { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { \r\n loadGoWasm as loadGoWasmImpl, \r\n createTypedWasmFunction as createTypedWasmFunctionImpl,\r\n goValues as goValuesImpl,\r\n type GoWasmInstance,\r\n type GoWasmOptions\r\n} from './wasm.js';\r\n\r\n// Import items needed for the default export\r\nimport { jsx, jsxs, jsxDEV, Fragment } from './jsx-runtime.js';\r\nimport { render, hydrate } from './renderer.js';\r\nimport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n} from './hooks.js';\r\nimport { createContext } from './context.js';\r\nimport { renderToString } from './server-renderer.js';\r\nimport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\nimport { diff, shouldComponentUpdate } from './vdom.js';\r\nimport { Component } from './component.js';\r\n\r\n// Re-export core modules with explicit names to ensure they appear in bundle\r\nexport { render, hydrate } from './renderer.js';\r\nexport { \r\n jsx, \r\n jsxs, \r\n jsxDEV,\r\n Fragment, \r\n createElement \r\n} from './jsx-runtime.js';\r\n\r\nexport { \r\n useState, \r\n useEffect,\r\n useMemo, \r\n useRef, \r\n useContext,\r\n useErrorBoundary,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n} from './hooks.js';\r\n\r\n// Context API\r\nexport { createContext } from './context.js';\r\n\r\n// Server-side rendering\r\nexport { renderToString } from './server-renderer.js';\r\n\r\n// Batch updates utility\r\nexport { batchUpdates, isBatching, getIsBatching } from './batch.js';\r\n\r\n// VDOM utilities\r\nexport { diff, shouldComponentUpdate } from './vdom.js';\r\n\r\n// Export Component class\r\nexport { Component } from './component.js';\r\n\r\n// Server module stub for browser environments\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\n// Export WASM functionality explicitly\r\nexport const loadGoWasm = loadGoWasmImpl;\r\nexport const createTypedWasmFunction = createTypedWasmFunctionImpl;\r\nexport const goValues = goValuesImpl;\r\nexport type { GoWasmInstance, GoWasmOptions } from './wasm.js';\r\n\r\n// Add wasm object to ensure compatibility with existing dist/index.js\r\nexport const wasm = {\r\n loadGoWasm: loadGoWasmImpl,\r\n createTypedWasmFunction: createTypedWasmFunctionImpl,\r\n goValues: goValuesImpl\r\n};\r\n\r\n// Re-export types\r\nexport type { Context } from './context.js';\r\nexport type { VNode } from './types.js';\r\n\r\n// Export server types from the safe type-only file\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// Export this so it can be properly identified in the bundle\r\nexport let isHydrating = false;\r\n\r\n// Default export for compatibility with some module systems\r\nexport default {\r\n Fragment,\r\n jsx,\r\n jsxs,\r\n createElement,\r\n render, \r\n hydrate,\r\n useState,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useContext,\r\n useErrorBoundary,\r\n createContext,\r\n renderToString,\r\n batchUpdates,\r\n server,\r\n loadGoWasm,\r\n createTypedWasmFunction,\r\n goValues,\r\n wasm,\r\n Component,\r\n diff,\r\n shouldComponentUpdate,\r\n prepareRender,\r\n finishRender,\r\n setRenderCallback\r\n // Server functionality is exposed through the server export\r\n};\r\n"],"names":["loadGoWasm","createTypedWasmFunction","goValues","loadGoWasmImpl","createTypedWasmFunctionImpl","goValuesImpl","jsxs"],"mappings":"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"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";const e=require("./jsx-runtime.cjs"),r=require("./server-renderer-
|
2
|
-
//# sourceMappingURL=renderer-
|
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 +1 @@
|
|
1
|
-
{"version":3,"file":"renderer-
|
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,5 +1,5 @@
|
|
1
1
|
import { createElement } from "./jsx-runtime.js";
|
2
|
-
import { b as batchUpdates, p as prepareRender, s as setRenderCallback, f as finishRender } from "./server-renderer-
|
2
|
+
import { b as batchUpdates, p as prepareRender, s as setRenderCallback, f as finishRender } from "./server-renderer-C1WXH-zV.js";
|
3
3
|
function createContext(defaultValue) {
|
4
4
|
const context = {
|
5
5
|
Provider: ({ value, children }) => {
|
@@ -49,4 +49,4 @@ export {
|
|
49
49
|
render as r,
|
50
50
|
useContext as u
|
51
51
|
};
|
52
|
-
//# sourceMappingURL=renderer-
|
52
|
+
//# sourceMappingURL=renderer-Dyy-o05F.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"renderer-
|
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;"}
|
@@ -20,6 +20,7 @@ function getIsBatching() {
|
|
20
20
|
return isBatching;
|
21
21
|
}
|
22
22
|
let currentRender = 0;
|
23
|
+
let isServerRender = false;
|
23
24
|
const states = /* @__PURE__ */ new Map();
|
24
25
|
const stateIndices = /* @__PURE__ */ new Map();
|
25
26
|
const effects = /* @__PURE__ */ new Map();
|
@@ -35,22 +36,24 @@ function setRenderCallback(callback, element, container) {
|
|
35
36
|
globalContainer = container;
|
36
37
|
currentElement = element;
|
37
38
|
}
|
38
|
-
function prepareRender() {
|
39
|
+
function prepareRender(isSSR = false) {
|
39
40
|
currentRender++;
|
41
|
+
isServerRender = isSSR;
|
40
42
|
stateIndices.set(currentRender, 0);
|
41
43
|
return currentRender;
|
42
44
|
}
|
43
45
|
function finishRender() {
|
44
|
-
if (isServer) {
|
46
|
+
if (isServer || isServerRender) {
|
45
47
|
serverStates.delete(currentRender);
|
46
48
|
}
|
49
|
+
isServerRender = false;
|
47
50
|
currentRender = 0;
|
48
51
|
}
|
49
52
|
function useState(initial) {
|
50
|
-
if (!currentRender) {
|
53
|
+
if (!currentRender && !isServerRender) {
|
51
54
|
throw new Error("useState must be called within a render");
|
52
55
|
}
|
53
|
-
if (isServer) {
|
56
|
+
if (isServer || isServerRender) {
|
54
57
|
if (!serverStates.has(currentRender)) {
|
55
58
|
serverStates.set(currentRender, /* @__PURE__ */ new Map());
|
56
59
|
}
|
@@ -88,8 +91,8 @@ function useState(initial) {
|
|
88
91
|
return [state, setState];
|
89
92
|
}
|
90
93
|
function useEffect(callback, deps) {
|
91
|
-
if (!currentRender) throw new Error("useEffect must be called within a render");
|
92
|
-
if (isServer) {
|
94
|
+
if (!currentRender && !isServerRender) throw new Error("useEffect must be called within a render");
|
95
|
+
if (isServer || isServerRender) {
|
93
96
|
const effectIndex2 = stateIndices.get(currentRender) || 0;
|
94
97
|
stateIndices.set(currentRender, effectIndex2 + 1);
|
95
98
|
return;
|
@@ -112,7 +115,7 @@ function useEffect(callback, deps) {
|
|
112
115
|
stateIndices.set(currentRender, effectIndex + 1);
|
113
116
|
}
|
114
117
|
function useMemo(factory, deps) {
|
115
|
-
if (!currentRender) throw new Error("useMemo must be called within a render");
|
118
|
+
if (!currentRender && !isServerRender) throw new Error("useMemo must be called within a render");
|
116
119
|
const memoIndex = stateIndices.get(currentRender) || 0;
|
117
120
|
if (!memos.has(currentRender)) {
|
118
121
|
memos.set(currentRender, []);
|
@@ -129,7 +132,7 @@ function useMemo(factory, deps) {
|
|
129
132
|
return prevMemo.value;
|
130
133
|
}
|
131
134
|
function useRef(initial) {
|
132
|
-
if (!currentRender) throw new Error("useRef must be called within a render");
|
135
|
+
if (!currentRender && !isServerRender) throw new Error("useRef must be called within a render");
|
133
136
|
const refIndex = stateIndices.get(currentRender) || 0;
|
134
137
|
if (!refs.has(currentRender)) {
|
135
138
|
refs.set(currentRender, []);
|
@@ -165,78 +168,101 @@ function useErrorBoundary() {
|
|
165
168
|
const [error, setError] = useState(null);
|
166
169
|
return [error, () => setError(null)];
|
167
170
|
}
|
168
|
-
function renderToString(
|
169
|
-
prepareRender();
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
}
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
if (typeof
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
} else if (value === true) {
|
198
|
-
attrs += ` ${key}`;
|
199
|
-
}
|
171
|
+
async function renderToString(element) {
|
172
|
+
prepareRender(true);
|
173
|
+
try {
|
174
|
+
const html = await renderNodeToString(element);
|
175
|
+
return html;
|
176
|
+
} finally {
|
177
|
+
finishRender();
|
178
|
+
}
|
179
|
+
}
|
180
|
+
async function renderNodeToString(node) {
|
181
|
+
if (node == null || typeof node === "boolean") {
|
182
|
+
return "";
|
183
|
+
}
|
184
|
+
if (typeof node === "string" || typeof node === "number") {
|
185
|
+
return escapeHtml(String(node));
|
186
|
+
}
|
187
|
+
if (Array.isArray(node)) {
|
188
|
+
const results = await Promise.all(node.map((child) => renderNodeToString(child)));
|
189
|
+
return results.join("");
|
190
|
+
}
|
191
|
+
if (node && typeof node === "object" && "type" in node) {
|
192
|
+
const { type, props = {} } = node;
|
193
|
+
if (typeof type === "function") {
|
194
|
+
try {
|
195
|
+
const result = await type(props);
|
196
|
+
return await renderNodeToString(result);
|
197
|
+
} catch (error) {
|
198
|
+
console.error("Error rendering component:", error);
|
199
|
+
return `<!-- Error rendering component: ${error.message} -->`;
|
200
200
|
}
|
201
201
|
}
|
202
|
-
|
203
|
-
|
204
|
-
children += renderNodeToString(child);
|
202
|
+
if (typeof type === "string") {
|
203
|
+
return await renderDOMElement(type, props);
|
205
204
|
}
|
206
|
-
const selfClosing = [
|
207
|
-
"area",
|
208
|
-
"base",
|
209
|
-
"br",
|
210
|
-
"col",
|
211
|
-
"embed",
|
212
|
-
"hr",
|
213
|
-
"img",
|
214
|
-
"input",
|
215
|
-
"link",
|
216
|
-
"meta",
|
217
|
-
"param",
|
218
|
-
"source",
|
219
|
-
"track",
|
220
|
-
"wbr"
|
221
|
-
];
|
222
|
-
if (selfClosing.includes(tag)) {
|
223
|
-
return `<${tag}${attrs}/>`;
|
224
|
-
}
|
225
|
-
return `<${tag}${attrs}>${children}</${tag}>`;
|
226
205
|
}
|
227
|
-
if (
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
206
|
+
if (typeof node === "object") {
|
207
|
+
return escapeHtml(JSON.stringify(node));
|
208
|
+
}
|
209
|
+
return escapeHtml(String(node));
|
210
|
+
}
|
211
|
+
async function renderDOMElement(tagName, props) {
|
212
|
+
const { children, ...attrs } = props;
|
213
|
+
const voidElements = /* @__PURE__ */ new Set([
|
214
|
+
"area",
|
215
|
+
"base",
|
216
|
+
"br",
|
217
|
+
"col",
|
218
|
+
"embed",
|
219
|
+
"hr",
|
220
|
+
"img",
|
221
|
+
"input",
|
222
|
+
"link",
|
223
|
+
"meta",
|
224
|
+
"param",
|
225
|
+
"source",
|
226
|
+
"track",
|
227
|
+
"wbr"
|
228
|
+
]);
|
229
|
+
const attributeString = Object.entries(attrs).filter(([key, value]) => {
|
230
|
+
if (key.startsWith("on") || key === "key" || key === "ref") return false;
|
231
|
+
if (value == null || value === false) return false;
|
232
|
+
return true;
|
233
|
+
}).map(([key, value]) => {
|
234
|
+
if (key === "className") key = "class";
|
235
|
+
if (value === true) return key;
|
236
|
+
if (key === "style" && typeof value === "object" && value !== null) {
|
237
|
+
const styleString = Object.entries(value).map(([prop, val]) => `${kebabCase(prop)}:${val}`).join(";");
|
238
|
+
return `style="${escapeHtml(styleString)}"`;
|
232
239
|
}
|
233
|
-
return
|
240
|
+
return `${key}="${escapeHtml(String(value))}"`;
|
241
|
+
}).join(" ");
|
242
|
+
const openTag = `<${tagName}${attributeString ? " " + attributeString : ""}>`;
|
243
|
+
if (voidElements.has(tagName)) {
|
244
|
+
return openTag.slice(0, -1) + "/>";
|
234
245
|
}
|
235
|
-
|
236
|
-
|
246
|
+
const closeTag = `</${tagName}>`;
|
247
|
+
if (children != null) {
|
248
|
+
const childrenString = await renderNodeToString(children);
|
249
|
+
return openTag + childrenString + closeTag;
|
250
|
+
}
|
251
|
+
return openTag + closeTag;
|
237
252
|
}
|
238
253
|
function escapeHtml(text) {
|
239
|
-
|
254
|
+
const htmlEscapes = {
|
255
|
+
"&": "&",
|
256
|
+
"<": "<",
|
257
|
+
">": ">",
|
258
|
+
'"': """,
|
259
|
+
"'": "'",
|
260
|
+
"/": "/"
|
261
|
+
};
|
262
|
+
return text.replace(/[&<>"'/]/g, (match) => htmlEscapes[match]);
|
263
|
+
}
|
264
|
+
function kebabCase(str) {
|
265
|
+
return str.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
|
240
266
|
}
|
241
267
|
export {
|
242
268
|
useRef as a,
|
@@ -252,4 +278,4 @@ export {
|
|
252
278
|
setRenderCallback as s,
|
253
279
|
useErrorBoundary as u
|
254
280
|
};
|
255
|
-
//# sourceMappingURL=server-renderer-
|
281
|
+
//# sourceMappingURL=server-renderer-C1WXH-zV.js.map
|