@fynixorg/ui 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/dist/README.md +36 -0
  3. package/dist/context/context.d.ts +19 -0
  4. package/dist/context/context.d.ts.map +1 -0
  5. package/dist/context/context.js +3 -11
  6. package/dist/context/context.js.map +3 -3
  7. package/dist/custom/button.d.ts +2 -0
  8. package/dist/custom/button.d.ts.map +1 -0
  9. package/dist/custom/button.js +2 -9
  10. package/dist/custom/button.js.map +3 -3
  11. package/dist/custom/index.d.ts +3 -0
  12. package/dist/custom/index.d.ts.map +1 -0
  13. package/dist/custom/index.js +2 -7
  14. package/dist/custom/index.js.map +3 -3
  15. package/dist/custom/path.d.ts +14 -0
  16. package/dist/custom/path.d.ts.map +1 -0
  17. package/dist/custom/path.js +17 -34
  18. package/dist/custom/path.js.map +3 -3
  19. package/dist/error/errorOverlay.d.ts +3 -0
  20. package/dist/error/errorOverlay.d.ts.map +1 -0
  21. package/dist/error/errorOverlay.js +82 -91
  22. package/dist/error/errorOverlay.js.map +3 -3
  23. package/dist/fynix/index.d.ts +5 -0
  24. package/dist/fynix/index.d.ts.map +1 -0
  25. package/dist/fynix/index.js +2 -7
  26. package/dist/fynix/index.js.map +3 -3
  27. package/dist/hooks/nixAsync.d.ts +14 -0
  28. package/dist/hooks/nixAsync.d.ts.map +1 -0
  29. package/dist/hooks/nixAsync.js +38 -43
  30. package/dist/hooks/nixAsync.js.map +3 -3
  31. package/dist/hooks/nixAsyncCache.d.ts +14 -0
  32. package/dist/hooks/nixAsyncCache.d.ts.map +1 -0
  33. package/dist/hooks/nixAsyncCache.js +57 -59
  34. package/dist/hooks/nixAsyncCache.js.map +3 -3
  35. package/dist/hooks/nixAsyncDebounce.d.ts +22 -0
  36. package/dist/hooks/nixAsyncDebounce.d.ts.map +1 -0
  37. package/dist/hooks/nixAsyncDebounce.js +74 -85
  38. package/dist/hooks/nixAsyncDebounce.js.map +3 -3
  39. package/dist/hooks/nixAsyncQuery.d.ts +16 -0
  40. package/dist/hooks/nixAsyncQuery.d.ts.map +1 -0
  41. package/dist/hooks/nixAsyncQuery.js +85 -79
  42. package/dist/hooks/nixAsyncQuery.js.map +3 -3
  43. package/dist/hooks/nixCallback.d.ts +2 -0
  44. package/dist/hooks/nixCallback.d.ts.map +1 -0
  45. package/dist/hooks/nixCallback.js +30 -40
  46. package/dist/hooks/nixCallback.js.map +3 -3
  47. package/dist/hooks/nixComputed.d.ts +16 -0
  48. package/dist/hooks/nixComputed.d.ts.map +1 -0
  49. package/dist/hooks/nixComputed.js +166 -198
  50. package/dist/hooks/nixComputed.js.map +4 -4
  51. package/dist/hooks/nixDebounce.d.ts +11 -0
  52. package/dist/hooks/nixDebounce.d.ts.map +1 -0
  53. package/dist/hooks/nixDebounce.js +53 -58
  54. package/dist/hooks/nixDebounce.js.map +3 -3
  55. package/dist/hooks/nixEffect.d.ts +4 -0
  56. package/dist/hooks/nixEffect.d.ts.map +1 -0
  57. package/dist/hooks/nixEffect.js +65 -75
  58. package/dist/hooks/nixEffect.js.map +3 -3
  59. package/dist/hooks/nixForm.d.ts +33 -0
  60. package/dist/hooks/nixForm.d.ts.map +1 -0
  61. package/dist/hooks/nixForm.js +110 -120
  62. package/dist/hooks/nixForm.js.map +3 -3
  63. package/dist/hooks/nixFormAsync.d.ts +42 -0
  64. package/dist/hooks/nixFormAsync.d.ts.map +1 -0
  65. package/dist/hooks/nixFormAsync.js +158 -167
  66. package/dist/hooks/nixFormAsync.js.map +3 -3
  67. package/dist/hooks/nixInterval.d.ts +2 -0
  68. package/dist/hooks/nixInterval.d.ts.map +1 -0
  69. package/dist/hooks/nixInterval.js +21 -27
  70. package/dist/hooks/nixInterval.js.map +3 -3
  71. package/dist/hooks/nixLazy.d.ts +8 -0
  72. package/dist/hooks/nixLazy.d.ts.map +1 -0
  73. package/dist/hooks/nixLazy.js +53 -58
  74. package/dist/hooks/nixLazy.js.map +3 -3
  75. package/dist/hooks/nixLazyAsync.d.ts +10 -0
  76. package/dist/hooks/nixLazyAsync.d.ts.map +1 -0
  77. package/dist/hooks/nixLazyAsync.js +65 -71
  78. package/dist/hooks/nixLazyAsync.js.map +3 -3
  79. package/dist/hooks/nixLazyFormAsync.d.ts +50 -0
  80. package/dist/hooks/nixLazyFormAsync.d.ts.map +1 -0
  81. package/dist/hooks/nixLazyFormAsync.js +209 -213
  82. package/dist/hooks/nixLazyFormAsync.js.map +3 -3
  83. package/dist/hooks/nixLocalStorage.d.ts +5 -0
  84. package/dist/hooks/nixLocalStorage.d.ts.map +1 -0
  85. package/dist/hooks/nixLocalStorage.js +21 -25
  86. package/dist/hooks/nixLocalStorage.js.map +3 -3
  87. package/dist/hooks/nixMemo.d.ts +2 -0
  88. package/dist/hooks/nixMemo.d.ts.map +1 -0
  89. package/dist/hooks/nixMemo.js +27 -31
  90. package/dist/hooks/nixMemo.js.map +3 -3
  91. package/dist/hooks/nixPrevious.d.ts +2 -0
  92. package/dist/hooks/nixPrevious.d.ts.map +1 -0
  93. package/dist/hooks/nixPrevious.js +13 -19
  94. package/dist/hooks/nixPrevious.js.map +3 -3
  95. package/dist/hooks/nixRef.d.ts +4 -0
  96. package/dist/hooks/nixRef.d.ts.map +1 -0
  97. package/dist/hooks/nixRef.js +14 -20
  98. package/dist/hooks/nixRef.js.map +3 -3
  99. package/dist/hooks/nixState.d.ts +15 -0
  100. package/dist/hooks/nixState.d.ts.map +1 -0
  101. package/dist/hooks/nixState.js +120 -173
  102. package/dist/hooks/nixState.js.map +3 -3
  103. package/dist/hooks/nixStore.d.ts +7 -0
  104. package/dist/hooks/nixStore.d.ts.map +1 -0
  105. package/dist/hooks/nixStore.js +48 -54
  106. package/dist/hooks/nixStore.js.map +3 -3
  107. package/dist/package.json +213 -0
  108. package/dist/plugins/vite-plugin-res.d.ts +41 -0
  109. package/dist/plugins/vite-plugin-res.d.ts.map +1 -0
  110. package/dist/plugins/vite-plugin-res.js +620 -33
  111. package/dist/plugins/vite-plugin-res.js.map +4 -4
  112. package/dist/router/router.d.ts +35 -0
  113. package/dist/router/router.d.ts.map +1 -0
  114. package/dist/router/router.js +520 -486
  115. package/dist/router/router.js.map +3 -3
  116. package/dist/runtime.d.ts +62 -0
  117. package/dist/runtime.d.ts.map +1 -0
  118. package/dist/runtime.js +833 -820
  119. package/dist/runtime.js.map +4 -4
  120. package/package.json +226 -43
  121. package/types/fnx.d.ts +72 -0
  122. package/types/fynix-ui.d.ts +323 -0
  123. package/types/global.d.ts +46 -6
  124. package/types/index.d.ts +37 -0
  125. package/types/vite-env.d.ts +553 -0
  126. package/runtime.d.ts +0 -83
  127. package/types/jsx.d.ts +0 -692
@@ -1,45 +1,40 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
1
  import { nixState } from "./nixState";
4
- function nixAsync(promiseFactory) {
5
- const data = nixState(null);
6
- const error = nixState(null);
7
- const loading = nixState(false);
8
- let active = true;
9
- let controller = null;
10
- let callId = 0;
11
- const run = /* @__PURE__ */ __name(async () => {
12
- if (controller)
13
- controller.abort();
14
- controller = new AbortController();
15
- const signal = controller.signal;
16
- const id = ++callId;
17
- loading.value = true;
18
- error.value = null;
19
- try {
20
- const result = await promiseFactory(signal);
21
- if (!active || id !== callId || signal.aborted)
22
- return;
23
- data.value = result;
24
- } catch (e) {
25
- if (!active || id !== callId || signal.aborted)
26
- return;
27
- error.value = e instanceof Error ? e : new Error(String(e));
28
- } finally {
29
- if (active && id === callId && !signal.aborted) {
30
- loading.value = false;
31
- }
32
- }
33
- }, "run");
34
- const cancel = /* @__PURE__ */ __name(() => {
35
- active = false;
36
- if (controller)
37
- controller.abort();
38
- }, "cancel");
39
- return { data, error, loading, run, cancel };
2
+ export function nixAsync(promiseFactory) {
3
+ const data = nixState(null);
4
+ const error = nixState(null);
5
+ const loading = nixState(false);
6
+ let active = true;
7
+ let controller = null;
8
+ let callId = 0;
9
+ const run = async () => {
10
+ if (controller)
11
+ controller.abort();
12
+ controller = new AbortController();
13
+ const signal = controller.signal;
14
+ const id = ++callId;
15
+ loading.value = true;
16
+ error.value = null;
17
+ try {
18
+ const result = await promiseFactory(signal);
19
+ if (!active || id !== callId || signal.aborted)
20
+ return;
21
+ data.value = result;
22
+ }
23
+ catch (e) {
24
+ if (!active || id !== callId || signal.aborted)
25
+ return;
26
+ error.value = e instanceof Error ? e : new Error(String(e));
27
+ }
28
+ finally {
29
+ if (active && id === callId && !signal.aborted) {
30
+ loading.value = false;
31
+ }
32
+ }
33
+ };
34
+ const cancel = () => {
35
+ active = false;
36
+ if (controller)
37
+ controller.abort();
38
+ };
39
+ return { data, error, loading, run, cancel };
40
40
  }
41
- __name(nixAsync, "nixAsync");
42
- export {
43
- nixAsync
44
- };
45
- //# sourceMappingURL=nixAsync.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../hooks/nixAsync.js"],
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,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;",
3
+ "sources": ["../../hooks/nixAsync.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\nimport { 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<T>(\r\n promiseFactory: (signal: AbortSignal) => Promise<T>\r\n): {\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 const data = nixState(null) as { value: T | null };\r\n const error = nixState(null) as { value: Error | null };\r\n const loading = nixState(false) as { value: boolean };\r\n\r\n let active: boolean = true;\r\n let controller: AbortController | null = null;\r\n let callId: number = 0;\r\n\r\n const run = async (): Promise<void> => {\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: unknown) {\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 = (): void => {\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": ";;AAuBA,SAAS,gBAAgB;AAQlB,SAAS,SACd,gBAOA;AACA,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAkB;AACtB,MAAI,aAAqC;AACzC,MAAI,SAAiB;AAErB,QAAM,MAAM,mCAA2B;AAErC,QAAI,WAAY,YAAW,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,QAAS;AAChD,WAAK,QAAQ;AAAA,IACf,SAAS,GAAY;AACnB,UAAI,CAAC,UAAU,OAAO,UAAU,OAAO,QAAS;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,6BAAY;AACzB,aAAS;AACT,QAAI,WAAY,YAAW,MAAM;AAAA,EACnC,GAHe;AAKf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AAhDgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,14 @@
1
+ export declare function nixAsyncCached(key: any, promiseFactory: () => Promise<any>): {
2
+ data: {
3
+ value: any;
4
+ };
5
+ error: {
6
+ value: any;
7
+ };
8
+ loading: {
9
+ value: boolean;
10
+ };
11
+ run: () => Promise<void>;
12
+ cancel: () => void;
13
+ };
14
+ //# sourceMappingURL=nixAsyncCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nixAsyncCache.d.ts","sourceRoot":"","sources":["../../hooks/nixAsyncCache.ts"],"names":[],"mappings":"AA0BA,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GACjC;IACD,IAAI,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC;IACrB,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CA2DA"}
@@ -1,61 +1,59 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
1
  import { nixState } from "./nixState";
4
- const asyncCache = /* @__PURE__ */ new Map();
5
- function nixAsyncCached(key, promiseFactory) {
6
- const data = nixState(null);
7
- const error = nixState(null);
8
- const loading = nixState(false);
9
- let active = true;
10
- const run = /* @__PURE__ */ __name(async () => {
11
- loading.value = true;
12
- error.value = null;
13
- if (asyncCache.has(key)) {
14
- const cached = asyncCache.get(key);
15
- if (cached.data) {
16
- data.value = cached.data;
17
- loading.value = false;
18
- return;
19
- }
20
- try {
21
- const result = await cached.promise;
22
- if (!active)
23
- return;
24
- data.value = result;
25
- loading.value = false;
26
- } catch (e) {
27
- if (!active)
28
- return;
29
- error.value = e;
30
- loading.value = false;
31
- }
32
- return;
33
- }
34
- const promise = Promise.resolve().then(promiseFactory);
35
- asyncCache.set(key, { promise });
36
- try {
37
- const result = await promise;
38
- asyncCache.set(key, { data: result });
39
- if (!active)
40
- return;
41
- data.value = result;
42
- } catch (e) {
43
- asyncCache.delete(key);
44
- if (!active)
45
- return;
46
- error.value = e;
47
- } finally {
48
- if (active)
49
- loading.value = false;
50
- }
51
- }, "run");
52
- const cancel = /* @__PURE__ */ __name(() => {
53
- active = false;
54
- }, "cancel");
55
- return { data, error, loading, run, cancel };
2
+ const asyncCache = new Map();
3
+ export function nixAsyncCached(key, promiseFactory) {
4
+ const data = nixState(null);
5
+ const error = nixState(null);
6
+ const loading = nixState(false);
7
+ let active = true;
8
+ const run = async () => {
9
+ loading.value = true;
10
+ error.value = null;
11
+ if (asyncCache.has(key)) {
12
+ const cached = asyncCache.get(key);
13
+ if (cached) {
14
+ if (cached.data) {
15
+ data.value = cached.data;
16
+ loading.value = false;
17
+ return;
18
+ }
19
+ try {
20
+ const result = await cached.promise;
21
+ if (!active)
22
+ return;
23
+ data.value = result;
24
+ loading.value = false;
25
+ }
26
+ catch (e) {
27
+ if (!active)
28
+ return;
29
+ error.value = e;
30
+ loading.value = false;
31
+ }
32
+ return;
33
+ }
34
+ }
35
+ const promise = Promise.resolve().then(promiseFactory);
36
+ asyncCache.set(key, { promise });
37
+ try {
38
+ const result = await promise;
39
+ asyncCache.set(key, { data: result });
40
+ if (!active)
41
+ return;
42
+ data.value = result;
43
+ }
44
+ catch (e) {
45
+ asyncCache.delete(key);
46
+ if (!active)
47
+ return;
48
+ error.value = e;
49
+ }
50
+ finally {
51
+ if (active)
52
+ loading.value = false;
53
+ }
54
+ };
55
+ const cancel = () => {
56
+ active = false;
57
+ };
58
+ return { data, error, loading, run, cancel };
56
59
  }
57
- __name(nixAsyncCached, "nixAsyncCached");
58
- export {
59
- nixAsyncCached
60
- };
61
- //# sourceMappingURL=nixAsyncCache.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../hooks/nixAsyncCache.js"],
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,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;",
3
+ "sources": ["../../hooks/nixAsyncCache.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 { nixState } from \"./nixState\";\r\n\r\nconst asyncCache: Map<any, { data?: any; promise?: Promise<any> }> = new Map();\r\n\r\nexport function nixAsyncCached(\r\n key: any,\r\n promiseFactory: () => Promise<any>\r\n): {\r\n data: { value: any };\r\n error: { value: any };\r\n loading: { value: boolean };\r\n run: () => Promise<void>;\r\n cancel: () => void;\r\n} {\r\n const data = nixState(null) as { value: any };\r\n const error = nixState(null) as { value: any };\r\n const loading = nixState(false) as { value: boolean };\r\n\r\n let active: boolean = true;\r\n\r\n const run = async (): Promise<void> => {\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 if (cached) {\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\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": ";;AAsBA,SAAS,gBAAgB;AAEzB,MAAM,aAA+D,oBAAI,IAAI;AAEtE,SAAS,eACd,KACA,gBAOA;AACA,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,QAAQ,SAAS,IAAI;AAC3B,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,SAAkB;AAEtB,QAAM,MAAM,mCAA2B;AACrC,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAGd,QAAI,WAAW,IAAI,GAAG,GAAG;AACvB,YAAM,SAAS,WAAW,IAAI,GAAG;AACjC,UAAI,QAAQ;AACV,YAAI,OAAO,MAAM;AACf,eAAK,QAAQ,OAAO;AACpB,kBAAQ,QAAQ;AAChB;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO;AAC5B,cAAI,CAAC,OAAQ;AACb,eAAK,QAAQ;AACb,kBAAQ,QAAQ;AAAA,QAClB,SAAS,GAAG;AACV,cAAI,CAAC,OAAQ;AACb,gBAAM,QAAQ;AACd,kBAAQ,QAAQ;AAAA,QAClB;AACA;AAAA,MACF;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,OAAQ;AACb,WAAK,QAAQ;AAAA,IACf,SAAS,GAAG;AACV,iBAAW,OAAO,GAAG;AACrB,UAAI,CAAC,OAAQ;AACb,YAAM,QAAQ;AAAA,IAChB,UAAE;AACA,UAAI,OAAQ,SAAQ,QAAQ;AAAA,IAC9B;AAAA,EACF,GA7CY;AA+CZ,QAAM,SAAS,6BAAM;AACnB,aAAS;AAAA,EACX,GAFe;AAIf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AApEgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,22 @@
1
+ export interface NixAsyncDebounceOptions {
2
+ delay?: number;
3
+ leading?: boolean;
4
+ trailing?: boolean;
5
+ maxWait?: number;
6
+ cache?: boolean;
7
+ signal?: AbortSignal;
8
+ }
9
+ export declare function nixAsyncDebounce(promiseFactory: () => Promise<any>, options?: NixAsyncDebounceOptions): {
10
+ data: {
11
+ value: any;
12
+ };
13
+ error: {
14
+ value: any;
15
+ };
16
+ loading: {
17
+ value: boolean;
18
+ };
19
+ run: () => void | Promise<any>;
20
+ cancel: () => void;
21
+ };
22
+ //# sourceMappingURL=nixAsyncDebounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nixAsyncDebounce.d.ts","sourceRoot":"","sources":["../../hooks/nixAsyncDebounce.ts"],"names":[],"mappings":"AA4CA,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAClC,OAAO,GAAE,uBAA4B,GACpC;IACD,IAAI,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC;IACrB,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CA8FA"}
@@ -1,88 +1,77 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
1
  import { nixState } from "./nixState";
4
- function nixAsyncDebounce(promiseFactory, options = {}) {
5
- const data = nixState(null);
6
- const error = nixState(null);
7
- const loading = nixState(false);
8
- const {
9
- delay = 300,
10
- leading = false,
11
- trailing = true,
12
- maxWait,
13
- cache = true,
14
- signal
15
- } = options;
16
- let lastResult = null;
17
- let lastError = null;
18
- let timerId = null;
19
- let lastInvokeTime = 0;
20
- let pendingPromise = null;
21
- const invoke = /* @__PURE__ */ __name(async () => {
22
- if (cache && lastResult !== null) {
23
- data.value = lastResult;
24
- error.value = lastError;
25
- loading.value = false;
26
- return lastResult;
27
- }
28
- loading.value = true;
29
- error.value = null;
30
- const abortController = new AbortController();
31
- if (signal) {
32
- signal.addEventListener("abort", () => {
33
- abortController.abort();
34
- cancel();
35
- });
36
- }
37
- pendingPromise = promiseFactory();
38
- try {
39
- const result = await pendingPromise;
40
- lastResult = result;
41
- data.value = result;
42
- return result;
43
- } catch (e) {
44
- if (e.name !== "AbortError") {
45
- lastError = e;
46
- error.value = e;
47
- }
48
- throw e;
49
- } finally {
50
- loading.value = false;
51
- pendingPromise = null;
52
- lastInvokeTime = Date.now();
53
- }
54
- }, "invoke");
55
- const run = /* @__PURE__ */ __name(() => {
56
- const now = Date.now();
57
- const timeSinceLastInvoke = now - lastInvokeTime;
58
- const remainingTime = delay - timeSinceLastInvoke;
59
- const shouldInvokeLeading = leading && !timerId;
60
- if (maxWait !== void 0 && timeSinceLastInvoke >= maxWait) {
61
- if (timerId)
62
- clearTimeout(timerId);
63
- timerId = null;
64
- return invoke();
65
- }
66
- if (timerId)
67
- clearTimeout(timerId);
68
- if (shouldInvokeLeading)
69
- return invoke();
70
- if (trailing) {
71
- timerId = setTimeout(() => {
2
+ export function nixAsyncDebounce(promiseFactory, options = {}) {
3
+ const data = nixState(null);
4
+ const error = nixState(null);
5
+ const loading = nixState(false);
6
+ const { delay = 300, leading = false, trailing = true, maxWait, cache = true, signal, } = options;
7
+ let lastResult = null;
8
+ let lastError = null;
9
+ let timerId = null;
10
+ let lastInvokeTime = 0;
11
+ let pendingPromise = null;
12
+ const invoke = async () => {
13
+ if (cache && lastResult !== null) {
14
+ data.value = lastResult;
15
+ error.value = lastError;
16
+ loading.value = false;
17
+ return lastResult;
18
+ }
19
+ loading.value = true;
20
+ error.value = null;
21
+ const abortController = new AbortController();
22
+ if (signal) {
23
+ signal.addEventListener("abort", () => {
24
+ abortController.abort();
25
+ cancel();
26
+ });
27
+ }
28
+ pendingPromise = promiseFactory();
29
+ try {
30
+ const result = await pendingPromise;
31
+ lastResult = result;
32
+ data.value = result;
33
+ return result;
34
+ }
35
+ catch (e) {
36
+ if (e.name !== "AbortError") {
37
+ lastError = e;
38
+ error.value = e;
39
+ }
40
+ throw e;
41
+ }
42
+ finally {
43
+ loading.value = false;
44
+ pendingPromise = null;
45
+ lastInvokeTime = Date.now();
46
+ }
47
+ };
48
+ const run = () => {
49
+ const now = Date.now();
50
+ const timeSinceLastInvoke = now - lastInvokeTime;
51
+ const remainingTime = delay - timeSinceLastInvoke;
52
+ const shouldInvokeLeading = leading && !timerId;
53
+ if (maxWait !== undefined && timeSinceLastInvoke >= maxWait) {
54
+ if (timerId)
55
+ clearTimeout(timerId);
56
+ timerId = null;
57
+ return invoke();
58
+ }
59
+ if (timerId)
60
+ clearTimeout(timerId);
61
+ if (shouldInvokeLeading)
62
+ return invoke();
63
+ if (trailing) {
64
+ timerId = setTimeout(() => {
65
+ timerId = null;
66
+ invoke();
67
+ }, remainingTime > 0 ? remainingTime : delay);
68
+ }
69
+ };
70
+ const cancel = () => {
71
+ if (timerId)
72
+ clearTimeout(timerId);
72
73
  timerId = null;
73
- invoke();
74
- }, remainingTime > 0 ? remainingTime : delay);
75
- }
76
- }, "run");
77
- const cancel = /* @__PURE__ */ __name(() => {
78
- if (timerId)
79
- clearTimeout(timerId);
80
- timerId = pendingPromise = null;
81
- }, "cancel");
82
- return { data, error, loading, run, cancel };
74
+ pendingPromise = null;
75
+ };
76
+ return { data, error, loading, run, cancel };
83
77
  }
84
- __name(nixAsyncDebounce, "nixAsyncDebounce");
85
- export {
86
- nixAsyncDebounce
87
- };
88
- //# sourceMappingURL=nixAsyncDebounce.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../hooks/nixAsyncDebounce.js"],
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,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;",
3
+ "sources": ["../../hooks/nixAsyncDebounce.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 { 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 interface NixAsyncDebounceOptions {\r\n delay?: number;\r\n leading?: boolean;\r\n trailing?: boolean;\r\n maxWait?: number;\r\n cache?: boolean;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport function nixAsyncDebounce(\r\n promiseFactory: () => Promise<any>,\r\n options: NixAsyncDebounceOptions = {}\r\n): {\r\n data: { value: any };\r\n error: { value: any };\r\n loading: { value: boolean };\r\n run: () => void | Promise<any>;\r\n cancel: () => void;\r\n} {\r\n const data = nixState(null) as { value: any };\r\n const error = nixState(null) as { value: any };\r\n const loading = nixState(false) as { value: boolean };\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: any = null;\r\n let lastError: any = null;\r\n let timerId: ReturnType<typeof setTimeout> | null = null;\r\n let lastInvokeTime: number = 0;\r\n let pendingPromise: Promise<any> | null = null;\r\n\r\n const invoke = async (): Promise<any> => {\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: any) {\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 = (): void | Promise<any> => {\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 () => {\r\n timerId = null;\r\n invoke();\r\n },\r\n remainingTime > 0 ? remainingTime : delay\r\n );\r\n }\r\n };\r\n\r\n const cancel = (): void => {\r\n if (timerId) clearTimeout(timerId);\r\n timerId = null;\r\n pendingPromise = null;\r\n };\r\n\r\n return { data, error, loading, run, cancel };\r\n}\r\n"],
5
+ "mappings": ";;AAsBA,SAAS,gBAAgB;AA+BlB,SAAS,iBACd,gBACA,UAAmC,CAAC,GAOpC;AACA,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,aAAkB;AACtB,MAAI,YAAiB;AACrB,MAAI,UAAgD;AACpD,MAAI,iBAAyB;AAC7B,MAAI,iBAAsC;AAE1C,QAAM,SAAS,mCAA0B;AACvC,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,GAAQ;AACf,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,6BAA2B;AACrC,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,QAAS,cAAa,OAAO;AACjC,gBAAU;AACV,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI,QAAS,cAAa,OAAO;AAEjC,QAAI,oBAAqB,QAAO,OAAO;AAEvC,QAAI,UAAU;AACZ,gBAAU;AAAA,QACR,MAAM;AACJ,oBAAU;AACV,iBAAO;AAAA,QACT;AAAA,QACA,gBAAgB,IAAI,gBAAgB;AAAA,MACtC;AAAA,IACF;AAAA,EACF,GA1BY;AA4BZ,QAAM,SAAS,6BAAY;AACzB,QAAI,QAAS,cAAa,OAAO;AACjC,cAAU;AACV,qBAAiB;AAAA,EACnB,GAJe;AAMf,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK,OAAO;AAC7C;AAvGgB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,16 @@
1
+ export declare function nixAsyncQuery<T>(key: string, queryFn: (signal: AbortSignal) => Promise<T>, options?: {
2
+ ttl?: number;
3
+ }): {
4
+ data: {
5
+ value: T | null;
6
+ };
7
+ error: {
8
+ value: Error | null;
9
+ };
10
+ loading: {
11
+ value: boolean;
12
+ };
13
+ run: () => Promise<void>;
14
+ cancel: () => void;
15
+ };
16
+ //# sourceMappingURL=nixAsyncQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nixAsyncQuery.d.ts","sourceRoot":"","sources":["../../hooks/nixAsyncQuery.ts"],"names":[],"mappings":"AAsEA,wBAAgB,aAAa,CAAC,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5C,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B;IACD,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1B,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/B,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CA+FA"}