@fynixorg/ui 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/build.d.ts +1 -0
  2. package/dist/context/context.d.ts +2 -0
  3. package/dist/context/context.js +3 -0
  4. package/dist/context/context.js.map +1 -1
  5. package/dist/custom/button.d.ts +19 -0
  6. package/dist/custom/button.js +3 -0
  7. package/dist/custom/button.js.map +1 -1
  8. package/dist/custom/index.d.ts +2 -0
  9. package/dist/custom/path.d.ts +20 -0
  10. package/dist/custom/path.js +3 -0
  11. package/dist/custom/path.js.map +2 -2
  12. package/dist/error/errorOverlay.d.ts +2 -0
  13. package/dist/error/errorOverlay.js +4 -0
  14. package/dist/error/errorOverlay.js.map +1 -1
  15. package/dist/fynix/index.d.ts +4 -0
  16. package/dist/hooks/nixAsync.d.ts +13 -0
  17. package/dist/hooks/nixAsync.js +7 -4
  18. package/dist/hooks/nixAsync.js.map +1 -1
  19. package/dist/hooks/nixAsyncCache.d.ts +7 -0
  20. package/dist/hooks/nixAsyncCache.js +7 -4
  21. package/dist/hooks/nixAsyncCache.js.map +1 -1
  22. package/dist/hooks/nixAsyncDebounce.d.ts +28 -0
  23. package/dist/hooks/nixAsyncDebounce.js +9 -6
  24. package/dist/hooks/nixAsyncDebounce.js.map +1 -1
  25. package/dist/hooks/nixAsyncQuery.d.ts +40 -0
  26. package/dist/hooks/nixAsyncQuery.js +7 -4
  27. package/dist/hooks/nixAsyncQuery.js.map +1 -1
  28. package/dist/hooks/nixCallback.d.ts +30 -0
  29. package/dist/hooks/nixCallback.js +4 -0
  30. package/dist/hooks/nixCallback.js.map +1 -1
  31. package/dist/hooks/nixComputed.d.ts +94 -0
  32. package/dist/hooks/nixComputed.js +4 -0
  33. package/dist/hooks/nixComputed.js.map +1 -1
  34. package/dist/hooks/nixDebounce.d.ts +28 -0
  35. package/dist/hooks/nixDebounce.js +7 -4
  36. package/dist/hooks/nixDebounce.js.map +1 -1
  37. package/dist/hooks/nixEffect.d.ts +64 -0
  38. package/dist/hooks/nixEffect.js +6 -0
  39. package/dist/hooks/nixEffect.js.map +1 -1
  40. package/dist/hooks/nixForm.d.ts +15 -0
  41. package/dist/hooks/nixForm.js +11 -0
  42. package/dist/hooks/nixForm.js.map +1 -1
  43. package/dist/hooks/nixFormAsync.d.ts +20 -0
  44. package/dist/hooks/nixFormAsync.js +12 -0
  45. package/dist/hooks/nixFormAsync.js.map +1 -1
  46. package/dist/hooks/nixInterval.d.ts +19 -0
  47. package/dist/hooks/nixInterval.js +6 -3
  48. package/dist/hooks/nixInterval.js.map +1 -1
  49. package/dist/hooks/nixLazy.d.ts +19 -0
  50. package/dist/hooks/nixLazy.js +6 -2
  51. package/dist/hooks/nixLazy.js.map +1 -1
  52. package/dist/hooks/nixLazyAsync.d.ts +26 -0
  53. package/dist/hooks/nixLazyAsync.js +10 -6
  54. package/dist/hooks/nixLazyAsync.js.map +1 -1
  55. package/dist/hooks/nixLazyFormAsync.d.ts +29 -0
  56. package/dist/hooks/nixLazyFormAsync.js +18 -6
  57. package/dist/hooks/nixLazyFormAsync.js.map +1 -1
  58. package/dist/hooks/nixLocalStorage.d.ts +11 -0
  59. package/dist/hooks/nixLocalStorage.js +5 -2
  60. package/dist/hooks/nixLocalStorage.js.map +1 -1
  61. package/dist/hooks/nixMemo.d.ts +8 -0
  62. package/dist/hooks/nixMemo.js +3 -0
  63. package/dist/hooks/nixMemo.js.map +1 -1
  64. package/dist/hooks/nixPrevious.d.ts +7 -0
  65. package/dist/hooks/nixPrevious.js +3 -0
  66. package/dist/hooks/nixPrevious.js.map +1 -1
  67. package/dist/hooks/nixRef.d.ts +10 -0
  68. package/dist/hooks/nixRef.js +3 -0
  69. package/dist/hooks/nixRef.js.map +1 -1
  70. package/dist/hooks/nixState.d.ts +73 -0
  71. package/dist/hooks/nixState.js +3 -0
  72. package/dist/hooks/nixState.js.map +1 -1
  73. package/dist/hooks/nixStore.d.ts +9 -0
  74. package/dist/hooks/nixStore.js +3 -0
  75. package/dist/hooks/nixStore.js.map +1 -1
  76. package/dist/plugins/vite-plugin-res.d.ts +12 -0
  77. package/dist/plugins/vite-plugin-res.js +3 -0
  78. package/dist/plugins/vite-plugin-res.js.map +1 -1
  79. package/dist/router/router.d.ts +53 -0
  80. package/dist/router/router.js +25 -2
  81. package/dist/router/router.js.map +1 -1
  82. package/dist/runtime.d.ts +91 -0
  83. package/dist/runtime.js +18 -0
  84. package/dist/runtime.js.map +1 -1
  85. package/package.json +2 -1
  86. package/types/global.d.ts +29 -19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export function setActiveContext(ctx: any): void;
2
+ export let activeContext: any;
@@ -1,7 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  let activeContext = null;
2
4
  function setActiveContext(ctx) {
3
5
  activeContext = ctx;
4
6
  }
7
+ __name(setActiveContext, "setActiveContext");
5
8
  export {
6
9
  activeContext,
7
10
  setActiveContext
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../context/context.js"],
4
4
  "sourcesContent": ["// runtime/context.js\r\nexport let activeContext = null;\r\n\r\nexport function setActiveContext(ctx) {\r\n activeContext = ctx;\r\n}\r\n"],
5
- "mappings": "AACO,IAAI,gBAAgB;AAEpB,SAAS,iBAAiB,KAAK;AACpC,kBAAgB;AAClB;",
5
+ "mappings": ";;AACO,IAAI,gBAAgB;AAEpB,SAAS,iBAAiB,KAAK;AACpC,kBAAgB;AAClB;AAFgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @typedef {Object} ButtonProps
3
+ * @property {string} [value] - Inner text of the button (default: "")
4
+ * @property {Record<string, any>} [props] - Other attributes
5
+ */
6
+ /**
7
+ * @param {ButtonProps} props
8
+ */
9
+ export function Button({ value, ...props }: ButtonProps): import("../runtime.js").VNode;
10
+ export type ButtonProps = {
11
+ /**
12
+ * - Inner text of the button (default: "")
13
+ */
14
+ value?: string;
15
+ /**
16
+ * - Other attributes
17
+ */
18
+ props?: Record<string, any>;
19
+ };
@@ -1,7 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { Fynix } from "../runtime.js";
2
4
  function Button({ value = "", ...props }) {
3
5
  return Fynix("button", props, value);
4
6
  }
7
+ __name(Button, "Button");
5
8
  export {
6
9
  Button
7
10
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../custom/button.js"],
4
4
  "sourcesContent": ["import { Fynix } from \"../runtime.js\";\r\n\r\n/**\r\n * @typedef {Object} ButtonProps\r\n * @property {string} [value] - Inner text of the button (default: \"\")\r\n * @property {Record<string, any>} [props] - Other attributes\r\n */\r\n\r\n/**\r\n * @param {ButtonProps} props\r\n */\r\nexport function Button({ value = \"\", ...props }) {\r\n return Fynix(\"button\", props, value);\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,aAAa;AAWf,SAAS,OAAO,EAAE,QAAQ,IAAI,GAAG,MAAM,GAAG;AAC/C,SAAO,MAAM,UAAU,OAAO,KAAK;AACrC;",
5
+ "mappings": ";;AAAA,SAAS,aAAa;AAWf,SAAS,OAAO,EAAE,QAAQ,IAAI,GAAG,MAAM,GAAG;AAC/C,SAAO,MAAM,UAAU,OAAO,KAAK;AACrC;AAFgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,2 @@
1
+ export { Button } from "./button";
2
+ export { Path } from "./path";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * SPA navigation link for Fynix router
3
+ * @param {PathProps & Record<string, any>} options
4
+ * @returns {VNode} anchor virtual node
5
+ */
6
+ export function Path({ to, value, props: routeProps, ...attrs }: PathProps & Record<string, any>): VNode;
7
+ export type PathProps = {
8
+ /**
9
+ * - URL to navigate to
10
+ */
11
+ to?: string;
12
+ /**
13
+ * - Link text
14
+ */
15
+ value?: string;
16
+ /**
17
+ * - Props to pass to the next route
18
+ */
19
+ props?: any;
20
+ };
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { Fynix, nixState } from "../runtime.js";
2
4
  let propsCounter = 0;
3
5
  function Path({
@@ -28,6 +30,7 @@ function Path({
28
30
  );
29
31
  return el;
30
32
  }
33
+ __name(Path, "Path");
31
34
  export {
32
35
  Path
33
36
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../custom/path.js"],
4
- "sourcesContent": ["import { Fynix, nixState } from \"../runtime.js\";\r\n\r\n/**\r\n * @typedef {Object} PathProps\r\n * @property {string} [to] - URL to navigate to\r\n * @property {string} [value] - Link text\r\n * @property {Object} [props] - Props to pass to the next route\r\n */\r\n\r\n/** Unique counter for props keys */\r\nlet propsCounter = 0;\r\n\r\n/**\r\n * SPA navigation link for Fynix router\r\n * @param {PathProps & Record<string, any>} options\r\n * @returns {HTMLElement} anchor element\r\n */\r\nexport function Path({\r\n to = \"#\",\r\n value = \"\",\r\n props: routeProps = {},\r\n ...attrs\r\n}) {\r\n ///console.log(\"[Path Component] Received routeProps:\", routeProps);\r\n\r\n // Wrap plain props in nixState if not already\r\n const wrappedProps = {};\r\n for (const [k, v] of Object.entries(routeProps)) {\r\n wrappedProps[k] = v && v._isNixState ? v : nixState(v);\r\n }\r\n\r\n // Generate a unique key for this props object\r\n // FIX: Do not use __ prefix as router blocks it for security\r\n const propsKey = `fynixProp_${Date.now()}_${propsCounter++}`;\r\n \r\n // FIX: Store props in the namespace expected by the router\r\n if (!window.__fynixLinkProps__) {\r\n window.__fynixLinkProps__ = {};\r\n }\r\n \r\n // Debug log\r\n // console.log(\"[Path] Storage props:\", propsKey, wrappedProps);\r\n \r\n window.__fynixLinkProps__[propsKey] = wrappedProps;\r\n\r\n // Create the anchor element\r\n const el = Fynix(\r\n \"a\",\r\n {\r\n href: to,\r\n \"data-fynix-link\": true, // SPA link detection\r\n \"data-props-key\": propsKey,\r\n ...attrs,\r\n },\r\n value\r\n );\r\n\r\n return el;\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,OAAO,gBAAgB;AAUhC,IAAI,eAAe;AAOZ,SAAS,KAAK;AAAA,EACnB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO,aAAa,CAAC;AAAA,EACrB,GAAG;AACL,GAAG;AAID,QAAM,eAAe,CAAC;AACtB,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,iBAAa,CAAC,IAAI,KAAK,EAAE,cAAc,IAAI,SAAS,CAAC;AAAA,EACvD;AAIA,QAAM,WAAW,aAAa,KAAK,IAAI,CAAC,IAAI,cAAc;AAG1D,MAAI,CAAC,OAAO,oBAAoB;AAC9B,WAAO,qBAAqB,CAAC;AAAA,EAC/B;AAKA,SAAO,mBAAmB,QAAQ,IAAI;AAGtC,QAAM,KAAK;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,mBAAmB;AAAA;AAAA,MACnB,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["import { Fynix, nixState } from \"../runtime.js\";\r\n\r\n/**\r\n * @typedef {Object} PathProps\r\n * @property {string} [to] - URL to navigate to\r\n * @property {string} [value] - Link text\r\n * @property {Object} [props] - Props to pass to the next route\r\n */\r\n\r\n/** Unique counter for props keys */\r\nlet propsCounter = 0;\r\n\r\n/**\r\n * SPA navigation link for Fynix router\r\n * @param {PathProps & Record<string, any>} options\r\n * @returns {VNode} anchor virtual node\r\n */\r\nexport function Path({\r\n to = \"#\",\r\n value = \"\",\r\n props: routeProps = {},\r\n ...attrs\r\n}) {\r\n ///console.log(\"[Path Component] Received routeProps:\", routeProps);\r\n\r\n // Wrap plain props in nixState if not already\r\n const wrappedProps = {};\r\n for (const [k, v] of Object.entries(routeProps)) {\r\n wrappedProps[k] = v && v._isNixState ? v : nixState(v);\r\n }\r\n\r\n // Generate a unique key for this props object\r\n // FIX: Do not use __ prefix as router blocks it for security\r\n const propsKey = `fynixProp_${Date.now()}_${propsCounter++}`;\r\n\r\n // FIX: Store props in the namespace expected by the router\r\n if (!window.__fynixLinkProps__) {\r\n window.__fynixLinkProps__ = {};\r\n }\r\n\r\n // Debug log\r\n // console.log(\"[Path] Storage props:\", propsKey, wrappedProps);\r\n\r\n window.__fynixLinkProps__[propsKey] = wrappedProps;\r\n\r\n // Create the anchor element\r\n const el = Fynix(\r\n \"a\",\r\n {\r\n href: to,\r\n \"data-fynix-link\": true, // SPA link detection\r\n \"data-props-key\": propsKey,\r\n ...attrs,\r\n },\r\n value\r\n );\r\n\r\n return el;\r\n}\r\n"],
5
+ "mappings": ";;AAAA,SAAS,OAAO,gBAAgB;AAUhC,IAAI,eAAe;AAOZ,SAAS,KAAK;AAAA,EACnB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO,aAAa,CAAC;AAAA,EACrB,GAAG;AACL,GAAG;AAID,QAAM,eAAe,CAAC;AACtB,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,iBAAa,CAAC,IAAI,KAAK,EAAE,cAAc,IAAI,SAAS,CAAC;AAAA,EACvD;AAIA,QAAM,WAAW,aAAa,KAAK,IAAI,CAAC,IAAI,cAAc;AAG1D,MAAI,CAAC,OAAO,oBAAoB;AAC9B,WAAO,qBAAqB,CAAC;AAAA,EAC/B;AAKA,SAAO,mBAAmB,QAAQ,IAAI;AAGtC,QAAM,KAAK;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,mBAAmB;AAAA;AAAA,MACnB,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAzCgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,2 @@
1
+ export function showErrorOverlay(error: any): void;
2
+ export function removeErrorOverlay(): void;
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  function showErrorOverlay(error) {
2
4
  removeErrorOverlay();
3
5
  const overlay = document.createElement("div");
@@ -75,6 +77,7 @@ function showErrorOverlay(error) {
75
77
  });
76
78
  console.error("FynixJS Runtime Error]", error);
77
79
  }
80
+ __name(showErrorOverlay, "showErrorOverlay");
78
81
  function removeErrorOverlay() {
79
82
  const existing = document.getElementById("dev-error-overlay");
80
83
  if (existing) {
@@ -82,6 +85,7 @@ function removeErrorOverlay() {
82
85
  setTimeout(() => existing.remove(), 200);
83
86
  }
84
87
  }
88
+ __name(removeErrorOverlay, "removeErrorOverlay");
85
89
  export {
86
90
  removeErrorOverlay,
87
91
  showErrorOverlay
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../error/errorOverlay.js"],
4
4
  "sourcesContent": ["// errorOverlay.js\r\nexport function showErrorOverlay(error) {\r\n removeErrorOverlay();\r\n\r\n const overlay = document.createElement(\"div\");\r\n overlay.id = \"dev-error-overlay\";\r\n Object.assign(overlay.style, {\r\n position: \"fixed\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.9)\",\r\n color: \"#fff\",\r\n fontFamily: \"Consolas, monospace\",\r\n padding: \"30px\",\r\n zIndex: 99999,\r\n overflowY: \"auto\",\r\n transition: \"opacity 0.25s ease\",\r\n opacity: \"0\",\r\n });\r\n\r\n const container = document.createElement(\"div\");\r\n container.style.position = \"relative\"; // important for absolute button\r\n container.style.maxWidth = \"900px\";\r\n container.style.margin = \"50px auto\";\r\n container.style.background = \"rgba(255, 255, 255, 0.05)\";\r\n container.style.borderRadius = \"8px\";\r\n container.style.padding = \"20px 30px\";\r\n container.style.boxShadow = \"0 0 10px rgba(255, 0, 0, 0.3)\";\r\n\r\n // Close Button\r\n const closeBtn = document.createElement(\"button\");\r\n closeBtn.textContent = \"\u00D7 Close\";\r\n Object.assign(closeBtn.style, {\r\n position: \"absolute\",\r\n top: \"10px\",\r\n right: \"10px\",\r\n background: \"#ff5555\",\r\n color: \"#fff\",\r\n border: \"none\",\r\n padding: \"6px 12px\",\r\n fontSize: \"16px\",\r\n borderRadius: \"4px\",\r\n cursor: \"pointer\",\r\n zIndex: 10,\r\n });\r\n closeBtn.addEventListener(\"click\", () => removeErrorOverlay());\r\n container.appendChild(closeBtn);\r\n\r\n // Title\r\n const title = document.createElement(\"h1\");\r\n title.textContent = \"Runtime Error\";\r\n Object.assign(title.style, {\r\n color: \"#ff5555\",\r\n fontSize: \"24px\",\r\n marginBottom: \"10px\",\r\n });\r\n\r\n // Message\r\n const message = document.createElement(\"pre\");\r\n message.textContent = error?.message || \"Unknown error\";\r\n Object.assign(message.style, {\r\n whiteSpace: \"pre-wrap\",\r\n background: \"rgba(255, 255, 255, 0.1)\",\r\n padding: \"10px\",\r\n borderRadius: \"6px\",\r\n marginTop: \"10px\",\r\n color: \"#ffaaaa\",\r\n });\r\n\r\n // Stack trace\r\n const stack = document.createElement(\"pre\");\r\n stack.textContent = error?.stack || \"\";\r\n Object.assign(stack.style, {\r\n whiteSpace: \"pre-wrap\",\r\n marginTop: \"15px\",\r\n color: \"#ccc\",\r\n });\r\n\r\n container.appendChild(title);\r\n container.appendChild(message);\r\n container.appendChild(stack);\r\n overlay.appendChild(container);\r\n document.body.appendChild(overlay);\r\n\r\n // Smooth fade-in\r\n requestAnimationFrame(() => {\r\n overlay.style.opacity = \"1\";\r\n });\r\n\r\n // Console log\r\n console.error(\"FynixJS Runtime Error]\", error);\r\n}\r\n\r\nexport function removeErrorOverlay() {\r\n const existing = document.getElementById(\"dev-error-overlay\");\r\n if (existing) {\r\n existing.style.opacity = \"0\";\r\n setTimeout(() => existing.remove(), 200);\r\n }\r\n}\r\n"],
5
- "mappings": "AACO,SAAS,iBAAiB,OAAO;AACtC,qBAAmB;AAEnB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,KAAK;AACb,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,CAAC;AAED,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,MAAM,WAAW;AAC3B,YAAU,MAAM,WAAW;AAC3B,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,aAAa;AAC7B,YAAU,MAAM,eAAe;AAC/B,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,YAAY;AAG5B,QAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,WAAS,cAAc;AACvB,SAAO,OAAO,SAAS,OAAO;AAAA,IAC5B,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACD,WAAS,iBAAiB,SAAS,MAAM,mBAAmB,CAAC;AAC7D,YAAU,YAAY,QAAQ;AAG9B,QAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,QAAM,cAAc;AACpB,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AAGD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,cAAc,OAAO,WAAW;AACxC,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,cAAc,OAAO,SAAS;AACpC,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAED,YAAU,YAAY,KAAK;AAC3B,YAAU,YAAY,OAAO;AAC7B,YAAU,YAAY,KAAK;AAC3B,UAAQ,YAAY,SAAS;AAC7B,WAAS,KAAK,YAAY,OAAO;AAGjC,wBAAsB,MAAM;AAC1B,YAAQ,MAAM,UAAU;AAAA,EAC1B,CAAC;AAGD,UAAQ,MAAM,0BAA0B,KAAK;AAC/C;AAEO,SAAS,qBAAqB;AACnC,QAAM,WAAW,SAAS,eAAe,mBAAmB;AAC5D,MAAI,UAAU;AACZ,aAAS,MAAM,UAAU;AACzB,eAAW,MAAM,SAAS,OAAO,GAAG,GAAG;AAAA,EACzC;AACF;",
5
+ "mappings": ";;AACO,SAAS,iBAAiB,OAAO;AACtC,qBAAmB;AAEnB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,KAAK;AACb,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,CAAC;AAED,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,MAAM,WAAW;AAC3B,YAAU,MAAM,WAAW;AAC3B,YAAU,MAAM,SAAS;AACzB,YAAU,MAAM,aAAa;AAC7B,YAAU,MAAM,eAAe;AAC/B,YAAU,MAAM,UAAU;AAC1B,YAAU,MAAM,YAAY;AAG5B,QAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,WAAS,cAAc;AACvB,SAAO,OAAO,SAAS,OAAO;AAAA,IAC5B,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACD,WAAS,iBAAiB,SAAS,MAAM,mBAAmB,CAAC;AAC7D,YAAU,YAAY,QAAQ;AAG9B,QAAM,QAAQ,SAAS,cAAc,IAAI;AACzC,QAAM,cAAc;AACpB,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AAGD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,cAAc,OAAO,WAAW;AACxC,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,cAAc,OAAO,SAAS;AACpC,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAED,YAAU,YAAY,KAAK;AAC3B,YAAU,YAAY,OAAO;AAC7B,YAAU,YAAY,KAAK;AAC3B,UAAQ,YAAY,SAAS;AAC7B,WAAS,KAAK,YAAY,OAAO;AAGjC,wBAAsB,MAAM;AAC1B,YAAQ,MAAM,UAAU;AAAA,EAC1B,CAAC;AAGD,UAAQ,MAAM,0BAA0B,KAAK;AAC/C;AA3FgB;AA6FT,SAAS,qBAAqB;AACnC,QAAM,WAAW,SAAS,eAAe,mBAAmB;AAC5D,MAAI,UAAU;AACZ,aAAS,MAAM,UAAU;AACzB,eAAW,MAAM,SAAS,OAAO,GAAG,GAAG;AAAA,EACzC;AACF;AANgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,4 @@
1
+ export * from "../runtime.js";
2
+ export * from "../router/router.js";
3
+ export { Fynix } from "../runtime.js";
4
+ export { default as createFynix } from "../router/router.js";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Async state helper with AbortController support.
3
+ *
4
+ * @template T
5
+ * @param {(signal: AbortSignal) => Promise<T>} promiseFactory
6
+ */
7
+ export function nixAsync<T>(promiseFactory: (signal: AbortSignal) => Promise<T>): {
8
+ data: import("./nixState").NixState;
9
+ error: import("./nixState").NixState;
10
+ loading: import("./nixState").NixState;
11
+ run: () => Promise<void>;
12
+ cancel: () => void;
13
+ };
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { nixState } from "./nixState";
2
4
  function nixAsync(promiseFactory) {
3
5
  const data = nixState(null);
@@ -6,7 +8,7 @@ function nixAsync(promiseFactory) {
6
8
  let active = true;
7
9
  let controller = null;
8
10
  let callId = 0;
9
- const run = async () => {
11
+ const run = /* @__PURE__ */ __name(async () => {
10
12
  if (controller)
11
13
  controller.abort();
12
14
  controller = new AbortController();
@@ -28,14 +30,15 @@ function nixAsync(promiseFactory) {
28
30
  loading.value = false;
29
31
  }
30
32
  }
31
- };
32
- const cancel = () => {
33
+ }, "run");
34
+ const cancel = /* @__PURE__ */ __name(() => {
33
35
  active = false;
34
36
  if (controller)
35
37
  controller.abort();
36
- };
38
+ }, "cancel");
37
39
  return { data, error, loading, run, cancel };
38
40
  }
41
+ __name(nixAsync, "nixAsync");
39
42
  export {
40
43
  nixAsync
41
44
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../hooks/nixAsync.js"],
4
4
  "sourcesContent": ["import { nixState } from \"./nixState\";\r\n\r\n/**\r\n * Async state helper with AbortController support.\r\n *\r\n * @template T\r\n * @param {(signal: AbortSignal) => Promise<T>} promiseFactory\r\n */\r\nexport function nixAsync(promiseFactory) {\r\n const data = nixState(null);\r\n const error = nixState(null);\r\n const loading = nixState(false);\r\n\r\n let active = true;\r\n let controller = null;\r\n let callId = 0;\r\n\r\n const run = async () => {\r\n // Cancel previous request\r\n if (controller) controller.abort();\r\n\r\n controller = new AbortController();\r\n const signal = controller.signal;\r\n const id = ++callId;\r\n\r\n loading.value = true;\r\n error.value = null;\r\n\r\n try {\r\n const result = await promiseFactory(signal);\r\n if (!active || id !== callId || signal.aborted) return;\r\n data.value = result;\r\n } catch (e) {\r\n if (!active || id !== callId || signal.aborted) return;\r\n error.value = e instanceof Error ? e : new Error(String(e));\r\n } finally {\r\n if (active && id === callId && !signal.aborted) {\r\n loading.value = false;\r\n }\r\n }\r\n };\r\n\r\n const cancel = () => {\r\n active = false;\r\n if (controller) controller.abort();\r\n };\r\n\r\n return { data, error, loading, run, cancel };\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AAQlB,SAAS,SAAS,gBAAgB;AACvC,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,QAAM,MAAM,YAAY;AAEtB,QAAI;AAAY,iBAAW,MAAM;AAEjC,iBAAa,IAAI,gBAAgB;AACjC,UAAM,SAAS,WAAW;AAC1B,UAAM,KAAK,EAAE;AAEb,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAI,CAAC,UAAU,OAAO,UAAU,OAAO;AAAS;AAChD,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,UAAI,CAAC,UAAU,OAAO,UAAU,OAAO;AAAS;AAChD,YAAM,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,IAC5D,UAAE;AACA,UAAI,UAAU,OAAO,UAAU,CAAC,OAAO,SAAS;AAC9C,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,aAAS;AACT,QAAI;AAAY,iBAAW,MAAM;AAAA,EACnC;AAEA,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;",
5
+ "mappings": ";;AAAA,SAAS,gBAAgB;AAQlB,SAAS,SAAS,gBAAgB;AACvC,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,QAAM,MAAM,mCAAY;AAEtB,QAAI;AAAY,iBAAW,MAAM;AAEjC,iBAAa,IAAI,gBAAgB;AACjC,UAAM,SAAS,WAAW;AAC1B,UAAM,KAAK,EAAE;AAEb,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAI,CAAC,UAAU,OAAO,UAAU,OAAO;AAAS;AAChD,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,UAAI,CAAC,UAAU,OAAO,UAAU,OAAO;AAAS;AAChD,YAAM,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,IAC5D,UAAE;AACA,UAAI,UAAU,OAAO,UAAU,CAAC,OAAO,SAAS;AAC9C,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF,GAvBY;AAyBZ,QAAM,SAAS,6BAAM;AACnB,aAAS;AACT,QAAI;AAAY,iBAAW,MAAM;AAAA,EACnC,GAHe;AAKf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AAxCgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,7 @@
1
+ export function nixAsyncCached(key: any, promiseFactory: any): {
2
+ data: import("./nixState").NixState;
3
+ error: import("./nixState").NixState;
4
+ loading: import("./nixState").NixState;
5
+ run: () => Promise<void>;
6
+ cancel: () => void;
7
+ };
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { nixState } from "./nixState";
2
4
  const asyncCache = /* @__PURE__ */ new Map();
3
5
  function nixAsyncCached(key, promiseFactory) {
@@ -5,7 +7,7 @@ function nixAsyncCached(key, promiseFactory) {
5
7
  const error = nixState(null);
6
8
  const loading = nixState(false);
7
9
  let active = true;
8
- const run = async () => {
10
+ const run = /* @__PURE__ */ __name(async () => {
9
11
  loading.value = true;
10
12
  error.value = null;
11
13
  if (asyncCache.has(key)) {
@@ -46,12 +48,13 @@ function nixAsyncCached(key, promiseFactory) {
46
48
  if (active)
47
49
  loading.value = false;
48
50
  }
49
- };
50
- const cancel = () => {
51
+ }, "run");
52
+ const cancel = /* @__PURE__ */ __name(() => {
51
53
  active = false;
52
- };
54
+ }, "cancel");
53
55
  return { data, error, loading, run, cancel };
54
56
  }
57
+ __name(nixAsyncCached, "nixAsyncCached");
55
58
  export {
56
59
  nixAsyncCached
57
60
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../hooks/nixAsyncCache.js"],
4
4
  "sourcesContent": ["import { nixState } from \"./nixState\";\r\n\r\nconst asyncCache = new Map();\r\n\r\nexport function nixAsyncCached(key, promiseFactory) {\r\n const data = nixState(null);\r\n const error = nixState(null);\r\n const loading = nixState(false);\r\n\r\n let active = true;\r\n\r\n const run = async () => {\r\n loading.value = true;\r\n error.value = null;\r\n\r\n // Cache hit with resolved data\r\n if (asyncCache.has(key)) {\r\n const cached = asyncCache.get(key);\r\n\r\n if (cached.data) {\r\n data.value = cached.data;\r\n loading.value = false;\r\n return;\r\n }\r\n\r\n // Deduping: reuse in-flight promise\r\n try {\r\n const result = await cached.promise;\r\n if (!active) return;\r\n data.value = result;\r\n loading.value = false;\r\n } catch (e) {\r\n if (!active) return;\r\n error.value = e;\r\n loading.value = false;\r\n }\r\n return;\r\n }\r\n\r\n // Cache miss\r\n const promise = Promise.resolve().then(promiseFactory);\r\n asyncCache.set(key, { promise });\r\n\r\n try {\r\n const result = await promise;\r\n asyncCache.set(key, { data: result });\r\n if (!active) return;\r\n data.value = result;\r\n } catch (e) {\r\n asyncCache.delete(key);\r\n if (!active) return;\r\n error.value = e;\r\n } finally {\r\n if (active) loading.value = false;\r\n }\r\n };\r\n\r\n const cancel = () => {\r\n active = false;\r\n };\r\n\r\n return { data, error, loading, run, cancel };\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AAEzB,MAAM,aAAa,oBAAI,IAAI;AAEpB,SAAS,eAAe,KAAK,gBAAgB;AAClD,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAS;AAEb,QAAM,MAAM,YAAY;AACtB,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAGd,QAAI,WAAW,IAAI,GAAG,GAAG;AACvB,YAAM,SAAS,WAAW,IAAI,GAAG;AAEjC,UAAI,OAAO,MAAM;AACf,aAAK,QAAQ,OAAO;AACpB,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAGA,UAAI;AACF,cAAM,SAAS,MAAM,OAAO;AAC5B,YAAI,CAAC;AAAQ;AACb,aAAK,QAAQ;AACb,gBAAQ,QAAQ;AAAA,MAClB,SAAS,GAAG;AACV,YAAI,CAAC;AAAQ;AACb,cAAM,QAAQ;AACd,gBAAQ,QAAQ;AAAA,MAClB;AACA;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ,QAAQ,EAAE,KAAK,cAAc;AACrD,eAAW,IAAI,KAAK,EAAE,QAAQ,CAAC;AAE/B,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,iBAAW,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC;AACpC,UAAI,CAAC;AAAQ;AACb,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,iBAAW,OAAO,GAAG;AACrB,UAAI,CAAC;AAAQ;AACb,YAAM,QAAQ;AAAA,IAChB,UAAE;AACA,UAAI;AAAQ,gBAAQ,QAAQ;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;",
5
+ "mappings": ";;AAAA,SAAS,gBAAgB;AAEzB,MAAM,aAAa,oBAAI,IAAI;AAEpB,SAAS,eAAe,KAAK,gBAAgB;AAClD,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAS;AAEb,QAAM,MAAM,mCAAY;AACtB,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAGd,QAAI,WAAW,IAAI,GAAG,GAAG;AACvB,YAAM,SAAS,WAAW,IAAI,GAAG;AAEjC,UAAI,OAAO,MAAM;AACf,aAAK,QAAQ,OAAO;AACpB,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAGA,UAAI;AACF,cAAM,SAAS,MAAM,OAAO;AAC5B,YAAI,CAAC;AAAQ;AACb,aAAK,QAAQ;AACb,gBAAQ,QAAQ;AAAA,MAClB,SAAS,GAAG;AACV,YAAI,CAAC;AAAQ;AACb,cAAM,QAAQ;AACd,gBAAQ,QAAQ;AAAA,MAClB;AACA;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ,QAAQ,EAAE,KAAK,cAAc;AACrD,eAAW,IAAI,KAAK,EAAE,QAAQ,CAAC;AAE/B,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,iBAAW,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC;AACpC,UAAI,CAAC;AAAQ;AACb,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,iBAAW,OAAO,GAAG;AACrB,UAAI,CAAC;AAAQ;AACb,YAAM,QAAQ;AAAA,IAChB,UAAE;AACA,UAAI;AAAQ,gBAAQ,QAAQ;AAAA,IAC9B;AAAA,EACF,GA5CY;AA8CZ,QAAM,SAAS,6BAAM;AACnB,aAAS;AAAA,EACX,GAFe;AAIf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AA1DgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Debounced and cancellable async data fetcher with caching and deduping.
3
+ *
4
+ * @param {() => Promise<any>} promiseFactory - Async function that returns a promise.
5
+ * @param {Object} [options={}] - Options for debounce, caching, and abort.
6
+ * @param {number} [options.delay=300] - Debounce delay in ms.
7
+ * @param {boolean} [options.leading=false] - Run on leading edge.
8
+ * @param {boolean} [options.trailing=true] - Run on trailing edge.
9
+ * @param {number} [options.maxWait] - Max wait time before forced invocation.
10
+ * @param {boolean} [options.cache=true] - Enable caching of last result.
11
+ * @param {AbortSignal} [options.signal] - Optional AbortSignal to cancel request.
12
+ * @returns {Object} { data, error, loading, run, cancel }
13
+ *
14
+ * @example
15
+ * const controller = new AbortController();
16
+ * const { data, error, loading, run, cancel } = nixAsyncDebounce(
17
+ * () => fetch('/api/data').then(r => r.json()),
18
+ * { delay: 500, maxWait: 2000, leading: true, signal: controller.signal }
19
+ * );
20
+ */
21
+ export function nixAsyncDebounce(promiseFactory: () => Promise<any>, options?: {
22
+ delay?: number;
23
+ leading?: boolean;
24
+ trailing?: boolean;
25
+ maxWait?: number;
26
+ cache?: boolean;
27
+ signal?: AbortSignal;
28
+ }): any;
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { nixState } from "./nixState";
2
4
  function nixAsyncDebounce(promiseFactory, options = {}) {
3
5
  const data = nixState(null);
@@ -16,7 +18,7 @@ function nixAsyncDebounce(promiseFactory, options = {}) {
16
18
  let timerId = null;
17
19
  let lastInvokeTime = 0;
18
20
  let pendingPromise = null;
19
- const invoke = async () => {
21
+ const invoke = /* @__PURE__ */ __name(async () => {
20
22
  if (cache && lastResult !== null) {
21
23
  data.value = lastResult;
22
24
  error.value = lastError;
@@ -49,8 +51,8 @@ function nixAsyncDebounce(promiseFactory, options = {}) {
49
51
  pendingPromise = null;
50
52
  lastInvokeTime = Date.now();
51
53
  }
52
- };
53
- const run = () => {
54
+ }, "invoke");
55
+ const run = /* @__PURE__ */ __name(() => {
54
56
  const now = Date.now();
55
57
  const timeSinceLastInvoke = now - lastInvokeTime;
56
58
  const remainingTime = delay - timeSinceLastInvoke;
@@ -71,14 +73,15 @@ function nixAsyncDebounce(promiseFactory, options = {}) {
71
73
  invoke();
72
74
  }, remainingTime > 0 ? remainingTime : delay);
73
75
  }
74
- };
75
- const cancel = () => {
76
+ }, "run");
77
+ const cancel = /* @__PURE__ */ __name(() => {
76
78
  if (timerId)
77
79
  clearTimeout(timerId);
78
80
  timerId = pendingPromise = null;
79
- };
81
+ }, "cancel");
80
82
  return { data, error, loading, run, cancel };
81
83
  }
84
+ __name(nixAsyncDebounce, "nixAsyncDebounce");
82
85
  export {
83
86
  nixAsyncDebounce
84
87
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../hooks/nixAsyncDebounce.js"],
4
4
  "sourcesContent": ["import { nixState } from \"./nixState\";\r\n\r\n/**\r\n * Debounced and cancellable async data fetcher with caching and deduping.\r\n *\r\n * @param {() => Promise<any>} promiseFactory - Async function that returns a promise.\r\n * @param {Object} [options={}] - Options for debounce, caching, and abort.\r\n * @param {number} [options.delay=300] - Debounce delay in ms.\r\n * @param {boolean} [options.leading=false] - Run on leading edge.\r\n * @param {boolean} [options.trailing=true] - Run on trailing edge.\r\n * @param {number} [options.maxWait] - Max wait time before forced invocation.\r\n * @param {boolean} [options.cache=true] - Enable caching of last result.\r\n * @param {AbortSignal} [options.signal] - Optional AbortSignal to cancel request.\r\n * @returns {Object} { data, error, loading, run, cancel }\r\n *\r\n * @example\r\n * const controller = new AbortController();\r\n * const { data, error, loading, run, cancel } = nixAsyncDebounce(\r\n * () => fetch('/api/data').then(r => r.json()),\r\n * { delay: 500, maxWait: 2000, leading: true, signal: controller.signal }\r\n * );\r\n */\r\nexport function nixAsyncDebounce(promiseFactory, options = {}) {\r\n const data = nixState(null);\r\n const error = nixState(null);\r\n const loading = nixState(false);\r\n\r\n const {\r\n delay = 300,\r\n leading = false,\r\n trailing = true,\r\n maxWait,\r\n cache = true,\r\n signal\r\n } = options;\r\n\r\n let lastResult = null;\r\n let lastError = null;\r\n let timerId = null;\r\n let lastInvokeTime = 0;\r\n let pendingPromise = null;\r\n\r\n const invoke = async () => {\r\n if (cache && lastResult !== null) {\r\n data.value = lastResult;\r\n error.value = lastError;\r\n loading.value = false;\r\n return lastResult;\r\n }\r\n\r\n loading.value = true;\r\n error.value = null;\r\n\r\n const abortController = new AbortController();\r\n if (signal) {\r\n signal.addEventListener(\"abort\", () => {\r\n abortController.abort();\r\n cancel();\r\n });\r\n }\r\n\r\n pendingPromise = promiseFactory();\r\n\r\n try {\r\n const result = await pendingPromise;\r\n lastResult = result;\r\n data.value = result;\r\n return result;\r\n } catch (e) {\r\n if (e.name !== \"AbortError\") {\r\n lastError = e;\r\n error.value = e;\r\n }\r\n throw e;\r\n } finally {\r\n loading.value = false;\r\n pendingPromise = null;\r\n lastInvokeTime = Date.now();\r\n }\r\n };\r\n\r\n const run = () => {\r\n const now = Date.now();\r\n const timeSinceLastInvoke = now - lastInvokeTime;\r\n const remainingTime = delay - timeSinceLastInvoke;\r\n\r\n const shouldInvokeLeading = leading && !timerId;\r\n\r\n if (maxWait !== undefined && timeSinceLastInvoke >= maxWait) {\r\n if (timerId) clearTimeout(timerId);\r\n timerId = null;\r\n return invoke();\r\n }\r\n\r\n if (timerId) clearTimeout(timerId);\r\n\r\n if (shouldInvokeLeading) return invoke();\r\n\r\n if (trailing) {\r\n timerId = setTimeout(() => {\r\n timerId = null;\r\n invoke();\r\n }, remainingTime > 0 ? remainingTime : delay);\r\n }\r\n };\r\n\r\n const cancel = () => {\r\n if (timerId) clearTimeout(timerId);\r\n timerId = pendingPromise = null;\r\n };\r\n\r\n return { data, error, loading, run, cancel };\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AAsBlB,SAAS,iBAAiB,gBAAgB,UAAU,CAAC,GAAG;AAC7D,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,IAAI;AAEJ,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,iBAAiB;AAErB,QAAM,SAAS,YAAY;AACzB,QAAI,SAAS,eAAe,MAAM;AAChC,WAAK,QAAQ;AACb,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,QAAI,QAAQ;AACV,aAAO,iBAAiB,SAAS,MAAM;AACrC,wBAAgB,MAAM;AACtB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,qBAAiB,eAAe;AAEhC,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,mBAAa;AACb,WAAK,QAAQ;AACb,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,EAAE,SAAS,cAAc;AAC3B,oBAAY;AACZ,cAAM,QAAQ;AAAA,MAChB;AACA,YAAM;AAAA,IACR,UAAE;AACA,cAAQ,QAAQ;AAChB,uBAAiB;AACjB,uBAAiB,KAAK,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,MAAM,MAAM;AAChB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,sBAAsB,MAAM;AAClC,UAAM,gBAAgB,QAAQ;AAE9B,UAAM,sBAAsB,WAAW,CAAC;AAExC,QAAI,YAAY,UAAa,uBAAuB,SAAS;AAC3D,UAAI;AAAS,qBAAa,OAAO;AACjC,gBAAU;AACV,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI;AAAS,mBAAa,OAAO;AAEjC,QAAI;AAAqB,aAAO,OAAO;AAEvC,QAAI,UAAU;AACZ,gBAAU,WAAW,MAAM;AACzB,kBAAU;AACV,eAAO;AAAA,MACT,GAAG,gBAAgB,IAAI,gBAAgB,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI;AAAS,mBAAa,OAAO;AACjC,cAAU,iBAAiB;AAAA,EAC7B;AAEA,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;",
5
+ "mappings": ";;AAAA,SAAS,gBAAgB;AAsBlB,SAAS,iBAAiB,gBAAgB,UAAU,CAAC,GAAG;AAC7D,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,IAAI;AAEJ,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,iBAAiB;AAErB,QAAM,SAAS,mCAAY;AACzB,QAAI,SAAS,eAAe,MAAM;AAChC,WAAK,QAAQ;AACb,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,QAAI,QAAQ;AACV,aAAO,iBAAiB,SAAS,MAAM;AACrC,wBAAgB,MAAM;AACtB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,qBAAiB,eAAe;AAEhC,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,mBAAa;AACb,WAAK,QAAQ;AACb,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,EAAE,SAAS,cAAc;AAC3B,oBAAY;AACZ,cAAM,QAAQ;AAAA,MAChB;AACA,YAAM;AAAA,IACR,UAAE;AACA,cAAQ,QAAQ;AAChB,uBAAiB;AACjB,uBAAiB,KAAK,IAAI;AAAA,IAC5B;AAAA,EACF,GArCe;AAuCf,QAAM,MAAM,6BAAM;AAChB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,sBAAsB,MAAM;AAClC,UAAM,gBAAgB,QAAQ;AAE9B,UAAM,sBAAsB,WAAW,CAAC;AAExC,QAAI,YAAY,UAAa,uBAAuB,SAAS;AAC3D,UAAI;AAAS,qBAAa,OAAO;AACjC,gBAAU;AACV,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI;AAAS,mBAAa,OAAO;AAEjC,QAAI;AAAqB,aAAO,OAAO;AAEvC,QAAI,UAAU;AACZ,gBAAU,WAAW,MAAM;AACzB,kBAAU;AACV,eAAO;AAAA,MACT,GAAG,gBAAgB,IAAI,gBAAgB,KAAK;AAAA,IAC9C;AAAA,EACF,GAvBY;AAyBZ,QAAM,SAAS,6BAAM;AACnB,QAAI;AAAS,mBAAa,OAAO;AACjC,cAAU,iBAAiB;AAAA,EAC7B,GAHe;AAKf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AA1FgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Unified async query helper with:
3
+ * - AbortController cancellation
4
+ * - Request deduping
5
+ * - Shared caching
6
+ *
7
+ * @template T
8
+ * @param {string} key
9
+ * Unique cache key representing the request
10
+ *
11
+ * @param {(signal: AbortSignal) => Promise<T>} queryFn
12
+ * Function that performs the async operation
13
+ *
14
+ * @param {{
15
+ * ttl?: number
16
+ * }} [options]
17
+ *
18
+ * @returns {{
19
+ * data: { value: T | null },
20
+ * error: { value: Error | null },
21
+ * loading: { value: boolean },
22
+ * run: () => Promise<void>,
23
+ * cancel: () => void
24
+ * }}
25
+ */
26
+ export function nixAsyncQuery<T>(key: string, queryFn: (signal: AbortSignal) => Promise<T>, options?: {
27
+ ttl?: number;
28
+ }): {
29
+ data: {
30
+ value: T | null;
31
+ };
32
+ error: {
33
+ value: Error | null;
34
+ };
35
+ loading: {
36
+ value: boolean;
37
+ };
38
+ run: () => Promise<void>;
39
+ cancel: () => void;
40
+ };
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { nixState } from "./nixState";
2
4
  const asyncCache = /* @__PURE__ */ new Map();
3
5
  function nixAsyncQuery(key, queryFn, options = {}) {
@@ -7,7 +9,7 @@ function nixAsyncQuery(key, queryFn, options = {}) {
7
9
  const ttl = options.ttl ?? 0;
8
10
  let active = true;
9
11
  let callId = 0;
10
- const run = async () => {
12
+ const run = /* @__PURE__ */ __name(async () => {
11
13
  const id = ++callId;
12
14
  loading.value = true;
13
15
  error.value = null;
@@ -62,16 +64,17 @@ function nixAsyncQuery(key, queryFn, options = {}) {
62
64
  if (active && id === callId)
63
65
  loading.value = false;
64
66
  }
65
- };
66
- const cancel = () => {
67
+ }, "run");
68
+ const cancel = /* @__PURE__ */ __name(() => {
67
69
  active = false;
68
70
  const cached = asyncCache.get(key);
69
71
  if (cached?.controller) {
70
72
  cached.controller.abort();
71
73
  }
72
- };
74
+ }, "cancel");
73
75
  return { data, error, loading, run, cancel };
74
76
  }
77
+ __name(nixAsyncQuery, "nixAsyncQuery");
75
78
  export {
76
79
  nixAsyncQuery
77
80
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../hooks/nixAsyncQuery.js"],
4
4
  "sourcesContent": ["import { nixState } from \"./nixState\";\r\n\r\n/**\r\n * Global async cache.\r\n * key -> {\r\n * data?: any,\r\n * error?: Error,\r\n * promise?: Promise<any>,\r\n * controller?: AbortController,\r\n * timestamp?: number\r\n * }\r\n */\r\nconst asyncCache = new Map();\r\n\r\n/**\r\n * Unified async query helper with:\r\n * - AbortController cancellation\r\n * - Request deduping\r\n * - Shared caching\r\n *\r\n * @template T\r\n * @param {string} key\r\n * Unique cache key representing the request\r\n *\r\n * @param {(signal: AbortSignal) => Promise<T>} queryFn\r\n * Function that performs the async operation\r\n *\r\n * @param {{\r\n * ttl?: number\r\n * }} [options]\r\n *\r\n * @returns {{\r\n * data: { value: T | null },\r\n * error: { value: Error | null },\r\n * loading: { value: boolean },\r\n * run: () => Promise<void>,\r\n * cancel: () => void\r\n * }}\r\n */\r\nexport function nixAsyncQuery(key, queryFn, options = {}) {\r\n const data = nixState(null);\r\n const error = nixState(null);\r\n const loading = nixState(false);\r\n\r\n const ttl = options.ttl ?? 0;\r\n let active = true;\r\n let callId = 0;\r\n\r\n const run = async () => {\r\n const id = ++callId;\r\n loading.value = true;\r\n error.value = null;\r\n\r\n const now = Date.now();\r\n const cached = asyncCache.get(key);\r\n\r\n // Serve fresh cached data\r\n if (\r\n cached?.data &&\r\n (!ttl || now - cached.timestamp < ttl)\r\n ) {\r\n data.value = cached.data;\r\n loading.value = false;\r\n return;\r\n }\r\n\r\n // Deduping: reuse in-flight request\r\n if (cached?.promise) {\r\n try {\r\n const result = await cached.promise;\r\n if (!active || id !== callId) return;\r\n data.value = result;\r\n } catch (e) {\r\n if (!active || id !== callId) return;\r\n error.value = e;\r\n } finally {\r\n if (active && id === callId) loading.value = false;\r\n }\r\n return;\r\n }\r\n\r\n // New request\r\n const controller = new AbortController();\r\n const promise = (async () => {\r\n try {\r\n const result = await queryFn(controller.signal);\r\n asyncCache.set(key, {\r\n data: result,\r\n timestamp: Date.now()\r\n });\r\n return result;\r\n } catch (e) {\r\n asyncCache.delete(key);\r\n throw e instanceof Error ? e : new Error(String(e));\r\n }\r\n })();\r\n\r\n asyncCache.set(key, { promise, controller });\r\n\r\n try {\r\n const result = await promise;\r\n if (!active || id !== callId) return;\r\n data.value = result;\r\n } catch (e) {\r\n if (!active || id !== callId) return;\r\n error.value = e;\r\n } finally {\r\n if (active && id === callId) loading.value = false;\r\n }\r\n };\r\n\r\n /**\r\n * Cancels in-flight request and prevents state updates.\r\n */\r\n const cancel = () => {\r\n active = false;\r\n const cached = asyncCache.get(key);\r\n if (cached?.controller) {\r\n cached.controller.abort();\r\n }\r\n };\r\n\r\n return { data, error, loading, run, cancel };\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AAYzB,MAAM,aAAa,oBAAI,IAAI;AA2BpB,SAAS,cAAc,KAAK,SAAS,UAAU,CAAC,GAAG;AACxD,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,QAAM,MAAM,QAAQ,OAAO;AAC3B,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,QAAM,MAAM,YAAY;AACtB,UAAM,KAAK,EAAE;AACb,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,WAAW,IAAI,GAAG;AAGjC,QACE,QAAQ,SACP,CAAC,OAAO,MAAM,OAAO,YAAY,MAClC;AACA,WAAK,QAAQ,OAAO;AACpB,cAAQ,QAAQ;AAChB;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS;AACnB,UAAI;AACF,cAAM,SAAS,MAAM,OAAO;AAC5B,YAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,aAAK,QAAQ;AAAA,MACf,SAAS,GAAG;AACV,YAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,cAAM,QAAQ;AAAA,MAChB,UAAE;AACA,YAAI,UAAU,OAAO;AAAQ,kBAAQ,QAAQ;AAAA,MAC/C;AACA;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,WAAW,MAAM;AAC9C,mBAAW,IAAI,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD,eAAO;AAAA,MACT,SAAS,GAAG;AACV,mBAAW,OAAO,GAAG;AACrB,cAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,MACpD;AAAA,IACF,GAAG;AAEH,eAAW,IAAI,KAAK,EAAE,SAAS,WAAW,CAAC;AAE3C,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,UAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,YAAM,QAAQ;AAAA,IAChB,UAAE;AACA,UAAI,UAAU,OAAO;AAAQ,gBAAQ,QAAQ;AAAA,IAC/C;AAAA,EACF;AAKA,QAAM,SAAS,MAAM;AACnB,aAAS;AACT,UAAM,SAAS,WAAW,IAAI,GAAG;AACjC,QAAI,QAAQ,YAAY;AACtB,aAAO,WAAW,MAAM;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;",
5
+ "mappings": ";;AAAA,SAAS,gBAAgB;AAYzB,MAAM,aAAa,oBAAI,IAAI;AA2BpB,SAAS,cAAc,KAAK,SAAS,UAAU,CAAC,GAAG;AACxD,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,QAAM,MAAM,QAAQ,OAAO;AAC3B,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,QAAM,MAAM,mCAAY;AACtB,UAAM,KAAK,EAAE;AACb,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAEd,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,WAAW,IAAI,GAAG;AAGjC,QACE,QAAQ,SACP,CAAC,OAAO,MAAM,OAAO,YAAY,MAClC;AACA,WAAK,QAAQ,OAAO;AACpB,cAAQ,QAAQ;AAChB;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS;AACnB,UAAI;AACF,cAAM,SAAS,MAAM,OAAO;AAC5B,YAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,aAAK,QAAQ;AAAA,MACf,SAAS,GAAG;AACV,YAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,cAAM,QAAQ;AAAA,MAChB,UAAE;AACA,YAAI,UAAU,OAAO;AAAQ,kBAAQ,QAAQ;AAAA,MAC/C;AACA;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,WAAW,MAAM;AAC9C,mBAAW,IAAI,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD,eAAO;AAAA,MACT,SAAS,GAAG;AACV,mBAAW,OAAO,GAAG;AACrB,cAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,MACpD;AAAA,IACF,GAAG;AAEH,eAAW,IAAI,KAAK,EAAE,SAAS,WAAW,CAAC;AAE3C,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,UAAI,CAAC,UAAU,OAAO;AAAQ;AAC9B,YAAM,QAAQ;AAAA,IAChB,UAAE;AACA,UAAI,UAAU,OAAO;AAAQ,gBAAQ,QAAQ;AAAA,IAC/C;AAAA,EACF,GA7DY;AAkEZ,QAAM,SAAS,6BAAM;AACnB,aAAS;AACT,UAAM,SAAS,WAAW,IAAI,GAAG;AACjC,QAAI,QAAQ,YAAY;AACtB,aAAO,WAAW,MAAM;AAAA,IAC1B;AAAA,EACF,GANe;AAQf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AApFgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Memoizes a callback function based on a dependency array.
3
+ * Similar to React's useCallback.
4
+ *
5
+ * @param {Function} fn
6
+ * Function to memoize. Should be pure and not mutate external state.
7
+ *
8
+ * @param {Array<any>} [deps=[]]
9
+ * Dependency array. Callback identity changes only when deps change.
10
+ *
11
+ * @returns {Function}
12
+ * Memoized callback function.
13
+ *
14
+ * @throws {Error}
15
+ * If called outside of a component context.
16
+ *
17
+ * @example
18
+ * const onClick = nixCallback(() => {
19
+ * console.log(count.value);
20
+ * }, [count.value]);
21
+ *
22
+ * @security
23
+ * - Avoids JSON.stringify to prevent crashes on circular references
24
+ * - Limits dependency array size to prevent performance abuse
25
+ *
26
+ * @memory
27
+ * - Does not allocate large temporary strings
28
+ * - Reuses function reference when deps are unchanged
29
+ */
30
+ export function nixCallback(fn: Function, deps?: Array<any>): Function;
@@ -1,3 +1,5 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
1
3
  import { activeContext } from "../context/context";
2
4
  function nixCallback(fn, deps = []) {
3
5
  const ctx = activeContext;
@@ -25,6 +27,7 @@ function nixCallback(fn, deps = []) {
25
27
  }
26
28
  return ctx.hooks[idx].value;
27
29
  }
30
+ __name(nixCallback, "nixCallback");
28
31
  function shallowArrayEqual(a, b) {
29
32
  if (a.length !== b.length)
30
33
  return false;
@@ -34,6 +37,7 @@ function shallowArrayEqual(a, b) {
34
37
  }
35
38
  return true;
36
39
  }
40
+ __name(shallowArrayEqual, "shallowArrayEqual");
37
41
  export {
38
42
  nixCallback
39
43
  };
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../hooks/nixCallback.js"],
4
4
  "sourcesContent": ["import { activeContext } from \"../context/context\";\r\n\r\n/**\r\n * Memoizes a callback function based on a dependency array.\r\n * Similar to React's useCallback.\r\n *\r\n * @param {Function} fn\r\n * Function to memoize. Should be pure and not mutate external state.\r\n *\r\n * @param {Array<any>} [deps=[]]\r\n * Dependency array. Callback identity changes only when deps change.\r\n *\r\n * @returns {Function}\r\n * Memoized callback function.\r\n *\r\n * @throws {Error}\r\n * If called outside of a component context.\r\n *\r\n * @example\r\n * const onClick = nixCallback(() => {\r\n * console.log(count.value);\r\n * }, [count.value]);\r\n *\r\n * @security\r\n * - Avoids JSON.stringify to prevent crashes on circular references\r\n * - Limits dependency array size to prevent performance abuse\r\n *\r\n * @memory\r\n * - Does not allocate large temporary strings\r\n * - Reuses function reference when deps are unchanged\r\n */\r\nexport function nixCallback(fn, deps = []) {\r\n const ctx = activeContext;\r\n if (!ctx) throw new Error(\"nixCallback() called outside component\");\r\n\r\n if (typeof fn !== \"function\") {\r\n console.error(\"[nixCallback] First argument must be a function\");\r\n return fn;\r\n }\r\n\r\n if (!Array.isArray(deps)) {\r\n console.error(\"[nixCallback] Second argument must be an array\");\r\n deps = [];\r\n }\r\n\r\n const MAX_DEPS = 100;\r\n if (deps.length > MAX_DEPS) {\r\n console.warn(\r\n `[nixCallback] Dependency array too large (${deps.length}). Limited to ${MAX_DEPS}.`\r\n );\r\n deps = deps.slice(0, MAX_DEPS);\r\n }\r\n\r\n const idx = ctx.hookIndex++;\r\n const prev = ctx.hooks[idx];\r\n\r\n if (!prev || !shallowArrayEqual(prev.deps, deps)) {\r\n ctx.hooks[idx] = { value: fn, deps };\r\n }\r\n\r\n return ctx.hooks[idx].value;\r\n}\r\n\r\n/**\r\n * Shallow comparison for dependency arrays.\r\n *\r\n * @param {Array<any>} a\r\n * @param {Array<any>} b\r\n * @returns {boolean}\r\n */\r\nfunction shallowArrayEqual(a, b) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!Object.is(a[i], b[i])) return false;\r\n }\r\n return true;\r\n}\r\n"],
5
- "mappings": "AAAA,SAAS,qBAAqB;AA+BvB,SAAS,YAAY,IAAI,OAAO,CAAC,GAAG;AACzC,QAAM,MAAM;AACZ,MAAI,CAAC;AAAK,UAAM,IAAI,MAAM,wCAAwC;AAElE,MAAI,OAAO,OAAO,YAAY;AAC5B,YAAQ,MAAM,iDAAiD;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAQ,MAAM,gDAAgD;AAC9D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW;AACjB,MAAI,KAAK,SAAS,UAAU;AAC1B,YAAQ;AAAA,MACN,6CAA6C,KAAK,MAAM,iBAAiB,QAAQ;AAAA,IACnF;AACA,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AAEA,QAAM,MAAM,IAAI;AAChB,QAAM,OAAO,IAAI,MAAM,GAAG;AAE1B,MAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,MAAM,IAAI,GAAG;AAChD,QAAI,MAAM,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK;AAAA,EACrC;AAEA,SAAO,IAAI,MAAM,GAAG,EAAE;AACxB;AASA,SAAS,kBAAkB,GAAG,GAAG;AAC/B,MAAI,EAAE,WAAW,EAAE;AAAQ,WAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAG,aAAO;AAAA,EACrC;AACA,SAAO;AACT;",
5
+ "mappings": ";;AAAA,SAAS,qBAAqB;AA+BvB,SAAS,YAAY,IAAI,OAAO,CAAC,GAAG;AACzC,QAAM,MAAM;AACZ,MAAI,CAAC;AAAK,UAAM,IAAI,MAAM,wCAAwC;AAElE,MAAI,OAAO,OAAO,YAAY;AAC5B,YAAQ,MAAM,iDAAiD;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAQ,MAAM,gDAAgD;AAC9D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW;AACjB,MAAI,KAAK,SAAS,UAAU;AAC1B,YAAQ;AAAA,MACN,6CAA6C,KAAK,MAAM,iBAAiB,QAAQ;AAAA,IACnF;AACA,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AAEA,QAAM,MAAM,IAAI;AAChB,QAAM,OAAO,IAAI,MAAM,GAAG;AAE1B,MAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,MAAM,IAAI,GAAG;AAChD,QAAI,MAAM,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK;AAAA,EACrC;AAEA,SAAO,IAAI,MAAM,GAAG,EAAE;AACxB;AA9BgB;AAuChB,SAAS,kBAAkB,GAAG,GAAG;AAC/B,MAAI,EAAE,WAAW,EAAE;AAAQ,WAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAG,aAAO;AAAA,EACrC;AACA,SAAO;AACT;AANS;",
6
6
  "names": []
7
7
  }