@fynixorg/ui 1.0.13 → 1.0.15

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
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 // Always try absolute from src first (Vite project root)\r\n let modules = import.meta.glob(\"/src/**/*.{fnx,tsx,jsx,ts,js}\", {\r\n eager: true,\r\n });\r\n console.log(\"[Router] Glob attempt 1 (/src/**):\", Object.keys(modules));\r\n\r\n // Fallback: try relative patterns (for monorepo or unusual setups)\r\n if (Object.keys(modules).length === 0) {\r\n modules = import.meta.glob(\r\n [\"./**/*.fnx\", \"./**/*.tsx\", \"./**/*.jsx\", \"./**/*.ts\", \"./**/*.js\"],\r\n { eager: true }\r\n );\r\n console.log(\"[Router] Glob attempt 2 (./**):\", Object.keys(modules));\r\n }\r\n\r\n // Fallback: 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 3 (../**):\", 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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",
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\n// Enhanced Route Configuration for Enterprise Scale\r\ninterface RouteConfig {\r\n component: () => Promise<any>;\r\n preload?: boolean;\r\n priority?: \"high\" | \"medium\" | \"low\";\r\n prefetch?: string[]; // Related routes to prefetch\r\n guard?: RouteGuard;\r\n meta?: RouteMeta | ((params: Record<string, string>) => RouteMeta);\r\n keepAlive?: boolean;\r\n layout?: ComponentFunction;\r\n}\r\n\r\ninterface RouteGuard {\r\n canActivate?: (\r\n route: string,\r\n params: Record<string, string>\r\n ) => boolean | Promise<boolean>;\r\n canDeactivate?: (route: string) => boolean | Promise<boolean>;\r\n redirect?: string;\r\n}\r\n\r\ninterface RouteMatch {\r\n component: RouteComponent;\r\n params: Record<string, string>;\r\n meta?: RouteMeta;\r\n}\r\n\r\ninterface NestedRoute {\r\n path: string;\r\n component: ComponentFunction;\r\n children?: NestedRoute[];\r\n layout?: ComponentFunction;\r\n keepAlive?: boolean;\r\n}\r\n\r\ninterface ComponentFunction {\r\n (props: any): any;\r\n}\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 // Enterprise features\r\n preloadRoute?(path: string): Promise<void>;\r\n clearCache?(): void;\r\n enableNestedRouting?(routes: NestedRoute[]): void;\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 - Enhanced version\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 .replace(/=/g, \"&#x3D;\")\r\n .replace(/\\(/g, \"&#x28;\")\r\n .replace(/\\)/g, \"&#x29;\")\r\n .replace(/\\{/g, \"&#x7B;\")\r\n .replace(/\\}/g, \"&#x7D;\")\r\n .replace(/\\[/g, \"&#x5B;\")\r\n .replace(/\\]/g, \"&#x5D;\");\r\n}\r\n\r\n/**\r\n * Sanitize content for safe DOM insertion\r\n */\r\nfunction sanitizeContent(content: string): string {\r\n // Remove potentially dangerous elements and attributes\r\n return content\r\n .replace(/<script[^>]*>.*?<\\/script>/gis, \"\")\r\n .replace(/<iframe[^>]*>.*?<\\/iframe>/gis, \"\")\r\n .replace(/<object[^>]*>.*?<\\/object>/gis, \"\")\r\n .replace(/<embed[^>]*>/gi, \"\")\r\n .replace(/<link[^>]*>/gi, \"\")\r\n .replace(/on\\w+\\s*=/gi, \"\")\r\n .replace(/javascript:/gi, \"\")\r\n .replace(/vbscript:/gi, \"\")\r\n .replace(/data:/gi, \"\")\r\n .replace(/expression\\s*\\(/gi, \"\");\r\n}\r\n\r\n/**\r\n * Validate and sanitize component props\r\n */\r\nfunction sanitizeProps(props: Record<string, any>): Record<string, any> {\r\n const sanitized: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(props)) {\r\n // Skip dangerous keys\r\n if (\r\n typeof key !== \"string\" ||\r\n key.startsWith(\"__\") ||\r\n key.includes(\"javascript\") ||\r\n key.includes(\"on\")\r\n ) {\r\n continue;\r\n }\r\n\r\n // Sanitize string values\r\n if (typeof value === \"string\") {\r\n // First sanitize any HTML content, then escape remaining characters\r\n const cleanContent = sanitizeContent(value);\r\n sanitized[key] = escapeHTML(cleanContent);\r\n } else if (typeof value === \"object\" && value !== null) {\r\n // Recursively sanitize nested objects (with depth limit)\r\n if (Object.keys(value).length < 50) {\r\n // Prevent DoS\r\n sanitized[key] = sanitizeProps(value);\r\n }\r\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\r\n sanitized[key] = value;\r\n }\r\n // Skip functions and other potentially dangerous types\r\n }\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Validate URL to prevent open redirect - Enhanced security\r\n */\r\nfunction isValidURL(url: string): boolean {\r\n try {\r\n // Reject URLs with suspicious patterns\r\n const suspiciousPatterns = [\r\n /javascript:/i,\r\n /vbscript:/i,\r\n /data:/i,\r\n /mailto:/i,\r\n /tel:/i,\r\n /ftp:/i,\r\n /file:/i,\r\n /%2f%2f/i, // Double slash encoding\r\n /%5c%5c/i, // Double backslash encoding\r\n /\\\\\\\\/, // UNC paths\r\n /@/, // Potential credential injection\r\n ];\r\n\r\n if (suspiciousPatterns.some((pattern) => pattern.test(url))) {\r\n console.warn(\"[Router] Security: Suspicious URL pattern blocked\");\r\n return false;\r\n }\r\n\r\n const parsed = new URL(url, window.location.origin);\r\n\r\n // Strict origin validation\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 // Protocol validation\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 // Additional checks for encoded attacks\r\n const decodedPath = decodeURIComponent(parsed.pathname);\r\n if (decodedPath !== parsed.pathname && /[<>\"'`]/.test(decodedPath)) {\r\n console.warn(\"[Router] Security: Encoded XSS attempt blocked\");\r\n return false;\r\n }\r\n\r\n // Check for excessive length (DoS prevention)\r\n if (url.length > 2048) {\r\n console.warn(\"[Router] Security: Excessively long URL blocked\");\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 // Always try absolute from src first (Vite project root)\r\n let modules = import.meta.glob(\"/src/**/*.{fnx,tsx,jsx,ts,js}\", {\r\n eager: true,\r\n });\r\n /* console.log(\"[Router] Glob attempt 1 (/src/**):\", Object.keys(modules)); */\r\n\r\n // Fallback: try relative patterns (for monorepo or unusual setups)\r\n if (Object.keys(modules).length === 0) {\r\n modules = import.meta.glob(\r\n [\"./**/*.fnx\", \"./**/*.tsx\", \"./**/*.jsx\", \"./**/*.ts\", \"./**/*.js\"],\r\n { eager: true }\r\n );\r\n /* console.log(\"[Router] Glob attempt 2 (./**):\", Object.keys(modules)); */\r\n }\r\n\r\n // Fallback: 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 3 (../**):\", 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\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 enhanced XSS prevention\r\n */\r\nfunction updateMetaTags(meta: RouteMeta = {}): void {\r\n if (!meta || typeof meta !== \"object\") return;\r\n\r\n // Sanitize title with length limit\r\n if (meta.title && typeof meta.title === \"string\") {\r\n const sanitizedTitle = escapeHTML(meta.title).substring(0, 60); // SEO best practice\r\n document.title = sanitizedTitle;\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=\"${CSS.escape(def.name)}\"]`\r\n : `meta[property=\"${CSS.escape(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 // Additional validation for meta content - sanitize HTML first\r\n const cleanValue = sanitizeContent(value);\r\n const sanitizedValue = escapeHTML(cleanValue).substring(0, 300); // Reasonable length limit\r\n\r\n // Block suspicious content\r\n if (/javascript:|vbscript:|data:|<|>/i.test(sanitizedValue)) {\r\n console.warn(\r\n `[Router] Security: Blocked suspicious meta content for ${def.key}`\r\n );\r\n return;\r\n }\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\", sanitizedValue);\r\n });\r\n}\r\n\r\n// ---------------------- Enterprise Router Classes ----------------------\r\n\r\n/**\r\n * Advanced route management with preloading and caching\r\n */\r\nclass EnterpriseRouter {\r\n private routeCache = new Map<string, any>();\r\n private preloadQueue = new Set<string>();\r\n private routeMatchCache = new Map<string, RouteMatch | null>();\r\n private routes: Record<string, RouteConfig> = {};\r\n\r\n setRoutes(routes: Record<string, RouteConfig>) {\r\n if (!routes || typeof routes !== \"object\") {\r\n console.warn(\"[EnterpriseRouter] Invalid routes configuration\");\r\n return;\r\n }\r\n this.routes = routes;\r\n }\r\n\r\n async preloadRoute(path: string): Promise<void> {\r\n if (this.routeCache.has(path)) return;\r\n\r\n const route = this.routes[path];\r\n if (route?.component) {\r\n // Load in background during idle time\r\n const loadRoute = async () => {\r\n try {\r\n const component = await route.component();\r\n this.routeCache.set(path, component);\r\n\r\n // Preload related routes\r\n route.prefetch?.forEach((prefetchPath) => {\r\n this.preloadQueue.add(prefetchPath);\r\n });\r\n\r\n console.log(`[EnterpriseRouter] Preloaded route: ${path}`);\r\n } catch (error) {\r\n console.warn(\r\n `[EnterpriseRouter] Failed to preload route ${path}:`,\r\n error\r\n );\r\n }\r\n };\r\n\r\n if (\"requestIdleCallback\" in window) {\r\n requestIdleCallback(loadRoute);\r\n } else {\r\n setTimeout(loadRoute, 0);\r\n }\r\n }\r\n }\r\n\r\n // Smart route matching with caching\r\n matchRoute(path: string): RouteMatch | null {\r\n const cached = this.routeMatchCache.get(path);\r\n if (cached !== undefined) return cached;\r\n\r\n const match = this.computeRouteMatch(path);\r\n\r\n // Cache the result with LRU eviction\r\n if (this.routeMatchCache.size > 100) {\r\n const firstKey = this.routeMatchCache.keys().next().value;\r\n if (firstKey !== undefined) {\r\n this.routeMatchCache.delete(firstKey);\r\n }\r\n }\r\n\r\n this.routeMatchCache.set(path, match);\r\n return match;\r\n }\r\n\r\n private computeRouteMatch(path: string): RouteMatch | null {\r\n // Extract parameters from dynamic routes\r\n const segments = path.split(\"/\").filter(Boolean);\r\n\r\n for (const [routePath, routeConfig] of Object.entries(this.routes)) {\r\n const routeSegments = routePath.split(\"/\").filter(Boolean);\r\n\r\n if (segments.length !== routeSegments.length) continue;\r\n\r\n const params: Record<string, string> = {};\r\n let isMatch = true;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const segment = segments[i];\r\n const routeSegment = routeSegments[i];\r\n\r\n if (routeSegment && segment) {\r\n if (routeSegment.startsWith(\":\")) {\r\n // Dynamic parameter\r\n params[routeSegment.slice(1)] = segment;\r\n } else if (segment !== routeSegment) {\r\n isMatch = false;\r\n break;\r\n }\r\n } else {\r\n isMatch = false;\r\n break;\r\n }\r\n }\r\n\r\n if (isMatch) {\r\n return {\r\n component: routeConfig.component as any,\r\n params,\r\n meta:\r\n typeof routeConfig.meta === \"function\"\r\n ? routeConfig.meta(params)\r\n : routeConfig.meta,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n async checkRouteGuard(\r\n route: RouteConfig,\r\n path: string,\r\n params: Record<string, string>\r\n ): Promise<boolean> {\r\n if (!route.guard) return true;\r\n\r\n if (route.guard.canActivate) {\r\n const canActivate = await route.guard.canActivate(path, params);\r\n return canActivate;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n getPreloadedComponent(path: string): any {\r\n return this.routeCache.get(path);\r\n }\r\n\r\n clearCache(): void {\r\n this.routeCache.clear();\r\n this.routeMatchCache.clear();\r\n this.preloadQueue.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Nested routing with layout persistence\r\n */\r\nclass LayoutRouter {\r\n private layoutCache = new Map<string, any>();\r\n private keepAliveComponents = new Map<string, any>();\r\n\r\n renderNestedRoutes(routes: NestedRoute[], segments: string[]): any {\r\n if (segments.length === 0) return null;\r\n\r\n const [currentSegment, ...remainingSegments] = segments;\r\n const currentRoute = routes.find((r) => r.path === currentSegment);\r\n\r\n if (!currentRoute) return null;\r\n\r\n let content: any;\r\n\r\n if (remainingSegments.length > 0 && currentRoute.children) {\r\n // Recursive nested routing\r\n content = this.renderNestedRoutes(\r\n currentRoute.children,\r\n remainingSegments\r\n );\r\n } else {\r\n // Leaf route - render component with keep-alive if needed\r\n if (currentRoute.keepAlive && currentSegment) {\r\n content = this.renderKeepAlive(currentRoute.component, currentSegment);\r\n } else {\r\n content = this.renderComponent(currentRoute.component);\r\n }\r\n }\r\n\r\n // Wrap in layout if specified\r\n if (currentRoute.layout) {\r\n const layoutKey = `${currentSegment}_layout`;\r\n let layoutComponent = this.layoutCache.get(layoutKey);\r\n\r\n if (!layoutComponent) {\r\n layoutComponent = this.renderComponent(currentRoute.layout);\r\n this.layoutCache.set(layoutKey, layoutComponent);\r\n }\r\n\r\n return this.renderComponent(currentRoute.layout, { children: content });\r\n }\r\n\r\n return content;\r\n }\r\n\r\n private renderKeepAlive(component: ComponentFunction, key: string): any {\r\n if (this.keepAliveComponents.has(key)) {\r\n return this.keepAliveComponents.get(key);\r\n }\r\n\r\n const rendered = this.renderComponent(component);\r\n this.keepAliveComponents.set(key, rendered);\r\n return rendered;\r\n }\r\n\r\n private renderComponent(component: ComponentFunction, props: any = {}): any {\r\n try {\r\n return component(props);\r\n } catch (error) {\r\n console.error(\"[LayoutRouter] Component render error:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n this.layoutCache.clear();\r\n this.keepAliveComponents.clear();\r\n }\r\n}\r\n\r\n// Global instances\r\nconst enterpriseRouter = new EnterpriseRouter();\r\nconst layoutRouter = new LayoutRouter();\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 let lastNavigationTime = 0;\r\n const NAVIGATION_RATE_LIMIT = 100; // ms between navigations\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 * Enhanced core route rendering function with enterprise features\r\n */\r\n async function renderRouteImmediate(): Promise<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 enterprise router matching first\r\n const enterpriseMatch = enterpriseRouter.matchRoute(path);\r\n if (enterpriseMatch) {\r\n // Check if component is preloaded\r\n const preloadedComponent = enterpriseRouter.getPreloadedComponent(path);\r\n if (preloadedComponent) {\r\n Page = preloadedComponent;\r\n } else {\r\n Page = enterpriseMatch.component;\r\n }\r\n params = enterpriseMatch.params;\r\n }\r\n\r\n // Fallback to original dynamic route matching\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 enhanced 404 if no route found\r\n if (!Page) {\r\n root.innerHTML = \"\";\r\n const container = document.createElement(\"div\");\r\n container.style.cssText =\r\n \"padding: 2rem; text-align: center; font-family: system-ui, sans-serif;\";\r\n\r\n const heading = document.createElement(\"h2\");\r\n heading.textContent = \"404 Not Found\";\r\n heading.style.cssText = \"color: #dc2626; margin-bottom: 1rem;\";\r\n\r\n const pathInfo = document.createElement(\"p\");\r\n const safePath = escapeHTML(sanitizeContent(path));\r\n pathInfo.textContent = `Path: ${safePath}`;\r\n pathInfo.style.cssText = \"color: #6b7280; margin-bottom: 2rem;\";\r\n\r\n const backButton = document.createElement(\"button\");\r\n backButton.textContent = \"Go Back\";\r\n backButton.style.cssText =\r\n \"padding: 0.5rem 1rem; background: #3b82f6; color: white; border: none; border-radius: 0.25rem; cursor: pointer;\";\r\n backButton.onclick = () => window.history.back();\r\n\r\n container.appendChild(heading);\r\n container.appendChild(pathInfo);\r\n container.appendChild(backButton);\r\n root.appendChild(container);\r\n\r\n updateMetaTags({ title: \"404 - Page Not Found\" });\r\n\r\n // Preload commonly visited routes for better UX\r\n [\"/\", \"/home\", \"/about\"].forEach((commonPath) => {\r\n enterpriseRouter.preloadRoute(commonPath).catch(console.warn);\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Retrieve props from cache or history state with enhanced caching\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 and sanitize all props\r\n const unsafeProps = {\r\n ...routeProps,\r\n ...passedProps,\r\n params,\r\n };\r\n\r\n // Sanitize props before mounting to prevent XSS\r\n const safeProps = sanitizeProps(unsafeProps);\r\n window.__lastRouteProps = safeProps;\r\n\r\n // Mount the page component\r\n try {\r\n mount(Page, rootSelector, safeProps);\r\n } catch (err) {\r\n console.error(\"[Router] Mount failed:\", err);\r\n // Safe error display without innerHTML\r\n root.innerHTML = \"\";\r\n const errorDiv = document.createElement(\"pre\");\r\n errorDiv.style.color = \"red\";\r\n errorDiv.textContent = \"Mount Error occurred\";\r\n root.appendChild(errorDiv);\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 - Enhanced with preloading\r\n */\r\n function navigate(path: string, props: Record<string, any> = {}): void {\r\n if (isDestroyed) return;\r\n\r\n // Rate limiting to prevent DoS\r\n const now = Date.now();\r\n if (now - lastNavigationTime < NAVIGATION_RATE_LIMIT) {\r\n console.warn(\"[Router] Security: Navigation rate limited\");\r\n return;\r\n }\r\n lastNavigationTime = now;\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 // Preload the target route if possible\r\n enterpriseRouter.preloadRoute(normalizedPath).catch(console.warn);\r\n\r\n // Sanitize props before caching\r\n const sanitizedProps = sanitizeProps(props);\r\n const cacheKey = generateCacheKey();\r\n addToCache(propsCache, cacheKey, sanitizedProps);\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 - Enhanced security\r\n */\r\n function replace(path: string, props: Record<string, any> = {}): void {\r\n if (isDestroyed) return;\r\n\r\n // Rate limiting to prevent DoS\r\n const now = Date.now();\r\n if (now - lastNavigationTime < NAVIGATION_RATE_LIMIT) {\r\n console.warn(\"[Router] Security: Replace rate limited\");\r\n return;\r\n }\r\n lastNavigationTime = now;\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 // Sanitize props before caching\r\n const sanitizedProps = sanitizeProps(props);\r\n const cacheKey = generateCacheKey();\r\n addToCache(propsCache, cacheKey, sanitizedProps);\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 * Enhanced cleanup function with enterprise router cleanup\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 // Clean up enterprise router features\r\n enterpriseRouter.clearCache();\r\n layoutRouter.cleanup();\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 // Enterprise features\r\n preloadRoute: enterpriseRouter.preloadRoute.bind(enterpriseRouter),\r\n clearCache: () => {\r\n enterpriseRouter.clearCache();\r\n layoutRouter.cleanup();\r\n },\r\n enableNestedRouting: (nestedRoutes: NestedRoute[]) => {\r\n // Store nested routes configuration\r\n (router as any).nestedRoutes = nestedRoutes;\r\n console.log(\r\n \"[Router] Nested routing enabled with\",\r\n nestedRoutes.length,\r\n \"routes\"\r\n );\r\n },\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": ";;AA4BA,SAAS,aAAa;AAsGtB,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,oBAAoB,CAAC,SAAS,UAAU,EAAE;AAChD,MAAM,kBAAkB;AAIxB,IAAI,iBAAqC;AACzC,IAAI,sBAAsB;AAO1B,SAAS,WAAW,KAAsB;AACxC,SAAO,eAAe,KAAK,GAAG;AAChC;AAFS;AAOT,SAAS,WAAW,KAAsB;AACxC,MAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO,EACrB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,QAAQ;AAC5B;AAlBS;AAuBT,SAAS,gBAAgB,SAAyB;AAEhD,SAAO,QACJ,QAAQ,iCAAiC,EAAE,EAC3C,QAAQ,iCAAiC,EAAE,EAC3C,QAAQ,iCAAiC,EAAE,EAC3C,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,eAAe,EAAE,EACzB,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,eAAe,EAAE,EACzB,QAAQ,WAAW,EAAE,EACrB,QAAQ,qBAAqB,EAAE;AACpC;AAbS;AAkBT,SAAS,cAAc,OAAiD;AACtE,QAAM,YAAiC,CAAC;AAExC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAEhD,QACE,OAAO,QAAQ,YACf,IAAI,WAAW,IAAI,KACnB,IAAI,SAAS,YAAY,KACzB,IAAI,SAAS,IAAI,GACjB;AACA;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,UAAU;AAE7B,YAAM,eAAe,gBAAgB,KAAK;AAC1C,gBAAU,GAAG,IAAI,WAAW,YAAY;AAAA,IAC1C,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI;AAElC,kBAAU,GAAG,IAAI,cAAc,KAAK;AAAA,MACtC;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAClE,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EAEF;AAEA,SAAO;AACT;AAhCS;AAqCT,SAAS,WAAW,KAAsB;AACxC,MAAI;AAEF,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAEA,QAAI,mBAAmB,KAAK,CAAC,YAAY,QAAQ,KAAK,GAAG,CAAC,GAAG;AAC3D,cAAQ,KAAK,mDAAmD;AAChE,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AAGlD,QAAI,OAAO,WAAW,OAAO,SAAS,QAAQ;AAC5C,cAAQ,KAAK,oDAAoD;AACjE,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,kBAAkB,SAAS,OAAO,QAAQ,GAAG;AAChD,cAAQ;AAAA,QACN;AAAA,QACA,OAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,mBAAmB,OAAO,QAAQ;AACtD,QAAI,gBAAgB,OAAO,YAAY,UAAU,KAAK,WAAW,GAAG;AAClE,cAAQ,KAAK,gDAAgD;AAC7D,aAAO;AAAA,IACT;AAGA,QAAI,IAAI,SAAS,MAAM;AACrB,cAAQ,KAAK,iDAAiD;AAC9D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,YAAQ,KAAK,wCAAwC;AACrD,WAAO;AAAA,EACT;AACF;AAzDS;AA8DT,SAAS,aAAa,MAAsB;AAC1C,MAAI,OAAO,SAAS,SAAU,QAAO;AAGrC,MAAI;AACF,WAAO,mBAAmB,IAAI;AAAA,EAChC,SAAS,GAAG;AACV,YAAQ,KAAK,uCAAuC;AACpD,WAAO;AAAA,EACT;AAGA,SAAO,KAAK,QAAQ,OAAO,EAAE;AAG7B,SAAO,KAAK,QAAQ,OAAO,GAAG;AAC9B,SAAO,KAAK,QAAQ,QAAQ,GAAG;AAG/B,SAAO,KACJ,MAAM,GAAG,EACT,OAAO,CAAC,SAAS,SAAS,QAAQ,SAAS,GAAG,EAC9C,KAAK,GAAG;AAGX,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,WAAO,MAAM;AAAA,EACf;AAGA,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG,GAAG;AACzC,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AAEA,SAAO,QAAQ;AACjB;AAnCS;AA6CT,SAAS,eAAoC;AAC3C,MAAI;AAEF,QAAI,UAAU,YAAY,KAAK,iCAAiC;AAAA,MAC9D,OAAO;AAAA,IACT,CAAC;AAID,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,gBAAU,YAAY;AAAA,QACpB,CAAC,cAAc,cAAc,cAAc,aAAa,WAAW;AAAA,QACnE,EAAE,OAAO,KAAK;AAAA,MAChB;AAAA,IAEF;AAGA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,gBAAU,YAAY;AAAA,QACpB,CAAC,eAAe,eAAe,aAAa;AAAA,QAC5C,EAAE,OAAO,KAAK;AAAA,MAChB;AAAA,IAEF;AAGA,WAAO,WAAW,CAAC;AAAA,EACrB,SAAS,OAAO;AACd,YAAQ,MAAM,oCAAoC,KAAK;AACvD,WAAO,CAAC;AAAA,EACV;AACF;AAhCS;AAqCT,SAAS,gBAAgB,UAA0B;AACjD,MAAI,QAAQ,SACT,QAAQ,YAAY,EAAE,EACtB,QAAQ,0BAA0B,EAAE,EACpC,QAAQ,WAAW,EAAE,EACrB,QAAQ,OAAO,EAAE;AAEpB,MAAI,CAAC,MAAO,SAAQ;AAGpB,UAAQ,MAAM,QAAQ,iBAAiB,KAAK;AAE5C,SAAO;AACT;AAbS;AAoBT,SAAS,kBACP,MACA,eACsE;AACtE,aAAW,SAAS,eAAe;AACjC,UAAM,QAAQ,KAAK,MAAM,MAAM,KAAK;AAEpC,QAAI,OAAO;AACT,YAAM,SAAiC,CAAC;AAExC,YAAM,OAAO,QAAQ,CAAC,OAAO,MAAM;AAEjC,cAAM,aAAa,MAAM,IAAI,CAAC;AAC9B,eAAO,KAAK,IAAI,WAAW,cAAc,EAAE;AAAA,MAC7C,CAAC;AAED,aAAO,EAAE,WAAW,MAAM,WAAW,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AArBS;AA4BT,SAAS,iBAAiB,OAAqC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AAEjD,QAAM,eAAoC,CAAC;AAE3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,GAAG;AACnD;AAAA,IACF;AACA,iBAAa,GAAG,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;AAbS;AAkBT,SAAS,cAAc,MAAsB;AAC3C,SAAO,aAAa,IAAI;AAC1B;AAFS;AAST,SAAS,mBAA2B;AAClC,MAAI,OAAO,WAAW,eAAe,OAAO,YAAY;AACtD,WAAO,OAAO,WAAW;AAAA,EAC3B;AAGA,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,EACxE,SAAS,EAAE,EACX,MAAM,CAAC,CAAC;AACb;AATS;AAcT,SAAS,WACP,OACA,KACA,OACM;AACN,MAAI,MAAM,QAAQ,gBAAgB;AAChC,UAAM,WAAW,MAAM,KAAK,EAAE,KAAK,EAAE;AACrC,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,UAAU,MAAM,IAAI,QAAQ;AAClC,UAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,eAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACtC,cAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,gBAAI;AACF,cAAC,IAAY,QAAQ;AAAA,YACvB,SAAS,GAAG;AAAA,YAEZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,IAAI,KAAK,KAAK;AACtB;AAzBS;AAmCT,MAAM,eAAiC;AAAA,EACrC,EAAE,KAAK,eAAe,MAAM,cAAc;AAAA,EAC1C,EAAE,KAAK,YAAY,MAAM,WAAW;AAAA,EACpC,EAAE,KAAK,eAAe,MAAM,eAAe;AAAA,EAC3C,EAAE,KAAK,WAAW,UAAU,WAAW;AAAA,EACvC,EAAE,KAAK,iBAAiB,UAAU,iBAAiB;AAAA,EACnD,EAAE,KAAK,WAAW,UAAU,WAAW;AACzC;AAKA,SAAS,eAAe,OAAkB,CAAC,GAAS;AAClD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAGvC,MAAI,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AAChD,UAAM,iBAAiB,WAAW,KAAK,KAAK,EAAE,UAAU,GAAG,EAAE;AAC7D,aAAS,QAAQ;AAAA,EACnB;AAEA,eAAa,QAAQ,CAAC,QAAQ;AAC5B,UAAM,QAAQ,KAAK,IAAI,GAAG;AAE1B,UAAM,WAAW,IAAI,OACjB,cAAc,IAAI,OAAO,IAAI,IAAI,CAAC,OAClC,kBAAkB,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;AAEpD,QAAI,KAAK,SAAS,cAAc,QAAQ;AAExC,QAAI,SAAS,MAAM;AACjB,UAAI,GAAI,IAAG,OAAO;AAClB;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,SAAU;AAG/B,UAAM,aAAa,gBAAgB,KAAK;AACxC,UAAM,iBAAiB,WAAW,UAAU,EAAE,UAAU,GAAG,GAAG;AAG9D,QAAI,mCAAmC,KAAK,cAAc,GAAG;AAC3D,cAAQ;AAAA,QACN,0DAA0D,IAAI,GAAG;AAAA,MACnE;AACA;AAAA,IACF;AAEA,QAAI,CAAC,IAAI;AACP,WAAK,SAAS,cAAc,MAAM;AAClC,UAAI,IAAI,KAAM,IAAG,aAAa,QAAQ,IAAI,IAAI;AAC9C,UAAI,IAAI,SAAU,IAAG,aAAa,YAAY,IAAI,QAAQ;AAC1D,eAAS,KAAK,YAAY,EAAE;AAAA,IAC9B;AAEA,OAAG,aAAa,WAAW,cAAc;AAAA,EAC3C,CAAC;AACH;AA9CS;AAqDT,MAAM,oBAAN,MAAM,kBAAiB;AAAA,EAAvB;AACE,SAAQ,aAAa,oBAAI,IAAiB;AAC1C,SAAQ,eAAe,oBAAI,IAAY;AACvC,SAAQ,kBAAkB,oBAAI,IAA+B;AAC7D,SAAQ,SAAsC,CAAC;AAAA;AAAA,EAE/C,UAAU,QAAqC;AAC7C,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,cAAQ,KAAK,iDAAiD;AAC9D;AAAA,IACF;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,aAAa,MAA6B;AAC9C,QAAI,KAAK,WAAW,IAAI,IAAI,EAAG;AAE/B,UAAM,QAAQ,KAAK,OAAO,IAAI;AAC9B,QAAI,OAAO,WAAW;AAEpB,YAAM,YAAY,mCAAY;AAC5B,YAAI;AACF,gBAAM,YAAY,MAAM,MAAM,UAAU;AACxC,eAAK,WAAW,IAAI,MAAM,SAAS;AAGnC,gBAAM,UAAU,QAAQ,CAAC,iBAAiB;AACxC,iBAAK,aAAa,IAAI,YAAY;AAAA,UACpC,CAAC;AAED,kBAAQ,IAAI,uCAAuC,IAAI,EAAE;AAAA,QAC3D,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,8CAA8C,IAAI;AAAA,YAClD;AAAA,UACF;AAAA,QACF;AAAA,MACF,GAjBkB;AAmBlB,UAAI,yBAAyB,QAAQ;AACnC,4BAAoB,SAAS;AAAA,MAC/B,OAAO;AACL,mBAAW,WAAW,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,MAAiC;AAC1C,UAAM,SAAS,KAAK,gBAAgB,IAAI,IAAI;AAC5C,QAAI,WAAW,OAAW,QAAO;AAEjC,UAAM,QAAQ,KAAK,kBAAkB,IAAI;AAGzC,QAAI,KAAK,gBAAgB,OAAO,KAAK;AACnC,YAAM,WAAW,KAAK,gBAAgB,KAAK,EAAE,KAAK,EAAE;AACpD,UAAI,aAAa,QAAW;AAC1B,aAAK,gBAAgB,OAAO,QAAQ;AAAA,MACtC;AAAA,IACF;AAEA,SAAK,gBAAgB,IAAI,MAAM,KAAK;AACpC,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAiC;AAEzD,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAE/C,eAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAClE,YAAM,gBAAgB,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO;AAEzD,UAAI,SAAS,WAAW,cAAc,OAAQ;AAE9C,YAAM,SAAiC,CAAC;AACxC,UAAI,UAAU;AAEd,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,cAAM,UAAU,SAAS,CAAC;AAC1B,cAAM,eAAe,cAAc,CAAC;AAEpC,YAAI,gBAAgB,SAAS;AAC3B,cAAI,aAAa,WAAW,GAAG,GAAG;AAEhC,mBAAO,aAAa,MAAM,CAAC,CAAC,IAAI;AAAA,UAClC,WAAW,YAAY,cAAc;AACnC,sBAAU;AACV;AAAA,UACF;AAAA,QACF,OAAO;AACL,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS;AACX,eAAO;AAAA,UACL,WAAW,YAAY;AAAA,UACvB;AAAA,UACA,MACE,OAAO,YAAY,SAAS,aACxB,YAAY,KAAK,MAAM,IACvB,YAAY;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBACJ,OACA,MACA,QACkB;AAClB,QAAI,CAAC,MAAM,MAAO,QAAO;AAEzB,QAAI,MAAM,MAAM,aAAa;AAC3B,YAAM,cAAc,MAAM,MAAM,MAAM,YAAY,MAAM,MAAM;AAC9D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAmB;AACvC,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EACjC;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;AAvIuB;AAAvB,IAAM,mBAAN;AA4IA,MAAM,gBAAN,MAAM,cAAa;AAAA,EAAnB;AACE,SAAQ,cAAc,oBAAI,IAAiB;AAC3C,SAAQ,sBAAsB,oBAAI,IAAiB;AAAA;AAAA,EAEnD,mBAAmB,QAAuB,UAAyB;AACjE,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,CAAC,gBAAgB,GAAG,iBAAiB,IAAI;AAC/C,UAAM,eAAe,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,cAAc;AAEjE,QAAI,CAAC,aAAc,QAAO;AAE1B,QAAI;AAEJ,QAAI,kBAAkB,SAAS,KAAK,aAAa,UAAU;AAEzD,gBAAU,KAAK;AAAA,QACb,aAAa;AAAA,QACb;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,aAAa,aAAa,gBAAgB;AAC5C,kBAAU,KAAK,gBAAgB,aAAa,WAAW,cAAc;AAAA,MACvE,OAAO;AACL,kBAAU,KAAK,gBAAgB,aAAa,SAAS;AAAA,MACvD;AAAA,IACF;AAGA,QAAI,aAAa,QAAQ;AACvB,YAAM,YAAY,GAAG,cAAc;AACnC,UAAI,kBAAkB,KAAK,YAAY,IAAI,SAAS;AAEpD,UAAI,CAAC,iBAAiB;AACpB,0BAAkB,KAAK,gBAAgB,aAAa,MAAM;AAC1D,aAAK,YAAY,IAAI,WAAW,eAAe;AAAA,MACjD;AAEA,aAAO,KAAK,gBAAgB,aAAa,QAAQ,EAAE,UAAU,QAAQ,CAAC;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,WAA8B,KAAkB;AACtE,QAAI,KAAK,oBAAoB,IAAI,GAAG,GAAG;AACrC,aAAO,KAAK,oBAAoB,IAAI,GAAG;AAAA,IACzC;AAEA,UAAM,WAAW,KAAK,gBAAgB,SAAS;AAC/C,SAAK,oBAAoB,IAAI,KAAK,QAAQ;AAC1C,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,WAA8B,QAAa,CAAC,GAAQ;AAC1E,QAAI;AACF,aAAO,UAAU,KAAK;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,MAAM,0CAA0C,KAAK;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,YAAY,MAAM;AACvB,SAAK,oBAAoB,MAAM;AAAA,EACjC;AACF;AApEmB;AAAnB,IAAM,eAAN;AAuEA,MAAM,mBAAmB,IAAI,iBAAiB;AAC9C,MAAM,eAAe,IAAI,aAAa;AAOtC,SAAS,cAA2B;AAClC,QAAM,YAAY,YAAY,QAAQ;AAGtC,MAAI,kBAAkB,uBAAuB,CAAC,WAAW;AACvD,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,MAAI,aAAa,gBAAgB;AAC/B,YAAQ,IAAI,+CAA+C;AAC3D,mBAAe,QAAQ;AACvB,qBAAiB;AACjB,0BAAsB;AAAA,EACxB;AAEA,MAAI,eAAe;AACnB,MAAI,cAA6B;AACjC,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,gBAAuC;AAC3C,MAAI,qBAAqB;AACzB,QAAM,wBAAwB;AAE9B,QAAM,YAA6B,CAAC;AAGpC,MAAI,CAAC,OAAO,eAAe,GAAG;AAC5B,WAAO,eAAe,IAAI,CAAC;AAAA,EAC7B;AAGA,MAAI,aAAa,OAAO,mBAAmB;AACzC,WAAO,kBAAkB,MAAM;AAAA,EACjC;AAEA,QAAM,aAGF,OAAO,qBAAqB,oBAAI,IAAI;AACxC,SAAO,oBAAoB;AAG3B,QAAM,UAAU,aAAa;AAC7B,QAAM,SAAyC,CAAC;AAChD,QAAM,gBAAgC,CAAC;AAEvC,aAAW,CAAC,UAAU,GAAG,KAAK,OAAO,QAAQ,OAAO,GAAG;AACrD,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,QAAI,YAAwC;AAC5C,QAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAI,aAAa,OAAO,IAAI,SAAS;AACnC,oBAAY,IAAI;AAAA,MAClB,OAAO;AACL,cAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,cAAM,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI;AAC7C,YACE,aAAa,UACb,OAAO,aAAa,YACpB,OAAO,IAAI,QAAQ,MAAM,aACzB;AACA,sBAAY,IAAI,QAAQ;AAAA,QAC1B,OAAO;AACL,gBAAM,SAAS,OAAO,OAAO,GAAG,EAAE,OAAO,OAAO;AAChD,cAAI,OAAO,SAAS,GAAG;AACrB,wBAAY,OAAO,CAAC;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,OAAO,cAAc,SAAU;AAEjD,UAAM,aAAa,SAAS,KAAK,SAAS;AAE1C,QAAI,YAAY;AACd,oBAAc,KAAK;AAAA,QACjB,SAAS;AAAA,QACT,OAAO,IAAI,OAAO,MAAM,UAAU,QAAQ,WAAW,SAAS,IAAI,GAAG;AAAA,QACrE;AAAA,QACA,QAAQ,CAAC,GAAG,UAAU,SAAS,WAAW,CAAC,EACxC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,MACrD,CAAC;AAAA,IACH,OAAO;AACL,aAAO,SAAS,IAAI;AAAA,IACtB;AAAA,EACF;AAMA,iBAAe,uBAAsC;AACnD,QAAI,YAAa;AAEjB,UAAM,OAAO,cAAc,OAAO,SAAS,QAAQ;AACnD,QAAI,OAAmC,OAAO,IAAI;AAClD,QAAI,SAAiC,CAAC;AACtC,QAAI,aAAkC,CAAC;AAGvC,UAAM,kBAAkB,iBAAiB,WAAW,IAAI;AACxD,QAAI,iBAAiB;AAEnB,YAAM,qBAAqB,iBAAiB,sBAAsB,IAAI;AACtE,UAAI,oBAAoB;AACtB,eAAO;AAAA,MACT,OAAO;AACL,eAAO,gBAAgB;AAAA,MACzB;AACA,eAAS,gBAAgB;AAAA,IAC3B;AAGA,QAAI,CAAC,MAAM;AACT,YAAM,QAAQ,kBAAkB,MAAM,aAAa;AACnD,UAAI,OAAO;AACT,eAAO,MAAM;AACb,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,OAAO,SAAS,cAAc,YAAY;AAChD,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,oCAAoC,YAAY;AAC9D;AAAA,IACF;AAGA,QAAI,CAAC,MAAM;AACT,WAAK,YAAY;AACjB,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,MAAM,UACd;AAEF,YAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,cAAQ,cAAc;AACtB,cAAQ,MAAM,UAAU;AAExB,YAAM,WAAW,SAAS,cAAc,GAAG;AAC3C,YAAM,WAAW,WAAW,gBAAgB,IAAI,CAAC;AACjD,eAAS,cAAc,SAAS,QAAQ;AACxC,eAAS,MAAM,UAAU;AAEzB,YAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,iBAAW,cAAc;AACzB,iBAAW,MAAM,UACf;AACF,iBAAW,UAAU,MAAM,OAAO,QAAQ,KAAK;AAE/C,gBAAU,YAAY,OAAO;AAC7B,gBAAU,YAAY,QAAQ;AAC9B,gBAAU,YAAY,UAAU;AAChC,WAAK,YAAY,SAAS;AAE1B,qBAAe,EAAE,OAAO,uBAAuB,CAAC;AAGhD,OAAC,KAAK,SAAS,QAAQ,EAAE,QAAQ,CAAC,eAAe;AAC/C,yBAAiB,aAAa,UAAU,EAAE,MAAM,QAAQ,IAAI;AAAA,MAC9D,CAAC;AAED;AAAA,IACF;AAGA,UAAM,QAAS,OAAO,QAAQ,SAAS,CAAC;AACxC,QAAI,cAAmC,CAAC;AAExC,QAAI,MAAM,mBAAmB,WAAW,IAAI,MAAM,eAAe,GAAG;AAClE,oBAAc,WAAW,IAAI,MAAM,eAAe;AAAA,IACpD,WAAW,MAAM,iBAAiB;AAChC,oBAAc,iBAAiB,MAAM,eAAe;AAAA,IACtD;AAGA,QAAI,KAAK,OAAO;AACd,mBAAa,OAAO,KAAK,UAAU,aAAa,KAAK,MAAM,IAAI,KAAK;AAAA,IACtE;AAGA,QAAI,KAAK,MAAM;AACb,YAAM,OACJ,OAAO,KAAK,SAAS,aAAa,KAAK,KAAK,MAAM,IAAI,KAAK;AAC7D,qBAAe,IAAI;AAAA,IACrB;AAGA,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACF;AAGA,UAAM,YAAY,cAAc,WAAW;AAC3C,WAAO,mBAAmB;AAG1B,QAAI;AACF,YAAM,MAAM,cAAc,SAAS;AAAA,IACrC,SAAS,KAAK;AACZ,cAAQ,MAAM,0BAA0B,GAAG;AAE3C,WAAK,YAAY;AACjB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,MAAM,QAAQ;AACvB,eAAS,cAAc;AACvB,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAEA,kBAAc;AAAA,EAChB;AAxHe;AA4Hf,WAAS,cAAoB;AAC3B,QAAI,YAAa;AAEjB,QAAI,eAAe;AACjB,mBAAa,aAAa;AAAA,IAC5B;AAEA,oBAAgB,WAAW,YAAY;AACrC,YAAM,qBAAqB;AAC3B,sBAAgB;AAAA,IAClB,GAAG,eAAe;AAAA,EACpB;AAXS;AAiBT,WAAS,SAAS,MAAc,QAA6B,CAAC,GAAS;AACrE,QAAI,YAAa;AAGjB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,qBAAqB,uBAAuB;AACpD,cAAQ,KAAK,4CAA4C;AACzD;AAAA,IACF;AACA,yBAAqB;AAErB,UAAM,iBAAiB,cAAc,IAAI;AAEzC,QAAI,CAAC,WAAW,OAAO,SAAS,SAAS,cAAc,GAAG;AACxD,cAAQ,MAAM,iCAAiC;AAC/C;AAAA,IACF;AAEA,QAAI,mBAAmB,YAAa;AAGpC,qBAAiB,aAAa,cAAc,EAAE,MAAM,QAAQ,IAAI;AAGhE,UAAM,iBAAiB,cAAc,KAAK;AAC1C,UAAM,WAAW,iBAAiB;AAClC,eAAW,YAAY,UAAU,cAAc;AAE/C,QAAI;AACF,aAAO,QAAQ;AAAA,QACb,EAAE,iBAAiB,SAAS;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,kBAAY;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAM,+BAA+B,GAAG;AAAA,IAClD;AAAA,EACF;AAtCS;AA2CT,WAAS,QAAQ,MAAc,QAA6B,CAAC,GAAS;AACpE,QAAI,YAAa;AAGjB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,qBAAqB,uBAAuB;AACpD,cAAQ,KAAK,yCAAyC;AACtD;AAAA,IACF;AACA,yBAAqB;AAErB,UAAM,iBAAiB,cAAc,IAAI;AAEzC,QAAI,CAAC,WAAW,OAAO,SAAS,SAAS,cAAc,GAAG;AACxD,cAAQ,MAAM,8BAA8B;AAC5C;AAAA,IACF;AAGA,UAAM,iBAAiB,cAAc,KAAK;AAC1C,UAAM,WAAW,iBAAiB;AAClC,eAAW,YAAY,UAAU,cAAc;AAE/C,QAAI;AACF,aAAO,QAAQ;AAAA,QACb,EAAE,iBAAiB,SAAS;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,kBAAY;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAM,4BAA4B,GAAG;AAAA,IAC/C;AAAA,EACF;AAjCS;AAsCT,WAAS,OAAa;AACpB,QAAI,YAAa;AAEjB,QAAI;AACF,aAAO,QAAQ,KAAK;AAAA,IACtB,SAAS,KAAK;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACvD;AAAA,EACF;AARS;AAeT,QAAM,eAAe,wBAAC,MAAmB;AACvC,QAAI,YAAa;AAEjB,UAAM,SAAS,EAAE;AACjB,UAAM,OAAO,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,CAAC,KAAM;AAEX,UAAM,OAAO,KAAK,aAAa,MAAM;AACrC,QAAI,CAAC,MAAM;AACT,cAAQ,KAAK,iCAAiC;AAC9C;AAAA,IACF;AAGA,QAAI,WAAW,IAAI,GAAG;AACpB;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,IAAI,KAAK,MAAM,OAAO,SAAS,MAAM,EAAE;AAC3D,QAAI,CAAC,WAAW,OAAO,GAAG;AACxB,cAAQ,KAAK,4BAA4B;AACzC;AAAA,IACF;AAEA,MAAE,eAAe;AAEjB,UAAM,OAAO;AAAA,MACX,IAAI,IAAI,KAAK,MAAM,OAAO,SAAS,MAAM,EAAE;AAAA,IAC7C;AAEA,QAAI,SAAS,YAAa;AAE1B,QAAI,QAA6B,CAAC;AAClC,UAAM,WAAW,KAAK,aAAa,gBAAgB;AAEnD,QACE,YACA,OAAO,aAAa,YACpB,CAAC,SAAS,WAAW,IAAI,GACzB;AACA,UAAI,OAAO,eAAe,IAAI,QAAQ,GAAG;AACvC,gBAAQ,OAAO,eAAe,EAAE,QAAQ;AAAA,MAC1C;AAAA,IACF;AAGA,UAAM,oBAAyC,CAAC;AAChD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,UAAI,OAAO,MAAM,YAAY,EAAE,WAAW,IAAI,EAAG;AACjD,wBAAkB,CAAC,IACjB,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ;AAAA,IACvD;AAEA,UAAM,WAAW,iBAAiB;AAClC,eAAW,YAAY,UAAU,iBAAiB;AAElD,QAAI;AACF,aAAO,QAAQ;AAAA,QACb,EAAE,iBAAiB,UAAU,iBAAiB,kBAAkB;AAAA,QAChE;AAAA,QACA;AAAA,MACF;AACA,kBAAY;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACvD;AAAA,EACF,GAtEqB;AA2ErB,MAAI,gBAAgB,iBAAiB,CAAC,qBAAqB;AACzD,aAAS,iBAAiB,SAAS,YAAY;AAC/C,cAAU,KAAK;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AACD;AAEA,WAAO,iBAAiB,YAAY,WAAW;AAC/C,cAAU,KAAK;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAOA,WAAS,YAAY,WAAmB,aAAmB;AACzD,QAAI,aAAa;AACf,cAAQ,MAAM,wCAAwC;AACtD;AAAA,IACF;AAEA,QAAI,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG;AACzD,cAAQ,MAAM,2BAA2B;AACzC;AAAA,IACF;AAEA,mBAAe;AACf,gBAAY;AACZ,0BAAsB;AAAA,EACxB;AAdS;AAmBT,WAAS,UAAgB;AAEvB,QAAI,eAAe;AACjB,mBAAa,aAAa;AAC1B,sBAAgB;AAAA,IAClB;AAGA,kBAAc;AAGd,qBAAiB,WAAW;AAC5B,iBAAa,QAAQ;AAGrB,cAAU,QAAQ,CAAC,EAAE,SAAS,OAAO,QAAQ,MAAM;AACjD,UAAI;AACF,gBAAQ,oBAAoB,OAAO,OAAO;AAAA,MAC5C,SAAS,GAAG;AACV,gBAAQ,MAAM,2BAA2B,CAAC;AAAA,MAC5C;AAAA,IACF,CAAC;AACD,cAAU,SAAS;AACnB,oBAAgB;AAGhB,eAAW,QAAQ,CAAC,UAAU;AAC5B,UAAI,SAAS,OAAO,UAAU,UAAU;AACtC,eAAO,OAAO,KAAK,EAAE,QAAQ,CAAC,QAAQ;AACpC,cAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,gBAAI;AACF,cAAC,IAAY,QAAQ;AAAA,YACvB,SAAS,GAAG;AAAA,YAEZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,eAAW,MAAM;AAGjB,QAAI,OAAO,eAAe,GAAG;AAC3B,YAAM,KAAK,OAAO,eAAe;AACjC,UAAI,MAAM,OAAO,OAAO,UAAU;AAChC,eAAO,KAAK,EAAE,EAAE,QAAQ,CAAC,QAAQ;AAC/B,iBAAO,GAAG,GAAG;AAAA,QACf,CAAC;AAAA,MACH;AACA,aAAO,OAAO,eAAe;AAAA,IAC/B;AAGA,QAAI,OAAO,kBAAkB;AAC3B,aAAO,OAAO;AAAA,IAChB;AAGA,0BAAsB;AACtB,qBAAiB;AAEjB,YAAQ,IAAI,2BAA2B;AAAA,EACzC;AA9DS;AAmET,MAAI,YAAY,KAAK;AAEnB,gBAAY,IAAI,OAAO,MAAM;AAC3B,cAAQ,IAAI,8CAA8C;AAC1D,kBAAY;AAAA,IACd,CAAC;AAGD,gBAAY,IAAI,QAAQ,MAAM;AAC5B,cAAQ,IAAI,sCAAsC;AAClD,cAAQ;AAER,uBAAiB;AACjB,4BAAsB;AAAA,IACxB,CAAC;AAAA,EACH;AAIA,QAAM,SAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,cAAc,iBAAiB,aAAa,KAAK,gBAAgB;AAAA,IACjE,YAAY,6BAAM;AAChB,uBAAiB,WAAW;AAC5B,mBAAa,QAAQ;AAAA,IACvB,GAHY;AAAA,IAIZ,qBAAqB,wBAAC,iBAAgC;AAEpD,MAAC,OAAe,eAAe;AAC/B,cAAQ;AAAA,QACN;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF;AAAA,IACF,GARqB;AAAA,EASvB;AAEA,mBAAiB;AACjB,SAAO;AACT;AAnjBS;AAujBT,IAAO,iBAAQ;AAMR,SAAS,aAAa,KAAa,OAAkC;AAC1E,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,GAAG;AACnD,YAAQ,MAAM,4BAA4B;AAC1C;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,YAAQ,MAAM,+BAA+B;AAC7C;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,eAAe,GAAG;AAC5B,WAAO,eAAe,IAAI,CAAC;AAAA,EAC7B;AAEA,MAAI,OAAO,KAAK,OAAO,eAAe,CAAC,EAAE,UAAU,gBAAgB;AACjE,YAAQ,KAAK,sCAAsC;AACnD;AAAA,EACF;AAEA,SAAO,eAAe,EAAE,GAAG,IAAI;AACjC;AArBgB;AA0BT,SAAS,eAAe,KAAmB;AAChD,MAAI,OAAO,QAAQ,SAAU;AAE7B,MAAI,OAAO,eAAe,IAAI,GAAG,GAAG;AAClC,UAAM,QAAQ,OAAO,eAAe,EAAE,GAAG;AAEzC,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,aAAO,OAAO,KAAK,EAAE,QAAQ,CAAC,QAAQ;AACpC,YAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,cAAI;AACF,YAAC,IAAY,QAAQ;AAAA,UACvB,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,OAAO,eAAe,EAAE,GAAG;AAAA,EACpC;AACF;AApBgB;",
6
6
  "names": []
7
7
  }
package/dist/runtime.d.ts CHANGED
@@ -1,3 +1,19 @@
1
+ type Priority = "immediate" | "high" | "normal" | "low" | "idle";
2
+ interface FynixFiber {
3
+ type: string | symbol | ComponentFunction;
4
+ props: any;
5
+ key: string | number | null;
6
+ child: FynixFiber | null;
7
+ sibling: FynixFiber | null;
8
+ parent: FynixFiber | null;
9
+ alternate: FynixFiber | null;
10
+ effectTag: "PLACEMENT" | "UPDATE" | "DELETION" | null;
11
+ updatePriority: Priority;
12
+ _domNode?: Node | null;
13
+ _rendered?: FynixFiber | null;
14
+ hooks?: any[];
15
+ context?: ComponentContext;
16
+ }
1
17
  type VNodeType = string | symbol | ComponentFunction;
2
18
  type VNodeChild = VNode | string | number | boolean | null | undefined;
3
19
  type VNodeChildren = VNodeChild | VNodeChild[];
@@ -23,6 +39,21 @@ interface ReactiveState<T> {
23
39
  _isNixState: boolean;
24
40
  subscribe(callback: () => void): () => void;
25
41
  }
42
+ interface ComponentContext {
43
+ hooks: any[];
44
+ hookIndex: number;
45
+ effects: Array<() => void | (() => void)>;
46
+ cleanups: Array<() => void>;
47
+ _vnode: VNode;
48
+ _accessedStates: Set<ReactiveState<any>>;
49
+ _subscriptions: Set<ReactiveState<any>>;
50
+ _subscriptionCleanups: Array<() => void>;
51
+ version: number;
52
+ rerender: (() => void) | null;
53
+ Component: ComponentFunction;
54
+ _isMounted: boolean;
55
+ _isRerendering: boolean;
56
+ }
26
57
  import { Button, Path } from "./custom/index";
27
58
  import { nixAsync } from "./hooks/nixAsync";
28
59
  import { nixAsyncCached } from "./hooks/nixAsyncCache";
@@ -45,6 +76,37 @@ import { nixRef } from "./hooks/nixRef";
45
76
  import { nixState } from "./hooks/nixState";
46
77
  import { nixStore } from "./hooks/nixStore";
47
78
  import createFynix from "./router/router";
79
+ declare class FiberRenderer {
80
+ private workInProgressRoot;
81
+ private nextUnitOfWork;
82
+ private currentRoot;
83
+ private deletions;
84
+ scheduleWork(fiber: FynixFiber): void;
85
+ workLoop(deadline: number): void;
86
+ performUnitOfWork(fiber: FynixFiber): FynixFiber | null;
87
+ private reconcileChildren;
88
+ private commitRoot;
89
+ private commitWork;
90
+ private commitDeletion;
91
+ private updateDom;
92
+ }
93
+ export declare function useFiberRenderer(): FiberRenderer;
94
+ declare class HierarchicalStore {
95
+ private root;
96
+ private selectorCache;
97
+ private stateSnapshot;
98
+ select<T>(selector: (state: any) => T): T;
99
+ optimisticUpdate<T>(path: string, update: T, rollback?: () => void): {
100
+ commit: () => void;
101
+ rollback: () => void;
102
+ };
103
+ private getState;
104
+ private get;
105
+ private set;
106
+ private clearRollback;
107
+ private invalidateSelectors;
108
+ }
109
+ export declare function useHierarchicalStore(): HierarchicalStore;
48
110
  export declare const TEXT: unique symbol;
49
111
  export declare const Fragment: unique symbol;
50
112
  export declare function createTextVNode(text: any): VNode;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../runtime.ts"],"names":[],"mappings":"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"}