@pawover/kit 0.0.0-alpha.23 → 0.0.0-alpha.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks-react.d.ts +5 -6
- package/dist/hooks-react.d.ts.map +1 -1
- package/dist/hooks-react.js +70 -35
- package/dist/hooks-react.js.map +1 -1
- package/dist/index.d.ts +77 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +147 -116
- package/dist/index.js.map +1 -1
- package/metadata.json +4 -0
- package/package.json +2 -2
package/dist/hooks-react.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { DependencyList, EffectCallback } from "react";
|
|
1
|
+
import { DependencyList, EffectCallback, RefObject } from "react";
|
|
3
2
|
import { Breakpoint } from "@pawover/types";
|
|
4
3
|
|
|
5
4
|
//#region src/hooks/react/useCreation.d.ts
|
|
@@ -22,10 +21,10 @@ declare function useCreation<T>(factory: () => T, deps: DependencyList): T;
|
|
|
22
21
|
* @template T
|
|
23
22
|
* @param {T} value
|
|
24
23
|
*/
|
|
25
|
-
declare function useLatest<T>(value: T):
|
|
24
|
+
declare function useLatest<T>(value: T): RefObject<T>;
|
|
26
25
|
//#endregion
|
|
27
26
|
//#region src/hooks/react/useMount.d.ts
|
|
28
|
-
type MountCallback = EffectCallback |
|
|
27
|
+
type MountCallback = EffectCallback | AnyAsyncFunction;
|
|
29
28
|
/**
|
|
30
29
|
* 在组件初始化时执行的 Hook
|
|
31
30
|
* - 即使在严格模式下也只执行一次
|
|
@@ -82,9 +81,9 @@ declare function useResponsive(options?: ResponsiveHookOptions): {
|
|
|
82
81
|
* 在组件卸载时执行的 Hook
|
|
83
82
|
* @reference https://ahooks.js.org/zh-CN/hooks/use-unmount
|
|
84
83
|
*
|
|
85
|
-
* @param {
|
|
84
|
+
* @param {AnyFunction} effect 副作用函数
|
|
86
85
|
*/
|
|
87
|
-
declare function useUnmount(effect:
|
|
86
|
+
declare function useUnmount(effect: AnyFunction): void;
|
|
88
87
|
//#endregion
|
|
89
88
|
export { useCreation, useLatest, useMount, useResponsive, useUnmount };
|
|
90
89
|
//# sourceMappingURL=hooks-react.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-react.d.ts","names":[],"sources":["../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/enums/grid.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks-react.d.ts","names":[],"sources":["../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/enums/grid.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAiBA;;;;;iBAAgB,8BAA8B,SAAS,iBAAc;;;;;;AAArE;;;;AAAqE,iBCRrD,SDQqD,CAAA,CAAA,CAAA,CAAA,KAAA,ECRjC,CDQiC,CAAA,ECR7B,SDQ6B,CCRnB,CDQmB,CAAA;;;KEbhE,aAAA,GAAgB,iBAAiB;;;AFatC;;;;;iBEJgB,QAAA,SAAiB;;;KCbrB,sBAAA,GAAyB,oBAAoB;;cAE5C;;EHeG,SAAA,KAAW,EAAA,GAAA;EAAmB,SAAA,KAAA,EAAA,GAAA;EAAS,SAAA,EAAA,EAAA,GAAA;EAAc,SAAA,KAAA,EAAA,GAAA;EAAA,SAAA,KAAA,EAAA,GAAA;;;;ECRrD,SAAA,EAAA,EAAS,IAAA;EAAW,SAAA,KAAA,EAAA,IAAA;EAAc,SAAA,KAAA,EAAA,IAAA;EAAV,SAAA,EAAA,EAAA,IAAA;EAAS,SAAA,KAAA,EAAA,IAAA;;;;ACTc,CAAA;;;KEO1D,gBAAA,GAAmB,OAAO;UAQrB,qBAAA;EJEM;;;;;sBIIM;;qBAED;AHdrB;AAAoC,iBGgBpB,aAAA,CHhBoB,OAAA,CAAA,EGgBI,qBHhBJ,CAAA,EAAA;EAAc,UAAA,kBAAA;EAAV,OAAA,YAAA;EAAS,SAAA,EAAA,OAAA;;;;;;;;;ADQjD;;AAAuD,iBKPvC,UAAA,CLOuC,MAAA,EKPpB,WLOoB,CAAA,EAAA,IAAA"}
|
package/dist/hooks-react.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from "react";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/typeof/types.ts
|
|
4
|
-
const
|
|
4
|
+
const PROTOTYPE_TAGS = {
|
|
5
5
|
string: "[object String]",
|
|
6
6
|
number: "[object Number]",
|
|
7
7
|
boolean: "[object Boolean]",
|
|
@@ -10,8 +10,9 @@ const prototypeStrings = {
|
|
|
10
10
|
bigInt: "[object BigInt]",
|
|
11
11
|
symbol: "[object Symbol]",
|
|
12
12
|
function: "[object Function]",
|
|
13
|
-
generatorFunction: "[object GeneratorFunction]",
|
|
14
13
|
asyncFunction: "[object AsyncFunction]",
|
|
14
|
+
generatorFunction: "[object GeneratorFunction]",
|
|
15
|
+
asyncGeneratorFunction: "[object AsyncGeneratorFunction]",
|
|
15
16
|
promise: "[object Promise]",
|
|
16
17
|
null: "[object Null]",
|
|
17
18
|
undefined: "[object Undefined]",
|
|
@@ -31,10 +32,41 @@ function resolvePrototypeString(value) {
|
|
|
31
32
|
return Object.prototype.toString.call(value);
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/utils/typeof/isBoolean.ts
|
|
37
|
+
function isBoolean(value) {
|
|
38
|
+
return typeof value === "boolean";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/utils/typeof/isObject.ts
|
|
43
|
+
/**
|
|
44
|
+
* 判断是否为对象类型
|
|
45
|
+
* - 可选是否检查原型为 `Object.prototype`,防止原型链污染
|
|
46
|
+
*
|
|
47
|
+
* @param value - 待检查值
|
|
48
|
+
* @param prototypeCheck - 是否进行原型检查,默认 `true`
|
|
49
|
+
*/
|
|
50
|
+
function isObject(value, prototypeCheck = true) {
|
|
51
|
+
const check = resolvePrototypeString(value) === PROTOTYPE_TAGS.object;
|
|
52
|
+
return prototypeCheck ? check && Object.getPrototypeOf(value) === Object.prototype : check;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/utils/typeof/isDate.ts
|
|
57
|
+
function isDate(value) {
|
|
58
|
+
if (!isObject(value)) return false;
|
|
59
|
+
try {
|
|
60
|
+
return resolvePrototypeString(value) === PROTOTYPE_TAGS.date && typeof value["getTime"] === "function";
|
|
61
|
+
} catch (error) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
34
66
|
//#endregion
|
|
35
67
|
//#region src/utils/typeof/isEqual.ts
|
|
36
68
|
/**
|
|
37
|
-
*
|
|
69
|
+
* 检查给定的值是否相等
|
|
38
70
|
* @reference https://github.com/radashi-org/radashi/blob/main/src/typed/isEqual.ts
|
|
39
71
|
*
|
|
40
72
|
* @param {T} x
|
|
@@ -42,8 +74,8 @@ function resolvePrototypeString(value) {
|
|
|
42
74
|
*/
|
|
43
75
|
function isEqual(x, y) {
|
|
44
76
|
if (Object.is(x, y)) return true;
|
|
45
|
-
if (x
|
|
46
|
-
if (x
|
|
77
|
+
if (isDate(x) && isDate(y)) return x.getTime() === y.getTime();
|
|
78
|
+
if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString();
|
|
47
79
|
if (typeof x !== "object" || x === null || typeof y !== "object" || y === null) return false;
|
|
48
80
|
const keysX = Reflect.ownKeys(x);
|
|
49
81
|
const keysY = Reflect.ownKeys(y);
|
|
@@ -58,29 +90,34 @@ function isEqual(x, y) {
|
|
|
58
90
|
//#endregion
|
|
59
91
|
//#region src/utils/typeof/isFunction.ts
|
|
60
92
|
function isFunction(value) {
|
|
61
|
-
return
|
|
62
|
-
prototypeStrings.function,
|
|
63
|
-
prototypeStrings.generatorFunction,
|
|
64
|
-
prototypeStrings.asyncFunction
|
|
65
|
-
].includes(resolvePrototypeString(value));
|
|
93
|
+
return typeof value === "function";
|
|
66
94
|
}
|
|
67
95
|
|
|
68
96
|
//#endregion
|
|
69
|
-
//#region src/utils/typeof/
|
|
70
|
-
function
|
|
71
|
-
return resolvePrototypeString(value) ===
|
|
97
|
+
//#region src/utils/typeof/isPromise.ts
|
|
98
|
+
function isPromise(value) {
|
|
99
|
+
return resolvePrototypeString(value) === PROTOTYPE_TAGS.promise;
|
|
100
|
+
}
|
|
101
|
+
function isPromiseLike(value) {
|
|
102
|
+
return isPromise(value) || isObject(value) && isFunction(value["then"]);
|
|
72
103
|
}
|
|
73
104
|
|
|
74
105
|
//#endregion
|
|
75
|
-
//#region src/utils/typeof/
|
|
76
|
-
function
|
|
77
|
-
|
|
106
|
+
//#region src/utils/typeof/isRegExp.ts
|
|
107
|
+
function isRegExp(value) {
|
|
108
|
+
if (!isObject(value)) return false;
|
|
109
|
+
try {
|
|
110
|
+
const regex = value;
|
|
111
|
+
return resolvePrototypeString(value) === PROTOTYPE_TAGS.regExp && isString(regex.source) && isString(regex.flags) && isBoolean(regex.global) && isFunction(regex.test);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
78
115
|
}
|
|
79
116
|
|
|
80
117
|
//#endregion
|
|
81
|
-
//#region src/utils/typeof/
|
|
82
|
-
function
|
|
83
|
-
return
|
|
118
|
+
//#region src/utils/typeof/isString.ts
|
|
119
|
+
function isString(value) {
|
|
120
|
+
return typeof value === "string";
|
|
84
121
|
}
|
|
85
122
|
|
|
86
123
|
//#endregion
|
|
@@ -96,23 +133,21 @@ function objectKeys(obj) {
|
|
|
96
133
|
}
|
|
97
134
|
|
|
98
135
|
//#endregion
|
|
99
|
-
//#region
|
|
100
|
-
|
|
101
|
-
|
|
136
|
+
//#region src/utils/object/objectAssign.ts
|
|
137
|
+
/**
|
|
138
|
+
* 递归地将第二个对象合并到第一个对象的副本中
|
|
139
|
+
* - 只有普通对象才会递归合并
|
|
140
|
+
*
|
|
141
|
+
* @param initial 初始对象
|
|
142
|
+
* @param override 待合并对象
|
|
143
|
+
*/
|
|
144
|
+
function objectAssign(initial, override) {
|
|
145
|
+
if (!isObject(initial) || !isObject(override)) return initial ?? override ?? {};
|
|
102
146
|
const proto = Object.getPrototypeOf(initial);
|
|
103
|
-
const
|
|
104
|
-
for (const key of Object.keys(override))
|
|
105
|
-
return
|
|
147
|
+
const assigned = proto ? { ...initial } : Object.assign(Object.create(proto), initial);
|
|
148
|
+
for (const key of Object.keys(override)) assigned[key] = isObject(initial[key]) && isObject(override[key]) ? objectAssign(initial[key], override[key]) : override[key];
|
|
149
|
+
return assigned;
|
|
106
150
|
}
|
|
107
|
-
function isPlainObject(value) {
|
|
108
|
-
if (typeof value !== "object" || value === null) return false;
|
|
109
|
-
const prototype = Object.getPrototypeOf(value);
|
|
110
|
-
return prototype === Object.prototype || prototype === null || Object.getPrototypeOf(prototype) === null;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
//#endregion
|
|
114
|
-
//#region src/utils/object/objectAssign.ts
|
|
115
|
-
const objectAssign = assign;
|
|
116
151
|
|
|
117
152
|
//#endregion
|
|
118
153
|
//#region src/hooks/react/useCreation.ts
|
|
@@ -281,7 +316,7 @@ function calculate() {
|
|
|
281
316
|
* 在组件卸载时执行的 Hook
|
|
282
317
|
* @reference https://ahooks.js.org/zh-CN/hooks/use-unmount
|
|
283
318
|
*
|
|
284
|
-
* @param {
|
|
319
|
+
* @param {AnyFunction} effect 副作用函数
|
|
285
320
|
*/
|
|
286
321
|
function useUnmount(effect) {
|
|
287
322
|
if (!isFunction(effect)) console.error(`useUnmount expected parameter is a function, got ${typeof effect}`);
|
package/dist/hooks-react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-react.js","names":["defaultResponsiveValues: ResponsiveValues","responsiveConfig: ResponsiveConfig","responsiveValues: ResponsiveValues","tokens: BREAK_POINT_TOKEN_TYPE"],"sources":["../src/utils/typeof/types.ts","../src/utils/typeof/isEqual.ts","../src/utils/typeof/isFunction.ts","../src/utils/typeof/isObject.ts","../src/utils/typeof/isPromise.ts","../src/utils/typeof/isPromiseLike.ts","../src/utils/object/objectKeys.ts","../node_modules/.pnpm/radashi@12.7.1/node_modules/radashi/dist/radashi.js","../src/utils/object/objectAssign.ts","../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/enums/grid.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts"],"sourcesContent":["export const prototypeStrings = {\n string: \"[object String]\",\n number: \"[object Number]\",\n boolean: \"[object Boolean]\",\n object: \"[object Object]\",\n array: \"[object Array]\",\n bigInt: \"[object BigInt]\",\n symbol: \"[object Symbol]\",\n function: \"[object Function]\",\n generatorFunction: \"[object GeneratorFunction]\",\n asyncFunction: \"[object AsyncFunction]\",\n promise: \"[object Promise]\",\n null: \"[object Null]\",\n undefined: \"[object Undefined]\",\n date: \"[object Date]\",\n regExp: \"[object RegExp]\",\n error: \"[object Error]\",\n file: \"[object File]\",\n map: \"[object Map]\",\n weakMap: \"[object WeakMap]\",\n set: \"[object Set]\",\n weakSet: \"[object WeakSet]\",\n window: \"[object Window]\",\n webSocket: \"[object WebSocket]\",\n URLSearchParams: \"[object URLSearchParams]\",\n} as const;\n\nexport function resolvePrototypeString(value: unknown) {\n return Object.prototype.toString.call(value);\n}\n","/**\n * 判断给定的值是否相等\n * @reference https://github.com/radashi-org/radashi/blob/main/src/typed/isEqual.ts\n *\n * @param {T} x\n * @param {T} y\n */\nexport function isEqual<T>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n if (x instanceof Date && y instanceof Date) {\n return x.getTime() === y.getTime();\n }\n if (x instanceof RegExp && y instanceof RegExp) {\n return x.toString() === y.toString();\n }\n if (typeof x !== \"object\" || x === null || typeof y !== \"object\" || y === null) {\n return false;\n }\n\n const keysX = Reflect.ownKeys(x) as (keyof typeof x)[];\n const keysY = Reflect.ownKeys(y);\n if (keysX.length !== keysY.length) {\n return false;\n }\n\n for (const key of keysX) {\n if (!Reflect.has(y, key)) {\n return false;\n }\n if (!isEqual(x[key], y[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import { prototypeStrings, resolvePrototypeString } from \"./types\";\n\nexport function isFunction<T extends Func>(value: unknown): value is T {\n const prototypeList: string[] = [prototypeStrings.function, prototypeStrings.generatorFunction, prototypeStrings.asyncFunction];\n\n return prototypeList.includes(resolvePrototypeString(value));\n}\n","import { prototypeStrings, resolvePrototypeString } from \"./types\";\n\nexport function isObject<T extends Record<PropertyKey, unknown>>(value: unknown): value is T {\n return resolvePrototypeString(value) === prototypeStrings.object;\n}\n","import { prototypeStrings, resolvePrototypeString } from \"./types\";\n\nexport function isPromise<T extends Promise<unknown>>(value: unknown): value is T {\n return resolvePrototypeString(value) === prototypeStrings.promise;\n}\n","import { isFunction } from \"./isFunction\";\nimport { isObject } from \"./isObject\";\nimport { isPromise } from \"./isPromise\";\n\nexport function isPromiseLike<T extends PromiseLike<unknown>>(value: unknown): value is T {\n return isPromise(value) || (isObject(value) && isFunction(value[\"then\"]));\n}\n","/**\n * 返回对象的可枚举属性和方法的名称\n * - `Object.keys` 始终返回 `string[]` 类型,此函数可以返回具体类型\n *\n * @param obj 对象\n */\nexport function objectKeys<O extends AnyObject>(obj: O): (keyof O)[] {\n return Object.keys(obj);\n}\n","// src/array/alphabetical.ts\nfunction alphabetical(array, getter, direction = \"asc\") {\n if (!array) {\n return [];\n }\n const asc = (a, b) => `${getter(a)}`.localeCompare(getter(b));\n const dsc = (a, b) => `${getter(b)}`.localeCompare(getter(a));\n return array.slice().sort(direction === \"desc\" ? dsc : asc);\n}\n\n// src/array/boil.ts\nfunction boil(array, compareFunc) {\n if (!array || (array.length ?? 0) === 0) {\n return null;\n }\n return array.reduce(compareFunc);\n}\n\n// src/array/cartesianProduct.ts\nfunction cartesianProduct(...arrays) {\n let out = [[]];\n for (const array of arrays) {\n const result = [];\n for (const currentArray of out) {\n for (const item of array) {\n const currentArrayCopy = currentArray.slice();\n currentArrayCopy.push(item);\n result.push(currentArrayCopy);\n }\n }\n out = result;\n }\n return out;\n}\n\n// src/array/castArray.ts\nfunction castArray(value) {\n return Array.isArray(value) ? value.slice() : [value];\n}\n\n// src/array/castArrayIfExists.ts\nfunction castArrayIfExists(value) {\n return Array.isArray(value) ? value.slice() : value != null ? [value] : value;\n}\n\n// src/array/cluster.ts\nfunction cluster(array, size = 2) {\n const clusters = [];\n if (size > 0) {\n for (let i = 0; i < array.length; i += size) {\n clusters.push(array.slice(i, i + size));\n }\n }\n return clusters;\n}\n\n// src/array/concat.ts\nfunction concat(...values) {\n const result = [];\n const append = (value) => value != null && result.push(value);\n for (const value of values) {\n if (Array.isArray(value)) {\n value.forEach(append);\n } else {\n append(value);\n }\n }\n return result;\n}\n\n// src/array/counting.ts\nfunction counting(array, identity2) {\n if (!array) {\n return {};\n }\n return array.reduce(\n (acc, item) => {\n const id = identity2(item);\n acc[id] = (acc[id] ?? 0) + 1;\n return acc;\n },\n {}\n );\n}\n\n// src/array/diff.ts\nfunction diff(root, other, identity2 = (t) => t) {\n if (!(root == null ? void 0 : root.length) && !(other == null ? void 0 : other.length)) {\n return [];\n }\n if ((root == null ? void 0 : root.length) === void 0) {\n return [...other];\n }\n if (!(other == null ? void 0 : other.length)) {\n return [...root];\n }\n const bKeys = other.reduce(\n (acc, item) => {\n acc[identity2(item)] = true;\n return acc;\n },\n {}\n );\n return root.filter((a) => !bKeys[identity2(a)]);\n}\n\n// src/array/first.ts\nfunction first(array, defaultValue) {\n return (array == null ? void 0 : array.length) > 0 ? array[0] : defaultValue;\n}\n\n// src/array/flat.ts\nfunction flat(lists) {\n return lists.reduce((acc, list2) => {\n acc.push(...list2);\n return acc;\n }, []);\n}\n\n// src/array/fork.ts\nfunction fork(array, condition) {\n const forked = [[], []];\n if (array) {\n for (const item of array) {\n forked[condition(item) ? 0 : 1].push(item);\n }\n }\n return forked;\n}\n\n// src/array/group.ts\nfunction group(array, getGroupId) {\n const groups = /* @__PURE__ */ Object.create(null);\n array.forEach((item, index) => {\n const groupId = getGroupId(item, index);\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n groups[groupId].push(item);\n });\n return groups;\n}\n\n// src/array/intersects.ts\nfunction intersects(listA, listB, identity2) {\n if (!listA || !listB) {\n return false;\n }\n if (identity2) {\n const known = new Set(listA.map(identity2));\n return listB.some((item) => known.has(identity2(item)));\n }\n return listB.some((item) => listA.includes(item));\n}\n\n// src/array/isArrayEqual.ts\nfunction isArrayEqual(array1, array2) {\n if (array1 !== array2) {\n if (array1.length !== array2.length) {\n return false;\n }\n for (let i = 0; i < array1.length; i++) {\n if (!Object.is(array1[i], array2[i])) {\n return false;\n }\n }\n }\n return true;\n}\n\n// src/array/iterate.ts\nfunction iterate(count, func, initValue) {\n let value = initValue;\n for (let i = 1; i <= count; i++) {\n value = func(value, i);\n }\n return value;\n}\n\n// src/array/last.ts\nfunction last(array, defaultValue) {\n return (array == null ? void 0 : array.length) > 0 ? array[array.length - 1] : defaultValue;\n}\n\n// src/array/list.ts\nfunction list(startOrLength, end, valueOrMapper, step) {\n return Array.from(range(startOrLength, end, valueOrMapper, step));\n}\n\n// src/array/mapify.ts\nfunction mapify(array, getKey, getValue = (item) => item) {\n const map2 = /* @__PURE__ */ new Map();\n for (const [index, item] of array.entries()) {\n map2.set(getKey(item, index), getValue(item, index));\n }\n return map2;\n}\n\n// src/array/merge.ts\nfunction merge(prev, array, toKey) {\n if (!array && !prev) {\n return [];\n }\n if (!array) {\n return [...prev];\n }\n if (!prev) {\n return [];\n }\n if (!toKey) {\n return [...prev];\n }\n const keys2 = /* @__PURE__ */ new Map();\n for (const item of array) {\n keys2.set(toKey(item), item);\n }\n return prev.map((prevItem) => {\n const key = toKey(prevItem);\n return keys2.has(key) ? keys2.get(key) : prevItem;\n });\n}\n\n// src/array/objectify.ts\nfunction objectify(array, getKey, getValue = (item) => item) {\n return array.reduce(\n (acc, item, i) => {\n acc[getKey(item, i)] = getValue(item, i);\n return acc;\n },\n {}\n );\n}\n\n// src/array/pluck.ts\nfunction pluck(array, mappings) {\n return array.map(\n mappings ? (item) => mappings.map(\n (mapping) => isFunction(mapping) ? mapping(item) : item[mapping]\n ) : Object.values\n );\n}\n\n// src/array/remove.ts\nfunction remove(array, predicate) {\n return array.filter((item) => !predicate(item));\n}\n\n// src/array/replace.ts\nfunction replace(array, newItem, match) {\n if (!array) {\n return [];\n }\n if (newItem === void 0) {\n return [...array];\n }\n const out = array.slice();\n for (let index = 0; index < array.length; index++) {\n if (match(array[index], index)) {\n out[index] = newItem;\n break;\n }\n }\n return out;\n}\n\n// src/array/replaceOrAppend.ts\nfunction replaceOrAppend(array, newItem, match) {\n if (!array && !newItem) {\n return [];\n }\n if (!newItem) {\n return [...array];\n }\n if (!array) {\n return [newItem];\n }\n const out = array.slice();\n for (let index = 0; index < array.length; index++) {\n if (match(array[index], index)) {\n out[index] = newItem;\n return out;\n }\n }\n out.push(newItem);\n return out;\n}\n\n// src/array/select.ts\nfunction select(array, mapper, condition) {\n if (!array) {\n return [];\n }\n let mapped;\n return array.reduce((acc, item, index) => {\n if (condition) {\n condition(item, index) && acc.push(mapper(item, index));\n } else if ((mapped = mapper(item, index)) != null) {\n acc.push(mapped);\n }\n return acc;\n }, []);\n}\n\n// src/array/selectFirst.ts\nfunction selectFirst(array, mapper, condition) {\n if (!array) {\n return void 0;\n }\n let foundIndex = -1;\n const found = array.find((item, index) => {\n foundIndex = index;\n return condition ? condition(item, index) : mapper(item, index) != null;\n });\n return found === void 0 ? void 0 : mapper(found, foundIndex);\n}\n\n// src/array/shift.ts\nfunction shift(arr, n) {\n if (arr.length === 0) {\n return [...arr];\n }\n const shiftNumber = n % arr.length;\n if (shiftNumber === 0) {\n return [...arr];\n }\n return [...arr.slice(-shiftNumber, arr.length), ...arr.slice(0, -shiftNumber)];\n}\n\n// src/array/sift.ts\nfunction sift(array) {\n return (array == null ? void 0 : array.filter((x) => !!x)) ?? [];\n}\n\n// src/array/sort.ts\nfunction sort(array, getter = identity, desc = false) {\n if (!array) {\n return [];\n }\n const asc = (a, b) => getter(a) - getter(b);\n const dsc = (a, b) => getter(b) - getter(a);\n return array.slice().sort(desc === true ? dsc : asc);\n}\n\n// src/array/toggle.ts\nfunction toggle(array, item, toKey, options) {\n if (!array) {\n return item !== void 0 ? [item] : [];\n }\n if (item === void 0) {\n return [...array];\n }\n let matcher;\n if (toKey) {\n const key = toKey(item, -1);\n matcher = (x, idx) => toKey(x, idx) === key;\n } else {\n matcher = (x) => x === item;\n }\n const existing = array.find(matcher);\n if (existing !== void 0) {\n return array.filter((x, idx) => !matcher(x, idx));\n }\n return (options == null ? void 0 : options.strategy) === \"prepend\" ? [item, ...array] : [...array, item];\n}\n\n// src/array/unique.ts\nfunction unique(array, toKey) {\n if (toKey) {\n const keys2 = /* @__PURE__ */ new Set();\n return array.reduce((acc, item) => {\n const key = toKey(item);\n if (!keys2.has(key)) {\n keys2.add(key);\n acc.push(item);\n }\n return acc;\n }, []);\n }\n return [...new Set(array)];\n}\n\n// src/array/unzip.ts\nfunction unzip(arrays) {\n if (!arrays || !arrays.length) {\n return [];\n }\n const out = new Array(\n arrays.reduce((max2, arr) => Math.max(max2, arr.length), 0)\n );\n let index = 0;\n const get2 = (array) => array[index];\n for (; index < out.length; index++) {\n out[index] = Array.from(arrays, get2);\n }\n return out;\n}\n\n// src/array/zip.ts\nfunction zip(...arrays) {\n return unzip(arrays);\n}\n\n// src/array/zipToObject.ts\nfunction zipToObject(keys2, values) {\n if (!keys2 || !keys2.length) {\n return {};\n }\n const getValue = isFunction(values) ? values : isArray(values) ? (_k, i) => values[i] : (_k, _i) => values;\n return keys2.reduce(\n (acc, key, idx) => {\n acc[key] = getValue(key, idx);\n return acc;\n },\n {}\n );\n}\n\n// src/async/all.ts\nasync function all(input) {\n const errors = [];\n const onError = (err) => {\n errors.push(err);\n };\n let output;\n if (isArray(input)) {\n output = await Promise.all(\n input.map((value) => Promise.resolve(value).catch(onError))\n );\n } else {\n output = { ...input };\n await Promise.all(\n Object.keys(output).map(async (key) => {\n output[key] = await Promise.resolve(output[key]).catch(onError);\n })\n );\n }\n if (errors.length > 0) {\n throw new AggregateErrorOrPolyfill(errors);\n }\n return output;\n}\n\n// src/async/defer.ts\nasync function defer(func) {\n const callbacks = [];\n const register = (fn, options) => callbacks.push({\n fn,\n rethrow: (options == null ? void 0 : options.rethrow) ?? false\n });\n const [err, response] = await tryit(func)(register);\n for (const { fn, rethrow } of callbacks) {\n const [rethrown] = await tryit(fn)(err);\n if (rethrown && rethrow) {\n throw rethrown;\n }\n }\n if (err) {\n throw err;\n }\n return response;\n}\n\n// src/async/guard.ts\nfunction guard(func, shouldGuard) {\n const onError = (err) => {\n if (shouldGuard && !shouldGuard(err)) {\n throw err;\n }\n };\n try {\n const result = func();\n return result instanceof Promise ? result.catch(onError) : result;\n } catch (err) {\n return onError(err);\n }\n}\n\n// src/async/map.ts\nasync function map(array, asyncMapFunc) {\n if (!array) {\n return [];\n }\n const result = [];\n let index = 0;\n for (const value of array) {\n const newValue = await asyncMapFunc(value, index++);\n result.push(newValue);\n }\n return result;\n}\n\n// src/async/parallel.ts\nasync function parallel(options, array, func) {\n if (!array.length) {\n return [];\n }\n const work = array.map((item, index) => ({\n index,\n item\n }));\n let signal;\n if (isNumber(options)) {\n options = {\n limit: options\n };\n } else {\n signal = options.signal;\n signal == null ? void 0 : signal.throwIfAborted();\n }\n const processor = async (resolve) => {\n const results2 = [];\n while (!(signal == null ? void 0 : signal.aborted)) {\n const next = work.pop();\n if (!next) {\n break;\n }\n const [error, result] = await tryit(func)(next.item);\n results2.push({\n error,\n result,\n index: next.index\n });\n }\n return resolve(results2);\n };\n const queues = Promise.all(\n list(1, clamp(options.limit, 1, array.length)).map(\n () => new Promise(processor)\n )\n );\n let signalPromise;\n if (signal) {\n signalPromise = new Promise((_, reject) => {\n const onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort);\n queues.then(() => signal.removeEventListener(\"abort\", onAbort));\n });\n }\n const itemResults = await (signalPromise ? Promise.race([queues, signalPromise]) : queues);\n const [errors, results] = fork(\n sort(flat(itemResults), (r) => r.index),\n (x) => !!x.error\n );\n if (errors.length > 0) {\n throw new AggregateErrorOrPolyfill(errors.map((error) => error.error));\n }\n return results.map((r) => r.result);\n}\n\n// src/async/queueByKey.ts\nfunction queueByKey(asyncFn, keyFn) {\n const queues = /* @__PURE__ */ new Map();\n return async (...args) => {\n const key = keyFn(...args);\n const next = () => asyncFn(...args);\n const queue = (queues.get(key) || Promise.resolve()).then(next, next);\n queues.set(key, queue);\n const cleanup = () => queues.get(key) === queue && queues.delete(key);\n queue.then(cleanup, cleanup);\n return queue;\n };\n}\n\n// src/async/reduce.ts\nasync function reduce(array, reducer, initialValue) {\n if (!array) {\n array = [];\n }\n let index = 0;\n let acc = initialValue;\n if (acc === void 0 && arguments.length < 3) {\n if (!array.length) {\n throw new TypeError(\"Reduce of empty array with no initial value\");\n }\n acc = array[index++];\n }\n while (index < array.length) {\n acc = await reducer(acc, array[index], index++);\n }\n return acc;\n}\n\n// src/async/retry.ts\nasync function retry(options, func) {\n const times = (options == null ? void 0 : options.times) ?? 3;\n const delay = options == null ? void 0 : options.delay;\n const backoff = (options == null ? void 0 : options.backoff) ?? null;\n const signal = options == null ? void 0 : options.signal;\n let i = 0;\n while (true) {\n const [err, result] = await tryit(func)((err2) => {\n throw { _exited: err2 };\n });\n signal == null ? void 0 : signal.throwIfAborted();\n if (!err) {\n return result;\n }\n if (err._exited) {\n throw err._exited;\n }\n if (++i >= times) {\n throw err;\n }\n if (delay) {\n await sleep(delay);\n }\n if (backoff) {\n await sleep(backoff(i));\n }\n }\n}\n\n// src/async/sleep.ts\nfunction sleep(milliseconds) {\n return new Promise((res) => setTimeout(res, milliseconds));\n}\n\n// src/async/timeout.ts\nfunction timeout(ms, error) {\n return new Promise(\n (_, reject) => setTimeout(\n () => reject(isFunction(error) ? error() : new TimeoutError(error)),\n ms\n )\n );\n}\n\n// src/async/toResult.ts\nasync function toResult(promise) {\n try {\n const result = await promise;\n return [void 0, result];\n } catch (error) {\n if (isError(error)) {\n return [error, void 0];\n }\n throw error;\n }\n}\n\n// src/async/tryit.ts\nfunction tryit(func) {\n return (...args) => {\n try {\n const result = func(...args);\n return isPromise(result) ? result.then(\n (value) => [void 0, value],\n (err) => [err, void 0]\n ) : [void 0, result];\n } catch (err) {\n return [err, void 0];\n }\n };\n}\n\n// src/async/withResolvers.ts\nfunction withResolvers() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { resolve, reject, promise };\n}\n\n// src/curry/callable.ts\nfunction callable(obj, fn) {\n return new Proxy(Object.assign(fn.bind(null), obj), {\n get: (target, key) => target[key],\n set: (target, key, value) => {\n target[key] = value;\n return true;\n },\n apply: (target, _, args) => fn(Object.assign({}, target))(...args)\n });\n}\n\n// src/curry/chain.ts\nfunction chain(...funcs) {\n return (...args) => {\n return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args));\n };\n}\n\n// src/curry/compose.ts\nfunction compose(...funcs) {\n return funcs.reverse().reduce((acc, fn) => fn(acc));\n}\n\n// src/curry/debounce.ts\nfunction debounce({ delay, leading }, func) {\n let timer = void 0;\n let active = true;\n const debounced = (...args) => {\n if (active) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n active && func(...args);\n timer = void 0;\n }, delay);\n if (leading) {\n func(...args);\n leading = false;\n }\n } else {\n func(...args);\n }\n };\n debounced.isPending = () => {\n return timer !== void 0;\n };\n debounced.cancel = () => {\n active = false;\n };\n debounced.flush = (...args) => func(...args);\n return debounced;\n}\n\n// src/curry/flip.ts\nfunction flip(fn) {\n return (arg2, arg1, ...args) => fn(arg1, arg2, ...args);\n}\n\n// src/curry/memo.ts\nfunction memoize(cache, func, keyFunc, ttl) {\n return function callWithMemo(...args) {\n const key = keyFunc ? keyFunc(...args) : JSON.stringify({ args });\n const existing = cache[key];\n if (existing !== void 0) {\n if (!existing.exp) {\n return existing.value;\n }\n if (existing.exp > (/* @__PURE__ */ new Date()).getTime()) {\n return existing.value;\n }\n }\n const result = func(...args);\n cache[key] = {\n exp: ttl ? (/* @__PURE__ */ new Date()).getTime() + ttl : null,\n value: result\n };\n return result;\n };\n}\nfunction memo(func, options = {}) {\n return memoize({}, func, options.key ?? null, options.ttl ?? null);\n}\n\n// src/curry/memoLastCall.ts\nfunction memoLastCall(fn) {\n let lastArgs = null;\n let lastResult = null;\n return (...args) => {\n if (lastArgs && lastArgs.length === args.length && lastArgs.every((arg, i) => Object.is(arg, args[i]))) {\n return lastResult;\n }\n const result = fn(...args);\n lastArgs = args;\n lastResult = result;\n return result;\n };\n}\n\n// src/curry/once.ts\nvar once = /* @__PURE__ */ (() => {\n const onceSymbol = /* @__PURE__ */ Symbol();\n const once2 = (fn) => {\n const onceFn = function(...args) {\n if (onceFn[onceSymbol] === onceSymbol) {\n onceFn[onceSymbol] = fn.apply(this, args);\n }\n return onceFn[onceSymbol];\n };\n onceFn[onceSymbol] = onceSymbol;\n return onceFn;\n };\n once2.reset = (fn) => {\n fn[onceSymbol] = onceSymbol;\n };\n return once2;\n})();\n\n// src/curry/partial.ts\nfunction partial(fn, ...args) {\n return (...rest) => fn(...[...args, ...rest]);\n}\n\n// src/curry/partob.ts\nfunction partob(fn, argObj) {\n return (restObj) => fn({ ...argObj, ...restObj });\n}\n\n// src/curry/promiseChain.ts\nfunction promiseChain(...funcs) {\n return async (...args) => {\n let result = await funcs[0](...args);\n for (let i = 1; i < funcs.length; i++) {\n result = await funcs[i](result);\n }\n return result;\n };\n}\n\n// src/curry/proxied.ts\nfunction proxied(handler) {\n return new Proxy(\n {},\n {\n get: (target, propertyName) => handler(propertyName)\n }\n );\n}\n\n// src/curry/throttle.ts\nfunction throttle({ interval, trailing }, func) {\n let timer;\n let lastCalled = 0;\n let trailingArgs;\n const throttled = (...args) => {\n if (!isThrottled()) {\n trigger(...args);\n } else if (trailing) {\n trailingArgs = args;\n }\n };\n const isThrottled = () => Date.now() - lastCalled < interval;\n throttled.isThrottled = isThrottled;\n const trigger = throttled.trigger = (...args) => {\n func(...args);\n lastCalled = Date.now();\n if (trailing) {\n trailingArgs = void 0;\n clearTimeout(timer);\n timer = setTimeout(\n () => trailingArgs && trigger(...trailingArgs),\n interval\n );\n }\n };\n return throttled;\n}\n\n// src/function/always.ts\nfunction always(value) {\n return () => value;\n}\n\n// src/function/castComparator.ts\nfunction castComparator(mapping, compare, reverse) {\n const map2 = isFunction(mapping) ? mapping : (obj) => obj[mapping];\n const comparator = (left, right) => {\n const mappedLeft = map2(left);\n const mappedRight = map2(right);\n if (compare) {\n return compare(mappedLeft, mappedRight);\n }\n return mappedLeft > mappedRight ? 1 : mappedLeft < mappedRight ? -1 : 0;\n };\n return reverse ? flip(comparator) : comparator;\n}\n\n// src/function/castMapping.ts\nfunction castMapping(mapping) {\n return isFunction(mapping) ? mapping : mapping != null ? (input) => input[mapping] : (input) => input;\n}\n\n// src/function/identity.ts\nfunction identity(value) {\n return value;\n}\n\n// src/function/noop.ts\nfunction noop() {\n}\n\n// src/number/clamp.ts\nfunction clamp(n, min2, max2) {\n if (max2 != null && min2 != null && min2 > max2) {\n throw new Error(\"invalid clamp range\");\n }\n return max2 != null && n > max2 ? max2 : min2 != null && n < min2 ? min2 : n;\n}\n\n// src/number/inRange.ts\nfunction inRange(number, start, end) {\n const isTypeSafe = typeof number === \"number\" && typeof start === \"number\" && (typeof end === \"undefined\" || typeof end === \"number\");\n if (!isTypeSafe) {\n return false;\n }\n if (typeof end === \"undefined\") {\n end = start;\n start = 0;\n }\n return number >= Math.min(start, end) && number < Math.max(start, end);\n}\n\n// src/number/lerp.ts\nfunction lerp(from, to, amount) {\n return from + (to - from) * amount;\n}\n\n// src/number/max.ts\nfunction max(array, getter) {\n if (!array || (array.length ?? 0) === 0) {\n return null;\n }\n const get2 = getter ?? ((v) => v);\n return array.reduce((a, b) => get2(a) > get2(b) ? a : b);\n}\n\n// src/number/min.ts\nfunction min(array, getter) {\n if (!array || (array.length ?? 0) === 0) {\n return null;\n }\n const get2 = getter ?? ((v) => v);\n return array.reduce((a, b) => get2(a) < get2(b) ? a : b);\n}\n\n// src/number/parseDuration.ts\nfunction parseDuration(duration, options) {\n return new DurationParser(options).parse(duration);\n}\n\n// src/number/parseQuantity.ts\nfunction parseQuantity(quantity, options) {\n return new QuantityParser(options).parse(quantity);\n}\n\n// src/number/range.ts\nfunction* range(startOrLength, end, valueOrMapper = (i) => i, step = 1) {\n const mapper = isFunction(valueOrMapper) ? valueOrMapper : () => valueOrMapper;\n const start = end !== void 0 ? startOrLength : 0;\n const final = end ?? startOrLength;\n for (let i = start; i <= final; i += step) {\n yield mapper(i);\n }\n}\n\n// src/number/round.ts\nfunction round(value, precision, toInteger = Math.round) {\n if (precision) {\n const p = precision > 0 ? Math.min(precision, 292) : Math.max(precision, -323);\n let [q, e] = `${value}e`.split(\"e\");\n [q, e] = `${toInteger(+`${q}e${+e + p}`)}e`.split(\"e\");\n return +`${q}e${+e - p}`;\n }\n return toInteger(value);\n}\n\n// src/number/sum.ts\nfunction sum(array, fn) {\n return (array || []).reduce((acc, item) => acc + (fn ? fn(item) : item), 0);\n}\n\n// src/number/toFloat.ts\nfunction toFloat(value, defaultValue) {\n const parsedValue = isSymbol(value) ? Number.NaN : Number.parseFloat(value);\n return Number.isNaN(parsedValue) ? defaultValue !== void 0 ? defaultValue : 0 : parsedValue;\n}\n\n// src/number/toInt.ts\nfunction toInt(value, defaultValue) {\n const parsedValue = isSymbol(value) ? Number.NaN : Number.parseInt(value);\n return Number.isNaN(parsedValue) ? defaultValue !== void 0 ? defaultValue : 0 : parsedValue;\n}\n\n// src/object/assign.ts\nfunction assign(initial, override) {\n if (!initial || !override) {\n return initial ?? override ?? {};\n }\n const proto = Object.getPrototypeOf(initial);\n const merged = proto ? { ...initial } : Object.assign(Object.create(proto), initial);\n for (const key of Object.keys(override)) {\n merged[key] = isPlainObject(initial[key]) && isPlainObject(override[key]) ? assign(initial[key], override[key]) : override[key];\n }\n return merged;\n}\n\n// src/object/clone.ts\nfunction clone(obj) {\n if (isPrimitive(obj)) {\n return obj;\n }\n if (typeof obj === \"function\") {\n return obj.bind({});\n }\n const proto = Object.getPrototypeOf(obj);\n const newObj = typeof (proto == null ? void 0 : proto.constructor) === \"function\" ? new proto.constructor() : Object.create(proto);\n for (const key of Object.getOwnPropertyNames(obj)) {\n newObj[key] = obj[key];\n }\n return newObj;\n}\n\n// src/object/cloneDeep.ts\nvar DefaultCloningStrategy = {\n cloneMap(input, track, clone2) {\n const output = track(/* @__PURE__ */ new Map());\n for (const [key, value] of input) {\n output.set(key, clone2(value));\n }\n return output;\n },\n cloneSet(input, track, clone2) {\n const output = track(/* @__PURE__ */ new Set());\n for (const value of input) {\n output.add(clone2(value));\n }\n return output;\n },\n cloneArray(input, track, clone2) {\n const output = track(new Array(input.length));\n input.forEach((value, index) => {\n output[index] = clone2(value);\n });\n return output;\n },\n cloneObject(input, track, clone2) {\n const output = track(Object.create(Object.getPrototypeOf(input)));\n for (const key of Reflect.ownKeys(input)) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n if (\"value\" in descriptor) {\n descriptor.value = clone2(descriptor.value);\n }\n Object.defineProperty(output, key, descriptor);\n }\n return output;\n },\n cloneOther(input, track) {\n return track(input);\n }\n};\nvar FastCloningStrategy = {\n cloneObject: (input, track, clone2) => {\n const output = track({ ...input });\n for (const key of Object.keys(input)) {\n output[key] = clone2(input[key]);\n }\n return output;\n }\n};\nfunction cloneDeep(root, customStrategy) {\n const strategy = { ...DefaultCloningStrategy, ...customStrategy };\n const tracked = /* @__PURE__ */ new Map();\n const track = (parent, newParent) => {\n tracked.set(parent, newParent);\n return newParent;\n };\n const clone2 = (value) => value && typeof value === \"object\" ? tracked.get(value) ?? cloneDeep2(value, strategy) : value;\n const cloneDeep2 = (parent, strategy2) => {\n const cloneParent = isObject(parent) ? strategy2.cloneObject : isArray(parent) ? strategy2.cloneArray : isMap(parent) ? strategy2.cloneMap : isSet(parent) ? strategy2.cloneSet : strategy2.cloneOther;\n const newParent = cloneParent(parent, track.bind(null, parent), clone2);\n if (!newParent) {\n return cloneDeep2(parent, DefaultCloningStrategy);\n }\n tracked.set(parent, newParent);\n return newParent;\n };\n return cloneDeep2(root, strategy);\n}\n\n// src/object/construct.ts\nfunction construct(obj) {\n if (!obj) {\n return {};\n }\n return Object.keys(obj).reduce((acc, path) => {\n return set(acc, path, obj[path]);\n }, {});\n}\n\n// src/object/crush.ts\nfunction crush(value) {\n if (!value) {\n return {};\n }\n return function crushReducer(crushed, value2, path) {\n if (isObject(value2) || isArray(value2)) {\n for (const [prop, propValue] of Object.entries(value2)) {\n crushReducer(crushed, propValue, path ? `${path}.${prop}` : prop);\n }\n } else {\n crushed[path] = value2;\n }\n return crushed;\n }({}, value, \"\");\n}\n\n// src/object/filterKey.ts\nfunction filterKey(obj, key, filter) {\n return Object.prototype.hasOwnProperty.call(obj, key) && (filter == null || (isArray(filter) ? filter.includes(key) : filter(obj[key], key, obj)));\n}\n\n// src/object/get.ts\nfunction get(value, path, defaultValue) {\n const segments = path.split(/[\\.\\[\\]]/g);\n let current = value;\n for (const key of segments) {\n if (current === null) {\n return defaultValue;\n }\n if (current === void 0) {\n return defaultValue;\n }\n const unquotedKey = key.replace(/['\"]/g, \"\");\n if (unquotedKey.trim() === \"\") {\n continue;\n }\n current = current[unquotedKey];\n }\n if (current === void 0) {\n return defaultValue;\n }\n return current;\n}\n\n// src/object/getOrInsert.ts\nfunction getOrInsert(map2, key, value) {\n if (map2.has(key)) {\n return map2.get(key);\n }\n map2.set(key, value);\n return value;\n}\n\n// src/object/getOrInsertComputed.ts\nfunction getOrInsertComputed(map2, key, compute) {\n if (map2.has(key)) {\n return map2.get(key);\n }\n const newValue = compute();\n map2.set(key, newValue);\n return newValue;\n}\n\n// src/object/invert.ts\nfunction invert(obj) {\n if (!obj) {\n return {};\n }\n const keys2 = Object.keys(obj);\n return keys2.reduce(\n (acc, key) => {\n acc[obj[key]] = key;\n return acc;\n },\n {}\n );\n}\n\n// src/object/isDangerousKey.ts\nfunction isDangerousKey(key, object) {\n return !(object && !Object.getPrototypeOf(object)) && (key === \"__proto__\" || key === \"prototype\" || key === \"constructor\");\n}\n\n// src/object/keys.ts\nfunction keys(value) {\n if (!value) {\n return [];\n }\n const keys2 = [];\n const keyPath = [];\n const recurse = (value2) => {\n if (isPlainObject(value2)) {\n for (const [prop, propValue] of Object.entries(value2)) {\n keyPath.push(prop);\n recurse(propValue);\n keyPath.pop();\n }\n } else if (isArray(value2)) {\n value2.forEach((item, index) => {\n keyPath.push(index);\n recurse(item);\n keyPath.pop();\n });\n } else {\n keys2.push(keyPath.join(\".\"));\n }\n };\n recurse(value);\n return keys2;\n}\n\n// src/object/listify.ts\nfunction listify(obj, toItem) {\n if (!obj) {\n return [];\n }\n const entries = Object.entries(obj);\n if (entries.length === 0) {\n return [];\n }\n return entries.reduce((acc, entry) => {\n acc.push(toItem(entry[0], entry[1]));\n return acc;\n }, []);\n}\n\n// src/object/lowerize.ts\nfunction lowerize(obj) {\n return mapKeys(obj, (k) => k.toLowerCase());\n}\n\n// src/object/mapEntries.ts\nfunction mapEntries(obj, toEntry) {\n if (!obj) {\n return {};\n }\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n const [newKey, newValue] = toEntry(key, value);\n acc[newKey] = newValue;\n return acc;\n },\n {}\n );\n}\n\n// src/object/mapKeys.ts\nfunction mapKeys(obj, mapFunc) {\n const keys2 = Object.keys(obj);\n return keys2.reduce(\n (acc, key) => {\n acc[mapFunc(key, obj[key])] = obj[key];\n return acc;\n },\n {}\n );\n}\n\n// src/object/mapValues.ts\nfunction mapValues(obj, mapFunc) {\n return Object.keys(obj).reduce(\n (acc, key) => {\n acc[key] = mapFunc(obj[key], key);\n return acc;\n },\n {}\n );\n}\n\n// src/object/omit.ts\nfunction omit(obj, keys2) {\n if (!obj) {\n return {};\n }\n if (!keys2 || keys2.length === 0) {\n return obj;\n }\n return keys2.reduce(\n (acc, key) => {\n delete acc[key];\n return acc;\n },\n { ...obj }\n );\n}\n\n// src/object/pick.ts\nfunction pick(obj, filter) {\n if (!obj) {\n return {};\n }\n let keys2 = filter;\n if (isArray(filter)) {\n filter = null;\n } else {\n keys2 = Reflect.ownKeys(obj);\n }\n return keys2.reduce((acc, key) => {\n if (filterKey(obj, key, filter)) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// src/object/set.ts\nfunction set(initial, path, value) {\n if (!initial) {\n return {};\n }\n if (!path || value === void 0) {\n return initial;\n }\n return function recurse(object, keys2, index) {\n const key = keys2[index];\n object ??= isIntString(key) ? [] : {};\n if (isDangerousKey(key, object)) {\n throw new Error(\"Unsafe key in path: \" + key);\n }\n if (index < keys2.length - 1) {\n value = recurse(object[key], keys2, index + 1);\n }\n if (!Object.is(object[key], value)) {\n object = clone(object);\n object[key] = value;\n }\n return object;\n }(initial, path.match(/[^.[\\]]+/g), 0);\n}\n\n// src/object/shake.ts\nfunction shake(obj, filter = (value) => value === void 0) {\n if (!obj) {\n return {};\n }\n return Object.keys(obj).reduce((acc, key) => {\n if (!filter(obj[key])) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n}\n\n// src/object/traverse.ts\nfunction traverse(root, visitor, options, outerContext) {\n const context = outerContext ?? {\n value: null,\n key: null,\n parent: null,\n parents: [],\n path: [],\n skipped: /* @__PURE__ */ new Set(),\n skip(obj) {\n context.skipped.add(obj ?? context.value);\n }\n };\n const { rootNeedsVisit } = options ??= {};\n const ownKeys = options.ownKeys ?? Object.keys;\n const nestedOptions = {\n ...options,\n rootNeedsVisit: null\n };\n let ok = true;\n const visit = (value, key) => {\n if (context.parent.constructor === Map) {\n [key, value] = value;\n }\n context.path.push(key);\n const result = visitor(\n context.value = value,\n context.key = key,\n context.parent,\n context,\n nestedOptions\n );\n if (result === false) {\n return ok = false;\n }\n if (value !== null && typeof value === \"object\" && (isArray(value) || isPlainObject(value)) && !context.skipped.has(value) && !context.parents.includes(value)) {\n traverse2(value, result);\n }\n context.path.pop();\n return ok;\n };\n const traverse2 = (parent, parentResult) => {\n context.parents.push(parent);\n context.parent = parent;\n if (rootNeedsVisit && parent === root) {\n parentResult = visitor(\n context.value = parent,\n context.key = null,\n context.parent,\n context,\n nestedOptions\n );\n if (parentResult === false) {\n return ok;\n }\n }\n if (isArray(parent)) {\n parent.slice().forEach((value, index, values) => {\n if (visit(value, index) === false) {\n values.length = 0;\n }\n });\n } else if (parent === root && isIterable(parent)) {\n let index = 0;\n for (const value of parent) {\n if (visit(value, index) === false) {\n return ok;\n }\n index++;\n }\n } else {\n for (const key of ownKeys(parent)) {\n if (visit(parent[key], key) === false) {\n return ok;\n }\n }\n }\n context.parents.pop();\n context.parent = last(context.parents);\n if (ok && isFunction(parentResult)) {\n ok = parentResult() !== false;\n }\n return ok;\n };\n if (outerContext) {\n if (outerContext.skipped.has(root)) {\n return true;\n }\n const { value, key } = context;\n traverse2(root);\n context.value = value;\n context.key = key;\n return ok;\n }\n return traverse2(root);\n}\n\n// src/object/upperize.ts\nfunction upperize(obj) {\n return mapKeys(obj, (k) => k.toUpperCase());\n}\n\n// src/oop/AggregateError.ts\nvar AggregateErrorOrPolyfill = /* @__PURE__ */ (() => globalThis.AggregateError ?? class AggregateError extends Error {\n constructor(errors = []) {\n var _a, _b;\n super();\n const name = ((_a = errors.find((e) => e.name)) == null ? void 0 : _a.name) ?? \"\";\n this.name = `AggregateError(${name}...)`;\n this.message = `AggregateError with ${errors.length} errors`;\n this.stack = ((_b = errors.find((e) => e.stack)) == null ? void 0 : _b.stack) ?? this.stack;\n this.errors = errors;\n }\n})();\n\n// src/oop/QuantityParser.ts\nvar QuantityParser = class {\n constructor({ units, short }) {\n this.units = units;\n this.short = short;\n }\n /**\n * Parse a quantity string into its numeric value\n *\n * @throws {Error} If the quantity string is invalid or contains an unknown unit\n */\n parse(quantity) {\n var _a;\n const match = quantity.match(/^(-?\\d+(?:\\.\\d+)?) ?(\\w+)?s?$/);\n if (!match) {\n throw new Error(`Invalid quantity, cannot parse: ${quantity}`);\n }\n let unit = match[2];\n unit = ((_a = this.short) == null ? void 0 : _a[unit]) || unit;\n const count = Number.parseFloat(match[1]);\n if (Math.abs(count) > 1 && unit.endsWith(\"s\")) {\n unit = unit.substring(0, unit.length - 1);\n }\n if (!this.units[unit]) {\n throw new Error(\n `Invalid unit: ${unit}, makes sure it is one of: ${Object.keys(this.units).join(\", \")}`\n );\n }\n return count * this.units[unit];\n }\n};\n\n// src/oop/DurationParser.ts\nvar DURATION_UNITS = {\n week: 6048e5,\n day: 864e5,\n hour: 36e5,\n minute: 6e4,\n second: 1e3,\n millisecond: 1\n};\nvar DURATION_SHORT_UNITS = {\n w: \"week\",\n d: \"day\",\n h: \"hour\",\n m: \"minute\",\n s: \"second\",\n ms: \"millisecond\"\n};\nvar DurationParser = class _DurationParser extends QuantityParser {\n constructor(options) {\n super({\n units: {\n ..._DurationParser.units,\n ...options == null ? void 0 : options.units\n },\n short: {\n ..._DurationParser.shortUnits,\n ...options == null ? void 0 : options.short\n }\n });\n }\n static get units() {\n return DURATION_UNITS;\n }\n static get shortUnits() {\n return DURATION_SHORT_UNITS;\n }\n};\n\n// src/oop/Semaphore.ts\nvar SemaphorePermit = class {\n constructor(semaphore, request, weight) {\n this.semaphore = semaphore;\n this.request = request;\n this.weight = weight;\n }\n /**\n * Releases this permit back to the semaphore, allowing another\n * operation to acquire it.\n */\n release() {\n this.semaphore.release(this);\n this.release = noop;\n }\n};\nvar Semaphore = class {\n /**\n * Creates a new semaphore with the specified capacity.\n * @param maxCapacity Maximum number of permits that can be issued simultaneously\n */\n constructor(maxCapacity) {\n this.maxCapacity = maxCapacity;\n this.queue = [];\n if (maxCapacity <= 0) {\n throw new Error(\"maxCapacity must be > 0\");\n }\n this.capacity = maxCapacity;\n }\n /**\n * Number of pending acquisition requests.\n */\n get queueLength() {\n return this.queue.length;\n }\n /**\n * Acquires a permit from this semaphore, waiting if necessary until\n * one becomes available.\n * @param options.signal - The signal to abort the acquisition\n * @param options.weight - The weight of the permit to acquire\n * @returns A promise that resolves to a permit when one is\n * available\n */\n async acquire({\n signal,\n weight = 1\n } = {}) {\n if (weight <= 0) {\n throw new Error(\"weight must be > 0\");\n }\n if (weight > this.maxCapacity) {\n throw new Error(\"weight must be \\u2264 maxCapacity\");\n }\n const request = withResolvers();\n const permit = new SemaphorePermit(this, request, weight);\n if (signal) {\n const abort = () => {\n const index = this.queue.indexOf(permit);\n if (index >= 0) {\n this.queue.splice(index, 1);\n request.reject(signal.reason);\n }\n };\n signal.addEventListener(\"abort\", abort);\n const cleanup = () => {\n signal.removeEventListener(\"abort\", abort);\n };\n request.promise.then(cleanup, cleanup);\n }\n if (this.capacity < weight) {\n this.queue.push(permit);\n await request.promise;\n } else {\n this.capacity -= weight;\n }\n return permit;\n }\n /**\n * Rejects all pending acquisition requests.\n */\n reject(error) {\n this.acquire = () => Promise.reject(error);\n this.queue.forEach((permit) => permit.request.reject(error));\n this.queue = [];\n }\n /**\n * Releases a permit back to the semaphore, increasing capacity and\n * potentially fulfilling a pending acquisition request.\n */\n release(permit) {\n this.capacity += permit.weight;\n const nextPermit = this.queue[0];\n if (nextPermit && this.capacity >= nextPermit.weight) {\n this.capacity -= nextPermit.weight;\n this.queue.shift();\n nextPermit.request.resolve();\n }\n }\n};\n\n// src/oop/TimeoutError.ts\nvar TimeoutError = class extends Error {\n constructor(message) {\n super(message ?? \"Operation timed out\");\n this.name = \"TimeoutError\";\n }\n};\n\n// src/random/absoluteJitter.ts\nfunction absoluteJitter(base, offset) {\n return base + offset * (2 * Math.random() - 1);\n}\n\n// src/random/draw.ts\nfunction draw(array) {\n const max2 = array.length;\n if (max2 === 0) {\n return null;\n }\n const index = random(0, max2 - 1);\n return array[index];\n}\n\n// src/random/proportionalJitter.ts\nfunction proportionalJitter(base, factor) {\n return base * (1 - factor * (2 * Math.random() - 1));\n}\n\n// src/random/random.ts\nfunction random(min2, max2) {\n return Math.floor(Math.random() * (max2 - min2 + 1) + min2);\n}\n\n// src/random/shuffle.ts\nfunction shuffle(array, random2 = random) {\n const newArray = array.slice();\n for (let idx = array.length - 1, randomIdx, item; idx > 0; idx--) {\n randomIdx = random2(0, idx);\n item = newArray[idx];\n newArray[idx] = newArray[randomIdx];\n newArray[randomIdx] = item;\n }\n return newArray;\n}\n\n// src/random/uid.ts\nfunction uid(length, specials = \"\") {\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" + specials;\n return iterate(\n length,\n (acc) => {\n return acc + characters.charAt(random(0, characters.length - 1));\n },\n \"\"\n );\n}\n\n// src/series/series.ts\nvar series = (items, toKey = (item) => `${item}`) => {\n const indexesByKey = {};\n const itemsByIndex = {};\n for (const idx of range(items.length - 1)) {\n const item = items[idx];\n indexesByKey[toKey(item)] = idx;\n itemsByIndex[idx] = item;\n }\n const first2 = () => itemsByIndex[0];\n const last2 = () => itemsByIndex[items.length - 1];\n const next = (current, defaultValue) => itemsByIndex[indexesByKey[toKey(current)] + 1] ?? defaultValue ?? first2();\n const previous = (current, defaultValue) => itemsByIndex[indexesByKey[toKey(current)] - 1] ?? defaultValue ?? last2();\n return {\n /**\n * Given two values in the series, returns the value that occurs\n * earlier in the series.\n */\n min(a, b) {\n return indexesByKey[toKey(a)] < indexesByKey[toKey(b)] ? a : b;\n },\n /**\n * Given two values in the series, returns the value that occurs\n * later in the series.\n */\n max(a, b) {\n return indexesByKey[toKey(a)] > indexesByKey[toKey(b)] ? a : b;\n },\n first: first2,\n last: last2,\n next,\n previous,\n /**\n * A more dynamic method than `next` and `previous` that lets you move\n * many times in either direction.\n *\n * ```ts\n * series(weekdays).spin('wednesday', 3) // => 'monday'\n * series(weekdays).spin('wednesday', -3) // => 'friday'\n * ```\n */\n spin(current, num) {\n if (num === 0) {\n return current;\n }\n const abs = Math.abs(num);\n const rel = abs > items.length ? abs % items.length : abs;\n return list(0, rel - 1).reduce(\n (acc) => num > 0 ? next(acc) : previous(acc),\n current\n );\n }\n };\n};\n\n// src/string/camel.ts\nfunction camel(str) {\n var _a;\n const parts = ((_a = str == null ? void 0 : str.replace(/([A-Z])+/g, capitalize)) == null ? void 0 : _a.split(/(?=[A-Z])|[\\.\\-\\s_]/).map((x) => x.toLowerCase())) ?? [];\n if (parts.length === 0) {\n return \"\";\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return parts.reduce((acc, part) => {\n return `${acc}${part.charAt(0).toUpperCase()}${part.slice(1)}`;\n });\n}\n\n// src/string/capitalize.ts\nfunction capitalize(str) {\n if (!str || str.length === 0) {\n return \"\";\n }\n const lower = str.toLowerCase();\n return lower.substring(0, 1).toUpperCase() + lower.substring(1, lower.length);\n}\n\n// src/string/dash.ts\nfunction dash(str) {\n var _a;\n const parts = ((_a = str == null ? void 0 : str.replace(/([A-Z])+/g, capitalize)) == null ? void 0 : _a.split(/(?=[A-Z])|[\\.\\-\\s_]/).map((x) => x.toLowerCase())) ?? [];\n if (parts.length === 0) {\n return \"\";\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return parts.reduce((acc, part) => {\n return `${acc}-${part.toLowerCase()}`;\n });\n}\n\n// src/string/dedent.ts\nfunction dedent(text, ...values) {\n var _a;\n if (isArray(text)) {\n if (values.length > 0) {\n return dedent(\n text.reduce((acc, input, i) => {\n var _a2;\n let value = String(values[i] ?? \"\");\n const indent2 = value.includes(\"\\n\") && ((_a2 = input.match(/[ \\t]*(?=[^\\n]*$)/)) == null ? void 0 : _a2[0]);\n if (indent2) {\n value = value.replace(/\\n(?=[^\\n]*?\\S)/g, \"\\n\" + indent2);\n }\n return acc + input + value;\n }, \"\")\n );\n }\n text = text[0];\n }\n const indent = values[0] ?? ((_a = text.match(/^[ \\t]*(?=\\S)/m)) == null ? void 0 : _a[0]);\n const output = indent ? text.replace(new RegExp(`^${indent}`, \"gm\"), \"\") : text;\n return output.replace(/^[ \\t]*\\n|\\n[ \\t]*$/g, \"\");\n}\n\n// src/string/escapeHTML.ts\nvar htmlCharacters = /[&<>\"']/g;\nvar replacements = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nfunction escapeHTML(input) {\n return input.replace(htmlCharacters, (char) => replacements[char]);\n}\n\n// src/string/pascal.ts\nfunction pascal(str) {\n if (!str) {\n return \"\";\n }\n const result = str.replace(\n /(?:[^\\w\\d]|_|\\s)+(\\w)([A-Z]+)?/g,\n (_, firstCharacter, capitalizedLetters) => {\n if (capitalizedLetters) {\n return firstCharacter.toUpperCase() + capitalizedLetters.toLowerCase();\n }\n return firstCharacter.toUpperCase();\n }\n );\n return result[0].toUpperCase() + result.substring(1);\n}\n\n// src/string/similarity.ts\nfunction similarity(str1, str2) {\n if (str1 === str2) {\n return 0;\n }\n let start = 0;\n let end1 = str1.length - 1;\n let end2 = str2.length - 1;\n while (start <= end1 && start <= end2 && str1[start] === str2[start]) {\n start++;\n }\n while (end1 >= start && end2 >= start && str1[end1] === str2[end2]) {\n end1--;\n end2--;\n }\n const length1 = end1 - start + 1;\n const length2 = end2 - start + 1;\n if (length1 === 0) {\n return length2;\n }\n if (length2 === 0) {\n return length1;\n }\n const numRows = length1 + 1;\n const numColumns = length2 + 1;\n const distances = new Array(numRows * numColumns).fill(0);\n for (let x = 1; x < numColumns; x++) {\n distances[x] = x;\n }\n for (let y = 1; y < numRows; y++) {\n distances[y * numColumns] = y;\n }\n for (let x = 1; x < numColumns; x++) {\n for (let y = 1; y < numRows; y++) {\n const i = y * numColumns + x;\n distances[i] = Math.min(\n // Cost of a deletion.\n distances[i - numColumns] + 1,\n // Cost of an insertion.\n distances[i - 1] + 1,\n // Cost of a substitution.\n distances[i - numColumns - 1] + (str1[start + y - 1] === str2[start + x - 1] ? 0 : 1)\n );\n }\n }\n return distances[length1 * numColumns + length2];\n}\n\n// src/string/snake.ts\nfunction snake(str, options) {\n const parts = (str == null ? void 0 : str.replace(/([A-Z])+/g, capitalize).split(/(?=[A-Z])|[\\.\\-\\s_]/).map((x) => x.toLowerCase())) ?? [];\n if (parts.length === 0) {\n return \"\";\n }\n if (parts.length === 1) {\n return parts[0];\n }\n const result = parts.reduce((acc, part) => {\n return `${acc}_${part.toLowerCase()}`;\n });\n return (options == null ? void 0 : options.splitOnNumber) === false ? result : result.replace(/([A-Za-z]{1}[0-9]{1})/, (val) => `${val[0]}_${val[1]}`);\n}\n\n// src/string/template.ts\nfunction template(str, data, regex = /\\{\\{(.+?)\\}\\}/g) {\n let result = \"\";\n let from = 0;\n let match;\n while (match = regex.exec(str)) {\n result += str.slice(from, match.index) + data[match[1]];\n from = regex.lastIndex;\n }\n return result + str.slice(from);\n}\n\n// src/string/title.ts\nfunction title(str) {\n if (!str) {\n return \"\";\n }\n return str.split(/(?=[A-Z])|[\\.\\-\\s_]/).map((s) => s.trim()).filter((s) => !!s).map((s) => capitalize(s.toLowerCase())).join(\" \");\n}\n\n// src/string/trim.ts\nfunction trim(str, charsToTrim = \" \") {\n if (!str) {\n return \"\";\n }\n const toTrim = charsToTrim.replace(/[\\W]{1}/g, \"\\\\$&\");\n const regex = new RegExp(`^[${toTrim}]+|[${toTrim}]+$`, \"g\");\n return str.replace(regex, \"\");\n}\n\n// src/typed/assert.ts\nfunction assert(condition, message) {\n if (!condition) {\n throw message instanceof Error ? message : new Error(message ?? \"Assertion failed\");\n }\n}\n\n// src/typed/isArray.ts\nvar isArray = /* @__PURE__ */ (() => Array.isArray)();\n\n// src/typed/isAsyncIterable.ts\nvar asyncIteratorSymbol = (\n /* c8 ignore next */\n Symbol.asyncIterator || /* @__PURE__ */ Symbol.for(\"Symbol.asyncIterator\")\n);\nfunction isAsyncIterable(value) {\n return !!value && typeof value === \"object\" && typeof value[asyncIteratorSymbol] === \"function\";\n}\n\n// src/typed/isBigInt.ts\nfunction isBigInt(value) {\n return typeof value === \"bigint\";\n}\n\n// src/typed/isBoolean.ts\nfunction isBoolean(value) {\n return typeof value === \"boolean\";\n}\n\n// src/typed/isClass.ts\nfunction isClass(value) {\n return isFunction(value) && Function.prototype.toString.call(value).startsWith(\"class \");\n}\n\n// src/typed/isDate.ts\nfunction isDate(value) {\n return isTagged(value, \"[object Date]\");\n}\n\n// src/typed/isEmpty.ts\nfunction isEmpty(value) {\n if (typeof value !== \"object\" || value === null) {\n return !value || value === true;\n }\n if (isDate(value)) {\n return Number.isNaN(value.getTime());\n }\n const length = value.length;\n if (isNumber(length)) {\n return length === 0;\n }\n const size = value.size;\n if (isNumber(size)) {\n return size === 0;\n }\n const keys2 = Object.keys(value).length;\n return keys2 === 0;\n}\n\n// src/typed/isEqual.ts\nfunction isEqual(x, y) {\n if (Object.is(x, y)) {\n return true;\n }\n if (x instanceof Date && y instanceof Date) {\n return x.getTime() === y.getTime();\n }\n if (x instanceof RegExp && y instanceof RegExp) {\n return x.toString() === y.toString();\n }\n if (typeof x !== \"object\" || x === null || typeof y !== \"object\" || y === null) {\n return false;\n }\n const keysX = Reflect.ownKeys(x);\n const keysY = Reflect.ownKeys(y);\n if (keysX.length !== keysY.length) {\n return false;\n }\n for (let i = 0; i < keysX.length; i++) {\n if (!Reflect.has(y, keysX[i])) {\n return false;\n }\n if (!isEqual(x[keysX[i]], y[keysX[i]])) {\n return false;\n }\n }\n return true;\n}\n\n// src/typed/isError.ts\nfunction isError(value) {\n return isTagged(value, \"[object Error]\");\n}\n\n// src/typed/isFloat.ts\nfunction isFloat(value) {\n return isNumber(value) && value % 1 !== 0;\n}\n\n// src/typed/isFunction.ts\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\n\n// src/typed/isInt.ts\nvar isInt = /* @__PURE__ */ (() => Number.isInteger)();\n\n// src/typed/isIntString.ts\nfunction isIntString(value) {\n if (!isString(value)) {\n return false;\n }\n const num = +value;\n return Number.isInteger(num) && `${num}` === value;\n}\n\n// src/typed/isIterable.ts\nfunction isIterable(value) {\n return typeof value === \"object\" && value !== null && Symbol.iterator in value;\n}\n\n// src/typed/isMap.ts\nfunction isMap(value) {\n return isTagged(value, \"[object Map]\");\n}\n\n// src/typed/isMapEqual.ts\nfunction isMapEqual(x, y) {\n if (x.size !== y.size) {\n return false;\n }\n for (const [key, value] of x) {\n if (!isEqual(value, y.get(key))) {\n return false;\n }\n }\n return true;\n}\n\n// src/typed/isNullish.ts\nfunction isNullish(value) {\n return value === null || value === void 0;\n}\n\n// src/typed/isNumber.ts\nfunction isNumber(value) {\n return typeof value === \"number\" && !Number.isNaN(value);\n}\n\n// src/typed/isObject.ts\nfunction isObject(value) {\n return isTagged(value, \"[object Object]\");\n}\n\n// src/typed/isPlainObject.ts\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return (\n // Fast path for most common objects.\n prototype === Object.prototype || // Support objects created without a prototype.\n prototype === null || // Support plain objects from other realms.\n Object.getPrototypeOf(prototype) === null\n );\n}\n\n// src/typed/isPrimitive.ts\nfunction isPrimitive(value) {\n return value === void 0 || value === null || typeof value !== \"object\" && typeof value !== \"function\";\n}\n\n// src/typed/isPromise.ts\nfunction isPromise(value) {\n return !!value && isFunction(value.then);\n}\n\n// src/typed/isRegExp.ts\nfunction isRegExp(value) {\n return isTagged(value, \"[object RegExp]\");\n}\n\n// src/typed/isResult.ts\nfunction isResult(value) {\n return isArray(value) && value.length === 2 && (isError(value[0]) ? value[1] : value[0]) === void 0;\n}\n\n// src/typed/isResultErr.ts\nfunction isResultErr(value) {\n return isResult(value) && value[0] !== void 0;\n}\n\n// src/typed/isResultOk.ts\nfunction isResultOk(value) {\n return isResult(value) && value[0] === void 0;\n}\n\n// src/typed/isSet.ts\nfunction isSet(value) {\n return isTagged(value, \"[object Set]\");\n}\n\n// src/typed/isSetEqual.ts\nfunction isSetEqual(x, y) {\n if (x.size !== y.size) {\n return false;\n }\n for (const item of x) {\n if (!y.has(item)) {\n return false;\n }\n }\n return true;\n}\n\n// src/typed/isString.ts\nfunction isString(value) {\n return typeof value === \"string\";\n}\n\n// src/typed/isSymbol.ts\nfunction isSymbol(value) {\n return typeof value === \"symbol\";\n}\n\n// src/typed/isTagged.ts\nfunction isTagged(value, tag) {\n return Object.prototype.toString.call(value) === tag;\n}\n\n// src/typed/isUndefined.ts\nfunction isUndefined(value) {\n return typeof value === \"undefined\";\n}\n\n// src/typed/isWeakMap.ts\nfunction isWeakMap(value) {\n return isTagged(value, \"[object WeakMap]\");\n}\n\n// src/typed/isWeakSet.ts\nfunction isWeakSet(value) {\n return isTagged(value, \"[object WeakSet]\");\n}\n\nexport { AggregateErrorOrPolyfill as AggregateError, DefaultCloningStrategy, DurationParser, FastCloningStrategy, QuantityParser, Semaphore, SemaphorePermit, TimeoutError, absoluteJitter, all, alphabetical, always, assert, assign, boil, callable, camel, capitalize, cartesianProduct, castArray, castArrayIfExists, castComparator, castMapping, chain, clamp, clone, cloneDeep, cluster, compose, concat, construct, counting, crush, dash, debounce, dedent, defer, diff, draw, escapeHTML, filterKey, first, flat, flip, fork, get, getOrInsert, getOrInsertComputed, group, guard, identity, inRange, intersects, invert, isArray, isArrayEqual, isAsyncIterable, isBigInt, isBoolean, isClass, isDangerousKey, isDate, isEmpty, isEqual, isError, isFloat, isFunction, isInt, isIntString, isIterable, isMap, isMapEqual, isNullish, isNumber, isObject, isPlainObject, isPrimitive, isPromise, isRegExp, isResult, isResultErr, isResultOk, isSet, isSetEqual, isString, isSymbol, isTagged, isUndefined, isWeakMap, isWeakSet, iterate, keys, last, lerp, list, listify, lowerize, map, mapEntries, mapKeys, mapValues, mapify, max, memo, memoLastCall, merge, min, noop, objectify, omit, once, parallel, parseDuration, parseQuantity, partial, partob, pascal, pick, pluck, promiseChain, proportionalJitter, proxied, queueByKey, random, range, reduce, remove, replace, replaceOrAppend, retry, round, select, selectFirst, series, set, shake, shift, shuffle, sift, similarity, sleep, snake, sort, sum, template, throttle, timeout, title, toFloat, toInt, toResult, toggle, traverse, trim, tryit as try, tryit, uid, unique, unzip, upperize, withResolvers, zip, zipToObject };\n","import { assign } from \"radashi\";\n\nexport const objectAssign = assign;\n","import { useRef, type DependencyList } from \"react\";\nimport { isEqual } from \"src/utils\";\n\ninterface RefObject<T> {\n deps: DependencyList;\n result: T;\n isInitialized: boolean;\n}\n\n/**\n * useCreation\n * @reference https://ahooks.js.org/zh-CN/hooks/use-creation\n *\n * @template T\n * @param {() => T} factory\n * @param {DependencyList} deps\n */\nexport function useCreation<T>(factory: () => T, deps: DependencyList) {\n const { current } = useRef<RefObject<T>>({ deps, result: undefined!, isInitialized: false });\n\n if (current.isInitialized === false || !isEqual(current.deps, deps)) {\n current.deps = deps;\n current.result = factory();\n current.isInitialized = true;\n }\n\n return current.result;\n}\n\n","import { useRef } from \"react\";\n\n/**\n * 返回当前最新值的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-latest\n *\n * @template T\n * @param {T} value\n */\nexport function useLatest<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n\n return ref;\n}\n\n","import { useEffect, useRef, type EffectCallback } from \"react\";\nimport { isFunction, isPromiseLike } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\ntype MountCallback = EffectCallback | AsyncFunc;\n\n/**\n * 在组件初始化时执行的 Hook\n * - 即使在严格模式下也只执行一次\n * @reference https://ahooks.js.org/hooks/use-mount\n *\n * @param {MountCallback} effect 副作用函数\n */\nexport function useMount(effect: MountCallback) {\n if (!isFunction(effect)) {\n console.error(`useMount expected parameter is a function, but got ${typeof effect}`);\n }\n\n const isMountedRef = useRef(false);\n const effectRef = useLatest(effect);\n\n useEffect(() => {\n if (isMountedRef.current) {\n return;\n }\n\n isMountedRef.current = true;\n const result = effectRef.current?.();\n // If fn returns a Promise, don't return it as cleanup function\n if (isPromiseLike(result)) {\n return;\n }\n\n return result as ReturnType<EffectCallback>;\n }, []);\n}\n\n","export type BREAK_POINT_TOKEN_TYPE = Record<keyof typeof BREAK_POINT_TOKEN_ENUM, number>;\n/** 屏幕响应断点 token 配置 */\nexport const BREAK_POINT_TOKEN_ENUM = {\n XS: 576,\n XSMin: 576,\n XSMax: 767,\n SM: 768,\n SMMin: 768,\n SMMax: 991,\n MD: 992,\n MDMin: 992,\n MDMax: 1199,\n LG: 1200,\n LGMin: 1200,\n LGMax: 1599,\n XL: 1600,\n XLMin: 1600,\n XLMax: 1919,\n XXL: 1920,\n XXLMin: 1920,\n} as const;\n","import type { Breakpoint } from \"@pawover/types\";\nimport { useEffect, useState } from \"react\";\nimport { BREAK_POINT_TOKEN_ENUM, type BREAK_POINT_TOKEN_TYPE } from \"src/enums\";\nimport { objectAssign, objectKeys } from \"src/utils\";\n\ntype Subscriber = () => void;\ntype ResponsiveConfig = Record<Breakpoint, number>;\ntype ResponsiveValues = Record<Breakpoint, boolean>;\n\nconst subscriberList = new Set<Subscriber>();\nconst { XS, SM, MD, LG, XL, XXL } = BREAK_POINT_TOKEN_ENUM;\nconst defaultResponsiveValues: ResponsiveValues = { xxl: false, xl: false, lg: false, md: false, sm: false, xs: false };\nlet responsiveConfig: ResponsiveConfig = { xxl: XXL, xl: XL, lg: LG, md: MD, sm: SM, xs: XS };\nlet responsiveValues: ResponsiveValues = { ...defaultResponsiveValues };\n\ninterface ResponsiveHookOptions {\n /**\n * 紧凑布局断点\n * - 低于此断点时使用紧凑布局\n * @default \"xl\"\n */\n compactBreakPoint?: Breakpoint;\n /** 屏幕响应断点 token 配置 */\n breakPointTokens?: BREAK_POINT_TOKEN_TYPE;\n}\nexport function useResponsive(options?: ResponsiveHookOptions) {\n const { compactBreakPoint = \"xl\", breakPointTokens = {} } = options || {};\n const tokens: BREAK_POINT_TOKEN_TYPE = objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens);\n responsiveConfig = { xxl: tokens.XXL, xl: tokens.XL, lg: tokens.LG, md: tokens.MD, sm: tokens.SM, xs: tokens.XS };\n\n calculate();\n\n const [responsive, setResponsive] = useState<ResponsiveValues>(responsiveValues);\n const isCompact = !responsive[compactBreakPoint];\n const current = objectKeys(defaultResponsiveValues).find((key) => responsive[key] === true) || \"xs\";\n\n useEffect(() => {\n addListener();\n\n const subscriber = () => {\n setResponsive(responsiveValues);\n };\n\n subscriberList.add(subscriber);\n\n return () => {\n subscriberList.delete(subscriber);\n\n if (subscriberList.size === 0) {\n removeListener();\n }\n };\n }, []);\n\n return { responsive, current, isCompact, breakPointTokens: tokens };\n}\n\nfunction resizeListener() {\n const oldInfo = responsiveValues;\n calculate();\n\n if (oldInfo === responsiveValues) {\n return;\n }\n\n for (const subscriber of subscriberList) {\n subscriber();\n }\n}\nfunction addListener() {\n window.addEventListener(\"resize\", resizeListener);\n}\nfunction removeListener() {\n window.removeEventListener(\"resize\", resizeListener);\n}\nfunction calculate() {\n const width = window.innerWidth;\n const newValues = { ...defaultResponsiveValues };\n let shouldUpdate = false;\n\n for (const key of objectKeys(responsiveConfig)) {\n newValues[key] = width >= responsiveConfig[key];\n if (newValues[key] !== responsiveValues[key]) {\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n responsiveValues = newValues;\n }\n}\n\n","import { useEffect } from \"react\";\nimport { isFunction } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\n/**\n * 在组件卸载时执行的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-unmount\n *\n * @param {Func} effect 副作用函数\n */\nexport function useUnmount(effect: Func) {\n if (!isFunction(effect)) {\n console.error(`useUnmount expected parameter is a function, got ${typeof effect}`);\n }\n\n const effectRef = useLatest(effect);\n\n useEffect(\n () => () => {\n effectRef.current?.();\n },\n [],\n );\n}\n\n"],"x_google_ignoreList":[7],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks-react.js","names":["defaultResponsiveValues: ResponsiveValues","responsiveConfig: ResponsiveConfig","responsiveValues: ResponsiveValues","tokens: BREAK_POINT_TOKEN_TYPE"],"sources":["../src/utils/typeof/types.ts","../src/utils/typeof/isBoolean.ts","../src/utils/typeof/isObject.ts","../src/utils/typeof/isDate.ts","../src/utils/typeof/isEqual.ts","../src/utils/typeof/isFunction.ts","../src/utils/typeof/isPromise.ts","../src/utils/typeof/isRegExp.ts","../src/utils/typeof/isString.ts","../src/utils/object/objectKeys.ts","../src/utils/object/objectAssign.ts","../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/enums/grid.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts"],"sourcesContent":["export const PROTOTYPE_TAGS = {\n string: \"[object String]\",\n number: \"[object Number]\",\n boolean: \"[object Boolean]\",\n object: \"[object Object]\",\n array: \"[object Array]\",\n bigInt: \"[object BigInt]\",\n symbol: \"[object Symbol]\",\n function: \"[object Function]\",\n asyncFunction: \"[object AsyncFunction]\",\n generatorFunction: \"[object GeneratorFunction]\",\n asyncGeneratorFunction: \"[object AsyncGeneratorFunction]\",\n promise: \"[object Promise]\",\n null: \"[object Null]\",\n undefined: \"[object Undefined]\",\n date: \"[object Date]\",\n regExp: \"[object RegExp]\",\n error: \"[object Error]\",\n file: \"[object File]\",\n map: \"[object Map]\",\n weakMap: \"[object WeakMap]\",\n set: \"[object Set]\",\n weakSet: \"[object WeakSet]\",\n window: \"[object Window]\",\n webSocket: \"[object WebSocket]\",\n URLSearchParams: \"[object URLSearchParams]\",\n} as const;\n\nexport const TYPED_ARRAY_TAGS = new Set([\n \"[object Int8Array]\",\n \"[object Uint8Array]\",\n \"[object Uint8ClampedArray]\",\n \"[object Int16Array]\",\n \"[object Uint16Array]\",\n \"[object Int32Array]\",\n \"[object Uint32Array]\",\n \"[object Float32Array]\",\n \"[object Float64Array]\",\n \"[object BigInt64Array]\",\n \"[object BigUint64Array]\",\n]);\n\nexport function resolvePrototypeString(value: unknown) {\n return Object.prototype.toString.call(value);\n}\n","export function isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n","import { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\n/**\n * 判断是否为对象类型\n * - 可选是否检查原型为 `Object.prototype`,防止原型链污染\n *\n * @param value - 待检查值\n * @param prototypeCheck - 是否进行原型检查,默认 `true`\n */\nexport function isObject(value: unknown, prototypeCheck = true): value is Record<PropertyKey, unknown> {\n const check = resolvePrototypeString(value) === PROTOTYPE_TAGS.object;\n\n return prototypeCheck ? check && Object.getPrototypeOf(value) === Object.prototype : check;\n}\n","import { isObject } from \"./isObject\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isDate(value: unknown): value is Date {\n if (!isObject(value)) {\n return false;\n }\n\n try {\n return resolvePrototypeString(value) === PROTOTYPE_TAGS.date && typeof (value)[\"getTime\"] === \"function\";\n } catch (error) {\n return false;\n }\n}\n","import { isDate, isRegExp } from \".\";\n\n/**\n * 检查给定的值是否相等\n * @reference https://github.com/radashi-org/radashi/blob/main/src/typed/isEqual.ts\n *\n * @param {T} x\n * @param {T} y\n */\nexport function isEqual<T>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n if (isDate(x) && isDate(y)) {\n return x.getTime() === y.getTime();\n }\n if (isRegExp(x) && isRegExp(y)) {\n return x.toString() === y.toString();\n }\n if (typeof x !== \"object\" || x === null || typeof y !== \"object\" || y === null) {\n return false;\n }\n\n const keysX = Reflect.ownKeys(x) as (keyof typeof x)[];\n const keysY = Reflect.ownKeys(y);\n if (keysX.length !== keysY.length) {\n return false;\n }\n\n for (const key of keysX) {\n if (!Reflect.has(y, key)) {\n return false;\n }\n if (!isEqual(x[key], y[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\nexport function isAsyncFunction(value: unknown): value is AnyAsyncFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.asyncFunction;\n}\n\nexport function isGeneratorFunction(value: unknown): value is AnyGeneratorFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.generatorFunction;\n}\n\nexport function isAsyncGeneratorFunction(value: unknown): value is AnyAsyncGeneratorFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.asyncGeneratorFunction;\n}\n","import { isFunction } from \"./isFunction\";\nimport { isObject } from \"./isObject\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return resolvePrototypeString(value) === PROTOTYPE_TAGS.promise;\n}\n\nexport function isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isPromise(value) || (isObject(value) && isFunction(value[\"then\"]));\n}\n","import { isBoolean, isFunction, isObject, isString } from \".\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isRegExp(value: unknown): value is RegExp {\n if (!isObject(value)) {\n return false;\n }\n\n try {\n const regex = value as unknown as RegExp;\n\n return (\n resolvePrototypeString(value) === PROTOTYPE_TAGS.regExp &&\n isString(regex.source) &&\n isString(regex.flags) &&\n isBoolean(regex.global) &&\n isFunction(regex.test)\n );\n } catch (error) {\n return false;\n }\n}\n","export function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n","/**\n * 返回对象的可枚举属性和方法的名称\n * - `Object.keys` 始终返回 `string[]` 类型,此函数可以返回具体类型\n *\n * @param obj 对象\n */\nexport function objectKeys<O extends AnyObject>(obj: O): (keyof O)[] {\n return Object.keys(obj);\n}\n","import type { Assign } from \"radashi\";\nimport { isObject } from \"../typeof\";\n\n/**\n * 递归地将第二个对象合并到第一个对象的副本中\n * - 只有普通对象才会递归合并\n *\n * @param initial 初始对象\n * @param override 待合并对象\n */\nexport function objectAssign<I extends UnknownObject, O extends UnknownObject>(initial: I, override: O): Assign<I, O> {\n if (!isObject(initial) || !isObject(override)) {\n return (initial ?? override ?? {}) as Assign<I, O>;\n }\n\n const proto = Object.getPrototypeOf(initial);\n const assigned = proto ? { ...initial } : Object.assign(Object.create(proto), initial);\n\n for (const key of Object.keys(override)) {\n assigned[key] = isObject(initial[key]) && isObject(override[key]) ? objectAssign(initial[key], override[key]) : override[key];\n }\n\n return assigned;\n}\n","import { useRef, type DependencyList } from \"react\";\nimport { isEqual } from \"src/utils\";\n\ninterface RefObject<T> {\n deps: DependencyList;\n result: T;\n isInitialized: boolean;\n}\n\n/**\n * useCreation\n * @reference https://ahooks.js.org/zh-CN/hooks/use-creation\n *\n * @template T\n * @param {() => T} factory\n * @param {DependencyList} deps\n */\nexport function useCreation<T>(factory: () => T, deps: DependencyList) {\n const { current } = useRef<RefObject<T>>({ deps, result: undefined!, isInitialized: false });\n\n if (current.isInitialized === false || !isEqual(current.deps, deps)) {\n current.deps = deps;\n current.result = factory();\n current.isInitialized = true;\n }\n\n return current.result;\n}\n\n","import { useRef, type RefObject } from \"react\";\n\n/**\n * 返回当前最新值的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-latest\n *\n * @template T\n * @param {T} value\n */\nexport function useLatest<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n\n return ref;\n}\n\n","import { useEffect, useRef, type EffectCallback } from \"react\";\nimport { isFunction, isPromiseLike } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\ntype MountCallback = EffectCallback | AnyAsyncFunction;\n\n/**\n * 在组件初始化时执行的 Hook\n * - 即使在严格模式下也只执行一次\n * @reference https://ahooks.js.org/hooks/use-mount\n *\n * @param {MountCallback} effect 副作用函数\n */\nexport function useMount(effect: MountCallback) {\n if (!isFunction(effect)) {\n console.error(`useMount expected parameter is a function, but got ${typeof effect}`);\n }\n\n const isMountedRef = useRef(false);\n const effectRef = useLatest(effect);\n\n useEffect(() => {\n if (isMountedRef.current) {\n return;\n }\n\n isMountedRef.current = true;\n const result = effectRef.current?.();\n // If fn returns a Promise, don't return it as cleanup function\n if (isPromiseLike(result)) {\n return;\n }\n\n return result as ReturnType<EffectCallback>;\n }, []);\n}\n\n","export type BREAK_POINT_TOKEN_TYPE = Record<keyof typeof BREAK_POINT_TOKEN_ENUM, number>;\n/** 屏幕响应断点 token 配置 */\nexport const BREAK_POINT_TOKEN_ENUM = {\n XS: 576,\n XSMin: 576,\n XSMax: 767,\n SM: 768,\n SMMin: 768,\n SMMax: 991,\n MD: 992,\n MDMin: 992,\n MDMax: 1199,\n LG: 1200,\n LGMin: 1200,\n LGMax: 1599,\n XL: 1600,\n XLMin: 1600,\n XLMax: 1919,\n XXL: 1920,\n XXLMin: 1920,\n} as const;\n","import type { Breakpoint } from \"@pawover/types\";\nimport { useEffect, useState } from \"react\";\nimport { BREAK_POINT_TOKEN_ENUM, type BREAK_POINT_TOKEN_TYPE } from \"src/enums\";\nimport { objectAssign, objectKeys } from \"src/utils\";\n\ntype Subscriber = () => void;\ntype ResponsiveConfig = Record<Breakpoint, number>;\ntype ResponsiveValues = Record<Breakpoint, boolean>;\n\nconst subscriberList = new Set<Subscriber>();\nconst { XS, SM, MD, LG, XL, XXL } = BREAK_POINT_TOKEN_ENUM;\nconst defaultResponsiveValues: ResponsiveValues = { xxl: false, xl: false, lg: false, md: false, sm: false, xs: false };\nlet responsiveConfig: ResponsiveConfig = { xxl: XXL, xl: XL, lg: LG, md: MD, sm: SM, xs: XS };\nlet responsiveValues: ResponsiveValues = { ...defaultResponsiveValues };\n\ninterface ResponsiveHookOptions {\n /**\n * 紧凑布局断点\n * - 低于此断点时使用紧凑布局\n * @default \"xl\"\n */\n compactBreakPoint?: Breakpoint;\n /** 屏幕响应断点 token 配置 */\n breakPointTokens?: BREAK_POINT_TOKEN_TYPE;\n}\nexport function useResponsive(options?: ResponsiveHookOptions) {\n const { compactBreakPoint = \"xl\", breakPointTokens = {} } = options || {};\n const tokens: BREAK_POINT_TOKEN_TYPE = objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens);\n responsiveConfig = { xxl: tokens.XXL, xl: tokens.XL, lg: tokens.LG, md: tokens.MD, sm: tokens.SM, xs: tokens.XS };\n\n calculate();\n\n const [responsive, setResponsive] = useState<ResponsiveValues>(responsiveValues);\n const isCompact = !responsive[compactBreakPoint];\n const current = objectKeys(defaultResponsiveValues).find((key) => responsive[key] === true) || \"xs\";\n\n useEffect(() => {\n addListener();\n\n const subscriber = () => {\n setResponsive(responsiveValues);\n };\n\n subscriberList.add(subscriber);\n\n return () => {\n subscriberList.delete(subscriber);\n\n if (subscriberList.size === 0) {\n removeListener();\n }\n };\n }, []);\n\n return { responsive, current, isCompact, breakPointTokens: tokens };\n}\n\nfunction resizeListener() {\n const oldInfo = responsiveValues;\n calculate();\n\n if (oldInfo === responsiveValues) {\n return;\n }\n\n for (const subscriber of subscriberList) {\n subscriber();\n }\n}\nfunction addListener() {\n window.addEventListener(\"resize\", resizeListener);\n}\nfunction removeListener() {\n window.removeEventListener(\"resize\", resizeListener);\n}\nfunction calculate() {\n const width = window.innerWidth;\n const newValues = { ...defaultResponsiveValues };\n let shouldUpdate = false;\n\n for (const key of objectKeys(responsiveConfig)) {\n newValues[key] = width >= responsiveConfig[key];\n if (newValues[key] !== responsiveValues[key]) {\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n responsiveValues = newValues;\n }\n}\n\n","import { useEffect } from \"react\";\nimport { isFunction } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\n/**\n * 在组件卸载时执行的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-unmount\n *\n * @param {AnyFunction} effect 副作用函数\n */\nexport function useUnmount(effect: AnyFunction) {\n if (!isFunction(effect)) {\n console.error(`useUnmount expected parameter is a function, got ${typeof effect}`);\n }\n\n const effectRef = useLatest(effect);\n\n useEffect(\n () => () => {\n effectRef.current?.();\n },\n [],\n );\n}\n\n"],"mappings":"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"}
|