@tanwan/utils 1.0.0 → 1.1.0
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/array/chunk.cjs +1 -1
- package/dist/array/chunk.d.cts +1 -1
- package/dist/array/chunk.d.ts +1 -1
- package/dist/array/chunk.js +1 -1
- package/dist/array/chunk.js.map +1 -1
- package/dist/array/flatten.cjs +1 -1
- package/dist/array/flatten.d.cts +1 -1
- package/dist/array/flatten.d.ts +1 -1
- package/dist/array/flatten.js +1 -1
- package/dist/array/flatten.js.map +1 -1
- package/dist/array/groupBy.cjs +36 -0
- package/dist/array/groupBy.d.cts +27 -0
- package/dist/array/groupBy.d.cts.map +1 -0
- package/dist/array/groupBy.d.ts +28 -0
- package/dist/array/groupBy.d.ts.map +1 -0
- package/dist/array/groupBy.js +38 -0
- package/dist/array/groupBy.js.map +1 -0
- package/dist/array/range.cjs +27 -0
- package/dist/array/range.d.cts +21 -0
- package/dist/array/range.d.cts.map +1 -0
- package/dist/array/range.d.ts +22 -0
- package/dist/array/range.d.ts.map +1 -0
- package/dist/array/range.js +29 -0
- package/dist/array/range.js.map +1 -0
- package/dist/array/shuffle.cjs +1 -1
- package/dist/array/shuffle.d.cts +1 -1
- package/dist/array/shuffle.d.ts +1 -1
- package/dist/array/shuffle.js +1 -1
- package/dist/array/shuffle.js.map +1 -1
- package/dist/array/unique.cjs +1 -1
- package/dist/array/unique.d.cts +1 -1
- package/dist/array/unique.d.ts +1 -1
- package/dist/array/unique.js +1 -1
- package/dist/array/unique.js.map +1 -1
- package/dist/base/deepClone.cjs +1 -1
- package/dist/base/deepClone.d.cts +1 -1
- package/dist/base/deepClone.d.ts +1 -1
- package/dist/base/deepClone.js +1 -1
- package/dist/base/deepClone.js.map +1 -1
- package/dist/base/isArray.cjs +1 -1
- package/dist/base/isArray.d.cts +1 -1
- package/dist/base/isArray.d.ts +1 -1
- package/dist/base/isArray.js +1 -1
- package/dist/base/isArray.js.map +1 -1
- package/dist/base/isEmpty.cjs +42 -0
- package/dist/base/isEmpty.d.cts +34 -0
- package/dist/base/isEmpty.d.cts.map +1 -0
- package/dist/base/isEmpty.d.ts +35 -0
- package/dist/base/isEmpty.d.ts.map +1 -0
- package/dist/base/isEmpty.js +44 -0
- package/dist/base/isEmpty.js.map +1 -0
- package/dist/base/isObject.cjs +1 -1
- package/dist/base/isObject.d.cts +1 -1
- package/dist/base/isObject.d.ts +1 -1
- package/dist/base/isObject.js +1 -1
- package/dist/base/isObject.js.map +1 -1
- package/dist/base/isString.cjs +1 -1
- package/dist/base/isString.d.cts +1 -1
- package/dist/base/isString.d.ts +1 -1
- package/dist/base/isString.js +1 -1
- package/dist/base/isString.js.map +1 -1
- package/dist/date/formatDate.cjs +1 -1
- package/dist/date/formatDate.d.cts +1 -1
- package/dist/date/formatDate.d.ts +1 -1
- package/dist/date/formatDate.js +1 -1
- package/dist/date/formatDate.js.map +1 -1
- package/dist/date/getRelativeTime.cjs +1 -1
- package/dist/date/getRelativeTime.d.cts +1 -1
- package/dist/date/getRelativeTime.d.ts +1 -1
- package/dist/date/getRelativeTime.js +1 -1
- package/dist/date/getRelativeTime.js.map +1 -1
- package/dist/function/debounce.cjs +1 -1
- package/dist/function/debounce.d.cts +1 -1
- package/dist/function/debounce.d.ts +1 -1
- package/dist/function/debounce.js +1 -1
- package/dist/function/debounce.js.map +1 -1
- package/dist/function/delay.cjs +8 -0
- package/dist/function/delay.d.cts +19 -0
- package/dist/function/delay.d.cts.map +1 -0
- package/dist/function/delay.d.ts +20 -0
- package/dist/function/delay.d.ts.map +1 -0
- package/dist/function/delay.js +10 -0
- package/dist/function/delay.js.map +1 -0
- package/dist/function/throttle.cjs +1 -1
- package/dist/function/throttle.d.cts +1 -1
- package/dist/function/throttle.d.ts +1 -1
- package/dist/function/throttle.js +1 -1
- package/dist/function/throttle.js.map +1 -1
- package/dist/index.cjs +18 -0
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.iife.js +1 -1
- package/dist/index.js +10 -1
- package/dist/number/clamp.cjs +1 -1
- package/dist/number/clamp.d.cts +1 -1
- package/dist/number/clamp.d.ts +1 -1
- package/dist/number/clamp.js +1 -1
- package/dist/number/clamp.js.map +1 -1
- package/dist/number/formatThousands.cjs +1 -1
- package/dist/number/formatThousands.d.cts +1 -1
- package/dist/number/formatThousands.d.ts +1 -1
- package/dist/number/formatThousands.js +1 -1
- package/dist/number/formatThousands.js.map +1 -1
- package/dist/number/randomInt.cjs +1 -1
- package/dist/number/randomInt.d.cts +1 -1
- package/dist/number/randomInt.d.ts +1 -1
- package/dist/number/randomInt.js +1 -1
- package/dist/number/randomInt.js.map +1 -1
- package/dist/object/omit.cjs +23 -0
- package/dist/object/omit.d.cts +18 -0
- package/dist/object/omit.d.cts.map +1 -0
- package/dist/object/omit.d.ts +19 -0
- package/dist/object/omit.d.ts.map +1 -0
- package/dist/object/omit.js +25 -0
- package/dist/object/omit.js.map +1 -0
- package/dist/object/pick.cjs +22 -0
- package/dist/object/pick.d.cts +18 -0
- package/dist/object/pick.d.cts.map +1 -0
- package/dist/object/pick.d.ts +19 -0
- package/dist/object/pick.d.ts.map +1 -0
- package/dist/object/pick.js +24 -0
- package/dist/object/pick.js.map +1 -0
- package/dist/string/camelCase.cjs +0 -1
- package/dist/string/camelCase.js +0 -1
- package/dist/string/camelCase.js.map +1 -1
- package/dist/string/capitalize.cjs +1 -1
- package/dist/string/capitalize.d.cts +1 -1
- package/dist/string/capitalize.d.ts +1 -1
- package/dist/string/capitalize.js +1 -1
- package/dist/string/capitalize.js.map +1 -1
- package/dist/string/uuid.cjs +23 -0
- package/dist/string/uuid.d.cts +17 -0
- package/dist/string/uuid.d.cts.map +1 -0
- package/dist/string/uuid.d.ts +18 -0
- package/dist/string/uuid.d.ts.map +1 -0
- package/dist/string/uuid.js +25 -0
- package/dist/string/uuid.js.map +1 -0
- package/dist/url/parseQueryString.cjs +48 -0
- package/dist/url/parseQueryString.d.cts +22 -0
- package/dist/url/parseQueryString.d.cts.map +1 -0
- package/dist/url/parseQueryString.d.ts +23 -0
- package/dist/url/parseQueryString.d.ts.map +1 -0
- package/dist/url/parseQueryString.js +50 -0
- package/dist/url/parseQueryString.js.map +1 -0
- package/dist/url/stringifyQueryString.cjs +38 -0
- package/dist/url/stringifyQueryString.d.cts +22 -0
- package/dist/url/stringifyQueryString.d.cts.map +1 -0
- package/dist/url/stringifyQueryString.d.ts +23 -0
- package/dist/url/stringifyQueryString.d.ts.map +1 -0
- package/dist/url/stringifyQueryString.js +40 -0
- package/dist/url/stringifyQueryString.js.map +1 -0
- package/package.json +39 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isEmpty.d.cts","names":[],"sources":["../../src/base/isEmpty/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCwB,OAAA,CAAQ,KAAA;AAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/base/isEmpty/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 判断值是否为空
|
|
4
|
+
*
|
|
5
|
+
* 以下情况视为空:
|
|
6
|
+
* - `null` / `undefined`
|
|
7
|
+
* - 空字符串 `''`
|
|
8
|
+
* - 空数组 `[]`
|
|
9
|
+
* - 普通空对象 `{}`
|
|
10
|
+
* - 空 `Map` / 空 `Set`
|
|
11
|
+
*
|
|
12
|
+
* 数字 `0`、布尔值 `false` 等视为非空
|
|
13
|
+
*
|
|
14
|
+
* @param value - 待检测的值
|
|
15
|
+
* @returns 是否为空
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import isEmpty from '@tanwan/utils/isEmpty'
|
|
20
|
+
* isEmpty(null) // true
|
|
21
|
+
* isEmpty(undefined) // true
|
|
22
|
+
* isEmpty('') // true
|
|
23
|
+
* isEmpty([]) // true
|
|
24
|
+
* isEmpty({}) // true
|
|
25
|
+
* isEmpty(new Map()) // true
|
|
26
|
+
* isEmpty(new Set()) // true
|
|
27
|
+
* isEmpty(0) // false
|
|
28
|
+
* isEmpty(false) // false
|
|
29
|
+
* isEmpty('hello') // false
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare function isEmpty(value: unknown): boolean;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { isEmpty as default };
|
|
35
|
+
//# sourceMappingURL=isEmpty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isEmpty.d.ts","names":[],"sources":["../../src/base/isEmpty/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCwB,OAAA,CAAQ,KAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import isObject from "./isObject.js";
|
|
2
|
+
//#region src/base/isEmpty/index.ts
|
|
3
|
+
/**
|
|
4
|
+
* 判断值是否为空
|
|
5
|
+
*
|
|
6
|
+
* 以下情况视为空:
|
|
7
|
+
* - `null` / `undefined`
|
|
8
|
+
* - 空字符串 `''`
|
|
9
|
+
* - 空数组 `[]`
|
|
10
|
+
* - 普通空对象 `{}`
|
|
11
|
+
* - 空 `Map` / 空 `Set`
|
|
12
|
+
*
|
|
13
|
+
* 数字 `0`、布尔值 `false` 等视为非空
|
|
14
|
+
*
|
|
15
|
+
* @param value - 待检测的值
|
|
16
|
+
* @returns 是否为空
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import isEmpty from '@tanwan/utils/isEmpty'
|
|
21
|
+
* isEmpty(null) // true
|
|
22
|
+
* isEmpty(undefined) // true
|
|
23
|
+
* isEmpty('') // true
|
|
24
|
+
* isEmpty([]) // true
|
|
25
|
+
* isEmpty({}) // true
|
|
26
|
+
* isEmpty(new Map()) // true
|
|
27
|
+
* isEmpty(new Set()) // true
|
|
28
|
+
* isEmpty(0) // false
|
|
29
|
+
* isEmpty(false) // false
|
|
30
|
+
* isEmpty('hello') // false
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function isEmpty(value) {
|
|
34
|
+
if (value === null || value === void 0) return true;
|
|
35
|
+
if (typeof value === "string") return value.length === 0;
|
|
36
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
37
|
+
if (value instanceof Map || value instanceof Set) return value.size === 0;
|
|
38
|
+
if (isObject(value)) return Object.keys(value).length === 0;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { isEmpty as default };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=isEmpty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isEmpty.js","names":[],"sources":["../../src/base/isEmpty/index.ts"],"sourcesContent":["import isObject from '../isObject';\n\n/**\n * 判断值是否为空\n *\n * 以下情况视为空:\n * - `null` / `undefined`\n * - 空字符串 `''`\n * - 空数组 `[]`\n * - 普通空对象 `{}`\n * - 空 `Map` / 空 `Set`\n *\n * 数字 `0`、布尔值 `false` 等视为非空\n *\n * @param value - 待检测的值\n * @returns 是否为空\n *\n * @example\n * ```ts\n * import isEmpty from '@tanwan/utils/isEmpty'\n * isEmpty(null) // true\n * isEmpty(undefined) // true\n * isEmpty('') // true\n * isEmpty([]) // true\n * isEmpty({}) // true\n * isEmpty(new Map()) // true\n * isEmpty(new Set()) // true\n * isEmpty(0) // false\n * isEmpty(false) // false\n * isEmpty('hello') // false\n * ```\n */\nexport default function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value.length === 0;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (isObject(value)) {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAwB,QAAQ,OAAyB;AACvD,KAAI,UAAU,QAAQ,UAAU,KAAA,EAC9B,QAAO;AAGT,KAAI,OAAO,UAAU,SACnB,QAAO,MAAM,WAAW;AAG1B,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,WAAW;AAG1B,KAAI,iBAAiB,OAAO,iBAAiB,IAC3C,QAAO,MAAM,SAAS;AAGxB,KAAI,SAAS,MAAM,CACjB,QAAO,OAAO,KAAK,MAAM,CAAC,WAAW;AAGvC,QAAO"}
|
package/dist/base/isObject.cjs
CHANGED
package/dist/base/isObject.d.cts
CHANGED
package/dist/base/isObject.d.ts
CHANGED
package/dist/base/isObject.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isObject.js","names":[],"sources":["../../src/base/isObject/index.ts"],"sourcesContent":["/**\n * 检测变量是否为普通对象(非null、非数组)\n * @example\n * ```ts\n * import isObject from '@
|
|
1
|
+
{"version":3,"file":"isObject.js","names":[],"sources":["../../src/base/isObject/index.ts"],"sourcesContent":["/**\n * 检测变量是否为普通对象(非null、非数组)\n * @example\n * ```ts\n * import isObject from '@tanwan/utils/isObject'\n * isObject({ a: 1 }) // true\n * isObject(null) // false\n * isObject([1, 2]) // false\n * ```\n */\nexport default function isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAwB,SAAS,GAA0C;AACzE,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,EAAE"}
|
package/dist/base/isString.cjs
CHANGED
package/dist/base/isString.d.cts
CHANGED
package/dist/base/isString.d.ts
CHANGED
package/dist/base/isString.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isString.js","names":[],"sources":["../../src/base/isString/index.ts"],"sourcesContent":["/**\n * 检测变量是否为字符串\n * @example\n * ```ts\n * import isString from '@
|
|
1
|
+
{"version":3,"file":"isString.js","names":[],"sources":["../../src/base/isString/index.ts"],"sourcesContent":["/**\n * 检测变量是否为字符串\n * @example\n * ```ts\n * import isString from '@tanwan/utils/isString'\n * isString('hello') // true\n * isString(123) // false\n * ```\n */\nexport default function isString(v: unknown): v is string {\n return typeof v === 'string';\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,SAAS,GAAyB;AACxD,QAAO,OAAO,MAAM"}
|
package/dist/date/formatDate.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 格式化日期
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import formatDate from '@
|
|
6
|
+
* import formatDate from '@tanwan/utils/formatDate'
|
|
7
7
|
* formatDate(new Date('2024-01-01'), 'yyyy-MM-dd') // '2024-01-01'
|
|
8
8
|
* formatDate(1609459200000, 'yyyy/MM/dd HH:mm') // '2021/01/01 08:00'
|
|
9
9
|
* ```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 格式化日期
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import formatDate from '@
|
|
6
|
+
* import formatDate from '@tanwan/utils/formatDate'
|
|
7
7
|
* formatDate(new Date('2024-01-01'), 'yyyy-MM-dd') // '2024-01-01'
|
|
8
8
|
* formatDate(1609459200000, 'yyyy/MM/dd HH:mm') // '2021/01/01 08:00'
|
|
9
9
|
* ```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 格式化日期
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import formatDate from '@
|
|
6
|
+
* import formatDate from '@tanwan/utils/formatDate'
|
|
7
7
|
* formatDate(new Date('2024-01-01'), 'yyyy-MM-dd') // '2024-01-01'
|
|
8
8
|
* formatDate(1609459200000, 'yyyy/MM/dd HH:mm') // '2021/01/01 08:00'
|
|
9
9
|
* ```
|
package/dist/date/formatDate.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 格式化日期
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import formatDate from '@
|
|
6
|
+
* import formatDate from '@tanwan/utils/formatDate'
|
|
7
7
|
* formatDate(new Date('2024-01-01'), 'yyyy-MM-dd') // '2024-01-01'
|
|
8
8
|
* formatDate(1609459200000, 'yyyy/MM/dd HH:mm') // '2021/01/01 08:00'
|
|
9
9
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatDate.js","names":[],"sources":["../../src/date/formatDate/index.ts"],"sourcesContent":["/**\n * 格式化日期\n * @example\n * ```ts\n * import formatDate from '@
|
|
1
|
+
{"version":3,"file":"formatDate.js","names":[],"sources":["../../src/date/formatDate/index.ts"],"sourcesContent":["/**\n * 格式化日期\n * @example\n * ```ts\n * import formatDate from '@tanwan/utils/formatDate'\n * formatDate(new Date('2024-01-01'), 'yyyy-MM-dd') // '2024-01-01'\n * formatDate(1609459200000, 'yyyy/MM/dd HH:mm') // '2021/01/01 08:00'\n * ```\n */\nexport default function formatDate(date: number | string | Date, fmt = 'yyyy-MM-dd HH:mm:ss'): string {\n if (date == null) return 'Invalid Date';\n\n const iOSReg = /-/g;\n let d: Date;\n\n if (typeof date === 'string') {\n // iOS 日期字符串中包含 -,需要替换为 /\n d = new Date(iOSReg.test(date) ? date.replace(iOSReg, '/') : date);\n } else {\n d = new Date(date);\n }\n\n if (isNaN(d.getTime())) return 'Invalid Date';\n\n const o: Record<string, number> = {\n 'M+': d.getMonth() + 1,\n 'd+': d.getDate(),\n 'H+': d.getHours(),\n 'h+': d.getHours() % 12 || 12,\n 'm+': d.getMinutes(),\n 's+': d.getSeconds(),\n };\n\n // 处理年份\n const yearMatch = fmt.match(/(y+)/);\n if (yearMatch) {\n fmt = fmt.replace(yearMatch[0], String(d.getFullYear()).slice(4 - yearMatch[1].length));\n }\n\n for (const k in o) {\n const match = fmt.match(new RegExp(`(${k})`));\n if (match) {\n const str = String(o[k]);\n fmt = fmt.replace(match[0], match[1].length === 1 ? str : str.padStart(2, '0'));\n }\n }\n\n return fmt;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,WAAW,MAA8B,MAAM,uBAA+B;AACpG,KAAI,QAAQ,KAAM,QAAO;CAEzB,MAAM,SAAS;CACf,IAAI;AAEJ,KAAI,OAAO,SAAS,SAElB,KAAI,IAAI,KAAK,OAAO,KAAK,KAAK,GAAG,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK;KAElE,KAAI,IAAI,KAAK,KAAK;AAGpB,KAAI,MAAM,EAAE,SAAS,CAAC,CAAE,QAAO;CAE/B,MAAM,IAA4B;EAChC,MAAM,EAAE,UAAU,GAAG;EACrB,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,UAAU;EAClB,MAAM,EAAE,UAAU,GAAG,MAAM;EAC3B,MAAM,EAAE,YAAY;EACpB,MAAM,EAAE,YAAY;EACrB;CAGD,MAAM,YAAY,IAAI,MAAM,OAAO;AACnC,KAAI,UACF,OAAM,IAAI,QAAQ,UAAU,IAAI,OAAO,EAAE,aAAa,CAAC,CAAC,MAAM,IAAI,UAAU,GAAG,OAAO,CAAC;AAGzF,MAAK,MAAM,KAAK,GAAG;EACjB,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE,GAAG,CAAC;AAC7C,MAAI,OAAO;GACT,MAAM,MAAM,OAAO,EAAE,GAAG;AACxB,SAAM,IAAI,QAAQ,MAAM,IAAI,MAAM,GAAG,WAAW,IAAI,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC;;;AAInF,QAAO"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 获取相对时间描述(如"3分钟前")
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import getRelativeTime from '@
|
|
6
|
+
* import getRelativeTime from '@tanwan/utils/getRelativeTime'
|
|
7
7
|
* getRelativeTime(Date.now() - 60000) // '1分钟前'
|
|
8
8
|
* getRelativeTime(Date.now() - 3600000) // '1小时前'
|
|
9
9
|
* ```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 获取相对时间描述(如"3分钟前")
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import getRelativeTime from '@
|
|
6
|
+
* import getRelativeTime from '@tanwan/utils/getRelativeTime'
|
|
7
7
|
* getRelativeTime(Date.now() - 60000) // '1分钟前'
|
|
8
8
|
* getRelativeTime(Date.now() - 3600000) // '1小时前'
|
|
9
9
|
* ```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 获取相对时间描述(如"3分钟前")
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import getRelativeTime from '@
|
|
6
|
+
* import getRelativeTime from '@tanwan/utils/getRelativeTime'
|
|
7
7
|
* getRelativeTime(Date.now() - 60000) // '1分钟前'
|
|
8
8
|
* getRelativeTime(Date.now() - 3600000) // '1小时前'
|
|
9
9
|
* ```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 获取相对时间描述(如"3分钟前")
|
|
4
4
|
* @example
|
|
5
5
|
* ```ts
|
|
6
|
-
* import getRelativeTime from '@
|
|
6
|
+
* import getRelativeTime from '@tanwan/utils/getRelativeTime'
|
|
7
7
|
* getRelativeTime(Date.now() - 60000) // '1分钟前'
|
|
8
8
|
* getRelativeTime(Date.now() - 3600000) // '1小时前'
|
|
9
9
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRelativeTime.js","names":[],"sources":["../../src/date/getRelativeTime/index.ts"],"sourcesContent":["/**\n * 获取相对时间描述(如\"3分钟前\")\n * @example\n * ```ts\n * import getRelativeTime from '@
|
|
1
|
+
{"version":3,"file":"getRelativeTime.js","names":[],"sources":["../../src/date/getRelativeTime/index.ts"],"sourcesContent":["/**\n * 获取相对时间描述(如\"3分钟前\")\n * @example\n * ```ts\n * import getRelativeTime from '@tanwan/utils/getRelativeTime'\n * getRelativeTime(Date.now() - 60000) // '1分钟前'\n * getRelativeTime(Date.now() - 3600000) // '1小时前'\n * ```\n */\nexport default function getRelativeTime(date: number | string | Date, now: Date = new Date()): string {\n const d = new Date(date);\n const diff = now.getTime() - d.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (seconds < 0) return '刚刚';\n if (seconds < 60) return `${seconds}秒前`;\n if (minutes < 60) return `${minutes}分钟前`;\n if (hours < 24) return `${hours}小时前`;\n if (days < 30) return `${days}天前`;\n if (months < 12) return `${months}个月前`;\n return `${years}年前`;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,gBAAgB,MAA8B,sBAAY,IAAI,MAAM,EAAU;CACpG,MAAM,IAAI,IAAI,KAAK,KAAK;CACxB,MAAM,OAAO,IAAI,SAAS,GAAG,EAAE,SAAS;CACxC,MAAM,UAAU,KAAK,MAAM,OAAO,IAAK;CACvC,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;CACxC,MAAM,QAAQ,KAAK,MAAM,UAAU,GAAG;CACtC,MAAM,OAAO,KAAK,MAAM,QAAQ,GAAG;CACnC,MAAM,SAAS,KAAK,MAAM,OAAO,GAAG;CACpC,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI;AAEpC,KAAI,UAAU,EAAG,QAAO;AACxB,KAAI,UAAU,GAAI,QAAO,GAAG,QAAQ;AACpC,KAAI,UAAU,GAAI,QAAO,GAAG,QAAQ;AACpC,KAAI,QAAQ,GAAI,QAAO,GAAG,MAAM;AAChC,KAAI,OAAO,GAAI,QAAO,GAAG,KAAK;AAC9B,KAAI,SAAS,GAAI,QAAO,GAAG,OAAO;AAClC,QAAO,GAAG,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.js","names":[],"sources":["../../src/function/debounce/index.ts"],"sourcesContent":["/**\n * 防抖函数\n * @example\n * ```ts\n * import debounce from '@
|
|
1
|
+
{"version":3,"file":"debounce.js","names":[],"sources":["../../src/function/debounce/index.ts"],"sourcesContent":["/**\n * 防抖函数\n * @example\n * ```ts\n * import debounce from '@tanwan/utils/debounce'\n * const search = debounce((keyword: string) => {\n * console.log('搜索:', keyword)\n * }, 300)\n * ```\n */\nexport default function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n immediate = false,\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let canImmediate = immediate;\n\n return function (this: unknown, ...args: Parameters<T>) {\n if (canImmediate) {\n func.apply(this, args);\n canImmediate = false;\n }\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n if (!immediate) {\n func.apply(this, args);\n }\n timer = null;\n canImmediate = immediate;\n }, wait);\n };\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAwB,SACtB,MACA,MACA,YAAY,OACsB;CAClC,IAAI,QAA8C;CAClD,IAAI,eAAe;AAEnB,QAAO,SAAyB,GAAG,MAAqB;AACtD,MAAI,cAAc;AAChB,QAAK,MAAM,MAAM,KAAK;AACtB,kBAAe;;AAGjB,MAAI,MACF,cAAa,MAAM;AAGrB,UAAQ,iBAAiB;AACvB,OAAI,CAAC,UACH,MAAK,MAAM,MAAM,KAAK;AAExB,WAAQ;AACR,kBAAe;KACd,KAAK"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/function/delay/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 返回一个在指定毫秒后 resolve 的 Promise
|
|
4
|
+
*
|
|
5
|
+
* @param ms - 延迟毫秒数,默认为 0
|
|
6
|
+
* @param value - 可选,resolve 时传递的值
|
|
7
|
+
* @returns 在延迟后 resolve 的 Promise
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import delay from '@tanwan/utils/delay'
|
|
12
|
+
* await delay(1000) // 等待 1 秒后 resolve
|
|
13
|
+
* const result = await delay(500, 'done') // 500ms 后 resolve 'done'
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare function delay(ms?: number): Promise<void>;
|
|
17
|
+
declare function delay<T>(ms: number, value: T): Promise<T>;
|
|
18
|
+
export = delay;
|
|
19
|
+
//# sourceMappingURL=delay.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delay.d.cts","names":[],"sources":["../../src/function/delay/index.ts"],"mappings":";;;;;;;AAc4C;;;;;;;;iBAApB,KAAA,CAAM,EAAA,YAAc,OAAA;AAAA,iBACpB,KAAA,GAAA,CAAS,EAAA,UAAY,KAAA,EAAO,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/function/delay/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 返回一个在指定毫秒后 resolve 的 Promise
|
|
4
|
+
*
|
|
5
|
+
* @param ms - 延迟毫秒数,默认为 0
|
|
6
|
+
* @param value - 可选,resolve 时传递的值
|
|
7
|
+
* @returns 在延迟后 resolve 的 Promise
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import delay from '@tanwan/utils/delay'
|
|
12
|
+
* await delay(1000) // 等待 1 秒后 resolve
|
|
13
|
+
* const result = await delay(500, 'done') // 500ms 后 resolve 'done'
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare function delay(ms?: number): Promise<void>;
|
|
17
|
+
declare function delay<T>(ms: number, value: T): Promise<T>;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { delay as default };
|
|
20
|
+
//# sourceMappingURL=delay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delay.d.ts","names":[],"sources":["../../src/function/delay/index.ts"],"mappings":";;;;;;;AAc4C;;;;;;;;iBAApB,KAAA,CAAM,EAAA,YAAc,OAAA;AAAA,iBACpB,KAAA,GAAA,CAAS,EAAA,UAAY,KAAA,EAAO,CAAA,GAAI,OAAA,CAAQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delay.js","names":[],"sources":["../../src/function/delay/index.ts"],"sourcesContent":["/**\n * 返回一个在指定毫秒后 resolve 的 Promise\n *\n * @param ms - 延迟毫秒数,默认为 0\n * @param value - 可选,resolve 时传递的值\n * @returns 在延迟后 resolve 的 Promise\n *\n * @example\n * ```ts\n * import delay from '@tanwan/utils/delay'\n * await delay(1000) // 等待 1 秒后 resolve\n * const result = await delay(500, 'done') // 500ms 后 resolve 'done'\n * ```\n */\nexport default function delay(ms?: number): Promise<void>;\nexport default function delay<T>(ms: number, value: T): Promise<T>;\nexport default function delay<T>(ms = 0, value?: T): Promise<T | void> {\n return new Promise((resolve) => {\n setTimeout(() => resolve(value), ms);\n });\n}\n"],"mappings":";AAgBA,SAAwB,MAAS,KAAK,GAAG,OAA8B;AACrE,QAAO,IAAI,SAAS,YAAY;AAC9B,mBAAiB,QAAQ,MAAM,EAAE,GAAG;GACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throttle.js","names":[],"sources":["../../src/function/throttle/index.ts"],"sourcesContent":["/**\n * 节流函数\n * @example\n * ```ts\n * import throttle from '@
|
|
1
|
+
{"version":3,"file":"throttle.js","names":[],"sources":["../../src/function/throttle/index.ts"],"sourcesContent":["/**\n * 节流函数\n * @example\n * ```ts\n * import throttle from '@tanwan/utils/throttle'\n * const onScroll = throttle(() => {\n * console.log('滚动事件触发')\n * }, 200)\n * ```\n */\nexport default function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n\n return function (this: unknown, ...args: Parameters<T>) {\n lastArgs = args;\n\n if (timer) return;\n\n timer = setTimeout(() => {\n if (lastArgs) {\n func.apply(this, lastArgs);\n lastArgs = null;\n }\n timer = null;\n }, wait);\n };\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAwB,SACtB,MACA,MACkC;CAClC,IAAI,QAA8C;CAClD,IAAI,WAAiC;AAErC,QAAO,SAAyB,GAAG,MAAqB;AACtD,aAAW;AAEX,MAAI,MAAO;AAEX,UAAQ,iBAAiB;AACvB,OAAI,UAAU;AACZ,SAAK,MAAM,MAAM,SAAS;AAC1B,eAAW;;AAEb,WAAQ;KACP,KAAK"}
|
package/dist/index.cjs
CHANGED
|
@@ -3,12 +3,18 @@ const require_base_isArray = require("./base/isArray.cjs");
|
|
|
3
3
|
const require_base_isString = require("./base/isString.cjs");
|
|
4
4
|
const require_base_isObject = require("./base/isObject.cjs");
|
|
5
5
|
const require_base_deepClone = require("./base/deepClone.cjs");
|
|
6
|
+
const require_base_isEmpty = require("./base/isEmpty.cjs");
|
|
7
|
+
const require_object_pick = require("./object/pick.cjs");
|
|
8
|
+
const require_object_omit = require("./object/omit.cjs");
|
|
6
9
|
const require_function_debounce = require("./function/debounce.cjs");
|
|
7
10
|
const require_function_throttle = require("./function/throttle.cjs");
|
|
11
|
+
const require_function_delay = require("./function/delay.cjs");
|
|
8
12
|
const require_array_unique = require("./array/unique.cjs");
|
|
9
13
|
const require_array_flatten = require("./array/flatten.cjs");
|
|
10
14
|
const require_array_chunk = require("./array/chunk.cjs");
|
|
11
15
|
const require_array_shuffle = require("./array/shuffle.cjs");
|
|
16
|
+
const require_array_range = require("./array/range.cjs");
|
|
17
|
+
const require_array_groupBy = require("./array/groupBy.cjs");
|
|
12
18
|
const require_number_randomInt = require("./number/randomInt.cjs");
|
|
13
19
|
const require_number_clamp = require("./number/clamp.cjs");
|
|
14
20
|
const require_number_formatThousands = require("./number/formatThousands.cjs");
|
|
@@ -17,21 +23,33 @@ const require_date_getRelativeTime = require("./date/getRelativeTime.cjs");
|
|
|
17
23
|
const require_string_camelCase = require("./string/camelCase.cjs");
|
|
18
24
|
const require_string_kebabCase = require("./string/kebabCase.cjs");
|
|
19
25
|
const require_string_capitalize = require("./string/capitalize.cjs");
|
|
26
|
+
const require_string_uuid = require("./string/uuid.cjs");
|
|
27
|
+
const require_url_parseQueryString = require("./url/parseQueryString.cjs");
|
|
28
|
+
const require_url_stringifyQueryString = require("./url/stringifyQueryString.cjs");
|
|
20
29
|
exports.camelCase = require_string_camelCase;
|
|
21
30
|
exports.capitalize = require_string_capitalize;
|
|
22
31
|
exports.chunk = require_array_chunk;
|
|
23
32
|
exports.clamp = require_number_clamp;
|
|
24
33
|
exports.debounce = require_function_debounce;
|
|
25
34
|
exports.deepClone = require_base_deepClone;
|
|
35
|
+
exports.delay = require_function_delay;
|
|
26
36
|
exports.flatten = require_array_flatten;
|
|
27
37
|
exports.formatDate = require_date_formatDate;
|
|
28
38
|
exports.formatThousands = require_number_formatThousands;
|
|
29
39
|
exports.getRelativeTime = require_date_getRelativeTime;
|
|
40
|
+
exports.groupBy = require_array_groupBy;
|
|
30
41
|
exports.isArray = require_base_isArray;
|
|
42
|
+
exports.isEmpty = require_base_isEmpty;
|
|
31
43
|
exports.isObject = require_base_isObject;
|
|
32
44
|
exports.isString = require_base_isString;
|
|
33
45
|
exports.kebabCase = require_string_kebabCase;
|
|
46
|
+
exports.omit = require_object_omit;
|
|
47
|
+
exports.parseQueryString = require_url_parseQueryString;
|
|
48
|
+
exports.pick = require_object_pick;
|
|
34
49
|
exports.randomInt = require_number_randomInt;
|
|
50
|
+
exports.range = require_array_range;
|
|
35
51
|
exports.shuffle = require_array_shuffle;
|
|
52
|
+
exports.stringifyQueryString = require_url_stringifyQueryString;
|
|
36
53
|
exports.throttle = require_function_throttle;
|
|
37
54
|
exports.unique = require_array_unique;
|
|
55
|
+
exports.uuid = require_string_uuid;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import chunk from "./array/chunk.cjs";
|
|
2
2
|
import flatten from "./array/flatten.cjs";
|
|
3
|
+
import groupBy from "./array/groupBy.cjs";
|
|
4
|
+
import range from "./array/range.cjs";
|
|
3
5
|
import shuffle from "./array/shuffle.cjs";
|
|
4
6
|
import unique from "./array/unique.cjs";
|
|
5
7
|
import deepClone from "./base/deepClone.cjs";
|
|
6
8
|
import isArray from "./base/isArray.cjs";
|
|
9
|
+
import isEmpty from "./base/isEmpty.cjs";
|
|
7
10
|
import isObject from "./base/isObject.cjs";
|
|
8
11
|
import isString from "./base/isString.cjs";
|
|
9
12
|
import formatDate from "./date/formatDate.cjs";
|
|
10
13
|
import getRelativeTime from "./date/getRelativeTime.cjs";
|
|
11
14
|
import debounce from "./function/debounce.cjs";
|
|
15
|
+
import delay from "./function/delay.cjs";
|
|
12
16
|
import throttle from "./function/throttle.cjs";
|
|
17
|
+
import pick from "./object/pick.cjs";
|
|
18
|
+
import omit from "./object/omit.cjs";
|
|
13
19
|
import randomInt from "./number/randomInt.cjs";
|
|
14
20
|
import clamp from "./number/clamp.cjs";
|
|
15
21
|
import formatThousands from "./number/formatThousands.cjs";
|
|
16
22
|
import camelCase from "./string/camelCase.cjs";
|
|
17
23
|
import kebabCase from "./string/kebabCase.cjs";
|
|
18
24
|
import capitalize from "./string/capitalize.cjs";
|
|
19
|
-
|
|
25
|
+
import uuid from "./string/uuid.cjs";
|
|
26
|
+
import parseQueryString from "./url/parseQueryString.cjs";
|
|
27
|
+
import stringifyQueryString from "./url/stringifyQueryString.cjs";
|
|
28
|
+
export { camelCase, capitalize, chunk, clamp, debounce, deepClone, delay, flatten, formatDate, formatThousands, getRelativeTime, groupBy, isArray, isEmpty, isObject, isString, kebabCase, omit, parseQueryString, pick, randomInt, range, shuffle, stringifyQueryString, throttle, unique, uuid };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import chunk from "./array/chunk.js";
|
|
2
2
|
import flatten from "./array/flatten.js";
|
|
3
|
+
import groupBy from "./array/groupBy.js";
|
|
4
|
+
import range from "./array/range.js";
|
|
3
5
|
import shuffle from "./array/shuffle.js";
|
|
4
6
|
import unique from "./array/unique.js";
|
|
5
7
|
import deepClone from "./base/deepClone.js";
|
|
6
8
|
import isArray from "./base/isArray.js";
|
|
9
|
+
import isEmpty from "./base/isEmpty.js";
|
|
7
10
|
import isObject from "./base/isObject.js";
|
|
8
11
|
import isString from "./base/isString.js";
|
|
9
12
|
import formatDate from "./date/formatDate.js";
|
|
10
13
|
import getRelativeTime from "./date/getRelativeTime.js";
|
|
11
14
|
import debounce from "./function/debounce.js";
|
|
15
|
+
import delay from "./function/delay.js";
|
|
12
16
|
import throttle from "./function/throttle.js";
|
|
17
|
+
import pick from "./object/pick.js";
|
|
18
|
+
import omit from "./object/omit.js";
|
|
13
19
|
import randomInt from "./number/randomInt.js";
|
|
14
20
|
import clamp from "./number/clamp.js";
|
|
15
21
|
import formatThousands from "./number/formatThousands.js";
|
|
16
22
|
import camelCase from "./string/camelCase.js";
|
|
17
23
|
import kebabCase from "./string/kebabCase.js";
|
|
18
24
|
import capitalize from "./string/capitalize.js";
|
|
19
|
-
|
|
25
|
+
import uuid from "./string/uuid.js";
|
|
26
|
+
import parseQueryString from "./url/parseQueryString.js";
|
|
27
|
+
import stringifyQueryString from "./url/stringifyQueryString.js";
|
|
28
|
+
export { camelCase, capitalize, chunk, clamp, debounce, deepClone, delay, flatten, formatDate, formatThousands, getRelativeTime, groupBy, isArray, isEmpty, isObject, isString, kebabCase, omit, parseQueryString, pick, randomInt, range, shuffle, stringifyQueryString, throttle, unique, uuid };
|
package/dist/index.iife.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var TWUtils=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return Array.isArray(e)}function n(e){return typeof e==`string`}function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,t=new WeakMap){if(typeof e!=`object`||!e)return e;if(t.has(e))return t.get(e);if(Array.isArray(e)){let n=[];t.set(e,n);for(let r=0;r<e.length;r++)n[r]=i(e[r],t);return n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let n=new Map;t.set(e,n);for(let[r,a]of e)n.set(r,i(a,t));return n}if(e instanceof Set){let n=new Set;t.set(e,n);for(let r of e)n.add(i(r,t));return n}if(e instanceof WeakMap)throw Error(`Cannot clone WeakMap`);if(e instanceof WeakSet)throw Error(`Cannot clone WeakSet`);if(r(e)){let n={};t.set(e,n);for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=i(e[r],t));return n}return e}function a(e,t,n=!1){let r=null,i=n;return function(...a){i&&=(e.apply(this,a),!1),r&&clearTimeout(r),r=setTimeout(()=>{n||e.apply(this,a),r=null,i=n},t)}}function
|
|
1
|
+
var TWUtils=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return Array.isArray(e)}function n(e){return typeof e==`string`}function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,t=new WeakMap){if(typeof e!=`object`||!e)return e;if(t.has(e))return t.get(e);if(Array.isArray(e)){let n=[];t.set(e,n);for(let r=0;r<e.length;r++)n[r]=i(e[r],t);return n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let n=new Map;t.set(e,n);for(let[r,a]of e)n.set(r,i(a,t));return n}if(e instanceof Set){let n=new Set;t.set(e,n);for(let r of e)n.add(i(r,t));return n}if(e instanceof WeakMap)throw Error(`Cannot clone WeakMap`);if(e instanceof WeakSet)throw Error(`Cannot clone WeakSet`);if(r(e)){let n={};t.set(e,n);for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=i(e[r],t));return n}return e}function a(e){return e==null?!0:typeof e==`string`||Array.isArray(e)?e.length===0:e instanceof Map||e instanceof Set?e.size===0:r(e)?Object.keys(e).length===0:!1}function o(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function s(e,t){let n=new Set(t),r={};for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&!n.has(t)&&(r[t]=e[t]);return r}function c(e,t,n=!1){let r=null,i=n;return function(...a){i&&=(e.apply(this,a),!1),r&&clearTimeout(r),r=setTimeout(()=>{n||e.apply(this,a),r=null,i=n},t)}}function l(e,t){let n=null,r=null;return function(...i){r=i,!n&&(n=setTimeout(()=>{r&&=(e.apply(this,r),null),n=null},t))}}function u(e=0,t){return new Promise(n=>{setTimeout(()=>n(t),e)})}function d(e){return[...new Set(e)]}function f(e,t=1/0){if(t===0)return e;let n=[];for(let r of e)Array.isArray(r)&&t>0?n.push(...f(r,t-1)):n.push(r);return n}function p(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function m(e){let t=[...e];for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}function h(e,t,n=1){if(n===0)throw Error(`step 不能为 0`);let r=[];if(n>0)for(let i=e;i<t;i+=n)r.push(i);else for(let i=e;i>t;i+=n)r.push(i);return r}function g(e,t){let n={},r=typeof t==`function`?t:e=>String(e[t]);for(let t of e){let e=String(r(t));n[e]||(n[e]=[]),n[e].push(t)}return n}function _(e,t){return Math.floor(Math.random()*(t-e+1))+e}function v(e,t,n){return Math.min(Math.max(e,t),n)}function y(e){let t=String(e).split(`.`);return t[0]=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,`,`),t.join(`.`)}function b(e,t=`yyyy-MM-dd HH:mm:ss`){if(e==null)return`Invalid Date`;let n=/-/g,r;if(r=typeof e==`string`?new Date(n.test(e)?e.replace(n,`/`):e):new Date(e),isNaN(r.getTime()))return`Invalid Date`;let i={"M+":r.getMonth()+1,"d+":r.getDate(),"H+":r.getHours(),"h+":r.getHours()%12||12,"m+":r.getMinutes(),"s+":r.getSeconds()},a=t.match(/(y+)/);a&&(t=t.replace(a[0],String(r.getFullYear()).slice(4-a[1].length)));for(let e in i){let n=t.match(RegExp(`(${e})`));if(n){let r=String(i[e]);t=t.replace(n[0],n[1].length===1?r:r.padStart(2,`0`))}}return t}function x(e,t=new Date){let n=new Date(e),r=t.getTime()-n.getTime(),i=Math.floor(r/1e3),a=Math.floor(i/60),o=Math.floor(a/60),s=Math.floor(o/24),c=Math.floor(s/30),l=Math.floor(s/365);return i<0?`刚刚`:i<60?`${i}秒前`:a<60?`${a}分钟前`:o<24?`${o}小时前`:s<30?`${s}天前`:c<12?`${c}个月前`:`${l}年前`}function S(e,t=!1){let n=e.replace(/[-_.\s]+(\w|$)/g,(e,t)=>t.toUpperCase());return t&&n.length>0&&(n=n[0].toUpperCase()+n.slice(1)),n}function C(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/[-_.\s]+/g,`-`).toLowerCase()}function w(e){return e&&e.charAt(0).toUpperCase()+e.slice(1)}function T(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function E(e){let t=e??(typeof location<`u`?location.search:``);if(!t)return{};let n=t.startsWith(`?`)?t.slice(1):t;if(!n)return{};let r={};for(let e of n.split(`&`)){if(!e)continue;let[t,n=``]=e.split(`=`),i=decodeURIComponent(t),a=D(decodeURIComponent(n));if(i in r){let e=r[i];Array.isArray(e)?e.push(a):r[i]=[e,a]}else r[i]=a}return r}function D(e){if(e===`true`)return!0;if(e===`false`)return!1;if(e===``)return``;let t=Number(e);return!Number.isNaN(t)&&String(t)===e?t:e}function O(e){let t=[];for(let n of Object.keys(e)){let r=e[n];if(r!==void 0){if(r===null){t.push(`${encodeURIComponent(n)}=`);continue}if(Array.isArray(r)){for(let e of r)t.push(`${encodeURIComponent(n)}=${encodeURIComponent(String(e))}`);continue}t.push(`${encodeURIComponent(n)}=${encodeURIComponent(String(r))}`)}}return t.join(`&`)}return e.camelCase=S,e.capitalize=w,e.chunk=p,e.clamp=v,e.debounce=c,e.deepClone=i,e.delay=u,e.flatten=f,e.formatDate=b,e.formatThousands=y,e.getRelativeTime=x,e.groupBy=g,e.isArray=t,e.isEmpty=a,e.isObject=r,e.isString=n,e.kebabCase=C,e.omit=s,e.parseQueryString=E,e.pick=o,e.randomInt=_,e.range=h,e.shuffle=m,e.stringifyQueryString=O,e.throttle=l,e.unique=d,e.uuid=T,e})({});
|