ly-utils-lib 1.0.11 → 2.4.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +889 -686
  3. package/dist/array.cjs +237 -0
  4. package/dist/array.cjs.map +1 -0
  5. package/dist/array.d.cts +2 -0
  6. package/dist/array.d.ts +2 -0
  7. package/dist/array.js +150 -0
  8. package/dist/array.js.map +1 -0
  9. package/dist/crypto.cjs +193 -0
  10. package/dist/crypto.cjs.map +1 -0
  11. package/dist/crypto.d.cts +3 -0
  12. package/dist/crypto.d.ts +3 -0
  13. package/dist/crypto.js +144 -0
  14. package/dist/crypto.js.map +1 -0
  15. package/dist/date.cjs +563 -0
  16. package/dist/date.cjs.map +1 -0
  17. package/dist/date.d.cts +2 -0
  18. package/dist/date.d.ts +2 -0
  19. package/dist/date.js +451 -0
  20. package/dist/date.js.map +1 -0
  21. package/dist/excel.cjs +227 -0
  22. package/dist/excel.cjs.map +1 -0
  23. package/dist/excel.d.cts +2 -0
  24. package/dist/excel.d.ts +2 -0
  25. package/dist/excel.js +196 -0
  26. package/dist/excel.js.map +1 -0
  27. package/dist/index-B80SEVzM.d.cts +382 -0
  28. package/dist/index-B80SEVzM.d.ts +382 -0
  29. package/dist/index-Ba1rjTzj.d.cts +299 -0
  30. package/dist/index-Ba1rjTzj.d.ts +299 -0
  31. package/dist/index-Bg1ise7y.d.cts +253 -0
  32. package/dist/index-Bg1ise7y.d.ts +253 -0
  33. package/dist/index-BoqNpwNa.d.cts +203 -0
  34. package/dist/index-BoqNpwNa.d.ts +203 -0
  35. package/dist/index-C0qUnb9Y.d.cts +533 -0
  36. package/dist/index-C0qUnb9Y.d.ts +533 -0
  37. package/dist/index-Cy-mb5v_.d.cts +262 -0
  38. package/dist/index-Cy-mb5v_.d.ts +262 -0
  39. package/dist/index-D1f9Sym2.d.cts +148 -0
  40. package/dist/index-D1f9Sym2.d.ts +148 -0
  41. package/dist/index-Dan5oF-5.d.cts +213 -0
  42. package/dist/index-Dan5oF-5.d.ts +213 -0
  43. package/dist/index-XABfrs7z.d.cts +596 -0
  44. package/dist/index-XABfrs7z.d.ts +596 -0
  45. package/dist/index-YXWfKCK7.d.cts +109 -0
  46. package/dist/index-YXWfKCK7.d.ts +109 -0
  47. package/dist/index.cjs +3355 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +21 -0
  50. package/dist/index.d.ts +21 -0
  51. package/dist/index.js +3294 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/map.cjs +839 -0
  54. package/dist/map.cjs.map +1 -0
  55. package/dist/map.d.cts +6 -0
  56. package/dist/map.d.ts +6 -0
  57. package/dist/map.js +811 -0
  58. package/dist/map.js.map +1 -0
  59. package/dist/object.cjs +316 -0
  60. package/dist/object.cjs.map +1 -0
  61. package/dist/object.d.cts +2 -0
  62. package/dist/object.d.ts +2 -0
  63. package/dist/object.js +247 -0
  64. package/dist/object.js.map +1 -0
  65. package/dist/pdf.cjs +197 -0
  66. package/dist/pdf.cjs.map +1 -0
  67. package/dist/pdf.d.cts +3 -0
  68. package/dist/pdf.d.ts +3 -0
  69. package/dist/pdf.js +173 -0
  70. package/dist/pdf.js.map +1 -0
  71. package/dist/storage.cjs +255 -0
  72. package/dist/storage.cjs.map +1 -0
  73. package/dist/storage.d.cts +1 -0
  74. package/dist/storage.d.ts +1 -0
  75. package/dist/storage.js +226 -0
  76. package/dist/storage.js.map +1 -0
  77. package/dist/string.cjs +232 -0
  78. package/dist/string.cjs.map +1 -0
  79. package/dist/string.d.cts +2 -0
  80. package/dist/string.d.ts +2 -0
  81. package/dist/string.js +170 -0
  82. package/dist/string.js.map +1 -0
  83. package/dist/utils.cjs +429 -0
  84. package/dist/utils.cjs.map +1 -0
  85. package/dist/utils.d.cts +2 -0
  86. package/dist/utils.d.ts +2 -0
  87. package/dist/utils.js +371 -0
  88. package/dist/utils.js.map +1 -0
  89. package/package.json +159 -33
  90. package/dist/ly-utils-lib.cjs.js +0 -52929
  91. package/dist/ly-utils-lib.cjs.js.map +0 -1
  92. package/dist/ly-utils-lib.es.js +0 -69623
  93. package/dist/ly-utils-lib.es.js.map +0 -1
  94. package/dist/ly-utils-lib.umd.js +0 -53314
  95. package/dist/ly-utils-lib.umd.js.map +0 -1
  96. package/dist/types/index.d.ts +0 -15
  97. package/dist/types/utils/esToolkit.d.ts +0 -12
  98. package/dist/types/utils/ol.d.ts +0 -181
  99. package/dist/types/utils/router.d.ts +0 -15
  100. package/dist/types/utils/storage.d.ts +0 -42
  101. package/dist/types/utils/time.d.ts +0 -76
  102. package/dist/types/utils/tool.d.ts +0 -86
  103. package/dist/vite.svg +0 -1
package/dist/string.js ADDED
@@ -0,0 +1,170 @@
1
+ import { trim } from 'es-toolkit';
2
+ export { camelCase, capitalize, kebabCase, lowerFirst, snakeCase, startCase, trim, upperFirst } from 'es-toolkit';
3
+
4
+ // src/modules/string/index.ts
5
+ var isEmpty = (str) => {
6
+ if (!str) return true;
7
+ return trim(str).length === 0;
8
+ };
9
+ var random = (length = 8, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") => {
10
+ let result = "";
11
+ for (let i = 0; i < length; i++) {
12
+ result += charset.charAt(Math.floor(Math.random() * charset.length));
13
+ }
14
+ return result;
15
+ };
16
+ var uuid = () => {
17
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
18
+ const r = Math.random() * 16 | 0;
19
+ const v = c === "x" ? r : r & 3 | 8;
20
+ return v.toString(16);
21
+ });
22
+ };
23
+ var shortId = (length = 6) => {
24
+ const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
25
+ let result = "";
26
+ for (let i = 0; i < length; i++) {
27
+ result += charset.charAt(Math.floor(Math.random() * charset.length));
28
+ }
29
+ return result;
30
+ };
31
+ var firstUpperCase = (str) => {
32
+ return str.charAt(0).toUpperCase() + str.slice(1);
33
+ };
34
+ var firstLowerCase = (str) => {
35
+ return str.charAt(0).toLowerCase() + str.slice(1);
36
+ };
37
+ var reverse = (str) => {
38
+ return str.split("").reverse().join("");
39
+ };
40
+ var repeat = (str, count) => {
41
+ return str.repeat(count);
42
+ };
43
+ var pad = (str, length, char = "0", isEnd = false) => {
44
+ const s = String(str);
45
+ if (isEnd) {
46
+ return s.padEnd(length, char);
47
+ }
48
+ return s.padStart(length, char);
49
+ };
50
+ var getExtension = (filename) => {
51
+ const idx = filename.lastIndexOf(".");
52
+ if (idx === -1) return "";
53
+ return filename.slice(idx + 1);
54
+ };
55
+ var getFileName = (filename) => {
56
+ const lastSlash = Math.max(filename.lastIndexOf("/"), filename.lastIndexOf("\\"));
57
+ const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1);
58
+ const lastDot = nameWithExt.lastIndexOf(".");
59
+ return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot);
60
+ };
61
+ var hidePhone = (phone) => {
62
+ return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
63
+ };
64
+ var hideEmail = (email) => {
65
+ const [username, domain] = email.split("@");
66
+ if (username.length <= 2) return email;
67
+ return `${username[0]}${"*".repeat(username.length - 2)}${username[username.length - 1]}@${domain}`;
68
+ };
69
+ var hideIdCard = (idCard) => {
70
+ if (idCard.length < 8) return idCard;
71
+ return `${idCard.slice(0, 4)}${"*".repeat(idCard.length - 8)}${idCard.slice(-4)}`;
72
+ };
73
+ var formatMoney = (amount, decimals = 2, separator = ",") => {
74
+ const str = amount.toFixed(decimals);
75
+ const parts = str.split(".");
76
+ parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator);
77
+ return parts.join(".");
78
+ };
79
+ var toNumber = (str, defaultValue = 0) => {
80
+ if (typeof str === "number") return str;
81
+ if (!str) return defaultValue;
82
+ const num = Number(str);
83
+ return isNaN(num) ? defaultValue : num;
84
+ };
85
+ var toBoolean = (str, defaultValue = false) => {
86
+ if (typeof str === "boolean") return str;
87
+ if (!str) return defaultValue;
88
+ return ["true", "1", "yes", "on"].includes(str.toLowerCase());
89
+ };
90
+ var extractNumbers = (str) => {
91
+ const matches = str.match(/-?\d+(\.\d+)?/g);
92
+ return matches ? matches.map(Number) : [];
93
+ };
94
+ var extractPhones = (str) => {
95
+ const matches = str.match(/1[3-9]\d{9}/g);
96
+ return matches || [];
97
+ };
98
+ var extractEmails = (str) => {
99
+ const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g);
100
+ return matches || [];
101
+ };
102
+ var isPhone = (phone) => {
103
+ return /^1[3-9]\d{9}$/.test(phone);
104
+ };
105
+ var isEmail = (email) => {
106
+ return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email);
107
+ };
108
+ var isIdCard = (idCard) => {
109
+ return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idCard);
110
+ };
111
+ var isUrl = (url) => {
112
+ try {
113
+ new URL(url);
114
+ return true;
115
+ } catch {
116
+ return false;
117
+ }
118
+ };
119
+ var highlight = (text, keyword, highlightClass = "highlight") => {
120
+ if (!keyword) return text;
121
+ const regex = new RegExp(`(${keyword})`, "gi");
122
+ return text.replace(regex, `<span class="${highlightClass}">$1</span>`);
123
+ };
124
+ var truncateText = (text, length = 100, suffix = "...") => {
125
+ if (text.length <= length) return text;
126
+ return text.slice(0, length) + suffix;
127
+ };
128
+ var escapeHtml = (str) => {
129
+ const htmlEscapes = {
130
+ "&": "&amp;",
131
+ "<": "&lt;",
132
+ ">": "&gt;",
133
+ '"': "&quot;",
134
+ "'": "&#39;"
135
+ };
136
+ return str.replace(/[&<>"']/g, (char) => htmlEscapes[char]);
137
+ };
138
+ var unescapeHtml = (str) => {
139
+ const htmlUnescapes = {
140
+ "&amp;": "&",
141
+ "&lt;": "<",
142
+ "&gt;": ">",
143
+ "&quot;": '"',
144
+ "&#39;": "'"
145
+ };
146
+ return str.replace(/&(amp|lt|gt|quot|#39);/g, (match) => htmlUnescapes[match]);
147
+ };
148
+ var stripTags = (str) => {
149
+ return str.replace(/<[^>]*>/g, "");
150
+ };
151
+ var byteLength = (str) => {
152
+ let len = 0;
153
+ for (let i = 0; i < str.length; i++) {
154
+ const code = str.charCodeAt(i);
155
+ if (code >= 1 && code <= 126) {
156
+ len += 1;
157
+ } else if (code >= 128 && code <= 2047) {
158
+ len += 2;
159
+ } else if (code >= 2048 && code <= 65535) {
160
+ len += 3;
161
+ } else {
162
+ len += 4;
163
+ }
164
+ }
165
+ return len;
166
+ };
167
+
168
+ export { byteLength, escapeHtml, extractEmails, extractNumbers, extractPhones, firstLowerCase, firstUpperCase, formatMoney, getExtension, getFileName, hideEmail, hideIdCard, hidePhone, highlight, isEmail, isEmpty, isIdCard, isPhone, isUrl, pad, random, repeat, reverse, shortId, stripTags, toBoolean, toNumber, truncateText, unescapeHtml, uuid };
169
+ //# sourceMappingURL=string.js.map
170
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/string/index.ts"],"names":[],"mappings":"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","file":"string.js","sourcesContent":["/**\n * 字符串工具模块\n * 基于 es-toolkit 封装,提供常用的字符串处理功能\n */\n\nimport {\n camelCase,\n kebabCase,\n snakeCase,\n startCase,\n capitalize,\n lowerFirst,\n upperFirst,\n trim,\n} from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { camelCase, kebabCase, snakeCase, startCase, capitalize, lowerFirst, upperFirst, trim }\n\n/**\n * 判断字符串是否为空\n * @param str 字符串\n */\nexport const isEmpty = (str: string | null | undefined): boolean => {\n if (!str) return true\n return trim(str).length === 0\n}\n\n/**\n * 生成随机字符串\n * @param length 长度\n * @param charset 字符集\n */\nexport const random = (\n length = 8,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string => {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 生成 UUID\n */\nexport const uuid = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n/**\n * 生成短 ID\n * @param length 长度\n */\nexport const shortId = (length = 6): string => {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 字符串首字母大写\n * @param str 字符串\n */\nexport const firstUpperCase = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * 字符串首字母小写\n * @param str 字符串\n */\nexport const firstLowerCase = (str: string): string => {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n\n/**\n * 反转字符串\n * @param str 字符串\n */\nexport const reverse = (str: string): string => {\n return str.split('').reverse().join('')\n}\n\n/**\n * 字符串重复\n * @param str 字符串\n * @param count 重复次数\n */\nexport const repeat = (str: string, count: number): string => {\n return str.repeat(count)\n}\n\n/**\n * 填充字符串\n * @param str 字符串\n * @param length 目标长度\n * @param char 填充字符\n * @param isEnd 是否在末尾填充\n */\nexport const pad = (str: string | number, length: number, char = '0', isEnd = false): string => {\n const s = String(str)\n if (isEnd) {\n return s.padEnd(length, char)\n }\n return s.padStart(length, char)\n}\n\n/**\n * 获取文件扩展名\n * @param filename 文件名\n */\nexport const getExtension = (filename: string): string => {\n const idx = filename.lastIndexOf('.')\n if (idx === -1) return ''\n return filename.slice(idx + 1)\n}\n\n/**\n * 获取文件名(不带扩展名)\n * @param filename 文件名\n */\nexport const getFileName = (filename: string): string => {\n const lastSlash = Math.max(filename.lastIndexOf('/'), filename.lastIndexOf('\\\\'))\n const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1)\n const lastDot = nameWithExt.lastIndexOf('.')\n return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot)\n}\n\n/**\n * 隐藏手机号中间四位\n * @param phone 手机号\n */\nexport const hidePhone = (phone: string): string => {\n return phone.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2')\n}\n\n/**\n * 隐藏邮箱\n * @param email 邮箱\n */\nexport const hideEmail = (email: string): string => {\n const [username, domain] = email.split('@')\n if (username.length <= 2) return email\n return `${username[0]}${'*'.repeat(username.length - 2)}${username[username.length - 1]}@${domain}`\n}\n\n/**\n * 隐藏身份证号中间部分\n * @param idCard 身份证号\n */\nexport const hideIdCard = (idCard: string): string => {\n if (idCard.length < 8) return idCard\n return `${idCard.slice(0, 4)}${'*'.repeat(idCard.length - 8)}${idCard.slice(-4)}`\n}\n\n/**\n * 格式化金额\n * @param amount 金额\n * @param decimals 小数位数\n * @param separator 千位分隔符\n */\nexport const formatMoney = (amount: number, decimals = 2, separator = ','): string => {\n const str = amount.toFixed(decimals)\n const parts = str.split('.')\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return parts.join('.')\n}\n\n/**\n * 字符串转数字\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toNumber = (str: string | number | null | undefined, defaultValue = 0): number => {\n if (typeof str === 'number') return str\n if (!str) return defaultValue\n const num = Number(str)\n return isNaN(num) ? defaultValue : num\n}\n\n/**\n * 字符串转布尔值\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toBoolean = (\n str: string | boolean | null | undefined,\n defaultValue = false\n): boolean => {\n if (typeof str === 'boolean') return str\n if (!str) return defaultValue\n return ['true', '1', 'yes', 'on'].includes(str.toLowerCase())\n}\n\n/**\n * 提取字符串中的数字\n * @param str 字符串\n */\nexport const extractNumbers = (str: string): number[] => {\n const matches = str.match(/-?\\d+(\\.\\d+)?/g)\n return matches ? matches.map(Number) : []\n}\n\n/**\n * 提取字符串中的手机号\n * @param str 字符串\n */\nexport const extractPhones = (str: string): string[] => {\n const matches = str.match(/1[3-9]\\d{9}/g)\n return matches || []\n}\n\n/**\n * 提取字符串中的邮箱\n * @param str 字符串\n */\nexport const extractEmails = (str: string): string[] => {\n const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g)\n return matches || []\n}\n\n/**\n * 验证手机号\n * @param phone 手机号\n */\nexport const isPhone = (phone: string): boolean => {\n return /^1[3-9]\\d{9}$/.test(phone)\n}\n\n/**\n * 验证邮箱\n * @param email 邮箱\n */\nexport const isEmail = (email: string): boolean => {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(email)\n}\n\n/**\n * 验证身份证号\n * @param idCard 身份证号\n */\nexport const isIdCard = (idCard: string): boolean => {\n return /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/.test(idCard)\n}\n\n/**\n * 验证 URL\n * @param url URL\n */\nexport const isUrl = (url: string): boolean => {\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * 高亮关键词\n * @param text 文本\n * @param keyword 关键词\n * @param highlightClass 高亮样式类名\n */\nexport const highlight = (text: string, keyword: string, highlightClass = 'highlight'): string => {\n if (!keyword) return text\n const regex = new RegExp(`(${keyword})`, 'gi')\n return text.replace(regex, `<span class=\"${highlightClass}\">$1</span>`)\n}\n\n/**\n * 截断文本(支持 HTML)\n * @param text 文本\n * @param length 最大长度\n * @param suffix 后缀\n */\nexport const truncateText = (text: string, length = 100, suffix = '...'): string => {\n if (text.length <= length) return text\n return text.slice(0, length) + suffix\n}\n\n/**\n * 转义 HTML\n * @param str 字符串\n */\nexport const escapeHtml = (str: string): string => {\n const htmlEscapes: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char])\n}\n\n/**\n * 反转义 HTML\n * @param str 字符串\n */\nexport const unescapeHtml = (str: string): string => {\n const htmlUnescapes: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n }\n return str.replace(/&(amp|lt|gt|quot|#39);/g, match => htmlUnescapes[match])\n}\n\n/**\n * 移除 HTML 标签\n * @param str 字符串\n */\nexport const stripTags = (str: string): string => {\n return str.replace(/<[^>]*>/g, '')\n}\n\n/**\n * 字节长度\n * @param str 字符串\n */\nexport const byteLength = (str: string): number => {\n let len = 0\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i)\n if (code >= 0x0001 && code <= 0x007e) {\n len += 1\n } else if (code >= 0x0080 && code <= 0x07ff) {\n len += 2\n } else if (code >= 0x0800 && code <= 0xffff) {\n len += 3\n } else {\n len += 4\n }\n }\n return len\n}\n"]}
package/dist/utils.cjs ADDED
@@ -0,0 +1,429 @@
1
+ 'use strict';
2
+
3
+ var esToolkit = require('es-toolkit');
4
+
5
+ // src/modules/utils/index.ts
6
+ var clone = (obj) => {
7
+ if (obj === null || typeof obj !== "object") {
8
+ return obj;
9
+ }
10
+ if (obj instanceof Date) {
11
+ return new Date(obj.getTime());
12
+ }
13
+ if (obj instanceof Array) {
14
+ return obj.map((item) => clone(item));
15
+ }
16
+ if (obj instanceof Object) {
17
+ const copy = {};
18
+ Object.keys(obj).forEach((key) => {
19
+ copy[key] = clone(obj[key]);
20
+ });
21
+ return copy;
22
+ }
23
+ return obj;
24
+ };
25
+ var isEqual = (a, b) => {
26
+ if (a === b) return true;
27
+ if (a === null || b === null) return false;
28
+ if (typeof a !== typeof b) return false;
29
+ if (typeof a !== "object") return a === b;
30
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
31
+ if (Array.isArray(a)) {
32
+ if (a.length !== b.length) return false;
33
+ for (let i = 0; i < a.length; i++) {
34
+ if (!isEqual(a[i], b[i])) return false;
35
+ }
36
+ return true;
37
+ }
38
+ const keysA = Object.keys(a);
39
+ const keysB = Object.keys(b);
40
+ if (keysA.length !== keysB.length) return false;
41
+ for (const key of keysA) {
42
+ if (!keysB.includes(key)) return false;
43
+ if (!isEqual(a[key], b[key])) return false;
44
+ }
45
+ return true;
46
+ };
47
+ var deepMerge = (...objects) => {
48
+ const result = {};
49
+ objects.forEach((obj) => {
50
+ if (isObject(obj)) {
51
+ Object.keys(obj).forEach((key) => {
52
+ const value = obj[key];
53
+ if (isObject(value) && isObject(result[key])) {
54
+ result[key] = deepMerge(result[key], value);
55
+ } else {
56
+ result[key] = clone(value);
57
+ }
58
+ });
59
+ }
60
+ });
61
+ return result;
62
+ };
63
+ var get = (obj, path) => {
64
+ return path.split(".").reduce((acc, key) => acc?.[key], obj);
65
+ };
66
+ var set = (obj, path, value) => {
67
+ const keys = path.split(".");
68
+ const lastKey = keys.pop();
69
+ const target = keys.reduce((acc, key) => {
70
+ if (!acc[key]) acc[key] = {};
71
+ return acc[key];
72
+ }, obj);
73
+ target[lastKey] = value;
74
+ };
75
+ var omit = (obj, keys) => {
76
+ const result = { ...obj };
77
+ keys.forEach((key) => delete result[key]);
78
+ return result;
79
+ };
80
+ var pick = (obj, keys) => {
81
+ const result = {};
82
+ keys.forEach((key) => {
83
+ if (key in obj) {
84
+ result[key] = obj[key];
85
+ }
86
+ });
87
+ return result;
88
+ };
89
+ var isObject = (value) => {
90
+ return value !== null && typeof value === "object" && !Array.isArray(value);
91
+ };
92
+ var isArray = (value) => {
93
+ return Array.isArray(value);
94
+ };
95
+ var isString = (value) => {
96
+ return typeof value === "string";
97
+ };
98
+ var isNumber = (value) => {
99
+ return typeof value === "number" && !isNaN(value);
100
+ };
101
+ var isBoolean = (value) => {
102
+ return typeof value === "boolean";
103
+ };
104
+ var isFunction = (value) => {
105
+ return typeof value === "function";
106
+ };
107
+ var isEmpty = (value) => {
108
+ if (value === null || value === void 0) return true;
109
+ if (isString(value) || Array.isArray(value)) return value.length === 0;
110
+ if (isObject(value)) return Object.keys(value).length === 0;
111
+ return false;
112
+ };
113
+ var uniq = (array) => {
114
+ return [...new Set(array)];
115
+ };
116
+ var sortBy = (array, key) => {
117
+ const sortFn = typeof key === "function" ? key : (item) => item[key];
118
+ return [...array].sort((a, b) => {
119
+ const valueA = sortFn(a);
120
+ const valueB = sortFn(b);
121
+ if (valueA < valueB) return -1;
122
+ if (valueA > valueB) return 1;
123
+ return 0;
124
+ });
125
+ };
126
+ var chunk = (array, size) => {
127
+ const result = [];
128
+ for (let i = 0; i < array.length; i += size) {
129
+ result.push(array.slice(i, i + size));
130
+ }
131
+ return result;
132
+ };
133
+ var groupBy = (array, key) => {
134
+ const groupFn = typeof key === "function" ? key : (item) => String(item[key]);
135
+ return array.reduce(
136
+ (result, item) => {
137
+ const groupKey = groupFn(item);
138
+ if (!result[groupKey]) {
139
+ result[groupKey] = [];
140
+ }
141
+ result[groupKey].push(item);
142
+ return result;
143
+ },
144
+ {}
145
+ );
146
+ };
147
+ var sum = (array) => {
148
+ return array.reduce((acc, num) => acc + num, 0);
149
+ };
150
+ var avg = (array) => {
151
+ return array.length > 0 ? sum(array) / array.length : 0;
152
+ };
153
+ var max = (array) => {
154
+ return Math.max(...array);
155
+ };
156
+ var min = (array) => {
157
+ return Math.min(...array);
158
+ };
159
+ var camelToSnake = (str) => {
160
+ return str.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`);
161
+ };
162
+ var snakeToCamel = (str) => {
163
+ return str.replace(/_([a-z])/g, (_, match) => match.toUpperCase());
164
+ };
165
+ var capitalize = (str) => {
166
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
167
+ };
168
+ var truncate = (str, length = 100, suffix = "...") => {
169
+ if (str.length <= length) return str;
170
+ return `${str.slice(0, length)}${suffix}`;
171
+ };
172
+ var formatFileSize = (bytes) => {
173
+ if (bytes === 0) return "0 B";
174
+ const k = 1024;
175
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
176
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
177
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
178
+ };
179
+ var formatNumber = (num) => {
180
+ return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
181
+ };
182
+ var isValidUrl = (str) => {
183
+ try {
184
+ new URL(str);
185
+ return true;
186
+ } catch {
187
+ return false;
188
+ }
189
+ };
190
+ var isValidEmail = (email) => {
191
+ const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
192
+ return regex.test(email);
193
+ };
194
+ var isValidPhone = (phone) => {
195
+ const regex = /^1[3-9]\d{9}$/;
196
+ return regex.test(phone);
197
+ };
198
+ var randomInt = (min2, max2) => {
199
+ return Math.floor(Math.random() * (max2 - min2 + 1)) + min2;
200
+ };
201
+ var uniqueId = (prefix = "") => {
202
+ return `${prefix}${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
203
+ };
204
+ var delay = (ms) => {
205
+ return new Promise((resolve) => setTimeout(resolve, ms));
206
+ };
207
+ var retry = async (fn, retries = 3, delayMs = 1e3) => {
208
+ try {
209
+ return await fn();
210
+ } catch (error) {
211
+ if (retries <= 0) {
212
+ throw error;
213
+ }
214
+ await delay(delayMs);
215
+ return retry(fn, retries - 1, delayMs);
216
+ }
217
+ };
218
+ var hexToRgb = (str) => {
219
+ const hexRegex = /^#?([0-9A-Fa-f]{6})$/;
220
+ if (!hexRegex.test(str)) {
221
+ return null;
222
+ }
223
+ const hex = str.replace("#", "");
224
+ const r = parseInt(hex.substring(0, 2), 16);
225
+ const g = parseInt(hex.substring(2, 4), 16);
226
+ const b = parseInt(hex.substring(4, 6), 16);
227
+ return [r, g, b];
228
+ };
229
+ var hexToRgbString = (str) => {
230
+ const rgb = hexToRgb(str);
231
+ if (!rgb) {
232
+ return null;
233
+ }
234
+ return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
235
+ };
236
+ var rgbToHex = (r, g, b) => {
237
+ const numRegex = /^\d{1,3}$/;
238
+ if (!numRegex.test(r.toString()) || !numRegex.test(g.toString()) || !numRegex.test(b.toString())) {
239
+ return null;
240
+ }
241
+ if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
242
+ return null;
243
+ }
244
+ const toHex = (num) => {
245
+ const hex = num.toString(16);
246
+ return hex.length === 1 ? `0${hex}` : hex;
247
+ };
248
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
249
+ };
250
+ var rgbArrayToHex = (rgb) => {
251
+ if (rgb.length !== 3) {
252
+ return null;
253
+ }
254
+ return rgbToHex(rgb[0], rgb[1], rgb[2]);
255
+ };
256
+ var getLightColor = (color, alpha) => {
257
+ const rgb = hexToRgb(color);
258
+ if (!rgb) {
259
+ return null;
260
+ }
261
+ const [r, g, b] = rgb;
262
+ const newR = Math.floor((255 - r) * alpha + r);
263
+ const newG = Math.floor((255 - g) * alpha + g);
264
+ const newB = Math.floor((255 - b) * alpha + b);
265
+ return rgbToHex(newR, newG, newB);
266
+ };
267
+ var getDarkColor = (color, alpha) => {
268
+ const rgb = hexToRgb(color);
269
+ if (!rgb) {
270
+ return null;
271
+ }
272
+ const [r, g, b] = rgb;
273
+ const newR = Math.floor(r * (1 - alpha));
274
+ const newG = Math.floor(g * (1 - alpha));
275
+ const newB = Math.floor(b * (1 - alpha));
276
+ return rgbToHex(newR, newG, newB);
277
+ };
278
+ var imgToBase64 = (url, type = "image/png") => {
279
+ return new Promise((resolve, reject) => {
280
+ const image = new Image();
281
+ image.crossOrigin = "anonymous";
282
+ image.onload = () => {
283
+ const canvas = document.createElement("canvas");
284
+ canvas.width = image.naturalWidth;
285
+ canvas.height = image.naturalHeight;
286
+ const ctx = canvas.getContext("2d");
287
+ if (!ctx) {
288
+ reject(new Error("Failed to get canvas context"));
289
+ return;
290
+ }
291
+ ctx.drawImage(image, 0, 0);
292
+ const base64 = canvas.toDataURL(type);
293
+ resolve(base64);
294
+ };
295
+ image.onerror = (err) => {
296
+ reject(new Error(`Failed to load image: ${String(err)}`));
297
+ };
298
+ image.src = url;
299
+ });
300
+ };
301
+ var base64toFile = (base64, fileName, mimeType = "image/jpeg") => {
302
+ const dataArr = base64.split(",");
303
+ const byteString = atob(dataArr[1]);
304
+ const u8Arr = new Uint8Array(byteString.length);
305
+ for (let i = 0; i < byteString.length; i++) {
306
+ u8Arr[i] = byteString.charCodeAt(i);
307
+ }
308
+ return new File([u8Arr], fileName, { type: mimeType });
309
+ };
310
+ var base64toBlob = (base64, mimeType = "image/jpeg") => {
311
+ const dataArr = base64.split(",");
312
+ const byteString = atob(dataArr[1]);
313
+ const u8Arr = new Uint8Array(byteString.length);
314
+ for (let i = 0; i < byteString.length; i++) {
315
+ u8Arr[i] = byteString.charCodeAt(i);
316
+ }
317
+ return new Blob([u8Arr], { type: mimeType });
318
+ };
319
+ var downloadFile = (url, fileName = "\u6587\u4EF6", target = false) => {
320
+ const link = document.createElement("a");
321
+ link.style.display = "none";
322
+ link.href = url;
323
+ if (target) {
324
+ link.target = "_blank";
325
+ } else {
326
+ link.setAttribute("download", fileName);
327
+ }
328
+ document.body.appendChild(link);
329
+ link.click();
330
+ document.body.removeChild(link);
331
+ };
332
+ var downloadBlob = (blob, fileName) => {
333
+ const url = URL.createObjectURL(blob);
334
+ downloadFile(url, fileName);
335
+ URL.revokeObjectURL(url);
336
+ };
337
+ var downloadBase64 = (base64, fileName, mimeType = "image/jpeg") => {
338
+ const blob = base64toBlob(base64, mimeType);
339
+ downloadBlob(blob, fileName);
340
+ };
341
+ var copyToClipboard = async (text) => {
342
+ try {
343
+ if (navigator.clipboard && navigator.clipboard.writeText) {
344
+ await navigator.clipboard.writeText(text);
345
+ return true;
346
+ }
347
+ const textarea = document.createElement("textarea");
348
+ textarea.value = text;
349
+ textarea.style.position = "fixed";
350
+ textarea.style.opacity = "0";
351
+ document.body.appendChild(textarea);
352
+ textarea.select();
353
+ const success = document.execCommand("copy");
354
+ document.body.removeChild(textarea);
355
+ return success;
356
+ } catch {
357
+ return false;
358
+ }
359
+ };
360
+ var readFromClipboard = async () => {
361
+ try {
362
+ if (navigator.clipboard && navigator.clipboard.readText) {
363
+ return await navigator.clipboard.readText();
364
+ }
365
+ return "";
366
+ } catch {
367
+ return "";
368
+ }
369
+ };
370
+
371
+ Object.defineProperty(exports, "debounce", {
372
+ enumerable: true,
373
+ get: function () { return esToolkit.debounce; }
374
+ });
375
+ Object.defineProperty(exports, "throttle", {
376
+ enumerable: true,
377
+ get: function () { return esToolkit.throttle; }
378
+ });
379
+ exports.avg = avg;
380
+ exports.base64toBlob = base64toBlob;
381
+ exports.base64toFile = base64toFile;
382
+ exports.camelToSnake = camelToSnake;
383
+ exports.capitalize = capitalize;
384
+ exports.chunk = chunk;
385
+ exports.clone = clone;
386
+ exports.copyToClipboard = copyToClipboard;
387
+ exports.deepMerge = deepMerge;
388
+ exports.delay = delay;
389
+ exports.downloadBase64 = downloadBase64;
390
+ exports.downloadBlob = downloadBlob;
391
+ exports.downloadFile = downloadFile;
392
+ exports.formatFileSize = formatFileSize;
393
+ exports.formatNumber = formatNumber;
394
+ exports.get = get;
395
+ exports.getDarkColor = getDarkColor;
396
+ exports.getLightColor = getLightColor;
397
+ exports.groupBy = groupBy;
398
+ exports.hexToRgb = hexToRgb;
399
+ exports.hexToRgbString = hexToRgbString;
400
+ exports.imgToBase64 = imgToBase64;
401
+ exports.isArray = isArray;
402
+ exports.isBoolean = isBoolean;
403
+ exports.isEmpty = isEmpty;
404
+ exports.isEqual = isEqual;
405
+ exports.isFunction = isFunction;
406
+ exports.isNumber = isNumber;
407
+ exports.isObject = isObject;
408
+ exports.isString = isString;
409
+ exports.isValidEmail = isValidEmail;
410
+ exports.isValidPhone = isValidPhone;
411
+ exports.isValidUrl = isValidUrl;
412
+ exports.max = max;
413
+ exports.min = min;
414
+ exports.omit = omit;
415
+ exports.pick = pick;
416
+ exports.randomInt = randomInt;
417
+ exports.readFromClipboard = readFromClipboard;
418
+ exports.retry = retry;
419
+ exports.rgbArrayToHex = rgbArrayToHex;
420
+ exports.rgbToHex = rgbToHex;
421
+ exports.set = set;
422
+ exports.snakeToCamel = snakeToCamel;
423
+ exports.sortBy = sortBy;
424
+ exports.sum = sum;
425
+ exports.truncate = truncate;
426
+ exports.uniq = uniq;
427
+ exports.uniqueId = uniqueId;
428
+ //# sourceMappingURL=utils.cjs.map
429
+ //# sourceMappingURL=utils.cjs.map