@choksheak/react-utils 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/NoSSR.cjs +1 -1
  2. package/NoSSR.d.ts +7 -3
  3. package/NoSSR.min.cjs +1 -1
  4. package/NoSSR.min.mjs +1 -1
  5. package/NoSSR.mjs +1 -1
  6. package/{chunk-33UMQLKY.mjs → chunk-4235I4VO.mjs} +1 -10
  7. package/{chunk-GPV6JIQK.mjs → chunk-4J7TN5JN.mjs} +1 -1
  8. package/chunk-BBCGQMWI.min.cjs +2 -0
  9. package/chunk-BBCGQMWI.min.cjs.map +1 -0
  10. package/{chunk-5DO7KC3L.cjs → chunk-CYTO5EZE.cjs} +2 -11
  11. package/chunk-GKNOICX3.cjs +561 -0
  12. package/chunk-HRE7YPUJ.min.mjs +2 -0
  13. package/chunk-IS3BZTWE.cjs +35 -0
  14. package/chunk-JOHZV3FD.min.cjs +2 -0
  15. package/{chunk-F5L32IUC.min.cjs.map → chunk-JOHZV3FD.min.cjs.map} +1 -1
  16. package/chunk-KGN4HQPP.min.cjs +2 -0
  17. package/chunk-KGN4HQPP.min.cjs.map +1 -0
  18. package/chunk-NL4FU2MJ.min.mjs +2 -0
  19. package/chunk-NL4FU2MJ.min.mjs.map +1 -0
  20. package/chunk-R7POPVJR.mjs +35 -0
  21. package/chunk-TI3FMEYP.min.mjs +2 -0
  22. package/{chunk-RM4ZGGZ2.min.mjs.map → chunk-TI3FMEYP.min.mjs.map} +1 -1
  23. package/chunk-U7RD7B3N.min.mjs +2 -0
  24. package/chunk-U7RD7B3N.min.mjs.map +1 -0
  25. package/{chunk-WVLPJPWG.cjs → chunk-WXLUEDBO.cjs} +3 -3
  26. package/chunk-X6EKF4N7.mjs +561 -0
  27. package/chunk-ZCDXPV3A.min.cjs +2 -0
  28. package/chunk-ZCDXPV3A.min.cjs.map +1 -0
  29. package/dist-O6NNX4Y3.min.mjs +2 -0
  30. package/dist-O6NNX4Y3.min.mjs.map +1 -0
  31. package/dist-SEGTJ72R.min.cjs +2 -0
  32. package/dist-SEGTJ72R.min.cjs.map +1 -0
  33. package/dist-UKP7SPWZ.cjs +545 -0
  34. package/dist-YXYQDOH5.mjs +545 -0
  35. package/index.cjs +43 -0
  36. package/index.d.cts +8 -0
  37. package/index.d.ts +8 -0
  38. package/index.min.cjs +2 -0
  39. package/index.min.cjs.map +1 -0
  40. package/index.min.mjs +2 -0
  41. package/index.mjs +43 -0
  42. package/magic-string.es-5QZEPJXJ.min.mjs +14 -0
  43. package/magic-string.es-5QZEPJXJ.min.mjs.map +1 -0
  44. package/magic-string.es-EREYSDLL.mjs +1308 -0
  45. package/magic-string.es-FXUUD55Y.min.cjs +14 -0
  46. package/magic-string.es-FXUUD55Y.min.cjs.map +1 -0
  47. package/magic-string.es-HC5PDAU3.cjs +1308 -0
  48. package/package.json +73 -204
  49. package/sharedQuery.cjs +7 -553
  50. package/{sharedQuery.d.mts → sharedQuery.d.cts} +5 -4
  51. package/sharedQuery.d.ts +26 -19
  52. package/sharedQuery.min.cjs +1 -1
  53. package/sharedQuery.min.cjs.map +1 -1
  54. package/sharedQuery.min.mjs +1 -1
  55. package/sharedQuery.min.mjs.map +1 -1
  56. package/sharedQuery.mjs +9 -555
  57. package/sharedState.cjs +1 -1
  58. package/{sharedState.d.mts → sharedState.d.cts} +1 -1
  59. package/sharedState.d.ts +17 -11
  60. package/sharedState.min.cjs +1 -1
  61. package/sharedState.min.mjs +1 -1
  62. package/sharedState.mjs +1 -1
  63. package/storage.cjs +1 -1
  64. package/storage.d.ts +13 -9
  65. package/storage.min.cjs +1 -1
  66. package/storage.min.mjs +1 -1
  67. package/storage.mjs +1 -1
  68. package/stringify.cjs +3 -5
  69. package/stringify.d.ts +3 -1
  70. package/stringify.min.cjs +1 -1
  71. package/stringify.min.cjs.map +1 -1
  72. package/stringify.min.mjs +1 -1
  73. package/stringify.mjs +2 -4
  74. package/useDeepMemo.cjs +3 -3
  75. package/useDeepMemo.d.ts +3 -1
  76. package/useDeepMemo.min.cjs +1 -1
  77. package/useDeepMemo.min.mjs +1 -1
  78. package/useDeepMemo.mjs +2 -2
  79. package/chunk-3V7WBGWQ.mjs +0 -16
  80. package/chunk-6ZZ54XM5.min.mjs +0 -2
  81. package/chunk-6ZZ54XM5.min.mjs.map +0 -1
  82. package/chunk-74BS2FAO.cjs +0 -12
  83. package/chunk-F5L32IUC.min.cjs +0 -2
  84. package/chunk-KE3RXVMS.min.cjs +0 -2
  85. package/chunk-KE3RXVMS.min.cjs.map +0 -1
  86. package/chunk-MWDH7YON.min.mjs +0 -2
  87. package/chunk-O3RBYG3W.min.cjs +0 -2
  88. package/chunk-O3RBYG3W.min.cjs.map +0 -1
  89. package/chunk-RM4ZGGZ2.min.mjs +0 -2
  90. package/chunk-TEZPF6BG.min.cjs +0 -2
  91. package/chunk-TEZPF6BG.min.cjs.map +0 -1
  92. package/chunk-UFJNJ3WV.cjs +0 -16
  93. package/chunk-V7L3UICC.min.mjs +0 -2
  94. package/chunk-V7L3UICC.min.mjs.map +0 -1
  95. package/chunk-X6BYQHVC.mjs +0 -12
  96. package/fetcher.cjs +0 -9
  97. package/fetcher.d.mts +0 -36
  98. package/fetcher.d.ts +0 -32
  99. package/fetcher.min.cjs +0 -2
  100. package/fetcher.min.cjs.map +0 -1
  101. package/fetcher.min.mjs +0 -2
  102. package/fetcher.mjs +0 -9
  103. /package/{NoSSR.d.mts → NoSSR.d.cts} +0 -0
  104. /package/{chunk-MWDH7YON.min.mjs.map → chunk-HRE7YPUJ.min.mjs.map} +0 -0
  105. /package/{fetcher.min.mjs.map → index.min.mjs.map} +0 -0
  106. /package/{storage.d.mts → storage.d.cts} +0 -0
  107. /package/{stringify.d.mts → stringify.d.cts} +0 -0
  108. /package/{useDeepMemo.d.mts → useDeepMemo.d.cts} +0 -0
@@ -0,0 +1,561 @@
1
+ import {
2
+ sharedState,
3
+ useSharedState
4
+ } from "./chunk-KRXENFK3.mjs";
5
+ import {
6
+ stringifyDeterministicForKeys
7
+ } from "./chunk-4235I4VO.mjs";
8
+ import {
9
+ useDeepMemo
10
+ } from "./chunk-4J7TN5JN.mjs";
11
+
12
+ // src/sharedQuery.ts
13
+ import { http, retries } from "@choksheak/ts-utils/http";
14
+ import getByteSize from "object-sizeof";
15
+ import {
16
+ useCallback,
17
+ useEffect,
18
+ useMemo,
19
+ useRef,
20
+ useState
21
+ } from "react";
22
+ import XXH from "xxhashjs";
23
+ var SharedQueryConfig = {
24
+ /** Refetch on every page load. */
25
+ staleMs: 0,
26
+ /** Keep in cache for a long time. */
27
+ expiryMs: 30 * 864e5,
28
+ /** Always refetch automatically if the data is stale. */
29
+ refetchOnStale: true,
30
+ /** No default persistence configured. */
31
+ persistTo: void 0,
32
+ /** 100 is not too large, but please tweak accordingly. */
33
+ maxSize: 100,
34
+ /** 100kb limit before discarding old records. */
35
+ maxBytes: 1e5,
36
+ /** Default to log to console. */
37
+ log: (...args) => console.log("[sharedQuery]", ...args)
38
+ };
39
+ function configureSharedQuery(config) {
40
+ Object.assign(SharedQueryConfig, config);
41
+ }
42
+ var seenQueryNames = /* @__PURE__ */ new Set();
43
+ function sharedQuery(options) {
44
+ const url = options.url || "";
45
+ const queryName = options.queryName || url;
46
+ if (!queryName) {
47
+ throw new Error(`Either queryName or url must be specified.`);
48
+ }
49
+ if (seenQueryNames.has(queryName)) {
50
+ throw new Error(`Duplicate shared query name "${queryName}"`);
51
+ }
52
+ seenQueryNames.add(queryName);
53
+ const inflightQueries = /* @__PURE__ */ new Map();
54
+ const mountedKeys = /* @__PURE__ */ new Map();
55
+ let queryFn;
56
+ if (options.queryFn) {
57
+ queryFn = options.queryFn;
58
+ } else if (url) {
59
+ const fetcher = http.use(retries());
60
+ queryFn = async (...args) => {
61
+ let params = "";
62
+ const firstArg = args?.[0];
63
+ if (firstArg) {
64
+ if (typeof firstArg === "string") {
65
+ params = firstArg;
66
+ } else if (typeof firstArg === "object") {
67
+ const entries = [];
68
+ for (const [k, v] of Object.entries(firstArg)) {
69
+ if (v === void 0) continue;
70
+ if (Array.isArray(v)) {
71
+ for (const item of v) {
72
+ if (item === void 0) continue;
73
+ entries.push([k, String(item)]);
74
+ }
75
+ } else {
76
+ entries.push([k, String(v)]);
77
+ }
78
+ }
79
+ params = new URLSearchParams(entries).toString();
80
+ }
81
+ if (params) {
82
+ if (url.includes("?")) {
83
+ params = "&" + params;
84
+ } else {
85
+ params = "?" + params;
86
+ }
87
+ }
88
+ }
89
+ const response = await fetcher.get(url + params);
90
+ return await response.json();
91
+ };
92
+ } else {
93
+ throw new Error(`Either queryFn or url must be specified`);
94
+ }
95
+ const refetchFn = options.refetchFn;
96
+ const staleMs = options?.staleMs ?? SharedQueryConfig.staleMs;
97
+ const expiryMs = options?.expiryMs ?? SharedQueryConfig.expiryMs;
98
+ const refetchOnStale = options?.refetchOnStale ?? SharedQueryConfig.refetchOnStale;
99
+ const store = options.store;
100
+ if (store) {
101
+ if ("persistTo" in store && store.isValid) {
102
+ const isValid = store.isValid;
103
+ options = {
104
+ ...options,
105
+ store: {
106
+ ...store,
107
+ isValid: (u) => {
108
+ if (!u || typeof u !== "object") {
109
+ return false;
110
+ }
111
+ for (const v of Object.values(u)) {
112
+ if (!v || typeof v !== "object" || !("data" in v) || !("dataUpdatedMs" in v) || !("lastUpdatedMs" in v) || typeof v.dataUpdatedMs !== "number" || typeof v.lastUpdatedMs !== "number" || !isValid(v.data)) {
113
+ return false;
114
+ }
115
+ }
116
+ return true;
117
+ }
118
+ }
119
+ };
120
+ }
121
+ } else {
122
+ const persistTo = options.persistTo ?? SharedQueryConfig.persistTo;
123
+ if (persistTo) {
124
+ options = {
125
+ ...options,
126
+ store: {
127
+ persistTo,
128
+ key: queryName,
129
+ expiryMs
130
+ }
131
+ };
132
+ }
133
+ }
134
+ const maxSize = options?.maxSize ?? SharedQueryConfig.maxSize;
135
+ const maxBytes = options?.maxBytes ?? SharedQueryConfig.maxBytes;
136
+ const keepLastNonEmptyData = Boolean(options?.keepLastNonEmptyData);
137
+ const log = options?.log ?? SharedQueryConfig.log;
138
+ const queryState = sharedState(
139
+ {},
140
+ // defaultValue
141
+ options
142
+ );
143
+ function isStale(dataUpdatedMs) {
144
+ if (staleMs === 0) return true;
145
+ const ageMs = Date.now() - dataUpdatedMs;
146
+ return ageMs > staleMs;
147
+ }
148
+ function isExpired(dataUpdatedMs) {
149
+ if (expiryMs === 0) return false;
150
+ const ageMs = Date.now() - dataUpdatedMs;
151
+ return ageMs > expiryMs;
152
+ }
153
+ function enforceSizeLimit() {
154
+ if (!maxSize && !maxBytes) {
155
+ return;
156
+ }
157
+ const oldState = queryState.getSnapshot();
158
+ const oldSize = Object.keys(oldState).length;
159
+ if (oldSize <= 1) {
160
+ return;
161
+ }
162
+ const oldByteSize = getByteSize(oldState);
163
+ let numToCut = maxSize ? oldSize - maxSize : 0;
164
+ let bytesToCut = maxBytes ? oldByteSize - maxBytes : 0;
165
+ if (numToCut <= 0 && bytesToCut <= 0) {
166
+ log(
167
+ `No need to trim data for ${queryName}: size=${oldSize} (limit=${maxSize}), byteSize=${oldByteSize.toLocaleString()} (limit=${maxBytes.toLocaleString()})`
168
+ );
169
+ return;
170
+ }
171
+ log(
172
+ `Need to trim ${queryName}: numToCut=${numToCut}, bytesToCut=${bytesToCut}`
173
+ );
174
+ const newState = { ...oldState };
175
+ let needUpdate = false;
176
+ const deleteKeyIfNotMounted = (key, expired) => {
177
+ if (mountedKeys.has(key)) {
178
+ log(`Cannot clean up ${key} as it is mounted`);
179
+ return;
180
+ }
181
+ const byteSize = getByteSize(key) + getByteSize(newState[key]);
182
+ log(
183
+ `Cleaning up unmounted${expired ? ", expired" : ""} ${key} (byteSize=${byteSize.toLocaleString()})`
184
+ );
185
+ numToCut--;
186
+ bytesToCut -= byteSize;
187
+ delete newState[key];
188
+ needUpdate = true;
189
+ };
190
+ let entriesByTimeAscending = Object.entries(newState).sort(
191
+ (entry1, entry2) => entry1[1].lastUpdatedMs - entry2[1].lastUpdatedMs
192
+ );
193
+ for (const [key] of entriesByTimeAscending) {
194
+ if (!isExpired(newState[key].lastUpdatedMs)) {
195
+ break;
196
+ }
197
+ deleteKeyIfNotMounted(key, true);
198
+ }
199
+ if (numToCut > 0 || bytesToCut > 0) {
200
+ if (needUpdate) {
201
+ entriesByTimeAscending = Object.entries(newState).sort(
202
+ (entry1, entry2) => entry1[1].lastUpdatedMs - entry2[1].lastUpdatedMs
203
+ );
204
+ }
205
+ for (const [key] of entriesByTimeAscending) {
206
+ deleteKeyIfNotMounted(key, false);
207
+ if (numToCut <= 0 && bytesToCut <= 0) {
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ if (!needUpdate) {
213
+ log(
214
+ `No trimmable entries found for ${queryName}: size=${oldSize} (limit=${maxSize}), byteSize=${oldByteSize.toLocaleString()} (limit=${maxBytes.toLocaleString()})`
215
+ );
216
+ return;
217
+ }
218
+ queryState.setValue(newState);
219
+ log(
220
+ `Trimmed data for ${queryName}: size=[${oldSize} -> ${Object.keys(newState).length}] (limit=${maxSize}), byteSize=[${oldByteSize.toLocaleString()} -> ${getByteSize(newState).toLocaleString()}] (limit=${maxBytes.toLocaleString()})`
221
+ );
222
+ }
223
+ function setData(queryKey, data, dataUpdatedMs = Date.now()) {
224
+ const entry = {
225
+ lastUpdatedMs: Date.now(),
226
+ loading: false,
227
+ data,
228
+ dataUpdatedMs
229
+ };
230
+ queryState.setValue((prev) => ({ ...prev, [queryKey]: entry }));
231
+ enforceSizeLimit();
232
+ }
233
+ async function startFetching(queryKey, queryType, args) {
234
+ log(`Start fetching ${queryKey}, queryType=${queryType}`);
235
+ try {
236
+ const data = await (queryType === "refetch" && refetchFn ? refetchFn(...args) : queryFn(...args));
237
+ log(`Successfully fetched ${queryKey}`);
238
+ setData(queryKey, data, Date.now());
239
+ return data;
240
+ } catch (e) {
241
+ log(`Failed to fetch ${queryKey} for queryType=${queryType}: ${e}`);
242
+ throw e;
243
+ } finally {
244
+ inflightQueries.delete(queryKey);
245
+ }
246
+ }
247
+ function dedupedFetch(queryKey, queryType, ...args) {
248
+ const inflightQuery = inflightQueries.get(queryKey);
249
+ if (inflightQuery) {
250
+ log(
251
+ `Deduplicating inflight fetch for ${queryKey}, queryType=${queryType}`
252
+ );
253
+ return inflightQuery.promise;
254
+ }
255
+ const promise = startFetching(queryKey, queryType, args);
256
+ const abortController = new AbortController();
257
+ inflightQueries.set(queryKey, { promise, abortController });
258
+ return promise;
259
+ }
260
+ const obj = {
261
+ queryName,
262
+ queryFn,
263
+ refetchFn,
264
+ expiryMs,
265
+ staleMs,
266
+ refetchOnStale,
267
+ maxSize,
268
+ maxBytes,
269
+ keepLastNonEmptyData,
270
+ log,
271
+ queryState,
272
+ /** Returns a key to identify requests based on the given args. */
273
+ getQueryKey(args) {
274
+ let s = stringifyDeterministicForKeys(args);
275
+ if (s.length > 30) {
276
+ s = XXH.h32(s, 39406).toString(16).slice(2);
277
+ }
278
+ return queryName + ":" + s;
279
+ },
280
+ /**
281
+ * Get the AbortController to abort the inflight query (if any).
282
+ *
283
+ * Note that once you get the controller, you can also get the signal easily
284
+ * using `controller.signal`. So if you need both the controller and the
285
+ * signal, just use this function.
286
+ */
287
+ getAbortController(args) {
288
+ const queryKey = obj.getQueryKey(args);
289
+ return obj.getAbortControllerByKey(queryKey);
290
+ },
291
+ getAbortControllerByKey(queryKey) {
292
+ return inflightQueries.get(queryKey)?.abortController ?? null;
293
+ },
294
+ /**
295
+ * Get the AbortSignal to check for query abortions.
296
+ *
297
+ * Example using fetch:
298
+ * ```
299
+ * const getUserQuery = sharedQuery({
300
+ * queryName: "getUser",
301
+ * queryFn: (userId: string) => {
302
+ * // Get the signal for this current execution.
303
+ * const signal = getUserQuery.getAbortSignal([userId]);
304
+ *
305
+ * // Pass the signal to fetch so that it can be aborted.
306
+ * const response = await fetch(`/users/${userId}`, { signal });
307
+ *
308
+ * // Check for errors.
309
+ * if (!response.ok) {
310
+ * throw new Error(response.statusText);
311
+ * }
312
+ *
313
+ * // Return the data.
314
+ * return await response.json();
315
+ * },
316
+ * });
317
+ * ```
318
+ *
319
+ * Example using `http.ts`:
320
+ * ```
321
+ * const getUserQuery = sharedQuery({
322
+ * queryName: "getUser",
323
+ * queryFn: (userId: string) => {
324
+ * // Get the signal for this current execution.
325
+ * const signal = getUserQuery.getAbortSignal([userId]);
326
+ *
327
+ * // Pass the signal to fetch so that it can be aborted.
328
+ * const response = await http.get(`/users/${userId}`, { signal });
329
+ * return await response.json();
330
+ * },
331
+ * });
332
+ * ```
333
+ */
334
+ getAbortSignal(args) {
335
+ const queryKey = obj.getQueryKey(args);
336
+ return obj.getAbortSignalByKey(queryKey);
337
+ },
338
+ getAbortSignalByKey(queryKey) {
339
+ return obj.getAbortControllerByKey(queryKey)?.signal ?? null;
340
+ },
341
+ /** For cached data, we need to return the correct timestamps as well. */
342
+ async getCachedOrFetch(...args) {
343
+ const startMs = Date.now();
344
+ await queryState.readyPromise;
345
+ const waitedMs = Date.now() - startMs;
346
+ const queryKey = obj.getQueryKey(args);
347
+ const cached = queryState.getSnapshot()?.[queryKey];
348
+ if (waitedMs) {
349
+ log(`${queryKey}: Waited for ${waitedMs}ms before data is ready`);
350
+ }
351
+ if (cached?.data && !isExpired(cached.dataUpdatedMs ?? 0)) {
352
+ if (!isStale(cached.dataUpdatedMs ?? 0)) {
353
+ log(`Return fresh data ${queryKey} from cache without fetching`);
354
+ return cached;
355
+ }
356
+ if (refetchOnStale) {
357
+ log(`refetchOnStale for ${queryKey}`);
358
+ void dedupedFetch(queryKey, "query", ...args);
359
+ }
360
+ log(`Returning stale data for ${queryKey}`);
361
+ return cached;
362
+ }
363
+ const data = await dedupedFetch(queryKey, "query", ...args);
364
+ const now = Date.now();
365
+ return {
366
+ // Don't keep old error.
367
+ lastUpdatedMs: now,
368
+ loading: false,
369
+ data,
370
+ dataUpdatedMs: now
371
+ };
372
+ },
373
+ /** Get the entire stored entry for a query key. */
374
+ getQueryValue(queryKey) {
375
+ return queryState.getSnapshot()?.[queryKey];
376
+ },
377
+ /** Get the current stored data for a query key. */
378
+ getData(queryKey) {
379
+ const stateValue = queryState.getSnapshot()?.[queryKey];
380
+ if (stateValue?.lastUpdatedMs) {
381
+ if (isExpired(stateValue.lastUpdatedMs)) {
382
+ obj.deleteData(queryKey);
383
+ return void 0;
384
+ }
385
+ }
386
+ return stateValue?.data;
387
+ },
388
+ /** Set the data directly if the user obtained it from somewhere else. */
389
+ setData,
390
+ /**
391
+ * Do a new fetch even when the data is already cached, but don't fetch if
392
+ * another fetch is already inflight.
393
+ */
394
+ async updateFromSource(...args) {
395
+ const key = obj.getQueryKey(args);
396
+ return await dedupedFetch(key, "query", ...args);
397
+ },
398
+ /**
399
+ * Perform an explicit refetch. If `options.refetchFn` was not specified,
400
+ * then this would be identical to calling `obj.updateFromSource()`.
401
+ */
402
+ async refetch(...args) {
403
+ const key = obj.getQueryKey(args);
404
+ return await dedupedFetch(key, "refetch", ...args);
405
+ },
406
+ /** Delete the cached data for one set of arguments. */
407
+ deleteData(queryKey) {
408
+ const record = queryState.getSnapshot();
409
+ const clone = { ...record };
410
+ delete clone[queryKey];
411
+ queryState.setValue(clone);
412
+ const inflight = inflightQueries.get(queryKey);
413
+ if (inflight) {
414
+ inflightQueries.delete(queryKey);
415
+ inflight.abortController.abort("Deleted");
416
+ }
417
+ },
418
+ /** Delete all currently cached data & all inflight promises. */
419
+ clear() {
420
+ queryState.delete();
421
+ for (const { abortController } of Array.from(inflightQueries.values())) {
422
+ abortController.abort("Cleared");
423
+ }
424
+ inflightQueries.clear();
425
+ },
426
+ /** Keep track of mounted keys. */
427
+ mount(queryKey) {
428
+ mountedKeys.set(queryKey, (mountedKeys.get(queryKey) ?? 0) + 1);
429
+ },
430
+ /** Clean up mounted keys. */
431
+ unmount(queryKey) {
432
+ const count = mountedKeys.get(queryKey);
433
+ if (count === 1) {
434
+ mountedKeys.delete(queryKey);
435
+ } else {
436
+ mountedKeys.set(queryKey, (count ?? 0) - 1);
437
+ }
438
+ },
439
+ /**
440
+ * Discard the oldest entries if the size exceeds the limit. The last
441
+ * remaining record cannot be deleted no matter what the limit is.
442
+ */
443
+ enforceSizeLimit
444
+ };
445
+ return obj;
446
+ }
447
+ var DEFAULT_QUERY_STATE_ENTRY = {
448
+ lastUpdatedMs: 0,
449
+ loading: true
450
+ };
451
+ function useSharedQuery(query, ...args) {
452
+ const stableArgs = useDeepMemo(args);
453
+ const [queryState, setQueryState] = useSharedState(query.queryState);
454
+ const isMounted = useRef(true);
455
+ const queryKey = useMemo(
456
+ () => query.getQueryKey(stableArgs),
457
+ [query, stableArgs]
458
+ );
459
+ const queryStateValue = queryState[queryKey] ?? DEFAULT_QUERY_STATE_ENTRY;
460
+ const setQueryStateValue = useCallback(
461
+ (next) => {
462
+ setQueryState((prev) => {
463
+ const clone = { ...prev };
464
+ clone[queryKey] = typeof next === "function" ? next(clone[queryKey] ?? DEFAULT_QUERY_STATE_ENTRY) : next;
465
+ return clone;
466
+ });
467
+ },
468
+ [queryKey, setQueryState]
469
+ );
470
+ const [lastNonEmptyData, setLastNonEmptyData] = useState();
471
+ useEffect(() => {
472
+ if (query.keepLastNonEmptyData && queryStateValue.data !== void 0) {
473
+ setLastNonEmptyData(queryStateValue.data);
474
+ }
475
+ }, [query.keepLastNonEmptyData, queryStateValue.data]);
476
+ const execute = useCallback(
477
+ async (isRefetch) => {
478
+ query.log(
479
+ `Begin executing shared query ${queryKey}, isRefetch=${isRefetch}`
480
+ );
481
+ if (!isMounted.current) return;
482
+ setQueryStateValue((prev) => ({
483
+ // Keep old data and error.
484
+ ...prev,
485
+ lastUpdatedMs: Date.now(),
486
+ loading: true
487
+ }));
488
+ try {
489
+ let state;
490
+ if (isRefetch) {
491
+ const data = await query.refetch(...stableArgs);
492
+ const now = Date.now();
493
+ state = {
494
+ // Don't keep old error.
495
+ lastUpdatedMs: now,
496
+ loading: false,
497
+ data,
498
+ dataUpdatedMs: now
499
+ };
500
+ } else {
501
+ state = await query.getCachedOrFetch(...stableArgs);
502
+ }
503
+ if (!isMounted.current) return;
504
+ setQueryStateValue({ ...state, loading: false });
505
+ } catch (e) {
506
+ if (!isMounted.current) return;
507
+ const now = Date.now();
508
+ setQueryStateValue((prev) => ({
509
+ // Keep old data.
510
+ ...prev,
511
+ lastUpdatedMs: now,
512
+ loading: false,
513
+ error: e,
514
+ errorUpdatedMs: now
515
+ }));
516
+ }
517
+ },
518
+ [query, queryKey, setQueryStateValue, stableArgs]
519
+ );
520
+ useEffect(() => {
521
+ isMounted.current = true;
522
+ query.mount(queryKey);
523
+ void execute(false);
524
+ return () => {
525
+ isMounted.current = false;
526
+ query.unmount(queryKey);
527
+ };
528
+ }, [execute, query, queryKey]);
529
+ return useMemo(() => {
530
+ return {
531
+ ...queryStateValue,
532
+ // Fill with lastNonEmptyData when data is undefined.
533
+ data: queryStateValue.data !== void 0 ? queryStateValue.data : lastNonEmptyData,
534
+ latestData: queryStateValue.data,
535
+ // This works only if the user-given queryFn supports abort. If not,
536
+ // this function doesn't do anything, since we don't have any means to
537
+ // abort the running queryFn.
538
+ abortCurrentQuery: (reason) => {
539
+ const controller = query.getAbortControllerByKey(queryKey);
540
+ controller?.abort(reason);
541
+ return Boolean(controller);
542
+ },
543
+ refetch: () => {
544
+ return execute(true);
545
+ },
546
+ setData: (data, dataUpdatedMs) => {
547
+ query.setData(queryKey, data, dataUpdatedMs);
548
+ },
549
+ deleteData: () => {
550
+ query.deleteData(queryKey);
551
+ }
552
+ };
553
+ }, [execute, lastNonEmptyData, query, queryKey, queryStateValue]);
554
+ }
555
+
556
+ export {
557
+ SharedQueryConfig,
558
+ configureSharedQuery,
559
+ sharedQuery,
560
+ useSharedQuery
561
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var g=Object.create;var e=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),n= exports.b =(b,a)=>{for(var c in a)e(b,c,{get:a[c],enumerable:!0})},l=(b,a,c,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of i(a))!k.call(b,d)&&d!==c&&e(b,d,{get:()=>a[d],enumerable:!(f=h(a,d))||f.enumerable});return b};var o=(b,a,c)=>(c=b!=null?g(j(b)):{},l(a||!b||!b.__esModule?e(c,"default",{value:b,enumerable:!0}):c,b));exports.a = m; exports.b = n; exports.c = o;
2
+ //# sourceMappingURL=chunk-ZCDXPV3A.min.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/choksheaklau/src/react-utils/dist/chunk-ZCDXPV3A.min.cjs"],"names":[],"mappings":"AAAA,6EAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4CAA4B","file":"/Users/choksheaklau/src/react-utils/dist/chunk-ZCDXPV3A.min.cjs"}
@@ -0,0 +1,2 @@
1
+ import"./chunk-HRE7YPUJ.min.mjs";var R=Object.defineProperty,P=t=>{throw TypeError(t)},W=(t,e,r)=>e in t?R(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,I=(t,e,r)=>W(t,typeof e!="symbol"?e+"":e,r),q=(t,e,r)=>e.has(t)||P("Cannot "+r),m=(t,e,r)=>(q(t,e,"read from private field"),r?r.call(t):e.get(t)),E=(t,e,r)=>e.has(t)?P("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),w=(t,e,r,s)=>(q(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),x=(t,e,r,s)=>({set _(h){w(t,e,h,r)},get _(){return m(t,e,s)}}),B=class{constructor(t){I(this,"value"),I(this,"next"),this.value=t}},p,v,f,F=class{constructor(){E(this,p),E(this,v),E(this,f),this.clear()}enqueue(t){let e=new B(t);m(this,p)?(m(this,v).next=e,w(this,v,e)):(w(this,p,e),w(this,v,e)),x(this,f)._++}dequeue(){let t=m(this,p);if(t)return w(this,p,m(this,p).next),x(this,f)._--,t.value}clear(){w(this,p,void 0),w(this,v,void 0),w(this,f,0)}get size(){return m(this,f)}*[Symbol.iterator](){let t=m(this,p);for(;t;)yield t.value,t=t.next}};p=new WeakMap,v=new WeakMap,f=new WeakMap;function g(t){if(!((Number.isInteger(t)||t===Number.POSITIVE_INFINITY)&&t>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=new F,r=0,s=()=>{r--,e.size>0&&e.dequeue()()},h=async(n,l,c)=>{r++;let i=(async()=>n(...c))();l(i);try{await i}catch{}s()},u=(n,l,c)=>{e.enqueue(h.bind(void 0,n,l,c)),(async()=>(await Promise.resolve(),r<t&&e.size>0&&e.dequeue()()))()},o=(n,...l)=>new Promise(c=>{u(n,c,l)});return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.size},clearQueue:{value:()=>{e.clear()}}}),o}function a(t,e=null){let r=new Event(t);return e&&Object.defineProperty(r,"task",{value:e,enumerable:!0,writable:!1,configurable:!1}),r}var Q={1:12.71,2:4.303,3:3.182,4:2.776,5:2.571,6:2.447,7:2.365,8:2.306,9:2.262,10:2.228,11:2.201,12:2.179,13:2.16,14:2.145,15:2.131,16:2.12,17:2.11,18:2.101,19:2.093,20:2.086,21:2.08,22:2.074,23:2.069,24:2.064,25:2.06,26:2.056,27:2.052,28:2.048,29:2.045,30:2.042,31:2.0399,32:2.0378,33:2.0357,34:2.0336,35:2.0315,36:2.0294,37:2.0273,38:2.0252,39:2.0231,40:2.021,41:2.0198,42:2.0186,43:2.0174,44:2.0162,45:2.015,46:2.0138,47:2.0126,48:2.0114,49:2.0102,50:2.009,51:2.0081,52:2.0072,53:2.0063,54:2.0054,55:2.0045,56:2.0036,57:2.0027,58:2.0018,59:2.0009,60:2,61:1.9995,62:1.999,63:1.9985,64:1.998,65:1.9975,66:1.997,67:1.9965,68:1.996,69:1.9955,70:1.995,71:1.9945,72:1.994,73:1.9935,74:1.993,75:1.9925,76:1.992,77:1.9915,78:1.991,79:1.9905,80:1.99,81:1.9897,82:1.9894,83:1.9891,84:1.9888,85:1.9885,86:1.9882,87:1.9879,88:1.9876,89:1.9873,90:1.987,91:1.9867,92:1.9864,93:1.9861,94:1.9858,95:1.9855,96:1.9852,97:1.9849,98:1.9846,99:1.9843,100:1.984,101:1.9838,102:1.9836,103:1.9834,104:1.9832,105:1.983,106:1.9828,107:1.9826,108:1.9824,109:1.9822,110:1.982,111:1.9818,112:1.9816,113:1.9814,114:1.9812,115:1.9819,116:1.9808,117:1.9806,118:1.9804,119:1.9802,120:1.98,infinity:1.96},C=Q,V=t=>t/1e6,K=()=>V(Number(process.hrtime.bigint())),Y=()=>performance.now();function $(t){return t!==null&&typeof t=="object"&&typeof t.then=="function"}var D=(t,e)=>t.reduce((r,s)=>r+(s-e)**2,0)/(t.length-1)||0,G=(async()=>{}).constructor,H=t=>t.constructor===G,J=async t=>{if(H(t.fn))return!0;try{if(t.opts.beforeEach!=null)try{await t.opts.beforeEach.call(t)}catch{}let e=t.fn(),r=$(e);if(r)try{await e}catch{}if(t.opts.afterEach!=null)try{await t.opts.afterEach.call(t)}catch{}return r}catch{return!1}},L=class extends EventTarget{constructor(t,e,r,s={}){super(),this.runs=0,this.bench=t,this.name=e,this.fn=r,this.opts=s}async loop(t,e){var r;let s=this.bench.concurrency==="task",{threshold:h}=this.bench,u=0,o=[];if(this.opts.beforeAll!=null)try{await this.opts.beforeAll.call(this)}catch(i){return{error:i}}let n=await J(this),l=async()=>{this.opts.beforeEach!=null&&await this.opts.beforeEach.call(this);let i=0;if(n){let d=this.bench.now();await this.fn.call(this),i=this.bench.now()-d}else{let d=this.bench.now();this.fn.call(this),i=this.bench.now()-d}o.push(i),u+=i,this.opts.afterEach!=null&&await this.opts.afterEach.call(this)},c=g(h);try{let i=[];for(;(u<t||o.length+c.activeCount+c.pendingCount<e)&&!((r=this.bench.signal)!=null&&r.aborted);)s?i.push(c(l)):await l();i.length&&await Promise.all(i)}catch(i){return{error:i}}if(this.opts.afterAll!=null)try{await this.opts.afterAll.call(this)}catch(i){return{error:i}}return{samples:o}}async run(){var t,e;if((t=this.result)!=null&&t.error)return this;this.dispatchEvent(a("start",this)),await this.bench.setup(this,"run");let{samples:r,error:s}=await this.loop(this.bench.time,this.bench.iterations);if(this.bench.teardown(this,"run"),r){let h=r.reduce((b,y)=>b+y,0);this.runs=r.length,r.sort((b,y)=>b-y);let u=h/this.runs,o=1e3/u,n=r.length,l=n-1,c=r[0],i=r[l],d=h/r.length||0,k=D(r,d),T=Math.sqrt(k),_=T/Math.sqrt(n),N=C[String(Math.round(l)||1)]||C.infinity,M=_*N,z=M/d*100,S=r[Math.ceil(n*.75)-1],j=r[Math.ceil(n*.99)-1],O=r[Math.ceil(n*.995)-1],A=r[Math.ceil(n*.999)-1];if((e=this.bench.signal)!=null&&e.aborted)return this;this.setResult({totalTime:h,min:c,max:i,hz:o,period:u,samples:r,mean:d,variance:k,sd:T,sem:_,df:l,critical:N,moe:M,rme:z,p75:S,p99:j,p995:O,p999:A})}if(s){if(this.setResult({error:s}),this.bench.throws)throw s;this.dispatchEvent(a("error",this)),this.bench.dispatchEvent(a("error",this))}return this.dispatchEvent(a("cycle",this)),this.bench.dispatchEvent(a("cycle",this)),this.dispatchEvent(a("complete",this)),this}async warmup(){var t;if((t=this.result)!=null&&t.error)return;this.dispatchEvent(a("warmup",this)),await this.bench.setup(this,"warmup");let{error:e}=await this.loop(this.bench.warmupTime,this.bench.warmupIterations);if(this.bench.teardown(this,"warmup"),e&&(this.setResult({error:e}),this.bench.throws))throw e}addEventListener(t,e,r){super.addEventListener(t,e,r)}removeEventListener(t,e,r){super.removeEventListener(t,e,r)}setResult(t){this.result={...this.result,...t},Object.freeze(this.result)}reset(){this.dispatchEvent(a("reset",this)),this.runs=0,this.result=void 0}},U=class extends EventTarget{constructor(t={}){var e,r,s,h,u,o,n,l;super(),this._tasks=new Map,this._todos=new Map,this.concurrency=null,this.threshold=1/0,this.warmupTime=100,this.warmupIterations=5,this.time=500,this.iterations=10,this.now=Y,this.now=(e=t.now)!=null?e:this.now,this.warmupTime=(r=t.warmupTime)!=null?r:this.warmupTime,this.warmupIterations=(s=t.warmupIterations)!=null?s:this.warmupIterations,this.time=(h=t.time)!=null?h:this.time,this.iterations=(u=t.iterations)!=null?u:this.iterations,this.signal=t.signal,this.throws=(o=t.throws)!=null?o:!1,this.setup=(n=t.setup)!=null?n:()=>{},this.teardown=(l=t.teardown)!=null?l:()=>{},this.signal&&this.signal.addEventListener("abort",()=>{this.dispatchEvent(a("abort"))},{once:!0})}runTask(t){var e;return(e=this.signal)!=null&&e.aborted?t:t.run()}async run(){if(this.concurrency==="bench")return this.runConcurrently(this.threshold,this.concurrency);this.dispatchEvent(a("start"));let t=[];for(let e of[...this._tasks.values()])t.push(await this.runTask(e));return this.dispatchEvent(a("complete")),t}async runConcurrently(t=1/0,e="bench"){if(this.threshold=t,this.concurrency=e,e==="task")return this.run();this.dispatchEvent(a("start"));let r=g(t),s=[];for(let u of[...this._tasks.values()])s.push(r(()=>this.runTask(u)));let h=await Promise.all(s);return this.dispatchEvent(a("complete")),h}async warmup(){if(this.concurrency==="bench"){await this.warmupConcurrently(this.threshold,this.concurrency);return}this.dispatchEvent(a("warmup"));for(let[,t]of this._tasks)await t.warmup()}async warmupConcurrently(t=1/0,e="bench"){if(this.threshold=t,this.concurrency=e,e==="task"){await this.warmup();return}this.dispatchEvent(a("warmup"));let r=g(t),s=[];for(let[,h]of this._tasks)s.push(r(()=>h.warmup()));await Promise.all(s)}reset(){this.dispatchEvent(a("reset")),this._tasks.forEach(t=>{t.reset()})}add(t,e,r={}){let s=new L(this,t,e,r);return this._tasks.set(t,s),this.dispatchEvent(a("add",s)),this}todo(t,e=()=>{},r={}){let s=new L(this,t,e,r);return this._todos.set(t,s),this.dispatchEvent(a("todo",s)),this}remove(t){let e=this.getTask(t);return e&&(this.dispatchEvent(a("remove",e)),this._tasks.delete(t)),this}addEventListener(t,e,r){super.addEventListener(t,e,r)}removeEventListener(t,e,r){super.removeEventListener(t,e,r)}table(t){return this.tasks.map(e=>{if(e.result){if(e.result.error)throw e.result.error;return t?.(e)||{"Task Name":e.name,"ops/sec":e.result.error?"NaN":parseInt(e.result.hz.toString(),10).toLocaleString(),"Average Time (ns)":e.result.error?"NaN":e.result.mean*1e3*1e3,Margin:e.result.error?"NaN":`\xB1${e.result.rme.toFixed(2)}%`,Samples:e.result.error?"NaN":e.result.samples.length}}return null})}get results(){return[...this._tasks.values()].map(t=>t.result)}get tasks(){return[...this._tasks.values()]}get todos(){return[...this._todos.values()]}getTask(t){return this._tasks.get(t)}};export{U as Bench,L as Task,K as hrtimeNow,Y as now};
2
+ //# sourceMappingURL=dist-O6NNX4Y3.min.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js"],"sourcesContent":["var $ = Object.defineProperty;\nvar C = (s) => {\n throw TypeError(s);\n};\nvar D = (s, n, t) => n in s ? $(s, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[n] = t;\nvar O = (s, n, t) => D(s, typeof n != \"symbol\" ? n + \"\" : n, t), q = (s, n, t) => n.has(s) || C(\"Cannot \" + t);\nvar d = (s, n, t) => (q(s, n, \"read from private field\"), t ? t.call(s) : n.get(s)), k = (s, n, t) => n.has(s) ? C(\"Cannot add the same private member more than once\") : n instanceof WeakSet ? n.add(s) : n.set(s, t), f = (s, n, t, e) => (q(s, n, \"write to private field\"), e ? e.call(s, t) : n.set(s, t), t);\nvar F = (s, n, t, e) => ({\n set _(r) {\n f(s, n, r, t);\n },\n get _() {\n return d(s, n, e);\n }\n});\n\n// node_modules/.pnpm/yocto-queue@1.0.0/node_modules/yocto-queue/index.js\nvar M = class {\n constructor(n) {\n O(this, \"value\");\n O(this, \"next\");\n this.value = n;\n }\n}, m, w, E, g = class {\n constructor() {\n k(this, m);\n k(this, w);\n k(this, E);\n this.clear();\n }\n enqueue(n) {\n let t = new M(n);\n d(this, m) ? (d(this, w).next = t, f(this, w, t)) : (f(this, m, t), f(this, w, t)), F(this, E)._++;\n }\n dequeue() {\n let n = d(this, m);\n if (n)\n return f(this, m, d(this, m).next), F(this, E)._--, n.value;\n }\n clear() {\n f(this, m, void 0), f(this, w, void 0), f(this, E, 0);\n }\n get size() {\n return d(this, E);\n }\n *[Symbol.iterator]() {\n let n = d(this, m);\n for (; n; )\n yield n.value, n = n.next;\n }\n};\nm = new WeakMap(), w = new WeakMap(), E = new WeakMap();\n\n// node_modules/.pnpm/p-limit@4.0.0/node_modules/p-limit/index.js\nfunction y(s) {\n if (!((Number.isInteger(s) || s === Number.POSITIVE_INFINITY) && s > 0))\n throw new TypeError(\"Expected `concurrency` to be a number from 1 and up\");\n let n = new g(), t = 0, e = () => {\n t--, n.size > 0 && n.dequeue()();\n }, r = async (h, p, a) => {\n t++;\n let l = (async () => h(...a))();\n p(l);\n try {\n await l;\n } catch (T) {\n }\n e();\n }, i = (h, p, a) => {\n n.enqueue(r.bind(void 0, h, p, a)), (async () => (await Promise.resolve(), t < s && n.size > 0 && n.dequeue()()))();\n }, c = (h, ...p) => new Promise((a) => {\n i(h, a, p);\n });\n return Object.defineProperties(c, {\n activeCount: {\n get: () => t\n },\n pendingCount: {\n get: () => n.size\n },\n clearQueue: {\n value: () => {\n n.clear();\n }\n }\n }), c;\n}\n\n// src/event.ts\nfunction o(s, n = null) {\n let t = new Event(s);\n return n && Object.defineProperty(t, \"task\", {\n value: n,\n enumerable: !0,\n writable: !1,\n configurable: !1\n }), t;\n}\n\n// src/constants.ts\nvar G = {\n 1: 12.71,\n 2: 4.303,\n 3: 3.182,\n 4: 2.776,\n 5: 2.571,\n 6: 2.447,\n 7: 2.365,\n 8: 2.306,\n 9: 2.262,\n 10: 2.228,\n 11: 2.201,\n 12: 2.179,\n 13: 2.16,\n 14: 2.145,\n 15: 2.131,\n 16: 2.12,\n 17: 2.11,\n 18: 2.101,\n 19: 2.093,\n 20: 2.086,\n 21: 2.08,\n 22: 2.074,\n 23: 2.069,\n 24: 2.064,\n 25: 2.06,\n 26: 2.056,\n 27: 2.052,\n 28: 2.048,\n 29: 2.045,\n 30: 2.042,\n 31: 2.0399,\n 32: 2.0378,\n 33: 2.0357,\n 34: 2.0336,\n 35: 2.0315,\n 36: 2.0294,\n 37: 2.0273,\n 38: 2.0252,\n 39: 2.0231,\n 40: 2.021,\n 41: 2.0198,\n 42: 2.0186,\n 43: 2.0174,\n 44: 2.0162,\n 45: 2.015,\n 46: 2.0138,\n 47: 2.0126,\n 48: 2.0114,\n 49: 2.0102,\n 50: 2.009,\n 51: 2.0081,\n 52: 2.0072,\n 53: 2.0063,\n 54: 2.0054,\n 55: 2.0045,\n 56: 2.0036,\n 57: 2.0027,\n 58: 2.0018,\n 59: 2.0009,\n 60: 2,\n 61: 1.9995,\n 62: 1.999,\n 63: 1.9985,\n 64: 1.998,\n 65: 1.9975,\n 66: 1.997,\n 67: 1.9965,\n 68: 1.996,\n 69: 1.9955,\n 70: 1.995,\n 71: 1.9945,\n 72: 1.994,\n 73: 1.9935,\n 74: 1.993,\n 75: 1.9925,\n 76: 1.992,\n 77: 1.9915,\n 78: 1.991,\n 79: 1.9905,\n 80: 1.99,\n 81: 1.9897,\n 82: 1.9894,\n 83: 1.9891,\n 84: 1.9888,\n 85: 1.9885,\n 86: 1.9882,\n 87: 1.9879,\n 88: 1.9876,\n 89: 1.9873,\n 90: 1.987,\n 91: 1.9867,\n 92: 1.9864,\n 93: 1.9861,\n 94: 1.9858,\n 95: 1.9855,\n 96: 1.9852,\n 97: 1.9849,\n 98: 1.9846,\n 99: 1.9843,\n 100: 1.984,\n 101: 1.9838,\n 102: 1.9836,\n 103: 1.9834,\n 104: 1.9832,\n 105: 1.983,\n 106: 1.9828,\n 107: 1.9826,\n 108: 1.9824,\n 109: 1.9822,\n 110: 1.982,\n 111: 1.9818,\n 112: 1.9816,\n 113: 1.9814,\n 114: 1.9812,\n 115: 1.9819,\n 116: 1.9808,\n 117: 1.9806,\n 118: 1.9804,\n 119: 1.9802,\n 120: 1.98,\n infinity: 1.96\n}, N = G;\n\n// src/utils.ts\nvar J = (s) => s / 1e6, U = () => J(Number(process.hrtime.bigint())), B = () => performance.now();\nfunction W(s) {\n return s !== null && typeof s == \"object\" && typeof s.then == \"function\";\n}\nvar S = (s, n) => s.reduce((e, r) => e + (r - n) ** 2, 0) / (s.length - 1) || 0, X = (async () => {\n}).constructor, Z = (s) => s.constructor === X, z = async (s) => {\n if (Z(s.fn))\n return !0;\n try {\n if (s.opts.beforeEach != null)\n try {\n await s.opts.beforeEach.call(s);\n } catch (e) {\n }\n let n = s.fn(), t = W(n);\n if (t)\n try {\n await n;\n } catch (e) {\n }\n if (s.opts.afterEach != null)\n try {\n await s.opts.afterEach.call(s);\n } catch (e) {\n }\n return t;\n } catch (n) {\n return !1;\n }\n};\n\n// src/task.ts\nvar b = class extends EventTarget {\n constructor(t, e, r, i = {}) {\n super();\n /*\n * the number of times the task\n * function has been executed\n */\n this.runs = 0;\n this.bench = t, this.name = e, this.fn = r, this.opts = i;\n }\n async loop(t, e) {\n var T;\n let r = this.bench.concurrency === \"task\", { threshold: i } = this.bench, c = 0, h = [];\n if (this.opts.beforeAll != null)\n try {\n await this.opts.beforeAll.call(this);\n } catch (u) {\n return { error: u };\n }\n let p = await z(this), a = async () => {\n this.opts.beforeEach != null && await this.opts.beforeEach.call(this);\n let u = 0;\n if (p) {\n let v = this.bench.now();\n await this.fn.call(this), u = this.bench.now() - v;\n } else {\n let v = this.bench.now();\n this.fn.call(this), u = this.bench.now() - v;\n }\n h.push(u), c += u, this.opts.afterEach != null && await this.opts.afterEach.call(this);\n }, l = y(i);\n try {\n let u = [];\n for (; (c < t || h.length + l.activeCount + l.pendingCount < e) && !((T = this.bench.signal) != null && T.aborted); )\n r ? u.push(l(a)) : await a();\n u.length && await Promise.all(u);\n } catch (u) {\n return { error: u };\n }\n if (this.opts.afterAll != null)\n try {\n await this.opts.afterAll.call(this);\n } catch (u) {\n return { error: u };\n }\n return { samples: h };\n }\n /**\n * run the current task and write the results in `Task.result` object\n */\n async run() {\n var r, i;\n if ((r = this.result) != null && r.error)\n return this;\n this.dispatchEvent(o(\"start\", this)), await this.bench.setup(this, \"run\");\n let { samples: t, error: e } = await this.loop(this.bench.time, this.bench.iterations);\n if (this.bench.teardown(this, \"run\"), t) {\n let c = t.reduce((L, A) => L + A, 0);\n this.runs = t.length, t.sort((L, A) => L - A);\n let h = c / this.runs, p = 1e3 / h, a = t.length, l = a - 1, T = t[0], u = t[l], v = c / t.length || 0, P = S(t, v), R = Math.sqrt(P), I = R / Math.sqrt(a), _ = N[String(Math.round(l) || 1)] || N.infinity, K = I * _, j = K / v * 100, H = t[Math.ceil(a * 0.75) - 1], V = t[Math.ceil(a * 0.99) - 1], Q = t[Math.ceil(a * 0.995) - 1], Y = t[Math.ceil(a * 0.999) - 1];\n if ((i = this.bench.signal) != null && i.aborted)\n return this;\n this.setResult({\n totalTime: c,\n min: T,\n max: u,\n hz: p,\n period: h,\n samples: t,\n mean: v,\n variance: P,\n sd: R,\n sem: I,\n df: l,\n critical: _,\n moe: K,\n rme: j,\n p75: H,\n p99: V,\n p995: Q,\n p999: Y\n });\n }\n if (e) {\n if (this.setResult({ error: e }), this.bench.throws)\n throw e;\n this.dispatchEvent(o(\"error\", this)), this.bench.dispatchEvent(o(\"error\", this));\n }\n return this.dispatchEvent(o(\"cycle\", this)), this.bench.dispatchEvent(o(\"cycle\", this)), this.dispatchEvent(o(\"complete\", this)), this;\n }\n /**\n * warmup the current task\n */\n async warmup() {\n var e;\n if ((e = this.result) != null && e.error)\n return;\n this.dispatchEvent(o(\"warmup\", this)), await this.bench.setup(this, \"warmup\");\n let { error: t } = await this.loop(this.bench.warmupTime, this.bench.warmupIterations);\n if (this.bench.teardown(this, \"warmup\"), t && (this.setResult({ error: t }), this.bench.throws))\n throw t;\n }\n addEventListener(t, e, r) {\n super.addEventListener(t, e, r);\n }\n removeEventListener(t, e, r) {\n super.removeEventListener(t, e, r);\n }\n /**\n * change the result object values\n */\n setResult(t) {\n this.result = { ...this.result, ...t }, Object.freeze(this.result);\n }\n /**\n * reset the task to make the `Task.runs` a zero-value and remove the `Task.result`\n * object\n */\n reset() {\n this.dispatchEvent(o(\"reset\", this)), this.runs = 0, this.result = void 0;\n }\n};\n\n// src/bench.ts\nvar x = class extends EventTarget {\n constructor(t = {}) {\n var e, r, i, c, h, p, a, l;\n super();\n /*\n * @private the task map\n */\n this._tasks = /* @__PURE__ */ new Map();\n this._todos = /* @__PURE__ */ new Map();\n /**\n * Executes tasks concurrently based on the specified concurrency mode.\n *\n * - When `mode` is set to `null` (default), concurrency is disabled.\n * - When `mode` is set to 'task', each task's iterations (calls of a task function) run concurrently.\n * - When `mode` is set to 'bench', different tasks within the bench run concurrently.\n */\n this.concurrency = null;\n /**\n * The maximum number of concurrent tasks to run. Defaults to Infinity.\n */\n this.threshold = 1 / 0;\n this.warmupTime = 100;\n this.warmupIterations = 5;\n this.time = 500;\n this.iterations = 10;\n this.now = B;\n this.now = (e = t.now) != null ? e : this.now, this.warmupTime = (r = t.warmupTime) != null ? r : this.warmupTime, this.warmupIterations = (i = t.warmupIterations) != null ? i : this.warmupIterations, this.time = (c = t.time) != null ? c : this.time, this.iterations = (h = t.iterations) != null ? h : this.iterations, this.signal = t.signal, this.throws = (p = t.throws) != null ? p : !1, this.setup = (a = t.setup) != null ? a : () => {\n }, this.teardown = (l = t.teardown) != null ? l : () => {\n }, this.signal && this.signal.addEventListener(\n \"abort\",\n () => {\n this.dispatchEvent(o(\"abort\"));\n },\n { once: !0 }\n );\n }\n runTask(t) {\n var e;\n return (e = this.signal) != null && e.aborted ? t : t.run();\n }\n /**\n * run the added tasks that were registered using the\n * {@link add} method.\n * Note: This method does not do any warmup. Call {@link warmup} for that.\n */\n async run() {\n if (this.concurrency === \"bench\")\n return this.runConcurrently(this.threshold, this.concurrency);\n this.dispatchEvent(o(\"start\"));\n let t = [];\n for (let e of [...this._tasks.values()])\n t.push(await this.runTask(e));\n return this.dispatchEvent(o(\"complete\")), t;\n }\n /**\n * See Bench.{@link concurrency}\n */\n async runConcurrently(t = 1 / 0, e = \"bench\") {\n if (this.threshold = t, this.concurrency = e, e === \"task\")\n return this.run();\n this.dispatchEvent(o(\"start\"));\n let r = y(t), i = [];\n for (let h of [...this._tasks.values()])\n i.push(r(() => this.runTask(h)));\n let c = await Promise.all(i);\n return this.dispatchEvent(o(\"complete\")), c;\n }\n /**\n * warmup the benchmark tasks.\n * This is not run by default by the {@link run} method.\n */\n async warmup() {\n if (this.concurrency === \"bench\") {\n await this.warmupConcurrently(this.threshold, this.concurrency);\n return;\n }\n this.dispatchEvent(o(\"warmup\"));\n for (let [, t] of this._tasks)\n await t.warmup();\n }\n /**\n * warmup the benchmark tasks concurrently.\n * This is not run by default by the {@link runConcurrently} method.\n */\n async warmupConcurrently(t = 1 / 0, e = \"bench\") {\n if (this.threshold = t, this.concurrency = e, e === \"task\") {\n await this.warmup();\n return;\n }\n this.dispatchEvent(o(\"warmup\"));\n let r = y(t), i = [];\n for (let [, c] of this._tasks)\n i.push(r(() => c.warmup()));\n await Promise.all(i);\n }\n /**\n * reset each task and remove its result\n */\n reset() {\n this.dispatchEvent(o(\"reset\")), this._tasks.forEach((t) => {\n t.reset();\n });\n }\n /**\n * add a benchmark task to the task map\n */\n add(t, e, r = {}) {\n let i = new b(this, t, e, r);\n return this._tasks.set(t, i), this.dispatchEvent(o(\"add\", i)), this;\n }\n /**\n * add a benchmark todo to the todo map\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n todo(t, e = () => {\n }, r = {}) {\n let i = new b(this, t, e, r);\n return this._todos.set(t, i), this.dispatchEvent(o(\"todo\", i)), this;\n }\n /**\n * remove a benchmark task from the task map\n */\n remove(t) {\n let e = this.getTask(t);\n return e && (this.dispatchEvent(o(\"remove\", e)), this._tasks.delete(t)), this;\n }\n addEventListener(t, e, r) {\n super.addEventListener(t, e, r);\n }\n removeEventListener(t, e, r) {\n super.removeEventListener(t, e, r);\n }\n /**\n * table of the tasks results\n */\n table(t) {\n return this.tasks.map((e) => {\n if (e.result) {\n if (e.result.error)\n throw e.result.error;\n return (t == null ? void 0 : t(e)) || {\n \"Task Name\": e.name,\n \"ops/sec\": e.result.error ? \"NaN\" : parseInt(e.result.hz.toString(), 10).toLocaleString(),\n \"Average Time (ns)\": e.result.error ? \"NaN\" : e.result.mean * 1e3 * 1e3,\n Margin: e.result.error ? \"NaN\" : `\\xB1${e.result.rme.toFixed(2)}%`,\n Samples: e.result.error ? \"NaN\" : e.result.samples.length\n };\n }\n return null;\n });\n }\n /**\n * (getter) tasks results as an array\n */\n get results() {\n return [...this._tasks.values()].map((t) => t.result);\n }\n /**\n * (getter) tasks as an array\n */\n get tasks() {\n return [...this._tasks.values()];\n }\n get todos() {\n return [...this._todos.values()];\n }\n /**\n * get a task based on the task name\n */\n getTask(t) {\n return this._tasks.get(t);\n }\n};\nexport {\n x as Bench,\n b as Task,\n U as hrtimeNow,\n B as now\n};\n"],"mappings":"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","names":["$","C","s","D","n","t","O","d","k","f","e","F","r","M","m","w","E","g","y","h","p","a","l","i","c","o","G","N","J","U","B","W","S","X","Z","z","b","T","u","v","L","A","P","R","I","_","K","j","H","V","Q","Y","x"]}