@ahoo-wang/fetcher-react 2.9.5 → 2.9.8

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/README.md CHANGED
@@ -284,33 +284,46 @@ const MyComponent = () => {
284
284
 
285
285
  ### useKeyStorage Hook
286
286
 
287
- The `useKeyStorage` hook provides state management for a KeyStorage instance. It subscribes to storage changes and
288
- returns the current value along with a setter function.
287
+ The `useKeyStorage` hook provides reactive state management for a KeyStorage instance. It subscribes to storage changes and returns the current value along with a setter function. Optionally accepts a default value to use when the storage is empty.
289
288
 
290
289
  ```typescript jsx
291
290
  import { KeyStorage } from '@ahoo-wang/fetcher-storage';
292
291
  import { useKeyStorage } from '@ahoo-wang/fetcher-react';
293
292
 
294
293
  const MyComponent = () => {
295
- const keyStorage = new KeyStorage<string>({
296
- key: 'my-key',
297
- });
294
+ const keyStorage = new KeyStorage<string>({ key: 'my-key' });
298
295
 
296
+ // Without default value - can be null
299
297
  const [value, setValue] = useKeyStorage(keyStorage);
300
298
 
301
299
  return (
302
300
  <div>
303
- <p>Current
304
- value: {value}
305
- </p>
306
- <button
307
- onClick={() => setValue('new value')}>
308
- Update
309
- Value
301
+ <p>Current value: {value || 'No value stored'}</p>
302
+ <button onClick={() => setValue('new value')}>
303
+ Update Value
304
+ </button>
305
+ </div>
306
+ );
307
+ };
308
+ ```
309
+
310
+ #### With Default Value
311
+
312
+ ```typescript jsx
313
+ const MyComponent = () => {
314
+ const keyStorage = new KeyStorage<string>({ key: 'theme' });
315
+
316
+ // With default value - guaranteed to be non-null
317
+ const [theme, setTheme] = useKeyStorage(keyStorage, 'light');
318
+
319
+ return (
320
+ <div className={theme}>
321
+ <p>Current theme: {theme}</p>
322
+ <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
323
+ Toggle Theme
310
324
  </button>
311
325
  </div>
312
- )
313
- ;
326
+ );
314
327
  };
315
328
  ```
316
329
 
@@ -319,7 +332,7 @@ const MyComponent = () => {
319
332
  ```typescript jsx
320
333
  // Working with different value types
321
334
  const numberStorage = new KeyStorage<number>({ key: 'counter' });
322
- const [count, setCount] = useKeyStorage(numberStorage);
335
+ const [count, setCount] = useKeyStorage(numberStorage, 0); // Default to 0
323
336
 
324
337
  // Working with objects
325
338
  interface User {
@@ -328,7 +341,21 @@ interface User {
328
341
  }
329
342
 
330
343
  const userStorage = new KeyStorage<User>({ key: 'current-user' });
331
- const [user, setUser] = useKeyStorage(userStorage);
344
+ const [user, setUser] = useKeyStorage(userStorage, { id: '', name: 'Guest' });
345
+
346
+ // Complex state management
347
+ const settingsStorage = new KeyStorage<{ volume: number; muted: boolean }>({
348
+ key: 'audio-settings',
349
+ });
350
+ const [settings, setSettings] = useKeyStorage(settingsStorage, {
351
+ volume: 50,
352
+ muted: false,
353
+ });
354
+
355
+ // Update specific properties
356
+ const updateVolume = (newVolume: number) => {
357
+ setSettings({ ...settings, volume: newVolume });
358
+ };
332
359
  ```
333
360
 
334
361
  ## Wow Query Hooks
@@ -1344,21 +1371,46 @@ A ref object with a `current` property containing the latest value
1344
1371
 
1345
1372
  ### useKeyStorage
1346
1373
 
1347
- ```typescript jsx
1374
+ ```typescript
1375
+ // Without default value - can return null
1348
1376
  function useKeyStorage<T>(
1349
1377
  keyStorage: KeyStorage<T>,
1350
1378
  ): [T | null, (value: T) => void];
1379
+
1380
+ // With default value - guaranteed non-null
1381
+ function useKeyStorage<T>(
1382
+ keyStorage: KeyStorage<T>,
1383
+ defaultValue: T,
1384
+ ): [T, (value: T) => void];
1351
1385
  ```
1352
1386
 
1353
- A React hook that provides state management for a KeyStorage instance.
1387
+ A React hook that provides reactive state management for a KeyStorage instance. Subscribes to storage changes and returns the current value along with a setter function. Optionally accepts a default value to use when the storage is empty.
1388
+
1389
+ **Type Parameters:**
1390
+
1391
+ - `T`: The type of value stored in the key storage
1354
1392
 
1355
1393
  **Parameters:**
1356
1394
 
1357
- - `keyStorage`: The KeyStorage instance to subscribe to and manage
1395
+ - `keyStorage`: The KeyStorage instance to subscribe to and manage. Should be a stable reference (useRef, memo, or module-level instance)
1396
+ - `defaultValue` _(optional)_: The default value to use when storage is empty. When provided, the hook guarantees the returned value will never be null
1358
1397
 
1359
1398
  **Returns:**
1360
1399
 
1361
- - A tuple containing the current stored value and a function to update it
1400
+ - **Without default value**: `[T | null, (value: T) => void]` - A tuple where the first element can be null if storage is empty
1401
+ - **With default value**: `[T, (value: T) => void]` - A tuple where the first element is guaranteed to be non-null (either the stored value or the default value)
1402
+
1403
+ **Examples:**
1404
+
1405
+ ```typescript
1406
+ // Without default value
1407
+ const [value, setValue] = useKeyStorage(keyStorage);
1408
+ // value: string | null
1409
+
1410
+ // With default value
1411
+ const [theme, setTheme] = useKeyStorage(themeStorage, 'light');
1412
+ // theme: string (never null)
1413
+ ```
1362
1414
 
1363
1415
  ### useListQuery
1364
1416
 
package/README.zh-CN.md CHANGED
@@ -279,34 +279,82 @@ const MyComponent = () => {
279
279
 
280
280
  ### useKeyStorage Hook
281
281
 
282
- `useKeyStorage` hook 为 KeyStorage 实例提供状态管理。它订阅存储变化并返回当前值以及设置值的函数。
282
+ `useKeyStorage` hook 为 KeyStorage 实例提供反应式状态管理。它订阅存储变化并返回当前值以及设置函数。可选接受默认值以在存储为空时使用。
283
283
 
284
284
  ```typescript jsx
285
285
  import { KeyStorage } from '@ahoo-wang/fetcher-storage';
286
286
  import { useKeyStorage } from '@ahoo-wang/fetcher-react';
287
287
 
288
288
  const MyComponent = () => {
289
- const keyStorage = new KeyStorage<string>({
290
- key: 'my-key',
291
- });
289
+ const keyStorage = new KeyStorage<string>({ key: 'my-key' });
292
290
 
291
+ // 不使用默认值 - 可能为 null
293
292
  const [value, setValue] = useKeyStorage(keyStorage);
294
293
 
295
294
  return (
296
295
  <div>
297
- <p>当前值 :{value}
298
- </p>
299
- < button
300
- onClick={() => setValue('new value')}>
296
+ <p>当前值: {value || '未存储值'}</p>
297
+ <button onClick={() => setValue('新值')}>
301
298
  更新值
302
- < /button>
303
- < /div>
299
+ </button>
300
+ </div>
301
+ );
302
+ };
303
+ ```
304
+
305
+ #### 使用默认值
306
+
307
+ ```typescript jsx
308
+ const MyComponent = () => {
309
+ const keyStorage = new KeyStorage<string>({ key: 'theme' });
310
+
311
+ // 使用默认值 - 保证不为 null
312
+ const [theme, setTheme] = useKeyStorage(keyStorage, 'light');
313
+
314
+ return (
315
+ <div className={theme}>
316
+ <p>当前主题: {theme}</p>
317
+ <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
318
+ 切换主题
319
+ </button>
320
+ </div>
304
321
  );
305
322
  };
306
323
  ```
307
324
 
308
325
  ### 更多示例
309
326
 
327
+ ```typescript jsx
328
+ // 处理不同类型的值
329
+ const numberStorage = new KeyStorage<number>({ key: 'counter' });
330
+ const [count, setCount] = useKeyStorage(numberStorage, 0); // 默认为 0
331
+
332
+ // 处理对象
333
+ interface User {
334
+ id: string;
335
+ name: string;
336
+ }
337
+
338
+ const userStorage = new KeyStorage<User>({ key: 'current-user' });
339
+ const [user, setUser] = useKeyStorage(userStorage, { id: '', name: '访客' });
340
+
341
+ // 复杂状态管理
342
+ const settingsStorage = new KeyStorage<{ volume: number; muted: boolean }>({
343
+ key: 'audio-settings',
344
+ });
345
+ const [settings, setSettings] = useKeyStorage(settingsStorage, {
346
+ volume: 50,
347
+ muted: false,
348
+ });
349
+
350
+ // 更新特定属性
351
+ const updateVolume = (newVolume: number) => {
352
+ setSettings({ ...settings, volume: newVolume });
353
+ };
354
+ ```
355
+
356
+ ### 更多示例
357
+
310
358
  ```typescript jsx
311
359
  // 处理不同类型的值
312
360
  const numberStorage = new KeyStorage<number>({ key: 'counter' });
package/dist/index.es.js CHANGED
@@ -1,37 +1,37 @@
1
1
  var F = Object.defineProperty;
2
- var f = (t, e) => F(t, "name", { value: e, configurable: !0 });
3
- import { useRef as h, useCallback as u, useEffect as w, useState as S, useMemo as x, useSyncExternalStore as M } from "react";
2
+ var f = (t, r) => F(t, "name", { value: r, configurable: !0 });
3
+ import { useRef as h, useCallback as o, useEffect as w, useState as S, useMemo as x, useSyncExternalStore as M } from "react";
4
4
  import { nameGenerator as q } from "@ahoo-wang/fetcher-eventbus";
5
5
  import { fetcherRegistrar as O, getFetcher as A } from "@ahoo-wang/fetcher";
6
6
  function R() {
7
- const t = h(!1), e = u(() => t.current, []);
7
+ const t = h(!1), r = o(() => t.current, []);
8
8
  return w(() => (t.current = !0, () => {
9
9
  t.current = !1;
10
- }), []), e;
10
+ }), []), r;
11
11
  }
12
12
  f(R, "useMounted");
13
13
  function v(t) {
14
- const e = h(t);
15
- return e.current = t, e;
14
+ const r = h(t);
15
+ return r.current = t, r;
16
16
  }
17
17
  f(v, "useLatest");
18
18
  var D = /* @__PURE__ */ ((t) => (t.IDLE = "idle", t.LOADING = "loading", t.SUCCESS = "success", t.ERROR = "error", t))(D || {});
19
19
  function C(t) {
20
- const [e, r] = S(
20
+ const [r, n] = S(
21
21
  t?.initialStatus ?? "idle"
22
22
  /* IDLE */
23
- ), [c, a] = S(void 0), [s, n] = S(void 0), o = R(), d = v(t), l = u(() => {
24
- o() && (r(
23
+ ), [s, a] = S(void 0), [u, e] = S(void 0), c = R(), d = v(t), l = o(() => {
24
+ c() && (n(
25
25
  "loading"
26
26
  /* LOADING */
27
- ), n(void 0));
28
- }, [o]), E = u(
27
+ ), e(void 0));
28
+ }, [c]), E = o(
29
29
  async (i) => {
30
- if (o()) {
31
- a(i), r(
30
+ if (c()) {
31
+ a(i), n(
32
32
  "success"
33
33
  /* SUCCESS */
34
- ), n(void 0);
34
+ ), e(void 0);
35
35
  try {
36
36
  await d.current?.onSuccess?.(i);
37
37
  } catch (m) {
@@ -39,11 +39,11 @@ function C(t) {
39
39
  }
40
40
  }
41
41
  },
42
- [o, d]
43
- ), g = u(
42
+ [c, d]
43
+ ), g = o(
44
44
  async (i) => {
45
- if (o()) {
46
- n(i), r(
45
+ if (c()) {
46
+ e(i), n(
47
47
  "error"
48
48
  /* ERROR */
49
49
  ), a(void 0);
@@ -54,150 +54,157 @@ function C(t) {
54
54
  }
55
55
  }
56
56
  },
57
- [o, d]
58
- ), y = u(() => {
59
- o() && (r(
57
+ [c, d]
58
+ ), y = o(() => {
59
+ c() && (n(
60
60
  "idle"
61
61
  /* IDLE */
62
- ), n(void 0), a(void 0));
63
- }, [o]);
62
+ ), e(void 0), a(void 0));
63
+ }, [c]);
64
64
  return x(
65
65
  () => ({
66
- status: e,
67
- loading: e === "loading",
68
- result: c,
69
- error: s,
66
+ status: r,
67
+ loading: r === "loading",
68
+ result: s,
69
+ error: u,
70
70
  setLoading: l,
71
71
  setSuccess: E,
72
72
  setError: g,
73
73
  setIdle: y
74
74
  }),
75
- [e, c, s, l, E, g, y]
75
+ [r, s, u, l, E, g, y]
76
76
  );
77
77
  }
78
78
  f(C, "usePromiseState");
79
79
  function Q() {
80
- const t = h(0), e = u(() => ++t.current, []), r = u(() => t.current, []), c = u((n) => n === t.current, []), a = u(() => {
80
+ const t = h(0), r = o(() => ++t.current, []), n = o(() => t.current, []), s = o((e) => e === t.current, []), a = o(() => {
81
81
  t.current++;
82
- }, []), s = u(() => {
82
+ }, []), u = o(() => {
83
83
  t.current = 0;
84
84
  }, []);
85
85
  return x(() => ({
86
- generate: e,
87
- current: r,
88
- isLatest: c,
86
+ generate: r,
87
+ current: n,
88
+ isLatest: s,
89
89
  invalidate: a,
90
- reset: s
91
- }), [e, r, c, a, s]);
90
+ reset: u
91
+ }), [r, n, s, a, u]);
92
92
  }
93
93
  f(Q, "useRequestId");
94
94
  function G(t) {
95
- const { loading: e, result: r, error: c, status: a, setLoading: s, setSuccess: n, setError: o, setIdle: d } = C(t), l = R(), E = Q(), g = t?.propagateError, y = u(
95
+ const { loading: r, result: n, error: s, status: a, setLoading: u, setSuccess: e, setError: c, setIdle: d } = C(t), l = R(), E = Q(), g = t?.propagateError, y = o(
96
96
  async (m) => {
97
97
  if (!l())
98
98
  throw new Error("Component is unmounted");
99
99
  const I = E.generate();
100
- s();
100
+ u();
101
101
  try {
102
102
  const p = await (typeof m == "function" ? m() : m);
103
- return l() && E.isLatest(I) && await n(p), p;
103
+ return l() && E.isLatest(I) && await e(p), p;
104
104
  } catch (L) {
105
- if (l() && E.isLatest(I) && await o(L), g)
105
+ if (l() && E.isLatest(I) && await c(L), g)
106
106
  throw L;
107
107
  return L;
108
108
  }
109
109
  },
110
- [s, n, o, l, E, g]
111
- ), i = u(() => {
110
+ [u, e, c, l, E, g]
111
+ ), i = o(() => {
112
112
  l() && d();
113
113
  }, [d, l]);
114
114
  return x(
115
115
  () => ({
116
- loading: e,
117
- result: r,
118
- error: c,
116
+ loading: r,
117
+ result: n,
118
+ error: s,
119
119
  execute: y,
120
120
  reset: i,
121
121
  status: a
122
122
  }),
123
- [e, r, c, y, i, a]
123
+ [r, n, s, y, i, a]
124
124
  );
125
125
  }
126
126
  f(G, "useExecutePromise");
127
- function V(t) {
128
- const e = u(
129
- (s) => t.addListener({
127
+ function V(t, r) {
128
+ const n = o(
129
+ (e) => t.addListener({
130
130
  name: q.generate("useKeyStorage"),
131
- handle: s
131
+ // Generate unique listener name
132
+ handle: e
133
+ // Callback to trigger React re-render on storage changes
132
134
  }),
133
135
  [t]
134
- ), r = u(() => t.get(), [t]), c = M(e, r, r), a = u(
135
- (s) => t.set(s),
136
+ // Recreate subscription only if keyStorage changes
137
+ ), s = o(() => {
138
+ const e = t.get();
139
+ return e !== null ? e : r ?? null;
140
+ }, [t, r]), a = M(n, s, s), u = o(
141
+ (e) => t.set(e),
136
142
  [t]
143
+ // Recreate setter only if keyStorage changes
137
144
  );
138
- return [c, a];
145
+ return [a, u];
139
146
  }
140
147
  f(V, "useKeyStorage");
141
148
  function j(t) {
142
- const { fetcher: e = O.default } = t || {}, r = C(t), [c, a] = S(
149
+ const { fetcher: r = O.default } = t || {}, n = C(t), [s, a] = S(
143
150
  void 0
144
- ), s = R(), n = h(), o = Q(), d = v(t), l = A(e), E = u(
151
+ ), u = R(), e = h(), c = Q(), d = v(t), l = A(r), E = o(
145
152
  async (g) => {
146
- n.current && n.current.abort(), n.current = g.abortController ?? new AbortController(), g.abortController = n.current;
147
- const y = o.generate();
148
- r.setLoading();
153
+ e.current && e.current.abort(), e.current = g.abortController ?? new AbortController(), g.abortController = e.current;
154
+ const y = c.generate();
155
+ n.setLoading();
149
156
  try {
150
157
  const i = await l.exchange(
151
158
  g,
152
159
  d.current
153
160
  );
154
- s() && o.isLatest(y) && a(i);
161
+ u() && c.isLatest(y) && a(i);
155
162
  const m = await i.extractResult();
156
- s() && o.isLatest(y) && await r.setSuccess(m);
163
+ u() && c.isLatest(y) && await n.setSuccess(m);
157
164
  } catch (i) {
158
165
  if (i instanceof Error && i.name === "AbortError") {
159
- s() && r.setIdle();
166
+ u() && n.setIdle();
160
167
  return;
161
168
  }
162
- s() && o.isLatest(y) && await r.setError(i);
169
+ u() && c.isLatest(y) && await n.setError(i);
163
170
  } finally {
164
- n.current === g.abortController && (n.current = void 0);
171
+ e.current === g.abortController && (e.current = void 0);
165
172
  }
166
173
  },
167
- [l, s, d, r, o]
174
+ [l, u, d, n, c]
168
175
  );
169
176
  return w(() => () => {
170
- n.current?.abort(), n.current = void 0;
177
+ e.current?.abort(), e.current = void 0;
171
178
  }, []), x(
172
179
  () => ({
173
- ...r,
174
- exchange: c,
180
+ ...n,
181
+ exchange: s,
175
182
  execute: E
176
183
  }),
177
- [r, c, E]
184
+ [n, s, E]
178
185
  );
179
186
  }
180
187
  f(j, "useFetcher");
181
188
  function b(t) {
182
- const e = v(t), r = G(e.current), c = h(t.initialQuery), a = u(async () => e.current.execute(
183
- c.current,
184
- e.current.attributes
185
- ), [c, e]), { execute: s } = r, n = u(() => s(a), [s, a]), o = u(() => c.current, [c]), d = u(
189
+ const r = v(t), n = G(r.current), s = h(t.initialQuery), a = o(async () => r.current.execute(
190
+ s.current,
191
+ r.current.attributes
192
+ ), [s, r]), { execute: u } = n, e = o(() => u(a), [u, a]), c = o(() => s.current, [s]), d = o(
186
193
  (l) => {
187
- c.current = l, e.current.autoExecute && n();
194
+ s.current = l, r.current.autoExecute && e();
188
195
  },
189
- [c, e, n]
196
+ [s, r, e]
190
197
  );
191
198
  return w(() => {
192
- e.current.autoExecute && n();
193
- }, [e, n]), x(
199
+ r.current.autoExecute && e();
200
+ }, [r, e]), x(
194
201
  () => ({
195
- ...r,
196
- execute: n,
197
- getQuery: o,
202
+ ...n,
203
+ execute: e,
204
+ getQuery: c,
198
205
  setQuery: d
199
206
  }),
200
- [r, n, o, d]
207
+ [n, e, c, d]
201
208
  );
202
209
  }
203
210
  f(b, "useQuery");
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/core/useMounted.ts","../src/core/useLatest.ts","../src/core/usePromiseState.ts","../src/core/useRequestId.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts","../src/wow/useQuery.ts","../src/wow/usePagedQuery.ts","../src/wow/useSingleQuery.ts","../src/wow/useCountQuery.ts","../src/wow/useListQuery.ts","../src/wow/useListStreamQuery.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useEffect, useCallback } from 'react';\n\n/**\n * A React hook that returns a function to check if the component is mounted.\n *\n * @returns A function that returns true if the component is mounted, false otherwise\n *\n * @example\n * ```typescript\n * import { useMounted } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const isMounted = useMounted();\n *\n * useEffect(() => {\n * someAsyncOperation().then(() => {\n * if (isMounted()) {\n * setState(result);\n * }\n * });\n * }, []);\n *\n * return <div>My Component</div>;\n * };\n * ```\n */\nexport function useMounted() {\n const isMountedRef = useRef(false);\n const isMountedFn = useCallback(() => isMountedRef.current, []);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return isMountedFn;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MutableRefObject, useRef } from 'react';\n\n/**\n * A React hook that returns a ref containing the latest value, useful for accessing the current value in async callbacks.\n *\n * @template T - The type of the value\n * @param value - The value to track\n * @returns A ref object containing the latest value\n *\n * @example\n * ```typescript\n * import { useLatest } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const [count, setCount] = useState(0);\n * const latestCount = useLatest(count);\n *\n * const handleAsync = async () => {\n * await someAsyncOperation();\n * console.log('Latest count:', latestCount.current); // Always the latest\n * };\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setCount(c => c + 1)}>Increment</button>\n * <button onClick={handleAsync}>Async Log</button>\n * </div>\n * );\n * };\n * ```\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useMounted } from './useMounted';\nimport { useLatest } from './useLatest';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R, E = unknown> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: E | undefined;\n}\n\nexport interface PromiseStateCallbacks<R, E = unknown> {\n /** Callback invoked on success (can be async) */\n onSuccess?: (result: R) => void | Promise<void>;\n /** Callback invoked on error (can be async) */\n onError?: (error: E) => void | Promise<void>;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: async (error) => {\n * await logErrorToServer(error);\n * console.error('Error:', error);\n * },\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R, E = FetcherError>\n extends PromiseStateCallbacks<R, E> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => Promise<void>;\n /** Set status to ERROR with error */\n setError: (error: E) => Promise<void>;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown, E = FetcherError>(\n options?: UsePromiseStateOptions<R, E>,\n): UsePromiseStateReturn<R, E> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<E | undefined>(undefined);\n const isMounted = useMounted();\n const latestOptions = useLatest(options);\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n async (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n try {\n await latestOptions.current?.onSuccess?.(result);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onSuccess callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setErrorFn = useCallback(\n async (error: E) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n try {\n await latestOptions.current?.onError?.(error);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onError callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n return useMemo(\n () => ({\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n }),\n [status, result, error, setLoadingFn, setSuccessFn, setErrorFn, setIdleFn],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useCallback, useMemo } from 'react';\n\n/**\n * Return type for useRequestId hook\n */\nexport interface UseRequestIdReturn {\n /** Generate a new request ID and get the current one */\n generate: () => number;\n /** Get the current request ID without generating a new one */\n current: () => number;\n /** Check if a given request ID is the latest */\n isLatest: (requestId: number) => boolean;\n /** Invalidate current request ID (mark as stale) */\n invalidate: () => void;\n /** Reset request ID counter */\n reset: () => void;\n}\n\n/**\n * A React hook for managing request IDs and race condition protection\n *\n * @example\n * ```typescript\n * // Basic usage\n * const requestId = useRequestId();\n *\n * const execute = async () => {\n * const id = requestId.generate();\n *\n * try {\n * const result = await someAsyncOperation();\n *\n * // Check if this is still the latest request\n * if (requestId.isLatest(id)) {\n * setState(result);\n * }\n * } catch (error) {\n * if (requestId.isLatest(id)) {\n * setError(error);\n * }\n * }\n * };\n *\n * // Manual cancellation\n * const handleCancel = () => {\n * requestId.invalidate(); // All ongoing requests will be ignored\n * };\n * ```\n *\n * @example\n * ```typescript\n * // With async operation wrapper\n * const { execute, cancel } = useAsyncOperation(async (data) => {\n * return await apiCall(data);\n * }, [requestId]);\n * ```\n */\nexport function useRequestId(): UseRequestIdReturn {\n const requestIdRef = useRef<number>(0);\n\n const generate = useCallback((): number => {\n return ++requestIdRef.current;\n }, []);\n\n const current = useCallback((): number => {\n return requestIdRef.current;\n }, []);\n\n const isLatest = useCallback((requestId: number): boolean => {\n return requestId === requestIdRef.current;\n }, []);\n\n const invalidate = useCallback((): void => {\n requestIdRef.current++;\n }, []);\n\n const reset = useCallback((): void => {\n requestIdRef.current = 0;\n }, []);\n return useMemo(() => {\n return {\n generate,\n current,\n isLatest,\n invalidate,\n reset,\n };\n }, [generate, current, isLatest, invalidate, reset]);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useMounted } from './useMounted';\nimport {\n usePromiseState,\n PromiseState,\n UsePromiseStateOptions,\n} from './usePromiseState';\nimport { useRequestId } from './useRequestId';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\nexport interface UseExecutePromiseOptions<R, E = unknown>\n extends UsePromiseStateOptions<R, E> {\n /**\n * Whether to propagate errors thrown by the promise.\n * If true, the execute function will throw errors.\n * If false (default), the execute function will return the error as the result instead of throwing.\n */\n propagateError?: boolean;\n}\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n */\nexport interface UseExecutePromiseReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /**\n * Function to execute a promise supplier or promise.\n * Returns a promise that resolves to the result on success, or the error if propagateError is false.\n */\n execute: (input: PromiseSupplier<R> | Promise<R>) => Promise<R | E>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the hook\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n *\n * // Example with propagateError set to true\n * const { execute } = useExecutePromise<string>({ propagateError: true });\n * try {\n * await execute(fetchData);\n * } catch (err) {\n * console.error('Error occurred:', err);\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown, E = FetcherError>(\n options?: UseExecutePromiseOptions<R, E>,\n): UseExecutePromiseReturn<R, E> {\n const { loading, result, error, status, setLoading, setSuccess, setError, setIdle } = usePromiseState<R, E>(options);\n const isMounted = useMounted();\n const requestId = useRequestId();\n const propagateError = options?.propagateError;\n /**\n * Execute a promise supplier or promise and manage its state\n * @param input - A function that returns a Promise or a Promise to be executed\n * @returns A Promise that resolves with the result on success, or the error if propagateError is false\n */\n const execute = useCallback(\n async (input: PromiseSupplier<R> | Promise<R>): Promise<R | E> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n const currentRequestId = requestId.generate();\n setLoading();\n try {\n const promise = typeof input === 'function' ? input() : input;\n const data = await promise;\n\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setError(err as E);\n }\n if (propagateError) {\n throw err;\n }\n return err as E;\n }\n },\n [setLoading, setSuccess, setError, isMounted, requestId, propagateError],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n setIdle();\n }\n }, [setIdle, isMounted]);\n\n return useMemo(\n () => ({\n loading: loading,\n result: result,\n error: error,\n execute,\n reset,\n status: status,\n }),\n [loading, result, error, execute, reset, status],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\nimport { nameGenerator } from '@ahoo-wang/fetcher-eventbus';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => {\n return keyStorage.addListener({\n name: nameGenerator.generate('useKeyStorage'),\n handle: callback,\n });\n },\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcherRegistrar,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions, FetcherError,\n} from '@ahoo-wang/fetcher';\nimport { useMounted } from '../core';\nimport { useRef, useCallback, useEffect, useState, useMemo } from 'react';\nimport {\n PromiseState,\n useLatest,\n usePromiseState,\n UsePromiseStateOptions,\n useRequestId,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions<R, E = FetcherError>\n extends RequestOptions,\n FetcherCapable,\n UsePromiseStateOptions<R, E> {\n}\n\nexport interface UseFetcherReturn<R, E = FetcherError> extends PromiseState<R, E> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R, E = FetcherError>(\n options?: UseFetcherOptions<R, E>,\n): UseFetcherReturn<R, E> {\n const { fetcher = fetcherRegistrar.default } = options || {};\n const state = usePromiseState<R, E>(options);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMounted();\n const abortControllerRef = useRef<AbortController | undefined>();\n const requestId = useRequestId();\n const latestOptions = useLatest(options);\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n const currentRequestId = requestId.generate();\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(\n request,\n latestOptions.current,\n );\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setError(error as E);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, latestOptions, state, requestId],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return useMemo(\n () => ({\n ...state,\n exchange,\n execute,\n }),\n [state, exchange, execute],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n useExecutePromise,\n useLatest,\n UseExecutePromiseReturn,\n UseExecutePromiseOptions,\n} from '../core';\nimport { useCallback, useMemo, useEffect, useRef } from 'react';\nimport { AttributesCapable, FetcherError } from '@ahoo-wang/fetcher';\nimport { AutoExecuteCapable } from './types';\n\n/**\n * Configuration options for the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryOptions<Q, R, E = FetcherError>\n extends UseExecutePromiseOptions<R, E>,\n AttributesCapable,\n AutoExecuteCapable {\n /** The initial query parameters */\n initialQuery: Q;\n\n /** Function to execute the query with given parameters and optional attributes */\n execute: (query: Q, attributes?: Record<string, any>) => Promise<R>;\n}\n\n/**\n * Return type of the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryReturn<Q, R, E = FetcherError>\n extends UseExecutePromiseReturn<R, E> {\n /**\n * Get the current query parameters\n */\n getQuery: () => Q;\n /** Function to update the query parameters */\n setQuery: (query: Q) => void;\n /** Function to execute the query with current parameters */\n execute: () => Promise<R | E>;\n}\n\n/**\n * A React hook for managing query-based asynchronous operations\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the query\n * @returns An object containing the query state and control functions\n *\n * @example\n * ```typescript\n * import { useQuery } from '@ahoo-wang/fetcher-react';\n *\n * interface UserQuery {\n * id: string;\n * }\n *\n * interface User {\n * id: string;\n * name: string;\n * }\n *\n * function UserComponent() {\n * const { loading, result, error, execute, setQuery } = useQuery<UserQuery, User>({\n * initialQuery: { id: '1' },\n * execute: async (query) => {\n * const response = await fetch(`/api/users/${query.id}`);\n * return response.json();\n * },\n * autoExecute: true,\n * });\n *\n * const handleUserChange = (userId: string) => {\n * setQuery({ id: userId }); // Automatically executes if autoExecute is true\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={() => handleUserChange('2')}>Load User 2</button>\n * {result && <p>User: {result.name}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuery<Q, R, E = FetcherError>(\n options: UseQueryOptions<Q, R, E>,\n): UseQueryReturn<Q, R, E> {\n const latestOptions = useLatest(options);\n const promiseState = useExecutePromise<R, E>(latestOptions.current);\n const queryRef = useRef(options.initialQuery);\n\n const queryExecutor = useCallback(async (): Promise<R> => {\n return latestOptions.current.execute(\n queryRef.current,\n latestOptions.current.attributes,\n );\n }, [queryRef, latestOptions]);\n const { execute: promiseExecutor } = promiseState;\n const execute = useCallback(() => {\n return promiseExecutor(queryExecutor);\n }, [promiseExecutor, queryExecutor]);\n const getQuery = useCallback(() => {\n return queryRef.current;\n }, [queryRef]);\n const setQuery = useCallback(\n (query: Q) => {\n queryRef.current = query;\n if (latestOptions.current.autoExecute) {\n execute();\n }\n },\n [queryRef, latestOptions, execute],\n );\n\n useEffect(() => {\n if (latestOptions.current.autoExecute) {\n execute();\n }\n }, [latestOptions, execute]);\n\n return useMemo(\n () => ({\n ...promiseState,\n execute,\n getQuery,\n setQuery,\n }),\n [promiseState, execute, getQuery, setQuery],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PagedList, PagedQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the usePagedQuery hook.\n * Extends UseQueryOptions with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Return type for the usePagedQuery hook.\n * Extends UseQueryReturn with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Hook for querying paged data with conditions, projection, pagination, and sorting.\n * Wraps useQuery to provide type-safe paged queries.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including paged query configuration\n * @returns The query result with paged list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = usePagedQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * pagination: { index: 1, size: 10 },\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchPagedData(query),\n * });\n * ```\n */\nexport function usePagedQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UsePagedQueryOptions<R, FIELDS, E>,\n): UsePagedQueryReturn<R, FIELDS, E> {\n return useQuery<PagedQuery<FIELDS>, PagedList<R>, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useSingleQuery hook.\n * Extends UseQueryOptions with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Return type for the useSingleQuery hook.\n * Extends UseQueryReturn with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Hook for querying a single item with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe single item queries.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including single query configuration\n * @returns The query result with single item data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useSingleQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchSingleItem(query),\n * });\n * ```\n */\nexport function useSingleQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseSingleQueryOptions<R, FIELDS, E>,\n): UseSingleQueryReturn<R, FIELDS, E> {\n return useQuery<SingleQuery<FIELDS>, R, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Condition } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useCountQuery hook.\n * Extends UseQueryOptions with Condition as query key and number as data type.\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryOptions<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Return type for the useCountQuery hook.\n * Extends UseQueryReturn with Condition as query key and number as data type.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryReturn<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Hook for querying count data with conditions.\n * Wraps useQuery to provide type-safe count queries.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including condition and other settings\n * @returns The query result with count data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useCountQuery({\n * queryKey: [{ field: 'status', operator: 'eq', value: 'active' }],\n * queryFn: async (condition) => fetchCount(condition),\n * });\n * ```\n */\nexport function useCountQuery<FIELDS extends string = string, E = FetcherError>(\n options: UseCountQueryOptions<FIELDS, E>,\n): UseCountQueryReturn<FIELDS, E> {\n return useQuery(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Return type for the useListQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Hook for querying list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe list queries.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list query configuration\n * @returns The query result with list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchListData(query),\n * });\n * ```\n */\nexport function useListQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListQueryOptions<R, FIELDS, E>,\n): UseListQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, R[], E>(options);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport type { JsonServerSentEvent } from '@ahoo-wang/fetcher-eventstream';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListStreamQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Return type for the useListStreamQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Hook for querying streaming list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe streaming list queries.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list stream query configuration\n * @returns The query result with streaming data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListStreamQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchStreamData(query),\n * });\n * ```\n */\nexport function useListStreamQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListStreamQueryOptions<R, FIELDS, E>,\n): UseListStreamQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, ReadableStream<JsonServerSentEvent<R>>, E>(\n options,\n );\n}\n"],"names":["useMounted","isMountedRef","useRef","isMountedFn","useCallback","useEffect","__name","useLatest","value","ref","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","latestOptions","setLoadingFn","setSuccessFn","callbackError","setErrorFn","setIdleFn","useMemo","useRequestId","requestIdRef","generate","current","isLatest","requestId","invalidate","reset","useExecutePromise","loading","setLoading","setSuccess","setError","setIdle","propagateError","execute","input","currentRequestId","data","err","useKeyStorage","keyStorage","subscribe","callback","nameGenerator","getSnapshot","useSyncExternalStore","setValue","useFetcher","fetcher","fetcherRegistrar","state","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request","useQuery","promiseState","queryRef","queryExecutor","promiseExecutor","getQuery","setQuery","query","usePagedQuery","useSingleQuery","useCountQuery","useListQuery","useListStreamQuery"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/core/useMounted.ts","../src/core/useLatest.ts","../src/core/usePromiseState.ts","../src/core/useRequestId.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts","../src/wow/useQuery.ts","../src/wow/usePagedQuery.ts","../src/wow/useSingleQuery.ts","../src/wow/useCountQuery.ts","../src/wow/useListQuery.ts","../src/wow/useListStreamQuery.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useEffect, useCallback } from 'react';\n\n/**\n * A React hook that returns a function to check if the component is mounted.\n *\n * @returns A function that returns true if the component is mounted, false otherwise\n *\n * @example\n * ```typescript\n * import { useMounted } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const isMounted = useMounted();\n *\n * useEffect(() => {\n * someAsyncOperation().then(() => {\n * if (isMounted()) {\n * setState(result);\n * }\n * });\n * }, []);\n *\n * return <div>My Component</div>;\n * };\n * ```\n */\nexport function useMounted() {\n const isMountedRef = useRef(false);\n const isMountedFn = useCallback(() => isMountedRef.current, []);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return isMountedFn;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MutableRefObject, useRef } from 'react';\n\n/**\n * A React hook that returns a ref containing the latest value, useful for accessing the current value in async callbacks.\n *\n * @template T - The type of the value\n * @param value - The value to track\n * @returns A ref object containing the latest value\n *\n * @example\n * ```typescript\n * import { useLatest } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const [count, setCount] = useState(0);\n * const latestCount = useLatest(count);\n *\n * const handleAsync = async () => {\n * await someAsyncOperation();\n * console.log('Latest count:', latestCount.current); // Always the latest\n * };\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setCount(c => c + 1)}>Increment</button>\n * <button onClick={handleAsync}>Async Log</button>\n * </div>\n * );\n * };\n * ```\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useMounted } from './useMounted';\nimport { useLatest } from './useLatest';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R, E = unknown> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: E | undefined;\n}\n\nexport interface PromiseStateCallbacks<R, E = unknown> {\n /** Callback invoked on success (can be async) */\n onSuccess?: (result: R) => void | Promise<void>;\n /** Callback invoked on error (can be async) */\n onError?: (error: E) => void | Promise<void>;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: async (error) => {\n * await logErrorToServer(error);\n * console.error('Error:', error);\n * },\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R, E = FetcherError>\n extends PromiseStateCallbacks<R, E> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => Promise<void>;\n /** Set status to ERROR with error */\n setError: (error: E) => Promise<void>;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown, E = FetcherError>(\n options?: UsePromiseStateOptions<R, E>,\n): UsePromiseStateReturn<R, E> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<E | undefined>(undefined);\n const isMounted = useMounted();\n const latestOptions = useLatest(options);\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n async (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n try {\n await latestOptions.current?.onSuccess?.(result);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onSuccess callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setErrorFn = useCallback(\n async (error: E) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n try {\n await latestOptions.current?.onError?.(error);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onError callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n return useMemo(\n () => ({\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n }),\n [status, result, error, setLoadingFn, setSuccessFn, setErrorFn, setIdleFn],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useCallback, useMemo } from 'react';\n\n/**\n * Return type for useRequestId hook\n */\nexport interface UseRequestIdReturn {\n /** Generate a new request ID and get the current one */\n generate: () => number;\n /** Get the current request ID without generating a new one */\n current: () => number;\n /** Check if a given request ID is the latest */\n isLatest: (requestId: number) => boolean;\n /** Invalidate current request ID (mark as stale) */\n invalidate: () => void;\n /** Reset request ID counter */\n reset: () => void;\n}\n\n/**\n * A React hook for managing request IDs and race condition protection\n *\n * @example\n * ```typescript\n * // Basic usage\n * const requestId = useRequestId();\n *\n * const execute = async () => {\n * const id = requestId.generate();\n *\n * try {\n * const result = await someAsyncOperation();\n *\n * // Check if this is still the latest request\n * if (requestId.isLatest(id)) {\n * setState(result);\n * }\n * } catch (error) {\n * if (requestId.isLatest(id)) {\n * setError(error);\n * }\n * }\n * };\n *\n * // Manual cancellation\n * const handleCancel = () => {\n * requestId.invalidate(); // All ongoing requests will be ignored\n * };\n * ```\n *\n * @example\n * ```typescript\n * // With async operation wrapper\n * const { execute, cancel } = useAsyncOperation(async (data) => {\n * return await apiCall(data);\n * }, [requestId]);\n * ```\n */\nexport function useRequestId(): UseRequestIdReturn {\n const requestIdRef = useRef<number>(0);\n\n const generate = useCallback((): number => {\n return ++requestIdRef.current;\n }, []);\n\n const current = useCallback((): number => {\n return requestIdRef.current;\n }, []);\n\n const isLatest = useCallback((requestId: number): boolean => {\n return requestId === requestIdRef.current;\n }, []);\n\n const invalidate = useCallback((): void => {\n requestIdRef.current++;\n }, []);\n\n const reset = useCallback((): void => {\n requestIdRef.current = 0;\n }, []);\n return useMemo(() => {\n return {\n generate,\n current,\n isLatest,\n invalidate,\n reset,\n };\n }, [generate, current, isLatest, invalidate, reset]);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useMounted } from './useMounted';\nimport {\n usePromiseState,\n PromiseState,\n UsePromiseStateOptions,\n} from './usePromiseState';\nimport { useRequestId } from './useRequestId';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\nexport interface UseExecutePromiseOptions<R, E = unknown>\n extends UsePromiseStateOptions<R, E> {\n /**\n * Whether to propagate errors thrown by the promise.\n * If true, the execute function will throw errors.\n * If false (default), the execute function will return the error as the result instead of throwing.\n */\n propagateError?: boolean;\n}\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n */\nexport interface UseExecutePromiseReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /**\n * Function to execute a promise supplier or promise.\n * Returns a promise that resolves to the result on success, or the error if propagateError is false.\n */\n execute: (input: PromiseSupplier<R> | Promise<R>) => Promise<R | E>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the hook\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n *\n * // Example with propagateError set to true\n * const { execute } = useExecutePromise<string>({ propagateError: true });\n * try {\n * await execute(fetchData);\n * } catch (err) {\n * console.error('Error occurred:', err);\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown, E = FetcherError>(\n options?: UseExecutePromiseOptions<R, E>,\n): UseExecutePromiseReturn<R, E> {\n const { loading, result, error, status, setLoading, setSuccess, setError, setIdle } = usePromiseState<R, E>(options);\n const isMounted = useMounted();\n const requestId = useRequestId();\n const propagateError = options?.propagateError;\n /**\n * Execute a promise supplier or promise and manage its state\n * @param input - A function that returns a Promise or a Promise to be executed\n * @returns A Promise that resolves with the result on success, or the error if propagateError is false\n */\n const execute = useCallback(\n async (input: PromiseSupplier<R> | Promise<R>): Promise<R | E> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n const currentRequestId = requestId.generate();\n setLoading();\n try {\n const promise = typeof input === 'function' ? input() : input;\n const data = await promise;\n\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setError(err as E);\n }\n if (propagateError) {\n throw err;\n }\n return err as E;\n }\n },\n [setLoading, setSuccess, setError, isMounted, requestId, propagateError],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n setIdle();\n }\n }, [setIdle, isMounted]);\n\n return useMemo(\n () => ({\n loading: loading,\n result: result,\n error: error,\n execute,\n reset,\n status: status,\n }),\n [loading, result, error, execute, reset, status],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\nimport { nameGenerator } from '@ahoo-wang/fetcher-eventbus';\n\n/**\n * useKeyStorage hook overload for cases without a default value.\n *\n * When no default value is provided, the hook returns nullable state that directly\n * reflects the storage state. This is useful when you want to distinguish between\n * \"no value stored\" and \"default value applied\".\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple where the first element can be null if storage is empty,\n * and the second element is a setter function to update the storage\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void];\n\n/**\n * useKeyStorage hook overload for cases with a default value.\n *\n * When a default value is provided, the hook guarantees that the returned state\n * will never be null. The default value is used when the storage is empty,\n * providing a seamless experience for required state.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @param defaultValue - The default value to use when storage is empty.\n * This value will be returned until the storage is explicitly set.\n * @returns A tuple where the first element is guaranteed to be non-null (either\n * the stored value or the default value), and the second element is a\n * setter function to update the storage\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n defaultValue: T,\n): [T, (value: T) => void];\n\n/**\n * A React hook that provides reactive state management for a KeyStorage instance.\n *\n * This hook creates a reactive connection to a KeyStorage instance, automatically subscribing\n * to storage changes and updating the component state when the stored value changes.\n * It leverages React's `useSyncExternalStore` for optimal performance and proper SSR support.\n *\n * The hook provides two usage patterns:\n * 1. Without a default value: Returns nullable state that reflects the storage state\n * 2. With a default value: Returns non-nullable state, using the default when storage is empty\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage. This should be a\n * stable reference (useRef, memo, or module-level instance)\n * @returns A tuple containing the current stored value and a function to update it.\n * The value will be null if no default is provided and storage is empty.\n *\n * @example\n * ```typescript\n * import { useKeyStorage } from '@ahoo-wang/fetcher-react';\n * import { KeyStorage } from '@ahoo-wang/fetcher-storage';\n *\n * // Create a storage instance (typically at module level or with useRef)\n * const userStorage = new KeyStorage<string>('user');\n *\n * function UserProfile() {\n * // Without default value - can be null\n * const [userName, setUserName] = useKeyStorage(userStorage);\n *\n * return (\n * <div>\n * <p>Current user: {userName || 'Not logged in'}</p>\n * <button onClick={() => setUserName('John Doe')}>\n * Set User\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With default value - guaranteed to be non-null\n * const [theme, setTheme] = useKeyStorage(themeStorage, 'light');\n *\n * return (\n * <div className={theme}>\n * <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>\n * Toggle Theme\n * </button>\n * </div>\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Using with complex objects\n * const [userPrefs, setUserPrefs] = useKeyStorage(preferencesStorage, {\n * theme: 'light',\n * language: 'en',\n * notifications: true\n * });\n *\n * // Update specific properties\n * const updateTheme = (newTheme: string) => {\n * setUserPrefs({ ...userPrefs, theme: newTheme });\n * };\n * ```\n */\n/**\n * Implementation of the useKeyStorage hook.\n *\n * This function implements the core logic for both overloads. It uses React's\n * useSyncExternalStore hook to create a reactive connection to the KeyStorage,\n * ensuring proper subscription management and SSR compatibility.\n *\n * Key implementation details:\n * - Uses useSyncExternalStore for external store subscription\n * - Automatically unsubscribes when component unmounts\n * - Handles default value logic in the snapshot function\n * - Provides stable setter function reference via useCallback\n *\n * @param keyStorage - The KeyStorage instance to connect to\n * @param defaultValue - Optional default value for the overload implementation\n * @returns Tuple of [currentValue, setterFunction]\n * @throws {Error} If keyStorage is null or undefined\n * @throws {Error} If keyStorage subscription fails (rare, depends on implementation)\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n defaultValue?: T,\n): [T | null, (value: T) => void] {\n // Create subscription function for useSyncExternalStore\n // This function returns an unsubscribe function that will be called on cleanup\n const subscribe = useCallback(\n (callback: () => void) => {\n return keyStorage.addListener({\n name: nameGenerator.generate('useKeyStorage'), // Generate unique listener name\n handle: callback, // Callback to trigger React re-render on storage changes\n });\n },\n [keyStorage], // Recreate subscription only if keyStorage changes\n );\n\n // Create snapshot function that returns current storage state\n // This function is called by useSyncExternalStore to get the current value\n const getSnapshot = useCallback(() => {\n const storedValue = keyStorage.get();\n // Return stored value if it exists, otherwise return default value or null\n return storedValue !== null ? storedValue : (defaultValue ?? null);\n }, [keyStorage, defaultValue]); // Recreate snapshot when dependencies change\n\n // Use React's useSyncExternalStore for reactive external store connection\n // This ensures proper subscription management and SSR compatibility\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n // Create stable setter function reference\n // This function updates the storage and triggers re-renders in subscribed components\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage], // Recreate setter only if keyStorage changes\n );\n\n // Return tuple of current value and setter function\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcherRegistrar,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions, FetcherError,\n} from '@ahoo-wang/fetcher';\nimport { useMounted } from '../core';\nimport { useRef, useCallback, useEffect, useState, useMemo } from 'react';\nimport {\n PromiseState,\n useLatest,\n usePromiseState,\n UsePromiseStateOptions,\n useRequestId,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions<R, E = FetcherError>\n extends RequestOptions,\n FetcherCapable,\n UsePromiseStateOptions<R, E> {\n}\n\nexport interface UseFetcherReturn<R, E = FetcherError> extends PromiseState<R, E> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R, E = FetcherError>(\n options?: UseFetcherOptions<R, E>,\n): UseFetcherReturn<R, E> {\n const { fetcher = fetcherRegistrar.default } = options || {};\n const state = usePromiseState<R, E>(options);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMounted();\n const abortControllerRef = useRef<AbortController | undefined>();\n const requestId = useRequestId();\n const latestOptions = useLatest(options);\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n const currentRequestId = requestId.generate();\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(\n request,\n latestOptions.current,\n );\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setError(error as E);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, latestOptions, state, requestId],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return useMemo(\n () => ({\n ...state,\n exchange,\n execute,\n }),\n [state, exchange, execute],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n useExecutePromise,\n useLatest,\n UseExecutePromiseReturn,\n UseExecutePromiseOptions,\n} from '../core';\nimport { useCallback, useMemo, useEffect, useRef } from 'react';\nimport { AttributesCapable, FetcherError } from '@ahoo-wang/fetcher';\nimport { AutoExecuteCapable } from './types';\n\n/**\n * Configuration options for the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryOptions<Q, R, E = FetcherError>\n extends UseExecutePromiseOptions<R, E>,\n AttributesCapable,\n AutoExecuteCapable {\n /** The initial query parameters */\n initialQuery: Q;\n\n /** Function to execute the query with given parameters and optional attributes */\n execute: (query: Q, attributes?: Record<string, any>) => Promise<R>;\n}\n\n/**\n * Return type of the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryReturn<Q, R, E = FetcherError>\n extends UseExecutePromiseReturn<R, E> {\n /**\n * Get the current query parameters\n */\n getQuery: () => Q;\n /** Function to update the query parameters */\n setQuery: (query: Q) => void;\n /** Function to execute the query with current parameters */\n execute: () => Promise<R | E>;\n}\n\n/**\n * A React hook for managing query-based asynchronous operations\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the query\n * @returns An object containing the query state and control functions\n *\n * @example\n * ```typescript\n * import { useQuery } from '@ahoo-wang/fetcher-react';\n *\n * interface UserQuery {\n * id: string;\n * }\n *\n * interface User {\n * id: string;\n * name: string;\n * }\n *\n * function UserComponent() {\n * const { loading, result, error, execute, setQuery } = useQuery<UserQuery, User>({\n * initialQuery: { id: '1' },\n * execute: async (query) => {\n * const response = await fetch(`/api/users/${query.id}`);\n * return response.json();\n * },\n * autoExecute: true,\n * });\n *\n * const handleUserChange = (userId: string) => {\n * setQuery({ id: userId }); // Automatically executes if autoExecute is true\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={() => handleUserChange('2')}>Load User 2</button>\n * {result && <p>User: {result.name}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuery<Q, R, E = FetcherError>(\n options: UseQueryOptions<Q, R, E>,\n): UseQueryReturn<Q, R, E> {\n const latestOptions = useLatest(options);\n const promiseState = useExecutePromise<R, E>(latestOptions.current);\n const queryRef = useRef(options.initialQuery);\n\n const queryExecutor = useCallback(async (): Promise<R> => {\n return latestOptions.current.execute(\n queryRef.current,\n latestOptions.current.attributes,\n );\n }, [queryRef, latestOptions]);\n const { execute: promiseExecutor } = promiseState;\n const execute = useCallback(() => {\n return promiseExecutor(queryExecutor);\n }, [promiseExecutor, queryExecutor]);\n const getQuery = useCallback(() => {\n return queryRef.current;\n }, [queryRef]);\n const setQuery = useCallback(\n (query: Q) => {\n queryRef.current = query;\n if (latestOptions.current.autoExecute) {\n execute();\n }\n },\n [queryRef, latestOptions, execute],\n );\n\n useEffect(() => {\n if (latestOptions.current.autoExecute) {\n execute();\n }\n }, [latestOptions, execute]);\n\n return useMemo(\n () => ({\n ...promiseState,\n execute,\n getQuery,\n setQuery,\n }),\n [promiseState, execute, getQuery, setQuery],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PagedList, PagedQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the usePagedQuery hook.\n * Extends UseQueryOptions with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Return type for the usePagedQuery hook.\n * Extends UseQueryReturn with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Hook for querying paged data with conditions, projection, pagination, and sorting.\n * Wraps useQuery to provide type-safe paged queries.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including paged query configuration\n * @returns The query result with paged list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = usePagedQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * pagination: { index: 1, size: 10 },\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchPagedData(query),\n * });\n * ```\n */\nexport function usePagedQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UsePagedQueryOptions<R, FIELDS, E>,\n): UsePagedQueryReturn<R, FIELDS, E> {\n return useQuery<PagedQuery<FIELDS>, PagedList<R>, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useSingleQuery hook.\n * Extends UseQueryOptions with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Return type for the useSingleQuery hook.\n * Extends UseQueryReturn with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Hook for querying a single item with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe single item queries.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including single query configuration\n * @returns The query result with single item data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useSingleQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchSingleItem(query),\n * });\n * ```\n */\nexport function useSingleQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseSingleQueryOptions<R, FIELDS, E>,\n): UseSingleQueryReturn<R, FIELDS, E> {\n return useQuery<SingleQuery<FIELDS>, R, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Condition } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useCountQuery hook.\n * Extends UseQueryOptions with Condition as query key and number as data type.\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryOptions<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Return type for the useCountQuery hook.\n * Extends UseQueryReturn with Condition as query key and number as data type.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryReturn<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Hook for querying count data with conditions.\n * Wraps useQuery to provide type-safe count queries.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including condition and other settings\n * @returns The query result with count data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useCountQuery({\n * queryKey: [{ field: 'status', operator: 'eq', value: 'active' }],\n * queryFn: async (condition) => fetchCount(condition),\n * });\n * ```\n */\nexport function useCountQuery<FIELDS extends string = string, E = FetcherError>(\n options: UseCountQueryOptions<FIELDS, E>,\n): UseCountQueryReturn<FIELDS, E> {\n return useQuery(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Return type for the useListQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Hook for querying list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe list queries.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list query configuration\n * @returns The query result with list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchListData(query),\n * });\n * ```\n */\nexport function useListQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListQueryOptions<R, FIELDS, E>,\n): UseListQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, R[], E>(options);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport type { JsonServerSentEvent } from '@ahoo-wang/fetcher-eventstream';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListStreamQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Return type for the useListStreamQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Hook for querying streaming list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe streaming list queries.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list stream query configuration\n * @returns The query result with streaming data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListStreamQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchStreamData(query),\n * });\n * ```\n */\nexport function useListStreamQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListStreamQueryOptions<R, FIELDS, E>,\n): UseListStreamQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, ReadableStream<JsonServerSentEvent<R>>, E>(\n options,\n );\n}\n"],"names":["useMounted","isMountedRef","useRef","isMountedFn","useCallback","useEffect","__name","useLatest","value","ref","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","latestOptions","setLoadingFn","setSuccessFn","callbackError","setErrorFn","setIdleFn","useMemo","useRequestId","requestIdRef","generate","current","isLatest","requestId","invalidate","reset","useExecutePromise","loading","setLoading","setSuccess","setError","setIdle","propagateError","execute","input","currentRequestId","data","err","useKeyStorage","keyStorage","defaultValue","subscribe","callback","nameGenerator","getSnapshot","storedValue","useSyncExternalStore","setValue","useFetcher","fetcher","fetcherRegistrar","state","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request","useQuery","promiseState","queryRef","queryExecutor","promiseExecutor","getQuery","setQuery","query","usePagedQuery","useSingleQuery","useCountQuery","useListQuery","useListStreamQuery"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(u,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("react"),require("@ahoo-wang/fetcher-eventbus"),require("@ahoo-wang/fetcher")):typeof define=="function"&&define.amd?define(["exports","react","@ahoo-wang/fetcher-eventbus","@ahoo-wang/fetcher"],t):(u=typeof globalThis<"u"?globalThis:u||self,t(u.FetcherReact={},u.React,u.FetcherEventBus,u.Fetcher))})(this,(function(u,t,F,L){"use strict";var j=Object.defineProperty;var d=(u,t)=>j(u,"name",{value:t,configurable:!0});function S(){const e=t.useRef(!1),r=t.useCallback(()=>e.current,[]);return t.useEffect(()=>(e.current=!0,()=>{e.current=!1}),[]),r}d(S,"useMounted");function m(e){const r=t.useRef(e);return r.current=e,r}d(m,"useLatest");var v=(e=>(e.IDLE="idle",e.LOADING="loading",e.SUCCESS="success",e.ERROR="error",e))(v||{});function k(e){const[r,n]=t.useState(e?.initialStatus??"idle"),[c,i]=t.useState(void 0),[o,s]=t.useState(void 0),a=S(),b=m(e),f=t.useCallback(()=>{a()&&(n("loading"),s(void 0))},[a]),h=t.useCallback(async l=>{if(a()){i(l),n("success"),s(void 0);try{await b.current?.onSuccess?.(l)}catch(g){console.warn("PromiseState onSuccess callback error:",g)}}},[a,b]),y=t.useCallback(async l=>{if(a()){s(l),n("error"),i(void 0);try{await b.current?.onError?.(l)}catch(g){console.warn("PromiseState onError callback error:",g)}}},[a,b]),C=t.useCallback(()=>{a()&&(n("idle"),s(void 0),i(void 0))},[a]);return t.useMemo(()=>({status:r,loading:r==="loading",result:c,error:o,setLoading:f,setSuccess:h,setError:y,setIdle:C}),[r,c,o,f,h,y,C])}d(k,"usePromiseState");function w(){const e=t.useRef(0),r=t.useCallback(()=>++e.current,[]),n=t.useCallback(()=>e.current,[]),c=t.useCallback(s=>s===e.current,[]),i=t.useCallback(()=>{e.current++},[]),o=t.useCallback(()=>{e.current=0},[]);return t.useMemo(()=>({generate:r,current:n,isLatest:c,invalidate:i,reset:o}),[r,n,c,i,o])}d(w,"useRequestId");function Q(e){const{loading:r,result:n,error:c,status:i,setLoading:o,setSuccess:s,setError:a,setIdle:b}=k(e),f=S(),h=w(),y=e?.propagateError,C=t.useCallback(async g=>{if(!f())throw new Error("Component is unmounted");const I=h.generate();o();try{const M=await(typeof g=="function"?g():g);return f()&&h.isLatest(I)&&await s(M),M}catch(R){if(f()&&h.isLatest(I)&&await a(R),y)throw R;return R}},[o,s,a,f,h,y]),l=t.useCallback(()=>{f()&&b()},[b,f]);return t.useMemo(()=>({loading:r,result:n,error:c,execute:C,reset:l,status:i}),[r,n,c,C,l,i])}d(Q,"useExecutePromise");function q(e){const r=t.useCallback(o=>e.addListener({name:F.nameGenerator.generate("useKeyStorage"),handle:o}),[e]),n=t.useCallback(()=>e.get(),[e]),c=t.useSyncExternalStore(r,n,n),i=t.useCallback(o=>e.set(o),[e]);return[c,i]}d(q,"useKeyStorage");function P(e){const{fetcher:r=L.fetcherRegistrar.default}=e||{},n=k(e),[c,i]=t.useState(void 0),o=S(),s=t.useRef(),a=w(),b=m(e),f=L.getFetcher(r),h=t.useCallback(async y=>{s.current&&s.current.abort(),s.current=y.abortController??new AbortController,y.abortController=s.current;const C=a.generate();n.setLoading();try{const l=await f.exchange(y,b.current);o()&&a.isLatest(C)&&i(l);const g=await l.extractResult();o()&&a.isLatest(C)&&await n.setSuccess(g)}catch(l){if(l instanceof Error&&l.name==="AbortError"){o()&&n.setIdle();return}o()&&a.isLatest(C)&&await n.setError(l)}finally{s.current===y.abortController&&(s.current=void 0)}},[f,o,b,n,a]);return t.useEffect(()=>()=>{s.current?.abort(),s.current=void 0},[]),t.useMemo(()=>({...n,exchange:c,execute:h}),[n,c,h])}d(P,"useFetcher");function E(e){const r=m(e),n=Q(r.current),c=t.useRef(e.initialQuery),i=t.useCallback(async()=>r.current.execute(c.current,r.current.attributes),[c,r]),{execute:o}=n,s=t.useCallback(()=>o(i),[o,i]),a=t.useCallback(()=>c.current,[c]),b=t.useCallback(f=>{c.current=f,r.current.autoExecute&&s()},[c,r,s]);return t.useEffect(()=>{r.current.autoExecute&&s()},[r,s]),t.useMemo(()=>({...n,execute:s,getQuery:a,setQuery:b}),[n,s,a,b])}d(E,"useQuery");function x(e){return E(e)}d(x,"usePagedQuery");function O(e){return E(e)}d(O,"useSingleQuery");function A(e){return E(e)}d(A,"useCountQuery");function K(e){return E(e)}d(K,"useListQuery");function T(e){return E(e)}d(T,"useListStreamQuery"),u.PromiseStatus=v,u.useCountQuery=A,u.useExecutePromise=Q,u.useFetcher=P,u.useKeyStorage=q,u.useLatest=m,u.useListQuery=K,u.useListStreamQuery=T,u.useMounted=S,u.usePagedQuery=x,u.usePromiseState=k,u.useQuery=E,u.useRequestId=w,u.useSingleQuery=O,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(s,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("react"),require("@ahoo-wang/fetcher-eventbus"),require("@ahoo-wang/fetcher")):typeof define=="function"&&define.amd?define(["exports","react","@ahoo-wang/fetcher-eventbus","@ahoo-wang/fetcher"],t):(s=typeof globalThis<"u"?globalThis:s||self,t(s.FetcherReact={},s.React,s.FetcherEventBus,s.Fetcher))})(this,(function(s,t,F,L){"use strict";var j=Object.defineProperty;var d=(s,t)=>j(s,"name",{value:t,configurable:!0});function S(){const e=t.useRef(!1),n=t.useCallback(()=>e.current,[]);return t.useEffect(()=>(e.current=!0,()=>{e.current=!1}),[]),n}d(S,"useMounted");function m(e){const n=t.useRef(e);return n.current=e,n}d(m,"useLatest");var v=(e=>(e.IDLE="idle",e.LOADING="loading",e.SUCCESS="success",e.ERROR="error",e))(v||{});function k(e){const[n,u]=t.useState(e?.initialStatus??"idle"),[o,i]=t.useState(void 0),[a,r]=t.useState(void 0),c=S(),b=m(e),f=t.useCallback(()=>{c()&&(u("loading"),r(void 0))},[c]),h=t.useCallback(async l=>{if(c()){i(l),u("success"),r(void 0);try{await b.current?.onSuccess?.(l)}catch(g){console.warn("PromiseState onSuccess callback error:",g)}}},[c,b]),y=t.useCallback(async l=>{if(c()){r(l),u("error"),i(void 0);try{await b.current?.onError?.(l)}catch(g){console.warn("PromiseState onError callback error:",g)}}},[c,b]),C=t.useCallback(()=>{c()&&(u("idle"),r(void 0),i(void 0))},[c]);return t.useMemo(()=>({status:n,loading:n==="loading",result:o,error:a,setLoading:f,setSuccess:h,setError:y,setIdle:C}),[n,o,a,f,h,y,C])}d(k,"usePromiseState");function w(){const e=t.useRef(0),n=t.useCallback(()=>++e.current,[]),u=t.useCallback(()=>e.current,[]),o=t.useCallback(r=>r===e.current,[]),i=t.useCallback(()=>{e.current++},[]),a=t.useCallback(()=>{e.current=0},[]);return t.useMemo(()=>({generate:n,current:u,isLatest:o,invalidate:i,reset:a}),[n,u,o,i,a])}d(w,"useRequestId");function Q(e){const{loading:n,result:u,error:o,status:i,setLoading:a,setSuccess:r,setError:c,setIdle:b}=k(e),f=S(),h=w(),y=e?.propagateError,C=t.useCallback(async g=>{if(!f())throw new Error("Component is unmounted");const I=h.generate();a();try{const M=await(typeof g=="function"?g():g);return f()&&h.isLatest(I)&&await r(M),M}catch(R){if(f()&&h.isLatest(I)&&await c(R),y)throw R;return R}},[a,r,c,f,h,y]),l=t.useCallback(()=>{f()&&b()},[b,f]);return t.useMemo(()=>({loading:n,result:u,error:o,execute:C,reset:l,status:i}),[n,u,o,C,l,i])}d(Q,"useExecutePromise");function q(e,n){const u=t.useCallback(r=>e.addListener({name:F.nameGenerator.generate("useKeyStorage"),handle:r}),[e]),o=t.useCallback(()=>{const r=e.get();return r!==null?r:n??null},[e,n]),i=t.useSyncExternalStore(u,o,o),a=t.useCallback(r=>e.set(r),[e]);return[i,a]}d(q,"useKeyStorage");function P(e){const{fetcher:n=L.fetcherRegistrar.default}=e||{},u=k(e),[o,i]=t.useState(void 0),a=S(),r=t.useRef(),c=w(),b=m(e),f=L.getFetcher(n),h=t.useCallback(async y=>{r.current&&r.current.abort(),r.current=y.abortController??new AbortController,y.abortController=r.current;const C=c.generate();u.setLoading();try{const l=await f.exchange(y,b.current);a()&&c.isLatest(C)&&i(l);const g=await l.extractResult();a()&&c.isLatest(C)&&await u.setSuccess(g)}catch(l){if(l instanceof Error&&l.name==="AbortError"){a()&&u.setIdle();return}a()&&c.isLatest(C)&&await u.setError(l)}finally{r.current===y.abortController&&(r.current=void 0)}},[f,a,b,u,c]);return t.useEffect(()=>()=>{r.current?.abort(),r.current=void 0},[]),t.useMemo(()=>({...u,exchange:o,execute:h}),[u,o,h])}d(P,"useFetcher");function E(e){const n=m(e),u=Q(n.current),o=t.useRef(e.initialQuery),i=t.useCallback(async()=>n.current.execute(o.current,n.current.attributes),[o,n]),{execute:a}=u,r=t.useCallback(()=>a(i),[a,i]),c=t.useCallback(()=>o.current,[o]),b=t.useCallback(f=>{o.current=f,n.current.autoExecute&&r()},[o,n,r]);return t.useEffect(()=>{n.current.autoExecute&&r()},[n,r]),t.useMemo(()=>({...u,execute:r,getQuery:c,setQuery:b}),[u,r,c,b])}d(E,"useQuery");function x(e){return E(e)}d(x,"usePagedQuery");function O(e){return E(e)}d(O,"useSingleQuery");function A(e){return E(e)}d(A,"useCountQuery");function K(e){return E(e)}d(K,"useListQuery");function T(e){return E(e)}d(T,"useListStreamQuery"),s.PromiseStatus=v,s.useCountQuery=A,s.useExecutePromise=Q,s.useFetcher=P,s.useKeyStorage=q,s.useLatest=m,s.useListQuery=K,s.useListStreamQuery=T,s.useMounted=S,s.usePagedQuery=x,s.usePromiseState=k,s.useQuery=E,s.useRequestId=w,s.useSingleQuery=O,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/core/useMounted.ts","../src/core/useLatest.ts","../src/core/usePromiseState.ts","../src/core/useRequestId.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts","../src/wow/useQuery.ts","../src/wow/usePagedQuery.ts","../src/wow/useSingleQuery.ts","../src/wow/useCountQuery.ts","../src/wow/useListQuery.ts","../src/wow/useListStreamQuery.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useEffect, useCallback } from 'react';\n\n/**\n * A React hook that returns a function to check if the component is mounted.\n *\n * @returns A function that returns true if the component is mounted, false otherwise\n *\n * @example\n * ```typescript\n * import { useMounted } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const isMounted = useMounted();\n *\n * useEffect(() => {\n * someAsyncOperation().then(() => {\n * if (isMounted()) {\n * setState(result);\n * }\n * });\n * }, []);\n *\n * return <div>My Component</div>;\n * };\n * ```\n */\nexport function useMounted() {\n const isMountedRef = useRef(false);\n const isMountedFn = useCallback(() => isMountedRef.current, []);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return isMountedFn;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MutableRefObject, useRef } from 'react';\n\n/**\n * A React hook that returns a ref containing the latest value, useful for accessing the current value in async callbacks.\n *\n * @template T - The type of the value\n * @param value - The value to track\n * @returns A ref object containing the latest value\n *\n * @example\n * ```typescript\n * import { useLatest } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const [count, setCount] = useState(0);\n * const latestCount = useLatest(count);\n *\n * const handleAsync = async () => {\n * await someAsyncOperation();\n * console.log('Latest count:', latestCount.current); // Always the latest\n * };\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setCount(c => c + 1)}>Increment</button>\n * <button onClick={handleAsync}>Async Log</button>\n * </div>\n * );\n * };\n * ```\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useMounted } from './useMounted';\nimport { useLatest } from './useLatest';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R, E = unknown> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: E | undefined;\n}\n\nexport interface PromiseStateCallbacks<R, E = unknown> {\n /** Callback invoked on success (can be async) */\n onSuccess?: (result: R) => void | Promise<void>;\n /** Callback invoked on error (can be async) */\n onError?: (error: E) => void | Promise<void>;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: async (error) => {\n * await logErrorToServer(error);\n * console.error('Error:', error);\n * },\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R, E = FetcherError>\n extends PromiseStateCallbacks<R, E> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => Promise<void>;\n /** Set status to ERROR with error */\n setError: (error: E) => Promise<void>;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown, E = FetcherError>(\n options?: UsePromiseStateOptions<R, E>,\n): UsePromiseStateReturn<R, E> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<E | undefined>(undefined);\n const isMounted = useMounted();\n const latestOptions = useLatest(options);\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n async (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n try {\n await latestOptions.current?.onSuccess?.(result);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onSuccess callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setErrorFn = useCallback(\n async (error: E) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n try {\n await latestOptions.current?.onError?.(error);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onError callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n return useMemo(\n () => ({\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n }),\n [status, result, error, setLoadingFn, setSuccessFn, setErrorFn, setIdleFn],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useCallback, useMemo } from 'react';\n\n/**\n * Return type for useRequestId hook\n */\nexport interface UseRequestIdReturn {\n /** Generate a new request ID and get the current one */\n generate: () => number;\n /** Get the current request ID without generating a new one */\n current: () => number;\n /** Check if a given request ID is the latest */\n isLatest: (requestId: number) => boolean;\n /** Invalidate current request ID (mark as stale) */\n invalidate: () => void;\n /** Reset request ID counter */\n reset: () => void;\n}\n\n/**\n * A React hook for managing request IDs and race condition protection\n *\n * @example\n * ```typescript\n * // Basic usage\n * const requestId = useRequestId();\n *\n * const execute = async () => {\n * const id = requestId.generate();\n *\n * try {\n * const result = await someAsyncOperation();\n *\n * // Check if this is still the latest request\n * if (requestId.isLatest(id)) {\n * setState(result);\n * }\n * } catch (error) {\n * if (requestId.isLatest(id)) {\n * setError(error);\n * }\n * }\n * };\n *\n * // Manual cancellation\n * const handleCancel = () => {\n * requestId.invalidate(); // All ongoing requests will be ignored\n * };\n * ```\n *\n * @example\n * ```typescript\n * // With async operation wrapper\n * const { execute, cancel } = useAsyncOperation(async (data) => {\n * return await apiCall(data);\n * }, [requestId]);\n * ```\n */\nexport function useRequestId(): UseRequestIdReturn {\n const requestIdRef = useRef<number>(0);\n\n const generate = useCallback((): number => {\n return ++requestIdRef.current;\n }, []);\n\n const current = useCallback((): number => {\n return requestIdRef.current;\n }, []);\n\n const isLatest = useCallback((requestId: number): boolean => {\n return requestId === requestIdRef.current;\n }, []);\n\n const invalidate = useCallback((): void => {\n requestIdRef.current++;\n }, []);\n\n const reset = useCallback((): void => {\n requestIdRef.current = 0;\n }, []);\n return useMemo(() => {\n return {\n generate,\n current,\n isLatest,\n invalidate,\n reset,\n };\n }, [generate, current, isLatest, invalidate, reset]);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useMounted } from './useMounted';\nimport {\n usePromiseState,\n PromiseState,\n UsePromiseStateOptions,\n} from './usePromiseState';\nimport { useRequestId } from './useRequestId';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\nexport interface UseExecutePromiseOptions<R, E = unknown>\n extends UsePromiseStateOptions<R, E> {\n /**\n * Whether to propagate errors thrown by the promise.\n * If true, the execute function will throw errors.\n * If false (default), the execute function will return the error as the result instead of throwing.\n */\n propagateError?: boolean;\n}\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n */\nexport interface UseExecutePromiseReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /**\n * Function to execute a promise supplier or promise.\n * Returns a promise that resolves to the result on success, or the error if propagateError is false.\n */\n execute: (input: PromiseSupplier<R> | Promise<R>) => Promise<R | E>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the hook\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n *\n * // Example with propagateError set to true\n * const { execute } = useExecutePromise<string>({ propagateError: true });\n * try {\n * await execute(fetchData);\n * } catch (err) {\n * console.error('Error occurred:', err);\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown, E = FetcherError>(\n options?: UseExecutePromiseOptions<R, E>,\n): UseExecutePromiseReturn<R, E> {\n const { loading, result, error, status, setLoading, setSuccess, setError, setIdle } = usePromiseState<R, E>(options);\n const isMounted = useMounted();\n const requestId = useRequestId();\n const propagateError = options?.propagateError;\n /**\n * Execute a promise supplier or promise and manage its state\n * @param input - A function that returns a Promise or a Promise to be executed\n * @returns A Promise that resolves with the result on success, or the error if propagateError is false\n */\n const execute = useCallback(\n async (input: PromiseSupplier<R> | Promise<R>): Promise<R | E> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n const currentRequestId = requestId.generate();\n setLoading();\n try {\n const promise = typeof input === 'function' ? input() : input;\n const data = await promise;\n\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setError(err as E);\n }\n if (propagateError) {\n throw err;\n }\n return err as E;\n }\n },\n [setLoading, setSuccess, setError, isMounted, requestId, propagateError],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n setIdle();\n }\n }, [setIdle, isMounted]);\n\n return useMemo(\n () => ({\n loading: loading,\n result: result,\n error: error,\n execute,\n reset,\n status: status,\n }),\n [loading, result, error, execute, reset, status],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\nimport { nameGenerator } from '@ahoo-wang/fetcher-eventbus';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => {\n return keyStorage.addListener({\n name: nameGenerator.generate('useKeyStorage'),\n handle: callback,\n });\n },\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcherRegistrar,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions, FetcherError,\n} from '@ahoo-wang/fetcher';\nimport { useMounted } from '../core';\nimport { useRef, useCallback, useEffect, useState, useMemo } from 'react';\nimport {\n PromiseState,\n useLatest,\n usePromiseState,\n UsePromiseStateOptions,\n useRequestId,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions<R, E = FetcherError>\n extends RequestOptions,\n FetcherCapable,\n UsePromiseStateOptions<R, E> {\n}\n\nexport interface UseFetcherReturn<R, E = FetcherError> extends PromiseState<R, E> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R, E = FetcherError>(\n options?: UseFetcherOptions<R, E>,\n): UseFetcherReturn<R, E> {\n const { fetcher = fetcherRegistrar.default } = options || {};\n const state = usePromiseState<R, E>(options);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMounted();\n const abortControllerRef = useRef<AbortController | undefined>();\n const requestId = useRequestId();\n const latestOptions = useLatest(options);\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n const currentRequestId = requestId.generate();\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(\n request,\n latestOptions.current,\n );\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setError(error as E);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, latestOptions, state, requestId],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return useMemo(\n () => ({\n ...state,\n exchange,\n execute,\n }),\n [state, exchange, execute],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n useExecutePromise,\n useLatest,\n UseExecutePromiseReturn,\n UseExecutePromiseOptions,\n} from '../core';\nimport { useCallback, useMemo, useEffect, useRef } from 'react';\nimport { AttributesCapable, FetcherError } from '@ahoo-wang/fetcher';\nimport { AutoExecuteCapable } from './types';\n\n/**\n * Configuration options for the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryOptions<Q, R, E = FetcherError>\n extends UseExecutePromiseOptions<R, E>,\n AttributesCapable,\n AutoExecuteCapable {\n /** The initial query parameters */\n initialQuery: Q;\n\n /** Function to execute the query with given parameters and optional attributes */\n execute: (query: Q, attributes?: Record<string, any>) => Promise<R>;\n}\n\n/**\n * Return type of the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryReturn<Q, R, E = FetcherError>\n extends UseExecutePromiseReturn<R, E> {\n /**\n * Get the current query parameters\n */\n getQuery: () => Q;\n /** Function to update the query parameters */\n setQuery: (query: Q) => void;\n /** Function to execute the query with current parameters */\n execute: () => Promise<R | E>;\n}\n\n/**\n * A React hook for managing query-based asynchronous operations\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the query\n * @returns An object containing the query state and control functions\n *\n * @example\n * ```typescript\n * import { useQuery } from '@ahoo-wang/fetcher-react';\n *\n * interface UserQuery {\n * id: string;\n * }\n *\n * interface User {\n * id: string;\n * name: string;\n * }\n *\n * function UserComponent() {\n * const { loading, result, error, execute, setQuery } = useQuery<UserQuery, User>({\n * initialQuery: { id: '1' },\n * execute: async (query) => {\n * const response = await fetch(`/api/users/${query.id}`);\n * return response.json();\n * },\n * autoExecute: true,\n * });\n *\n * const handleUserChange = (userId: string) => {\n * setQuery({ id: userId }); // Automatically executes if autoExecute is true\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={() => handleUserChange('2')}>Load User 2</button>\n * {result && <p>User: {result.name}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuery<Q, R, E = FetcherError>(\n options: UseQueryOptions<Q, R, E>,\n): UseQueryReturn<Q, R, E> {\n const latestOptions = useLatest(options);\n const promiseState = useExecutePromise<R, E>(latestOptions.current);\n const queryRef = useRef(options.initialQuery);\n\n const queryExecutor = useCallback(async (): Promise<R> => {\n return latestOptions.current.execute(\n queryRef.current,\n latestOptions.current.attributes,\n );\n }, [queryRef, latestOptions]);\n const { execute: promiseExecutor } = promiseState;\n const execute = useCallback(() => {\n return promiseExecutor(queryExecutor);\n }, [promiseExecutor, queryExecutor]);\n const getQuery = useCallback(() => {\n return queryRef.current;\n }, [queryRef]);\n const setQuery = useCallback(\n (query: Q) => {\n queryRef.current = query;\n if (latestOptions.current.autoExecute) {\n execute();\n }\n },\n [queryRef, latestOptions, execute],\n );\n\n useEffect(() => {\n if (latestOptions.current.autoExecute) {\n execute();\n }\n }, [latestOptions, execute]);\n\n return useMemo(\n () => ({\n ...promiseState,\n execute,\n getQuery,\n setQuery,\n }),\n [promiseState, execute, getQuery, setQuery],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PagedList, PagedQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the usePagedQuery hook.\n * Extends UseQueryOptions with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Return type for the usePagedQuery hook.\n * Extends UseQueryReturn with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Hook for querying paged data with conditions, projection, pagination, and sorting.\n * Wraps useQuery to provide type-safe paged queries.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including paged query configuration\n * @returns The query result with paged list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = usePagedQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * pagination: { index: 1, size: 10 },\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchPagedData(query),\n * });\n * ```\n */\nexport function usePagedQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UsePagedQueryOptions<R, FIELDS, E>,\n): UsePagedQueryReturn<R, FIELDS, E> {\n return useQuery<PagedQuery<FIELDS>, PagedList<R>, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useSingleQuery hook.\n * Extends UseQueryOptions with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Return type for the useSingleQuery hook.\n * Extends UseQueryReturn with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Hook for querying a single item with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe single item queries.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including single query configuration\n * @returns The query result with single item data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useSingleQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchSingleItem(query),\n * });\n * ```\n */\nexport function useSingleQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseSingleQueryOptions<R, FIELDS, E>,\n): UseSingleQueryReturn<R, FIELDS, E> {\n return useQuery<SingleQuery<FIELDS>, R, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Condition } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useCountQuery hook.\n * Extends UseQueryOptions with Condition as query key and number as data type.\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryOptions<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Return type for the useCountQuery hook.\n * Extends UseQueryReturn with Condition as query key and number as data type.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryReturn<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Hook for querying count data with conditions.\n * Wraps useQuery to provide type-safe count queries.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including condition and other settings\n * @returns The query result with count data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useCountQuery({\n * queryKey: [{ field: 'status', operator: 'eq', value: 'active' }],\n * queryFn: async (condition) => fetchCount(condition),\n * });\n * ```\n */\nexport function useCountQuery<FIELDS extends string = string, E = FetcherError>(\n options: UseCountQueryOptions<FIELDS, E>,\n): UseCountQueryReturn<FIELDS, E> {\n return useQuery(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Return type for the useListQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Hook for querying list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe list queries.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list query configuration\n * @returns The query result with list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchListData(query),\n * });\n * ```\n */\nexport function useListQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListQueryOptions<R, FIELDS, E>,\n): UseListQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, R[], E>(options);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport type { JsonServerSentEvent } from '@ahoo-wang/fetcher-eventstream';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListStreamQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Return type for the useListStreamQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Hook for querying streaming list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe streaming list queries.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list stream query configuration\n * @returns The query result with streaming data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListStreamQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchStreamData(query),\n * });\n * ```\n */\nexport function useListStreamQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListStreamQueryOptions<R, FIELDS, E>,\n): UseListStreamQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, ReadableStream<JsonServerSentEvent<R>>, E>(\n options,\n );\n}\n"],"names":["useMounted","isMountedRef","useRef","isMountedFn","useCallback","useEffect","__name","useLatest","value","ref","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","latestOptions","setLoadingFn","setSuccessFn","callbackError","setErrorFn","setIdleFn","useMemo","useRequestId","requestIdRef","generate","current","isLatest","requestId","invalidate","reset","useExecutePromise","loading","setLoading","setSuccess","setError","setIdle","propagateError","execute","input","currentRequestId","data","err","useKeyStorage","keyStorage","subscribe","callback","nameGenerator","getSnapshot","useSyncExternalStore","setValue","useFetcher","fetcher","fetcherRegistrar","state","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request","useQuery","promiseState","queryRef","queryExecutor","promiseExecutor","getQuery","setQuery","query","usePagedQuery","useSingleQuery","useCountQuery","useListQuery","useListStreamQuery"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/core/useMounted.ts","../src/core/useLatest.ts","../src/core/usePromiseState.ts","../src/core/useRequestId.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts","../src/wow/useQuery.ts","../src/wow/usePagedQuery.ts","../src/wow/useSingleQuery.ts","../src/wow/useCountQuery.ts","../src/wow/useListQuery.ts","../src/wow/useListStreamQuery.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useEffect, useCallback } from 'react';\n\n/**\n * A React hook that returns a function to check if the component is mounted.\n *\n * @returns A function that returns true if the component is mounted, false otherwise\n *\n * @example\n * ```typescript\n * import { useMounted } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const isMounted = useMounted();\n *\n * useEffect(() => {\n * someAsyncOperation().then(() => {\n * if (isMounted()) {\n * setState(result);\n * }\n * });\n * }, []);\n *\n * return <div>My Component</div>;\n * };\n * ```\n */\nexport function useMounted() {\n const isMountedRef = useRef(false);\n const isMountedFn = useCallback(() => isMountedRef.current, []);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return isMountedFn;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MutableRefObject, useRef } from 'react';\n\n/**\n * A React hook that returns a ref containing the latest value, useful for accessing the current value in async callbacks.\n *\n * @template T - The type of the value\n * @param value - The value to track\n * @returns A ref object containing the latest value\n *\n * @example\n * ```typescript\n * import { useLatest } from '@ahoo-wang/fetcher-react';\n *\n * const MyComponent = () => {\n * const [count, setCount] = useState(0);\n * const latestCount = useLatest(count);\n *\n * const handleAsync = async () => {\n * await someAsyncOperation();\n * console.log('Latest count:', latestCount.current); // Always the latest\n * };\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setCount(c => c + 1)}>Increment</button>\n * <button onClick={handleAsync}>Async Log</button>\n * </div>\n * );\n * };\n * ```\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport { useMounted } from './useMounted';\nimport { useLatest } from './useLatest';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R, E = unknown> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: E | undefined;\n}\n\nexport interface PromiseStateCallbacks<R, E = unknown> {\n /** Callback invoked on success (can be async) */\n onSuccess?: (result: R) => void | Promise<void>;\n /** Callback invoked on error (can be async) */\n onError?: (error: E) => void | Promise<void>;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: async (error) => {\n * await logErrorToServer(error);\n * console.error('Error:', error);\n * },\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R, E = FetcherError>\n extends PromiseStateCallbacks<R, E> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => Promise<void>;\n /** Set status to ERROR with error */\n setError: (error: E) => Promise<void>;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown, E = FetcherError>(\n options?: UsePromiseStateOptions<R, E>,\n): UsePromiseStateReturn<R, E> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<E | undefined>(undefined);\n const isMounted = useMounted();\n const latestOptions = useLatest(options);\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n async (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n try {\n await latestOptions.current?.onSuccess?.(result);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onSuccess callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setErrorFn = useCallback(\n async (error: E) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n try {\n await latestOptions.current?.onError?.(error);\n } catch (callbackError) {\n // Log callback errors but don't affect state\n console.warn('PromiseState onError callback error:', callbackError);\n }\n }\n },\n [isMounted, latestOptions],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n return useMemo(\n () => ({\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n }),\n [status, result, error, setLoadingFn, setSuccessFn, setErrorFn, setIdleFn],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useRef, useCallback, useMemo } from 'react';\n\n/**\n * Return type for useRequestId hook\n */\nexport interface UseRequestIdReturn {\n /** Generate a new request ID and get the current one */\n generate: () => number;\n /** Get the current request ID without generating a new one */\n current: () => number;\n /** Check if a given request ID is the latest */\n isLatest: (requestId: number) => boolean;\n /** Invalidate current request ID (mark as stale) */\n invalidate: () => void;\n /** Reset request ID counter */\n reset: () => void;\n}\n\n/**\n * A React hook for managing request IDs and race condition protection\n *\n * @example\n * ```typescript\n * // Basic usage\n * const requestId = useRequestId();\n *\n * const execute = async () => {\n * const id = requestId.generate();\n *\n * try {\n * const result = await someAsyncOperation();\n *\n * // Check if this is still the latest request\n * if (requestId.isLatest(id)) {\n * setState(result);\n * }\n * } catch (error) {\n * if (requestId.isLatest(id)) {\n * setError(error);\n * }\n * }\n * };\n *\n * // Manual cancellation\n * const handleCancel = () => {\n * requestId.invalidate(); // All ongoing requests will be ignored\n * };\n * ```\n *\n * @example\n * ```typescript\n * // With async operation wrapper\n * const { execute, cancel } = useAsyncOperation(async (data) => {\n * return await apiCall(data);\n * }, [requestId]);\n * ```\n */\nexport function useRequestId(): UseRequestIdReturn {\n const requestIdRef = useRef<number>(0);\n\n const generate = useCallback((): number => {\n return ++requestIdRef.current;\n }, []);\n\n const current = useCallback((): number => {\n return requestIdRef.current;\n }, []);\n\n const isLatest = useCallback((requestId: number): boolean => {\n return requestId === requestIdRef.current;\n }, []);\n\n const invalidate = useCallback((): void => {\n requestIdRef.current++;\n }, []);\n\n const reset = useCallback((): void => {\n requestIdRef.current = 0;\n }, []);\n return useMemo(() => {\n return {\n generate,\n current,\n isLatest,\n invalidate,\n reset,\n };\n }, [generate, current, isLatest, invalidate, reset]);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useMounted } from './useMounted';\nimport {\n usePromiseState,\n PromiseState,\n UsePromiseStateOptions,\n} from './usePromiseState';\nimport { useRequestId } from './useRequestId';\nimport { FetcherError } from '@ahoo-wang/fetcher';\n\nexport interface UseExecutePromiseOptions<R, E = unknown>\n extends UsePromiseStateOptions<R, E> {\n /**\n * Whether to propagate errors thrown by the promise.\n * If true, the execute function will throw errors.\n * If false (default), the execute function will return the error as the result instead of throwing.\n */\n propagateError?: boolean;\n}\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n */\nexport interface UseExecutePromiseReturn<R, E = FetcherError>\n extends PromiseState<R, E> {\n /**\n * Function to execute a promise supplier or promise.\n * Returns a promise that resolves to the result on success, or the error if propagateError is false.\n */\n execute: (input: PromiseSupplier<R> | Promise<R>) => Promise<R | E>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the hook\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n *\n * // Example with propagateError set to true\n * const { execute } = useExecutePromise<string>({ propagateError: true });\n * try {\n * await execute(fetchData);\n * } catch (err) {\n * console.error('Error occurred:', err);\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown, E = FetcherError>(\n options?: UseExecutePromiseOptions<R, E>,\n): UseExecutePromiseReturn<R, E> {\n const { loading, result, error, status, setLoading, setSuccess, setError, setIdle } = usePromiseState<R, E>(options);\n const isMounted = useMounted();\n const requestId = useRequestId();\n const propagateError = options?.propagateError;\n /**\n * Execute a promise supplier or promise and manage its state\n * @param input - A function that returns a Promise or a Promise to be executed\n * @returns A Promise that resolves with the result on success, or the error if propagateError is false\n */\n const execute = useCallback(\n async (input: PromiseSupplier<R> | Promise<R>): Promise<R | E> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n const currentRequestId = requestId.generate();\n setLoading();\n try {\n const promise = typeof input === 'function' ? input() : input;\n const data = await promise;\n\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await setError(err as E);\n }\n if (propagateError) {\n throw err;\n }\n return err as E;\n }\n },\n [setLoading, setSuccess, setError, isMounted, requestId, propagateError],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n setIdle();\n }\n }, [setIdle, isMounted]);\n\n return useMemo(\n () => ({\n loading: loading,\n result: result,\n error: error,\n execute,\n reset,\n status: status,\n }),\n [loading, result, error, execute, reset, status],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\nimport { nameGenerator } from '@ahoo-wang/fetcher-eventbus';\n\n/**\n * useKeyStorage hook overload for cases without a default value.\n *\n * When no default value is provided, the hook returns nullable state that directly\n * reflects the storage state. This is useful when you want to distinguish between\n * \"no value stored\" and \"default value applied\".\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple where the first element can be null if storage is empty,\n * and the second element is a setter function to update the storage\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void];\n\n/**\n * useKeyStorage hook overload for cases with a default value.\n *\n * When a default value is provided, the hook guarantees that the returned state\n * will never be null. The default value is used when the storage is empty,\n * providing a seamless experience for required state.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @param defaultValue - The default value to use when storage is empty.\n * This value will be returned until the storage is explicitly set.\n * @returns A tuple where the first element is guaranteed to be non-null (either\n * the stored value or the default value), and the second element is a\n * setter function to update the storage\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n defaultValue: T,\n): [T, (value: T) => void];\n\n/**\n * A React hook that provides reactive state management for a KeyStorage instance.\n *\n * This hook creates a reactive connection to a KeyStorage instance, automatically subscribing\n * to storage changes and updating the component state when the stored value changes.\n * It leverages React's `useSyncExternalStore` for optimal performance and proper SSR support.\n *\n * The hook provides two usage patterns:\n * 1. Without a default value: Returns nullable state that reflects the storage state\n * 2. With a default value: Returns non-nullable state, using the default when storage is empty\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage. This should be a\n * stable reference (useRef, memo, or module-level instance)\n * @returns A tuple containing the current stored value and a function to update it.\n * The value will be null if no default is provided and storage is empty.\n *\n * @example\n * ```typescript\n * import { useKeyStorage } from '@ahoo-wang/fetcher-react';\n * import { KeyStorage } from '@ahoo-wang/fetcher-storage';\n *\n * // Create a storage instance (typically at module level or with useRef)\n * const userStorage = new KeyStorage<string>('user');\n *\n * function UserProfile() {\n * // Without default value - can be null\n * const [userName, setUserName] = useKeyStorage(userStorage);\n *\n * return (\n * <div>\n * <p>Current user: {userName || 'Not logged in'}</p>\n * <button onClick={() => setUserName('John Doe')}>\n * Set User\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With default value - guaranteed to be non-null\n * const [theme, setTheme] = useKeyStorage(themeStorage, 'light');\n *\n * return (\n * <div className={theme}>\n * <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>\n * Toggle Theme\n * </button>\n * </div>\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Using with complex objects\n * const [userPrefs, setUserPrefs] = useKeyStorage(preferencesStorage, {\n * theme: 'light',\n * language: 'en',\n * notifications: true\n * });\n *\n * // Update specific properties\n * const updateTheme = (newTheme: string) => {\n * setUserPrefs({ ...userPrefs, theme: newTheme });\n * };\n * ```\n */\n/**\n * Implementation of the useKeyStorage hook.\n *\n * This function implements the core logic for both overloads. It uses React's\n * useSyncExternalStore hook to create a reactive connection to the KeyStorage,\n * ensuring proper subscription management and SSR compatibility.\n *\n * Key implementation details:\n * - Uses useSyncExternalStore for external store subscription\n * - Automatically unsubscribes when component unmounts\n * - Handles default value logic in the snapshot function\n * - Provides stable setter function reference via useCallback\n *\n * @param keyStorage - The KeyStorage instance to connect to\n * @param defaultValue - Optional default value for the overload implementation\n * @returns Tuple of [currentValue, setterFunction]\n * @throws {Error} If keyStorage is null or undefined\n * @throws {Error} If keyStorage subscription fails (rare, depends on implementation)\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n defaultValue?: T,\n): [T | null, (value: T) => void] {\n // Create subscription function for useSyncExternalStore\n // This function returns an unsubscribe function that will be called on cleanup\n const subscribe = useCallback(\n (callback: () => void) => {\n return keyStorage.addListener({\n name: nameGenerator.generate('useKeyStorage'), // Generate unique listener name\n handle: callback, // Callback to trigger React re-render on storage changes\n });\n },\n [keyStorage], // Recreate subscription only if keyStorage changes\n );\n\n // Create snapshot function that returns current storage state\n // This function is called by useSyncExternalStore to get the current value\n const getSnapshot = useCallback(() => {\n const storedValue = keyStorage.get();\n // Return stored value if it exists, otherwise return default value or null\n return storedValue !== null ? storedValue : (defaultValue ?? null);\n }, [keyStorage, defaultValue]); // Recreate snapshot when dependencies change\n\n // Use React's useSyncExternalStore for reactive external store connection\n // This ensures proper subscription management and SSR compatibility\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n // Create stable setter function reference\n // This function updates the storage and triggers re-renders in subscribed components\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage], // Recreate setter only if keyStorage changes\n );\n\n // Return tuple of current value and setter function\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcherRegistrar,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions, FetcherError,\n} from '@ahoo-wang/fetcher';\nimport { useMounted } from '../core';\nimport { useRef, useCallback, useEffect, useState, useMemo } from 'react';\nimport {\n PromiseState,\n useLatest,\n usePromiseState,\n UsePromiseStateOptions,\n useRequestId,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions<R, E = FetcherError>\n extends RequestOptions,\n FetcherCapable,\n UsePromiseStateOptions<R, E> {\n}\n\nexport interface UseFetcherReturn<R, E = FetcherError> extends PromiseState<R, E> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R, E = FetcherError>(\n options?: UseFetcherOptions<R, E>,\n): UseFetcherReturn<R, E> {\n const { fetcher = fetcherRegistrar.default } = options || {};\n const state = usePromiseState<R, E>(options);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMounted();\n const abortControllerRef = useRef<AbortController | undefined>();\n const requestId = useRequestId();\n const latestOptions = useLatest(options);\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n const currentRequestId = requestId.generate();\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(\n request,\n latestOptions.current,\n );\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted() && requestId.isLatest(currentRequestId)) {\n await state.setError(error as E);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, latestOptions, state, requestId],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return useMemo(\n () => ({\n ...state,\n exchange,\n execute,\n }),\n [state, exchange, execute],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n useExecutePromise,\n useLatest,\n UseExecutePromiseReturn,\n UseExecutePromiseOptions,\n} from '../core';\nimport { useCallback, useMemo, useEffect, useRef } from 'react';\nimport { AttributesCapable, FetcherError } from '@ahoo-wang/fetcher';\nimport { AutoExecuteCapable } from './types';\n\n/**\n * Configuration options for the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryOptions<Q, R, E = FetcherError>\n extends UseExecutePromiseOptions<R, E>,\n AttributesCapable,\n AutoExecuteCapable {\n /** The initial query parameters */\n initialQuery: Q;\n\n /** Function to execute the query with given parameters and optional attributes */\n execute: (query: Q, attributes?: Record<string, any>) => Promise<R>;\n}\n\n/**\n * Return type of the useQuery hook\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n */\nexport interface UseQueryReturn<Q, R, E = FetcherError>\n extends UseExecutePromiseReturn<R, E> {\n /**\n * Get the current query parameters\n */\n getQuery: () => Q;\n /** Function to update the query parameters */\n setQuery: (query: Q) => void;\n /** Function to execute the query with current parameters */\n execute: () => Promise<R | E>;\n}\n\n/**\n * A React hook for managing query-based asynchronous operations\n * @template Q - The type of the query parameters\n * @template R - The type of the result value\n * @template E - The type of the error value\n * @param options - Configuration options for the query\n * @returns An object containing the query state and control functions\n *\n * @example\n * ```typescript\n * import { useQuery } from '@ahoo-wang/fetcher-react';\n *\n * interface UserQuery {\n * id: string;\n * }\n *\n * interface User {\n * id: string;\n * name: string;\n * }\n *\n * function UserComponent() {\n * const { loading, result, error, execute, setQuery } = useQuery<UserQuery, User>({\n * initialQuery: { id: '1' },\n * execute: async (query) => {\n * const response = await fetch(`/api/users/${query.id}`);\n * return response.json();\n * },\n * autoExecute: true,\n * });\n *\n * const handleUserChange = (userId: string) => {\n * setQuery({ id: userId }); // Automatically executes if autoExecute is true\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={() => handleUserChange('2')}>Load User 2</button>\n * {result && <p>User: {result.name}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuery<Q, R, E = FetcherError>(\n options: UseQueryOptions<Q, R, E>,\n): UseQueryReturn<Q, R, E> {\n const latestOptions = useLatest(options);\n const promiseState = useExecutePromise<R, E>(latestOptions.current);\n const queryRef = useRef(options.initialQuery);\n\n const queryExecutor = useCallback(async (): Promise<R> => {\n return latestOptions.current.execute(\n queryRef.current,\n latestOptions.current.attributes,\n );\n }, [queryRef, latestOptions]);\n const { execute: promiseExecutor } = promiseState;\n const execute = useCallback(() => {\n return promiseExecutor(queryExecutor);\n }, [promiseExecutor, queryExecutor]);\n const getQuery = useCallback(() => {\n return queryRef.current;\n }, [queryRef]);\n const setQuery = useCallback(\n (query: Q) => {\n queryRef.current = query;\n if (latestOptions.current.autoExecute) {\n execute();\n }\n },\n [queryRef, latestOptions, execute],\n );\n\n useEffect(() => {\n if (latestOptions.current.autoExecute) {\n execute();\n }\n }, [latestOptions, execute]);\n\n return useMemo(\n () => ({\n ...promiseState,\n execute,\n getQuery,\n setQuery,\n }),\n [promiseState, execute, getQuery, setQuery],\n );\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PagedList, PagedQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the usePagedQuery hook.\n * Extends UseQueryOptions with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Return type for the usePagedQuery hook.\n * Extends UseQueryReturn with PagedQuery as query key and PagedList as data type.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UsePagedQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<PagedQuery<FIELDS>, PagedList<R>, E> {\n}\n\n/**\n * Hook for querying paged data with conditions, projection, pagination, and sorting.\n * Wraps useQuery to provide type-safe paged queries.\n *\n * @template R - The type of the result items in the paged list\n * @template FIELDS - The fields type for the paged query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including paged query configuration\n * @returns The query result with paged list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = usePagedQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * pagination: { index: 1, size: 10 },\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchPagedData(query),\n * });\n * ```\n */\nexport function usePagedQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UsePagedQueryOptions<R, FIELDS, E>,\n): UsePagedQueryReturn<R, FIELDS, E> {\n return useQuery<PagedQuery<FIELDS>, PagedList<R>, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useSingleQuery hook.\n * Extends UseQueryOptions with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Return type for the useSingleQuery hook.\n * Extends UseQueryReturn with SingleQuery as query key and custom result type.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseSingleQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<SingleQuery<FIELDS>, R, E> {\n}\n\n/**\n * Hook for querying a single item with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe single item queries.\n *\n * @template R - The result type of the query\n * @template FIELDS - The fields type for the single query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including single query configuration\n * @returns The query result with single item data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useSingleQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchSingleItem(query),\n * });\n * ```\n */\nexport function useSingleQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseSingleQueryOptions<R, FIELDS, E>,\n): UseSingleQueryReturn<R, FIELDS, E> {\n return useQuery<SingleQuery<FIELDS>, R, E>(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Condition } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useCountQuery hook.\n * Extends UseQueryOptions with Condition as query key and number as data type.\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryOptions<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Return type for the useCountQuery hook.\n * Extends UseQueryReturn with Condition as query key and number as data type.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseCountQueryReturn<\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<Condition<FIELDS>, number, E> {\n}\n\n/**\n * Hook for querying count data with conditions.\n * Wraps useQuery to provide type-safe count queries.\n *\n * @template FIELDS - The fields type for the condition\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including condition and other settings\n * @returns The query result with count data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useCountQuery({\n * queryKey: [{ field: 'status', operator: 'eq', value: 'active' }],\n * queryFn: async (condition) => fetchCount(condition),\n * });\n * ```\n */\nexport function useCountQuery<FIELDS extends string = string, E = FetcherError>(\n options: UseCountQueryOptions<FIELDS, E>,\n): UseCountQueryReturn<FIELDS, E> {\n return useQuery(options);\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Return type for the useListQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and array of results as data type.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<ListQuery<FIELDS>, R[], E> {\n}\n\n/**\n * Hook for querying list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe list queries.\n *\n * @template R - The type of the result items in the list\n * @template FIELDS - The fields type for the list query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list query configuration\n * @returns The query result with list data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchListData(query),\n * });\n * ```\n */\nexport function useListQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListQueryOptions<R, FIELDS, E>,\n): UseListQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, R[], E>(options);\n}","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListQuery } from '@ahoo-wang/fetcher-wow';\nimport type { JsonServerSentEvent } from '@ahoo-wang/fetcher-eventstream';\nimport { FetcherError } from '@ahoo-wang/fetcher';\nimport { useQuery, UseQueryOptions, UseQueryReturn } from './useQuery';\n\n/**\n * Options for the useListStreamQuery hook.\n * Extends UseQueryOptions with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryOptions<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryOptions<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Return type for the useListStreamQuery hook.\n * Extends UseQueryReturn with ListQuery as query key and stream of events as data type.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n */\nexport interface UseListStreamQueryReturn<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n> extends UseQueryReturn<\n ListQuery<FIELDS>,\n ReadableStream<JsonServerSentEvent<R>>,\n E\n> {\n}\n\n/**\n * Hook for querying streaming list data with conditions, projection, and sorting.\n * Wraps useQuery to provide type-safe streaming list queries.\n *\n * @template R - The type of the result items in the stream events\n * @template FIELDS - The fields type for the list stream query\n * @template E - The error type, defaults to FetcherError\n * @param options - The query options including list stream query configuration\n * @returns The query result with streaming data\n *\n * @example\n * ```typescript\n * const { data, isLoading } = useListStreamQuery<{ id: number; name: string }, 'id' | 'name'>({\n * initialQuery: {\n * condition: all(),\n * projection: { include: ['id', 'name'] },\n * sort: [{ field: 'id', direction: SortDirection.ASC }],\n * },\n * execute: async (query) => fetchStreamData(query),\n * });\n * ```\n */\nexport function useListStreamQuery<\n R,\n FIELDS extends string = string,\n E = FetcherError,\n>(\n options: UseListStreamQueryOptions<R, FIELDS, E>,\n): UseListStreamQueryReturn<R, FIELDS, E> {\n return useQuery<ListQuery<FIELDS>, ReadableStream<JsonServerSentEvent<R>>, E>(\n options,\n );\n}\n"],"names":["useMounted","isMountedRef","useRef","isMountedFn","useCallback","useEffect","__name","useLatest","value","ref","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","latestOptions","setLoadingFn","setSuccessFn","callbackError","setErrorFn","setIdleFn","useMemo","useRequestId","requestIdRef","generate","current","isLatest","requestId","invalidate","reset","useExecutePromise","loading","setLoading","setSuccess","setError","setIdle","propagateError","execute","input","currentRequestId","data","err","useKeyStorage","keyStorage","defaultValue","subscribe","callback","nameGenerator","getSnapshot","storedValue","useSyncExternalStore","setValue","useFetcher","fetcher","fetcherRegistrar","state","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request","useQuery","promiseState","queryRef","queryExecutor","promiseExecutor","getQuery","setQuery","query","usePagedQuery","useSingleQuery","useCountQuery","useListQuery","useListStreamQuery"],"mappings":"+eAuCO,SAASA,GAAa,CAC3B,MAAMC,EAAeC,EAAAA,OAAO,EAAK,EAC3BC,EAAcC,EAAAA,YAAY,IAAMH,EAAa,QAAS,CAAA,CAAE,EAC9DI,OAAAA,EAAAA,UAAU,KACRJ,EAAa,QAAU,GAChB,IAAM,CACXA,EAAa,QAAU,EACzB,GACC,CAAA,CAAE,EAEEE,CACT,CAXgBG,EAAAN,EAAA,cCMT,SAASO,EAAaC,EAA+B,CAC1D,MAAMC,EAAMP,EAAAA,OAAOM,CAAK,EACxB,OAAAC,EAAI,QAAUD,EACPC,CACT,CAJgBH,EAAAC,EAAA,aCxBT,IAAKG,GAAAA,IACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,MAAQ,QAJEA,IAAAA,GAAA,CAAA,CAAA,EA6FL,SAASC,EACdC,EAC6B,CAC7B,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAC1BH,GAAS,eAAiB,MAAA,EAEtB,CAACI,EAAQC,CAAS,EAAIF,EAAAA,SAAwB,MAAS,EACvD,CAACG,EAAOC,CAAa,EAAIJ,EAAAA,SAAwB,MAAS,EAC1DK,EAAYpB,EAAA,EACZqB,EAAgBd,EAAUK,CAAO,EACjCU,EAAelB,EAAAA,YAAY,IAAM,CACjCgB,MACFN,EAAU,SAAA,EACVK,EAAc,MAAS,EAE3B,EAAG,CAACC,CAAS,CAAC,EAERG,EAAenB,EAAAA,YACnB,MAAOY,GAAc,CACnB,GAAII,IAAa,CACfH,EAAUD,CAAM,EAChBF,EAAU,SAAA,EACVK,EAAc,MAAS,EACvB,GAAI,CACF,MAAME,EAAc,SAAS,YAAYL,CAAM,CACjD,OAASQ,EAAe,CAEtB,QAAQ,KAAK,yCAA0CA,CAAa,CACtE,CACF,CACF,EACA,CAACJ,EAAWC,CAAa,CAAA,EAGrBI,EAAarB,EAAAA,YACjB,MAAOc,GAAa,CAClB,GAAIE,IAAa,CACfD,EAAcD,CAAK,EACnBJ,EAAU,OAAA,EACVG,EAAU,MAAS,EACnB,GAAI,CACF,MAAMI,EAAc,SAAS,UAAUH,CAAK,CAC9C,OAASM,EAAe,CAEtB,QAAQ,KAAK,uCAAwCA,CAAa,CACpE,CACF,CACF,EACA,CAACJ,EAAWC,CAAa,CAAA,EAGrBK,EAAYtB,EAAAA,YAAY,IAAM,CAC9BgB,MACFN,EAAU,MAAA,EACVK,EAAc,MAAS,EACvBF,EAAU,MAAS,EAEvB,EAAG,CAACG,CAAS,CAAC,EACd,OAAOO,EAAAA,QACL,KAAO,CACL,OAAAd,EACA,QAASA,IAAW,UACpB,OAAAG,EACA,MAAAE,EACA,WAAYI,EACZ,WAAYC,EACZ,SAAUE,EACV,QAASC,CAAA,GAEX,CAACb,EAAQG,EAAQE,EAAOI,EAAcC,EAAcE,EAAYC,CAAS,CAAA,CAE7E,CAvEgBpB,EAAAK,EAAA,mBC5CT,SAASiB,GAAmC,CACjD,MAAMC,EAAe3B,EAAAA,OAAe,CAAC,EAE/B4B,EAAW1B,EAAAA,YAAY,IACpB,EAAEyB,EAAa,QACrB,CAAA,CAAE,EAECE,EAAU3B,EAAAA,YAAY,IACnByB,EAAa,QACnB,CAAA,CAAE,EAECG,EAAW5B,cAAa6B,GACrBA,IAAcJ,EAAa,QACjC,CAAA,CAAE,EAECK,EAAa9B,EAAAA,YAAY,IAAY,CACzCyB,EAAa,SACf,EAAG,CAAA,CAAE,EAECM,EAAQ/B,EAAAA,YAAY,IAAY,CACpCyB,EAAa,QAAU,CACzB,EAAG,CAAA,CAAE,EACL,OAAOF,EAAAA,QAAQ,KACN,CACL,SAAAG,EACA,QAAAC,EACA,SAAAC,EACA,WAAAE,EACA,MAAAC,CAAA,GAED,CAACL,EAAUC,EAASC,EAAUE,EAAYC,CAAK,CAAC,CACrD,CA/BgB7B,EAAAsB,EAAA,gBC+BT,SAASQ,EACdxB,EAC+B,CAC/B,KAAM,CAAE,QAAAyB,EAAS,OAAArB,EAAQ,MAAAE,EAAO,OAAAL,EAAQ,WAAAyB,EAAY,WAAAC,EAAY,SAAAC,EAAU,QAAAC,GAAY9B,EAAsBC,CAAO,EAC7GQ,EAAYpB,EAAA,EACZiC,EAAYL,EAAA,EACZc,EAAiB9B,GAAS,eAM1B+B,EAAUvC,EAAAA,YACd,MAAOwC,GAA2D,CAChE,GAAI,CAACxB,IACH,MAAM,IAAI,MAAM,wBAAwB,EAE1C,MAAMyB,EAAmBZ,EAAU,SAAA,EACnCK,EAAA,EACA,GAAI,CAEF,MAAMQ,EAAO,MADG,OAAOF,GAAU,WAAaA,IAAUA,GAGxD,OAAIxB,EAAA,GAAea,EAAU,SAASY,CAAgB,GACpD,MAAMN,EAAWO,CAAI,EAEhBA,CACT,OAASC,EAAK,CAIZ,GAHI3B,EAAA,GAAea,EAAU,SAASY,CAAgB,GACpD,MAAML,EAASO,CAAQ,EAErBL,EACF,MAAMK,EAER,OAAOA,CACT,CACF,EACA,CAACT,EAAYC,EAAYC,EAAUpB,EAAWa,EAAWS,CAAc,CAAA,EAMnEP,EAAQ/B,EAAAA,YAAY,IAAM,CAC1BgB,KACFqB,EAAA,CAEJ,EAAG,CAACA,EAASrB,CAAS,CAAC,EAEvB,OAAOO,EAAAA,QACL,KAAO,CACL,QAAAU,EACA,OAAArB,EACA,MAAAE,EACA,QAAAyB,EACA,MAAAR,EACA,OAAAtB,CAAA,GAEF,CAACwB,EAASrB,EAAQE,EAAOyB,EAASR,EAAOtB,CAAM,CAAA,CAEnD,CA5DgBP,EAAA8B,EAAA,qBCwCT,SAASY,EACdC,EACAC,EACgC,CAGhC,MAAMC,EAAY/C,EAAAA,YACfgD,GACQH,EAAW,YAAY,CAC5B,KAAMI,EAAAA,cAAc,SAAS,eAAe,EAC5C,OAAQD,CAAA,CACT,EAEH,CAACH,CAAU,CAAA,EAKPK,EAAclD,EAAAA,YAAY,IAAM,CACpC,MAAMmD,EAAcN,EAAW,IAAA,EAE/B,OAAOM,IAAgB,KAAOA,EAAeL,GAAgB,IAC/D,EAAG,CAACD,EAAYC,CAAY,CAAC,EAIvB1C,EAAQgD,EAAAA,qBAAqBL,EAAWG,EAAaA,CAAW,EAIhEG,EAAWrD,EAAAA,YACdI,GAAayC,EAAW,IAAIzC,CAAK,EAClC,CAACyC,CAAU,CAAA,EAIb,MAAO,CAACzC,EAAOiD,CAAQ,CACzB,CArCgBnD,EAAA0C,EAAA,iBCnET,SAASU,EACd9C,EACwB,CACxB,KAAM,CAAA,QAAE+C,EAAUC,EAAAA,iBAAiB,OAAA,EAAYhD,GAAW,CAAA,EACpDiD,EAAQlD,EAAsBC,CAAO,EACrC,CAACkD,EAAUC,CAAW,EAAIhD,EAAAA,SAC9B,MAAA,EAEIK,EAAYpB,EAAA,EACZgE,EAAqB9D,EAAAA,OAAA,EACrB+B,EAAYL,EAAA,EACZP,EAAgBd,EAAUK,CAAO,EACjCqD,EAAiBC,EAAAA,WAAWP,CAAO,EAKnChB,EAAUvC,EAAAA,YACd,MAAO+D,GAA0B,CAC3BH,EAAmB,SACrBA,EAAmB,QAAQ,MAAA,EAE7BA,EAAmB,QACjBG,EAAQ,iBAAmB,IAAI,gBACjCA,EAAQ,gBAAkBH,EAAmB,QAC7C,MAAMnB,EAAmBZ,EAAU,SAAA,EACnC4B,EAAM,WAAA,EACN,GAAI,CACF,MAAMC,EAAW,MAAMG,EAAe,SACpCE,EACA9C,EAAc,OAAA,EAEZD,EAAA,GAAea,EAAU,SAASY,CAAgB,GACpDkB,EAAYD,CAAQ,EAEtB,MAAM9C,EAAS,MAAM8C,EAAS,cAAA,EAC1B1C,EAAA,GAAea,EAAU,SAASY,CAAgB,GACpD,MAAMgB,EAAM,WAAW7C,CAAM,CAEjC,OAASE,EAAO,CACd,GAAIA,aAAiB,OAASA,EAAM,OAAS,aAAc,CACrDE,KACFyC,EAAM,QAAA,EAER,MACF,CACIzC,EAAA,GAAea,EAAU,SAASY,CAAgB,GACpD,MAAMgB,EAAM,SAAS3C,CAAU,CAEnC,QAAA,CACM8C,EAAmB,UAAYG,EAAQ,kBACzCH,EAAmB,QAAU,OAEjC,CACF,EACA,CAACC,EAAgB7C,EAAWC,EAAewC,EAAO5B,CAAS,CAAA,EAG7D5B,OAAAA,EAAAA,UAAU,IACD,IAAM,CACX2D,EAAmB,SAAS,MAAA,EAC5BA,EAAmB,QAAU,MAC/B,EACC,CAAA,CAAE,EACErC,EAAAA,QACL,KAAO,CACL,GAAGkC,EACH,SAAAC,EACA,QAAAnB,CAAA,GAEF,CAACkB,EAAOC,EAAUnB,CAAO,CAAA,CAE7B,CAxEgBrC,EAAAoD,EAAA,cC8BT,SAASU,EACdxD,EACyB,CACzB,MAAMS,EAAgBd,EAAUK,CAAO,EACjCyD,EAAejC,EAAwBf,EAAc,OAAO,EAC5DiD,EAAWpE,EAAAA,OAAOU,EAAQ,YAAY,EAEtC2D,EAAgBnE,EAAAA,YAAY,SACzBiB,EAAc,QAAQ,QAC3BiD,EAAS,QACTjD,EAAc,QAAQ,UAAA,EAEvB,CAACiD,EAAUjD,CAAa,CAAC,EACtB,CAAE,QAASmD,CAAA,EAAoBH,EAC/B1B,EAAUvC,EAAAA,YAAY,IACnBoE,EAAgBD,CAAa,EACnC,CAACC,EAAiBD,CAAa,CAAC,EAC7BE,EAAWrE,EAAAA,YAAY,IACpBkE,EAAS,QACf,CAACA,CAAQ,CAAC,EACPI,EAAWtE,EAAAA,YACduE,GAAa,CACZL,EAAS,QAAUK,EACftD,EAAc,QAAQ,aACxBsB,EAAA,CAEJ,EACA,CAAC2B,EAAUjD,EAAesB,CAAO,CAAA,EAGnCtC,OAAAA,EAAAA,UAAU,IAAM,CACVgB,EAAc,QAAQ,aACxBsB,EAAA,CAEJ,EAAG,CAACtB,EAAesB,CAAO,CAAC,EAEpBhB,EAAAA,QACL,KAAO,CACL,GAAG0C,EACH,QAAA1B,EACA,SAAA8B,EACA,SAAAC,CAAA,GAEF,CAACL,EAAc1B,EAAS8B,EAAUC,CAAQ,CAAA,CAE9C,CA7CgBpE,EAAA8D,EAAA,YClCT,SAASQ,EAKdhE,EACmC,CACnC,OAAOwD,EAA8CxD,CAAO,CAC9D,CARgBN,EAAAsE,EAAA,iBCDT,SAASC,EAKdjE,EACoC,CACpC,OAAOwD,EAAoCxD,CAAO,CACpD,CARgBN,EAAAuE,EAAA,kBCVT,SAASC,EACdlE,EACgC,CAChC,OAAOwD,EAASxD,CAAO,CACzB,CAJgBN,EAAAwE,EAAA,iBCUT,SAASC,EAKdnE,EACkC,CAClC,OAAOwD,EAAoCxD,CAAO,CACpD,CARgBN,EAAAyE,EAAA,gBCST,SAASC,EAKdpE,EACwC,CACxC,OAAOwD,EACLxD,CAAA,CAEJ,CAVgBN,EAAA0E,EAAA"}
@@ -1,11 +1,31 @@
1
1
  import { KeyStorage } from '@ahoo-wang/fetcher-storage';
2
2
  /**
3
- * A React hook that provides state management for a KeyStorage instance.
4
- * Subscribes to storage changes and returns the current value along with a setter function.
3
+ * useKeyStorage hook overload for cases without a default value.
4
+ *
5
+ * When no default value is provided, the hook returns nullable state that directly
6
+ * reflects the storage state. This is useful when you want to distinguish between
7
+ * "no value stored" and "default value applied".
5
8
  *
6
9
  * @template T - The type of value stored in the key storage
7
10
  * @param keyStorage - The KeyStorage instance to subscribe to and manage
8
- * @returns A tuple containing the current stored value and a function to update it
11
+ * @returns A tuple where the first element can be null if storage is empty,
12
+ * and the second element is a setter function to update the storage
9
13
  */
10
14
  export declare function useKeyStorage<T>(keyStorage: KeyStorage<T>): [T | null, (value: T) => void];
15
+ /**
16
+ * useKeyStorage hook overload for cases with a default value.
17
+ *
18
+ * When a default value is provided, the hook guarantees that the returned state
19
+ * will never be null. The default value is used when the storage is empty,
20
+ * providing a seamless experience for required state.
21
+ *
22
+ * @template T - The type of value stored in the key storage
23
+ * @param keyStorage - The KeyStorage instance to subscribe to and manage
24
+ * @param defaultValue - The default value to use when storage is empty.
25
+ * This value will be returned until the storage is explicitly set.
26
+ * @returns A tuple where the first element is guaranteed to be non-null (either
27
+ * the stored value or the default value), and the second element is a
28
+ * setter function to update the storage
29
+ */
30
+ export declare function useKeyStorage<T>(keyStorage: KeyStorage<T>, defaultValue: T): [T, (value: T) => void];
11
31
  //# sourceMappingURL=useKeyStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyStorage.d.ts","sourceRoot":"","sources":["../../src/storage/useKeyStorage.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GACxB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAiBhC"}
1
+ {"version":3,"file":"useKeyStorage.d.ts","sourceRoot":"","sources":["../../src/storage/useKeyStorage.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GACxB,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAElC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,YAAY,EAAE,CAAC,GACd,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ahoo-wang/fetcher-react",
3
- "version": "2.9.5",
3
+ "version": "2.9.8",
4
4
  "description": "React integration for Fetcher HTTP client. Provides React Hooks and components for seamless data fetching with automatic re-rendering and loading states.",
5
5
  "keywords": [
6
6
  "fetch",