@longmo-utils/common 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["TinyColor","TinyColor","TinyColor","utc","timezone","utc","timezone"],"sources":["../package.json","../src/_internal/_version.ts","../src/array/unique.ts","../src/array/groupBy.ts","../src/array/chunk.ts","../src/array/uniqueByField.ts","../src/object/deepClone.ts","../src/object/deepEqual.ts","../src/object/deepMerge.ts","../src/object/get.ts","../src/object/set.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/partial.ts","../src/function/throttle.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/isEmpty.ts","../src/string/kebabCase.ts","../src/string/random.ts","../src/string/snakeCase.ts","../src/string/truncate.ts","../src/util/isTypeOf.ts","../src/util/isArray.ts","../src/util/isEmptyObject.ts","../src/util/isObject.ts","../src/string/safeJsonStringify.ts","../src/util/isString.ts","../src/string/safeParseJson.ts","../src/util/isBoolean.ts","../src/util/isDate.ts","../src/util/isError.ts","../src/util/isFunction.ts","../src/util/isMap.ts","../src/util/isNull.ts","../src/util/isUndefined.ts","../src/util/isNil.ts","../src/util/isNumber.ts","../src/util/isPromise.ts","../src/util/isRegExp.ts","../src/util/isSet.ts","../src/util/isSymbol.ts","../src/url/querystringify.ts","../src/url/parseQueryString.ts","../src/url/urlParse.ts","../src/accountant/convertChineseNumber.ts","../src/accountant/convertCurrency.ts","../src/_internal/_numeral.ts","../src/accountant/format.ts","../src/accountant/formatMoney.ts","../src/accountant/formatNumber.ts","../src/accountant/formatPercentage.ts","../src/accountant/getFormatStr.ts","../src/accountant/toFixed.ts","../src/accountant/unformat.ts","../src/color/color.ts","../src/color/convert.ts","../src/color/generator.ts","../src/date/formatDate.ts","../src/date/formatDateTime.ts","../src/date/isDateInstance.ts","../src/date/isDayjsObject.ts","../src/date/constants.ts","../src/tree/traverseTreeValues.ts","../src/tree/filterTree.ts","../src/tree/mapTree.ts","../src/tree/sortTree.ts","../src/_internal/_dayjs.ts"],"sourcesContent":["","import { version } from '../../package.json'\n/**\n * 工具箱版本\n * @public\n */\nexport const _version = version\n","/**\n * 移除数组中的重复值\n *\n * @param arr - 输入数组\n * @returns 去除重复值后的新数组\n * @example\n * ```ts\n * unique([1, 2, 2, 3, 3, 3]) // [1, 2, 3]\n * unique(['a', 'b', 'a', 'c']) // ['a', 'b', 'c']\n * ```\n */\nexport function unique<T>(arr: T[]): T[] {\n return Array.from(new Set(arr))\n}\n","/**\n * 根据键函数对数组元素进行分组\n *\n * @param arr - 要分组的输入数组\n * @param keyFn - 返回每个元素的分组键的函数\n * @returns 对象,其中键是分组结果,值是元素数组\n * @example\n * ```ts\n * const data = [\n * { name: 'Alice', role: 'admin' },\n * { name: 'Bob', role: 'user' },\n * { name: 'Charlie', role: 'admin' }\n * ]\n * groupBy(data, item => item.role)\n * // { admin: [{ name: 'Alice', role: 'admin' }, { name: 'Charlie', role: 'admin' }],\n * // user: [{ name: 'Bob', role: 'user' }] }\n * ```\n */\nexport function groupBy<T, K extends string | number>(\n arr: T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n return arr.reduce((acc, item) => {\n const key = keyFn(item)\n if (!acc[key]) {\n acc[key] = []\n }\n acc[key].push(item)\n return acc\n }, {} as Record<K, T[]>)\n}\n","/**\n * 将数组拆分成指定大小的子数组\n *\n * @param arr - 要拆分的输入数组\n * @param size - 每个子数组的大小。如果小于等于 0,则默认为 1\n * @returns 子数组的数组\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk([1, 2, 3, 4, 5], 3) // [[1, 2, 3], [4, 5]]\n * chunk([1, 2, 3], 5) // [[1, 2, 3]]\n * chunk([1, 2, 3], 0) // [[1], [2], [3]] (size 默认为 1)\n * chunk([1, 2, 3], -2) // [[1], [2], [3]] (size 默认为 1)\n * ```\n */\nexport function chunk<T>(arr: T[], size: number): T[][] {\n if (size <= 0){\n size = 1\n }\n const result: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size))\n }\n return result\n}\n","/**\n * @Author: longmo\n * @Date: 2026-01-25 20:41:10\n * @LastEditTime: 2026-01-25 20:41:19\n * @FilePath: packages/common/src/array/uniqueByField.ts\n * @Description:\n */\n/**\n * 根据指定字段对对象数组进行去重\n * @param arr 要去重的对象数组\n * @param key 去重依据的字段名\n * @returns 去重后的对象数组\n */\nfunction uniqueByField<T>(arr: T[], key: keyof T): T[] {\n const seen = new Map<any, T>();\n return arr.filter((item) => {\n const value = item[key];\n return seen.has(value) ? false : (seen.set(value, item), true);\n });\n}\n\nexport { uniqueByField };\n","/**\n * 深度克隆一个对象\n * @param obj - 要克隆的对象\n * @returns 克隆后的对象\n * @example\n * ```ts\n * const obj = {a: 1, b: {c: 2}}\n * const cloned = deepClone(obj)\n * cloned.b.c = 3\n * console.log(obj.b.c) // 2\n * ```\n * @public\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T\n }\n\n const cloned = {} as T\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key])\n }\n }\n\n return cloned\n}\n","/**\n * 深度比较两个对象是否相等\n * @param a - 第一个对象\n * @param b - 第二个对象\n * @returns 是否相等\n * @example\n * ```ts\n * deepEqual({a: 1}, {a: 1}) // true\n * deepEqual({a: {b: 1}}, {a: {b: 1}}) // true\n * deepEqual({a: 1}, {a: 2}) // false\n * ```\n * @public\n */\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true\n\n if (typeof a !== typeof b) return false\n\n if (typeof a !== 'object' || a === null || b === null) return false\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n","/**\n * 深度合并多个对象\n * @param objects - 要合并的对象数组\n * @returns 合并后的对象\n * @example\n * ```ts\n * deepMerge({a: 1}, {b: 2}) // {a: 1, b: 2}\n * deepMerge({a: {x: 1}}, {a: {y: 2}}) // {a: {x: 1, y: 2}}\n * ```\n * @public\n */\nexport function deepMerge<T extends Record<string, any>>(...objects: Partial<T>[]): T {\n const result = {} as any\n\n for (const obj of objects) {\n for (const key in obj) {\n if (obj[key] !== undefined) {\n if (\n typeof obj[key] === 'object' &&\n obj[key] !== null &&\n !Array.isArray(obj[key]) &&\n typeof result[key] === 'object' &&\n result[key] !== null\n ) {\n result[key] = deepMerge(result[key], obj[key])\n } else {\n result[key] = obj[key]\n }\n }\n }\n }\n\n return result\n}\n","/**\n * 通过路径字符串获取对象的嵌套值\n * @param obj - 对象\n * @param path - 路径字符串,使用点分隔\n * @param defaultValue - 默认值\n * @returns 获取的值\n * @example\n * ```ts\n * const obj = {a: {b: {c: 1}}}\n * get(obj, 'a.b.c') // 1\n * get(obj, 'a.b.d', 'default') // 'default'\n * ```\n * @public\n */\nexport function get(obj: any, path: string, defaultValue?: any): any {\n const keys = path.split('.')\n let result = obj\n\n for (const key of keys) {\n if (result === null || result === undefined) {\n return defaultValue\n }\n result = result[key]\n }\n\n return result !== undefined ? result : defaultValue\n}\n","/**\n * 通过路径字符串设置对象的嵌套值\n * @param obj - 对象\n * @param path - 路径字符串,使用点分隔\n * @param value - 要设置的值\n * @example\n * ```ts\n * const obj = {a: {}}\n * set(obj, 'a.b.c', 1)\n * console.log(obj) // {a: {b: {c: 1}}}\n * ```\n * @public\n */\nexport function set(obj: any, path: string, value: any): void {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n let current = obj\n\n for (const key of keys) {\n if (current[key] === undefined) {\n current[key] = {}\n }\n current = current[key]\n }\n\n current[lastKey] = value\n}\n","/**\n * 防抖函数,延迟执行函数\n * @param fn - 要执行的函数\n * @param delay - 延迟时间(毫秒)\n * @returns 防抖后的函数\n * @example\n * ```ts\n * const debouncedFn = debounce(() => console.log('hello'), 300)\n * debouncedFn() // 300ms 后执行\n * debouncedFn() // 重置计时器,300ms 后执行\n * ```\n * @public\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId)\n }\n timeoutId = setTimeout(() => {\n fn.apply(this, args)\n }, delay)\n }\n}\n","/**\n * 创建函数的记忆化版本,缓存函数结果\n * @param fn - 要记忆化的函数\n * @param keyFn - 可选的缓存键生成函数\n * @returns 记忆化后的函数\n * @example\n * ```ts\n * const memoizedFn = memoize((a: number) => a * 2)\n * memoizedFn(2) // 4,计算并缓存\n * memoizedFn(2) // 4,从缓存返回\n * ```\n * @public\n */\nexport function memoize<T extends (...args: any[]) => any>(\n fn: T,\n keyFn?: (...args: Parameters<T>) => string\n): T {\n const cache = new Map<string, ReturnType<T>>()\n\n return ((...args: Parameters<T>) => {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args)\n\n if (cache.has(key)) {\n return cache.get(key)!\n }\n\n const result = fn(...args)\n cache.set(key, result)\n return result\n }) as T\n}\n","/**\n * 创建偏函数,预设部分参数\n * @param fn - 原始函数\n * @param presetArgs - 预设的参数\n * @returns 偏函数\n * @example\n * ```ts\n * const add = (a: number, b: number) => a + b\n * const add5 = partial(add, 5)\n * add5(3) // 8\n * ```\n * @public\n */\nexport function partial<T extends (...args: any[]) => any>(\n fn: T,\n ...presetArgs: any[]\n): (...remainingArgs: any[]) => ReturnType<T> {\n return function (...remainingArgs: any[]) {\n return fn(...presetArgs, ...remainingArgs)\n }\n}\n","/**\n * 节流函数,限制函数执行频率\n * @param fn - 要执行的函数\n * @param delay - 节流时间间隔(毫秒)\n * @returns 节流后的函数\n * @example\n * ```ts\n * const throttledFn = throttle(() => console.log('hello'), 300)\n * throttledFn() // 立即执行\n * throttledFn() // 300ms 内不执行\n * ```\n * @public\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n\n if (now - lastCall >= delay) {\n lastCall = now\n fn.apply(this, args)\n } else if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now()\n timeoutId = null\n fn.apply(this, args)\n }, delay - (now - lastCall))\n }\n }\n}\n","/**\n * 将字符串转换为驼峰命名\n * @param str - 输入字符串\n * @returns 驼峰命名字符串\n * @example\n * ```ts\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('hello_world') // 'helloWorld'\n * camelCase('hello world') // 'helloWorld'\n * ```\n * @public\n */\nexport function camelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => char?.toUpperCase() || '')\n .replace(/^(.)/, (_, char) => char?.toLowerCase() || '')\n}\n","/**\n * 将字符串首字母大写\n * @param str - 输入字符串\n * @returns 首字母大写的字符串\n * @example\n * ```ts\n * capitalize('hello') // 'Hello'\n * capitalize('hello world') // 'Hello world'\n * ```\n * @public\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * 检查字符串是否为空或只包含空白字符\n * @param str - 输入字符串\n * @returns 如果为空或只包含空白字符返回 true\n * @example\n * ```ts\n * isEmpty('') // true\n * isEmpty(' ') // true\n * isEmpty(null) // true\n * isEmpty(undefined) // true\n * isEmpty('hello') // false\n * ```\n * @public\n */\nexport function isEmpty(str: string | null | undefined): boolean {\n return !str || str.trim().length === 0\n}\n","/**\n * 将字符串转换为短横线命名\n * @param str - 输入字符串\n * @returns 短横线命名字符串\n * @example\n * ```ts\n * kebabCase('helloWorld') // 'hello-world'\n * kebabCase('hello_world') // 'hello-world'\n * kebabCase('hello world') // 'hello-world'\n * ```\n * @public\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n","/**\n * 生成指定长度的随机字符串\n * @param length - 随机字符串的长度(默认: 8)\n * @returns 随机字符串\n * @example\n * ```ts\n * random() // 'aB3dE7fG'\n * random(12) // 'xY9kL2mN3pQ'\n * ```\n * @public\n */\nexport function random(length: number = 8): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n","/**\n * 将字符串转换为下划线命名\n * @param str - 输入字符串\n * @returns 下划线命名字符串\n * @example\n * ```ts\n * snakeCase('helloWorld') // 'hello_world'\n * snakeCase('hello-world') // 'hello_world'\n * snakeCase('hello world') // 'hello_world'\n * ```\n * @public\n */\nexport function snakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n","/**\n * 截断字符串到指定长度\n * @param str - 输入字符串\n * @param length - 最大长度\n * @param suffix - 截断时添加的后缀(默认: '...')\n * @returns 截断后的字符串\n * @example\n * ```ts\n * truncate('hello world', 5) // 'hello...'\n * truncate('hello world', 11) // 'hello world'\n * truncate('hello world', 5, '---') // 'hello---'\n * ```\n * @public\n */\nexport function truncate(str: string, length: number, suffix: string = '...'): string {\n if (str.length <= length) return str\n return str.slice(0, length) + suffix\n}\n","/**\n * 安全的类型检查\n * @param arg - 判断的参数\n * @returns 返回类型字符串\n * @example\n * ```ts\n * isTypeOf(10); // \"number\"\n * isTypeOf(\"abc\"); // \"string\"\n * isTypeOf(true); // \"boolean\"\n * isTypeOf(null); // \"null\"\n * isTypeOf(undefined); // \"undefined\"\n * isTypeOf({a: 1}); // \"object\"\n * isTypeOf([1,2,3]); // \"array\"\n * isTypeOf(new Date()); // \"date\"\n * isTypeOf(/^\\d{6}$/); // \"regexp\"\n * isTypeOf(Symbol('1')); // \"symbol\"\n * isTypeOf(function(){}); // \"function\"\n * isTypeOf(new Error()); // \"error\"\n * isTypeOf(new Promise(()=>{})); // \"promise\"\n * isTypeOf(new Set()); // \"set\"\n * isTypeOf(new Map()); // \"map\"\n * isTypeOf(Math); // \"math\"\n * ```\n * @public\n */\nexport function isTypeOf (arg: any): string {\n return Object.prototype.toString\n .call(arg)\n .replace(/\\[object (\\w+)\\]/, '$1')\n .toLowerCase()\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是数组\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isArray({}) // false\n * isArray(1) // false\n * isArray([]) // true\n * ```\n *\n * @public\n */\nexport function isArray (arg: any): boolean {\n return isTypeOf(arg) === 'array'\n}\n","\n/**\n * 是否是空对象\n * @remarks\n * ```\n * 1、校验结果和`jquery.isEmptyObject()`一致\n * 2、只有可枚举对象并且有枚举的值才返回false\n * 3、不可枚举值,始终返回true\n * ```\n * @param arg\n * @returns `true|false`\n * @example\n * ```ts\n * isEmptyObject('') // true 不可枚举\n * isEmptyObject(null) // true 不可枚举\n * isEmptyObject(undefined) // true 不可枚举\n * isEmptyObject({}) // true 可枚举,没有枚举属性\n * isEmptyObject({a:1}) // false 可枚举,有枚举属性\n * isEmptyObject(new Object()) // true 可枚举,没有属性\n * isEmptyObject([]) // true 可枚举,没有枚举属性\n * isEmptyObject([1]) // false 可枚举,有枚举属性\n * ```\n * @public\n */\nexport function isEmptyObject (arg: any): boolean {\n if (arg == null) {\n return true;\n }\n for (const _key in arg) {\n return false;\n }\n return true;\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是对象\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isObject({}) // true\n * isObject(1) // false\n * isObject([]) // false\n * ```\n *\n * @public\n */\nexport function isObject (arg: any): boolean {\n return isTypeOf(arg) === 'object'\n}\n","import { isArray } from \"../util/isArray\";\nimport { isEmptyObject } from \"../util/isEmptyObject\";\nimport { isObject } from \"../util/isObject\";\n\n/**\n * 安全的json序列化,只对object和array进行转换,其他原样返回\n * @param value - 待序列化的值\n * @returns 序列化的值\n * @example\n * ```ts\n * safeJsonStringify({a:1}); // => `{\"a\":1}`\n * safeJsonStringify([1,\"2\"]); // => `[1,\"2\"]`\n * safeJsonStringify({}); // => null 空值处理\n * safeJsonStringify([]); // => null 空值处理\n * safeJsonStringify(null); // => null 空值处理\n * safeJsonStringify(\"abc\"); // => \"abc\" 原样返回\n * safeJsonStringify(123); // => 123 原样返回\n * ```\n */\nexport function safeJsonStringify (value: any): any {\n if (isObject(value)) {\n return isEmptyObject(value) ? null : JSON.stringify(value)\n } else if (isArray(value)) {\n return isEmptyObject(value) ? null : JSON.stringify(value)\n } else {\n return value\n }\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是字符串\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isString(123) // false\n * isString(\"abc\") // true\n * isString(String(1)) // true\n * ```\n *\n * @public\n */\nexport function isString (arg: any): boolean {\n return isTypeOf(arg) === 'string'\n}\n","import { isString } from \"../util/isString\";\n\nexport type jsonType = object | Array<any>\n\n/**\n * 安全的JSON字符串解析\n * @param jsonString - 待转换的字符串\n * @param rollback - 转换失败后回退的备选值,默认`{}`\n * @returns JSONObject JSONArray\n * @example\n * ```ts\n * safeParseJson('{\"name\": \"abc\", age: 20}'); // => {name: \"abc\", age: 20} 正常解析\n * safeParseJson(0); // => {} 解析失败默认回退处理\n * safeParseJson(`[name=123]`, []); // => [] 解析失败回退处理\n * ```\n */\nexport function safeParseJson (jsonString: any, rollback: jsonType = {}): jsonType {\n if (isString(jsonString)) {\n let json: jsonType\n try {\n json = JSON.parse(jsonString)\n } catch (e) {\n json = rollback\n }\n return json\n } else {\n return rollback\n }\n}","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是布尔值\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isBoolean(123) // false\n * isBoolean(Boolean('1')) // true\n * isBoolean(true) // true\n * ```\n *\n * @public\n */\nexport function isBoolean (arg: any): boolean {\n return isTypeOf(arg) === 'boolean'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是日期对象\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isDate(new Date()) // true\n * ```\n *\n * @public\n */\nexport function isDate (arg: any): boolean {\n return isTypeOf(arg) === 'date'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是错误对象\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isError(new Error('122')) // true\n * ```\n *\n * @public\n */\nexport function isError (arg: any): boolean {\n return isTypeOf(arg) === 'error'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是函数\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isFunction(function(){}) // true\n * ```\n *\n * @public\n */\nexport function isFunction (arg: any): boolean {\n return isTypeOf(arg) === 'function'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是Map\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isMap(new Map()) // true\n * ```\n *\n * @public\n */\nexport function isMap (arg: any): boolean {\n return isTypeOf(arg) === 'map'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是null\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isNull(null) // true\n * isNull(1) // false\n * ```\n *\n * @public\n */\nexport function isNull (arg: any): boolean {\n return isTypeOf(arg) === 'null'\n}\n","/**\n * 是否是undefined\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isUndefined(undefined) // true\n * isUndefined(a) // true a未定义\n * isUndefined(void 0) // true\n * ```\n *\n * @public\n */\nexport function isUndefined (arg: any): boolean {\n return typeof arg === 'undefined'\n}\n","import { isNull } from \"./isNull\";\nimport { isUndefined } from \"./isUndefined\";\n\n/**\n * 检测`value`是否是`null`或`undefined`\n * @param value - 待检测值\n * @returns boolean\n * @example \n * ```ts\n * isNil(null); // => true\n * isNil(void 0); // => true\n * isNil(NaN); // => false\n * ```\n */\nexport function isNil (value: any): boolean {\n if (isUndefined(value)) {\n return true\n } else {\n return isNull(value)\n }\n}","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是数字\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isNumber(123) // true\n * isNumber(Number('1')) // true\n * isNumber(\"abc\") // false\n * ```\n *\n * @public\n */\nexport function isNumber (arg: any): boolean {\n return isTypeOf(arg) === 'number'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是Promise\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isPromise(new Promise(()=>{})) // true\n * ```\n *\n * @public\n */\nexport function isPromise (arg: any): boolean {\n return isTypeOf(arg) === 'promise'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是正则\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isRegExp(/^\\d+/) // true\n * isRegExp(new RegExp(\"\\w\")) // true\n * ```\n *\n * @public\n */\nexport function isRegExp (arg: any): boolean {\n return isTypeOf(arg) === 'regexp'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是Set\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isSet(new Set([1,2,3])) // true\n * ```\n *\n * @public\n */\nexport function isSet (arg: any): boolean {\n return isTypeOf(arg) === 'set'\n}\n","import { isTypeOf } from './isTypeOf'\n\n/**\n * 是否是符号\n * @param arg - 参数\n * @returns `true|false`\n * @example\n * ```ts\n * isSymbol(Symbol(1)) // true\n * ```\n *\n * @public\n */\nexport function isSymbol (arg: any): boolean {\n return isTypeOf(arg) === 'symbol'\n}\n","/**\n * 解码一个URI编码的字符串。\n *\n * @param input - URI编码字符串\n * @returns 解码后的字符串\n * @internal\n */\nexport function _decode (input: string): string | null {\n try {\n return decodeURIComponent(input.replace(/\\+/g, ' '))\n } catch (e) {\n return null\n }\n}\n\n/**\n * 尝试编码给定输入\n *\n * @param input - 需要编码的字符串\n * @returns 编码后的字符串\n * @internal\n */\nexport function _encode (input: string): string | null {\n try {\n return encodeURIComponent(input)\n } catch (e) {\n return null\n }\n}\n\n/**\n * querystring转换成对象\n *\n * @param obj - 需要被转换的查询对象\n * @param prefix - 添加前缀\n * @returns url查询字符串\n * @example\n * ```ts\n * querystringify({ foo: bar }); // foo=bar\n * querystringify({ foo: bar }, '#'); // #foo=bar\n * querystringify({ foo: '' }, '&'); // &foo=\n * ```\n *\n * @public\n */\nexport function querystringify (obj: object, prefix = ''): string {\n let pairs: string[] = []\n let value\n let key\n for (key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n // @ts-ignore\n value = obj[key]\n if (!value && (value === null || value === void 0 || isNaN(value))) {\n value = ''\n }\n key = _encode(key)\n value = _encode(value)\n if (key === null) { continue }\n if (value === null) {\n value = ''\n }\n pairs.push(key + '=' + value)\n }\n }\n return pairs.length ? prefix + pairs.join('&') : ''\n}\n","import {_decode} from './querystringify'\n\n/**\n * 解析URL查询字符串,转换成JSON格式\n *\n * @param query - 查询字符串,可以是?开头也可以是#号开头\n * @returns 解析为对象\n * @example\n * ```ts\n * parseQueryString('?foo=bar'); // { foo: 'bar' }\n * parseQueryString('#foo=bar'); // { foo: 'bar' }\n * parseQueryString('foo=bar'); // { foo: 'bar' }\n * parseQueryString('foo=bar&bar=foo'); // { foo: 'bar', bar: 'foo' }\n * parseQueryString('foo&bar=foo'); // { foo: '', bar: 'foo' }\n * ```\n *\n * @public\n */\nexport function parseQueryString(query: string): Record<string, string | undefined> {\n if (!query) {\n return {}\n }\n let parser = /([^=?#&]+)=?([^&]*)/g,\n result = {},\n part\n while ((part = parser.exec(query))) {\n let key = _decode(part[1]),\n value: string | null | undefined = _decode(part[2])\n if (key === null) {\n continue\n }\n\n if (value === null) {\n value = undefined\n }\n\n // @ts-ignore\n result[key] = value\n }\n return result\n}\n","import { parseQueryString } from './parseQueryString'\n\n/**\n * urlParse 解析返回类型\n *\n * @public\n */\nexport interface IURL {\n /**\n * hash字符串\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.hash); // Logs: '#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * ```\n */\n hash?: string\n /**\n * hash的查询字符串对象\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.hashSearchObject);\n * // Logs: {\n * // hashfoo: '1',\n * // hashbar: 'a'\n * // }\n * ```\n */\n hashSearchObject?: Record<string, string | undefined>\n /**\n * host\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.host); // Logs: 'www.baidu.com'\n * ```\n */\n host?: string\n /**\n * hostname\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.hostname); // Logs: 'www.baidu.com'\n * ```\n */\n hostname?: string\n /**\n * href\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.href); // Logs: 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * ```\n */\n href?: string\n /**\n * origin\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.origin); // Logs: 'https://www.baidu.com'\n * ```\n */\n origin?: string\n /**\n * password\n * @example\n * ```\n * const urlStr = 'https://anonymous:flabada@developer.mozilla.org/en-US/docs/Web/API/URL/username'\n * const url = urlParse(urlStr)\n * console.log(url.password) // Logs \"flabada\"\n * ```\n */\n password?: string\n /**\n * pathname\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.pathname); // Logs: '/path1/path2'\n * ```\n */\n pathname?: string\n /**\n * port\n * @example\n * ```\n * const urlStr = 'https://mydomain.com:80/svn/Repos/'\n * const url = urlParse(urlStr)\n * console.log(url.port); // Logs: '80'\n * ```\n */\n port?: string\n /**\n * protocol\n * @example\n * ```\n * const urlStr = 'https://mydomain.com:80/svn/Repos/'\n * const url = urlParse(urlStr)\n * console.log(url.protocol); // Logs: 'https'\n * ```\n */\n protocol?: string\n /**\n * 查询字符串\n * @example\n * ```\n * {\n * search: \"?foo=1&bar=a/\"\n * }\n * ```\n */\n search?: string\n /**\n * searchObject\n * @example\n * ```\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * console.log(url.pathname); // Logs: '/path1/path2'\n * ```\n */\n searchObject?: Record<string, string | undefined>\n /**\n * origin\n * @example\n * ```\n * const urlStr = 'https://anonymous:flabada@developer.mozilla.org/en-US/docs/Web/API/URL/username'\n * const url = urlParse(urlStr)\n * console.log(url.username)\n * // Logs: {\n * // foo: '1',\n * // bar: 'a'\n * // }\n * ```\n */\n username?: string\n}\n\n/**\n * url解析,在URL基础上扩展了查询字符串解析对象\n * @param urlString - url格式字符串\n * @returns IURL - 返回URL对象扩展了searchObject和hashSearchObject\n * @example\n * ```ts\n * const urlStr = 'https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a'\n * const url = urlParse(urlStr)\n * {\n * hash: \"#/hashpath1/hashpath2?hashfoo=1&hashbar=a\",\n * hashSearchObject: {\n * hashfoo: '1',\n * hashbar: 'a'\n * }\n * host: \"www.baidu.com\"\n * hostname: \"www.baidu.com\"\n * href: \"https://www.baidu.com/path1/path2?foo=1&bar=a/#/hashpath1/hashpath2?hashfoo=1&hashbar=a\"\n * origin: \"https://www.baidu.com\"\n * password: \"\"\n * pathname: \"/path1/path2\"\n * port: \"\"\n * protocol: \"https:\"\n * search: \"?foo=1&bar=a/\"\n * searchObject: {\n * foo: '1',\n * bar: 'a'\n * }\n * username: \"\"\n * }\n * ```\n *\n * @public\n */\nexport function urlParse(urlString = ''): IURL {\n try {\n const url = new URL(urlString)\n const parsed: IURL = {}\n for (const key in url) {\n if (key !== 'toString' && key !== 'toJSON' && key !== 'searchParams') {\n // @ts-ignore\n parsed[key] = url[key]\n }\n }\n parsed['searchObject'] = parseQueryString(url.search.replace(/\\/$/, ''))\n parsed['hashSearchObject'] = parseQueryString(url.hash.replace(/^#.+\\?/, ''))\n return parsed\n } catch (err) {\n return {}\n }\n}\n","/**\n * 阿拉伯数字转中文数字\n * @param num 需要转换的数字\n * @returns 返回转换后的中文字符串\n * @example\n * ```ts\n * convertChineseNumber(0); // 零\n * convertChineseNumber(1); // 一\n * convertChineseNumber(10); // 十\n * convertChineseNumber(11); // 十一\n * convertChineseNumber(11.12); // 十一点一二\n * convertChineseNumber(100); // 一百\n * convertChineseNumber(123); // 一百二十三\n * ```\n * @public\n */\nexport function convertChineseNumber (num: number): string {\n // 处理 -0 +0 的情况\n if (num === 0) {\n return '零';\n }\n const AA: string[] = [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\", \"十\"];\n const BB: string[] = [\"\", \"十\", \"百\", \"千\", \"万\", \"亿\", \"点\", \"\"];\n const a: string[] = (\"\" + num).replace(/(^0*)/g, \"\").split(\".\");\n let k = 0;\n let re = \"\";\n for (let i = a[0].length - 1; i >= 0; i--) {\n switch (k) {\n case 0:\n re = BB[7] + re;\n break;\n case 4:\n if (!new RegExp(\"0{4}//d{\" + (a[0].length - i - 1) + \"}$\")\n .test(a[0]))\n re = BB[4] + re;\n break;\n case 8:\n re = BB[5] + re;\n BB[7] = BB[5];\n k = 0;\n break;\n }\n if (k % 4 == 2 && a[0].charAt(i + 2) !== '0' && a[0].charAt(i + 1) === '0')\n re = AA[0] + re;\n if (a[0].charAt(i) !== '0')\n re = AA[Number(a[0].charAt(i))] + BB[k % 4] + re;\n k++;\n }\n\n if (a.length > 1) // 加上小数部分(如果有小数部分)\n {\n re += BB[6];\n for (let i = 0; i < a[1].length; i++)\n re += AA[Number(a[1].charAt(i))];\n }\n if (re == '一十')\n re = \"十\";\n if (re.match(/^一/) && re.length == 3)\n re = re.replace(\"一\", \"\");\n return re;\n}\n","/**\n * 阿拉伯数字对应的汉字\n */\ninterface CNCharType {\n '$0': string\n '$1': string\n '$2': string\n '$3': string\n '$4': string\n '$5': string\n '$6': string\n '$7': string\n '$8': string\n '$9': string\n '$10': string\n '$100': string\n '$1000': string\n '$10000': string\n '$100000000': string\n 'CN_SYMBOL': string\n 'DOLLAR': string\n '$0.1': string\n '$0.01': string\n '$0.001': string\n '$0.0001': string\n 'INTEGER': string\n}\n\nconst CN_CHAR: CNCharType = {\n '$0': '\\u96F6',\n '$1': '\\u58F9',\n '$2': '\\u8D30',\n '$3': '\\u53C1',\n '$4': '\\u8086',\n '$5': '\\u4F0D',\n '$6': '\\u9646',\n '$7': '\\u67D2',\n '$8': '\\u634C',\n '$9': '\\u7396',\n '$10': '\\u62FE',\n '$100': '\\u4F70',\n '$1000': '\\u4EDF',\n '$10000': '\\u4E07',\n '$100000000': '\\u4EBF',\n 'CN_SYMBOL': '\\u4EBA\\u6C11\\u5E01',\n 'DOLLAR': '\\u5143',\n '$0.1': '\\u89D2',\n '$0.01': '\\u5206',\n '$0.001': '\\u6BEB',\n '$0.0001': '\\u5398',\n 'INTEGER': '\\u6574'\n}\n\n/**\n * 阿拉伯数字换成汉字大写金额\n * @remarks\n * ```\n * 小数点最多支持到4位单位厘\n * 金额最大支持1万亿\n * ```\n * @param currencyDigits - 转换的金额字符串或数字\n * @param prefixSymbol - 前缀默认false(true=人民币, false='')\n * @returns 转换成汉字大写金额格式\n * @example\n * ```ts\n * convertCurrency(0); // 零圆整\n * convertCurrency(1234) // 壹仟贰佰叁拾肆圆整\n * convertCurrency('9877662.090') // 玖佰捌拾柒万柒仟陆佰陆拾贰圆零角玖分\n * convertCurrency('9877662.097866') // 玖佰捌拾柒万柒仟陆佰陆拾贰圆零角玖分柒毫捌厘\n * convertCurrency('4231234.04', true)) // 人民币肆佰贰拾叁万壹仟贰佰叁拾肆圆零角肆分\n * ```\n * @public\n */\nexport function convertCurrency(currencyDigits: number | string, prefixSymbol = false): string {\n // Constants:\n // const MAXIMUM_NUMBER = 999999999999.9999\n const MAXIMUM_INTEGRAL = 999999999999\n // Variables:\n let integral: string // Represent integral part of digit number.\n let decimal: string // Represent decimal part of digit number.\n let outputCharacters: string // The output result.\n let parts: string[]\n let digits: string[], radices: string[], bigRadices: string[], decimals: string[]\n if (isNaN(Number(currencyDigits))) {\n console.warn('金额无效!')\n return ''\n }\n // Validate input string:\n let currencyDigitsStr = currencyDigits.toString()\n if (currencyDigitsStr === '') {\n console.warn('请输入小写金额!')\n return ''\n }\n if (currencyDigitsStr.match(/[^,.\\d]/) != null) {\n console.warn('小写金额含有无效字符!')\n return ''\n }\n if (currencyDigitsStr.match(/^((\\d{1,3}(,\\d{3})*(.((\\d{3},)*\\d{1,3}))?)|(\\d+(.\\d+)?))$/) == null) {\n console.warn('小写金额的格式不正确!')\n return ''\n }\n // Normalize the format of input digits:\n currencyDigitsStr = currencyDigitsStr.replace(/,/g, '') // Remove comma delimiters.\n currencyDigitsStr = currencyDigitsStr.replace(/^0+/, '') // Trim zeros at the beginning.\n // Assert the number is not greater than the maximum number.\n // if (Number(currencyDigitsStr) > MAXIMUM_NUMBER) {\n // console.warn('金额过大,应小于1000亿元!')\n // return ''\n // }\n // Process the coversion from currency digits to characters:\n // Separate integral and decimal parts before processing coversion:\n parts = currencyDigitsStr.split('.')\n if (parts.length > 1) {\n integral = parts[0]\n decimal = parts[1]\n // Cut down redundant decimal digits that are after the second.\n decimal = decimal.substr(0, 4)\n } else {\n integral = parts[0]\n decimal = ''\n }\n if (Number(integral) > MAXIMUM_INTEGRAL) {\n integral = MAXIMUM_INTEGRAL + ''\n }\n // Prepare the characters corresponding to the digits:\n digits = [\n CN_CHAR.$0,\n CN_CHAR.$1,\n CN_CHAR.$2,\n CN_CHAR.$3,\n CN_CHAR.$4,\n CN_CHAR.$5,\n CN_CHAR.$6,\n CN_CHAR.$7,\n CN_CHAR.$8,\n CN_CHAR.$9\n ]\n radices = ['', CN_CHAR.$10, CN_CHAR.$100, CN_CHAR.$1000]\n bigRadices = ['', CN_CHAR.$10000, CN_CHAR.$100000000]\n decimals = [CN_CHAR['$0.1'], CN_CHAR['$0.01'], CN_CHAR['$0.001'], CN_CHAR['$0.0001']]\n // Start processing:\n outputCharacters = ''\n // Process integral part if it is larger than 0:\n if (Number(integral) > 0) {\n let zeroCount = 0\n for (let i = 0; i < integral.length; i++) {\n let p = integral.length - i - 1\n let d = integral.substr(i, 1)\n let quotient = p / 4\n let modulus = p % 4\n if (d == '0') {\n zeroCount++\n } else {\n if (zeroCount > 0) {\n outputCharacters += digits[0]\n }\n zeroCount = 0\n outputCharacters += digits[Number(d)] + radices[modulus]\n }\n if (modulus == 0 && zeroCount < 4) {\n outputCharacters += bigRadices[quotient]\n zeroCount = 0\n }\n }\n outputCharacters += CN_CHAR.DOLLAR\n }\n // Process decimal part if there is:\n // 忽略小数后面的零不转换 0.10 => `1角`,而不是`1角零分`\n decimal = decimal.replace(/0+$/, '')\n if (decimal !== '') {\n for (let i = 0; i < decimal.length; i++) {\n let d = decimal.substr(i, 1)\n // if (d != '0') {\n // outputCharacters += digits[Number(d)] + decimals[i]\n // }\n outputCharacters += digits[Number(d)] + decimals[i]\n }\n }\n // Confirm and return the final output string:\n if (outputCharacters == '') {\n outputCharacters = CN_CHAR.$0 + CN_CHAR.DOLLAR\n }\n if (decimal == '') {\n outputCharacters += CN_CHAR.INTEGER\n }\n if (prefixSymbol) {\n outputCharacters = CN_CHAR.CN_SYMBOL + outputCharacters\n }\n return outputCharacters\n}\n","let _numeral: any = null\n\n/**\n * 异步获取 Numeral 实例(已配置中文本地化)\n * 这是一个懒加载导入,避免将 numeral 作为直接依赖\n *\n * @example\n * ```ts\n * const numeral = await getNumeral()\n * numeral(1000).format('$0,0.00') // '¥1,000.00'\n * ```\n */\nexport async function getNumeral() {\n if (_numeral) return _numeral\n \n const numeral = await import('numeral')\n\n numeral.register('locale', 'ch', {\n delimiters: {\n thousands: ',',\n decimal: '.'\n },\n abbreviations: {\n thousand: '千',\n million: '百万',\n billion: '十亿',\n trillion: '兆'\n },\n ordinal: function () {\n return '.'\n },\n currency: {\n symbol: '¥'\n }\n })\n\n numeral.locale('ch')\n\n _numeral = numeral.default\n return _numeral\n}\n\n/**\n * 同步获取 Numeral 实例(仅用于测试环境)\n * 使用 ESM 动态导入,配合 vitest setupFiles 预加载使用\n * \n * 注意:此函数本质是异步的,但为了保持 API 一致性命名为 sync\n * 请确保在测试运行前通过 setupFiles 预加载\n *\n * @throws {Error} 如果 numeral 未安装\n *\n * @example\n * ```ts\n * // 在测试 setup 文件中预加载\n * import { getNumeralSync } from './_numeral'\n * await getNumeralSync()\n * \n * // 然后在代码中可以直接使用\n * const numeral = getNumeralSync() // 返回缓存实例\n * ```\n */\nexport function getNumeralSync() {\n if (_numeral) return _numeral\n \n throw new Error(\n 'numeral 未加载。请确保在测试 setup 文件中调用 await getNumeralSync() 预加载'\n )\n}\n\nexport default getNumeral\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 通用格式化,需要手动指定格式\n * @remarks\n * format用法:http://numeraljs.com/\n * @param input - 待格式化数字\n * @param format - 输出格式,默认'',默认不保留小数,格式整数\n * @returns 返回格式化字符串\n * @example\n * ```ts\n * format(1230974.998979).format() // \"1,230,975\"\n * ```\n * @public\n */\nexport function format (input: number, format: string = ''): string {\n try {\n const numeral = getNumeralSync()\n return numeral(input).format(format)\n } catch (e) {\n console.warn('格式化错误,请确保已安装 numeral: npm install numeral')\n return ''\n }\n}\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 金额格式化\n * @remarks\n * ```\n * `0,0.00`:尾端保留2位小数,四舍五入\n * format用法:http://numeraljs.com/\n * ```\n * @param input - 待格式化金额\n * @param format - 输出格式,默认'0,0.00',尾端保留2位小数,四舍五入,自定义需手动指定格式\n * @returns 返回千分位格式化字符串\n * @example\n * ```ts\n * formatMoney(1000.234) // 1,000.23\n * formatMoney(1000.235) // 1,000.24\n * formatMoney(1000.235, '$0,0.00') // ¥1,000.24 只设置货币\n * formatNumber(1230974, '0.0a') // 1.2千万\n * ```\n * @public\n */\nexport function formatMoney (input: number, format: string = '0,0.00'): string {\n try {\n const numeral = getNumeralSync()\n return numeral(input).format(format)\n } catch (e) {\n console.warn('金额格式化错误,请确保已安装 numeral: npm install numeral')\n return ''\n }\n}\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 数字格式化\n * @remarks\n * ```\n * `0,0[.]00` - 小数位(可选)有则四舍五入保留2位小数\n * format用法:http://numeraljs.com/\n * ```\n * @param input - 待格式化数字\n * @param format - 输出格式,默认'0,0[.]00',小数位(可选)有则四舍五入保留2位小数,自定义需手动指定格式\n * @returns 返回千分位格式化字符串\n * @example\n * ```ts\n * formatNumber(789789.025) // \"789,789.03\"\n * formatNumber(789789.00) // \"789,789\"\n * formatNumber(789789.005) // \"789,789.01\"\n * formatNumber(1230974, '0.0a') // 1.2千万\n * ```\n * @public\n */\nexport function formatNumber (input: number, format: string = '0,0[.]00'): string {\n try {\n const numeral = getNumeralSync()\n return numeral(input).format(format)\n } catch (e) {\n console.warn('数字格式化错误,请确保已安装 numeral: npm install numeral')\n return ''\n }\n}\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 百分比格式化\n * @remarks\n * ```\n * `0.[00]%` - 小数位(可选)有则四舍五入保留2位小数\n * format用法:http://numeraljs.com/\n * ```\n * @param input - 待格式化数字\n * @param format - 输出格式,默认'0.[00]%',小数位(可选)有则四舍五入保留2位小数,自定义需手动指定格式\n * @returns 返回百分比格式化字符串\n * @example\n * ```ts\n * formatPercentage(0.4567) // \"45.67%\"\n * formatPercentage(0.456) // \"45.6%\"\n * formatPercentage(0.45600) // \"46%\"\n * formatPercentage(0.4567, '0.00%') // \"45.67%\"\n * ```\n * @public\n */\nexport function formatPercentage (input: number, format: string = '0.00%'): string {\n try {\n const numeral = getNumeralSync()\n return numeral(input).format(format)\n } catch (e) {\n console.warn('百分比格式化错误,请确保已安装 numeral: npm install numeral')\n return ''\n }\n}\n","/**\n * 快速生成numeraljs格式字符串, 处理千分位和小数位,可以继续使用format方法进行格式化,小数位处理方式四舍五入\n * @remarks\n * @param options - 格式选项同数字组件的options { separate: true, point: 0 }\n * @param unit - 是否显示单位,formatType=“percent” 字段加上单位,如“%”, 其他字段使用自定义单元(如果设置了)\n * @returns 返回格式字符串\n * @example\n * ```ts\n * getFormatStr() // \"0,0\" 默认格式字符串\n * getFormatStr({ separate: true, point: 2 }) // '0,0.00'\n * getFormatStr({ separate: false, point: 2 }) // '00.00'\n * ```\n * @public\n */\nexport function getFormatStr (options = { separate: true, point: 0 }): string {\n const {\n separate,\n point,\n } = options\n let formatStr = ''\n formatStr = separate ? '0,0' : '0'\n if (point > 0) {\n formatStr += '.' + Array(point).fill(0).join('')\n }\n return formatStr\n}\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 数字格式化,指定需要保留的小数位数,解决部分浏览器兼容性问题,如`(0.615).toFixed(2) === '0.61');`\n * @remarks\n * ```\n * 修复Number.prototype.toFixed兼容性问题\n * `(0.615).toFixed(2) === '0.61');`,按照银行家法原则应该是0.62''\n * 位数不够,后面补0\n * ```\n * @param number - 需要转换的数字\n * @param digits - 需要保留的位数,只允许 [0, 20] 之间的数字\n * @returns 返回格式化后的字符串\n * @example\n * ```ts\n * toFixed(25.198726354, 0); // 25\n * toFixed(25.198726354, 1); // 25.2\n * toFixed(25.198726354, 2); // 25.20\n * toFixed(25.198726354, 3); // 25.199\n * toFixed(25.198726354, 4); // 25.1987\n * toFixed(25.198726354, 5); // 25.19873\n * toFixed(25.198726354, 6); // 25.198726\n * toFixed(25, 2); // 25.00\n * toFixed(25.125, 4); // 25.1250\n * ```\n * @public\n */\nexport function toFixed (number: number, digits: number = 2): string {\n\n // return ~~(Math.pow(10, digits) * number) / Math.pow(10, digits);\n if (digits < 0) {\n digits = 0\n }\n if (digits > 20) {\n digits = 20\n }\n const numeral = getNumeralSync()\n return numeral._.toFixed(number, digits, Math.round)\n}\n","import { getNumeralSync } from '../_internal/_numeral'\n\n/**\n * 反格式化,自动识别格式\n * @remarks\n * format用法:http://numeraljs.com/\n * @param input - 待格式化数字\n * @returns 返回转换后的数字,无法识别返回NaN\n *\n * @example\n * ```ts\n * unformat('18:13:09') // 65589 (秒)\n * unformat('34.78%') // 0.3478\n * unformat('7,883.9876') // 7883.9876\n * unformat('¥7,883.9876') // 7883.9876\n * unformat('1.8千') // 1800\n * unformat('1.8百万') // 1800000\n * unformat('1.8十亿') // 1800000000\n * unformat('1.8兆') // 1800000000000\n * ```\n *\n * @public\n */\nexport function unformat (input: string = ''): number | typeof NaN {\n try {\n const numeral = getNumeralSync()\n return numeral(input).value()\n } catch (e) {\n console.warn('格式化错误,请确保已安装 numeral: npm install numeral')\n return NaN\n }\n}\n","import { TinyColor } from '@ctrl/tinycolor';\n\nexport function isDarkColor(color: string) {\n return new TinyColor(color).isDark();\n}\n\nexport function isLightColor(color: string) {\n return new TinyColor(color).isLight();\n}\n","import { TinyColor } from '@ctrl/tinycolor';\n\n/**\n * 将颜色转换为HSL格式。\n *\n * HSL是一种颜色模型,包括色相(Hue)、饱和度(Saturation)和亮度(Lightness)三个部分。\n *\n * @param {string} color 输入的颜色。\n * @returns {string} HSL格式的颜色字符串。\n */\nfunction convertToHsl(color: string): string {\n const { a, h, l, s } = new TinyColor(color).toHsl();\n const hsl = `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)`;\n return a < 1 ? `${hsl} ${a}` : hsl;\n}\n\n/**\n * 将颜色转换为HSL CSS变量。\n *\n * 这个函数与convertToHsl函数类似,但是返回的字符串格式稍有不同,\n * 以便可以作为CSS变量使用。\n *\n * @param {string} color 输入的颜色。\n * @returns {string} 可以作为CSS变量使用的HSL格式的颜色字符串。\n */\nfunction convertToHslCssVar(color: string): string {\n const { a, h, l, s } = new TinyColor(color).toHsl();\n const hsl = `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;\n return a < 1 ? `${hsl} / ${a}` : hsl;\n}\n\n/**\n * 将颜色转换为RGB颜色字符串\n * TinyColor无法处理hsl内包含'deg'、'grad'、'rad'或'turn'的字符串\n * 比如 hsl(231deg 98% 65%)将被解析为rgb(0, 0, 0)\n * 这里在转换之前先将这些单位去掉\n * @param str 表示HLS颜色值的字符串\n * @returns 如果颜色值有效,则返回对应的RGB颜色字符串;如果无效,则返回rgb(0, 0, 0)\n */\nfunction convertToRgb(str: string): string {\n return new TinyColor(str.replace(/deg|grad|rad|turn/g, '')).toRgbString();\n}\n\n/**\n * 检查颜色是否有效\n * @param {string} color - 待检查的颜色\n * 如果颜色有效返回true,否则返回false\n */\nfunction isValidColor(color?: string) {\n if (!color) {\n return false;\n }\n return new TinyColor(color).isValid;\n}\n\nexport {\n convertToHsl,\n convertToHslCssVar,\n convertToRgb,\n isValidColor,\n TinyColor,\n};\n","import { getColors } from 'theme-colors';\n\nimport { convertToHslCssVar, TinyColor } from './convert';\n\ninterface ColorItem {\n alias?: string;\n color: string;\n name: string;\n}\n\nfunction generatorColorVariables(colorItems: ColorItem[]) {\n const colorVariables: Record<string, string> = {};\n\n colorItems.forEach(({ alias, color, name }) => {\n if (color) {\n const colorsMap = getColors(new TinyColor(color).toHexString());\n\n let mainColor = colorsMap['500'];\n\n const colorKeys = Object.keys(colorsMap);\n\n colorKeys.forEach((key) => {\n const colorValue = colorsMap[key];\n\n if (colorValue) {\n const hslColor = convertToHslCssVar(colorValue);\n colorVariables[`--${name}-${key}`] = hslColor;\n if (alias) {\n colorVariables[`--${alias}-${key}`] = hslColor;\n }\n\n if (key === '500') {\n mainColor = hslColor;\n }\n }\n });\n if (alias && mainColor) {\n colorVariables[`--${alias}`] = mainColor;\n }\n }\n });\n return colorVariables;\n}\n\nexport { generatorColorVariables };\n","/**\n * 日期格式化模块\n */\n\nimport dayjs from 'dayjs';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nimport type { FormatDate, Format } from './types';\n\n/**\n * 格式化日期\n *\n * 将各种日期格式转换为指定格式的字符串,支持时区转换\n *\n * @param time - 日期值,可以是 Date 对象、dayjs 对象、时间戳或字符串\n * @param format - 输出格式,默认为 'YYYY-MM-DD'\n *\n * @returns 格式化后的日期字符串\n *\n * @example 格式化为日期\n * ```typescript\n * formatDate(new Date()); // '2024-01-25'\n * ```\n *\n * @example 格式化为日期时间\n * ```typescript\n * formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'); // '2024-01-25 14:30:00'\n * ```\n *\n * @example 格式化为时间\n * ```typescript\n * formatDate(new Date(), 'HH:mm:ss'); // '14:30:00'\n * ```\n *\n * @example 格式化时间戳\n * ```typescript\n * formatDate(1706161800000, 'YYYY-MM-DD'); // '2024-01-25'\n * ```\n *\n * @example 格式化日期字符串\n * ```typescript\n * formatDate('2024-01-25T06:30:00Z', 'YYYY-MM-DD HH:mm'); // '2024-01-25 14:30'\n * ```\n *\n * @example 使用 dayjs 对象\n * ```typescript\n * import dayjs from 'dayjs';\n * const date = dayjs('2024-01-25');\n * formatDate(date, 'YYYY/MM/DD'); // '2024/01/25'\n * ```\n */\nexport function formatDate(\n time?: FormatDate,\n format: Format = 'YYYY-MM-DD',\n): string {\n try {\n const date = dayjs.isDayjs(time) ? time : dayjs(time);\n if (!date.isValid()) {\n throw new Error('Invalid date');\n }\n return date.tz().format(format);\n } catch (error) {\n console.error(`Error formatting date: ${error}`);\n return String(time ?? '');\n }\n}\n","/**\n * 日期时间格式化模块\n */\n\nimport type { FormatDate } from './types';\nimport { formatDate } from './formatDate';\n\n/**\n * 格式化日期时间\n *\n * 将日期格式化为完整的日期时间字符串(YYYY-MM-DD HH:mm:ss)\n *\n * @param time - 日期值,可以是 Date 对象、dayjs 对象、时间戳或字符串\n *\n * @returns 格式化后的日期时间字符串\n *\n * @example 格式化当前日期时间\n * ```typescript\n * formatDateTime(); // '2024-01-25 14:30:00'\n * ```\n *\n * @example 格式化指定日期\n * ```typescript\n * formatDateTime(new Date(2024, 0, 25, 14, 30, 0)); // '2024-01-25 14:30:00'\n * ```\n *\n * @example 格式化时间戳\n * ```typescript\n * formatDateTime(1706161800000); // '2024-01-25 14:30:00'\n * ```\n *\n * @example 格式化字符串日期\n * ```typescript\n * formatDateTime('2024-01-25T06:30:00Z'); // '2024-01-25 14:30:00'\n * ```\n */\nexport function formatDateTime(time?: FormatDate): string {\n return formatDate(time, 'YYYY-MM-DD HH:mm:ss');\n}\n","/**\n * 日期实例类型检查模块\n */\n\n/**\n * 检查值是否为 Date 实例\n *\n * 使用 instanceof 操作符判断一个值是否为 Date 对象\n *\n * @param value - 要检查的值\n * @returns 是否为 Date 实例\n *\n * @example 检查 Date 对象\n * ```typescript\n * const date = new Date();\n * isDateInstance(date); // true\n * ```\n *\n * @example 检查非 Date 对象\n * ```typescript\n * isDateInstance('2024-01-25'); // false\n * isDateInstance(123456); // false\n * isDateInstance(null); // false\n * ```\n *\n * @example 类型守卫\n * ```typescript\n * function process(value: unknown) {\n * if (isDateInstance(value)) {\n * console.log(value.getFullYear()); // TypeScript 知道 value 是 Date\n * }\n * }\n * ```\n */\nexport function isDateInstance(value: unknown): value is Date {\n return value instanceof Date;\n}\n","/**\n * dayjs 对象类型检查模块\n */\n\nimport dayjs from 'dayjs';\nimport type { Dayjs } from 'dayjs';\n\n/**\n * 检查值是否为 dayjs 对象\n *\n * 使用 dayjs.isDayjs 方法判断一个值是否为 dayjs 对象\n *\n * @param value - 要检查的值\n * @returns 是否为 dayjs 对象\n *\n * @example 检查 dayjs 对象\n * ```typescript\n * const date = dayjs();\n * isDayjsObject(date); // true\n * ```\n *\n * @example 检查非 dayjs 对象\n * ```typescript\n * isDayjsObject(new Date()); // false\n * isDayjsObject('2024-01-25'); // false\n * isDayjsObject(123456); // false\n * ```\n *\n * @example 类型守卫\n * ```typescript\n * function process(value: unknown) {\n * if (isDayjsObject(value)) {\n * console.log(value.format('YYYY-MM-DD')); // TypeScript 知道 value 是 Dayjs\n * }\n * }\n * ```\n */\nexport function isDayjsObject(value: unknown): value is Dayjs {\n return dayjs.isDayjs(value);\n}\n","/**\n * 日期时间常量\n */\n\nimport dayjs from 'dayjs';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\n/**\n * 获取当前时区\n *\n * @returns 当前时区名称(如 'Asia/Shanghai')\n *\n * @example 获取系统时区\n * ```typescript\n * const tz = getSystemTimezone();\n * console.log(tz); // 'Asia/Shanghai'\n * ```\n */\nexport const getSystemTimezone = (): string => {\n return dayjs.tz.guess();\n};\n\n/**\n * 自定义设置的时区\n */\nlet currentTimezone = getSystemTimezone();\n\n/**\n * 设置默认时区\n *\n * 设置后续所有日期操作使用的时区\n *\n * @param timezone - 时区字符串,如果为空则使用系统时区\n *\n * @example 设置为东八区\n * ```typescript\n * setCurrentTimezone('Asia/Shanghai');\n * ```\n *\n * @example 设置为 UTC\n * ```typescript\n * setCurrentTimezone('UTC');\n * ```\n *\n * @example 重置为系统时区\n * ```typescript\n * setCurrentTimezone();\n * ```\n */\nexport const setCurrentTimezone = (timezone?: string): void => {\n currentTimezone = timezone || getSystemTimezone();\n dayjs.tz.setDefault(currentTimezone);\n};\n\n/**\n * 获取设置的时区\n *\n * @returns 当前设置的时区名称\n *\n * @example 获取当前时区\n * ```typescript\n * setCurrentTimezone('Asia/Tokyo');\n * const tz = getCurrentTimezone();\n * console.log(tz); // 'Asia/Tokyo'\n * ```\n */\nexport const getCurrentTimezone = (): string => {\n return currentTimezone;\n};\n","import type { TreeConfigOptions } from './types';\n\n/**\n * 遍历树形结构,并返回所有节点中指定的值\n *\n * 使用深度优先遍历(DFS)遍历树形结构的所有节点,提取每个节点的指定值\n *\n * @typeParam T - 树节点类型\n * @typeParam V - 节点值的类型\n *\n * @param tree - 树形结构数组\n * @param getValue - 获取节点值的函数\n * @param options - 配置选项\n * @param options.childProps - 子节点属性名称,默认为 'children'\n *\n * @returns 所有节点中指定的值的数组\n *\n * @example 提取所有节点的 id\n * ```typescript\n * const tree = [\n * { id: 1, name: 'A', children: [{ id: 2, name: 'A-1' }] },\n * { id: 3, name: 'B' }\n * ];\n * const ids = traverseTreeValues(tree, node => node.id);\n * console.log(ids); // [1, 2, 3]\n * ```\n *\n * @example 使用自定义子节点属性\n * ```typescript\n * const tree = [\n * { id: 1, items: [{ id: 2 }] }\n * ];\n * const ids = traverseTreeValues(\n * tree,\n * node => node.id,\n * { childProps: 'items' }\n * );\n * ```\n *\n * @example 提取所有节点的名称\n * ```typescript\n * const names = traverseTreeValues(tree, node => node.name);\n * console.log(names); // ['A', 'A-1', 'B']\n * ```\n */\nexport function traverseTreeValues<T, V>(\n tree: T[],\n getValue: (node: T) => V,\n options?: TreeConfigOptions,\n): V[] {\n const result: V[] = [];\n const childProps = options?.childProps ?? 'children';\n\n const dfs = (treeNode: T) => {\n const value = getValue(treeNode);\n result.push(value);\n const children = (treeNode as Record<string, any>)?.[childProps];\n if (!children) {\n return;\n }\n if (children.length > 0) {\n for (const child of children) {\n dfs(child);\n }\n }\n };\n\n for (const treeNode of tree) {\n dfs(treeNode);\n }\n return result.filter(Boolean);\n}\n","import type { TreeConfigOptions } from './types';\n\n/**\n * 根据条件过滤给定树结构的节点\n *\n * 保留满足条件的节点及其祖先节点,保持原有的层级结构\n *\n * @typeParam T - 树节点类型,必须是对象类型\n *\n * @param tree - 要过滤的树结构的根节点数组\n * @param filter - 用于匹配每个节点的条件函数\n * @param options - 配置选项\n * @param options.childProps - 子节点属性名称,默认为 'children'\n *\n * @returns 包含所有匹配节点的数组\n *\n * @example 过滤包含特定属性的节点\n * ```typescript\n * const tree = [\n * { id: 1, active: true, children: [\n * { id: 2, active: false },\n * { id: 3, active: true }\n * ]},\n * { id: 4, active: false }\n * ];\n *\n * const result = filterTree(tree, node => node.active);\n * console.log(result);\n * // [\n * // { id: 1, active: true, children: [{ id: 3, active: true }] }\n * // ]\n * ```\n *\n * @example 过滤包含特定文本的节点\n * ```typescript\n * const tree = [\n * { name: 'A', children: [{ name: 'Apple' }] },\n * { name: 'B', children: [{ name: 'Banana' }] }\n * ];\n *\n * const result = filterTree(tree, node => node.name.includes('A'));\n * console.log(result);\n * // [\n * // { name: 'A', children: [{ name: 'Apple' }] }\n * // ]\n * ```\n *\n * @example 使用自定义子节点属性\n * ```typescript\n * const tree = [\n * { id: 1, items: [{ id: 2, visible: true }] }\n * ];\n *\n * const result = filterTree(\n * tree,\n * node => node.visible,\n * { childProps: 'items' }\n * );\n * ```\n */\nexport function filterTree<T extends Record<string, any>>(\n tree: T[],\n filter: (node: T) => boolean,\n options?: TreeConfigOptions,\n): T[] {\n const childProps = options?.childProps ?? 'children';\n\n const _filterTree = (nodes: T[]): T[] => {\n return nodes.filter((node: Record<string, any>) => {\n if (filter(node as T)) {\n if (node[childProps]) {\n node[childProps] = _filterTree(node[childProps]);\n }\n return true;\n }\n return false;\n });\n };\n\n return _filterTree(tree);\n}\n","import type { TreeConfigOptions } from './types';\n\n/**\n * 根据条件重新映射给定树结构的节点\n *\n * 对树形结构的每个节点应用映射函数,生成新的树形结构\n *\n * @typeParam T - 源树节点类型\n * @typeParam V - 目标树节点类型,必须是对象类型\n *\n * @param tree - 要映射的树结构的根节点数组\n * @param mapper - 用于映射每个节点的函数\n * @param options - 配置选项\n * @param options.childProps - 子节点属性名称,默认为 'children'\n *\n * @returns 映射后的树形结构数组\n *\n * @example 添加新属性到节点\n * ```typescript\n * const tree = [\n * { id: 1, name: 'A', children: [{ id: 2, name: 'A-1' }] }\n * ];\n *\n * const result = mapTree(tree, node => ({\n * ...node,\n * label: `${node.name} (${node.id})`\n * }));\n * console.log(result);\n * // [\n * // { id: 1, name: 'A', label: 'A (1)', children: [\n * // { id: 2, name: 'A-1', label: 'A-1 (2)' }\n * // ]}\n * // ]\n * ```\n *\n * @example 转换节点类型\n * ```typescript\n * const tree = [\n * { value: 'a', children: [{ value: 'a-1' }] }\n * ];\n *\n * const result = mapTree(tree, node => ({\n * text: node.value,\n * checked: false\n * }));\n * console.log(result);\n * // [\n * // { text: 'a', checked: false, children: [{ text: 'a-1', checked: false }] }\n * // ]\n * ```\n *\n * @example 使用自定义子节点属性\n * ```typescript\n * const tree = [\n * { id: 1, items: [{ id: 2 }] }\n * ];\n *\n * const result = mapTree(\n * tree,\n * node => ({ ...node, mapped: true }),\n * { childProps: 'items' }\n * );\n * ```\n */\nexport function mapTree<T, V extends Record<string, any>>(\n tree: T[],\n mapper: (node: T) => V,\n options?: TreeConfigOptions,\n): V[] {\n const childProps = options?.childProps ?? 'children';\n return tree.map((node) => {\n const mapperNode: Record<string, any> = mapper(node);\n if (mapperNode[childProps]) {\n mapperNode[childProps] = mapTree(mapperNode[childProps], mapper, options);\n }\n return mapperNode as V;\n });\n}\n","import type { TreeConfigOptions } from './types';\n\n/**\n * 对树形结构数据进行递归排序\n *\n * 对树形结构的每一层节点应用排序函数,保持层级结构\n *\n * @typeParam T - 树节点类型,必须是对象类型\n *\n * @param treeData - 树形数据数组\n * @param sortFunction - 排序函数,用于定义排序规则\n * @param options - 配置选项\n * @param options.childProps - 子节点属性名称,默认为 'children'\n *\n * @returns 排序后的树形数据\n *\n * @example 按 id 升序排序\n * ```typescript\n * const tree = [\n * { id: 3, name: 'C', children: [{ id: 5, name: 'E' }] },\n * { id: 1, name: 'A', children: [{ id: 4, name: 'D' }, { id: 2, name: 'B' }] }\n * ];\n *\n * const result = sortTree(tree, (a, b) => a.id - b.id);\n * console.log(result);\n * // [\n * // { id: 1, name: 'A', children: [\n * // { id: 2, name: 'B' },\n * // { id: 4, name: 'D' }\n * // ]},\n * // { id: 3, name: 'C', children: [{ id: 5, name: 'E' }] }\n * // ]\n * ```\n *\n * @example 按名称字母顺序排序\n * ```typescript\n * const tree = [\n * { name: 'Zebra', children: [{ name: 'Y' }] },\n * { name: 'Apple', children: [{ name: 'Beta' }] }\n * ];\n *\n * const result = sortTree(tree, (a, b) => a.name.localeCompare(b.name));\n * console.log(result);\n * // [\n * // { name: 'Apple', children: [{ name: 'Beta' }] },\n * // { name: 'Zebra', children: [{ name: 'Y' }] }\n * // ]\n * ```\n *\n * @example 按自定义属性排序\n * ```typescript\n * const tree = [\n * { priority: 2, tasks: [{ priority: 3 }] },\n * { priority: 1, tasks: [{ priority: 2 }] }\n * ];\n *\n * const result = sortTree(\n * tree,\n * (a, b) => a.priority - b.priority,\n * { childProps: 'tasks' }\n * );\n * ```\n */\nexport function sortTree<T extends Record<string, any>>(\n treeData: T[],\n sortFunction: (a: T, b: T) => number,\n options?: TreeConfigOptions,\n): T[] {\n const childProps = options?.childProps ?? 'children';\n\n return [...treeData].sort(sortFunction).map((item) => {\n const children = item[childProps as keyof T];\n if (children && Array.isArray(children) && children.length > 0) {\n const result: T = {\n ...item,\n };\n (result as any)[childProps] = sortTree(children, sortFunction, options);\n return result;\n }\n return item;\n });\n}\n","let _dayjs: any = null\n\n/**\n * 异步获取 Dayjs 实例(已配置中文本地化和季度插件)\n * 这是一个懒加载导入,避免将 dayjs 作为直接依赖\n *\n * @example\n * ```ts\n * const dayjs = await getDayjs()\n * dayjs().format('YYYY-MM-DD') // '2024-01-25'\n * ```\n */\nexport async function getDayjs() {\n if (_dayjs) return _dayjs\n \n const dayjs = await import('dayjs')\n const quarterOfYear = await import('dayjs/plugin/quarterOfYear')\n await import('dayjs/locale/zh-cn')\n\n dayjs.default.extend(quarterOfYear.default)\n dayjs.default.locale('zh-cn')\n\n _dayjs = dayjs.default\n return _dayjs\n}\n\n/**\n * 同步获取 Dayjs 实例(仅用于测试环境)\n * 使用 ESM 动态导入,配合 vitest setupFiles 预加载使用\n *\n * 注意:此函数本质是异步的,但为了保持 API 一致性命名为 sync\n * 请确保在测试运行前通过 setupFiles 预加载\n *\n * @throws {Error} 如果 dayjs 未安装\n *\n * @example\n * ```ts\n * // 在测试 setup 文件中预加载\n * import { getDayjsSync } from './_dayjs'\n * await getDayjsSync()\n * \n * // 然后在代码中可以直接使用\n * const dayjs = getDayjsSync() // 返回缓存实例\n * ```\n */\nexport function getDayjsSync() {\n if (_dayjs) return _dayjs\n \n throw new Error(\n 'dayjs 未加载。请确保在测试 setup 文件中调用 await getDayjsSync() 预加载'\n )\n}\n\nexport default getDayjs\n"],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ import { TinyColor } from "@ctrl/tinycolor";
2
+ import { Dayjs } from "dayjs";
3
+
4
+ //#region src/_internal/_version.d.ts
5
+ declare const _version: string;
6
+ //#endregion
7
+ //#region src/array/unique.d.ts
8
+ declare function unique<T>(arr: T[]): T[];
9
+ //#endregion
10
+ //#region src/array/groupBy.d.ts
11
+ declare function groupBy<T, K extends string | number>(arr: T[], keyFn: (item: T) => K): Record<K, T[]>;
12
+ //#endregion
13
+ //#region src/array/chunk.d.ts
14
+ declare function chunk<T>(arr: T[], size: number): T[][];
15
+ //#endregion
16
+ //#region src/array/uniqueByField.d.ts
17
+ declare function uniqueByField<T>(arr: T[], key: keyof T): T[];
18
+ //#endregion
19
+ //#region src/object/deepClone.d.ts
20
+ declare function deepClone<T>(obj: T): T;
21
+ //#endregion
22
+ //#region src/object/deepEqual.d.ts
23
+ declare function deepEqual(a: any, b: any): boolean;
24
+ //#endregion
25
+ //#region src/object/deepMerge.d.ts
26
+ declare function deepMerge<T extends Record<string, any>>(...objects: Partial<T>[]): T;
27
+ //#endregion
28
+ //#region src/object/get.d.ts
29
+ declare function get(obj: any, path: string, defaultValue?: any): any;
30
+ //#endregion
31
+ //#region src/object/set.d.ts
32
+ declare function set(obj: any, path: string, value: any): void;
33
+ //#endregion
34
+ //#region src/function/debounce.d.ts
35
+ declare function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
36
+ //#endregion
37
+ //#region src/function/memoize.d.ts
38
+ declare function memoize<T extends (...args: any[]) => any>(fn: T, keyFn?: (...args: Parameters<T>) => string): T;
39
+ //#endregion
40
+ //#region src/function/partial.d.ts
41
+ declare function partial<T extends (...args: any[]) => any>(fn: T, ...presetArgs: any[]): (...remainingArgs: any[]) => ReturnType<T>;
42
+ //#endregion
43
+ //#region src/function/throttle.d.ts
44
+ declare function throttle<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
45
+ //#endregion
46
+ //#region src/string/camelCase.d.ts
47
+ declare function camelCase(str: string): string;
48
+ //#endregion
49
+ //#region src/string/capitalize.d.ts
50
+ declare function capitalize(str: string): string;
51
+ //#endregion
52
+ //#region src/string/isEmpty.d.ts
53
+ declare function isEmpty(str: string | null | undefined): boolean;
54
+ //#endregion
55
+ //#region src/string/kebabCase.d.ts
56
+ declare function kebabCase(str: string): string;
57
+ //#endregion
58
+ //#region src/string/random.d.ts
59
+ declare function random(length?: number): string;
60
+ //#endregion
61
+ //#region src/string/snakeCase.d.ts
62
+ declare function snakeCase(str: string): string;
63
+ //#endregion
64
+ //#region src/string/truncate.d.ts
65
+ declare function truncate(str: string, length: number, suffix?: string): string;
66
+ //#endregion
67
+ //#region src/string/safeJsonStringify.d.ts
68
+ declare function safeJsonStringify(value: any): any;
69
+ //#endregion
70
+ //#region src/string/safeParseJson.d.ts
71
+ type jsonType = object | Array<any>;
72
+ declare function safeParseJson(jsonString: any, rollback?: jsonType): jsonType;
73
+ //#endregion
74
+ //#region src/util/isArray.d.ts
75
+ declare function isArray(arg: any): boolean;
76
+ //#endregion
77
+ //#region src/util/isBoolean.d.ts
78
+ declare function isBoolean(arg: any): boolean;
79
+ //#endregion
80
+ //#region src/util/isDate.d.ts
81
+ declare function isDate(arg: any): boolean;
82
+ //#endregion
83
+ //#region src/util/isEmptyObject.d.ts
84
+ declare function isEmptyObject(arg: any): boolean;
85
+ //#endregion
86
+ //#region src/util/isError.d.ts
87
+ declare function isError(arg: any): boolean;
88
+ //#endregion
89
+ //#region src/util/isFunction.d.ts
90
+ declare function isFunction(arg: any): boolean;
91
+ //#endregion
92
+ //#region src/util/isMap.d.ts
93
+ declare function isMap(arg: any): boolean;
94
+ //#endregion
95
+ //#region src/util/isNil.d.ts
96
+ declare function isNil(value: any): boolean;
97
+ //#endregion
98
+ //#region src/util/isNull.d.ts
99
+ declare function isNull(arg: any): boolean;
100
+ //#endregion
101
+ //#region src/util/isNumber.d.ts
102
+ declare function isNumber(arg: any): boolean;
103
+ //#endregion
104
+ //#region src/util/isObject.d.ts
105
+ declare function isObject(arg: any): boolean;
106
+ //#endregion
107
+ //#region src/util/isPromise.d.ts
108
+ declare function isPromise(arg: any): boolean;
109
+ //#endregion
110
+ //#region src/util/isRegExp.d.ts
111
+ declare function isRegExp(arg: any): boolean;
112
+ //#endregion
113
+ //#region src/util/isSet.d.ts
114
+ declare function isSet(arg: any): boolean;
115
+ //#endregion
116
+ //#region src/util/isString.d.ts
117
+ declare function isString(arg: any): boolean;
118
+ //#endregion
119
+ //#region src/util/isSymbol.d.ts
120
+ declare function isSymbol(arg: any): boolean;
121
+ //#endregion
122
+ //#region src/util/isTypeOf.d.ts
123
+ declare function isTypeOf(arg: any): string;
124
+ //#endregion
125
+ //#region src/util/isUndefined.d.ts
126
+ declare function isUndefined(arg: any): boolean;
127
+ //#endregion
128
+ //#region src/url/parseQueryString.d.ts
129
+ declare function parseQueryString(query: string): Record<string, string | undefined>;
130
+ //#endregion
131
+ //#region src/url/querystringify.d.ts
132
+ declare function _decode(input: string): string | null;
133
+ declare function _encode(input: string): string | null;
134
+ declare function querystringify(obj: object, prefix?: string): string;
135
+ //#endregion
136
+ //#region src/url/urlParse.d.ts
137
+ interface IURL {
138
+ hash?: string;
139
+ hashSearchObject?: Record<string, string | undefined>;
140
+ host?: string;
141
+ hostname?: string;
142
+ href?: string;
143
+ origin?: string;
144
+ password?: string;
145
+ pathname?: string;
146
+ port?: string;
147
+ protocol?: string;
148
+ search?: string;
149
+ searchObject?: Record<string, string | undefined>;
150
+ username?: string;
151
+ }
152
+ declare function urlParse(urlString?: string): IURL;
153
+ //#endregion
154
+ //#region src/accountant/convertChineseNumber.d.ts
155
+ declare function convertChineseNumber(num: number): string;
156
+ //#endregion
157
+ //#region src/accountant/convertCurrency.d.ts
158
+ declare function convertCurrency(currencyDigits: number | string, prefixSymbol?: boolean): string;
159
+ //#endregion
160
+ //#region src/accountant/format.d.ts
161
+ declare function format(input: number, format?: string): string;
162
+ //#endregion
163
+ //#region src/accountant/formatMoney.d.ts
164
+ declare function formatMoney(input: number, format?: string): string;
165
+ //#endregion
166
+ //#region src/accountant/formatNumber.d.ts
167
+ declare function formatNumber(input: number, format?: string): string;
168
+ //#endregion
169
+ //#region src/accountant/formatPercentage.d.ts
170
+ declare function formatPercentage(input: number, format?: string): string;
171
+ //#endregion
172
+ //#region src/accountant/getFormatStr.d.ts
173
+ declare function getFormatStr(options?: {
174
+ separate: boolean;
175
+ point: number;
176
+ }): string;
177
+ //#endregion
178
+ //#region src/accountant/toFixed.d.ts
179
+ declare function toFixed(number: number, digits?: number): string;
180
+ //#endregion
181
+ //#region src/accountant/unformat.d.ts
182
+ declare function unformat(input?: string): number | typeof NaN;
183
+ //#endregion
184
+ //#region src/color/color.d.ts
185
+ declare function isDarkColor(color: string): boolean;
186
+ declare function isLightColor(color: string): boolean;
187
+ //#endregion
188
+ //#region src/color/convert.d.ts
189
+ declare function convertToHsl(color: string): string;
190
+ declare function convertToHslCssVar(color: string): string;
191
+ declare function convertToRgb(str: string): string;
192
+ declare function isValidColor(color?: string): boolean;
193
+ //#endregion
194
+ //#region src/color/generator.d.ts
195
+ interface ColorItem {
196
+ alias?: string;
197
+ color: string;
198
+ name: string;
199
+ }
200
+ declare function generatorColorVariables(colorItems: ColorItem[]): Record<string, string>;
201
+ //#endregion
202
+ //#region src/date/types.d.ts
203
+ type FormatDate = Date | Dayjs | number | string;
204
+ type Format = 'HH' | 'HH:mm' | 'HH:mm:ss' | 'YYYY' | 'YYYY-MM' | 'YYYY-MM-DD' | 'YYYY-MM-DD HH' | 'YYYY-MM-DD HH:mm' | 'YYYY-MM-DD HH:mm:ss' | (string & {});
205
+ //#endregion
206
+ //#region src/date/formatDate.d.ts
207
+ declare function formatDate(time?: FormatDate, format?: Format): string;
208
+ //#endregion
209
+ //#region src/date/formatDateTime.d.ts
210
+ declare function formatDateTime(time?: FormatDate): string;
211
+ //#endregion
212
+ //#region src/date/isDateInstance.d.ts
213
+ declare function isDateInstance(value: unknown): value is Date;
214
+ //#endregion
215
+ //#region src/date/isDayjsObject.d.ts
216
+ declare function isDayjsObject(value: unknown): value is Dayjs;
217
+ //#endregion
218
+ //#region src/date/constants.d.ts
219
+ declare const getSystemTimezone: () => string;
220
+ declare const setCurrentTimezone: (timezone?: string) => void;
221
+ declare const getCurrentTimezone: () => string;
222
+ //#endregion
223
+ //#region src/tree/types.d.ts
224
+ interface TreeConfigOptions {
225
+ childProps: string;
226
+ }
227
+ //#endregion
228
+ //#region src/tree/traverseTreeValues.d.ts
229
+ declare function traverseTreeValues<T, V>(tree: T[], getValue: (node: T) => V, options?: TreeConfigOptions): V[];
230
+ //#endregion
231
+ //#region src/tree/filterTree.d.ts
232
+ declare function filterTree<T extends Record<string, any>>(tree: T[], filter: (node: T) => boolean, options?: TreeConfigOptions): T[];
233
+ //#endregion
234
+ //#region src/tree/mapTree.d.ts
235
+ declare function mapTree<T, V extends Record<string, any>>(tree: T[], mapper: (node: T) => V, options?: TreeConfigOptions): V[];
236
+ //#endregion
237
+ //#region src/tree/sortTree.d.ts
238
+ declare function sortTree<T extends Record<string, any>>(treeData: T[], sortFunction: (a: T, b: T) => number, options?: TreeConfigOptions): T[];
239
+ //#endregion
240
+ //#region src/_internal/_numeral.d.ts
241
+ declare function getNumeral(): Promise<any>;
242
+ declare function getNumeralSync(): any;
243
+ //#endregion
244
+ //#region src/_internal/_dayjs.d.ts
245
+ declare function getDayjs(): Promise<any>;
246
+ declare function getDayjsSync(): any;
247
+ //#endregion
248
+ export { Format, FormatDate, IURL, TinyColor, TreeConfigOptions, _decode, _encode, _version, camelCase, capitalize, chunk, convertChineseNumber, convertCurrency, convertToHsl, convertToHslCssVar, convertToRgb, debounce, deepClone, deepEqual, deepMerge, filterTree, format, formatDate, formatDateTime, formatMoney, formatNumber, formatPercentage, generatorColorVariables, get, getCurrentTimezone, getDayjs, getDayjsSync, getFormatStr, getNumeral, getNumeralSync, getSystemTimezone, groupBy, isArray, isBoolean, isDarkColor, isDate, isDateInstance, isDayjsObject, isEmpty, isEmptyObject, isError, isFunction, isLightColor, isMap, isNil, isNull, isNumber, isObject, isPromise, isRegExp, isSet, isString, isSymbol, isTypeOf, isUndefined, isValidColor, jsonType, kebabCase, mapTree, memoize, parseQueryString, partial, querystringify, random, safeJsonStringify, safeParseJson, set, setCurrentTimezone, snakeCase, sortTree, throttle, toFixed, traverseTreeValues, truncate, unformat, unique, uniqueByField, urlParse };
249
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/_internal/_version.ts","../src/array/unique.ts","../src/array/groupBy.ts","../src/array/chunk.ts","../src/array/uniqueByField.ts","../src/object/deepClone.ts","../src/object/deepEqual.ts","../src/object/deepMerge.ts","../src/object/get.ts","../src/object/set.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/partial.ts","../src/function/throttle.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/isEmpty.ts","../src/string/kebabCase.ts","../src/string/random.ts","../src/string/snakeCase.ts","../src/string/truncate.ts","../src/string/safeJsonStringify.ts","../src/string/safeParseJson.ts","../src/util/isArray.ts","../src/util/isBoolean.ts","../src/util/isDate.ts","../src/util/isEmptyObject.ts","../src/util/isError.ts","../src/util/isFunction.ts","../src/util/isMap.ts","../src/util/isNil.ts","../src/util/isNull.ts","../src/util/isNumber.ts","../src/util/isObject.ts","../src/util/isPromise.ts","../src/util/isRegExp.ts","../src/util/isSet.ts","../src/util/isString.ts","../src/util/isSymbol.ts","../src/util/isTypeOf.ts","../src/util/isUndefined.ts","../src/url/parseQueryString.ts","../src/url/querystringify.ts","../src/url/urlParse.ts","../src/accountant/convertChineseNumber.ts","../src/accountant/convertCurrency.ts","../src/accountant/format.ts","../src/accountant/formatMoney.ts","../src/accountant/formatNumber.ts","../src/accountant/formatPercentage.ts","../src/accountant/getFormatStr.ts","../src/accountant/toFixed.ts","../src/accountant/unformat.ts","../src/color/color.ts","../src/color/convert.ts","../src/color/generator.ts","../src/date/types.ts","../src/date/formatDate.ts","../src/date/formatDateTime.ts","../src/date/isDateInstance.ts","../src/date/isDayjsObject.ts","../src/date/constants.ts","../src/tree/types.ts","../src/tree/traverseTreeValues.ts","../src/tree/filterTree.ts","../src/tree/mapTree.ts","../src/tree/sortTree.ts","../src/_internal/_numeral.ts","../src/_internal/_dayjs.ts"],"mappings":"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"}