@fynixorg/ui 1.0.10 → 1.0.12

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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/dist/README.md +36 -0
  3. package/dist/context/context.d.ts +19 -0
  4. package/dist/context/context.d.ts.map +1 -0
  5. package/dist/context/context.js +3 -11
  6. package/dist/context/context.js.map +3 -3
  7. package/dist/custom/button.d.ts +2 -0
  8. package/dist/custom/button.d.ts.map +1 -0
  9. package/dist/custom/button.js +2 -9
  10. package/dist/custom/button.js.map +3 -3
  11. package/dist/custom/index.d.ts +3 -0
  12. package/dist/custom/index.d.ts.map +1 -0
  13. package/dist/custom/index.js +2 -7
  14. package/dist/custom/index.js.map +3 -3
  15. package/dist/custom/path.d.ts +14 -0
  16. package/dist/custom/path.d.ts.map +1 -0
  17. package/dist/custom/path.js +17 -34
  18. package/dist/custom/path.js.map +3 -3
  19. package/dist/error/errorOverlay.d.ts +3 -0
  20. package/dist/error/errorOverlay.d.ts.map +1 -0
  21. package/dist/error/errorOverlay.js +82 -91
  22. package/dist/error/errorOverlay.js.map +3 -3
  23. package/dist/fynix/index.d.ts +5 -0
  24. package/dist/fynix/index.d.ts.map +1 -0
  25. package/dist/fynix/index.js +2 -7
  26. package/dist/fynix/index.js.map +3 -3
  27. package/dist/hooks/nixAsync.d.ts +14 -0
  28. package/dist/hooks/nixAsync.d.ts.map +1 -0
  29. package/dist/hooks/nixAsync.js +38 -43
  30. package/dist/hooks/nixAsync.js.map +3 -3
  31. package/dist/hooks/nixAsyncCache.d.ts +14 -0
  32. package/dist/hooks/nixAsyncCache.d.ts.map +1 -0
  33. package/dist/hooks/nixAsyncCache.js +57 -59
  34. package/dist/hooks/nixAsyncCache.js.map +3 -3
  35. package/dist/hooks/nixAsyncDebounce.d.ts +22 -0
  36. package/dist/hooks/nixAsyncDebounce.d.ts.map +1 -0
  37. package/dist/hooks/nixAsyncDebounce.js +74 -85
  38. package/dist/hooks/nixAsyncDebounce.js.map +3 -3
  39. package/dist/hooks/nixAsyncQuery.d.ts +16 -0
  40. package/dist/hooks/nixAsyncQuery.d.ts.map +1 -0
  41. package/dist/hooks/nixAsyncQuery.js +85 -79
  42. package/dist/hooks/nixAsyncQuery.js.map +3 -3
  43. package/dist/hooks/nixCallback.d.ts +2 -0
  44. package/dist/hooks/nixCallback.d.ts.map +1 -0
  45. package/dist/hooks/nixCallback.js +30 -40
  46. package/dist/hooks/nixCallback.js.map +3 -3
  47. package/dist/hooks/nixComputed.d.ts +16 -0
  48. package/dist/hooks/nixComputed.d.ts.map +1 -0
  49. package/dist/hooks/nixComputed.js +166 -198
  50. package/dist/hooks/nixComputed.js.map +4 -4
  51. package/dist/hooks/nixDebounce.d.ts +11 -0
  52. package/dist/hooks/nixDebounce.d.ts.map +1 -0
  53. package/dist/hooks/nixDebounce.js +53 -58
  54. package/dist/hooks/nixDebounce.js.map +3 -3
  55. package/dist/hooks/nixEffect.d.ts +4 -0
  56. package/dist/hooks/nixEffect.d.ts.map +1 -0
  57. package/dist/hooks/nixEffect.js +65 -75
  58. package/dist/hooks/nixEffect.js.map +3 -3
  59. package/dist/hooks/nixForm.d.ts +33 -0
  60. package/dist/hooks/nixForm.d.ts.map +1 -0
  61. package/dist/hooks/nixForm.js +110 -120
  62. package/dist/hooks/nixForm.js.map +3 -3
  63. package/dist/hooks/nixFormAsync.d.ts +42 -0
  64. package/dist/hooks/nixFormAsync.d.ts.map +1 -0
  65. package/dist/hooks/nixFormAsync.js +158 -167
  66. package/dist/hooks/nixFormAsync.js.map +3 -3
  67. package/dist/hooks/nixInterval.d.ts +2 -0
  68. package/dist/hooks/nixInterval.d.ts.map +1 -0
  69. package/dist/hooks/nixInterval.js +21 -27
  70. package/dist/hooks/nixInterval.js.map +3 -3
  71. package/dist/hooks/nixLazy.d.ts +8 -0
  72. package/dist/hooks/nixLazy.d.ts.map +1 -0
  73. package/dist/hooks/nixLazy.js +53 -58
  74. package/dist/hooks/nixLazy.js.map +3 -3
  75. package/dist/hooks/nixLazyAsync.d.ts +10 -0
  76. package/dist/hooks/nixLazyAsync.d.ts.map +1 -0
  77. package/dist/hooks/nixLazyAsync.js +65 -71
  78. package/dist/hooks/nixLazyAsync.js.map +3 -3
  79. package/dist/hooks/nixLazyFormAsync.d.ts +50 -0
  80. package/dist/hooks/nixLazyFormAsync.d.ts.map +1 -0
  81. package/dist/hooks/nixLazyFormAsync.js +209 -213
  82. package/dist/hooks/nixLazyFormAsync.js.map +3 -3
  83. package/dist/hooks/nixLocalStorage.d.ts +5 -0
  84. package/dist/hooks/nixLocalStorage.d.ts.map +1 -0
  85. package/dist/hooks/nixLocalStorage.js +21 -25
  86. package/dist/hooks/nixLocalStorage.js.map +3 -3
  87. package/dist/hooks/nixMemo.d.ts +2 -0
  88. package/dist/hooks/nixMemo.d.ts.map +1 -0
  89. package/dist/hooks/nixMemo.js +27 -31
  90. package/dist/hooks/nixMemo.js.map +3 -3
  91. package/dist/hooks/nixPrevious.d.ts +2 -0
  92. package/dist/hooks/nixPrevious.d.ts.map +1 -0
  93. package/dist/hooks/nixPrevious.js +13 -19
  94. package/dist/hooks/nixPrevious.js.map +3 -3
  95. package/dist/hooks/nixRef.d.ts +4 -0
  96. package/dist/hooks/nixRef.d.ts.map +1 -0
  97. package/dist/hooks/nixRef.js +14 -20
  98. package/dist/hooks/nixRef.js.map +3 -3
  99. package/dist/hooks/nixState.d.ts +15 -0
  100. package/dist/hooks/nixState.d.ts.map +1 -0
  101. package/dist/hooks/nixState.js +120 -173
  102. package/dist/hooks/nixState.js.map +3 -3
  103. package/dist/hooks/nixStore.d.ts +7 -0
  104. package/dist/hooks/nixStore.d.ts.map +1 -0
  105. package/dist/hooks/nixStore.js +48 -54
  106. package/dist/hooks/nixStore.js.map +3 -3
  107. package/dist/package.json +213 -0
  108. package/dist/plugins/vite-plugin-res.d.ts +41 -0
  109. package/dist/plugins/vite-plugin-res.d.ts.map +1 -0
  110. package/dist/plugins/vite-plugin-res.js +620 -33
  111. package/dist/plugins/vite-plugin-res.js.map +4 -4
  112. package/dist/router/router.d.ts +35 -0
  113. package/dist/router/router.d.ts.map +1 -0
  114. package/dist/router/router.js +520 -486
  115. package/dist/router/router.js.map +3 -3
  116. package/dist/runtime.d.ts +62 -0
  117. package/dist/runtime.d.ts.map +1 -0
  118. package/dist/runtime.js +833 -820
  119. package/dist/runtime.js.map +4 -4
  120. package/package.json +226 -43
  121. package/types/fnx.d.ts +72 -0
  122. package/types/fynix-ui.d.ts +323 -0
  123. package/types/global.d.ts +46 -6
  124. package/types/index.d.ts +37 -0
  125. package/types/vite-env.d.ts +553 -0
  126. package/runtime.d.ts +0 -83
  127. package/types/jsx.d.ts +0 -692
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../router/router.js"],
4
- "sourcesContent": ["// Helper: Detect external URLs\r\nfunction isExternal(url) {\r\n return /^https?:\\/\\//.test(url);\r\n}\r\n/**\r\n * Fynix File-Based Router\r\n * All Security & Memory Leak Issues Fixed\r\n */\r\n\r\nimport { mount } from \"../runtime.js\";\r\n\r\nconst MAX_CACHE_SIZE = 50;\r\nconst PROPS_NAMESPACE = \"__fynixLinkProps__\";\r\nconst MAX_LISTENERS = 100;\r\nconst ALLOWED_PROTOCOLS = [\"http:\", \"https:\", \"\"];\r\n\r\n// FIX 1: Singleton pattern to prevent multiple router instances\r\nlet routerInstance = null;\r\nlet isRouterInitialized = false;\r\n\r\n/**\r\n * Security: Improved HTML escaping to prevent XSS\r\n */\r\nfunction escapeHTML(str) {\r\n if (typeof str !== \"string\") return \"\";\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#039;\")\r\n .replace(/`/g, \"&#96;\")\r\n .replace(/\\//g, \"&#x2F;\");\r\n}\r\n\r\n/**\r\n * Security: Validate URL to prevent open redirect\r\n */\r\nfunction isValidURL(url) {\r\n try {\r\n const parsed = new URL(url, window.location.origin);\r\n\r\n if (parsed.origin !== window.location.origin) {\r\n console.warn(\"[Router] Security: Cross-origin navigation blocked\");\r\n return false;\r\n }\r\n\r\n if (!ALLOWED_PROTOCOLS.includes(parsed.protocol)) {\r\n console.warn(\r\n \"[Router] Security: Dangerous protocol blocked:\",\r\n parsed.protocol\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (e) {\r\n console.warn(\"[Router] Security: Invalid URL blocked\");\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Security: Sanitize path to prevent directory traversal\r\n */\r\nfunction sanitizePath(path) {\r\n if (typeof path !== \"string\") return \"/\";\r\n\r\n // Decode URL encoding first to catch encoded traversal attempts like %2e%2e\r\n try {\r\n path = decodeURIComponent(path);\r\n } catch (e) {\r\n // Invalid encoding, reject\r\n console.warn(\"[Router] Invalid URL encoding in path\");\r\n return \"/\";\r\n }\r\n\r\n path = path.replace(/\\0/g, \"\");\r\n path = path.replace(/\\\\/g, \"/\");\r\n path = path.replace(/\\/+/g, \"/\");\r\n path = path\r\n .split(\"/\")\r\n .filter((part) => part !== \"..\" && part !== \".\")\r\n .join(\"/\");\r\n\r\n if (!path.startsWith(\"/\")) {\r\n path = \"/\" + path;\r\n }\r\n\r\n if (path.length > 1 && path.endsWith(\"/\")) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n return path || \"/\";\r\n}\r\n\r\n/**\r\n * Helper: Try multiple possible glob paths for file-based routing\r\n */\r\nfunction tryGlobPaths() {\r\n try {\r\n // @ts-ignore - Vite glob API\r\n const modules = import.meta.glob(\"/src/**/*.{ts,js,jsx,fnx}\", {\r\n eager: true,\r\n });\r\n return modules || {};\r\n } catch (error) {\r\n console.error(\"[Router] Failed to load modules:\", error);\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Convert file path to route path\r\n */\r\nfunction filePathToRoute(filePath) {\r\n let route = filePath\r\n .replace(/^.*\\/src/, \"\")\r\n .replace(/\\.(js|jsx|fnx)$/, \"\")\r\n .replace(/\\/view$/, \"\")\r\n .replace(/\\/$/, \"\");\r\n\r\n if (!route) route = \"/\";\r\n route = route.replace(/\\[([^\\]]+)\\]/g, \":$1\");\r\n return route;\r\n}\r\n\r\n/**\r\n * Match a dynamic route pattern\r\n */\r\nfunction matchDynamicRoute(path, dynamicRoutes) {\r\n for (const route of dynamicRoutes) {\r\n const match = path.match(route.regex);\r\n if (match) {\r\n const params = {};\r\n route.params.forEach((param, i) => {\r\n // FIX: Don't decode again - already decoded in sanitizePath\r\n // Just escape the matched value\r\n params[param] = escapeHTML(match[i + 1]);\r\n });\r\n return { component: route.component, params };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Deserialize plain props\r\n */\r\nfunction deserializeProps(props) {\r\n if (!props || typeof props !== \"object\") return {};\r\n\r\n const deserialized = {};\r\n for (const [key, value] of Object.entries(props)) {\r\n if (typeof key !== \"string\" || key.startsWith(\"__\")) {\r\n continue;\r\n }\r\n deserialized[key] = value;\r\n }\r\n return deserialized;\r\n}\r\n\r\n/**\r\n * Normalize path\r\n */\r\nfunction normalizePath(path) {\r\n return sanitizePath(path);\r\n}\r\n\r\n/**\r\n * FIX 2: Generate unique cache keys using crypto API when available\r\n */\r\nfunction generateCacheKey() {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback with better uniqueness\r\n return `${Date.now()}-${Math.random().toString(36).slice(2)}-${Math.random()\r\n .toString(36)\r\n .slice(2)}`;\r\n}\r\n\r\n/**\r\n * @typedef {Object} FynixRouter\r\n * @property {function(string=): void} mountRouter - Mount router to DOM element\r\n * @property {function(string, Object=): void} navigate - Navigate to path with props\r\n * @property {function(string, Object=): void} replace - Replace current path\r\n * @property {function(): void} back - Navigate back\r\n * @property {function(): void} cleanup - Cleanup router instance\r\n * @property {Object} routes - Static routes map\r\n * @property {Array} dynamicRoutes - Dynamic routes array\r\n */\r\n\r\n/**\r\n * Fynix Router Factory\r\n * @returns {FynixRouter}\r\n */\r\nexport default function createFynix() {\r\n // FIX 3: Singleton pattern - return existing instance if already initialized\r\n // Skip singleton check in dev mode (HMR) to allow hot reloading\r\n const isDevMode = import.meta.hot !== undefined;\r\n\r\n if (routerInstance && isRouterInitialized && !isDevMode) {\r\n console.warn(\r\n \"[Router] Router already initialized, returning existing instance\"\r\n );\r\n return routerInstance;\r\n }\r\n\r\n // In dev mode with HMR, cleanup old instance before creating new one\r\n if (isDevMode && routerInstance) {\r\n console.log(\"[Router] HMR: Cleaning up old router instance\");\r\n routerInstance.cleanup();\r\n routerInstance = null;\r\n isRouterInitialized = false;\r\n }\r\n\r\n let rootSelector = \"#app-root\";\r\n let currentPath = null;\r\n let isDestroyed = false;\r\n let listenerCount = 0;\r\n\r\n const listeners = [];\r\n\r\n if (!window[PROPS_NAMESPACE]) {\r\n window[PROPS_NAMESPACE] = {};\r\n }\r\n\r\n // Clear old cache in dev mode to prevent memory buildup\r\n if (isDevMode && window.__fynixPropsCache) {\r\n window.__fynixPropsCache.clear();\r\n }\r\n\r\n // @ts-ignore - Custom cache property\r\n const __fynixPropsCache = window.__fynixPropsCache || new Map();\r\n // @ts-ignore\r\n window.__fynixPropsCache = __fynixPropsCache;\r\n\r\n const modules = tryGlobPaths();\r\n const routes = {};\r\n const dynamicRoutes = [];\r\n\r\n for (const [filePath, mod] of Object.entries(modules)) {\r\n const routePath = filePathToRoute(filePath);\r\n const component =\r\n mod.default || mod[Object.keys(mod)[0]] || Object.values(mod)[0];\r\n\r\n if (!component) continue;\r\n\r\n const hasDynamic = /:[^/]+/.test(routePath);\r\n if (hasDynamic) {\r\n dynamicRoutes.push({\r\n pattern: routePath,\r\n regex: new RegExp(\"^\" + routePath.replace(/:[^/]+/g, \"([^/]+)\") + \"$\"),\r\n component,\r\n params: [...routePath.matchAll(/:([^/]+)/g)].map((m) => m[1]),\r\n });\r\n } else {\r\n routes[routePath] = component;\r\n }\r\n }\r\n\r\n /**\r\n * Add cache management with LRU\r\n */\r\n function addToCache(key, value) {\r\n if (__fynixPropsCache.size >= MAX_CACHE_SIZE) {\r\n const firstKey = __fynixPropsCache.keys().next().value;\r\n const evicted = __fynixPropsCache.get(firstKey);\r\n\r\n if (evicted && typeof evicted === \"object\") {\r\n Object.values(evicted).forEach((val) => {\r\n if (val && typeof val === \"object\" && val.cleanup) {\r\n try {\r\n val.cleanup();\r\n } catch (e) {}\r\n }\r\n });\r\n }\r\n\r\n __fynixPropsCache.delete(firstKey);\r\n }\r\n __fynixPropsCache.set(key, value);\r\n }\r\n\r\n const MANAGED_META = [\r\n { key: \"description\", name: \"description\" },\r\n { key: \"keywords\", name: \"keywords\" },\r\n { key: \"twitterCard\", name: \"twitter:card\" },\r\n { key: \"ogTitle\", property: \"og:title\" },\r\n { key: \"ogDescription\", property: \"og:description\" },\r\n { key: \"ogImage\", property: \"og:image\" },\r\n ];\r\n\r\n /**\r\n * Update document meta tags for SEO with XSS prevention\r\n * @param {Object} meta - Meta object\r\n */\r\n function updateMetaTags(meta = {}) {\r\n if (!meta || typeof meta !== \"object\") return;\r\n\r\n if (meta.title && typeof meta.title === \"string\") {\r\n document.title = escapeHTML(meta.title);\r\n }\r\n\r\n MANAGED_META.forEach((def) => {\r\n const value = meta[def.key];\r\n\r\n const selector = def.name\r\n ? `meta[name=\"${def.name}\"]`\r\n : `meta[property=\"${def.property}\"]`;\r\n\r\n let el = document.querySelector(selector);\r\n\r\n if (value == null) {\r\n if (el) el.remove();\r\n return;\r\n }\r\n\r\n if (typeof value !== \"string\") return;\r\n\r\n if (!el) {\r\n el = document.createElement(\"meta\");\r\n if (def.name) el.setAttribute(\"name\", def.name);\r\n if (def.property) el.setAttribute(\"property\", def.property);\r\n document.head.appendChild(el);\r\n }\r\n\r\n el.setAttribute(\"content\", escapeHTML(value));\r\n });\r\n }\r\n\r\n // FIX 4: Debounce renderRoute to prevent race conditions\r\n let renderTimeout = null;\r\n const RENDER_DEBOUNCE = 10; // ms\r\n\r\n /**\r\n * Core route rendering function\r\n */\r\n function renderRoute() {\r\n if (isDestroyed) return;\r\n\r\n // FIX 5: Debounce to prevent race conditions\r\n if (renderTimeout) {\r\n clearTimeout(renderTimeout);\r\n }\r\n\r\n renderTimeout = setTimeout(() => {\r\n _renderRouteImmediate();\r\n renderTimeout = null;\r\n }, RENDER_DEBOUNCE);\r\n }\r\n\r\n function _renderRouteImmediate() {\r\n if (isDestroyed) return;\r\n\r\n const path = normalizePath(window.location.pathname);\r\n let Page = routes[path];\r\n let params = {};\r\n let routeProps = {};\r\n\r\n if (!Page) {\r\n const match = matchDynamicRoute(path, dynamicRoutes);\r\n if (match) {\r\n Page = match.component;\r\n params = match.params;\r\n }\r\n }\r\n\r\n const root = document.querySelector(rootSelector);\r\n if (!root) {\r\n console.error(\"[Router] Root element not found:\", rootSelector);\r\n return;\r\n }\r\n\r\n if (!Page) {\r\n root.innerHTML = `<h2>404 Not Found</h2><p>Path: ${escapeHTML(path)}</p>`;\r\n updateMetaTags({ title: \"404 - Page Not Found\" });\r\n return;\r\n }\r\n\r\n const state = window.history.state || {};\r\n let passedProps = {};\r\n\r\n if (state.__fynixCacheKey && __fynixPropsCache.has(state.__fynixCacheKey)) {\r\n passedProps = __fynixPropsCache.get(state.__fynixCacheKey);\r\n } else if (state.serializedProps) {\r\n passedProps = deserializeProps(state.serializedProps);\r\n }\r\n\r\n if (Page.props) {\r\n routeProps = typeof Page.props === \"function\" ? Page.props() : Page.props;\r\n }\r\n\r\n if (Page.meta) {\r\n const meta =\r\n typeof Page.meta === \"function\" ? Page.meta(params) : Page.meta;\r\n updateMetaTags(meta);\r\n }\r\n\r\n // @ts-ignore\r\n window.__lastRouteProps = {\r\n ...routeProps,\r\n ...passedProps,\r\n params,\r\n };\r\n\r\n try {\r\n mount(Page, rootSelector, false, window.__lastRouteProps);\r\n } catch (err) {\r\n console.error(\"[Router] Mount failed:\", err);\r\n root.innerHTML = `<pre style=\"color:red;\">Mount Error occurred</pre>`;\r\n }\r\n\r\n currentPath = path;\r\n }\r\n\r\n /**\r\n * SPA Navigation Helpers\r\n */\r\n function navigate(path, props = {}) {\r\n if (isDestroyed) return;\r\n\r\n path = normalizePath(path);\r\n\r\n if (!isValidURL(window.location.origin + path)) {\r\n console.error(\"[Router] Invalid navigation URL\");\r\n return;\r\n }\r\n\r\n if (path === currentPath) return;\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(cacheKey, props);\r\n\r\n try {\r\n window.history.pushState({ __fynixCacheKey: cacheKey }, \"\", path);\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Navigation failed:\", err);\r\n }\r\n }\r\n\r\n function replace(path, props = {}) {\r\n if (isDestroyed) return;\r\n\r\n path = normalizePath(path);\r\n\r\n if (!isValidURL(window.location.origin + path)) {\r\n console.error(\"[Router] Invalid replace URL\");\r\n return;\r\n }\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(cacheKey, props);\r\n\r\n try {\r\n window.history.replaceState({ __fynixCacheKey: cacheKey }, \"\", path);\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Replace failed:\", err);\r\n }\r\n }\r\n\r\n function back() {\r\n if (isDestroyed) return;\r\n try {\r\n window.history.back();\r\n } catch (err) {\r\n console.error(\"[Router] Back navigation failed:\", err);\r\n }\r\n }\r\n\r\n /**\r\n * Mount the router to a DOM element\r\n */\r\n function mountRouter(selector = \"#app-root\") {\r\n if (isDestroyed) {\r\n console.error(\"[Router] Cannot mount destroyed router\");\r\n return;\r\n }\r\n\r\n if (typeof selector !== \"string\" || selector.length === 0) {\r\n console.error(\"[Router] Invalid selector\");\r\n return;\r\n }\r\n\r\n rootSelector = selector;\r\n renderRoute();\r\n isRouterInitialized = true;\r\n }\r\n\r\n /**\r\n * Link click delegation\r\n */\r\n const clickHandler = (e) => {\r\n if (isDestroyed) return;\r\n\r\n const link = e.target.closest(\"a[data-fynix-link]\");\r\n if (!link) return;\r\n\r\n const href = link.getAttribute(\"href\");\r\n if (!href) {\r\n console.warn(\"[Router] Missing href attribute\");\r\n return;\r\n }\r\n\r\n // Ignore external links\r\n if (isExternal(href)) {\r\n return; // Let the browser handle it\r\n }\r\n\r\n // FIX: Build full URL for validation (handles relative URLs)\r\n const fullUrl = new URL(link.href, window.location.origin).href;\r\n if (!isValidURL(fullUrl)) {\r\n console.warn(\"[Router] Invalid link href\");\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n const path = normalizePath(\r\n new URL(link.href, window.location.origin).pathname\r\n );\r\n\r\n if (path === currentPath) return;\r\n\r\n let props = {};\r\n const propsKey = link.getAttribute(\"data-props-key\");\r\n\r\n if (\r\n propsKey &&\r\n typeof propsKey === \"string\" &&\r\n !propsKey.startsWith(\"__\")\r\n ) {\r\n if (window[PROPS_NAMESPACE]?.[propsKey]) {\r\n props = window[PROPS_NAMESPACE][propsKey];\r\n }\r\n }\r\n\r\n const serializableProps = {};\r\n for (const [k, v] of Object.entries(props)) {\r\n if (typeof k !== \"string\" || k.startsWith(\"__\")) continue;\r\n serializableProps[k] =\r\n v && (v._isNixState || v._isRestState) ? v.value : v;\r\n }\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(cacheKey, serializableProps);\r\n\r\n try {\r\n window.history.pushState(\r\n { __fynixCacheKey: cacheKey, serializedProps: serializableProps },\r\n \"\",\r\n path\r\n );\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Link navigation failed:\", err);\r\n }\r\n };\r\n\r\n // FIX 6: Only add listeners if not already added\r\n if (listenerCount < MAX_LISTENERS && !isRouterInitialized) {\r\n document.addEventListener(\"click\", clickHandler);\r\n listeners.push({\r\n element: document,\r\n event: \"click\",\r\n handler: clickHandler,\r\n });\r\n listenerCount++;\r\n\r\n window.addEventListener(\"popstate\", renderRoute);\r\n listeners.push({\r\n element: window,\r\n event: \"popstate\",\r\n handler: renderRoute,\r\n });\r\n listenerCount++;\r\n }\r\n\r\n /**\r\n * Cleanup function\r\n */\r\n function cleanup() {\r\n // FIX: Clear timeout FIRST to prevent pending renders\r\n if (renderTimeout) {\r\n clearTimeout(renderTimeout);\r\n renderTimeout = null;\r\n }\r\n\r\n // THEN mark as destroyed\r\n isDestroyed = true;\r\n\r\n // Remove all event listeners\r\n listeners.forEach(({ element, event, handler }) => {\r\n try {\r\n element.removeEventListener(event, handler);\r\n } catch (e) {\r\n console.error(\"[Router] Cleanup error:\", e);\r\n }\r\n });\r\n listeners.length = 0;\r\n listenerCount = 0;\r\n\r\n // Clean up all cached props\r\n __fynixPropsCache.forEach((props) => {\r\n if (props && typeof props === \"object\") {\r\n Object.values(props).forEach((val) => {\r\n if (val && typeof val === \"object\" && val.cleanup) {\r\n try {\r\n val.cleanup();\r\n } catch (e) {}\r\n }\r\n });\r\n }\r\n });\r\n __fynixPropsCache.clear();\r\n\r\n // Clean up global namespace\r\n if (window[PROPS_NAMESPACE]) {\r\n Object.keys(window[PROPS_NAMESPACE]).forEach((key) => {\r\n delete window[PROPS_NAMESPACE][key];\r\n });\r\n delete window[PROPS_NAMESPACE];\r\n }\r\n\r\n // Clear last route props\r\n // @ts-ignore\r\n if (window.__lastRouteProps) {\r\n // @ts-ignore\r\n delete window.__lastRouteProps;\r\n }\r\n\r\n // Reset singleton flags at the VERY end\r\n isRouterInitialized = false;\r\n routerInstance = null;\r\n\r\n console.log(\"[Router] Cleanup complete\");\r\n }\r\n\r\n // @ts-ignore - Vite HMR API\r\n if (import.meta.hot) {\r\n // @ts-ignore\r\n import.meta.hot.accept(() => {\r\n console.log(\"[Router] HMR detected, re-rendering route...\");\r\n renderRoute();\r\n });\r\n\r\n // @ts-ignore\r\n import.meta.hot.dispose(() => {\r\n console.log(\"[Router] HMR dispose, cleaning up...\");\r\n cleanup();\r\n // Reset singleton flags for HMR\r\n routerInstance = null;\r\n isRouterInitialized = false;\r\n });\r\n }\r\n\r\n const router = {\r\n mountRouter,\r\n navigate,\r\n replace,\r\n back,\r\n cleanup,\r\n routes,\r\n dynamicRoutes,\r\n };\r\n\r\n routerInstance = router;\r\n return router;\r\n}\r\n\r\n/**\r\n * Helper: Set props for links\r\n */\r\nexport function setLinkProps(key, props) {\r\n if (typeof key !== \"string\" || key.startsWith(\"__\")) {\r\n console.error(\"[Router] Invalid props key\");\r\n return;\r\n }\r\n\r\n if (!props || typeof props !== \"object\") {\r\n console.error(\"[Router] Invalid props object\");\r\n return;\r\n }\r\n\r\n if (!window[PROPS_NAMESPACE]) {\r\n window[PROPS_NAMESPACE] = {};\r\n }\r\n\r\n if (Object.keys(window[PROPS_NAMESPACE]).length >= MAX_CACHE_SIZE) {\r\n console.warn(\"[Router] Props storage limit reached\");\r\n return;\r\n }\r\n\r\n window[PROPS_NAMESPACE][key] = props;\r\n}\r\n\r\n/**\r\n * Helper: Clear link props\r\n */\r\nexport function clearLinkProps(key) {\r\n if (typeof key !== \"string\") return;\r\n\r\n if (window[PROPS_NAMESPACE]?.[key]) {\r\n const props = window[PROPS_NAMESPACE][key];\r\n if (props && typeof props === \"object\") {\r\n Object.values(props).forEach((val) => {\r\n if (val && typeof val === \"object\" && val.cleanup) {\r\n try {\r\n val.cleanup();\r\n } catch (e) {}\r\n }\r\n });\r\n }\r\n delete window[PROPS_NAMESPACE][key];\r\n }\r\n}\r\n\r\n// Named export for better IDE support\r\nexport { createFynix };\r\n"],
5
- "mappings": "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",
3
+ "sources": ["../../router/router.ts"],
4
+ "sourcesContent": ["/* MIT License\r\n\r\n* Copyright (c) 2026 Resty Gonzales\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n* SOFTWARE.\r\n */\r\n\r\n/**\r\n * Fynix File-Based Router - TypeScript Edition\r\n * All Security & Memory Leak Issues Fixed\r\n */\r\n\r\nimport { mount } from \"../runtime\";\r\n\r\n// ---------------------- Types ----------------------\r\n\r\ninterface RouteComponent {\r\n (props: any): any;\r\n props?: Record<string, any> | (() => Record<string, any>);\r\n meta?: RouteMeta | ((params: Record<string, string>) => RouteMeta);\r\n}\r\n\r\ninterface RouteMeta {\r\n title?: string;\r\n description?: string;\r\n keywords?: string;\r\n twitterCard?: string;\r\n ogTitle?: string;\r\n ogDescription?: string;\r\n ogImage?: string;\r\n}\r\n\r\ninterface DynamicRoute {\r\n pattern: string;\r\n regex: RegExp;\r\n component: RouteComponent;\r\n params: string[];\r\n}\r\n\r\ninterface EventListener {\r\n element: Element | Window | Document;\r\n event: string;\r\n handler: EventListenerOrEventListenerObject;\r\n}\r\n\r\ninterface HistoryState {\r\n __fynixCacheKey?: string;\r\n serializedProps?: Record<string, any>;\r\n}\r\n\r\ninterface FynixRouter {\r\n mountRouter(selector?: string): void;\r\n navigate(path: string, props?: Record<string, any>): void;\r\n replace(path: string, props?: Record<string, any>): void;\r\n back(): void;\r\n cleanup(): void;\r\n routes: Record<string, RouteComponent>;\r\n dynamicRoutes: DynamicRoute[];\r\n}\r\n\r\ninterface WindowWithFynix extends Window {\r\n [key: string]: any;\r\n __fynixPropsCache?: Map<string, Record<string, any>>;\r\n __lastRouteProps?: Record<string, any>;\r\n __fynixLinkProps__?: Record<string, any>;\r\n}\r\n\r\ndeclare const window: WindowWithFynix;\r\n\r\n// ---------------------- Constants ----------------------\r\n\r\nconst MAX_CACHE_SIZE = 50;\r\nconst PROPS_NAMESPACE = \"__fynixLinkProps__\";\r\nconst MAX_LISTENERS = 100;\r\nconst ALLOWED_PROTOCOLS = [\"http:\", \"https:\", \"\"];\r\nconst RENDER_DEBOUNCE = 10; // ms\r\n\r\n// ---------------------- Singleton State ----------------------\r\n\r\nlet routerInstance: FynixRouter | null = null;\r\nlet isRouterInitialized = false;\r\n\r\n// ---------------------- Security Helpers ----------------------\r\n\r\n/**\r\n * Detect external URLs\r\n */\r\nfunction isExternal(url: string): boolean {\r\n return /^https?:\\/\\//.test(url);\r\n}\r\n\r\n/**\r\n * HTML escaping to prevent XSS\r\n */\r\nfunction escapeHTML(str: unknown): string {\r\n if (typeof str !== \"string\") return \"\";\r\n\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#039;\")\r\n .replace(/`/g, \"&#96;\")\r\n .replace(/\\//g, \"&#x2F;\");\r\n}\r\n\r\n/**\r\n * Validate URL to prevent open redirect\r\n */\r\nfunction isValidURL(url: string): boolean {\r\n try {\r\n const parsed = new URL(url, window.location.origin);\r\n\r\n if (parsed.origin !== window.location.origin) {\r\n console.warn(\"[Router] Security: Cross-origin navigation blocked\");\r\n return false;\r\n }\r\n\r\n if (!ALLOWED_PROTOCOLS.includes(parsed.protocol)) {\r\n console.warn(\r\n \"[Router] Security: Dangerous protocol blocked:\",\r\n parsed.protocol\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (e) {\r\n console.warn(\"[Router] Security: Invalid URL blocked\");\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Sanitize path to prevent directory traversal\r\n */\r\nfunction sanitizePath(path: string): string {\r\n if (typeof path !== \"string\") return \"/\";\r\n\r\n // Decode URL encoding first to catch encoded traversal attempts\r\n try {\r\n path = decodeURIComponent(path);\r\n } catch (e) {\r\n console.warn(\"[Router] Invalid URL encoding in path\");\r\n return \"/\";\r\n }\r\n\r\n // Remove null bytes\r\n path = path.replace(/\\0/g, \"\");\r\n\r\n // Normalize slashes\r\n path = path.replace(/\\\\/g, \"/\");\r\n path = path.replace(/\\/+/g, \"/\");\r\n\r\n // Remove directory traversal attempts\r\n path = path\r\n .split(\"/\")\r\n .filter((part) => part !== \"..\" && part !== \".\")\r\n .join(\"/\");\r\n\r\n // Ensure leading slash\r\n if (!path.startsWith(\"/\")) {\r\n path = \"/\" + path;\r\n }\r\n\r\n // Remove trailing slash (except for root)\r\n if (path.length > 1 && path.endsWith(\"/\")) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n return path || \"/\";\r\n}\r\n\r\n// ---------------------- Module Loading ----------------------\r\n\r\n/**\r\n * Try multiple possible glob paths for file-based routing\r\n */\r\n/**\r\n * Try multiple possible glob paths for file-based routing\r\n */\r\nfunction tryGlobPaths(): Record<string, any> {\r\n try {\r\n // Try relative patterns first (most common)\r\n let modules = import.meta.glob(\r\n [\"./**/*.fnx\", \"./**/*.tsx\", \"./**/*.jsx\", \"./**/*.ts\", \"./**/*.js\"],\r\n { eager: true }\r\n );\r\n\r\n console.log(\"[Router] Glob attempt 1 (./**):\", Object.keys(modules));\r\n\r\n // If nothing found, try from parent\r\n if (Object.keys(modules).length === 0) {\r\n modules = import.meta.glob(\r\n [\"../**/*.fnx\", \"../**/*.tsx\", \"../**/*.jsx\"],\r\n { eager: true }\r\n );\r\n console.log(\"[Router] Glob attempt 2 (../**):\", Object.keys(modules));\r\n }\r\n\r\n // If still nothing, try absolute from src\r\n if (Object.keys(modules).length === 0) {\r\n modules = import.meta.glob(\"/src/**/*.{fnx,tsx,jsx,ts,js}\", {\r\n eager: true,\r\n });\r\n console.log(\"[Router] Glob attempt 3 (/src/**):\", Object.keys(modules));\r\n }\r\n\r\n console.log(\"[Router] Final modules loaded:\", Object.keys(modules).length);\r\n return modules || {};\r\n } catch (error) {\r\n console.error(\"[Router] Failed to load modules:\", error);\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Convert file path to route path\r\n */\r\nfunction filePathToRoute(filePath: string): string {\r\n let route = filePath\r\n .replace(/^.*\\/src/, \"\")\r\n .replace(/\\.(ts|tsx|js|jsx|fnx)$/, \"\")\r\n .replace(/\\/view$/, \"\")\r\n .replace(/\\/$/, \"\");\r\n\r\n if (!route) route = \"/\";\r\n\r\n // Convert [param] to :param for route matching\r\n route = route.replace(/\\[([^\\]]+)\\]/g, \":$1\");\r\n\r\n return route;\r\n}\r\n\r\n// ---------------------- Route Matching ----------------------\r\n\r\n/**\r\n * Match a dynamic route pattern\r\n */\r\nfunction matchDynamicRoute(\r\n path: string,\r\n dynamicRoutes: DynamicRoute[]\r\n): { component: RouteComponent; params: Record<string, string> } | null {\r\n for (const route of dynamicRoutes) {\r\n const match = path.match(route.regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n route.params.forEach((param, i) => {\r\n // Already decoded in sanitizePath, just escape\r\n const matchValue = match[i + 1];\r\n params[param] = escapeHTML(matchValue || \"\");\r\n });\r\n\r\n return { component: route.component, params };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// ---------------------- Props Serialization ----------------------\r\n\r\n/**\r\n * Deserialize plain props\r\n */\r\nfunction deserializeProps(props: unknown): Record<string, any> {\r\n if (!props || typeof props !== \"object\") return {};\r\n\r\n const deserialized: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(props)) {\r\n if (typeof key !== \"string\" || key.startsWith(\"__\")) {\r\n continue;\r\n }\r\n deserialized[key] = value;\r\n }\r\n\r\n return deserialized;\r\n}\r\n\r\n/**\r\n * Normalize path\r\n */\r\nfunction normalizePath(path: string): string {\r\n return sanitizePath(path);\r\n}\r\n\r\n// ---------------------- Cache Management ----------------------\r\n\r\n/**\r\n * Generate unique cache keys using crypto API when available\r\n */\r\nfunction generateCacheKey(): string {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n // Fallback with better uniqueness\r\n return `${Date.now()}-${Math.random().toString(36).slice(2)}-${Math.random()\r\n .toString(36)\r\n .slice(2)}`;\r\n}\r\n\r\n/**\r\n * Add to cache with LRU eviction\r\n */\r\nfunction addToCache(\r\n cache: Map<string, Record<string, any>>,\r\n key: string,\r\n value: Record<string, any>\r\n): void {\r\n if (cache.size >= MAX_CACHE_SIZE) {\r\n const firstKey = cache.keys().next().value;\r\n if (typeof firstKey === \"string\") {\r\n const evicted = cache.get(firstKey);\r\n if (evicted && typeof evicted === \"object\") {\r\n Object.values(evicted).forEach((val) => {\r\n if (val && typeof val === \"object\" && \"cleanup\" in val) {\r\n try {\r\n (val as any).cleanup();\r\n } catch (e) {\r\n // Silent cleanup failure\r\n }\r\n }\r\n });\r\n }\r\n cache.delete(firstKey);\r\n }\r\n\r\n // Removed duplicate cleanup and delete logic\r\n }\r\n\r\n cache.set(key, value);\r\n}\r\n\r\n// ---------------------- Meta Tag Management ----------------------\r\n\r\ninterface MetaDefinition {\r\n key: keyof RouteMeta;\r\n name?: string;\r\n property?: string;\r\n}\r\n\r\nconst MANAGED_META: MetaDefinition[] = [\r\n { key: \"description\", name: \"description\" },\r\n { key: \"keywords\", name: \"keywords\" },\r\n { key: \"twitterCard\", name: \"twitter:card\" },\r\n { key: \"ogTitle\", property: \"og:title\" },\r\n { key: \"ogDescription\", property: \"og:description\" },\r\n { key: \"ogImage\", property: \"og:image\" },\r\n];\r\n\r\n/**\r\n * Update document meta tags for SEO with XSS prevention\r\n */\r\nfunction updateMetaTags(meta: RouteMeta = {}): void {\r\n if (!meta || typeof meta !== \"object\") return;\r\n\r\n if (meta.title && typeof meta.title === \"string\") {\r\n document.title = escapeHTML(meta.title);\r\n }\r\n\r\n MANAGED_META.forEach((def) => {\r\n const value = meta[def.key];\r\n\r\n const selector = def.name\r\n ? `meta[name=\"${def.name}\"]`\r\n : `meta[property=\"${def.property}\"]`;\r\n\r\n let el = document.querySelector(selector);\r\n\r\n if (value == null) {\r\n if (el) el.remove();\r\n return;\r\n }\r\n\r\n if (typeof value !== \"string\") return;\r\n\r\n if (!el) {\r\n el = document.createElement(\"meta\");\r\n if (def.name) el.setAttribute(\"name\", def.name);\r\n if (def.property) el.setAttribute(\"property\", def.property);\r\n document.head.appendChild(el);\r\n }\r\n\r\n el.setAttribute(\"content\", escapeHTML(value));\r\n });\r\n}\r\n\r\n// ---------------------- Router Factory ----------------------\r\n\r\n/**\r\n * Fynix Router Factory\r\n */\r\nfunction createFynix(): FynixRouter {\r\n const isDevMode = import.meta.hot !== undefined;\r\n\r\n // Singleton pattern - return existing instance if already initialized\r\n if (routerInstance && isRouterInitialized && !isDevMode) {\r\n console.warn(\r\n \"[Router] Router already initialized, returning existing instance\"\r\n );\r\n return routerInstance;\r\n }\r\n\r\n // In dev mode with HMR, cleanup old instance before creating new one\r\n if (isDevMode && routerInstance) {\r\n console.log(\"[Router] HMR: Cleaning up old router instance\");\r\n routerInstance.cleanup();\r\n routerInstance = null;\r\n isRouterInitialized = false;\r\n }\r\n\r\n let rootSelector = \"#app-root\";\r\n let currentPath: string | null = null;\r\n let isDestroyed = false;\r\n let listenerCount = 0;\r\n let renderTimeout: NodeJS.Timeout | null = null;\r\n\r\n const listeners: EventListener[] = [];\r\n\r\n // Initialize props namespace\r\n if (!window[PROPS_NAMESPACE]) {\r\n window[PROPS_NAMESPACE] = {};\r\n }\r\n\r\n // Clear old cache in dev mode to prevent memory buildup\r\n if (isDevMode && window.__fynixPropsCache) {\r\n window.__fynixPropsCache.clear();\r\n }\r\n\r\n const propsCache: Map<\r\n string,\r\n Record<string, any>\r\n > = window.__fynixPropsCache || new Map();\r\n window.__fynixPropsCache = propsCache;\r\n\r\n // Load all route modules\r\n const modules = tryGlobPaths();\r\n const routes: Record<string, RouteComponent> = {};\r\n const dynamicRoutes: DynamicRoute[] = [];\r\n\r\n for (const [filePath, mod] of Object.entries(modules)) {\r\n const routePath = filePathToRoute(filePath);\r\n let component: RouteComponent | undefined = undefined;\r\n if (mod && typeof mod === \"object\") {\r\n if (\"default\" in mod && mod.default) {\r\n component = mod.default;\r\n } else {\r\n const keys = Object.keys(mod);\r\n const firstKey = keys.length > 0 ? keys[0] : undefined;\r\n if (\r\n firstKey !== undefined &&\r\n typeof firstKey === \"string\" &&\r\n typeof mod[firstKey] !== \"undefined\"\r\n ) {\r\n component = mod[firstKey];\r\n } else {\r\n const values = Object.values(mod).filter(Boolean);\r\n if (values.length > 0) {\r\n component = values[0] as RouteComponent;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!component || typeof routePath !== \"string\") continue;\r\n\r\n const hasDynamic = /:[^/]+/.test(routePath);\r\n\r\n if (hasDynamic) {\r\n dynamicRoutes.push({\r\n pattern: routePath,\r\n regex: new RegExp(\"^\" + routePath.replace(/:[^/]+/g, \"([^/]+)\") + \"$\"),\r\n component,\r\n params: [...routePath.matchAll(/:([^/]+)/g)]\r\n .map((m) => m[1])\r\n .filter((p): p is string => typeof p === \"string\"),\r\n });\r\n } else {\r\n routes[routePath] = component;\r\n }\r\n }\r\n\r\n // ---------------------- Core Rendering ----------------------\r\n /**\r\n * Core route rendering function (immediate)\r\n */\r\n function renderRouteImmediate(): void {\r\n if (isDestroyed) return;\r\n\r\n const path = normalizePath(window.location.pathname);\r\n let Page: RouteComponent | undefined = routes[path];\r\n let params: Record<string, string> = {};\r\n let routeProps: Record<string, any> = {};\r\n\r\n // Try dynamic route matching if no static route found\r\n if (!Page) {\r\n const match = matchDynamicRoute(path, dynamicRoutes);\r\n if (match) {\r\n Page = match.component;\r\n params = match.params;\r\n }\r\n }\r\n\r\n const root = document.querySelector(rootSelector);\r\n if (!root) {\r\n console.error(\"[Router] Root element not found:\", rootSelector);\r\n return;\r\n }\r\n\r\n // Show 404 if no route found\r\n if (!Page) {\r\n root.innerHTML = `<h2>404 Not Found</h2><p>Path: ${escapeHTML(path)}</p>`;\r\n updateMetaTags({ title: \"404 - Page Not Found\" });\r\n return;\r\n }\r\n\r\n // Retrieve props from cache or history state\r\n const state = (window.history.state || {}) as HistoryState;\r\n let passedProps: Record<string, any> = {};\r\n\r\n if (state.__fynixCacheKey && propsCache.has(state.__fynixCacheKey)) {\r\n passedProps = propsCache.get(state.__fynixCacheKey)!;\r\n } else if (state.serializedProps) {\r\n passedProps = deserializeProps(state.serializedProps);\r\n }\r\n\r\n // Get route-specific props\r\n if (Page.props) {\r\n routeProps = typeof Page.props === \"function\" ? Page.props() : Page.props;\r\n }\r\n\r\n // Update meta tags\r\n if (Page.meta) {\r\n const meta =\r\n typeof Page.meta === \"function\" ? Page.meta(params) : Page.meta;\r\n updateMetaTags(meta);\r\n }\r\n\r\n // Merge all props\r\n window.__lastRouteProps = {\r\n ...routeProps,\r\n ...passedProps,\r\n params,\r\n };\r\n\r\n // Mount the page component\r\n try {\r\n mount(Page, rootSelector, window.__lastRouteProps);\r\n } catch (err) {\r\n console.error(\"[Router] Mount failed:\", err);\r\n root.innerHTML = `<pre style=\"color:red;\">Mount Error occurred</pre>`;\r\n }\r\n\r\n currentPath = path;\r\n }\r\n /**\r\n * Debounced route rendering to prevent race conditions\r\n */\r\n function renderRoute(): void {\r\n if (isDestroyed) return;\r\n\r\n if (renderTimeout) {\r\n clearTimeout(renderTimeout);\r\n }\r\n\r\n renderTimeout = setTimeout(async () => {\r\n await renderRouteImmediate();\r\n renderTimeout = null;\r\n }, RENDER_DEBOUNCE);\r\n }\r\n // ---------------------- Navigation Methods ----------------------\r\n\r\n /**\r\n * Navigate to a new path with props\r\n */\r\n function navigate(path: string, props: Record<string, any> = {}): void {\r\n if (isDestroyed) return;\r\n\r\n const normalizedPath = normalizePath(path);\r\n\r\n if (!isValidURL(window.location.origin + normalizedPath)) {\r\n console.error(\"[Router] Invalid navigation URL\");\r\n return;\r\n }\r\n\r\n if (normalizedPath === currentPath) return;\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(propsCache, cacheKey, props);\r\n\r\n try {\r\n window.history.pushState(\r\n { __fynixCacheKey: cacheKey },\r\n \"\",\r\n normalizedPath\r\n );\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Navigation failed:\", err);\r\n }\r\n }\r\n\r\n /**\r\n * Replace current path with new path and props\r\n */\r\n function replace(path: string, props: Record<string, any> = {}): void {\r\n if (isDestroyed) return;\r\n\r\n const normalizedPath = normalizePath(path);\r\n\r\n if (!isValidURL(window.location.origin + normalizedPath)) {\r\n console.error(\"[Router] Invalid replace URL\");\r\n return;\r\n }\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(propsCache, cacheKey, props);\r\n\r\n try {\r\n window.history.replaceState(\r\n { __fynixCacheKey: cacheKey },\r\n \"\",\r\n normalizedPath\r\n );\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Replace failed:\", err);\r\n }\r\n }\r\n\r\n /**\r\n * Navigate back in history\r\n */\r\n function back(): void {\r\n if (isDestroyed) return;\r\n\r\n try {\r\n window.history.back();\r\n } catch (err) {\r\n console.error(\"[Router] Back navigation failed:\", err);\r\n }\r\n }\r\n\r\n // ---------------------- Event Handlers ----------------------\r\n\r\n /**\r\n * Link click delegation handler\r\n */\r\n const clickHandler = (e: Event): void => {\r\n if (isDestroyed) return;\r\n\r\n const target = e.target as HTMLElement;\r\n const link = target.closest(\r\n \"a[data-fynix-link]\"\r\n ) as HTMLAnchorElement | null;\r\n\r\n if (!link) return;\r\n\r\n const href = link.getAttribute(\"href\");\r\n if (!href) {\r\n console.warn(\"[Router] Missing href attribute\");\r\n return;\r\n }\r\n\r\n // Ignore external links\r\n if (isExternal(href)) {\r\n return; // Let the browser handle it\r\n }\r\n\r\n // Build full URL for validation (handles relative URLs)\r\n const fullUrl = new URL(link.href, window.location.origin).href;\r\n if (!isValidURL(fullUrl)) {\r\n console.warn(\"[Router] Invalid link href\");\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n const path = normalizePath(\r\n new URL(link.href, window.location.origin).pathname\r\n );\r\n\r\n if (path === currentPath) return;\r\n\r\n let props: Record<string, any> = {};\r\n const propsKey = link.getAttribute(\"data-props-key\");\r\n\r\n if (\r\n propsKey &&\r\n typeof propsKey === \"string\" &&\r\n !propsKey.startsWith(\"__\")\r\n ) {\r\n if (window[PROPS_NAMESPACE]?.[propsKey]) {\r\n props = window[PROPS_NAMESPACE][propsKey];\r\n }\r\n }\r\n\r\n // Serialize props (extract values from reactive states)\r\n const serializableProps: Record<string, any> = {};\r\n for (const [k, v] of Object.entries(props)) {\r\n if (typeof k !== \"string\" || k.startsWith(\"__\")) continue;\r\n serializableProps[k] =\r\n v && (v._isNixState || v._isRestState) ? v.value : v;\r\n }\r\n\r\n const cacheKey = generateCacheKey();\r\n addToCache(propsCache, cacheKey, serializableProps);\r\n\r\n try {\r\n window.history.pushState(\r\n { __fynixCacheKey: cacheKey, serializedProps: serializableProps },\r\n \"\",\r\n path\r\n );\r\n renderRoute();\r\n } catch (err) {\r\n console.error(\"[Router] Link navigation failed:\", err);\r\n }\r\n };\r\n\r\n // ---------------------- Event Listener Setup ----------------------\r\n\r\n // Only add listeners if not already added\r\n if (listenerCount < MAX_LISTENERS && !isRouterInitialized) {\r\n document.addEventListener(\"click\", clickHandler);\r\n listeners.push({\r\n element: document,\r\n event: \"click\",\r\n handler: clickHandler,\r\n });\r\n listenerCount++;\r\n\r\n window.addEventListener(\"popstate\", renderRoute);\r\n listeners.push({\r\n element: window,\r\n event: \"popstate\",\r\n handler: renderRoute,\r\n });\r\n listenerCount++;\r\n }\r\n\r\n // ---------------------- Public Methods ----------------------\r\n\r\n /**\r\n * Mount the router to a DOM element\r\n */\r\n function mountRouter(selector: string = \"#app-root\"): void {\r\n if (isDestroyed) {\r\n console.error(\"[Router] Cannot mount destroyed router\");\r\n return;\r\n }\r\n\r\n if (typeof selector !== \"string\" || selector.length === 0) {\r\n console.error(\"[Router] Invalid selector\");\r\n return;\r\n }\r\n\r\n rootSelector = selector;\r\n renderRoute();\r\n isRouterInitialized = true;\r\n }\r\n\r\n /**\r\n * Cleanup function\r\n */\r\n function cleanup(): void {\r\n // Clear timeout FIRST to prevent pending renders\r\n if (renderTimeout) {\r\n clearTimeout(renderTimeout);\r\n renderTimeout = null;\r\n }\r\n\r\n // Mark as destroyed\r\n isDestroyed = true;\r\n\r\n // Remove all event listeners\r\n listeners.forEach(({ element, event, handler }) => {\r\n try {\r\n element.removeEventListener(event, handler);\r\n } catch (e) {\r\n console.error(\"[Router] Cleanup error:\", e);\r\n }\r\n });\r\n listeners.length = 0;\r\n listenerCount = 0;\r\n\r\n // Clean up all cached props\r\n propsCache.forEach((props) => {\r\n if (props && typeof props === \"object\") {\r\n Object.values(props).forEach((val) => {\r\n if (val && typeof val === \"object\" && \"cleanup\" in val) {\r\n try {\r\n (val as any).cleanup();\r\n } catch (e) {\r\n // Silent cleanup failure\r\n }\r\n }\r\n });\r\n }\r\n });\r\n propsCache.clear();\r\n\r\n // Clean up global namespace\r\n if (window[PROPS_NAMESPACE]) {\r\n const ns = window[PROPS_NAMESPACE];\r\n if (ns && typeof ns === \"object\") {\r\n Object.keys(ns).forEach((key) => {\r\n delete ns[key];\r\n });\r\n }\r\n delete window[PROPS_NAMESPACE];\r\n }\r\n\r\n // Clear last route props\r\n if (window.__lastRouteProps) {\r\n delete window.__lastRouteProps;\r\n }\r\n\r\n // Reset singleton flags at the VERY end\r\n isRouterInitialized = false;\r\n routerInstance = null;\r\n\r\n console.log(\"[Router] Cleanup complete\");\r\n }\r\n\r\n // ---------------------- HMR Support ----------------------\r\n\r\n // @ts-ignore - Vite HMR API\r\n if (import.meta.hot) {\r\n // @ts-ignore\r\n import.meta.hot.accept(() => {\r\n console.log(\"[Router] HMR detected, re-rendering route...\");\r\n renderRoute();\r\n });\r\n\r\n // @ts-ignore\r\n import.meta.hot.dispose(() => {\r\n console.log(\"[Router] HMR dispose, cleaning up...\");\r\n cleanup();\r\n // Reset singleton flags for HMR\r\n routerInstance = null;\r\n isRouterInitialized = false;\r\n });\r\n }\r\n\r\n // ---------------------- Router Instance ----------------------\r\n\r\n const router: FynixRouter = {\r\n mountRouter,\r\n navigate,\r\n replace,\r\n back,\r\n cleanup,\r\n routes,\r\n dynamicRoutes,\r\n };\r\n\r\n routerInstance = router;\r\n return router;\r\n}\r\n\r\n// Export as both named and default\r\nexport { createFynix };\r\nexport default createFynix;\r\n// ---------------------- Helper Exports ----------------------\r\n\r\n/**\r\n * Set props for links\r\n */\r\nexport function setLinkProps(key: string, props: Record<string, any>): void {\r\n if (typeof key !== \"string\" || key.startsWith(\"__\")) {\r\n console.error(\"[Router] Invalid props key\");\r\n return;\r\n }\r\n\r\n if (!props || typeof props !== \"object\") {\r\n console.error(\"[Router] Invalid props object\");\r\n return;\r\n }\r\n\r\n if (!window[PROPS_NAMESPACE]) {\r\n window[PROPS_NAMESPACE] = {};\r\n }\r\n\r\n if (Object.keys(window[PROPS_NAMESPACE]).length >= MAX_CACHE_SIZE) {\r\n console.warn(\"[Router] Props storage limit reached\");\r\n return;\r\n }\r\n\r\n window[PROPS_NAMESPACE][key] = props;\r\n}\r\n\r\n/**\r\n * Clear link props\r\n */\r\nexport function clearLinkProps(key: string): void {\r\n if (typeof key !== \"string\") return;\r\n\r\n if (window[PROPS_NAMESPACE]?.[key]) {\r\n const props = window[PROPS_NAMESPACE][key];\r\n\r\n if (props && typeof props === \"object\") {\r\n Object.values(props).forEach((val) => {\r\n if (val && typeof val === \"object\" && \"cleanup\" in val) {\r\n try {\r\n (val as any).cleanup();\r\n } catch (e) {\r\n // Silent cleanup failure\r\n }\r\n }\r\n });\r\n }\r\n\r\n delete window[PROPS_NAMESPACE][key];\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,62 @@
1
+ type VNodeType = string | symbol | ComponentFunction;
2
+ type VNodeChild = VNode | string | number | boolean | null | undefined;
3
+ type VNodeChildren = VNodeChild | VNodeChild[];
4
+ interface VNodeProps {
5
+ children?: VNode[];
6
+ key?: string | number | null;
7
+ [key: string]: any;
8
+ }
9
+ interface VNode {
10
+ type: VNodeType;
11
+ props: VNodeProps;
12
+ key: string | number | null;
13
+ _domNode?: Node | null;
14
+ _rendered?: VNode | null;
15
+ _state?: ReactiveState<any> | null;
16
+ _cleanup?: (() => void) | null;
17
+ }
18
+ interface ComponentFunction {
19
+ (props: any): VNode | Promise<VNode>;
20
+ }
21
+ interface ReactiveState<T> {
22
+ value: T;
23
+ _isNixState: boolean;
24
+ subscribe(callback: () => void): () => void;
25
+ }
26
+ import { Button, Path } from "./custom/index";
27
+ import { nixAsync } from "./hooks/nixAsync";
28
+ import { nixAsyncCached } from "./hooks/nixAsyncCache";
29
+ import { nixAsyncDebounce } from "./hooks/nixAsyncDebounce";
30
+ import { nixAsyncQuery } from "./hooks/nixAsyncQuery";
31
+ import { nixCallback } from "./hooks/nixCallback";
32
+ import { nixComputed } from "./hooks/nixComputed";
33
+ import { nixDebounce } from "./hooks/nixDebounce";
34
+ import { nixEffect, nixEffectAlways, nixEffectOnce } from "./hooks/nixEffect";
35
+ import { nixForm } from "./hooks/nixForm";
36
+ import { nixFormAsync } from "./hooks/nixFormAsync";
37
+ import { nixInterval } from "./hooks/nixInterval";
38
+ import { nixLazy, Suspense } from "./hooks/nixLazy";
39
+ import { nixLazyAsync } from "./hooks/nixLazyAsync";
40
+ import { nixLazyFormAsync } from "./hooks/nixLazyFormAsync";
41
+ import { nixLocalStorage } from "./hooks/nixLocalStorage";
42
+ import { nixMemo } from "./hooks/nixMemo";
43
+ import { nixPrevious } from "./hooks/nixPrevious";
44
+ import { nixRef } from "./hooks/nixRef";
45
+ import { nixState } from "./hooks/nixState";
46
+ import { nixStore } from "./hooks/nixStore";
47
+ import createFynix from "./router/router";
48
+ export declare const TEXT: unique symbol;
49
+ export declare const Fragment: unique symbol;
50
+ export declare function createTextVNode(text: any): VNode;
51
+ export declare function h(type: VNodeType, props?: VNodeProps | null, ...children: VNodeChildren[]): VNode;
52
+ export declare namespace h {
53
+ var Fragment: ({ children }: {
54
+ children?: VNode[];
55
+ }) => VNode[];
56
+ }
57
+ export declare const Fynix: typeof h;
58
+ export declare function renderComponent(Component: ComponentFunction, props?: any): VNode;
59
+ export declare function patch(parent: Node, newVNode: VNode | string | number | null | undefined, oldVNode: VNode | string | number | null | undefined): Promise<void>;
60
+ export declare function mount(AppComponent: ComponentFunction, root: string | Element, props?: any): void;
61
+ export { Button, createFynix, nixAsync, nixAsyncCached, nixAsyncDebounce, nixAsyncQuery, nixCallback, nixComputed, nixDebounce, nixEffect, nixEffectAlways, nixEffectOnce, nixForm, nixFormAsync, nixInterval, nixLazy, nixLazyAsync, nixLazyFormAsync, nixLocalStorage, nixMemo, nixPrevious, nixRef, nixState, nixStore, Path, Suspense, };
62
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../runtime.ts"],"names":[],"mappings":"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"}