@fynixorg/ui 1.0.4 → 1.0.6

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 (91) hide show
  1. package/dist/build.d.ts +1 -0
  2. package/dist/context/context.d.ts +99 -0
  3. package/dist/context/context.js +3 -0
  4. package/dist/context/context.js.map +2 -2
  5. package/dist/custom/Outlet.d.ts +0 -0
  6. package/dist/custom/button.d.ts +62 -0
  7. package/dist/custom/button.js +3 -0
  8. package/dist/custom/button.js.map +2 -2
  9. package/dist/custom/index.d.ts +2 -0
  10. package/dist/custom/index.js.map +2 -2
  11. package/dist/custom/path.d.ts +71 -0
  12. package/dist/custom/path.js +3 -0
  13. package/dist/custom/path.js.map +2 -2
  14. package/dist/error/errorOverlay.d.ts +26 -0
  15. package/dist/error/errorOverlay.js +4 -0
  16. package/dist/error/errorOverlay.js.map +2 -2
  17. package/dist/fynix/index.d.ts +4 -0
  18. package/dist/hooks/nixAsync.d.ts +13 -0
  19. package/dist/hooks/nixAsync.js +7 -4
  20. package/dist/hooks/nixAsync.js.map +1 -1
  21. package/dist/hooks/nixAsyncCache.d.ts +7 -0
  22. package/dist/hooks/nixAsyncCache.js +7 -4
  23. package/dist/hooks/nixAsyncCache.js.map +1 -1
  24. package/dist/hooks/nixAsyncDebounce.d.ts +28 -0
  25. package/dist/hooks/nixAsyncDebounce.js +9 -6
  26. package/dist/hooks/nixAsyncDebounce.js.map +1 -1
  27. package/dist/hooks/nixAsyncQuery.d.ts +40 -0
  28. package/dist/hooks/nixAsyncQuery.js +7 -4
  29. package/dist/hooks/nixAsyncQuery.js.map +1 -1
  30. package/dist/hooks/nixCallback.d.ts +30 -0
  31. package/dist/hooks/nixCallback.js +4 -0
  32. package/dist/hooks/nixCallback.js.map +1 -1
  33. package/dist/hooks/nixComputed.d.ts +93 -0
  34. package/dist/hooks/nixComputed.js +4 -0
  35. package/dist/hooks/nixComputed.js.map +2 -2
  36. package/dist/hooks/nixDebounce.d.ts +32 -0
  37. package/dist/hooks/nixDebounce.js +7 -4
  38. package/dist/hooks/nixDebounce.js.map +2 -2
  39. package/dist/hooks/nixEffect.d.ts +64 -0
  40. package/dist/hooks/nixEffect.js +6 -0
  41. package/dist/hooks/nixEffect.js.map +1 -1
  42. package/dist/hooks/nixForm.d.ts +15 -0
  43. package/dist/hooks/nixForm.js +11 -0
  44. package/dist/hooks/nixForm.js.map +1 -1
  45. package/dist/hooks/nixFormAsync.d.ts +20 -0
  46. package/dist/hooks/nixFormAsync.js +12 -0
  47. package/dist/hooks/nixFormAsync.js.map +1 -1
  48. package/dist/hooks/nixInterval.d.ts +26 -0
  49. package/dist/hooks/nixInterval.js +6 -3
  50. package/dist/hooks/nixInterval.js.map +2 -2
  51. package/dist/hooks/nixLazy.d.ts +19 -0
  52. package/dist/hooks/nixLazy.js +6 -2
  53. package/dist/hooks/nixLazy.js.map +1 -1
  54. package/dist/hooks/nixLazyAsync.d.ts +26 -0
  55. package/dist/hooks/nixLazyAsync.js +10 -6
  56. package/dist/hooks/nixLazyAsync.js.map +1 -1
  57. package/dist/hooks/nixLazyFormAsync.d.ts +29 -0
  58. package/dist/hooks/nixLazyFormAsync.js +18 -6
  59. package/dist/hooks/nixLazyFormAsync.js.map +1 -1
  60. package/dist/hooks/nixLocalStorage.d.ts +22 -0
  61. package/dist/hooks/nixLocalStorage.js +5 -2
  62. package/dist/hooks/nixLocalStorage.js.map +2 -2
  63. package/dist/hooks/nixMemo.d.ts +8 -0
  64. package/dist/hooks/nixMemo.js +3 -0
  65. package/dist/hooks/nixMemo.js.map +1 -1
  66. package/dist/hooks/nixPrevious.d.ts +18 -0
  67. package/dist/hooks/nixPrevious.js +3 -0
  68. package/dist/hooks/nixPrevious.js.map +2 -2
  69. package/dist/hooks/nixRef.d.ts +10 -0
  70. package/dist/hooks/nixRef.js +3 -0
  71. package/dist/hooks/nixRef.js.map +1 -1
  72. package/dist/hooks/nixState.d.ts +73 -0
  73. package/dist/hooks/nixState.js +3 -0
  74. package/dist/hooks/nixState.js.map +1 -1
  75. package/dist/hooks/nixStore.d.ts +9 -0
  76. package/dist/hooks/nixStore.js +3 -0
  77. package/dist/hooks/nixStore.js.map +1 -1
  78. package/dist/plugins/vite-plugin-res.d.ts +16 -0
  79. package/dist/plugins/vite-plugin-res.js +80 -17
  80. package/dist/plugins/vite-plugin-res.js.map +2 -2
  81. package/dist/router/router.d.ts +53 -0
  82. package/dist/router/router.js +55 -8
  83. package/dist/router/router.js.map +2 -2
  84. package/dist/runtime.d.ts +91 -0
  85. package/dist/runtime.js +23 -4
  86. package/dist/runtime.js.map +2 -2
  87. package/package.json +4 -5
  88. package/types/global.d.ts +33 -20
  89. package/router/router.d.ts +0 -21
  90. package/router/router.js +0 -678
  91. package/runtime.d.ts +0 -83
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../runtime.js"],
4
- "sourcesContent": ["import { removeErrorOverlay, showErrorOverlay } from \"./error/errorOverlay\";\r\nimport { setActiveContext, activeContext } from \"./context/context.js\";\r\nimport { nixStore } from \"./hooks/nixStore\";\r\nimport { nixState } from \"./hooks/nixState\";\r\nimport { nixEffect } from \"./hooks/nixEffect\";\r\nimport { nixAsync } from \"./hooks/nixAsync\";\r\nimport { nixMemo } from \"./hooks/nixMemo\";\r\nimport { nixCallback } from \"./hooks/nixCallback\";\r\nimport { nixComputed } from \"./hooks/nixComputed\";\r\nimport { nixDebounce } from \"./hooks/nixDebounce\";\r\nimport { nixInterval } from \"./hooks/nixInterval\";\r\nimport { nixRef } from \"./hooks/nixRef\";\r\nimport { nixLocalStorage } from \"./hooks/nixLocalStorage\";\r\nimport { nixPrevious } from \"./hooks/nixPrevious\";\r\nimport { nixLazy, Suspense } from \"./hooks/nixLazy.js\";\r\nimport { nixForm } from \"./hooks/nixForm.js\";\r\nimport { Path, Button } from \"./custom/index.js\";\r\n\r\n//new imports\r\nimport { nixAsyncCached } from \"./hooks/nixAsyncCache\";\r\nimport { nixAsyncDebounce } from \"./hooks/nixAsyncDebounce\";\r\nimport { nixAsyncQuery } from \"./hooks/nixAsyncQuery\";\r\nimport { nixEffectAlways } from \"./hooks/nixEffect\";\r\nimport { nixEffectOnce } from \"./hooks/nixEffect\";\r\nimport { nixFormAsync } from \"./hooks/nixFormAsync\";\r\nimport { nixLazyAsync } from \"./hooks/nixLazyAsync\";\r\nimport { nixLazyFormAsync } from \"./hooks/nixLazyFormAsync\";\r\nimport createFynix from \"./router/router.js\";\r\n/**\r\n * Symbol for text nodes\r\n * @type {symbol}\r\n */\r\nexport const TEXT = Symbol(\"text\");\r\n\r\n/**\r\n * Symbol for fragments\r\n * @type {symbol}\r\n */\r\nexport const Fragment = Symbol(\"Fragment\");\r\n\r\n/* ---------------------- Constants ---------------------- */\r\nconst BOOLEAN_ATTRS = new Set([\r\n \"checked\",\r\n \"selected\",\r\n \"disabled\",\r\n \"readonly\",\r\n \"multiple\",\r\n \"autoplay\",\r\n \"controls\",\r\n \"loop\",\r\n \"muted\",\r\n \"open\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"seamless\",\r\n \"autofocus\",\r\n \"novalidate\",\r\n \"formnovalidate\",\r\n]);\r\n\r\nconst DOM_PROPERTIES = new Set([\r\n \"value\",\r\n \"checked\",\r\n \"selected\",\r\n \"selectedIndex\",\r\n \"innerHTML\",\r\n \"textContent\",\r\n \"innerText\",\r\n]);\r\n\r\n/* ---------------------- Virtual Node Helpers ---------------------- */\r\n\r\n/**\r\n * Create a virtual text node, supporting reactive state.\r\n * @param {string|number|object} text\r\n * @returns {object} vnode\r\n */\r\nexport function createTextVNode(text) {\r\n if (text == null || text === false)\r\n return { type: TEXT, props: { nodeValue: \"\" }, key: null };\r\n\r\n if (text && typeof text === \"object\" && text._isNixState) {\r\n const vnode = {\r\n type: TEXT,\r\n props: { nodeValue: String(text.value) },\r\n key: null,\r\n _state: text,\r\n _cleanup: null, // FIX: Track subscription cleanup\r\n };\r\n\r\n // FIX: Store unsubscribe function for cleanup\r\n vnode._cleanup = text.subscribe(() => {\r\n if (vnode._domNode) vnode._domNode.nodeValue = String(text.value);\r\n });\r\n\r\n return vnode;\r\n }\r\n\r\n return { type: TEXT, props: { nodeValue: String(text) }, key: null };\r\n}\r\n\r\n/**\r\n * Create a virtual DOM node (element, fragment, or component).\r\n * @param {string|function|symbol} type\r\n * @param {object} [props={}]\r\n * @param {...any} children\r\n * @returns {object} vnode\r\n */\r\nexport function h(type, props = {}, ...children) {\r\n if (props === null || typeof props !== \"object\" || Array.isArray(props))\r\n props = {};\r\n const flatChildren = [];\r\n\r\n for (const c of children.flat(Infinity)) {\r\n if (c == null || c === false) continue;\r\n if (c && typeof c === \"object\" && c._isNixState)\r\n flatChildren.push(createTextVNode(c));\r\n else if (typeof c === \"string\" || typeof c === \"number\")\r\n flatChildren.push(createTextVNode(c));\r\n else if (c?.type === Fragment)\r\n flatChildren.push(\r\n ...(c.props.children || []).filter((x) => x != null && x !== false)\r\n );\r\n else if (c?.type) flatChildren.push(c);\r\n else flatChildren.push(createTextVNode(String(c)));\r\n }\r\n\r\n const key = props.key ?? null;\r\n if (key) delete props.key;\r\n\r\n if (type === Fragment)\r\n return { type: Fragment, props: { children: flatChildren }, key };\r\n return { type, props: { ...props, children: flatChildren }, key };\r\n}\r\n\r\nh.Fragment = ({ children }) => children;\r\nexport const Fynix = h;\r\nFynix.Fragment = h.Fragment;\r\n\r\n/* ---------------------- Component & Hooks ---------------------- */\r\n\r\n// FIX 1: Use WeakMap for automatic garbage collection\r\nconst componentInstances = new WeakMap();\r\nlet rootRenderFn = null;\r\n\r\n// FIX 2: Track pending rerenders to prevent race conditions\r\nconst pendingRerenders = new WeakSet();\r\n\r\n/**\r\n * Begin component context\r\n * @param {object} vnode\r\n * @returns {object} ctx\r\n */\r\nfunction beginComponent(vnode) {\r\n let ctx = componentInstances.get(vnode);\r\n if (!ctx) {\r\n ctx = {\r\n hooks: [],\r\n hookIndex: 0,\r\n effects: [],\r\n cleanups: [],\r\n _vnode: vnode,\r\n _accessedStates: new Set(),\r\n _subscriptions: new Set(),\r\n _subscriptionCleanups: [],\r\n version: 0,\r\n rerender: null,\r\n Component: vnode.type,\r\n _isMounted: false,\r\n _isRerendering: false,\r\n };\r\n componentInstances.set(vnode, ctx);\r\n }\r\n ctx.hookIndex = 0;\r\n ctx._accessedStates.clear();\r\n setActiveContext(ctx);\r\n ctx.version++;\r\n return ctx;\r\n}\r\n\r\n/**\r\n * End component context\r\n */\r\nfunction endComponent() {\r\n const ctx = activeContext;\r\n if (!ctx) return;\r\n\r\n ctx._accessedStates.forEach((state) => {\r\n if (!ctx._subscriptions.has(state)) {\r\n // FIX 3: Debounced rerender with race condition prevention\r\n if (!ctx.rerender) {\r\n let rerenderTimeout = null;\r\n\r\n ctx.rerender = () => {\r\n // Prevent multiple simultaneous rerenders\r\n if (ctx._isRerendering || pendingRerenders.has(ctx)) {\r\n return;\r\n }\r\n\r\n // Clear any pending timeout\r\n if (rerenderTimeout) {\r\n clearTimeout(rerenderTimeout);\r\n }\r\n\r\n // Debounce rerenders\r\n rerenderTimeout = setTimeout(() => {\r\n if (ctx._isRerendering || !ctx._isMounted) return;\r\n\r\n ctx._isRerendering = true;\r\n pendingRerenders.add(ctx);\r\n\r\n try {\r\n removeErrorOverlay();\r\n\r\n const vnode = ctx._vnode;\r\n const oldRendered = vnode._rendered;\r\n\r\n beginComponent(vnode);\r\n const newRendered = ctx.Component(vnode.props);\r\n endComponent();\r\n\r\n vnode._rendered = newRendered;\r\n\r\n const domNode = vnode._domNode;\r\n if (domNode && domNode.parentNode) {\r\n patch(domNode.parentNode, newRendered, oldRendered)\r\n .then(() => {\r\n vnode._domNode = newRendered?._domNode;\r\n })\r\n .finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else if (rootRenderFn) {\r\n rootRenderFn().finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Component rerender error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n\r\n rerenderTimeout = null;\r\n }, 0);\r\n };\r\n }\r\n\r\n const unsub = state.subscribe(() => {\r\n if (ctx.rerender && ctx._isMounted) {\r\n if (typeof queueMicrotask === \"function\")\r\n queueMicrotask(ctx.rerender);\r\n else setTimeout(ctx.rerender, 0);\r\n }\r\n });\r\n ctx._subscriptions.add(state);\r\n ctx._subscriptionCleanups.push(unsub);\r\n }\r\n });\r\n\r\n setActiveContext(null);\r\n}\r\n\r\n/**\r\n * Safely render a component\r\n * @param {function} Component\r\n * @param {object} props\r\n * @returns {object} vnode\r\n */\r\nexport function renderComponent(Component, props = {}) {\r\n const vnode = { type: Component, props };\r\n const ctx = beginComponent(vnode);\r\n ctx.Component = Component;\r\n\r\n // FIX 4: Same debounced rerender pattern\r\n if (!ctx.rerender) {\r\n let rerenderTimeout = null;\r\n\r\n ctx.rerender = () => {\r\n if (ctx._isRerendering || pendingRerenders.has(ctx)) return;\r\n\r\n if (rerenderTimeout) {\r\n clearTimeout(rerenderTimeout);\r\n }\r\n\r\n rerenderTimeout = setTimeout(() => {\r\n if (ctx._isRerendering || !ctx._isMounted) return;\r\n\r\n ctx._isRerendering = true;\r\n pendingRerenders.add(ctx);\r\n\r\n try {\r\n removeErrorOverlay();\r\n\r\n const vnode = ctx._vnode;\r\n const oldRendered = vnode._rendered;\r\n\r\n beginComponent(vnode);\r\n const newRendered = ctx.Component(vnode.props);\r\n endComponent();\r\n\r\n vnode._rendered = newRendered;\r\n\r\n const domNode = vnode._domNode;\r\n if (domNode && domNode.parentNode) {\r\n patch(domNode.parentNode, newRendered, oldRendered)\r\n .then(() => {\r\n vnode._domNode = newRendered?._domNode;\r\n })\r\n .finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else if (rootRenderFn) {\r\n rootRenderFn().finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Component rerender error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n\r\n rerenderTimeout = null;\r\n }, 0);\r\n };\r\n }\r\n\r\n try {\r\n removeErrorOverlay();\r\n const result = Component(props);\r\n ctx._vnode = vnode;\r\n vnode._rendered = result;\r\n ctx._isMounted = true;\r\n return result;\r\n } catch (err) {\r\n console.error(\"[Fynix] Component render error:\", err);\r\n showErrorOverlay(err);\r\n return h(\"div\", { style: \"color:red\" }, `Error: ${err.message}`);\r\n } finally {\r\n endComponent();\r\n }\r\n}\r\n\r\n/* ---------------------- Event Delegation ---------------------- */\r\n\r\nconst delegatedEvents = new Map();\r\nlet eventIdCounter = 1;\r\n\r\nfunction ensureDelegated(eventType) {\r\n if (delegatedEvents.has(eventType)) return;\r\n delegatedEvents.set(eventType, new Map());\r\n document.addEventListener(eventType, (e) => {\r\n let cur = e.target;\r\n while (cur && cur !== document) {\r\n if (cur.nodeType !== 1) break;\r\n const eid = cur._rest_eid;\r\n const map = delegatedEvents.get(eventType);\r\n if (eid != null && map?.has(eid)) {\r\n map.get(eid)(e);\r\n return;\r\n }\r\n cur = cur.parentElement;\r\n }\r\n });\r\n}\r\n\r\nfunction registerDelegatedHandler(el, eventName, fn) {\r\n if (!fn || el.nodeType !== 1) return;\r\n const eid = el._rest_eid ?? (el._rest_eid = ++eventIdCounter);\r\n ensureDelegated(eventName);\r\n delegatedEvents.get(eventName).set(eid, (e) => {\r\n try {\r\n fn.call(el, e);\r\n } catch (err) {\r\n console.error(\"[Fynix] Event handler error:\", err);\r\n showErrorOverlay(err);\r\n }\r\n });\r\n}\r\n\r\n/* ---------------------- Property Setter ---------------------- */\r\n\r\n/**\r\n * Set element property or attribute\r\n * @param {HTMLElement} el\r\n * @param {string} key\r\n * @param {*} value\r\n */\r\nfunction setProperty(el, key, value) {\r\n const k = key.toLowerCase();\r\n\r\n if (key === \"r-class\" || key === \"rc\") {\r\n if (typeof value === \"string\") el.setAttribute(\"class\", value);\r\n else if (value && (value._isNixState || value._isRestState)) {\r\n el.setAttribute(\"class\", value.value);\r\n\r\n // FIX: Track subscription for cleanup\r\n if (!el._fynixCleanups) el._fynixCleanups = [];\r\n const unsub = value.subscribe(() =>\r\n el.setAttribute(\"class\", value.value)\r\n );\r\n el._fynixCleanups.push(unsub);\r\n }\r\n return;\r\n }\r\n\r\n if (key.startsWith(\"r-\")) {\r\n registerDelegatedHandler(el, key.slice(2).toLowerCase(), value);\r\n return;\r\n }\r\n if (key === \"style\" && typeof value === \"object\") {\r\n Object.assign(el.style, value);\r\n return;\r\n }\r\n\r\n // Security: Prevent dangerous attributes\r\n if (key === \"innerHTML\" || key === \"outerHTML\") {\r\n console.warn(\r\n \"[Fynix] Security: innerHTML/outerHTML not allowed. Use textContent or children.\"\r\n );\r\n return;\r\n }\r\n\r\n if (BOOLEAN_ATTRS.has(k)) {\r\n if (value) {\r\n el.setAttribute(k, \"\");\r\n el[k] = true;\r\n } else {\r\n el.removeAttribute(k);\r\n el[k] = false;\r\n }\r\n return;\r\n }\r\n if (DOM_PROPERTIES.has(key)) {\r\n el[key] = value ?? \"\";\r\n return;\r\n }\r\n if (key.startsWith(\"data-\") || key.startsWith(\"aria-\")) {\r\n if (value != null && value !== false) el.setAttribute(key, value);\r\n else el.removeAttribute(key);\r\n return;\r\n }\r\n\r\n // Security: Sanitize href and src attributes\r\n if ((key === \"href\" || key === \"src\") && typeof value === \"string\") {\r\n if (value.trim().toLowerCase().startsWith(\"javascript:\")) {\r\n console.warn(\"[Fynix] Security: javascript: protocol blocked in\", key);\r\n return;\r\n }\r\n }\r\n\r\n if (value != null && value !== false) el.setAttribute(key, value);\r\n}\r\n\r\n/* ---------------------- DOM Creation ---------------------- */\r\n\r\n/**\r\n * Create DOM from vnode\r\n * @param {object|string|number|Promise} vnode\r\n * @param {Node} [existing=null]\r\n * @returns {Promise<Node>}\r\n */\r\nasync function createDom(vnode, existing = null) {\r\n if (vnode == null || vnode === false) return document.createTextNode(\"\");\r\n if (typeof vnode === \"string\" || typeof vnode === \"number\")\r\n return document.createTextNode(String(vnode));\r\n\r\n if (vnode.type === TEXT) {\r\n const textNode =\r\n existing || document.createTextNode(vnode.props.nodeValue ?? \"\");\r\n vnode._domNode = textNode;\r\n return textNode;\r\n }\r\n\r\n // FIX 5: Better async component error handling\r\n if (vnode instanceof Promise) {\r\n const placeholder = document.createTextNode(\"Loading...\");\r\n vnode\r\n .then(async (resolved) => {\r\n try {\r\n const dom = await createDom(resolved);\r\n if (placeholder.parentNode) {\r\n placeholder.replaceWith(dom);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Async component error:\", err);\r\n if (placeholder.parentNode) {\r\n placeholder.textContent = \"Error loading component\";\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(\"[Fynix] Async component promise error:\", err);\r\n if (placeholder.parentNode) {\r\n placeholder.textContent = \"Error loading async component\";\r\n }\r\n });\r\n return placeholder;\r\n }\r\n\r\n if (vnode.type === Fragment) {\r\n const frag = document.createDocumentFragment();\r\n for (const child of vnode.props?.children || [])\r\n frag.appendChild(await createDom(child));\r\n vnode._domNode = frag;\r\n return frag;\r\n }\r\n\r\n if (typeof vnode.type === \"function\") {\r\n const rendered = await renderMaybeAsyncComponent(\r\n vnode.type,\r\n vnode.props,\r\n vnode\r\n );\r\n vnode._rendered = rendered;\r\n const dom = await createDom(rendered);\r\n vnode._domNode = dom;\r\n return dom;\r\n }\r\n\r\n const el = existing || document.createElement(vnode.type);\r\n for (const [k, v] of Object.entries(vnode.props || {}))\r\n if (k !== \"children\") setProperty(el, k, v);\r\n for (const child of vnode.props?.children || [])\r\n el.appendChild(await createDom(child));\r\n vnode._domNode = el;\r\n return el;\r\n}\r\n\r\n/* ---------------------- Async Component Helper ---------------------- */\r\n\r\n/**\r\n * Render async component safely\r\n * @param {function} Component\r\n * @param {object} props\r\n * @param {object} vnode\r\n * @returns {Promise<object>}\r\n */\r\nasync function renderMaybeAsyncComponent(Component, props, vnode) {\r\n const ctx = beginComponent(vnode);\r\n removeErrorOverlay();\r\n try {\r\n const result = await Component(props);\r\n ctx._vnode = vnode;\r\n vnode._rendered = result;\r\n ctx._isMounted = true;\r\n endComponent();\r\n return result ?? null;\r\n } catch (err) {\r\n console.error(\"[Fynix] async render error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isMounted = false;\r\n endComponent();\r\n return h(\"div\", { style: \"color:red\" }, `Error: ${err.message}`);\r\n }\r\n}\r\n\r\n/* ---------------------- Patch / Diff ---------------------- */\r\n\r\n/**\r\n * Patch a parent DOM node based on oldVNode -> newVNode changes\r\n * @param {Node} parent\r\n * @param {object|string|number} newVNode\r\n * @param {object|string|number} oldVNode\r\n * @returns {Promise<void>}\r\n */\r\nexport async function patch(parent, newVNode, oldVNode) {\r\n if (!(parent instanceof Node)) {\r\n console.error(\r\n \"[Fynix] patch() expects a DOM Node, got:\",\r\n typeof parent,\r\n parent\r\n );\r\n return;\r\n }\r\n\r\n if (!newVNode && !oldVNode) return;\r\n\r\n if (!newVNode && oldVNode) {\r\n const domNode = oldVNode._domNode;\r\n if (domNode?.parentNode) domNode.parentNode.removeChild(domNode);\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n if (newVNode && !oldVNode) {\r\n const newDom = await createDom(newVNode);\r\n if (newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n return;\r\n }\r\n\r\n const newIsPrimitive =\r\n typeof newVNode === \"string\" || typeof newVNode === \"number\";\r\n const oldIsPrimitive =\r\n typeof oldVNode === \"string\" || typeof oldVNode === \"number\";\r\n\r\n if (newIsPrimitive || oldIsPrimitive) {\r\n if (newIsPrimitive && oldIsPrimitive && newVNode === oldVNode) return;\r\n const newDom = await createDom(newVNode);\r\n const oldDom = oldVNode._domNode || parent.firstChild;\r\n if (oldDom?.parentNode && newDom instanceof Node) {\r\n oldDom.parentNode.replaceChild(newDom, oldDom);\r\n }\r\n if (oldVNode && typeof oldVNode === \"object\") {\r\n unmountVNode(oldVNode);\r\n }\r\n return;\r\n }\r\n\r\n const newType = newVNode.type;\r\n const oldType = oldVNode.type;\r\n\r\n if (newType !== oldType) {\r\n const newDom = await createDom(newVNode);\r\n const oldDom = oldVNode._domNode;\r\n if (oldDom?.parentNode && newDom instanceof Node) {\r\n oldDom.parentNode.replaceChild(newDom, oldDom);\r\n }\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n if (newType === TEXT) {\r\n const oldDom = oldVNode._domNode;\r\n const newText = newVNode.props.nodeValue ?? \"\";\r\n const oldText = oldVNode.props.nodeValue ?? \"\";\r\n if (newText !== oldText && oldDom) {\r\n oldDom.nodeValue = newText;\r\n }\r\n newVNode._domNode = oldDom;\r\n return;\r\n }\r\n\r\n if (newType === Fragment) {\r\n const newChildren = newVNode.props?.children || [];\r\n const oldChildren = oldVNode.props?.children || [];\r\n await patchChildren(parent, newChildren, oldChildren);\r\n newVNode._domNode = oldVNode._domNode;\r\n return;\r\n }\r\n\r\n // FIX 6: Better component reuse and cleanup\r\n if (typeof newType === \"function\") {\r\n const oldCtx = componentInstances.get(oldVNode);\r\n\r\n if (oldCtx && newType === oldType) {\r\n componentInstances.delete(oldVNode);\r\n componentInstances.set(newVNode, oldCtx);\r\n\r\n oldCtx._vnode = newVNode;\r\n\r\n beginComponent(newVNode);\r\n const rendered = await oldCtx.Component(newVNode.props);\r\n endComponent();\r\n\r\n newVNode._rendered = rendered;\r\n\r\n const oldRendered = oldVNode._rendered;\r\n const oldDom = oldVNode._domNode;\r\n\r\n if (oldDom?.parentNode instanceof Node) {\r\n await patch(oldDom.parentNode, rendered, oldRendered);\r\n newVNode._domNode = rendered?._domNode || oldDom;\r\n }\r\n } else {\r\n const rendered = await renderMaybeAsyncComponent(\r\n newType,\r\n newVNode.props,\r\n newVNode\r\n );\r\n newVNode._rendered = rendered;\r\n\r\n const oldRendered = oldVNode._rendered;\r\n const oldDom = oldVNode._domNode;\r\n\r\n if (oldDom?.parentNode instanceof Node) {\r\n await patch(oldDom.parentNode, rendered, oldRendered);\r\n newVNode._domNode = rendered?._domNode || oldDom;\r\n } else {\r\n const newDom = await createDom(rendered);\r\n if (parent && newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n newVNode._domNode = newDom;\r\n }\r\n\r\n if (oldCtx && newType !== oldType) {\r\n unmountVNode(oldVNode);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const el = oldVNode._domNode;\r\n if (!el || el.nodeType !== 1) {\r\n const newDom = await createDom(newVNode);\r\n if (parent && newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n updateProps(el, newVNode.props, oldVNode.props);\r\n newVNode._domNode = el;\r\n\r\n const newChildren = newVNode.props?.children || [];\r\n const oldChildren = oldVNode.props?.children || [];\r\n await patchChildren(el, newChildren, oldChildren);\r\n}\r\n\r\n/**\r\n * Patch children with keyed reconciliation\r\n * @param {Node} parent\r\n * @param {Array} newChildren\r\n * @param {Array} oldChildren\r\n */\r\nasync function patchChildren(parent, newChildren, oldChildren) {\r\n if (!(parent instanceof Node)) return;\r\n\r\n const hasKeys =\r\n newChildren.some((c) => c?.key != null) ||\r\n oldChildren.some((c) => c?.key != null);\r\n\r\n if (!hasKeys) {\r\n const maxLen = Math.max(newChildren.length, oldChildren.length);\r\n for (let i = 0; i < maxLen; i++) {\r\n const newChild = newChildren[i];\r\n const oldChild = oldChildren[i];\r\n\r\n if (i >= newChildren.length) {\r\n const dom = oldChild?._domNode;\r\n if (dom?.parentNode) dom.parentNode.removeChild(dom);\r\n unmountVNode(oldChild);\r\n } else if (i >= oldChildren.length) {\r\n const newDom = await createDom(newChild);\r\n if (newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n } else {\r\n await patch(parent, newChild, oldChild);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const oldKeyMap = new Map();\r\n const oldIndexMap = new Map();\r\n\r\n oldChildren.forEach((child, idx) => {\r\n if (child?.key != null) {\r\n oldKeyMap.set(child.key, child);\r\n oldIndexMap.set(child.key, idx);\r\n }\r\n });\r\n\r\n const newKeySet = new Set(\r\n newChildren.filter((c) => c?.key != null).map((c) => c.key)\r\n );\r\n\r\n oldChildren.forEach((oldChild) => {\r\n if (oldChild?.key != null && !newKeySet.has(oldChild.key)) {\r\n const dom = oldChild._domNode;\r\n if (dom?.parentNode) dom.parentNode.removeChild(dom);\r\n unmountVNode(oldChild);\r\n }\r\n });\r\n\r\n for (let i = 0; i < newChildren.length; i++) {\r\n const newChild = newChildren[i];\r\n const key = newChild?.key;\r\n\r\n if (key != null && oldKeyMap.has(key)) {\r\n const oldChild = oldKeyMap.get(key);\r\n const oldDom = oldChild._domNode;\r\n const childNodes = Array.from(parent.childNodes);\r\n const currentPos = childNodes.indexOf(oldDom);\r\n const desiredPos = i;\r\n\r\n if (currentPos !== desiredPos) {\r\n const refNode = childNodes[desiredPos] || null;\r\n if (oldDom && oldDom.parentNode === parent) {\r\n parent.insertBefore(oldDom, refNode);\r\n }\r\n }\r\n\r\n await patch(parent, newChild, oldChild);\r\n } else {\r\n const newDom = await createDom(newChild);\r\n if (newDom instanceof Node) {\r\n const childNodes = Array.from(parent.childNodes);\r\n const refNode = childNodes[i] || null;\r\n parent.insertBefore(newDom, refNode);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* ---------------------- Unmount ---------------------- */\r\n\r\n/**\r\n * Unmount vnode recursively and cleanup\r\n * @param {object} vnode\r\n */\r\nfunction unmountVNode(vnode) {\r\n if (!vnode) return;\r\n\r\n // FIX: Clean up text node subscription\r\n if (vnode._cleanup && typeof vnode._cleanup === \"function\") {\r\n try {\r\n vnode._cleanup();\r\n } catch (e) {\r\n console.error(\"[Fynix] Text vnode cleanup error:\", e);\r\n }\r\n vnode._cleanup = null;\r\n }\r\n\r\n if (typeof vnode.type === \"function\") {\r\n const ctx = componentInstances.get(vnode);\r\n if (ctx) {\r\n // FIX 7: Mark as unmounted to prevent rerender attempts\r\n ctx._isMounted = false;\r\n\r\n ctx._subscriptionCleanups.forEach((u) => {\r\n try {\r\n u();\r\n } catch (e) {\r\n console.error(\"[Fynix] Cleanup error:\", e);\r\n }\r\n });\r\n\r\n ctx.cleanups.forEach((c) => {\r\n try {\r\n c?.();\r\n } catch (e) {\r\n console.error(\"[Fynix] Effect cleanup error:\", e);\r\n }\r\n });\r\n\r\n ctx._subscriptions.clear();\r\n ctx._accessedStates.clear();\r\n ctx._subscriptionCleanups = [];\r\n ctx.cleanups = [];\r\n ctx.hooks = [];\r\n ctx.effects = [];\r\n ctx.rerender = null;\r\n ctx._vnode = null;\r\n\r\n componentInstances.delete(vnode);\r\n pendingRerenders.delete(ctx);\r\n }\r\n unmountVNode(vnode._rendered);\r\n return;\r\n }\r\n\r\n if (vnode._domNode && vnode._domNode.nodeType === 1) {\r\n const eid = vnode._domNode._rest_eid;\r\n if (eid) {\r\n delegatedEvents.forEach((map) => map.delete(eid));\r\n }\r\n\r\n // FIX: Clean up reactive class subscriptions\r\n if (vnode._domNode._fynixCleanups) {\r\n vnode._domNode._fynixCleanups.forEach((cleanup) => {\r\n try {\r\n cleanup();\r\n } catch (e) {\r\n console.error(\"[Fynix] Element cleanup error:\", e);\r\n }\r\n });\r\n vnode._domNode._fynixCleanups = null;\r\n }\r\n }\r\n\r\n if (vnode.props?.children)\r\n vnode.props.children.forEach((c) => unmountVNode(c));\r\n\r\n vnode._domNode = null;\r\n vnode._rendered = null;\r\n}\r\n\r\n/* ---------------------- Update Props ---------------------- */\r\n\r\n/**\r\n * Update DOM props\r\n * @param {HTMLElement} el\r\n * @param {object} newProps\r\n * @param {object} oldProps\r\n */\r\nfunction updateProps(el, newProps = {}, oldProps = {}) {\r\n if (!el || el.nodeType !== 1) return;\r\n\r\n for (const k of Object.keys(oldProps)) {\r\n if (k === \"children\") continue;\r\n if (!(k in newProps)) {\r\n if (k.startsWith(\"r-\")) {\r\n const eid = el._rest_eid;\r\n if (eid && delegatedEvents.has(k.slice(2).toLowerCase())) {\r\n delegatedEvents.get(k.slice(2).toLowerCase()).delete(eid);\r\n }\r\n } else if (BOOLEAN_ATTRS.has(k.toLowerCase())) {\r\n el.removeAttribute(k);\r\n el[k] = false;\r\n } else if (DOM_PROPERTIES.has(k)) el[k] = \"\";\r\n else el.removeAttribute(k);\r\n }\r\n }\r\n\r\n for (const [k, v] of Object.entries(newProps)) {\r\n if (k === \"children\") continue;\r\n if (oldProps[k] !== v) setProperty(el, k, v);\r\n }\r\n}\r\n\r\n/* ---------------------- Mount ---------------------- */\r\n\r\n/**\r\n * Mount the app component to a root DOM node\r\n * @param {function} AppComponent\r\n * @param {string|Element} root\r\n * @param {boolean} [hydrate=false]\r\n * @param {object} [props={}]\r\n */\r\nexport function mount(AppComponent, root, hydrate = false, props = {}) {\r\n if (typeof root === \"string\") {\r\n const element = document.querySelector(root);\r\n if (!element) {\r\n console.error(\r\n \"[Fynix] Mount error: Element not found for selector:\",\r\n root\r\n );\r\n return;\r\n }\r\n root = element;\r\n }\r\n\r\n if (!(root instanceof Element)) {\r\n console.error(\"[Fynix] Mount error: Invalid root element\", root);\r\n return;\r\n }\r\n\r\n let Component = AppComponent;\r\n let oldVNode = null;\r\n let currentProps = props;\r\n let appVNode = null;\r\n let isRendering = false;\r\n\r\n async function renderApp() {\r\n // FIX 8: Prevent concurrent renders\r\n if (isRendering) {\r\n return;\r\n }\r\n\r\n isRendering = true;\r\n\r\n try {\r\n removeErrorOverlay();\r\n const propsToUse =\r\n window.__lastRouteProps ||\r\n window.__fynix__?.lastRouteProps ||\r\n currentProps;\r\n\r\n if (!appVNode) {\r\n appVNode = { type: Component, props: propsToUse, key: null };\r\n\r\n if (root instanceof Element) {\r\n root.innerHTML = \"\";\r\n const dom = await createDom(appVNode);\r\n if (dom instanceof Node) {\r\n root.appendChild(dom);\r\n }\r\n } else {\r\n console.error(\"[Fynix] Mount error: root is not a DOM Element\", root);\r\n return;\r\n }\r\n\r\n oldVNode = appVNode;\r\n } else {\r\n appVNode.props = propsToUse;\r\n\r\n if (root instanceof Node) {\r\n await patch(root, appVNode, oldVNode);\r\n oldVNode = appVNode;\r\n } else {\r\n console.error(\"[Fynix] Patch error: root is not a DOM Node\", root);\r\n return;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Mount error:\", err);\r\n showErrorOverlay(err);\r\n } finally {\r\n isRendering = false;\r\n }\r\n }\r\n\r\n rootRenderFn = renderApp;\r\n window.__fynix__ = window.__fynix__ || {};\r\n window.__fynix__.rerender = renderApp;\r\n renderApp();\r\n\r\n if (import.meta.hot) {\r\n if (!window.__fynix__.hmr) {\r\n window.__fynix__.hmr = async ({ mod }) => {\r\n try {\r\n const UpdatedComponent = mod.App || mod.default;\r\n if (UpdatedComponent) {\r\n Component = UpdatedComponent;\r\n if (appVNode) {\r\n appVNode.type = UpdatedComponent;\r\n }\r\n window.__fynix__.rerender?.();\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix HMR] update error:\", err);\r\n showErrorOverlay(err);\r\n }\r\n };\r\n import.meta.hot.accept();\r\n }\r\n }\r\n}\r\n\r\n/* ---------------------- Exports ---------------------- */\r\n\r\nexport {\r\n nixState,\r\n nixEffect,\r\n nixStore,\r\n nixInterval,\r\n nixAsync,\r\n nixCallback,\r\n nixComputed,\r\n nixMemo,\r\n nixDebounce,\r\n nixPrevious,\r\n nixLocalStorage,\r\n nixRef,\r\n nixLazy,\r\n Suspense,\r\n nixForm,\r\n nixAsyncCached,\r\n nixAsyncDebounce,\r\n nixAsyncQuery,\r\n nixEffectAlways,\r\n nixEffectOnce,\r\n nixFormAsync,\r\n nixLazyAsync,\r\n nixLazyFormAsync,\r\n Path,\r\n Button,\r\n createFynix,\r\n};\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { removeErrorOverlay, showErrorOverlay } from \"./error/errorOverlay\";\r\nimport { setActiveContext, activeContext } from \"./context/context.js\";\r\nimport { nixStore } from \"./hooks/nixStore\";\r\nimport { nixState } from \"./hooks/nixState\";\r\nimport { nixEffect } from \"./hooks/nixEffect\";\r\nimport { nixAsync } from \"./hooks/nixAsync\";\r\nimport { nixMemo } from \"./hooks/nixMemo\";\r\nimport { nixCallback } from \"./hooks/nixCallback\";\r\nimport { nixComputed } from \"./hooks/nixComputed\";\r\nimport { nixDebounce } from \"./hooks/nixDebounce\";\r\nimport { nixInterval } from \"./hooks/nixInterval\";\r\nimport { nixRef } from \"./hooks/nixRef\";\r\nimport { nixLocalStorage } from \"./hooks/nixLocalStorage\";\r\nimport { nixPrevious } from \"./hooks/nixPrevious\";\r\nimport { nixLazy, Suspense } from \"./hooks/nixLazy.js\";\r\nimport { nixForm } from \"./hooks/nixForm.js\";\r\nimport { Path, Button } from \"./custom/index.js\";\r\n\r\n//new imports\r\nimport { nixAsyncCached } from \"./hooks/nixAsyncCache\";\r\nimport { nixAsyncDebounce } from \"./hooks/nixAsyncDebounce\";\r\nimport { nixAsyncQuery } from \"./hooks/nixAsyncQuery\";\r\nimport { nixEffectAlways } from \"./hooks/nixEffect\";\r\nimport { nixEffectOnce } from \"./hooks/nixEffect\";\r\nimport { nixFormAsync } from \"./hooks/nixFormAsync\";\r\nimport { nixLazyAsync } from \"./hooks/nixLazyAsync\";\r\nimport { nixLazyFormAsync } from \"./hooks/nixLazyFormAsync\";\r\nimport createFynix from \"./router/router.js\";\r\n/**\r\n * Symbol for text nodes\r\n * @type {symbol}\r\n */\r\nexport const TEXT = Symbol(\"text\");\r\n\r\n/**\r\n * Symbol for fragments\r\n * @type {symbol}\r\n */\r\nexport const Fragment = Symbol(\"Fragment\");\r\n\r\n/* ---------------------- Constants ---------------------- */\r\nconst BOOLEAN_ATTRS = new Set([\r\n \"checked\",\r\n \"selected\",\r\n \"disabled\",\r\n \"readonly\",\r\n \"multiple\",\r\n \"autoplay\",\r\n \"controls\",\r\n \"loop\",\r\n \"muted\",\r\n \"open\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"seamless\",\r\n \"autofocus\",\r\n \"novalidate\",\r\n \"formnovalidate\",\r\n]);\r\n\r\nconst DOM_PROPERTIES = new Set([\r\n \"value\",\r\n \"checked\",\r\n \"selected\",\r\n \"selectedIndex\",\r\n \"innerHTML\",\r\n \"textContent\",\r\n \"innerText\",\r\n]);\r\n\r\n/* ---------------------- Virtual Node Helpers ---------------------- */\r\n\r\n/**\r\n * Create a virtual text node, supporting reactive state.\r\n * @param {string|number|object} text\r\n * @returns {object} vnode\r\n */\r\nexport function createTextVNode(text) {\r\n if (text == null || text === false)\r\n return { type: TEXT, props: { nodeValue: \"\" }, key: null };\r\n\r\n if (text && typeof text === \"object\" && text._isNixState) {\r\n const vnode = {\r\n type: TEXT,\r\n props: { nodeValue: String(text.value) },\r\n key: null,\r\n _state: text,\r\n _cleanup: null, // FIX: Track subscription cleanup\r\n };\r\n\r\n // FIX: Store unsubscribe function for cleanup\r\n vnode._cleanup = text.subscribe(() => {\r\n if (vnode._domNode) vnode._domNode.nodeValue = String(text.value);\r\n });\r\n\r\n return vnode;\r\n }\r\n\r\n return { type: TEXT, props: { nodeValue: String(text) }, key: null };\r\n}\r\n\r\n/**\r\n * Create a virtual DOM node (element, fragment, or component).\r\n * @param {string|function|symbol} type\r\n * @param {object} [props={}]\r\n * @param {...any} children\r\n * @returns {object} vnode\r\n */\r\nexport function h(type, props = {}, ...children) {\r\n if (props === null || typeof props !== \"object\" || Array.isArray(props))\r\n props = {};\r\n const flatChildren = [];\r\n\r\n for (const c of children.flat(Infinity)) {\r\n if (c == null || c === false) continue;\r\n if (c && typeof c === \"object\" && c._isNixState)\r\n flatChildren.push(createTextVNode(c));\r\n else if (typeof c === \"string\" || typeof c === \"number\")\r\n flatChildren.push(createTextVNode(c));\r\n else if (c?.type === Fragment)\r\n flatChildren.push(\r\n ...(c.props.children || []).filter((x) => x != null && x !== false),\r\n );\r\n else if (c?.type) flatChildren.push(c);\r\n else flatChildren.push(createTextVNode(String(c)));\r\n }\r\n\r\n const key = props.key ?? null;\r\n if (key) delete props.key;\r\n\r\n if (type === Fragment)\r\n return { type: Fragment, props: { children: flatChildren }, key };\r\n return { type, props: { ...props, children: flatChildren }, key };\r\n}\r\n\r\nh.Fragment = ({ children }) => children;\r\nexport const Fynix = h;\r\nFynix.Fragment = h.Fragment;\r\n\r\n/* ---------------------- Component & Hooks ---------------------- */\r\n\r\n// FIX 1: Use WeakMap for automatic garbage collection\r\nconst componentInstances = new WeakMap();\r\nlet rootRenderFn = null;\r\n\r\n// FIX 2: Track pending rerenders to prevent race conditions\r\nconst pendingRerenders = new WeakSet();\r\n\r\n/**\r\n * Begin component context\r\n * @param {object} vnode\r\n * @returns {object} ctx\r\n */\r\nfunction beginComponent(vnode) {\r\n let ctx = componentInstances.get(vnode);\r\n if (!ctx) {\r\n ctx = {\r\n hooks: [],\r\n hookIndex: 0,\r\n effects: [],\r\n cleanups: [],\r\n _vnode: vnode,\r\n _accessedStates: new Set(),\r\n _subscriptions: new Set(),\r\n _subscriptionCleanups: [],\r\n version: 0,\r\n /** @type {undefined | (() => void)} */\r\n rerender: undefined,\r\n Component: vnode.type,\r\n _isMounted: false,\r\n _isRerendering: false,\r\n };\r\n componentInstances.set(vnode, ctx);\r\n }\r\n ctx.hookIndex = 0;\r\n ctx._accessedStates.clear();\r\n setActiveContext(ctx);\r\n ctx.version++;\r\n return ctx;\r\n}\r\n\r\n/**\r\n * End component context\r\n */\r\nfunction endComponent() {\r\n const ctx = activeContext;\r\n if (!ctx) return;\r\n\r\n ctx._accessedStates.forEach((state) => {\r\n if (!ctx._subscriptions.has(state)) {\r\n // FIX 3: Debounced rerender with race condition prevention\r\n if (!ctx.rerender) {\r\n let rerenderTimeout = null;\r\n /**\r\n * @type {() => void}\r\n */\r\n ctx.rerender = function rerender() {\r\n // Prevent multiple simultaneous rerenders\r\n if (ctx._isRerendering || pendingRerenders.has(ctx)) {\r\n return;\r\n }\r\n\r\n // Clear any pending timeout\r\n if (rerenderTimeout) {\r\n clearTimeout(rerenderTimeout);\r\n }\r\n\r\n // Debounce rerenders\r\n rerenderTimeout = setTimeout(() => {\r\n if (ctx._isRerendering || !ctx._isMounted) return;\r\n\r\n ctx._isRerendering = true;\r\n pendingRerenders.add(ctx);\r\n\r\n try {\r\n removeErrorOverlay();\r\n\r\n const vnode = ctx._vnode;\r\n const oldRendered = vnode._rendered;\r\n\r\n beginComponent(vnode);\r\n const newRendered = ctx.Component(vnode.props);\r\n endComponent();\r\n\r\n vnode._rendered = newRendered;\r\n\r\n const domNode = vnode._domNode;\r\n if (domNode && domNode.parentNode) {\r\n patch(domNode.parentNode, newRendered, oldRendered)\r\n .then(() => {\r\n vnode._domNode = newRendered?._domNode;\r\n })\r\n .finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else if (rootRenderFn) {\r\n rootRenderFn().finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Component rerender error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n\r\n rerenderTimeout = null;\r\n }, 0);\r\n };\r\n }\r\n\r\n const unsub = state.subscribe(() => {\r\n if (ctx.rerender && ctx._isMounted) {\r\n if (typeof queueMicrotask === \"function\")\r\n queueMicrotask(() => ctx.rerender());\r\n else setTimeout(ctx.rerender, 0);\r\n }\r\n });\r\n ctx._subscriptions.add(state);\r\n ctx._subscriptionCleanups.push(unsub);\r\n }\r\n });\r\n\r\n setActiveContext(null);\r\n}\r\n\r\n/**\r\n * Safely render a component\r\n * @param {function} Component\r\n * @param {object} props\r\n * @returns {object} vnode\r\n */\r\nexport function renderComponent(Component, props = {}) {\r\n const vnode = { type: Component, props };\r\n const ctx = beginComponent(vnode);\r\n ctx.Component = Component;\r\n\r\n // FIX 4: Same debounced rerender pattern\r\n if (!ctx.rerender) {\r\n let rerenderTimeout = null;\r\n\r\n ctx.rerender = () => {\r\n if (ctx._isRerendering || pendingRerenders.has(ctx)) return;\r\n\r\n if (rerenderTimeout) {\r\n clearTimeout(rerenderTimeout);\r\n }\r\n\r\n rerenderTimeout = setTimeout(() => {\r\n if (ctx._isRerendering || !ctx._isMounted) return;\r\n\r\n ctx._isRerendering = true;\r\n pendingRerenders.add(ctx);\r\n\r\n try {\r\n removeErrorOverlay();\r\n\r\n const vnode = ctx._vnode;\r\n const oldRendered = vnode._rendered;\r\n\r\n beginComponent(vnode);\r\n const newRendered = ctx.Component(vnode.props);\r\n endComponent();\r\n\r\n vnode._rendered = newRendered;\r\n\r\n const domNode = vnode._domNode;\r\n if (domNode && domNode.parentNode) {\r\n patch(domNode.parentNode, newRendered, oldRendered)\r\n .then(() => {\r\n vnode._domNode = newRendered?._domNode;\r\n })\r\n .finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else if (rootRenderFn) {\r\n rootRenderFn().finally(() => {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n });\r\n } else {\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Component rerender error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isRerendering = false;\r\n pendingRerenders.delete(ctx);\r\n }\r\n\r\n rerenderTimeout = null;\r\n }, 0);\r\n };\r\n }\r\n\r\n try {\r\n removeErrorOverlay();\r\n const result = Component(props);\r\n ctx._vnode = vnode;\r\n vnode._rendered = result;\r\n ctx._isMounted = true;\r\n return result;\r\n } catch (err) {\r\n console.error(\"[Fynix] Component render error:\", err);\r\n showErrorOverlay(err);\r\n return h(\"div\", { style: \"color:red\" }, `Error: ${err.message}`);\r\n } finally {\r\n endComponent();\r\n }\r\n}\r\n\r\n/* ---------------------- Event Delegation ---------------------- */\r\n\r\nconst delegatedEvents = new Map();\r\nlet eventIdCounter = 1;\r\n\r\nfunction ensureDelegated(eventType) {\r\n if (delegatedEvents.has(eventType)) return;\r\n delegatedEvents.set(eventType, new Map());\r\n document.addEventListener(eventType, (e) => {\r\n let cur = e.target;\r\n while (cur && cur !== document) {\r\n if (cur.nodeType !== 1) break;\r\n const eid = cur._rest_eid;\r\n const map = delegatedEvents.get(eventType);\r\n if (eid != null && map?.has(eid)) {\r\n map.get(eid)(e);\r\n return;\r\n }\r\n cur = cur.parentElement;\r\n }\r\n });\r\n}\r\n\r\nfunction registerDelegatedHandler(el, eventName, fn) {\r\n if (!fn || el.nodeType !== 1) return;\r\n const eid = el._rest_eid ?? (el._rest_eid = ++eventIdCounter);\r\n ensureDelegated(eventName);\r\n delegatedEvents.get(eventName).set(eid, (e) => {\r\n try {\r\n fn.call(el, e);\r\n } catch (err) {\r\n console.error(\"[Fynix] Event handler error:\", err);\r\n showErrorOverlay(err);\r\n }\r\n });\r\n}\r\n\r\n/* ---------------------- Property Setter ---------------------- */\r\n\r\n/**\r\n * Set element property or attribute\r\n * @param {HTMLElement} el\r\n * @param {string} key\r\n * @param {*} value\r\n */\r\nfunction setProperty(el, key, value) {\r\n const k = key.toLowerCase();\r\n\r\n if (key === \"r-class\" || key === \"rc\") {\r\n if (typeof value === \"string\") el.setAttribute(\"class\", value);\r\n else if (value && (value._isNixState || value._isRestState)) {\r\n el.setAttribute(\"class\", value.value);\r\n\r\n // FIX: Track subscription for cleanup\r\n if (!el._fynixCleanups) el._fynixCleanups = [];\r\n const unsub = value.subscribe(() =>\r\n el.setAttribute(\"class\", value.value),\r\n );\r\n el._fynixCleanups.push(unsub);\r\n }\r\n return;\r\n }\r\n\r\n if (key.startsWith(\"r-\")) {\r\n registerDelegatedHandler(el, key.slice(2).toLowerCase(), value);\r\n return;\r\n }\r\n if (key === \"style\" && typeof value === \"object\") {\r\n Object.assign(el.style, value);\r\n return;\r\n }\r\n\r\n // Security: Prevent dangerous attributes\r\n if (key === \"innerHTML\" || key === \"outerHTML\") {\r\n console.warn(\r\n \"[Fynix] Security: innerHTML/outerHTML not allowed. Use textContent or children.\",\r\n );\r\n return;\r\n }\r\n\r\n if (BOOLEAN_ATTRS.has(k)) {\r\n if (value) {\r\n el.setAttribute(k, \"\");\r\n el[k] = true;\r\n } else {\r\n el.removeAttribute(k);\r\n el[k] = false;\r\n }\r\n return;\r\n }\r\n if (DOM_PROPERTIES.has(key)) {\r\n el[key] = value ?? \"\";\r\n return;\r\n }\r\n if (key.startsWith(\"data-\") || key.startsWith(\"aria-\")) {\r\n if (value != null && value !== false) el.setAttribute(key, value);\r\n else el.removeAttribute(key);\r\n return;\r\n }\r\n\r\n // Security: Sanitize href and src attributes\r\n if ((key === \"href\" || key === \"src\") && typeof value === \"string\") {\r\n if (value.trim().toLowerCase().startsWith(\"javascript:\")) {\r\n console.warn(\"[Fynix] Security: javascript: protocol blocked in\", key);\r\n return;\r\n }\r\n }\r\n\r\n if (value != null && value !== false) el.setAttribute(key, value);\r\n}\r\n\r\n/* ---------------------- DOM Creation ---------------------- */\r\n\r\n/**\r\n * Create DOM from vnode\r\n * @param {object|string|number|Promise} vnode\r\n * @param {Node} [existing=null]\r\n * @returns {Promise<Node>}\r\n */\r\nasync function createDom(vnode, existing = null) {\r\n if (vnode == null || vnode === false) return document.createTextNode(\"\");\r\n if (typeof vnode === \"string\" || typeof vnode === \"number\")\r\n return document.createTextNode(String(vnode));\r\n\r\n if (vnode.type === TEXT) {\r\n const textNode =\r\n existing || document.createTextNode(vnode.props.nodeValue ?? \"\");\r\n vnode._domNode = textNode;\r\n return textNode;\r\n }\r\n\r\n // FIX 5: Better async component error handling\r\n if (vnode instanceof Promise) {\r\n const placeholder = document.createTextNode(\"Loading...\");\r\n vnode\r\n .then(async (resolved) => {\r\n try {\r\n const dom = await createDom(resolved);\r\n if (placeholder.parentNode) {\r\n placeholder.replaceWith(dom);\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Async component error:\", err);\r\n if (placeholder.parentNode) {\r\n placeholder.textContent = \"Error loading component\";\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(\"[Fynix] Async component promise error:\", err);\r\n if (placeholder.parentNode) {\r\n placeholder.textContent = \"Error loading async component\";\r\n }\r\n });\r\n return placeholder;\r\n }\r\n\r\n if (vnode.type === Fragment) {\r\n const frag = document.createDocumentFragment();\r\n for (const child of vnode.props?.children || [])\r\n frag.appendChild(await createDom(child));\r\n vnode._domNode = frag;\r\n return frag;\r\n }\r\n\r\n if (typeof vnode.type === \"function\") {\r\n const rendered = await renderMaybeAsyncComponent(\r\n vnode.type,\r\n vnode.props,\r\n vnode,\r\n );\r\n vnode._rendered = rendered;\r\n const dom = await createDom(rendered);\r\n vnode._domNode = dom;\r\n return dom;\r\n }\r\n\r\n const el = existing || document.createElement(vnode.type);\r\n for (const [k, v] of Object.entries(vnode.props || {}))\r\n if (k !== \"children\") setProperty(el, k, v);\r\n for (const child of vnode.props?.children || [])\r\n el.appendChild(await createDom(child));\r\n vnode._domNode = el;\r\n return el;\r\n}\r\n\r\n/* ---------------------- Async Component Helper ---------------------- */\r\n\r\n/**\r\n * Render async component safely\r\n * @param {function} Component\r\n * @param {object} props\r\n * @param {object} vnode\r\n * @returns {Promise<object>}\r\n */\r\nasync function renderMaybeAsyncComponent(Component, props, vnode) {\r\n const ctx = beginComponent(vnode);\r\n removeErrorOverlay();\r\n try {\r\n const result = await Component(props);\r\n ctx._vnode = vnode;\r\n vnode._rendered = result;\r\n ctx._isMounted = true;\r\n endComponent();\r\n return result ?? null;\r\n } catch (err) {\r\n console.error(\"[Fynix] async render error:\", err);\r\n showErrorOverlay(err);\r\n ctx._isMounted = false;\r\n endComponent();\r\n return h(\"div\", { style: \"color:red\" }, `Error: ${err.message}`);\r\n }\r\n}\r\n\r\n/* ---------------------- Patch / Diff ---------------------- */\r\n\r\n/**\r\n * Patch a parent DOM node based on oldVNode -> newVNode changes\r\n * @param {Node} parent\r\n * @param {object|string|number} newVNode\r\n * @param {object|string|number} oldVNode\r\n * @returns {Promise<void>}\r\n */\r\nexport async function patch(parent, newVNode, oldVNode) {\r\n if (!(parent instanceof Node)) {\r\n console.error(\r\n \"[Fynix] patch() expects a DOM Node, got:\",\r\n typeof parent,\r\n parent,\r\n );\r\n return;\r\n }\r\n\r\n if (!newVNode && !oldVNode) return;\r\n\r\n if (!newVNode && oldVNode) {\r\n const domNode = oldVNode._domNode;\r\n if (domNode?.parentNode) domNode.parentNode.removeChild(domNode);\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n if (newVNode && !oldVNode) {\r\n const newDom = await createDom(newVNode);\r\n if (newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n return;\r\n }\r\n\r\n const newIsPrimitive =\r\n typeof newVNode === \"string\" || typeof newVNode === \"number\";\r\n const oldIsPrimitive =\r\n typeof oldVNode === \"string\" || typeof oldVNode === \"number\";\r\n\r\n if (newIsPrimitive || oldIsPrimitive) {\r\n if (newIsPrimitive && oldIsPrimitive && newVNode === oldVNode) return;\r\n const newDom = await createDom(newVNode);\r\n const oldDom = oldVNode._domNode || parent.firstChild;\r\n if (oldDom?.parentNode && newDom instanceof Node) {\r\n oldDom.parentNode.replaceChild(newDom, oldDom);\r\n }\r\n if (oldVNode && typeof oldVNode === \"object\") {\r\n unmountVNode(oldVNode);\r\n }\r\n return;\r\n }\r\n\r\n const newType = newVNode.type;\r\n const oldType = oldVNode.type;\r\n\r\n if (newType !== oldType) {\r\n const newDom = await createDom(newVNode);\r\n const oldDom = oldVNode._domNode;\r\n if (oldDom?.parentNode && newDom instanceof Node) {\r\n oldDom.parentNode.replaceChild(newDom, oldDom);\r\n }\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n if (newType === TEXT) {\r\n const oldDom = oldVNode._domNode;\r\n const newText = newVNode.props.nodeValue ?? \"\";\r\n const oldText = oldVNode.props.nodeValue ?? \"\";\r\n if (newText !== oldText && oldDom) {\r\n oldDom.nodeValue = newText;\r\n }\r\n newVNode._domNode = oldDom;\r\n return;\r\n }\r\n\r\n if (newType === Fragment) {\r\n const newChildren = newVNode.props?.children || [];\r\n const oldChildren = oldVNode.props?.children || [];\r\n await patchChildren(parent, newChildren, oldChildren);\r\n newVNode._domNode = oldVNode._domNode;\r\n return;\r\n }\r\n\r\n // FIX 6: Better component reuse and cleanup\r\n if (typeof newType === \"function\") {\r\n const oldCtx = componentInstances.get(oldVNode);\r\n\r\n if (oldCtx && newType === oldType) {\r\n componentInstances.delete(oldVNode);\r\n componentInstances.set(newVNode, oldCtx);\r\n\r\n oldCtx._vnode = newVNode;\r\n\r\n beginComponent(newVNode);\r\n const rendered = await oldCtx.Component(newVNode.props);\r\n endComponent();\r\n\r\n newVNode._rendered = rendered;\r\n\r\n const oldRendered = oldVNode._rendered;\r\n const oldDom = oldVNode._domNode;\r\n\r\n if (oldDom?.parentNode instanceof Node) {\r\n await patch(oldDom.parentNode, rendered, oldRendered);\r\n newVNode._domNode = rendered?._domNode || oldDom;\r\n }\r\n } else {\r\n const rendered = await renderMaybeAsyncComponent(\r\n newType,\r\n newVNode.props,\r\n newVNode,\r\n );\r\n newVNode._rendered = rendered;\r\n\r\n const oldRendered = oldVNode._rendered;\r\n const oldDom = oldVNode._domNode;\r\n\r\n if (oldDom?.parentNode instanceof Node) {\r\n await patch(oldDom.parentNode, rendered, oldRendered);\r\n newVNode._domNode = rendered?._domNode || oldDom;\r\n } else {\r\n const newDom = await createDom(rendered);\r\n if (parent && newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n newVNode._domNode = newDom;\r\n }\r\n\r\n if (oldCtx && newType !== oldType) {\r\n unmountVNode(oldVNode);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const el = oldVNode._domNode;\r\n if (!el || el.nodeType !== 1) {\r\n const newDom = await createDom(newVNode);\r\n if (parent && newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n unmountVNode(oldVNode);\r\n return;\r\n }\r\n\r\n updateProps(el, newVNode.props, oldVNode.props);\r\n newVNode._domNode = el;\r\n\r\n const newChildren = newVNode.props?.children || [];\r\n const oldChildren = oldVNode.props?.children || [];\r\n await patchChildren(el, newChildren, oldChildren);\r\n}\r\n\r\n/**\r\n * Patch children with keyed reconciliation\r\n * @param {Node} parent\r\n * @param {Array} newChildren\r\n * @param {Array} oldChildren\r\n */\r\nasync function patchChildren(parent, newChildren, oldChildren) {\r\n if (!(parent instanceof Node)) return;\r\n\r\n const hasKeys =\r\n newChildren.some((c) => c?.key != null) ||\r\n oldChildren.some((c) => c?.key != null);\r\n\r\n if (!hasKeys) {\r\n const maxLen = Math.max(newChildren.length, oldChildren.length);\r\n for (let i = 0; i < maxLen; i++) {\r\n const newChild = newChildren[i];\r\n const oldChild = oldChildren[i];\r\n\r\n if (i >= newChildren.length) {\r\n const dom = oldChild?._domNode;\r\n if (dom?.parentNode) dom.parentNode.removeChild(dom);\r\n unmountVNode(oldChild);\r\n } else if (i >= oldChildren.length) {\r\n const newDom = await createDom(newChild);\r\n if (newDom instanceof Node) {\r\n parent.appendChild(newDom);\r\n }\r\n } else {\r\n await patch(parent, newChild, oldChild);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const oldKeyMap = new Map();\r\n const oldIndexMap = new Map();\r\n\r\n oldChildren.forEach((child, idx) => {\r\n if (child?.key != null) {\r\n oldKeyMap.set(child.key, child);\r\n oldIndexMap.set(child.key, idx);\r\n }\r\n });\r\n\r\n const newKeySet = new Set(\r\n newChildren.filter((c) => c?.key != null).map((c) => c.key),\r\n );\r\n\r\n oldChildren.forEach((oldChild) => {\r\n if (oldChild?.key != null && !newKeySet.has(oldChild.key)) {\r\n const dom = oldChild._domNode;\r\n if (dom?.parentNode) dom.parentNode.removeChild(dom);\r\n unmountVNode(oldChild);\r\n }\r\n });\r\n\r\n for (let i = 0; i < newChildren.length; i++) {\r\n const newChild = newChildren[i];\r\n const key = newChild?.key;\r\n\r\n if (key != null && oldKeyMap.has(key)) {\r\n const oldChild = oldKeyMap.get(key);\r\n const oldDom = oldChild._domNode;\r\n const childNodes = Array.from(parent.childNodes);\r\n const currentPos = childNodes.indexOf(oldDom);\r\n const desiredPos = i;\r\n\r\n if (currentPos !== desiredPos) {\r\n const refNode = childNodes[desiredPos] || null;\r\n if (oldDom && oldDom.parentNode === parent) {\r\n parent.insertBefore(oldDom, refNode);\r\n }\r\n }\r\n\r\n await patch(parent, newChild, oldChild);\r\n } else {\r\n const newDom = await createDom(newChild);\r\n if (newDom instanceof Node) {\r\n const childNodes = Array.from(parent.childNodes);\r\n const refNode = childNodes[i] || null;\r\n parent.insertBefore(newDom, refNode);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* ---------------------- Unmount ---------------------- */\r\n\r\n/**\r\n * Unmount vnode recursively and cleanup\r\n * @param {object} vnode\r\n */\r\nfunction unmountVNode(vnode) {\r\n if (!vnode) return;\r\n\r\n // FIX: Clean up text node subscription\r\n if (vnode._cleanup && typeof vnode._cleanup === \"function\") {\r\n try {\r\n vnode._cleanup();\r\n } catch (e) {\r\n console.error(\"[Fynix] Text vnode cleanup error:\", e);\r\n }\r\n vnode._cleanup = null;\r\n }\r\n\r\n if (typeof vnode.type === \"function\") {\r\n const ctx = componentInstances.get(vnode);\r\n if (ctx) {\r\n // FIX 7: Mark as unmounted to prevent rerender attempts\r\n ctx._isMounted = false;\r\n\r\n ctx._subscriptionCleanups.forEach((u) => {\r\n try {\r\n u();\r\n } catch (e) {\r\n console.error(\"[Fynix] Cleanup error:\", e);\r\n }\r\n });\r\n\r\n ctx.cleanups.forEach((c) => {\r\n try {\r\n c?.();\r\n } catch (e) {\r\n console.error(\"[Fynix] Effect cleanup error:\", e);\r\n }\r\n });\r\n\r\n ctx._subscriptions.clear();\r\n ctx._accessedStates.clear();\r\n ctx._subscriptionCleanups = [];\r\n ctx.cleanups = [];\r\n ctx.hooks = [];\r\n ctx.effects = [];\r\n ctx.rerender = null;\r\n ctx._vnode = null;\r\n\r\n componentInstances.delete(vnode);\r\n pendingRerenders.delete(ctx);\r\n }\r\n unmountVNode(vnode._rendered);\r\n return;\r\n }\r\n\r\n if (vnode._domNode && vnode._domNode.nodeType === 1) {\r\n const eid = vnode._domNode._rest_eid;\r\n if (eid) {\r\n delegatedEvents.forEach((map) => map.delete(eid));\r\n }\r\n\r\n // FIX: Clean up reactive class subscriptions\r\n if (vnode._domNode._fynixCleanups) {\r\n vnode._domNode._fynixCleanups.forEach((cleanup) => {\r\n try {\r\n cleanup();\r\n } catch (e) {\r\n console.error(\"[Fynix] Element cleanup error:\", e);\r\n }\r\n });\r\n vnode._domNode._fynixCleanups = null;\r\n }\r\n }\r\n\r\n if (vnode.props?.children)\r\n vnode.props.children.forEach((c) => unmountVNode(c));\r\n\r\n vnode._domNode = null;\r\n vnode._rendered = null;\r\n}\r\n\r\n/* ---------------------- Update Props ---------------------- */\r\n\r\n/**\r\n * Update DOM props\r\n * @param {HTMLElement} el\r\n * @param {object} newProps\r\n * @param {object} oldProps\r\n */\r\nfunction updateProps(el, newProps = {}, oldProps = {}) {\r\n if (!el || el.nodeType !== 1) return;\r\n\r\n for (const k of Object.keys(oldProps)) {\r\n if (k === \"children\") continue;\r\n if (!(k in newProps)) {\r\n if (k.startsWith(\"r-\")) {\r\n const eid = el._rest_eid;\r\n if (eid && delegatedEvents.has(k.slice(2).toLowerCase())) {\r\n delegatedEvents.get(k.slice(2).toLowerCase()).delete(eid);\r\n }\r\n } else if (BOOLEAN_ATTRS.has(k.toLowerCase())) {\r\n el.removeAttribute(k);\r\n el[k] = false;\r\n } else if (DOM_PROPERTIES.has(k)) el[k] = \"\";\r\n else el.removeAttribute(k);\r\n }\r\n }\r\n\r\n for (const [k, v] of Object.entries(newProps)) {\r\n if (k === \"children\") continue;\r\n if (oldProps[k] !== v) setProperty(el, k, v);\r\n }\r\n}\r\n\r\n/* ---------------------- Mount ---------------------- */\r\n\r\n/**\r\n * Mount the app component to a root DOM node\r\n * @param {function} AppComponent\r\n * @param {string|Element} root\r\n * @param {boolean} [hydrate=false]\r\n * @param {object} [props={}]\r\n */\r\nexport function mount(AppComponent, root, hydrate = false, props = {}) {\r\n if (typeof root === \"string\") {\r\n const element = document.querySelector(root);\r\n if (!element) {\r\n console.error(\r\n \"[Fynix] Mount error: Element not found for selector:\",\r\n root,\r\n );\r\n return;\r\n }\r\n root = element;\r\n }\r\n\r\n if (!(root instanceof Element)) {\r\n console.error(\"[Fynix] Mount error: Invalid root element\", root);\r\n return;\r\n }\r\n\r\n let Component = AppComponent;\r\n let oldVNode = null;\r\n let currentProps = props;\r\n let appVNode = null;\r\n let isRendering = false;\r\n\r\n async function renderApp() {\r\n // FIX 8: Prevent concurrent renders\r\n if (isRendering) {\r\n return;\r\n }\r\n\r\n isRendering = true;\r\n\r\n try {\r\n removeErrorOverlay();\r\n const propsToUse =\r\n window.__lastRouteProps ||\r\n window.__fynix__?.lastRouteProps ||\r\n currentProps;\r\n\r\n if (!appVNode) {\r\n appVNode = { type: Component, props: propsToUse, key: null };\r\n\r\n if (root instanceof Element) {\r\n root.innerHTML = \"\";\r\n const dom = await createDom(appVNode);\r\n if (dom instanceof Node) {\r\n root.appendChild(dom);\r\n }\r\n } else {\r\n console.error(\"[Fynix] Mount error: root is not a DOM Element\", root);\r\n return;\r\n }\r\n\r\n oldVNode = appVNode;\r\n } else {\r\n appVNode.props = propsToUse;\r\n\r\n if (root instanceof Node) {\r\n await patch(root, appVNode, oldVNode);\r\n oldVNode = appVNode;\r\n } else {\r\n console.error(\"[Fynix] Patch error: root is not a DOM Node\", root);\r\n return;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix] Mount error:\", err);\r\n showErrorOverlay(err);\r\n } finally {\r\n isRendering = false;\r\n }\r\n }\r\n\r\n rootRenderFn = renderApp;\r\n window.__fynix__ = window.__fynix__ || {};\r\n window.__fynix__.rerender = renderApp;\r\n renderApp();\r\n\r\n if (import.meta.hot) {\r\n if (!window.__fynix__.hmr) {\r\n window.__fynix__.hmr = async ({ mod }) => {\r\n try {\r\n const UpdatedComponent = mod.App || mod.default;\r\n if (UpdatedComponent) {\r\n Component = UpdatedComponent;\r\n if (appVNode) {\r\n appVNode.type = UpdatedComponent;\r\n }\r\n window.__fynix__.rerender?.();\r\n }\r\n } catch (err) {\r\n console.error(\"[Fynix HMR] update error:\", err);\r\n showErrorOverlay(err);\r\n }\r\n };\r\n import.meta.hot.accept();\r\n }\r\n }\r\n}\r\n\r\n/* ---------------------- Exports ---------------------- */\r\n\r\nexport {\r\n nixState,\r\n nixEffect,\r\n nixStore,\r\n nixInterval,\r\n nixAsync,\r\n nixCallback,\r\n nixComputed,\r\n nixMemo,\r\n nixDebounce,\r\n nixPrevious,\r\n nixLocalStorage,\r\n nixRef,\r\n nixLazy,\r\n Suspense,\r\n nixForm,\r\n nixAsyncCached,\r\n nixAsyncDebounce,\r\n nixAsyncQuery,\r\n nixEffectAlways,\r\n nixEffectOnce,\r\n nixFormAsync,\r\n nixLazyAsync,\r\n nixLazyFormAsync,\r\n Path,\r\n Button,\r\n createFynix,\r\n};\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["vnode", "newChildren", "oldChildren"]
7
7
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@fynixorg/ui",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "description": "Core package for Fynix UI framework.",
6
6
  "main": "dist/fynix/index.js",
7
- "types": "runtime.d.ts",
7
+ "types": "dist/runtime.d.ts",
8
8
  "exports": {
9
9
  ".": "./dist/runtime.js",
10
10
  "./context": "./dist/context/context.js",
@@ -40,9 +40,7 @@
40
40
  },
41
41
  "files": [
42
42
  "dist/",
43
- "types/",
44
- "runtime.d.ts",
45
- "router/"
43
+ "types/"
46
44
  ],
47
45
  "keywords": [
48
46
  "fynix",
@@ -55,6 +53,7 @@
55
53
  "devDependencies": {
56
54
  "@types/node": "^25.0.3",
57
55
  "esbuild": "^0.20.0",
56
+ "typescript": "^5.9.3",
58
57
  "vite": "^7.3.0"
59
58
  },
60
59
  "scripts": {
package/types/global.d.ts CHANGED
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Virtual DOM node type for Fynix
3
+ */
4
+ type VNode = {
5
+ type: any;
6
+ props: any;
7
+ key: any;
8
+ };
1
9
  // global.d.ts - Fynix Global Type Declarations
2
10
 
3
11
  /**
@@ -47,7 +55,9 @@ interface NixFormState<T extends Record<string, any>> {
47
55
  isValid: boolean;
48
56
  isSubmitting: boolean;
49
57
  errors: { [K in keyof T]?: string };
50
- handleSubmit: (onSubmit: (values: T) => void | Promise<void>) => (e?: Event) => Promise<void>;
58
+ handleSubmit: (
59
+ onSubmit: (values: T) => void | Promise<void>
60
+ ) => (e?: Event) => Promise<void>;
51
61
  reset: () => void;
52
62
  setFieldValue: <K extends keyof T>(field: K, value: T[K]) => void;
53
63
  setFieldError: <K extends keyof T>(field: K, error: string) => void;
@@ -86,13 +96,13 @@ interface FynixRouter {
86
96
  interface Window {
87
97
  /** Cache for router props to prevent memory leaks */
88
98
  __fynixPropsCache?: Map<string, any>;
89
-
99
+
90
100
  /** Link props namespace for router navigation */
91
101
  __fynixLinkProps__?: Record<string, any>;
92
-
102
+
93
103
  /** Last route props passed to components */
94
104
  __lastRouteProps?: any;
95
-
105
+
96
106
  /** Fynix global state and utilities */
97
107
  __fynix__?: {
98
108
  /** Current route props */
@@ -110,7 +120,7 @@ interface Window {
110
120
  interface HTMLElement {
111
121
  /** Event delegation ID for r-* event handlers */
112
122
  _rest_eid?: number;
113
-
123
+
114
124
  /** Fynix internal data storage */
115
125
  _fynix_?: any;
116
126
  }
@@ -149,7 +159,7 @@ interface ImportMeta {
149
159
  /** Custom HMR event handling */
150
160
  on?: (event: string, cb: (...args: any[]) => void) => void;
151
161
  };
152
-
162
+
153
163
  /** Vite glob import function */
154
164
  readonly glob: <T = any>(
155
165
  pattern: string,
@@ -157,12 +167,12 @@ interface ImportMeta {
157
167
  /** Load modules eagerly (at build time) */
158
168
  eager?: boolean;
159
169
  /** Import as URL strings */
160
- as?: 'url' | 'raw';
170
+ as?: "url" | "raw";
161
171
  /** Custom import query */
162
172
  query?: Record<string, string | number | boolean>;
163
173
  }
164
174
  ) => Record<string, T>;
165
-
175
+
166
176
  /** Environment variables */
167
177
  readonly env: {
168
178
  MODE: string;
@@ -177,42 +187,42 @@ interface ImportMeta {
177
187
  /**
178
188
  * Module declarations for non-TypeScript files
179
189
  */
180
- declare module '*.css' {
190
+ declare module "*.css" {
181
191
  const content: string;
182
192
  export default content;
183
193
  }
184
194
 
185
- declare module '*.scss' {
195
+ declare module "*.scss" {
186
196
  const content: string;
187
197
  export default content;
188
198
  }
189
199
 
190
- declare module '*.svg' {
200
+ declare module "*.svg" {
191
201
  const content: string;
192
202
  export default content;
193
203
  }
194
204
 
195
- declare module '*.png' {
205
+ declare module "*.png" {
196
206
  const content: string;
197
207
  export default content;
198
208
  }
199
209
 
200
- declare module '*.jpg' {
210
+ declare module "*.jpg" {
201
211
  const content: string;
202
212
  export default content;
203
213
  }
204
214
 
205
- declare module '*.jpeg' {
215
+ declare module "*.jpeg" {
206
216
  const content: string;
207
217
  export default content;
208
218
  }
209
219
 
210
- declare module '*.gif' {
220
+ declare module "*.gif" {
211
221
  const content: string;
212
222
  export default content;
213
223
  }
214
224
 
215
- declare module '*.webp' {
225
+ declare module "*.webp" {
216
226
  const content: string;
217
227
  export default content;
218
228
  }
@@ -220,17 +230,20 @@ declare module '*.webp' {
220
230
  /**
221
231
  * Fynix-specific module patterns
222
232
  */
223
- declare module '*.fnx' {
233
+ declare module "*.fnx" {
224
234
  const Component: any;
225
235
  export default Component;
226
236
  }
227
237
 
228
- declare module '*.js' {
238
+ declare module "*.js" {
239
+ const Component: any;
240
+ export default Component;
241
+ }
242
+ declare module "*.ts" {
229
243
  const Component: any;
230
244
  export default Component;
231
245
  }
232
-
233
246
  /**
234
247
  * Vite client types
235
248
  */
236
- /// <reference types="vite/client" />
249
+ /// <reference types="vite/client" />
@@ -1,21 +0,0 @@
1
- // Type definitions for Fynix Router
2
-
3
- export interface FynixRouter {
4
- mountRouter(selector?: string): void;
5
- navigate(path: string, props?: Record<string, any>): void;
6
- replace(path: string, props?: Record<string, any>): void;
7
- back(): void;
8
- cleanup(): void;
9
- routes: Record<string, any>;
10
- dynamicRoutes: Array<{
11
- pattern: string;
12
- regex: RegExp;
13
- component: any;
14
- params: string[];
15
- }>;
16
- }
17
-
18
- export default function createFynix(): FynixRouter;
19
-
20
- export function setLinkProps(key: string, props: Record<string, any>): void;
21
- export function clearLinkProps(key: string): void;