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 +154 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +106 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +283 -0
- package/dist/utils.js.map +1 -0
- package/package.json +48 -0
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)
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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
|
+
}
|