@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.
- package/dist/build.d.ts +1 -0
- package/dist/context/context.d.ts +2 -0
- package/dist/context/context.js +3 -0
- package/dist/context/context.js.map +1 -1
- package/dist/custom/button.d.ts +19 -0
- package/dist/custom/button.js +3 -0
- package/dist/custom/button.js.map +1 -1
- package/dist/custom/index.d.ts +2 -0
- package/dist/custom/path.d.ts +20 -0
- package/dist/custom/path.js +3 -0
- package/dist/custom/path.js.map +2 -2
- package/dist/error/errorOverlay.d.ts +2 -0
- package/dist/error/errorOverlay.js +4 -0
- package/dist/error/errorOverlay.js.map +1 -1
- package/dist/fynix/index.d.ts +4 -0
- package/dist/hooks/nixAsync.d.ts +13 -0
- package/dist/hooks/nixAsync.js +7 -4
- package/dist/hooks/nixAsync.js.map +1 -1
- package/dist/hooks/nixAsyncCache.d.ts +7 -0
- package/dist/hooks/nixAsyncCache.js +7 -4
- package/dist/hooks/nixAsyncCache.js.map +1 -1
- package/dist/hooks/nixAsyncDebounce.d.ts +28 -0
- package/dist/hooks/nixAsyncDebounce.js +9 -6
- package/dist/hooks/nixAsyncDebounce.js.map +1 -1
- package/dist/hooks/nixAsyncQuery.d.ts +40 -0
- package/dist/hooks/nixAsyncQuery.js +7 -4
- package/dist/hooks/nixAsyncQuery.js.map +1 -1
- package/dist/hooks/nixCallback.d.ts +30 -0
- package/dist/hooks/nixCallback.js +4 -0
- package/dist/hooks/nixCallback.js.map +1 -1
- package/dist/hooks/nixComputed.d.ts +94 -0
- package/dist/hooks/nixComputed.js +4 -0
- package/dist/hooks/nixComputed.js.map +1 -1
- package/dist/hooks/nixDebounce.d.ts +28 -0
- package/dist/hooks/nixDebounce.js +7 -4
- package/dist/hooks/nixDebounce.js.map +1 -1
- package/dist/hooks/nixEffect.d.ts +64 -0
- package/dist/hooks/nixEffect.js +6 -0
- package/dist/hooks/nixEffect.js.map +1 -1
- package/dist/hooks/nixForm.d.ts +15 -0
- package/dist/hooks/nixForm.js +11 -0
- package/dist/hooks/nixForm.js.map +1 -1
- package/dist/hooks/nixFormAsync.d.ts +20 -0
- package/dist/hooks/nixFormAsync.js +12 -0
- package/dist/hooks/nixFormAsync.js.map +1 -1
- package/dist/hooks/nixInterval.d.ts +19 -0
- package/dist/hooks/nixInterval.js +6 -3
- package/dist/hooks/nixInterval.js.map +1 -1
- package/dist/hooks/nixLazy.d.ts +19 -0
- package/dist/hooks/nixLazy.js +6 -2
- package/dist/hooks/nixLazy.js.map +1 -1
- package/dist/hooks/nixLazyAsync.d.ts +26 -0
- package/dist/hooks/nixLazyAsync.js +10 -6
- package/dist/hooks/nixLazyAsync.js.map +1 -1
- package/dist/hooks/nixLazyFormAsync.d.ts +29 -0
- package/dist/hooks/nixLazyFormAsync.js +18 -6
- package/dist/hooks/nixLazyFormAsync.js.map +1 -1
- package/dist/hooks/nixLocalStorage.d.ts +11 -0
- package/dist/hooks/nixLocalStorage.js +5 -2
- package/dist/hooks/nixLocalStorage.js.map +1 -1
- package/dist/hooks/nixMemo.d.ts +8 -0
- package/dist/hooks/nixMemo.js +3 -0
- package/dist/hooks/nixMemo.js.map +1 -1
- package/dist/hooks/nixPrevious.d.ts +7 -0
- package/dist/hooks/nixPrevious.js +3 -0
- package/dist/hooks/nixPrevious.js.map +1 -1
- package/dist/hooks/nixRef.d.ts +10 -0
- package/dist/hooks/nixRef.js +3 -0
- package/dist/hooks/nixRef.js.map +1 -1
- package/dist/hooks/nixState.d.ts +73 -0
- package/dist/hooks/nixState.js +3 -0
- package/dist/hooks/nixState.js.map +1 -1
- package/dist/hooks/nixStore.d.ts +9 -0
- package/dist/hooks/nixStore.js +3 -0
- package/dist/hooks/nixStore.js.map +1 -1
- package/dist/plugins/vite-plugin-res.d.ts +12 -0
- package/dist/plugins/vite-plugin-res.js +3 -0
- package/dist/plugins/vite-plugin-res.js.map +1 -1
- package/dist/router/router.d.ts +53 -0
- package/dist/router/router.js +25 -2
- package/dist/router/router.js.map +1 -1
- package/dist/runtime.d.ts +91 -0
- package/dist/runtime.js +18 -0
- package/dist/runtime.js.map +1 -1
- package/package.json +2 -1
- package/types/global.d.ts +29 -19
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/context/context.js
CHANGED
|
@@ -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
|
+
};
|
package/dist/custom/button.js
CHANGED
|
@@ -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,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
|
+
};
|
package/dist/custom/path.js
CHANGED
|
@@ -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
|
};
|
package/dist/custom/path.js.map
CHANGED
|
@@ -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 {
|
|
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
|
}
|
|
@@ -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;
|
|
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,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
|
+
};
|
package/dist/hooks/nixAsync.js
CHANGED
|
@@ -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,
|
|
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
|
}
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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;
|
|
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
|
}
|