ly-utils-lib 1.0.12 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1002 -685
- package/dist/array.cjs +237 -0
- package/dist/array.cjs.map +1 -0
- package/dist/array.d.cts +2 -0
- package/dist/array.d.ts +2 -0
- package/dist/array.js +150 -0
- package/dist/array.js.map +1 -0
- package/dist/crypto.cjs +193 -0
- package/dist/crypto.cjs.map +1 -0
- package/dist/crypto.d.cts +3 -0
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.js +144 -0
- package/dist/crypto.js.map +1 -0
- package/dist/date.cjs +563 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.d.cts +2 -0
- package/dist/date.d.ts +2 -0
- package/dist/date.js +451 -0
- package/dist/date.js.map +1 -0
- package/dist/excel.cjs +227 -0
- package/dist/excel.cjs.map +1 -0
- package/dist/excel.d.cts +2 -0
- package/dist/excel.d.ts +2 -0
- package/dist/excel.js +196 -0
- package/dist/excel.js.map +1 -0
- package/dist/index-B80SEVzM.d.cts +382 -0
- package/dist/index-B80SEVzM.d.ts +382 -0
- package/dist/index-Ba1rjTzj.d.cts +299 -0
- package/dist/index-Ba1rjTzj.d.ts +299 -0
- package/dist/index-Bg1ise7y.d.cts +253 -0
- package/dist/index-Bg1ise7y.d.ts +253 -0
- package/dist/index-BoqNpwNa.d.cts +203 -0
- package/dist/index-BoqNpwNa.d.ts +203 -0
- package/dist/index-C0qUnb9Y.d.cts +533 -0
- package/dist/index-C0qUnb9Y.d.ts +533 -0
- package/dist/index-Cq1GhjpY.d.cts +229 -0
- package/dist/index-Cq1GhjpY.d.ts +229 -0
- package/dist/index-Cy-mb5v_.d.cts +262 -0
- package/dist/index-Cy-mb5v_.d.ts +262 -0
- package/dist/index-D1f9Sym2.d.cts +148 -0
- package/dist/index-D1f9Sym2.d.ts +148 -0
- package/dist/index-Dan5oF-5.d.cts +213 -0
- package/dist/index-Dan5oF-5.d.ts +213 -0
- package/dist/index-XABfrs7z.d.cts +596 -0
- package/dist/index-XABfrs7z.d.ts +596 -0
- package/dist/index-YXWfKCK7.d.cts +109 -0
- package/dist/index-YXWfKCK7.d.ts +109 -0
- package/dist/index.cjs +3691 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +3629 -0
- package/dist/index.js.map +1 -0
- package/dist/map.cjs +839 -0
- package/dist/map.cjs.map +1 -0
- package/dist/map.d.cts +6 -0
- package/dist/map.d.ts +6 -0
- package/dist/map.js +811 -0
- package/dist/map.js.map +1 -0
- package/dist/object.cjs +316 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.d.cts +2 -0
- package/dist/object.d.ts +2 -0
- package/dist/object.js +247 -0
- package/dist/object.js.map +1 -0
- package/dist/pdf.cjs +197 -0
- package/dist/pdf.cjs.map +1 -0
- package/dist/pdf.d.cts +3 -0
- package/dist/pdf.d.ts +3 -0
- package/dist/pdf.js +173 -0
- package/dist/pdf.js.map +1 -0
- package/dist/storage.cjs +255 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.cts +1 -0
- package/dist/storage.d.ts +1 -0
- package/dist/storage.js +226 -0
- package/dist/storage.js.map +1 -0
- package/dist/string.cjs +232 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.cts +2 -0
- package/dist/string.d.ts +2 -0
- package/dist/string.js +170 -0
- package/dist/string.js.map +1 -0
- package/dist/utils.cjs +429 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +2 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +371 -0
- package/dist/utils.js.map +1 -0
- package/dist/websocket.cjs +338 -0
- package/dist/websocket.cjs.map +1 -0
- package/dist/websocket.d.cts +1 -0
- package/dist/websocket.d.ts +1 -0
- package/dist/websocket.js +330 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +159 -33
- package/dist/ly-utils-lib.cjs.js +0 -115
- package/dist/ly-utils-lib.cjs.js.map +0 -1
- package/dist/ly-utils-lib.es.js +0 -58589
- package/dist/ly-utils-lib.es.js.map +0 -1
- package/dist/ly-utils-lib.umd.js +0 -115
- package/dist/ly-utils-lib.umd.js.map +0 -1
- package/dist/types/index.d.ts +0 -15
- package/dist/types/utils/esToolkit.d.ts +0 -2
- package/dist/types/utils/ol.d.ts +0 -175
- package/dist/types/utils/router.d.ts +0 -10
- package/dist/types/utils/storage.d.ts +0 -42
- package/dist/types/utils/time.d.ts +0 -66
- package/dist/types/utils/tool.d.ts +0 -80
- package/dist/vite.svg +0 -1
package/dist/storage.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import Cookies from 'js-cookie';
|
|
2
|
+
|
|
3
|
+
// src/modules/storage/index.ts
|
|
4
|
+
function safeParse(json) {
|
|
5
|
+
if (!json || json === "undefined" || json === "null") {
|
|
6
|
+
return void 0;
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(json);
|
|
10
|
+
} catch {
|
|
11
|
+
return json;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function isStorageAvailable(storage) {
|
|
15
|
+
try {
|
|
16
|
+
const testKey = "__storage_test__";
|
|
17
|
+
storage.setItem(testKey, testKey);
|
|
18
|
+
storage.removeItem(testKey);
|
|
19
|
+
return true;
|
|
20
|
+
} catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function setLocal(key, value, options) {
|
|
25
|
+
if (!isStorageAvailable(window.localStorage)) {
|
|
26
|
+
console.warn("LocalStorage is not available");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const data = options?.ttl ? {
|
|
30
|
+
value,
|
|
31
|
+
expires: Date.now() + options.ttl
|
|
32
|
+
} : value;
|
|
33
|
+
window.localStorage.setItem(key, JSON.stringify(data));
|
|
34
|
+
}
|
|
35
|
+
function getLocal(key) {
|
|
36
|
+
if (!isStorageAvailable(window.localStorage)) {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
const json = window.localStorage.getItem(key);
|
|
40
|
+
if (!json) {
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
const data = safeParse(json);
|
|
44
|
+
if (data && typeof data === "object" && "expires" in data && "value" in data) {
|
|
45
|
+
if (data.expires && Date.now() > data.expires) {
|
|
46
|
+
removeLocal(key);
|
|
47
|
+
return void 0;
|
|
48
|
+
}
|
|
49
|
+
return data.value;
|
|
50
|
+
}
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
function removeLocal(key) {
|
|
54
|
+
if (isStorageAvailable(window.localStorage)) {
|
|
55
|
+
window.localStorage.removeItem(key);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function clearLocal() {
|
|
59
|
+
if (isStorageAvailable(window.localStorage)) {
|
|
60
|
+
window.localStorage.clear();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function getLocalKeys() {
|
|
64
|
+
if (!isStorageAvailable(window.localStorage)) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
return Object.keys(window.localStorage);
|
|
68
|
+
}
|
|
69
|
+
function getLocalSize() {
|
|
70
|
+
return getLocalKeys().length;
|
|
71
|
+
}
|
|
72
|
+
function setSession(key, value, options) {
|
|
73
|
+
if (!isStorageAvailable(window.sessionStorage)) {
|
|
74
|
+
console.warn("SessionStorage is not available");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const data = options?.ttl ? {
|
|
78
|
+
value,
|
|
79
|
+
expires: Date.now() + options.ttl
|
|
80
|
+
} : value;
|
|
81
|
+
window.sessionStorage.setItem(key, JSON.stringify(data));
|
|
82
|
+
}
|
|
83
|
+
function getSession(key) {
|
|
84
|
+
if (!isStorageAvailable(window.sessionStorage)) {
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
const json = window.sessionStorage.getItem(key);
|
|
88
|
+
if (!json) {
|
|
89
|
+
return void 0;
|
|
90
|
+
}
|
|
91
|
+
const data = safeParse(json);
|
|
92
|
+
if (data && typeof data === "object" && "expires" in data && "value" in data) {
|
|
93
|
+
if (data.expires && Date.now() > data.expires) {
|
|
94
|
+
removeSession(key);
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
return data.value;
|
|
98
|
+
}
|
|
99
|
+
return data;
|
|
100
|
+
}
|
|
101
|
+
function removeSession(key) {
|
|
102
|
+
if (isStorageAvailable(window.sessionStorage)) {
|
|
103
|
+
window.sessionStorage.removeItem(key);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function clearSession() {
|
|
107
|
+
if (isStorageAvailable(window.sessionStorage)) {
|
|
108
|
+
window.sessionStorage.clear();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function getSessionKeys() {
|
|
112
|
+
if (!isStorageAvailable(window.sessionStorage)) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
return Object.keys(window.sessionStorage);
|
|
116
|
+
}
|
|
117
|
+
function getSessionSize() {
|
|
118
|
+
return getSessionKeys().length;
|
|
119
|
+
}
|
|
120
|
+
function setCookie(key, value, options) {
|
|
121
|
+
const cookieOptions = {};
|
|
122
|
+
if (options?.days) {
|
|
123
|
+
cookieOptions.expires = options.days;
|
|
124
|
+
} else if (options?.expires !== void 0) {
|
|
125
|
+
cookieOptions.expires = options.expires;
|
|
126
|
+
}
|
|
127
|
+
if (options?.path !== void 0) {
|
|
128
|
+
cookieOptions.path = options.path;
|
|
129
|
+
}
|
|
130
|
+
if (options?.domain !== void 0) {
|
|
131
|
+
cookieOptions.domain = options.domain;
|
|
132
|
+
}
|
|
133
|
+
if (options?.secure !== void 0) {
|
|
134
|
+
cookieOptions.secure = options.secure;
|
|
135
|
+
}
|
|
136
|
+
if (options?.sameSite !== void 0) {
|
|
137
|
+
cookieOptions.sameSite = options.sameSite;
|
|
138
|
+
}
|
|
139
|
+
Cookies.set(key, value, cookieOptions);
|
|
140
|
+
}
|
|
141
|
+
function getCookie(key) {
|
|
142
|
+
return Cookies.get(key);
|
|
143
|
+
}
|
|
144
|
+
function removeCookie(key, options) {
|
|
145
|
+
Cookies.remove(key, options);
|
|
146
|
+
}
|
|
147
|
+
function getAllCookies() {
|
|
148
|
+
return Cookies.get() || {};
|
|
149
|
+
}
|
|
150
|
+
function hasCookie(key) {
|
|
151
|
+
return Cookies.get(key) !== void 0;
|
|
152
|
+
}
|
|
153
|
+
function getCookieJSON(key) {
|
|
154
|
+
const value = Cookies.get(key);
|
|
155
|
+
if (!value) {
|
|
156
|
+
return void 0;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return JSON.parse(value);
|
|
160
|
+
} catch {
|
|
161
|
+
return void 0;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function setCookieJSON(key, value, options) {
|
|
165
|
+
setCookie(key, JSON.stringify(value), options);
|
|
166
|
+
}
|
|
167
|
+
function getCookieSize() {
|
|
168
|
+
return Object.keys(getAllCookies()).length;
|
|
169
|
+
}
|
|
170
|
+
function setStorage(type, key, value, options) {
|
|
171
|
+
switch (type) {
|
|
172
|
+
case "local":
|
|
173
|
+
setLocal(key, value, options);
|
|
174
|
+
break;
|
|
175
|
+
case "session":
|
|
176
|
+
setSession(key, value, options);
|
|
177
|
+
break;
|
|
178
|
+
case "cookie":
|
|
179
|
+
setCookie(key, value, options);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function getStorage(type, key) {
|
|
184
|
+
switch (type) {
|
|
185
|
+
case "local":
|
|
186
|
+
return getLocal(key);
|
|
187
|
+
case "session":
|
|
188
|
+
return getSession(key);
|
|
189
|
+
case "cookie":
|
|
190
|
+
return getCookie(key);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function removeStorage(type, key) {
|
|
194
|
+
switch (type) {
|
|
195
|
+
case "local":
|
|
196
|
+
removeLocal(key);
|
|
197
|
+
break;
|
|
198
|
+
case "session":
|
|
199
|
+
removeSession(key);
|
|
200
|
+
break;
|
|
201
|
+
case "cookie":
|
|
202
|
+
removeCookie(key);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function clearStorage(type) {
|
|
207
|
+
switch (type) {
|
|
208
|
+
case "local":
|
|
209
|
+
clearLocal();
|
|
210
|
+
break;
|
|
211
|
+
case "session":
|
|
212
|
+
clearSession();
|
|
213
|
+
break;
|
|
214
|
+
case "cookie": {
|
|
215
|
+
const cookies = getAllCookies();
|
|
216
|
+
for (const key of Object.keys(cookies)) {
|
|
217
|
+
removeCookie(key);
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export { clearLocal, clearSession, clearStorage, getAllCookies, getCookie, getCookieJSON, getCookieSize, getLocal, getLocalKeys, getLocalSize, getSession, getSessionKeys, getSessionSize, getStorage, hasCookie, removeCookie, removeLocal, removeSession, removeStorage, setCookie, setCookieJSON, setLocal, setSession, setStorage };
|
|
225
|
+
//# sourceMappingURL=storage.js.map
|
|
226
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/storage/index.ts"],"names":[],"mappings":"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","file":"storage.js","sourcesContent":["/**\n * Storage Module - 浏览器存储工具\n *\n * 提供统一的浏览器存储操作 API\n */\n\nimport Cookies from 'js-cookie'\n\n// ==================== 类型定义 ====================\n\n/**\n * 存储数据类型\n */\nexport type StorageValue = string | number | boolean | null | undefined | object | unknown[]\n\n/**\n * 存储选项\n */\nexport interface StorageOptions {\n /** 过期时间(毫秒),0 表示永不过期 */\n ttl?: number\n}\n\n/**\n * Cookie 选项\n */\nexport interface CookieOptions extends Cookies.CookieAttributes {\n /** 过期天数 */\n days?: number\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 安全解析 JSON\n */\nfunction safeParse<T = StorageValue>(json: string | null): T | undefined {\n if (!json || json === 'undefined' || json === 'null') {\n return undefined\n }\n try {\n return JSON.parse(json) as T\n } catch {\n return json as T\n }\n}\n\n/**\n * 检查存储是否可用\n */\nfunction isStorageAvailable(storage: Storage): boolean {\n try {\n const testKey = '__storage_test__'\n storage.setItem(testKey, testKey)\n storage.removeItem(testKey)\n return true\n } catch {\n return false\n }\n}\n\n// ==================== LocalStorage ====================\n\n/**\n * 设置永久缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setLocal('user', { name: 'Alice', age: 25 })\n * setLocal('token', 'abc123', { ttl: 3600000 }) // 1小时后过期\n * ```\n */\nexport function setLocal<T = StorageValue>(key: string, value: T, options?: StorageOptions): void {\n if (!isStorageAvailable(window.localStorage)) {\n console.warn('LocalStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.localStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取永久缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const user = getLocal<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getLocal<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.localStorage)) {\n return undefined\n }\n\n const json = window.localStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeLocal(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除永久缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeLocal('user')\n * ```\n */\nexport function removeLocal(key: string): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部永久缓存\n * @example\n * ```ts\n * clearLocal()\n * ```\n */\nexport function clearLocal(): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.clear()\n }\n}\n\n/**\n * 获取所有 localStorage 的键\n * @returns 键数组\n */\nexport function getLocalKeys(): string[] {\n if (!isStorageAvailable(window.localStorage)) {\n return []\n }\n return Object.keys(window.localStorage)\n}\n\n/**\n * 获取 localStorage 中键的数量\n * @returns 键的数量\n */\nexport function getLocalSize(): number {\n return getLocalKeys().length\n}\n\n// ==================== SessionStorage ====================\n\n/**\n * 设置临时缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setSession('temp', { data: [1, 2, 3] })\n * setSession('session', 'abc123', { ttl: 60000 }) // 1分钟后过期\n * ```\n */\nexport function setSession<T = StorageValue>(\n key: string,\n value: T,\n options?: StorageOptions\n): void {\n if (!isStorageAvailable(window.sessionStorage)) {\n console.warn('SessionStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.sessionStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取临时缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const temp = getSession<{ data: number[] }>('temp')\n * console.log(temp?.data) // [1, 2, 3]\n * ```\n */\nexport function getSession<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.sessionStorage)) {\n return undefined\n }\n\n const json = window.sessionStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeSession(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除临时缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeSession('temp')\n * ```\n */\nexport function removeSession(key: string): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部临时缓存\n * @example\n * ```ts\n * clearSession()\n * ```\n */\nexport function clearSession(): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.clear()\n }\n}\n\n/**\n * 获取所有 sessionStorage 的键\n * @returns 键数组\n */\nexport function getSessionKeys(): string[] {\n if (!isStorageAvailable(window.sessionStorage)) {\n return []\n }\n return Object.keys(window.sessionStorage)\n}\n\n/**\n * 获取 sessionStorage 中键的数量\n * @returns 键的数量\n */\nexport function getSessionSize(): number {\n return getSessionKeys().length\n}\n\n// ==================== Cookie ====================\n\n/**\n * 设置 Cookie\n * @param key - Cookie 名称\n * @param value - Cookie 值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookie('token', 'abc123', { days: 7 })\n * setCookie('user', { name: 'Alice' }, { secure: true }) // 自动序列化对象\n * ```\n */\nexport function setCookie(key: string, value: string | object, options?: CookieOptions): void {\n const cookieOptions: Cookies.CookieAttributes = {}\n\n // 处理过期时间\n if (options?.days) {\n cookieOptions.expires = options.days\n } else if (options?.expires !== undefined) {\n cookieOptions.expires = options.expires\n }\n\n // 复制其他选项\n if (options?.path !== undefined) {\n cookieOptions.path = options.path\n }\n if (options?.domain !== undefined) {\n cookieOptions.domain = options.domain\n }\n if (options?.secure !== undefined) {\n cookieOptions.secure = options.secure\n }\n if (options?.sameSite !== undefined) {\n cookieOptions.sameSite = options.sameSite\n }\n\n // 设置 cookie\n Cookies.set(key, value as any, cookieOptions)\n}\n\n/**\n * 获取 Cookie\n * @param key - Cookie 名称\n * @returns Cookie 值,不存在返回 undefined\n * @example\n * ```ts\n * const token = getCookie('token')\n * console.log(token) // 'abc123'\n * ```\n */\nexport function getCookie(key: string): string | undefined {\n return Cookies.get(key)\n}\n\n/**\n * 移除 Cookie\n * @param key - Cookie 名称\n * @param options - Cookie 选项(需要匹配设置时的 path 和 domain)\n * @example\n * ```ts\n * removeCookie('token')\n * removeCookie('user', { path: '/', domain: '.example.com' })\n * ```\n */\nexport function removeCookie(key: string, options?: CookieOptions): void {\n Cookies.remove(key, options)\n}\n\n/**\n * 获取所有 Cookie\n * @returns Cookie 对象\n * @example\n * ```ts\n * const cookies = getAllCookies()\n * console.log(cookies) // { token: 'abc123', user: '{\"name\":\"Alice\"}' }\n * ```\n */\nexport function getAllCookies(): Record<string, string> {\n return Cookies.get() || {}\n}\n\n/**\n * 检查 Cookie 是否存在\n * @param key - Cookie 名称\n * @returns 是否存在\n * @example\n * ```ts\n * if (hasCookie('token')) {\n * console.log('Token exists')\n * }\n * ```\n */\nexport function hasCookie(key: string): boolean {\n return Cookies.get(key) !== undefined\n}\n\n/**\n * 获取 JSON 格式的 Cookie\n * @param key - Cookie 名称\n * @returns 解析后的对象,不存在或解析失败返回 undefined\n * @example\n * ```ts\n * const user = getCookieJSON<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getCookieJSON<T = object>(key: string): T | undefined {\n const value = Cookies.get(key)\n if (!value) {\n return undefined\n }\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/**\n * 设置 JSON 格式的 Cookie(自动序列化)\n * @param key - Cookie 名称\n * @param value - 对象值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookieJSON('user', { name: 'Alice', age: 25 }, { days: 7 })\n * ```\n */\nexport function setCookieJSON<T = object>(key: string, value: T, options?: CookieOptions): void {\n setCookie(key, JSON.stringify(value), options)\n}\n\n/**\n * 获取所有 Cookie 的数量\n * @returns Cookie 数量\n * @example\n * ```ts\n * console.log(getCookieSize()) // 3\n * ```\n */\nexport function getCookieSize(): number {\n return Object.keys(getAllCookies()).length\n}\n\n// ==================== 统一接口 ====================\n\n/**\n * 存储类型\n */\nexport type StorageType = 'local' | 'session' | 'cookie'\n\n/**\n * 统一设置存储\n * @param type - 存储类型\n * @param key - 键\n * @param value - 值\n * @param options - 选项\n * @example\n * ```ts\n * setStorage('local', 'user', { name: 'Alice' })\n * setStorage('cookie', 'token', 'abc123', { days: 7 })\n * ```\n */\nexport function setStorage<T extends string | object>(\n type: 'local',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'session',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'cookie',\n key: string,\n value: T,\n options?: CookieOptions\n): void\nexport function setStorage<T extends string | object>(\n type: StorageType,\n key: string,\n value: T,\n options?: StorageOptions | CookieOptions\n): void {\n switch (type) {\n case 'local':\n setLocal(key, value, options as StorageOptions)\n break\n case 'session':\n setSession(key, value, options as StorageOptions)\n break\n case 'cookie':\n setCookie(key, value, options as CookieOptions)\n break\n }\n}\n\n/**\n * 统一获取存储\n * @param type - 存储类型\n * @param key - 键\n * @returns 值\n * @example\n * ```ts\n * const user = getStorage<{ name: string }>('local', 'user')\n * const token = getStorage('cookie', 'token')\n * ```\n */\nexport function getStorage<T = StorageValue>(type: 'local', key: string): T | undefined\nexport function getStorage<T = StorageValue>(type: 'session', key: string): T | undefined\nexport function getStorage(type: 'cookie', key: string): string | undefined\nexport function getStorage<T = StorageValue>(\n type: StorageType,\n key: string\n): T | string | undefined {\n switch (type) {\n case 'local':\n return getLocal<T>(key)\n case 'session':\n return getSession<T>(key)\n case 'cookie':\n return getCookie(key)\n }\n}\n\n/**\n * 统一移除存储\n * @param type - 存储类型\n * @param key - 键\n * @example\n * ```ts\n * removeStorage('local', 'user')\n * removeStorage('cookie', 'token')\n * ```\n */\nexport function removeStorage(type: StorageType, key: string): void {\n switch (type) {\n case 'local':\n removeLocal(key)\n break\n case 'session':\n removeSession(key)\n break\n case 'cookie':\n removeCookie(key)\n break\n }\n}\n\n/**\n * 统一清除存储\n * @param type - 存储类型\n * @example\n * ```ts\n * clearStorage('local')\n * clearStorage('session')\n * clearStorage('cookie') // 注意:cookie 只能逐个删除\n * ```\n */\nexport function clearStorage(type: StorageType): void {\n switch (type) {\n case 'local':\n clearLocal()\n break\n case 'session':\n clearSession()\n break\n case 'cookie': {\n const cookies = getAllCookies()\n for (const key of Object.keys(cookies)) {\n removeCookie(key)\n }\n break\n }\n }\n}\n"]}
|
package/dist/string.cjs
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var esToolkit = require('es-toolkit');
|
|
4
|
+
|
|
5
|
+
// src/modules/string/index.ts
|
|
6
|
+
var isEmpty = (str) => {
|
|
7
|
+
if (!str) return true;
|
|
8
|
+
return esToolkit.trim(str).length === 0;
|
|
9
|
+
};
|
|
10
|
+
var random = (length = 8, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") => {
|
|
11
|
+
let result = "";
|
|
12
|
+
for (let i = 0; i < length; i++) {
|
|
13
|
+
result += charset.charAt(Math.floor(Math.random() * charset.length));
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
var uuid = () => {
|
|
18
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
19
|
+
const r = Math.random() * 16 | 0;
|
|
20
|
+
const v = c === "x" ? r : r & 3 | 8;
|
|
21
|
+
return v.toString(16);
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
var shortId = (length = 6) => {
|
|
25
|
+
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
26
|
+
let result = "";
|
|
27
|
+
for (let i = 0; i < length; i++) {
|
|
28
|
+
result += charset.charAt(Math.floor(Math.random() * charset.length));
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
var firstUpperCase = (str) => {
|
|
33
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
34
|
+
};
|
|
35
|
+
var firstLowerCase = (str) => {
|
|
36
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
37
|
+
};
|
|
38
|
+
var reverse = (str) => {
|
|
39
|
+
return str.split("").reverse().join("");
|
|
40
|
+
};
|
|
41
|
+
var repeat = (str, count) => {
|
|
42
|
+
return str.repeat(count);
|
|
43
|
+
};
|
|
44
|
+
var pad = (str, length, char = "0", isEnd = false) => {
|
|
45
|
+
const s = String(str);
|
|
46
|
+
if (isEnd) {
|
|
47
|
+
return s.padEnd(length, char);
|
|
48
|
+
}
|
|
49
|
+
return s.padStart(length, char);
|
|
50
|
+
};
|
|
51
|
+
var getExtension = (filename) => {
|
|
52
|
+
const idx = filename.lastIndexOf(".");
|
|
53
|
+
if (idx === -1) return "";
|
|
54
|
+
return filename.slice(idx + 1);
|
|
55
|
+
};
|
|
56
|
+
var getFileName = (filename) => {
|
|
57
|
+
const lastSlash = Math.max(filename.lastIndexOf("/"), filename.lastIndexOf("\\"));
|
|
58
|
+
const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1);
|
|
59
|
+
const lastDot = nameWithExt.lastIndexOf(".");
|
|
60
|
+
return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot);
|
|
61
|
+
};
|
|
62
|
+
var hidePhone = (phone) => {
|
|
63
|
+
return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
|
|
64
|
+
};
|
|
65
|
+
var hideEmail = (email) => {
|
|
66
|
+
const [username, domain] = email.split("@");
|
|
67
|
+
if (username.length <= 2) return email;
|
|
68
|
+
return `${username[0]}${"*".repeat(username.length - 2)}${username[username.length - 1]}@${domain}`;
|
|
69
|
+
};
|
|
70
|
+
var hideIdCard = (idCard) => {
|
|
71
|
+
if (idCard.length < 8) return idCard;
|
|
72
|
+
return `${idCard.slice(0, 4)}${"*".repeat(idCard.length - 8)}${idCard.slice(-4)}`;
|
|
73
|
+
};
|
|
74
|
+
var formatMoney = (amount, decimals = 2, separator = ",") => {
|
|
75
|
+
const str = amount.toFixed(decimals);
|
|
76
|
+
const parts = str.split(".");
|
|
77
|
+
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator);
|
|
78
|
+
return parts.join(".");
|
|
79
|
+
};
|
|
80
|
+
var toNumber = (str, defaultValue = 0) => {
|
|
81
|
+
if (typeof str === "number") return str;
|
|
82
|
+
if (!str) return defaultValue;
|
|
83
|
+
const num = Number(str);
|
|
84
|
+
return isNaN(num) ? defaultValue : num;
|
|
85
|
+
};
|
|
86
|
+
var toBoolean = (str, defaultValue = false) => {
|
|
87
|
+
if (typeof str === "boolean") return str;
|
|
88
|
+
if (!str) return defaultValue;
|
|
89
|
+
return ["true", "1", "yes", "on"].includes(str.toLowerCase());
|
|
90
|
+
};
|
|
91
|
+
var extractNumbers = (str) => {
|
|
92
|
+
const matches = str.match(/-?\d+(\.\d+)?/g);
|
|
93
|
+
return matches ? matches.map(Number) : [];
|
|
94
|
+
};
|
|
95
|
+
var extractPhones = (str) => {
|
|
96
|
+
const matches = str.match(/1[3-9]\d{9}/g);
|
|
97
|
+
return matches || [];
|
|
98
|
+
};
|
|
99
|
+
var extractEmails = (str) => {
|
|
100
|
+
const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g);
|
|
101
|
+
return matches || [];
|
|
102
|
+
};
|
|
103
|
+
var isPhone = (phone) => {
|
|
104
|
+
return /^1[3-9]\d{9}$/.test(phone);
|
|
105
|
+
};
|
|
106
|
+
var isEmail = (email) => {
|
|
107
|
+
return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email);
|
|
108
|
+
};
|
|
109
|
+
var isIdCard = (idCard) => {
|
|
110
|
+
return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idCard);
|
|
111
|
+
};
|
|
112
|
+
var isUrl = (url) => {
|
|
113
|
+
try {
|
|
114
|
+
new URL(url);
|
|
115
|
+
return true;
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
var highlight = (text, keyword, highlightClass = "highlight") => {
|
|
121
|
+
if (!keyword) return text;
|
|
122
|
+
const regex = new RegExp(`(${keyword})`, "gi");
|
|
123
|
+
return text.replace(regex, `<span class="${highlightClass}">$1</span>`);
|
|
124
|
+
};
|
|
125
|
+
var truncateText = (text, length = 100, suffix = "...") => {
|
|
126
|
+
if (text.length <= length) return text;
|
|
127
|
+
return text.slice(0, length) + suffix;
|
|
128
|
+
};
|
|
129
|
+
var escapeHtml = (str) => {
|
|
130
|
+
const htmlEscapes = {
|
|
131
|
+
"&": "&",
|
|
132
|
+
"<": "<",
|
|
133
|
+
">": ">",
|
|
134
|
+
'"': """,
|
|
135
|
+
"'": "'"
|
|
136
|
+
};
|
|
137
|
+
return str.replace(/[&<>"']/g, (char) => htmlEscapes[char]);
|
|
138
|
+
};
|
|
139
|
+
var unescapeHtml = (str) => {
|
|
140
|
+
const htmlUnescapes = {
|
|
141
|
+
"&": "&",
|
|
142
|
+
"<": "<",
|
|
143
|
+
">": ">",
|
|
144
|
+
""": '"',
|
|
145
|
+
"'": "'"
|
|
146
|
+
};
|
|
147
|
+
return str.replace(/&(amp|lt|gt|quot|#39);/g, (match) => htmlUnescapes[match]);
|
|
148
|
+
};
|
|
149
|
+
var stripTags = (str) => {
|
|
150
|
+
return str.replace(/<[^>]*>/g, "");
|
|
151
|
+
};
|
|
152
|
+
var byteLength = (str) => {
|
|
153
|
+
let len = 0;
|
|
154
|
+
for (let i = 0; i < str.length; i++) {
|
|
155
|
+
const code = str.charCodeAt(i);
|
|
156
|
+
if (code >= 1 && code <= 126) {
|
|
157
|
+
len += 1;
|
|
158
|
+
} else if (code >= 128 && code <= 2047) {
|
|
159
|
+
len += 2;
|
|
160
|
+
} else if (code >= 2048 && code <= 65535) {
|
|
161
|
+
len += 3;
|
|
162
|
+
} else {
|
|
163
|
+
len += 4;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return len;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
Object.defineProperty(exports, "camelCase", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
get: function () { return esToolkit.camelCase; }
|
|
172
|
+
});
|
|
173
|
+
Object.defineProperty(exports, "capitalize", {
|
|
174
|
+
enumerable: true,
|
|
175
|
+
get: function () { return esToolkit.capitalize; }
|
|
176
|
+
});
|
|
177
|
+
Object.defineProperty(exports, "kebabCase", {
|
|
178
|
+
enumerable: true,
|
|
179
|
+
get: function () { return esToolkit.kebabCase; }
|
|
180
|
+
});
|
|
181
|
+
Object.defineProperty(exports, "lowerFirst", {
|
|
182
|
+
enumerable: true,
|
|
183
|
+
get: function () { return esToolkit.lowerFirst; }
|
|
184
|
+
});
|
|
185
|
+
Object.defineProperty(exports, "snakeCase", {
|
|
186
|
+
enumerable: true,
|
|
187
|
+
get: function () { return esToolkit.snakeCase; }
|
|
188
|
+
});
|
|
189
|
+
Object.defineProperty(exports, "startCase", {
|
|
190
|
+
enumerable: true,
|
|
191
|
+
get: function () { return esToolkit.startCase; }
|
|
192
|
+
});
|
|
193
|
+
Object.defineProperty(exports, "trim", {
|
|
194
|
+
enumerable: true,
|
|
195
|
+
get: function () { return esToolkit.trim; }
|
|
196
|
+
});
|
|
197
|
+
Object.defineProperty(exports, "upperFirst", {
|
|
198
|
+
enumerable: true,
|
|
199
|
+
get: function () { return esToolkit.upperFirst; }
|
|
200
|
+
});
|
|
201
|
+
exports.byteLength = byteLength;
|
|
202
|
+
exports.escapeHtml = escapeHtml;
|
|
203
|
+
exports.extractEmails = extractEmails;
|
|
204
|
+
exports.extractNumbers = extractNumbers;
|
|
205
|
+
exports.extractPhones = extractPhones;
|
|
206
|
+
exports.firstLowerCase = firstLowerCase;
|
|
207
|
+
exports.firstUpperCase = firstUpperCase;
|
|
208
|
+
exports.formatMoney = formatMoney;
|
|
209
|
+
exports.getExtension = getExtension;
|
|
210
|
+
exports.getFileName = getFileName;
|
|
211
|
+
exports.hideEmail = hideEmail;
|
|
212
|
+
exports.hideIdCard = hideIdCard;
|
|
213
|
+
exports.hidePhone = hidePhone;
|
|
214
|
+
exports.highlight = highlight;
|
|
215
|
+
exports.isEmail = isEmail;
|
|
216
|
+
exports.isEmpty = isEmpty;
|
|
217
|
+
exports.isIdCard = isIdCard;
|
|
218
|
+
exports.isPhone = isPhone;
|
|
219
|
+
exports.isUrl = isUrl;
|
|
220
|
+
exports.pad = pad;
|
|
221
|
+
exports.random = random;
|
|
222
|
+
exports.repeat = repeat;
|
|
223
|
+
exports.reverse = reverse;
|
|
224
|
+
exports.shortId = shortId;
|
|
225
|
+
exports.stripTags = stripTags;
|
|
226
|
+
exports.toBoolean = toBoolean;
|
|
227
|
+
exports.toNumber = toNumber;
|
|
228
|
+
exports.truncateText = truncateText;
|
|
229
|
+
exports.unescapeHtml = unescapeHtml;
|
|
230
|
+
exports.uuid = uuid;
|
|
231
|
+
//# sourceMappingURL=string.cjs.map
|
|
232
|
+
//# sourceMappingURL=string.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/string/index.ts"],"names":["trim"],"mappings":"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","file":"string.cjs","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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\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 '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { camelCase, capitalize, kebabCase, lowerFirst, snakeCase, startCase, trim, upperFirst } from 'es-toolkit';
|
|
2
|
+
export { b as byteLength, e as escapeHtml, a as extractEmails, c as extractNumbers, d as extractPhones, f as firstLowerCase, g as firstUpperCase, h as formatMoney, j as getExtension, k as getFileName, l as hideEmail, m as hideIdCard, n as hidePhone, o as highlight, p as isEmail, q as isEmpty, r as isIdCard, s as isPhone, t as isUrl, u as pad, v as random, w as repeat, x as reverse, y as shortId, z as stripTags, A as toBoolean, B as toNumber, C as truncateText, D as unescapeHtml, E as uuid } from './index-Dan5oF-5.cjs';
|
package/dist/string.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { camelCase, capitalize, kebabCase, lowerFirst, snakeCase, startCase, trim, upperFirst } from 'es-toolkit';
|
|
2
|
+
export { b as byteLength, e as escapeHtml, a as extractEmails, c as extractNumbers, d as extractPhones, f as firstLowerCase, g as firstUpperCase, h as formatMoney, j as getExtension, k as getFileName, l as hideEmail, m as hideIdCard, n as hidePhone, o as highlight, p as isEmail, q as isEmpty, r as isIdCard, s as isPhone, t as isUrl, u as pad, v as random, w as repeat, x as reverse, y as shortId, z as stripTags, A as toBoolean, B as toNumber, C as truncateText, D as unescapeHtml, E as uuid } from './index-Dan5oF-5.js';
|