elegant-tools-js 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.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # elegant-tools-js
2
+
3
+ 一个强大的 TypeScript 工具库,提供浏览器指纹识别、防抖、节流等常用工具函数。
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🔍 **浏览器指纹识别** - 基于多维度特征生成唯一标识
8
+ - ⚡ **防抖 & 节流** - 优化事件处理性能
9
+ - 📦 **深拷贝** - 完整的对象克隆支持
10
+ - 🆔 **唯一ID生成** - 时间戳+随机数组合
11
+ - 📅 **日期格式化** - 灵活的日期格式化
12
+ - 🔄 **数组操作** - 智能去重工具
13
+ - 🔗 **URL工具** - 查询字符串解析与生成
14
+ - 📱 **设备检测** - 移动设备识别
15
+ - 🎲 **随机工具** - 随机数与字符串生成
16
+
17
+ ## 📦 安装
18
+
19
+ ```bash
20
+ npm install elegant-tools-js
21
+ # 或
22
+ yarn add elegant-tools-js
23
+ ```
24
+
25
+ ## 🚀 快速开始
26
+
27
+ ### ES6+ 模块
28
+
29
+ ```typescript
30
+ import { Utils } from 'elegant-tools-js';
31
+
32
+ // 防抖 - 避免频繁触发
33
+ const debouncedFunction = Utils.debounce(() => {
34
+ console.log('防抖执行');
35
+ }, 1000);
36
+ window.addEventListener('resize', debouncedFunction);
37
+
38
+ // 节流 - 控制执行频率
39
+ const throttledFunction = Utils.throttle(() => {
40
+ console.log('节流执行');
41
+ }, 1000);
42
+ window.addEventListener('scroll', throttledFunction);
43
+
44
+ // 浏览器指纹 - 获取唯一标识
45
+ const fingerprint = Utils.getBrowserFingerprint();
46
+ console.log('浏览器指纹:', fingerprint);
47
+
48
+ // 深拷贝对象
49
+ const original = { a: 1, b: { c: 2 } };
50
+ const copy = Utils.deepClone(original);
51
+
52
+ // 生成唯一ID
53
+ const id = Utils.generateId();
54
+
55
+ // 格式化日期
56
+ Utils.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss');
57
+
58
+ // 数组去重
59
+ Utils.uniqueArray([1, 2, 2, 3]); // [1, 2, 3]
60
+
61
+ // 检查移动设备
62
+ if (Utils.isMobile()) {
63
+ console.log('移动设备');
64
+ }
65
+
66
+ // 随机数
67
+ Utils.random(1, 100); // 1-100 之间的随机整数
68
+
69
+ // 驼峰转短横线
70
+ Utils.camelToKebab('helloWorld'); // 'hello-world'
71
+ ```
72
+
73
+ ### CommonJS
74
+
75
+ ```javascript
76
+ const { Utils } = require('elegant-tools-js');
77
+
78
+ // 使用方式与 ES6+ 模块相同
79
+ ```
80
+
81
+ ## 📚 主要 API
82
+
83
+ ### 浏览器指纹
84
+
85
+ ```typescript
86
+ Utils.getBrowserFingerprint(): string
87
+ ```
88
+
89
+ 获取基于浏览器特征的指纹信息,特征包括 User Agent、屏幕信息、时区、硬件信息等。
90
+
91
+ ### 事件优化
92
+
93
+ ```typescript
94
+ // 防抖
95
+ Utils.debounce(func, wait)
96
+
97
+ // 节流
98
+ Utils.throttle(func, limit)
99
+ ```
100
+
101
+ ### 对象操作
102
+
103
+ ```typescript
104
+ // 深拷贝
105
+ Utils.deepClone(obj)
106
+
107
+ // 生成唯一ID
108
+ Utils.generateId()
109
+ ```
110
+
111
+ ### 日期处理
112
+
113
+ ```typescript
114
+ // 格式化日期
115
+ Utils.formatDate(date, format)
116
+ ```
117
+
118
+ 支持 `YYYY`, `MM`, `DD`, `HH`, `mm`, `ss` 占位符。
119
+
120
+ ### 数组工具
121
+
122
+ ```typescript
123
+ // 数组去重
124
+ Utils.uniqueArray(arr)
125
+
126
+ // 根据键去重
127
+ Utils.uniqueArrayByKey(arr, key)
128
+ ```
129
+
130
+ ### URL 工具
131
+
132
+ ```typescript
133
+ // 解析查询字符串
134
+ Utils.parseQuery(query)
135
+
136
+ // 生成查询字符串
137
+ Utils.stringifyQuery(params)
138
+ ```
139
+
140
+ ### 设备检测
141
+
142
+ ```typescript
143
+ Utils.isMobile(): boolean
144
+ ```
145
+
146
+ ## 📄 许可证
147
+
148
+ MIT
149
+
150
+ ## 🤝 贡献
151
+
152
+ 欢迎提交 Issue 和 Pull Request!
153
+
154
+ 更多文档请查看 [DEVELOPMENT.md](./DEVELOPMENT.md)
@@ -0,0 +1,3 @@
1
+ export * from './utils';
2
+ export { Utils } from './utils';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.Utils = void 0;
18
+ __exportStar(require("./utils"), exports);
19
+ var utils_1 = require("./utils");
20
+ Object.defineProperty(exports, "Utils", { enumerable: true, get: function () { return utils_1.Utils; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,iCAAgC;AAAvB,8FAAA,KAAK,OAAA"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * 通用工具类
3
+ */
4
+ export declare class Utils {
5
+ /**
6
+ * 防抖函数
7
+ * @param func 要执行的函数
8
+ * @param wait 等待时间(毫秒)
9
+ * @returns 防抖后的函数
10
+ */
11
+ static debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void;
12
+ /**
13
+ * 节流函数
14
+ * @param func 要执行的函数
15
+ * @param limit 时间间隔(毫秒)
16
+ * @returns 节流后的函数
17
+ */
18
+ static throttle<T extends (...args: any[]) => any>(func: T, limit: number): (...args: Parameters<T>) => void;
19
+ /**
20
+ * 深拷贝对象
21
+ * @param obj 要拷贝的对象
22
+ * @returns 拷贝后的对象
23
+ */
24
+ static deepClone<T>(obj: T): T;
25
+ /**
26
+ * 生成唯一ID
27
+ * @returns 唯一ID字符串
28
+ */
29
+ static generateId(): string;
30
+ /**
31
+ * 获取浏览器唯一标识
32
+ * 基于多个浏览器特征生成唯一标识,包括 User Agent、屏幕信息、时区等
33
+ * @returns 浏览器唯一标识字符串
34
+ */
35
+ static getBrowserFingerprint(): string;
36
+ /**
37
+ * 格式化日期
38
+ * @param date 日期对象或时间戳
39
+ * @param format 格式化模式(默认:YYYY-MM-DD HH:mm:ss)
40
+ * @returns 格式化后的日期字符串
41
+ */
42
+ static formatDate(date: Date | number, format?: string): string;
43
+ /**
44
+ * 数组去重
45
+ * @param arr 要去重的数组
46
+ * @returns 去重后的数组
47
+ */
48
+ static uniqueArray<T>(arr: T[]): T[];
49
+ /**
50
+ * 对象数组去重(根据指定键)
51
+ * @param arr 要去重的数组
52
+ * @param key 去重的键名
53
+ * @returns 去重后的数组
54
+ */
55
+ static uniqueArrayByKey<T, K extends keyof T>(arr: T[], key: K): T[];
56
+ /**
57
+ * 等待指定时间
58
+ * @param ms 毫秒数
59
+ * @returns Promise
60
+ */
61
+ static sleep(ms: number): Promise<void>;
62
+ /**
63
+ * 将 URL 查询参数转换为对象
64
+ * @param query URL 查询字符串
65
+ * @returns 参数对象
66
+ */
67
+ static parseQuery(query: string): Record<string, string>;
68
+ /**
69
+ * 将对象转换为 URL 查询字符串
70
+ * @param params 参数对象
71
+ * @returns URL 查询字符串
72
+ */
73
+ static stringifyQuery(params: Record<string, any>): string;
74
+ /**
75
+ * 检查是否为移动设备
76
+ * @returns 是否为移动设备
77
+ */
78
+ static isMobile(): boolean;
79
+ /**
80
+ * 获取随机数
81
+ * @param min 最小值
82
+ * @param max 最大值
83
+ * @returns 随机数
84
+ */
85
+ static random(min: number, max: number): number;
86
+ /**
87
+ * 获取随机字符串
88
+ * @param length 字符串长度
89
+ * @returns 随机字符串
90
+ */
91
+ static randomString(length?: number): string;
92
+ /**
93
+ * 驼峰命名转短横线命名
94
+ * @param str 驼峰命名字符串
95
+ * @returns 短横线命名字符串
96
+ */
97
+ static camelToKebab(str: string): string;
98
+ /**
99
+ * 短横线命名转驼峰命名
100
+ * @param str 短横线命名字符串
101
+ * @returns 驼峰命名字符串
102
+ */
103
+ static kebabToCamel(str: string): string;
104
+ }
105
+ export default Utils;
106
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,KAAK;IAChB;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC/C,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI;IASnC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC/C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI;IAYnC;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IA0B9B;;;OAGG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAI3B;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM;IA8FtC;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,MAAM,GAAE,MAA8B,GACrC,MAAM;IAmBT;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAIpC;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;IAYpE;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAcxD;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAS1D;;;OAGG;IACH,MAAM,CAAC,QAAQ,IAAI,OAAO;IAO1B;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI/C;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAS/C;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIxC;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAe,KAAK,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Utils = void 0;
4
+ /**
5
+ * 通用工具类
6
+ */
7
+ class Utils {
8
+ /**
9
+ * 防抖函数
10
+ * @param func 要执行的函数
11
+ * @param wait 等待时间(毫秒)
12
+ * @returns 防抖后的函数
13
+ */
14
+ static debounce(func, wait) {
15
+ let timeout = null;
16
+ return (...args) => {
17
+ if (timeout)
18
+ clearTimeout(timeout);
19
+ timeout = setTimeout(() => func(...args), wait);
20
+ };
21
+ }
22
+ /**
23
+ * 节流函数
24
+ * @param func 要执行的函数
25
+ * @param limit 时间间隔(毫秒)
26
+ * @returns 节流后的函数
27
+ */
28
+ static throttle(func, limit) {
29
+ let inThrottle;
30
+ return (...args) => {
31
+ if (!inThrottle) {
32
+ func(...args);
33
+ inThrottle = true;
34
+ setTimeout(() => (inThrottle = false), limit);
35
+ }
36
+ };
37
+ }
38
+ /**
39
+ * 深拷贝对象
40
+ * @param obj 要拷贝的对象
41
+ * @returns 拷贝后的对象
42
+ */
43
+ static deepClone(obj) {
44
+ if (obj === null || typeof obj !== 'object') {
45
+ return obj;
46
+ }
47
+ if (obj instanceof Date) {
48
+ return new Date(obj.getTime());
49
+ }
50
+ if (obj instanceof Array) {
51
+ return obj.map(item => this.deepClone(item));
52
+ }
53
+ if (typeof obj === 'object') {
54
+ const cloned = {};
55
+ for (const key in obj) {
56
+ if (obj.hasOwnProperty(key)) {
57
+ cloned[key] = this.deepClone(obj[key]);
58
+ }
59
+ }
60
+ return cloned;
61
+ }
62
+ return obj;
63
+ }
64
+ /**
65
+ * 生成唯一ID
66
+ * @returns 唯一ID字符串
67
+ */
68
+ static generateId() {
69
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
70
+ }
71
+ /**
72
+ * 获取浏览器唯一标识
73
+ * 基于多个浏览器特征生成唯一标识,包括 User Agent、屏幕信息、时区等
74
+ * @returns 浏览器唯一标识字符串
75
+ */
76
+ static getBrowserFingerprint() {
77
+ if (typeof window === 'undefined' || typeof document === 'undefined') {
78
+ return 'server-side-env';
79
+ }
80
+ const canvas = document.createElement('canvas');
81
+ const ctx = canvas.getContext('2d');
82
+ ctx.textBaseline = 'top';
83
+ ctx.font = '14px Arial';
84
+ ctx.fillText('Browser fingerprint 🌍', 2, 2);
85
+ const fingerprintComponents = [];
86
+ // User Agent
87
+ fingerprintComponents.push(navigator.userAgent);
88
+ // 屏幕信息
89
+ fingerprintComponents.push(`${screen.width}x${screen.height}`, `${screen.availWidth}x${screen.availHeight}`, screen.colorDepth.toString(), screen.pixelDepth.toString());
90
+ // 时区
91
+ fingerprintComponents.push(Intl.DateTimeFormat().resolvedOptions().timeZone || 'unknown');
92
+ // 语言
93
+ fingerprintComponents.push(navigator.language);
94
+ fingerprintComponents.push(navigator.languages?.join(',') || 'unknown');
95
+ // 平台信息
96
+ fingerprintComponents.push(navigator.platform);
97
+ // 硬件信息
98
+ fingerprintComponents.push(navigator.hardwareConcurrency?.toString() || 'unknown');
99
+ const deviceMemory = navigator.deviceMemory;
100
+ fingerprintComponents.push(deviceMemory?.toString() || 'unknown');
101
+ // 颜色 gamut
102
+ if (window.matchMedia) {
103
+ const gamutQueries = [
104
+ '(color-gamut: srgb)',
105
+ '(color-gamut: p3)',
106
+ '(color-gamut: rec2020)',
107
+ ];
108
+ for (const query of gamutQueries) {
109
+ fingerprintComponents.push(window.matchMedia(query).matches.toString());
110
+ }
111
+ }
112
+ // WebGL 信息
113
+ try {
114
+ const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
115
+ if (gl) {
116
+ const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
117
+ if (debugInfo) {
118
+ const unmaskedRenderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || 'unknown';
119
+ const unmaskedVendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || 'unknown';
120
+ fingerprintComponents.push(String(unmaskedRenderer));
121
+ fingerprintComponents.push(String(unmaskedVendor));
122
+ }
123
+ const shadingLangVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || 'unknown';
124
+ const version = gl.getParameter(gl.VERSION) || 'unknown';
125
+ fingerprintComponents.push(String(shadingLangVersion));
126
+ fingerprintComponents.push(String(version));
127
+ }
128
+ }
129
+ catch (e) {
130
+ fingerprintComponents.push('webgl-unavailable');
131
+ }
132
+ // Canvas 指纹(简化版)
133
+ fingerprintComponents.push(canvas.toDataURL().slice(0, 50));
134
+ // Cookie 支持
135
+ fingerprintComponents.push(navigator.cookieEnabled.toString());
136
+ // Do Not Track
137
+ fingerprintComponents.push(navigator.doNotTrack || 'unspecified');
138
+ // 合并所有组件并生成哈希
139
+ const combinedString = fingerprintComponents.join('||');
140
+ // 使用简单的哈希算法
141
+ let hash = 0;
142
+ for (let i = 0; i < combinedString.length; i++) {
143
+ const char = combinedString.charCodeAt(i);
144
+ hash = ((hash << 5) - hash) + char;
145
+ hash = hash & hash; // 转换为 32 位整数
146
+ }
147
+ return Math.abs(hash).toString(36);
148
+ }
149
+ /**
150
+ * 格式化日期
151
+ * @param date 日期对象或时间戳
152
+ * @param format 格式化模式(默认:YYYY-MM-DD HH:mm:ss)
153
+ * @returns 格式化后的日期字符串
154
+ */
155
+ static formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
156
+ const d = new Date(date);
157
+ const year = d.getFullYear();
158
+ const month = String(d.getMonth() + 1).padStart(2, '0');
159
+ const day = String(d.getDate()).padStart(2, '0');
160
+ const hours = String(d.getHours()).padStart(2, '0');
161
+ const minutes = String(d.getMinutes()).padStart(2, '0');
162
+ const seconds = String(d.getSeconds()).padStart(2, '0');
163
+ return format
164
+ .replace('YYYY', String(year))
165
+ .replace('MM', month)
166
+ .replace('DD', day)
167
+ .replace('HH', hours)
168
+ .replace('mm', minutes)
169
+ .replace('ss', seconds);
170
+ }
171
+ /**
172
+ * 数组去重
173
+ * @param arr 要去重的数组
174
+ * @returns 去重后的数组
175
+ */
176
+ static uniqueArray(arr) {
177
+ return [...new Set(arr)];
178
+ }
179
+ /**
180
+ * 对象数组去重(根据指定键)
181
+ * @param arr 要去重的数组
182
+ * @param key 去重的键名
183
+ * @returns 去重后的数组
184
+ */
185
+ static uniqueArrayByKey(arr, key) {
186
+ const seen = new Set();
187
+ return arr.filter(item => {
188
+ const value = item[key];
189
+ if (seen.has(value)) {
190
+ return false;
191
+ }
192
+ seen.add(value);
193
+ return true;
194
+ });
195
+ }
196
+ /**
197
+ * 等待指定时间
198
+ * @param ms 毫秒数
199
+ * @returns Promise
200
+ */
201
+ static sleep(ms) {
202
+ return new Promise(resolve => setTimeout(resolve, ms));
203
+ }
204
+ /**
205
+ * 将 URL 查询参数转换为对象
206
+ * @param query URL 查询字符串
207
+ * @returns 参数对象
208
+ */
209
+ static parseQuery(query) {
210
+ const result = {};
211
+ const pairs = query.replace(/^\?/, '').split('&');
212
+ for (const pair of pairs) {
213
+ if (pair) {
214
+ const [key, value] = pair.split('=');
215
+ result[decodeURIComponent(key)] = decodeURIComponent(value || '');
216
+ }
217
+ }
218
+ return result;
219
+ }
220
+ /**
221
+ * 将对象转换为 URL 查询字符串
222
+ * @param params 参数对象
223
+ * @returns URL 查询字符串
224
+ */
225
+ static stringifyQuery(params) {
226
+ const pairs = Object.entries(params).map(([key, value]) => {
227
+ if (value === undefined || value === null)
228
+ return '';
229
+ return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;
230
+ });
231
+ return pairs.filter(Boolean).join('&');
232
+ }
233
+ /**
234
+ * 检查是否为移动设备
235
+ * @returns 是否为移动设备
236
+ */
237
+ static isMobile() {
238
+ if (typeof window === 'undefined')
239
+ return false;
240
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
241
+ }
242
+ /**
243
+ * 获取随机数
244
+ * @param min 最小值
245
+ * @param max 最大值
246
+ * @returns 随机数
247
+ */
248
+ static random(min, max) {
249
+ return Math.floor(Math.random() * (max - min + 1)) + min;
250
+ }
251
+ /**
252
+ * 获取随机字符串
253
+ * @param length 字符串长度
254
+ * @returns 随机字符串
255
+ */
256
+ static randomString(length = 8) {
257
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
258
+ let result = '';
259
+ for (let i = 0; i < length; i++) {
260
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
261
+ }
262
+ return result;
263
+ }
264
+ /**
265
+ * 驼峰命名转短横线命名
266
+ * @param str 驼峰命名字符串
267
+ * @returns 短横线命名字符串
268
+ */
269
+ static camelToKebab(str) {
270
+ return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase();
271
+ }
272
+ /**
273
+ * 短横线命名转驼峰命名
274
+ * @param str 短横线命名字符串
275
+ * @returns 驼峰命名字符串
276
+ */
277
+ static kebabToCamel(str) {
278
+ return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
279
+ }
280
+ }
281
+ exports.Utils = Utils;
282
+ exports.default = Utils;
283
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "elegant-tools-js",
3
+ "version": "1.0.0",
4
+ "description": "A powerful TypeScript utility library with browser fingerprinting, debouncing, throttling, and more",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "build:watch": "tsc --watch",
15
+ "dev": "ts-node src/index.ts",
16
+ "clean": "rm -rf dist",
17
+ "prepublishOnly": "npm run build",
18
+ "lint": "eslint src --ext .ts",
19
+ "test": "jest"
20
+ },
21
+ "keywords": [
22
+ "typescript",
23
+ "utility",
24
+ "library",
25
+ "npm",
26
+ "browser-fingerprint",
27
+ "debounce",
28
+ "throttle",
29
+ "utilities",
30
+ "tools",
31
+ "helper"
32
+ ],
33
+ "author": "",
34
+ "license": "MIT",
35
+ "devDependencies": {
36
+ "@types/node": "^20.10.0",
37
+ "typescript": "^5.3.0",
38
+ "ts-node": "^10.9.0",
39
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
40
+ "@typescript-eslint/parser": "^6.13.0",
41
+ "eslint": "^8.54.0",
42
+ "jest": "^29.7.0",
43
+ "@types/jest": "^29.5.8"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ }
48
+ }