fynixui 1.0.10 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +35 -37
- package/{dist → dist-types}/context/context.d.ts +0 -1
- package/{dist → dist-types}/custom/button.d.ts +0 -1
- package/{dist → dist-types}/custom/index.d.ts +0 -1
- package/{dist → dist-types}/custom/path.d.ts +0 -1
- package/{dist → dist-types}/error/errorOverlay.d.ts +0 -1
- package/{dist → dist-types}/fynix/index.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixAsync.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixAsyncCache.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixAsyncDebounce.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixAsyncQuery.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixCallback.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixComputed.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixDebounce.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixEffect.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixFor.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixForm.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixFormAsync.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixInterval.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixLazy.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixLazyAsync.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixLazyFormAsync.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixLocalStorage.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixMemo.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixPrevious.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixRef.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixState.d.ts +0 -1
- package/{dist → dist-types}/hooks/nixStore.d.ts +0 -1
- package/{dist → dist-types}/plugins/vite-plugin-res.d.ts +0 -1
- package/{dist → dist-types}/router/router.d.ts +0 -1
- package/{dist → dist-types}/runtime.d.ts +0 -1
- package/package.json +38 -38
- package/dist/context/context.d.ts.map +0 -1
- package/dist/context/context.js.map +0 -7
- package/dist/custom/button.d.ts.map +0 -1
- package/dist/custom/button.js.map +0 -7
- package/dist/custom/index.d.ts.map +0 -1
- package/dist/custom/index.js.map +0 -7
- package/dist/custom/path.d.ts.map +0 -1
- package/dist/custom/path.js.map +0 -7
- package/dist/error/errorOverlay.d.ts.map +0 -1
- package/dist/error/errorOverlay.js.map +0 -7
- package/dist/fynix/index.d.ts.map +0 -1
- package/dist/fynix/index.js.map +0 -7
- package/dist/hooks/nixAsync.d.ts.map +0 -1
- package/dist/hooks/nixAsync.js.map +0 -7
- package/dist/hooks/nixAsyncCache.d.ts.map +0 -1
- package/dist/hooks/nixAsyncCache.js.map +0 -7
- package/dist/hooks/nixAsyncDebounce.d.ts.map +0 -1
- package/dist/hooks/nixAsyncDebounce.js.map +0 -7
- package/dist/hooks/nixAsyncQuery.d.ts.map +0 -1
- package/dist/hooks/nixAsyncQuery.js.map +0 -7
- package/dist/hooks/nixCallback.d.ts.map +0 -1
- package/dist/hooks/nixCallback.js.map +0 -7
- package/dist/hooks/nixComputed.d.ts.map +0 -1
- package/dist/hooks/nixComputed.js.map +0 -7
- package/dist/hooks/nixDebounce.d.ts.map +0 -1
- package/dist/hooks/nixDebounce.js.map +0 -7
- package/dist/hooks/nixEffect.d.ts.map +0 -1
- package/dist/hooks/nixEffect.js.map +0 -7
- package/dist/hooks/nixFor.d.ts.map +0 -1
- package/dist/hooks/nixFor.js.map +0 -7
- package/dist/hooks/nixForm.d.ts.map +0 -1
- package/dist/hooks/nixForm.js.map +0 -7
- package/dist/hooks/nixFormAsync.d.ts.map +0 -1
- package/dist/hooks/nixFormAsync.js.map +0 -7
- package/dist/hooks/nixInterval.d.ts.map +0 -1
- package/dist/hooks/nixInterval.js.map +0 -7
- package/dist/hooks/nixLazy.d.ts.map +0 -1
- package/dist/hooks/nixLazy.js.map +0 -7
- package/dist/hooks/nixLazyAsync.d.ts.map +0 -1
- package/dist/hooks/nixLazyAsync.js.map +0 -7
- package/dist/hooks/nixLazyFormAsync.d.ts.map +0 -1
- package/dist/hooks/nixLazyFormAsync.js.map +0 -7
- package/dist/hooks/nixLocalStorage.d.ts.map +0 -1
- package/dist/hooks/nixLocalStorage.js.map +0 -7
- package/dist/hooks/nixMemo.d.ts.map +0 -1
- package/dist/hooks/nixMemo.js.map +0 -7
- package/dist/hooks/nixPrevious.d.ts.map +0 -1
- package/dist/hooks/nixPrevious.js.map +0 -7
- package/dist/hooks/nixRef.d.ts.map +0 -1
- package/dist/hooks/nixRef.js.map +0 -7
- package/dist/hooks/nixState.d.ts.map +0 -1
- package/dist/hooks/nixState.js.map +0 -7
- package/dist/hooks/nixStore.d.ts.map +0 -1
- package/dist/hooks/nixStore.js.map +0 -7
- package/dist/plugins/vite-plugin-res.d.ts.map +0 -1
- package/dist/plugins/vite-plugin-res.js.map +0 -7
- package/dist/router/router.d.ts.map +0 -1
- package/dist/router/router.js.map +0 -7
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixLocalStorage.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 * @fileoverview Reactive localStorage hook for Fynix.\r\n * Automatically syncs state with localStorage using JSON serialization.\r\n */\r\n\r\nimport { nixState } from \"./nixState\";\r\n\r\n/**\r\n * Safe JSON parsing with validation to prevent code injection\r\n * @param value - String to parse\r\n * @param fallback - Fallback value if parsing fails\r\n * @returns Parsed value or fallback\r\n */\r\nfunction safeJSONParse<T>(value: string | null, fallback: T): T {\r\n if (value === null || value === undefined) {\r\n return fallback;\r\n }\r\n\r\n try {\r\n // Basic validation: check for suspicious patterns\r\n if (typeof value !== \"string\") {\r\n console.warn(\"[nixLocalStorage] Non-string value provided to JSON.parse\");\r\n return fallback;\r\n }\r\n\r\n // Check for potentially malicious patterns\r\n const suspiciousPatterns = [\r\n /__proto__/,\r\n /constructor/,\r\n /prototype/,\r\n /function\\s*\\(/,\r\n /=>\\s*{/,\r\n /javascript:/,\r\n /<script/i,\r\n ];\r\n\r\n for (const pattern of suspiciousPatterns) {\r\n if (pattern.test(value)) {\r\n console.warn(\r\n \"[nixLocalStorage] Potentially malicious content detected, using fallback\"\r\n );\r\n return fallback;\r\n }\r\n }\r\n\r\n // Parse and validate the result\r\n const parsed = JSON.parse(value);\r\n\r\n // Additional validation: ensure the parsed object doesn't have dangerous properties\r\n if (parsed && typeof parsed === \"object\") {\r\n if (parsed.constructor !== Object && parsed.constructor !== Array) {\r\n console.warn(\"[nixLocalStorage] Unsafe object constructor detected\");\r\n return fallback;\r\n }\r\n }\r\n\r\n return parsed as T;\r\n } catch (error) {\r\n console.warn(\"[nixLocalStorage] JSON parsing failed:\", error);\r\n return fallback;\r\n }\r\n}\r\n\r\n/**\r\n * Safe JSON stringification with size limits\r\n * @param value - Value to stringify\r\n * @param maxSize - Maximum size in characters (default: 1MB)\r\n * @returns JSON string or null if too large/invalid\r\n */\r\nfunction safeJSONStringify<T>(value: T, maxSize = 1024 * 1024): string | null {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n\r\n if (stringified.length > maxSize) {\r\n console.warn(\r\n \"[nixLocalStorage] Value too large to store:\",\r\n stringified.length,\r\n \"characters\"\r\n );\r\n return null;\r\n }\r\n\r\n return stringified;\r\n } catch (error) {\r\n console.warn(\"[nixLocalStorage] JSON stringification failed:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Reactive wrapper around localStorage with safe JSON parsing/stringifying.\r\n * Automatically persists state changes to localStorage.\r\n *\r\n * @template T\r\n * @param {string} key - LocalStorage key\r\n * @param {T} initial - Initial value if key does not exist\r\n * @returns {{ value: T, set: (v: T) => void, clear: () => void, getSize: () => number }} Secure storage object\r\n *\r\n * @example\r\n * const theme = nixLocalStorage('theme', 'light');\r\n * console.log(theme.value); // 'light' or stored value\r\n * theme.set('dark'); // Updates state and localStorage\r\n *\r\n * @example\r\n * const user = nixLocalStorage('user', { name: '', age: 0 });\r\n * user.set({ name: 'John', age: 30 });\r\n */\r\nexport function nixLocalStorage<T>(\r\n key: string,\r\n initial: T\r\n): {\r\n value: T;\r\n set: (v: T) => boolean;\r\n clear: () => void;\r\n getSize: () => number;\r\n isValid: () => boolean;\r\n} {\r\n // Validate inputs\r\n if (!key || typeof key !== \"string\") {\r\n throw new Error(\"[nixLocalStorage] Key must be a non-empty string\");\r\n }\r\n\r\n if (key.length > 100) {\r\n throw new Error(\"[nixLocalStorage] Key too long (max 100 characters)\");\r\n }\r\n\r\n let initialValue: T;\r\n let isStorageValid = true;\r\n\r\n try {\r\n // Check if localStorage is available\r\n if (typeof localStorage === \"undefined\") {\r\n console.warn(\r\n \"[nixLocalStorage] localStorage not available, using in-memory fallback\"\r\n );\r\n isStorageValid = false;\r\n initialValue = initial;\r\n } else {\r\n const stored = localStorage.getItem(key);\r\n initialValue = safeJSONParse(stored, initial);\r\n }\r\n } catch (err) {\r\n console.error(`[nixLocalStorage] Error reading key \"${key}\":`, err);\r\n initialValue = initial;\r\n isStorageValid = false;\r\n }\r\n\r\n const state = nixState<T>(initialValue);\r\n\r\n const set = (v: T): boolean => {\r\n if (!isStorageValid) {\r\n state.value = v;\r\n return false;\r\n }\r\n\r\n try {\r\n const stringified = safeJSONStringify(v);\r\n if (stringified === null) {\r\n console.error(\r\n `[nixLocalStorage] Failed to stringify value for key \"${key}\"`\r\n );\r\n return false;\r\n }\r\n\r\n localStorage.setItem(key, stringified);\r\n state.value = v;\r\n return true;\r\n } catch (err) {\r\n console.error(`[nixLocalStorage] Error setting key \"${key}\":`, err);\r\n // Update state even if localStorage fails (in-memory fallback)\r\n state.value = v;\r\n return false;\r\n }\r\n };\r\n\r\n const clear = (): void => {\r\n try {\r\n if (isStorageValid) {\r\n localStorage.removeItem(key);\r\n }\r\n state.value = initial;\r\n } catch (err) {\r\n console.error(`[nixLocalStorage] Error clearing key \"${key}\":`, err);\r\n }\r\n };\r\n\r\n const getSize = (): number => {\r\n try {\r\n if (!isStorageValid) return 0;\r\n const stored = localStorage.getItem(key);\r\n return stored ? stored.length : 0;\r\n } catch {\r\n return 0;\r\n }\r\n };\r\n\r\n const isValid = (): boolean => isStorageValid;\r\n\r\n return {\r\n get value() {\r\n return state.value;\r\n },\r\n set value(v: T) {\r\n set(v);\r\n },\r\n set,\r\n clear,\r\n getSize,\r\n isValid,\r\n };\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nixMemo.d.ts","sourceRoot":"","sources":["../../hooks/nixMemo.ts"],"names":[],"mappings":"AA+BA,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE,GAAG,EAAO,GAAG,CAAC,GAAG,SAAS,CAuC5E"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixMemo.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\nimport { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Memoize a value based on dependencies, similar to React's useMemo.\r\n *\r\n * @param {() => any} factory - Function to compute the memoized value\r\n * @param {Array<any>} deps - Dependency array\r\n * @returns {any} Memoized value\r\n */\r\nexport function nixMemo<T>(factory: () => T, deps: any[] = []): T | undefined {\r\n type MemoHook = { value: T; deps: any[] };\r\n const ctx = activeContext as\r\n | (typeof activeContext & {\r\n hookIndex: number;\r\n hooks: Array<MemoHook | undefined>;\r\n })\r\n | undefined;\r\n if (!ctx) throw new Error(\"nixMemo() called outside component\");\r\n\r\n if (typeof factory !== \"function\") {\r\n console.error(\"[nixMemo] First argument must be a function\");\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(deps)) {\r\n console.error(\"[nixMemo] Second argument must be an array\");\r\n deps = [];\r\n }\r\n\r\n const idx: number = ctx.hookIndex++;\r\n const prev = ctx.hooks[idx] as MemoHook | undefined;\r\n\r\n const hasChanged =\r\n !prev ||\r\n prev.deps.length !== deps.length ||\r\n deps.some((dep, i) => !Object.is(dep, prev.deps[i]));\r\n\r\n if (hasChanged) {\r\n try {\r\n const value = factory();\r\n ctx.hooks[idx] = { value, deps: [...deps] };\r\n } catch (err) {\r\n console.error(\"[nixMemo] Factory function error:\", err);\r\n ctx.hooks[idx] = { value: undefined as unknown as T, deps: [...deps] };\r\n }\r\n }\r\n\r\n return (ctx.hooks[idx] as MemoHook | undefined)?.value;\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;AAsBA,SAAS,qBAAqB;AASvB,SAAS,QAAW,SAAkB,OAAc,CAAC,GAAkB;AAE5E,QAAM,MAAM;AAMZ,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oCAAoC;AAE9D,MAAI,OAAO,YAAY,YAAY;AACjC,YAAQ,MAAM,6CAA6C;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAQ,MAAM,4CAA4C;AAC1D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAc,IAAI;AACxB,QAAM,OAAO,IAAI,MAAM,GAAG;AAE1B,QAAM,aACJ,CAAC,QACD,KAAK,KAAK,WAAW,KAAK,UAC1B,KAAK,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AAErD,MAAI,YAAY;AACd,QAAI;AACF,YAAM,QAAQ,QAAQ;AACtB,UAAI,MAAM,GAAG,IAAI,EAAE,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE;AAAA,IAC5C,SAAS,KAAK;AACZ,cAAQ,MAAM,qCAAqC,GAAG;AACtD,UAAI,MAAM,GAAG,IAAI,EAAE,OAAO,QAA2B,MAAM,CAAC,GAAG,IAAI,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,SAAQ,IAAI,MAAM,GAAG,GAA4B;AACnD;AAvCgB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nixPrevious.d.ts","sourceRoot":"","sources":["../../hooks/nixPrevious.ts"],"names":[],"mappings":"AA8CA,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAiBpD"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixPrevious.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 * @fileoverview Hook to track previous value across renders.\r\n * Useful for comparing current and previous state.\r\n */\r\n\r\nimport { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Returns the previous value of a variable across renders.\r\n * Useful for detecting changes and implementing undo functionality.\r\n *\r\n * @template T\r\n * @param {T} val - Current value\r\n * @returns {T | undefined} Previous value (undefined on first render)\r\n *\r\n * @example\r\n * const count = nixState(0);\r\n * const prevCount = nixPrevious(count.value);\r\n *\r\n * // prevCount will be undefined on first render\r\n * // then will hold the previous value on subsequent renders\r\n *\r\n * @throws {Error} If called outside a component context\r\n */\r\nexport function nixPrevious<T>(val: T): T | undefined {\r\n const ctx = activeContext as {\r\n hookIndex: number;\r\n hooks: Array<{ value: T } | undefined>;\r\n };\r\n if (!ctx) throw new Error(\"nixPrevious() called outside component\");\r\n\r\n const idx: number = ctx.hookIndex++;\r\n const prev: T | undefined = ctx.hooks[idx]?.value;\r\n\r\n try {\r\n ctx.hooks[idx] = { value: val };\r\n } catch (err) {\r\n console.error(\"[nixPrevious] Error storing value:\", err);\r\n }\r\n\r\n return prev;\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;AA2BA,SAAS,qBAAqB;AAmBvB,SAAS,YAAe,KAAuB;AACpD,QAAM,MAAM;AAIZ,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wCAAwC;AAElE,QAAM,MAAc,IAAI;AACxB,QAAM,OAAsB,IAAI,MAAM,GAAG,GAAG;AAE5C,MAAI;AACF,QAAI,MAAM,GAAG,IAAI,EAAE,OAAO,IAAI;AAAA,EAChC,SAAS,KAAK;AACZ,YAAQ,MAAM,sCAAsC,GAAG;AAAA,EACzD;AAEA,SAAO;AACT;AAjBgB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nixRef.d.ts","sourceRoot":"","sources":["../../hooks/nixRef.ts"],"names":[],"mappings":"AA+BA,wBAAgB,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,GAAE,CAAe,GAAG;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAsBxE"}
|
package/dist/hooks/nixRef.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixRef.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\nimport { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Returns a mutable ref object that persists across renders.\r\n * Similar to React's useRef.\r\n *\r\n * @param {any} initial - Initial value for the ref\r\n * @returns {{ current: any }} Ref object\r\n */\r\nexport function nixRef<T = any>(initial: T = null as any): { current: T } {\r\n type RefHook = { current: T };\r\n const ctx = activeContext as\r\n | (typeof activeContext & {\r\n hookIndex: number;\r\n hooks: Array<RefHook | undefined>;\r\n })\r\n | undefined;\r\n if (!ctx) throw new Error(\"nixRef() called outside component\");\r\n\r\n const idx: number = ctx.hookIndex++;\r\n\r\n if (!ctx.hooks[idx]) {\r\n try {\r\n ctx.hooks[idx] = { current: initial };\r\n } catch (err) {\r\n console.error(\"[nixRef] Error initializing ref:\", err);\r\n ctx.hooks[idx] = { current: null as any };\r\n }\r\n }\r\n\r\n return ctx.hooks[idx] as RefHook;\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;AAsBA,SAAS,qBAAqB;AASvB,SAAS,OAAgB,UAAa,MAA6B;AAExE,QAAM,MAAM;AAMZ,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mCAAmC;AAE7D,QAAM,MAAc,IAAI;AAExB,MAAI,CAAC,IAAI,MAAM,GAAG,GAAG;AACnB,QAAI;AACF,UAAI,MAAM,GAAG,IAAI,EAAE,SAAS,QAAQ;AAAA,IACtC,SAAS,KAAK;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AACrD,UAAI,MAAM,GAAG,IAAI,EAAE,SAAS,KAAY;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,IAAI,MAAM,GAAG;AACtB;AAtBgB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nixState.d.ts","sourceRoot":"","sources":["../../hooks/nixState.ts"],"names":[],"mappings":"AAkEA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG;IACvC,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAClD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,CAAC;QACT,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC;QAClB,WAAW,EAAE,IAAI,CAAC;KACnB,CAAC;IACF,WAAW,EAAE,IAAI,CAAC;CACnB,CAgJA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixState.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 nixState - Reactive State\r\n Memory Leaks & Security Issues Resolved\r\n---------------------- */\r\nimport { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Creates a reactive state value that triggers component re-renders when changed.\r\n * Must be called within a component function.\r\n *\r\n * @param {any} initial - The initial value for the state\r\n * @returns {NixState} A reactive state object with value getter/setter and subscription methods\r\n *\r\n * @typedef {Object} NixState\r\n * @property {any} value - Get/set the current state value. Getting tracks the dependency, setting triggers subscribers.\r\n * @property {(fn: Function) => Function} subscribe - Subscribe to state changes. Returns unsubscribe function.\r\n * @property {() => void} cleanup - Cleanup all subscriptions to prevent memory leaks\r\n * @property {() => number} getSubscriberCount - Get number of active subscribers (debugging)\r\n * @property {() => boolean} isDestroyed - Check if state has been destroyed\r\n * @property {() => Object} asReadOnly - Get read-only version of the state\r\n * @property {boolean} _isNixState - Internal flag to identify nixState objects\r\n *\r\n * @example\r\n * const Counter = () => {\r\n * const count = nixState(0);\r\n *\r\n * return h(\"div\", {},\r\n * h(\"p\", {}, \"Count: \", count),\r\n * h(\"button\", { \"r-click\": () => count.value++ }, \"Increment\")\r\n * );\r\n * };\r\n *\r\n * @example\r\n * // With cleanup\r\n * const MyComponent = () => {\r\n * const state = nixState(0);\r\n *\r\n * nixEffect(() => {\r\n * return () => state.cleanup(); // Clean up on unmount\r\n * }, []);\r\n * };\r\n *\r\n * @throws {Error} If called outside a component context\r\n */\r\nexport function nixState<T>(initial: T): {\r\n value: T;\r\n subscribe: (fn: (value: T) => void) => () => void;\r\n cleanup: () => void;\r\n getSubscriberCount: () => number;\r\n isDestroyed: () => boolean;\r\n asReadOnly: () => {\r\n value: T;\r\n subscribe: (fn: (value: T) => void) => () => void;\r\n _isNixState: true;\r\n _isReadOnly: true;\r\n };\r\n _isNixState: true;\r\n} {\r\n const ctx = activeContext as\r\n | (typeof activeContext & {\r\n hookIndex: number;\r\n hooks: Array<any>;\r\n stateCleanups?: Array<() => void>;\r\n })\r\n | undefined;\r\n if (!ctx) throw new Error(\"nixState() called outside component\");\r\n\r\n const idx = ctx.hookIndex++;\r\n if (!ctx.hooks[idx]) {\r\n let value: T = initial;\r\n const subscribers: Set<(value: T) => void> = new Set();\r\n let isDestroyed = false;\r\n\r\n // Security: Validate initial value to prevent prototype pollution\r\n if (initial !== null && typeof initial === \"object\") {\r\n if (\r\n \"__proto__\" in (initial as any) ||\r\n \"constructor\" in (initial as any) ||\r\n \"prototype\" in (initial as any)\r\n ) {\r\n // Create a clean copy without dangerous properties\r\n if (Array.isArray(initial)) {\r\n value = [...(initial as any)] as T;\r\n } else {\r\n value = { ...(initial as any) };\r\n delete (value as any).__proto__;\r\n delete (value as any).constructor;\r\n delete (value as any).prototype;\r\n }\r\n }\r\n }\r\n\r\n const s = {\r\n get value(): T {\r\n if (isDestroyed) {\r\n /* console.warn(\"[nixState] Accessing destroyed state\"); */\r\n return value;\r\n }\r\n if (activeContext && !isDestroyed) {\r\n activeContext._accessedStates.add(s);\r\n }\r\n return value;\r\n },\r\n set value(newVal: T) {\r\n if (isDestroyed) {\r\n /* console.warn(\"[nixState] Attempting to update destroyed state\"); */\r\n return;\r\n }\r\n if (newVal === value) return;\r\n if (newVal !== null && typeof newVal === \"object\") {\r\n if (\r\n \"__proto__\" in (newVal as any) ||\r\n \"constructor\" in (newVal as any) ||\r\n \"prototype\" in (newVal as any)\r\n ) {\r\n /* console.warn(\r\n \"[nixState] Security: Dangerous properties detected in new value\"\r\n ); */\r\n if (Array.isArray(newVal)) {\r\n newVal = [...(newVal as any)] as T;\r\n } else {\r\n newVal = { ...(newVal as any) };\r\n delete (newVal as any).__proto__;\r\n delete (newVal as any).constructor;\r\n delete (newVal as any).prototype;\r\n }\r\n }\r\n }\r\n value = newVal;\r\n const subsArray = Array.from(subscribers);\r\n subsArray.forEach((fn) => {\r\n try {\r\n fn(newVal);\r\n } catch (err) {\r\n console.error(\"[nixState] Subscriber error:\", err);\r\n subscribers.delete(fn);\r\n }\r\n });\r\n },\r\n subscribe(fn: (value: T) => void): () => void {\r\n if (typeof fn !== \"function\") {\r\n console.error(\"[nixState] subscribe() requires a function\");\r\n return () => {};\r\n }\r\n if (isDestroyed) {\r\n console.warn(\"[nixState] Cannot subscribe to destroyed state\");\r\n return () => {};\r\n }\r\n const MAX_SUBSCRIBERS = 1000;\r\n if (subscribers.size >= MAX_SUBSCRIBERS) {\r\n console.error(\"[nixState] Maximum subscriber limit reached\");\r\n return () => {};\r\n }\r\n subscribers.add(fn);\r\n return () => {\r\n subscribers.delete(fn);\r\n };\r\n },\r\n cleanup(): void {\r\n if (isDestroyed) return;\r\n isDestroyed = true;\r\n subscribers.clear();\r\n if (value !== null && typeof value === \"object\") {\r\n if (Array.isArray(value)) {\r\n value = [] as any as T;\r\n } else {\r\n value = null as any as T;\r\n }\r\n }\r\n console.log(\"[nixState] State cleaned up\");\r\n },\r\n getSubscriberCount(): number {\r\n return subscribers.size;\r\n },\r\n isDestroyed(): boolean {\r\n return isDestroyed;\r\n },\r\n asReadOnly(): {\r\n value: T;\r\n subscribe: (fn: (value: T) => void) => () => void;\r\n _isNixState: true;\r\n _isReadOnly: true;\r\n } {\r\n return {\r\n get value() {\r\n return s.value;\r\n },\r\n subscribe: s.subscribe.bind(s),\r\n _isNixState: true,\r\n _isReadOnly: true,\r\n };\r\n },\r\n _isNixState: true as const,\r\n };\r\n\r\n ctx.hooks[idx] = s;\r\n if (ctx.stateCleanups) {\r\n ctx.stateCleanups.push(() => s.cleanup());\r\n }\r\n }\r\n return ctx.hooks[idx] as ReturnType<typeof nixState<T>>;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nixStore.d.ts","sourceRoot":"","sources":["../../hooks/nixStore.ts"],"names":[],"mappings":"AAkCA,wBAAgB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GACT;IACD,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB,CAkJA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../hooks/nixStore.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\nimport { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Reactive store hook with subscription support and enhanced security.\r\n * Memory-safe: cleans up subscribers on component unmount.\r\n * Prevents prototype pollution and validates inputs.\r\n *\r\n * @template T\r\n * @param {string} path - Path identifier (required, must be safe)\r\n * @param {T} initial - Initial value\r\n * @returns {Object} Reactive store object with get/set/subscribe\r\n */\r\nexport function nixStore<T = any>(\r\n path: string,\r\n initial: T\r\n): {\r\n value: T;\r\n subscribe: (fn: () => void) => () => void;\r\n path: string;\r\n cleanup: () => void;\r\n getSubscriberCount: () => number;\r\n isDestroyed: () => boolean;\r\n _isNixState: boolean;\r\n} {\r\n // Input validation\r\n if (!path || typeof path !== \"string\") {\r\n throw new Error(\"[nixStore] Path must be a non-empty string\");\r\n }\r\n\r\n // Validate path for security (prevent prototype pollution)\r\n const dangerousKeys = [\"__proto__\", \"constructor\", \"prototype\"];\r\n if (dangerousKeys.some((key) => path.includes(key))) {\r\n throw new Error(\"[nixStore] Path contains dangerous keywords\");\r\n }\r\n\r\n if (path.length > 200) {\r\n throw new Error(\"[nixStore] Path too long (max 200 characters)\");\r\n }\r\n\r\n type StoreHook = {\r\n value: T;\r\n subscribe: (fn: () => void) => () => void;\r\n path: string;\r\n cleanup: () => void;\r\n getSubscriberCount: () => number;\r\n isDestroyed: () => boolean;\r\n _isNixState: boolean;\r\n };\r\n\r\n const ctx = activeContext as\r\n | (typeof activeContext & {\r\n hookIndex: number;\r\n hooks: Array<StoreHook | undefined>;\r\n cleanups?: Array<() => void>;\r\n })\r\n | undefined;\r\n if (!ctx) throw new Error(\"nixStore() called outside component\");\r\n\r\n const idx: number = ctx.hookIndex++;\r\n\r\n if (!ctx.hooks[idx]) {\r\n let value: T = initial;\r\n const subscribers: Set<() => void> = new Set();\r\n let isDestroyed = false;\r\n let maxSubscribers = 100; // Prevent memory leaks\r\n\r\n const s: StoreHook = {\r\n get value() {\r\n if (isDestroyed) {\r\n console.warn(\"[nixStore] Accessing destroyed store:\", path);\r\n return value;\r\n }\r\n\r\n try {\r\n if ((activeContext as any)?._accessedStates) {\r\n (activeContext as any)._accessedStates.add(s);\r\n }\r\n } catch (err) {\r\n console.error(\"[nixStore] Error tracking accessed state:\", err);\r\n }\r\n return value;\r\n },\r\n set value(v: T) {\r\n if (isDestroyed) {\r\n console.warn(\r\n \"[nixStore] Attempting to set value on destroyed store:\",\r\n path\r\n );\r\n return;\r\n }\r\n\r\n // Validate value for security\r\n if (v && typeof v === \"object\") {\r\n // Create safe object without dangerous properties\r\n const safeValue = Object.create(null);\r\n for (const key in v) {\r\n if (\r\n Object.prototype.hasOwnProperty.call(v, key) &&\r\n !dangerousKeys.includes(key)\r\n ) {\r\n safeValue[key] = v[key];\r\n }\r\n }\r\n value = safeValue as T;\r\n } else {\r\n value = v;\r\n }\r\n\r\n // Notify subscribers safely\r\n const subscriberArray = Array.from(subscribers);\r\n subscriberArray.forEach((fn) => {\r\n try {\r\n fn();\r\n } catch (err) {\r\n console.error(\"[nixStore] Subscriber error:\", err);\r\n // Remove failing subscriber to prevent repeated errors\r\n subscribers.delete(fn);\r\n }\r\n });\r\n },\r\n subscribe(fn: () => void) {\r\n if (isDestroyed) {\r\n console.warn(\r\n \"[nixStore] Attempting to subscribe to destroyed store:\",\r\n path\r\n );\r\n return () => {};\r\n }\r\n\r\n if (typeof fn !== \"function\") {\r\n console.error(\"[nixStore] Subscriber must be a function\");\r\n return () => {};\r\n }\r\n\r\n if (subscribers.size >= maxSubscribers) {\r\n console.warn(\r\n `[nixStore] Maximum subscribers (${maxSubscribers}) reached for store:`,\r\n path\r\n );\r\n return () => {};\r\n }\r\n\r\n subscribers.add(fn);\r\n // Return cleanup function\r\n return () => {\r\n subscribers.delete(fn);\r\n };\r\n },\r\n cleanup() {\r\n if (isDestroyed) return;\r\n\r\n isDestroyed = true;\r\n subscribers.clear();\r\n console.debug(`[nixStore] Cleaned up store: ${path}`);\r\n },\r\n getSubscriberCount: () => subscribers.size,\r\n isDestroyed: () => isDestroyed,\r\n path,\r\n _isNixState: true,\r\n };\r\n\r\n // Register cleanup on component unmount\r\n if (!ctx.cleanups) ctx.cleanups = [];\r\n ctx.cleanups.push(() => s.cleanup());\r\n\r\n ctx.hooks[idx] = s;\r\n }\r\n\r\n return ctx.hooks[idx] as StoreHook;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAMtD,UAAU,kBAAkB;IAK1B,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAMrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAMnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAMnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAKpB,cAAc,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC5C;AAaD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,GAAE,kBAAuB;;;4BAoBxC,aAAa;oBAIf,MAAM,MAAM,MAAM;;;;yBAqEnB,UAAU;;;;;;;;;;;;;;;;EA0ClC;AAKD,OAAO,EAAE,WAAW,EAAE,CAAC;AAKvB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../plugins/vite-plugin-res.ts"],
|
|
4
|
-
"sourcesContent": ["import { transform, type TransformOptions } from \"esbuild\";\r\nimport type { HmrContext, ViteDevServer } from \"vite\";\r\nimport { normalizePath } from \"vite\";\r\n\r\n/**\r\n * Vite plugin options for Fynix\r\n */\r\ninterface FynixPluginOptions {\r\n /**\r\n * JSX factory function name\r\n * @default \"Fynix\"\r\n */\r\n jsxFactory?: string;\r\n\r\n /**\r\n * JSX fragment factory name\r\n * @default \"Fynix.Fragment\"\r\n */\r\n jsxFragment?: string;\r\n\r\n /**\r\n * File extensions to transform\r\n * @default [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"]\r\n */\r\n include?: string[];\r\n\r\n /**\r\n * Paths to exclude from transformation\r\n * @default [\"node_modules\"]\r\n */\r\n exclude?: string[];\r\n\r\n /**\r\n * Enable source maps\r\n * @default true\r\n */\r\n sourcemap?: boolean;\r\n\r\n /**\r\n * Custom esbuild transform options\r\n */\r\n esbuildOptions?: Partial<TransformOptions>;\r\n}\r\n\r\n/**\r\n * Extended context type that includes Vite's transform context methods\r\n */\r\ninterface TransformContext {\r\n addWatchFile?: (id: string) => void;\r\n}\r\n\r\n/**\r\n * Vite plugin for Fynix framework\r\n * Transforms JSX/TSX files using esbuild with custom JSX pragma\r\n */\r\nexport default function fynixPlugin(options: FynixPluginOptions = {}) {\r\n const {\r\n jsxFactory = \"Fynix\",\r\n jsxFragment = \"Fynix.Fragment\",\r\n include = [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"],\r\n exclude = [\"node_modules\"],\r\n sourcemap = true,\r\n esbuildOptions = {},\r\n } = options;\r\n\r\n let viteServer: ViteDevServer | null = null;\r\n\r\n return {\r\n name: \"vite-plugin-fynix\",\r\n enforce: \"pre\" as const,\r\n\r\n /**\r\n * Capture the Vite dev server instance for sending\r\n * WebSocket messages (error overlays, reloads, etc.)\r\n */\r\n configureServer(server: ViteDevServer) {\r\n viteServer = server;\r\n },\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n const shouldExclude = exclude.some((pattern) =>\r\n normalizedId.includes(pattern)\r\n );\r\n if (shouldExclude) return null;\r\n const shouldInclude = include.some((ext) => normalizedId.endsWith(ext));\r\n if (!shouldInclude) return null;\r\n\r\n // Type-safe way to access Vite context methods\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.addWatchFile === \"function\") {\r\n ctx.addWatchFile(id);\r\n }\r\n\r\n try {\r\n let loader: TransformOptions[\"loader\"] = \"tsx\";\r\n if (normalizedId.endsWith(\".ts\") || normalizedId.endsWith(\".fnx\")) {\r\n loader = \"tsx\";\r\n } else if (normalizedId.endsWith(\".tsx\")) {\r\n loader = \"tsx\";\r\n } else if (normalizedId.endsWith(\".jsx\")) {\r\n loader = \"jsx\";\r\n } else if (normalizedId.endsWith(\".js\")) {\r\n loader = \"jsx\";\r\n }\r\n\r\n const result = await transform(code, {\r\n loader,\r\n jsxFactory,\r\n jsxFragment,\r\n sourcemap,\r\n sourcefile: id,\r\n target: \"esnext\",\r\n format: \"esm\",\r\n ...esbuildOptions,\r\n });\r\n\r\n return {\r\n code: result.code,\r\n map: result.map || null,\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n\r\n // Send error overlay to the browser via WebSocket\r\n // This shows the red error overlay in the browser instead of just logging to terminal\r\n if (viteServer) {\r\n viteServer.ws.send({\r\n type: \"error\",\r\n err: {\r\n message: err.message,\r\n stack: err.stack || \"\",\r\n plugin: \"vite-plugin-fynix\",\r\n id,\r\n },\r\n });\r\n }\r\n\r\n // Log to terminal as well\r\n console.error(`\\x1b[32m[vite-plugin-fynix]\\x1b[0m \\x1b[31mFailed to transform ${id}:\\x1b[0m`);\r\n console.error(err.message);\r\n\r\n // Return null instead of throwing so Vite's HMR pipeline\r\n // stays intact and can recover when the error is fixed\r\n return null;\r\n }\r\n },\r\n\r\n handleHotUpdate(ctx: HmrContext) {\r\n const { file, server } = ctx;\r\n const normalizedFile = normalizePath(file);\r\n const shouldReload = include.some((ext) => normalizedFile.endsWith(ext));\r\n\r\n if (shouldReload) {\r\n console.log(\r\n `\\x1b[32m[vite-plugin-fynix]\\x1b[0m HMR: full-reload triggered by ${normalizedFile}`\r\n );\r\n server.ws.send({\r\n type: \"full-reload\",\r\n path: \"*\",\r\n });\r\n return [];\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n config() {\r\n return {\r\n esbuild: false as const,\r\n optimizeDeps: {\r\n include: [\"fynixui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory,\r\n jsxFragment,\r\n },\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n },\r\n\r\n buildStart() {\r\n console.log(\r\n `\\x1b[32m[vite-plugin-fynix]\\x1b[0m Initialized with JSX factory: ${jsxFactory}`\r\n );\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Named export for convenience\r\n */\r\nexport { fynixPlugin };\r\n\r\n/**\r\n * Export types for TypeScript users\r\n */\r\nexport type { FynixPluginOptions };\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../router/router.ts"],"names":[],"mappings":"AA2DA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC;CACpE;AAED,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAaD,UAAU,WAAW;IACnB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,YAAY,EAAE,CAAC;IAE9B,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,UAAU,CAAC,IAAI,IAAI,CAAC;IACpB,mBAAmB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;CACnD;AA0pBD,iBAAS,WAAW,IAAI,WAAW,CAmjBlC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,eAAe,WAAW,CAAC;AAM3B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAqB1E;AAKD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAoBhD"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 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\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, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\")\r\n .replace(/`/g, \"`\")\r\n .replace(/\\//g, \"/\")\r\n .replace(/=/g, \"=\")\r\n .replace(/\\(/g, \"(\")\r\n .replace(/\\)/g, \")\")\r\n .replace(/\\{/g, \"{\")\r\n .replace(/\\}/g, \"}\")\r\n .replace(/\\[/g, \"[\")\r\n .replace(/\\]/g, \"]\");\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": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/runtime.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../runtime.ts"],"names":[],"mappings":"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"}
|