@alibarbar/common 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +338 -0
- package/dist/algorithm.d.mts +66 -0
- package/dist/algorithm.d.ts +66 -0
- package/dist/algorithm.js +44 -0
- package/dist/algorithm.js.map +1 -0
- package/dist/algorithm.mjs +3 -0
- package/dist/algorithm.mjs.map +1 -0
- package/dist/array.d.mts +139 -0
- package/dist/array.d.ts +139 -0
- package/dist/array.js +84 -0
- package/dist/array.js.map +1 -0
- package/dist/array.mjs +3 -0
- package/dist/array.mjs.map +1 -0
- package/dist/chunk-27UDDVLZ.js +259 -0
- package/dist/chunk-27UDDVLZ.js.map +1 -0
- package/dist/chunk-2FFSQ573.mjs +138 -0
- package/dist/chunk-2FFSQ573.mjs.map +1 -0
- package/dist/chunk-4RGXV4SJ.js +106 -0
- package/dist/chunk-4RGXV4SJ.js.map +1 -0
- package/dist/chunk-56W6YECK.js +374 -0
- package/dist/chunk-56W6YECK.js.map +1 -0
- package/dist/chunk-5BGSUGTI.mjs +128 -0
- package/dist/chunk-5BGSUGTI.mjs.map +1 -0
- package/dist/chunk-7E6GELHJ.mjs +302 -0
- package/dist/chunk-7E6GELHJ.mjs.map +1 -0
- package/dist/chunk-7V5UQXIO.js +89 -0
- package/dist/chunk-7V5UQXIO.js.map +1 -0
- package/dist/chunk-A4SWQXX7.mjs +484 -0
- package/dist/chunk-A4SWQXX7.mjs.map +1 -0
- package/dist/chunk-ALDC6LRJ.mjs +85 -0
- package/dist/chunk-ALDC6LRJ.mjs.map +1 -0
- package/dist/chunk-BHCRFURU.js +491 -0
- package/dist/chunk-BHCRFURU.js.map +1 -0
- package/dist/chunk-D7CS5EKF.js +110 -0
- package/dist/chunk-D7CS5EKF.js.map +1 -0
- package/dist/chunk-DYBSRI7V.js +189 -0
- package/dist/chunk-DYBSRI7V.js.map +1 -0
- package/dist/chunk-F3LAGHPG.js +332 -0
- package/dist/chunk-F3LAGHPG.js.map +1 -0
- package/dist/chunk-HLDFI7R2.mjs +175 -0
- package/dist/chunk-HLDFI7R2.mjs.map +1 -0
- package/dist/chunk-HME2N3VY.mjs +354 -0
- package/dist/chunk-HME2N3VY.mjs.map +1 -0
- package/dist/chunk-I3L42475.js +145 -0
- package/dist/chunk-I3L42475.js.map +1 -0
- package/dist/chunk-JBLX27WD.mjs +240 -0
- package/dist/chunk-JBLX27WD.mjs.map +1 -0
- package/dist/chunk-JHZ7M2MR.mjs +133 -0
- package/dist/chunk-JHZ7M2MR.mjs.map +1 -0
- package/dist/chunk-JK2SE3I2.js +100 -0
- package/dist/chunk-JK2SE3I2.js.map +1 -0
- package/dist/chunk-JQZBPAPO.js +157 -0
- package/dist/chunk-JQZBPAPO.js.map +1 -0
- package/dist/chunk-JXYGC2C5.mjs +100 -0
- package/dist/chunk-JXYGC2C5.mjs.map +1 -0
- package/dist/chunk-KGFTD255.js +104 -0
- package/dist/chunk-KGFTD255.js.map +1 -0
- package/dist/chunk-LBHBNPNJ.mjs +148 -0
- package/dist/chunk-LBHBNPNJ.mjs.map +1 -0
- package/dist/chunk-LCXGZISK.js +158 -0
- package/dist/chunk-LCXGZISK.js.map +1 -0
- package/dist/chunk-LF4CILQS.mjs +87 -0
- package/dist/chunk-LF4CILQS.mjs.map +1 -0
- package/dist/chunk-MMR6XQNX.js +98 -0
- package/dist/chunk-MMR6XQNX.js.map +1 -0
- package/dist/chunk-NSSDYX2U.mjs +80 -0
- package/dist/chunk-NSSDYX2U.mjs.map +1 -0
- package/dist/chunk-O3O67R4I.js +143 -0
- package/dist/chunk-O3O67R4I.js.map +1 -0
- package/dist/chunk-OX5PLOWB.js +90 -0
- package/dist/chunk-OX5PLOWB.js.map +1 -0
- package/dist/chunk-PJ7UCTX4.mjs +362 -0
- package/dist/chunk-PJ7UCTX4.mjs.map +1 -0
- package/dist/chunk-QIBE7GVN.mjs +81 -0
- package/dist/chunk-QIBE7GVN.mjs.map +1 -0
- package/dist/chunk-QIOC54LQ.mjs +130 -0
- package/dist/chunk-QIOC54LQ.mjs.map +1 -0
- package/dist/chunk-QV6MIQ7H.mjs +328 -0
- package/dist/chunk-QV6MIQ7H.mjs.map +1 -0
- package/dist/chunk-TQN37HIN.js +94 -0
- package/dist/chunk-TQN37HIN.js.map +1 -0
- package/dist/chunk-XJTZDXSR.mjs +94 -0
- package/dist/chunk-XJTZDXSR.mjs.map +1 -0
- package/dist/chunk-XVUE53T3.js +361 -0
- package/dist/chunk-XVUE53T3.js.map +1 -0
- package/dist/chunk-Y364QIQH.js +139 -0
- package/dist/chunk-Y364QIQH.js.map +1 -0
- package/dist/chunk-YXM6Q4JS.mjs +94 -0
- package/dist/chunk-YXM6Q4JS.mjs.map +1 -0
- package/dist/chunk-ZDMFMUDR.js +309 -0
- package/dist/chunk-ZDMFMUDR.js.map +1 -0
- package/dist/chunk-ZVJ6NQUM.mjs +82 -0
- package/dist/chunk-ZVJ6NQUM.mjs.map +1 -0
- package/dist/color.d.mts +74 -0
- package/dist/color.d.ts +74 -0
- package/dist/color.js +40 -0
- package/dist/color.js.map +1 -0
- package/dist/color.mjs +3 -0
- package/dist/color.mjs.map +1 -0
- package/dist/crypto.d.mts +92 -0
- package/dist/crypto.d.ts +92 -0
- package/dist/crypto.js +60 -0
- package/dist/crypto.js.map +1 -0
- package/dist/crypto.mjs +3 -0
- package/dist/crypto.mjs.map +1 -0
- package/dist/data-structure.d.mts +213 -0
- package/dist/data-structure.d.ts +213 -0
- package/dist/data-structure.js +32 -0
- package/dist/data-structure.js.map +1 -0
- package/dist/data-structure.mjs +3 -0
- package/dist/data-structure.mjs.map +1 -0
- package/dist/date.d.mts +108 -0
- package/dist/date.d.ts +108 -0
- package/dist/date.js +72 -0
- package/dist/date.js.map +1 -0
- package/dist/date.mjs +3 -0
- package/dist/date.mjs.map +1 -0
- package/dist/dom.d.mts +92 -0
- package/dist/dom.d.ts +92 -0
- package/dist/dom.js +56 -0
- package/dist/dom.js.map +1 -0
- package/dist/dom.mjs +3 -0
- package/dist/dom.mjs.map +1 -0
- package/dist/file.d.mts +44 -0
- package/dist/file.d.ts +44 -0
- package/dist/file.js +32 -0
- package/dist/file.js.map +1 -0
- package/dist/file.mjs +3 -0
- package/dist/file.mjs.map +1 -0
- package/dist/i18n.d.mts +77 -0
- package/dist/i18n.d.ts +77 -0
- package/dist/i18n.js +40 -0
- package/dist/i18n.js.map +1 -0
- package/dist/i18n.mjs +3 -0
- package/dist/i18n.mjs.map +1 -0
- package/dist/index.d.mts +155 -0
- package/dist/index.d.ts +155 -0
- package/dist/index.js +839 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/dist/network.d.mts +47 -0
- package/dist/network.d.ts +47 -0
- package/dist/network.js +28 -0
- package/dist/network.js.map +1 -0
- package/dist/network.mjs +3 -0
- package/dist/network.mjs.map +1 -0
- package/dist/number.d.mts +100 -0
- package/dist/number.d.ts +100 -0
- package/dist/number.js +56 -0
- package/dist/number.js.map +1 -0
- package/dist/number.mjs +3 -0
- package/dist/number.mjs.map +1 -0
- package/dist/object.d.mts +132 -0
- package/dist/object.d.ts +132 -0
- package/dist/object.js +80 -0
- package/dist/object.js.map +1 -0
- package/dist/object.mjs +3 -0
- package/dist/object.mjs.map +1 -0
- package/dist/performance.d.mts +85 -0
- package/dist/performance.d.ts +85 -0
- package/dist/performance.js +40 -0
- package/dist/performance.js.map +1 -0
- package/dist/performance.mjs +3 -0
- package/dist/performance.mjs.map +1 -0
- package/dist/storage.d.mts +176 -0
- package/dist/storage.d.ts +176 -0
- package/dist/storage.js +33 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.mjs +4 -0
- package/dist/storage.mjs.map +1 -0
- package/dist/string.d.mts +105 -0
- package/dist/string.d.ts +105 -0
- package/dist/string.js +68 -0
- package/dist/string.js.map +1 -0
- package/dist/string.mjs +3 -0
- package/dist/string.mjs.map +1 -0
- package/dist/tracking.d.mts +182 -0
- package/dist/tracking.d.ts +182 -0
- package/dist/tracking.js +52 -0
- package/dist/tracking.js.map +1 -0
- package/dist/tracking.mjs +3 -0
- package/dist/tracking.mjs.map +1 -0
- package/dist/transform.d.mts +53 -0
- package/dist/transform.d.ts +53 -0
- package/dist/transform.js +32 -0
- package/dist/transform.js.map +1 -0
- package/dist/transform.mjs +3 -0
- package/dist/transform.mjs.map +1 -0
- package/dist/upload-DzlQtUBc.d.mts +202 -0
- package/dist/upload-DzlQtUBc.d.ts +202 -0
- package/dist/upload.d.mts +1 -0
- package/dist/upload.d.ts +1 -0
- package/dist/upload.js +17 -0
- package/dist/upload.js.map +1 -0
- package/dist/upload.mjs +4 -0
- package/dist/upload.mjs.map +1 -0
- package/dist/url.d.mts +82 -0
- package/dist/url.d.ts +82 -0
- package/dist/url.js +44 -0
- package/dist/url.js.map +1 -0
- package/dist/url.mjs +3 -0
- package/dist/url.mjs.map +1 -0
- package/dist/validation.d.mts +83 -0
- package/dist/validation.d.ts +83 -0
- package/dist/validation.js +60 -0
- package/dist/validation.js.map +1 -0
- package/dist/validation.mjs +3 -0
- package/dist/validation.mjs.map +1 -0
- package/package.json +170 -0
package/README.md
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# @alibarbar/common
|
|
2
|
+
|
|
3
|
+
Alibarbar 通用工具库
|
|
4
|
+
|
|
5
|
+
> 📋 查看 [开发路线图](./ROADMAP.md) 了解未来规划
|
|
6
|
+
> 🔧 查看 [快速调试指南](./QUICK_START_DEBUG.md) 开始本地调试
|
|
7
|
+
|
|
8
|
+
## 安装
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @alibarbar/common
|
|
12
|
+
# 或
|
|
13
|
+
yarn add @alibarbar/common
|
|
14
|
+
# 或
|
|
15
|
+
pnpm add @alibarbar/common
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 配置 npm 源
|
|
19
|
+
|
|
20
|
+
项目已配置使用淘宝镜像源(速度更快)。如需修改,请编辑 `.npmrc` 文件。
|
|
21
|
+
|
|
22
|
+
**当前配置**:`registry=https://registry.npmmirror.com`
|
|
23
|
+
|
|
24
|
+
**切换源**:
|
|
25
|
+
- 编辑 `.npmrc` 文件,取消注释你想要的源
|
|
26
|
+
- 或使用命令:`npm config set registry <源地址>`
|
|
27
|
+
|
|
28
|
+
**发布到 npm**:
|
|
29
|
+
发布时建议切换到官方源:
|
|
30
|
+
```bash
|
|
31
|
+
npm config set registry https://registry.npmjs.org/
|
|
32
|
+
npm publish
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 使用示例
|
|
36
|
+
|
|
37
|
+
### 字符串工具
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { capitalize, camelCase, kebabCase, truncate } from '@alibarbar/common';
|
|
41
|
+
|
|
42
|
+
capitalize('hello'); // 'Hello'
|
|
43
|
+
camelCase('hello-world'); // 'helloWorld'
|
|
44
|
+
kebabCase('helloWorld'); // 'hello-world'
|
|
45
|
+
truncate('hello world', 5); // 'he...'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 数组工具
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { unique, groupBy, chunk, flatten } from '@alibarbar/common';
|
|
52
|
+
|
|
53
|
+
unique([1, 2, 2, 3]); // [1, 2, 3]
|
|
54
|
+
groupBy([{type: 'a'}, {type: 'b'}], item => item.type);
|
|
55
|
+
chunk([1, 2, 3, 4], 2); // [[1, 2], [3, 4]]
|
|
56
|
+
flatten([1, [2, 3]], 1); // [1, 2, 3]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 对象工具
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
import { deepClone, merge, deepMerge, get } from '@alibarbar/common';
|
|
63
|
+
|
|
64
|
+
const cloned = deepClone(original);
|
|
65
|
+
const merged = merge({a: 1}, {b: 2});
|
|
66
|
+
const deep = deepMerge({a: {b: 1}}, {a: {c: 2}});
|
|
67
|
+
const value = get(obj, 'a.b.c', 'default');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 日期工具
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { formatDate, getRelativeTime, isToday } from '@alibarbar/common';
|
|
74
|
+
|
|
75
|
+
formatDate(new Date(), 'YYYY-MM-DD'); // '2024-01-01'
|
|
76
|
+
getRelativeTime(new Date(Date.now() - 3600000)); // '1小时前'
|
|
77
|
+
isToday(new Date()); // true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 验证工具
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { isValidEmail, isValidPhone, isValidUrl, isEmpty } from '@alibarbar/common';
|
|
84
|
+
|
|
85
|
+
isValidEmail('test@example.com'); // true
|
|
86
|
+
isValidPhone('13800138000'); // true
|
|
87
|
+
isValidUrl('https://example.com'); // true
|
|
88
|
+
isEmpty(''); // true
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 文件上传(分片上传、断点续传)
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { createUploader } from '@alibarbar/common';
|
|
95
|
+
|
|
96
|
+
const file = document.querySelector('input[type="file"]').files[0];
|
|
97
|
+
|
|
98
|
+
const uploader = createUploader(file, {
|
|
99
|
+
baseURL: 'https://api.example.com',
|
|
100
|
+
chunkSize: 2 * 1024 * 1024, // 2MB分片
|
|
101
|
+
concurrency: 3, // 并发上传3个分片
|
|
102
|
+
onProgress: (progress) => {
|
|
103
|
+
console.log(`上传进度: ${progress.percentage}%`);
|
|
104
|
+
},
|
|
105
|
+
onComplete: (result) => {
|
|
106
|
+
console.log('上传完成:', result.fileUrl);
|
|
107
|
+
},
|
|
108
|
+
onError: (error) => {
|
|
109
|
+
console.error('上传失败:', error);
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// 开始上传
|
|
114
|
+
await uploader.upload();
|
|
115
|
+
|
|
116
|
+
// 暂停上传
|
|
117
|
+
uploader.pause();
|
|
118
|
+
|
|
119
|
+
// 恢复上传
|
|
120
|
+
await uploader.resume();
|
|
121
|
+
|
|
122
|
+
// 取消上传
|
|
123
|
+
await uploader.cancel();
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 文件工具
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import {
|
|
130
|
+
calculateFileMD5,
|
|
131
|
+
splitFileIntoChunks,
|
|
132
|
+
formatFileSize,
|
|
133
|
+
getFileExtension
|
|
134
|
+
} from '@alibarbar/common';
|
|
135
|
+
|
|
136
|
+
const md5 = await calculateFileMD5(file);
|
|
137
|
+
const chunks = splitFileIntoChunks(file, 2 * 1024 * 1024);
|
|
138
|
+
const size = formatFileSize(1024 * 1024); // '1 MB'
|
|
139
|
+
const ext = getFileExtension('file.pdf'); // 'pdf'
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 开发
|
|
143
|
+
|
|
144
|
+
### 安装依赖
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npm install
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 构建
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npm run build
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 开发模式(监听文件变化)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm run dev
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 测试
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm test
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 代码检查
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npm run lint
|
|
172
|
+
npm run lint:fix
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 代码格式化
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
npm run format
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## 发布
|
|
182
|
+
|
|
183
|
+
### 配置私有 npm 仓库
|
|
184
|
+
|
|
185
|
+
在发布前,需要配置私有 npm 仓库:
|
|
186
|
+
|
|
187
|
+
1. **配置 `.npmrc` 文件**(项目根目录):
|
|
188
|
+
```bash
|
|
189
|
+
# 设置作用域包的仓库
|
|
190
|
+
@alibarbar:registry=https://your-private-npm-registry.com
|
|
191
|
+
|
|
192
|
+
# 配置认证令牌(使用环境变量)
|
|
193
|
+
//your-private-npm-registry.com/:_authToken=${NPM_TOKEN}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
2. **设置环境变量**:
|
|
197
|
+
```bash
|
|
198
|
+
export NPM_TOKEN=your-auth-token
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
或者创建 `.env` 文件(记得添加到 `.gitignore`):
|
|
202
|
+
```
|
|
203
|
+
NPM_TOKEN=your-auth-token
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
3. **登录到私有仓库**(如果需要):
|
|
207
|
+
```bash
|
|
208
|
+
npm login --registry=https://your-private-npm-registry.com
|
|
209
|
+
# 或
|
|
210
|
+
npm adduser --registry=https://your-private-npm-registry.com
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 发布步骤
|
|
214
|
+
|
|
215
|
+
1. 更新版本号(遵循语义化版本):
|
|
216
|
+
```bash
|
|
217
|
+
npm version patch # 补丁版本 1.0.0 -> 1.0.1
|
|
218
|
+
npm version minor # 次版本 1.0.0 -> 1.1.0
|
|
219
|
+
npm version major # 主版本 1.0.0 -> 2.0.0
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
2. 构建项目:`npm run build`
|
|
223
|
+
3. 运行测试:`npm test`
|
|
224
|
+
4. 发布到私有仓库:`npm publish`
|
|
225
|
+
|
|
226
|
+
### 临时禁用发布配置(仅开发阶段)
|
|
227
|
+
|
|
228
|
+
如果暂时不需要发布,可以注释掉 `package.json` 中的 `publishConfig`:
|
|
229
|
+
```json
|
|
230
|
+
// "publishConfig": {
|
|
231
|
+
// "registry": "https://your-private-npm-registry.com"
|
|
232
|
+
// }
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## 📚 文档
|
|
236
|
+
|
|
237
|
+
- [最佳实践](./docs/BEST_PRACTICES.md) - 使用建议和最佳实践
|
|
238
|
+
- [迁移指南](./docs/MIGRATION.md) - 从其他库迁移的指南
|
|
239
|
+
- [常见问题](./docs/FAQ.md) - 常见问题解答
|
|
240
|
+
- [性能对比](./docs/PERFORMANCE.md) - 性能对比和优化建议
|
|
241
|
+
- [兼容性文档](./docs/COMPATIBILITY.md) - 浏览器和 Node.js 兼容性说明
|
|
242
|
+
- [本地调试指南](./docs/DEBUGGING.md) - 本地开发和调试方法
|
|
243
|
+
- [开发路线图](./ROADMAP.md) - 项目开发计划和进度
|
|
244
|
+
|
|
245
|
+
## 目录结构
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
.
|
|
249
|
+
├── src/ # 源代码目录
|
|
250
|
+
│ ├── core/ # 核心工具
|
|
251
|
+
│ │ ├── string.ts # 字符串工具
|
|
252
|
+
│ │ ├── array.ts # 数组工具
|
|
253
|
+
│ │ ├── object.ts # 对象工具
|
|
254
|
+
│ │ ├── date.ts # 日期工具
|
|
255
|
+
│ │ └── validation.ts # 验证工具
|
|
256
|
+
│ ├── format/ # 格式化工具
|
|
257
|
+
│ │ ├── number.ts # 数字工具
|
|
258
|
+
│ │ ├── url.ts # URL工具
|
|
259
|
+
│ │ ├── color.ts # 颜色工具
|
|
260
|
+
│ │ └── i18n.ts # 国际化工具
|
|
261
|
+
│ ├── browser/ # 浏览器相关工具
|
|
262
|
+
│ │ ├── dom.ts # DOM工具
|
|
263
|
+
│ │ ├── storage.ts # 存储工具
|
|
264
|
+
│ │ ├── network.ts # 网络工具
|
|
265
|
+
│ │ ├── file.ts # 文件工具
|
|
266
|
+
│ │ └── upload.ts # 文件上传工具
|
|
267
|
+
│ ├── data/ # 数据处理工具
|
|
268
|
+
│ │ ├── transform.ts # 数据转换
|
|
269
|
+
│ │ ├── data-structure.ts # 数据结构
|
|
270
|
+
│ │ └── algorithm.ts # 算法工具
|
|
271
|
+
│ ├── helper/ # 实用工具
|
|
272
|
+
│ │ ├── performance.ts # 性能工具
|
|
273
|
+
│ │ ├── crypto.ts # 加密工具
|
|
274
|
+
│ │ └── tracking.ts # 埋点工具
|
|
275
|
+
│ ├── types/ # 类型定义
|
|
276
|
+
│ │ ├── index.ts
|
|
277
|
+
│ │ ├── upload.ts
|
|
278
|
+
│ │ └── utils.ts
|
|
279
|
+
│ ├── api/ # API文档
|
|
280
|
+
│ │ └── docs.json
|
|
281
|
+
│ └── index.ts # 入口文件
|
|
282
|
+
├── dist/ # 构建输出目录
|
|
283
|
+
├── coverage/ # 测试覆盖率报告
|
|
284
|
+
├── docs/ # 文档目录
|
|
285
|
+
│ ├── BEST_PRACTICES.md
|
|
286
|
+
│ ├── MIGRATION.md
|
|
287
|
+
│ ├── FAQ.md
|
|
288
|
+
│ └── PERFORMANCE.md
|
|
289
|
+
├── package.json
|
|
290
|
+
├── tsconfig.json
|
|
291
|
+
├── tsup.config.ts
|
|
292
|
+
└── README.md
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## 文件上传功能说明
|
|
296
|
+
|
|
297
|
+
### 特性
|
|
298
|
+
|
|
299
|
+
- ✅ **分片上传**: 支持大文件分片上传,默认2MB每片
|
|
300
|
+
- ✅ **断点续传**: 自动检测已上传分片,支持断点续传
|
|
301
|
+
- ✅ **并发控制**: 可配置并发上传数量,默认3个
|
|
302
|
+
- ✅ **进度追踪**: 实时获取上传进度
|
|
303
|
+
- ✅ **错误重试**: 自动重试失败的分片,默认重试3次
|
|
304
|
+
- ✅ **暂停/恢复**: 支持暂停和恢复上传
|
|
305
|
+
- ✅ **秒传支持**: 如果文件已存在,直接返回文件URL
|
|
306
|
+
|
|
307
|
+
### API接口
|
|
308
|
+
|
|
309
|
+
文件上传功能使用以下API接口:
|
|
310
|
+
|
|
311
|
+
- `POST /api/files/common/init` - 初始化上传
|
|
312
|
+
- `POST /api/files/common/chunk` - 上传分片
|
|
313
|
+
- `POST /api/files/common/complete/{taskId}` - 完成上传
|
|
314
|
+
- `GET /api/files/common/progress/{taskId}` - 获取上传进度
|
|
315
|
+
- `GET /api/files/common/chunks/{taskId}` - 获取已上传分片列表
|
|
316
|
+
- `POST /api/files/common/cancel/{taskId}` - 取消上传
|
|
317
|
+
|
|
318
|
+
### 注意事项
|
|
319
|
+
|
|
320
|
+
1. **MD5计算**: 当前实现使用SHA-256作为简化方案,如需真正的MD5,建议使用 `spark-md5` 库
|
|
321
|
+
2. **浏览器兼容性**: 需要支持 `FileReader`、`FormData`、`fetch` API
|
|
322
|
+
3. **认证**: 如需认证,请在 `headers` 选项中添加认证信息
|
|
323
|
+
|
|
324
|
+
## 开发路线图
|
|
325
|
+
|
|
326
|
+
查看 [ROADMAP.md](./ROADMAP.md) 了解详细的功能规划和开发计划。
|
|
327
|
+
|
|
328
|
+
### 近期计划
|
|
329
|
+
- ✅ 基础工具函数(字符串、数组、对象、日期、验证)
|
|
330
|
+
- ✅ 文件上传功能(分片上传、断点续传)
|
|
331
|
+
- 🔄 核心工具扩展(更多实用函数)
|
|
332
|
+
- 📋 新工具模块(数字、URL、存储、加密、网络、性能、DOM)
|
|
333
|
+
- 📋 测试覆盖率提升到 90%+
|
|
334
|
+
|
|
335
|
+
## License
|
|
336
|
+
|
|
337
|
+
UNLICENSED - 私有项目
|
|
338
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 算法工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 二分查找
|
|
6
|
+
* @param array - 已排序的数组
|
|
7
|
+
* @param target - 目标值
|
|
8
|
+
* @param compareFn - 比较函数(可选)
|
|
9
|
+
* @returns 目标值的索引,如果未找到返回 -1
|
|
10
|
+
*/
|
|
11
|
+
declare function binarySearch<T>(array: T[], target: T, compareFn?: (a: T, b: T) => number): number;
|
|
12
|
+
/**
|
|
13
|
+
* 快速排序
|
|
14
|
+
* @param array - 要排序的数组
|
|
15
|
+
* @param compareFn - 比较函数(可选)
|
|
16
|
+
* @returns 排序后的新数组
|
|
17
|
+
*/
|
|
18
|
+
declare function quickSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
19
|
+
/**
|
|
20
|
+
* 归并排序
|
|
21
|
+
* @param array - 要排序的数组
|
|
22
|
+
* @param compareFn - 比较函数(可选)
|
|
23
|
+
* @returns 排序后的新数组
|
|
24
|
+
*/
|
|
25
|
+
declare function mergeSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
26
|
+
/**
|
|
27
|
+
* 冒泡排序
|
|
28
|
+
* @param array - 要排序的数组
|
|
29
|
+
* @param compareFn - 比较函数(可选)
|
|
30
|
+
* @returns 排序后的新数组
|
|
31
|
+
*/
|
|
32
|
+
declare function bubbleSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
33
|
+
/**
|
|
34
|
+
* 计算斐波那契数列的第n项
|
|
35
|
+
* @param n - 位置(从0开始)
|
|
36
|
+
* @returns 斐波那契数
|
|
37
|
+
*/
|
|
38
|
+
declare function fibonacci(n: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* 计算斐波那契数列(返回前n项)
|
|
41
|
+
* @param n - 项数
|
|
42
|
+
* @returns 斐波那契数列数组
|
|
43
|
+
*/
|
|
44
|
+
declare function fibonacciSequence(n: number): number[];
|
|
45
|
+
/**
|
|
46
|
+
* 计算阶乘
|
|
47
|
+
* @param n - 非负整数
|
|
48
|
+
* @returns 阶乘结果
|
|
49
|
+
*/
|
|
50
|
+
declare function factorial(n: number): number;
|
|
51
|
+
/**
|
|
52
|
+
* 计算最大公约数(GCD)
|
|
53
|
+
* @param a - 第一个数
|
|
54
|
+
* @param b - 第二个数
|
|
55
|
+
* @returns 最大公约数
|
|
56
|
+
*/
|
|
57
|
+
declare function gcd(a: number, b: number): number;
|
|
58
|
+
/**
|
|
59
|
+
* 计算最小公倍数(LCM)
|
|
60
|
+
* @param a - 第一个数
|
|
61
|
+
* @param b - 第二个数
|
|
62
|
+
* @returns 最小公倍数
|
|
63
|
+
*/
|
|
64
|
+
declare function lcm(a: number, b: number): number;
|
|
65
|
+
|
|
66
|
+
export { binarySearch, bubbleSort, factorial, fibonacci, fibonacciSequence, gcd, lcm, mergeSort, quickSort };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 算法工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 二分查找
|
|
6
|
+
* @param array - 已排序的数组
|
|
7
|
+
* @param target - 目标值
|
|
8
|
+
* @param compareFn - 比较函数(可选)
|
|
9
|
+
* @returns 目标值的索引,如果未找到返回 -1
|
|
10
|
+
*/
|
|
11
|
+
declare function binarySearch<T>(array: T[], target: T, compareFn?: (a: T, b: T) => number): number;
|
|
12
|
+
/**
|
|
13
|
+
* 快速排序
|
|
14
|
+
* @param array - 要排序的数组
|
|
15
|
+
* @param compareFn - 比较函数(可选)
|
|
16
|
+
* @returns 排序后的新数组
|
|
17
|
+
*/
|
|
18
|
+
declare function quickSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
19
|
+
/**
|
|
20
|
+
* 归并排序
|
|
21
|
+
* @param array - 要排序的数组
|
|
22
|
+
* @param compareFn - 比较函数(可选)
|
|
23
|
+
* @returns 排序后的新数组
|
|
24
|
+
*/
|
|
25
|
+
declare function mergeSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
26
|
+
/**
|
|
27
|
+
* 冒泡排序
|
|
28
|
+
* @param array - 要排序的数组
|
|
29
|
+
* @param compareFn - 比较函数(可选)
|
|
30
|
+
* @returns 排序后的新数组
|
|
31
|
+
*/
|
|
32
|
+
declare function bubbleSort<T>(array: T[], compareFn?: (a: T, b: T) => number): T[];
|
|
33
|
+
/**
|
|
34
|
+
* 计算斐波那契数列的第n项
|
|
35
|
+
* @param n - 位置(从0开始)
|
|
36
|
+
* @returns 斐波那契数
|
|
37
|
+
*/
|
|
38
|
+
declare function fibonacci(n: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* 计算斐波那契数列(返回前n项)
|
|
41
|
+
* @param n - 项数
|
|
42
|
+
* @returns 斐波那契数列数组
|
|
43
|
+
*/
|
|
44
|
+
declare function fibonacciSequence(n: number): number[];
|
|
45
|
+
/**
|
|
46
|
+
* 计算阶乘
|
|
47
|
+
* @param n - 非负整数
|
|
48
|
+
* @returns 阶乘结果
|
|
49
|
+
*/
|
|
50
|
+
declare function factorial(n: number): number;
|
|
51
|
+
/**
|
|
52
|
+
* 计算最大公约数(GCD)
|
|
53
|
+
* @param a - 第一个数
|
|
54
|
+
* @param b - 第二个数
|
|
55
|
+
* @returns 最大公约数
|
|
56
|
+
*/
|
|
57
|
+
declare function gcd(a: number, b: number): number;
|
|
58
|
+
/**
|
|
59
|
+
* 计算最小公倍数(LCM)
|
|
60
|
+
* @param a - 第一个数
|
|
61
|
+
* @param b - 第二个数
|
|
62
|
+
* @returns 最小公倍数
|
|
63
|
+
*/
|
|
64
|
+
declare function lcm(a: number, b: number): number;
|
|
65
|
+
|
|
66
|
+
export { binarySearch, bubbleSort, factorial, fibonacci, fibonacciSequence, gcd, lcm, mergeSort, quickSort };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkO3O67R4I_js = require('./chunk-O3O67R4I.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "binarySearch", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkO3O67R4I_js.binarySearch; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "bubbleSort", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkO3O67R4I_js.bubbleSort; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "factorial", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkO3O67R4I_js.factorial; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "fibonacci", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkO3O67R4I_js.fibonacci; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "fibonacciSequence", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunkO3O67R4I_js.fibonacciSequence; }
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(exports, "gcd", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () { return chunkO3O67R4I_js.gcd; }
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "lcm", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () { return chunkO3O67R4I_js.lcm; }
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(exports, "mergeSort", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return chunkO3O67R4I_js.mergeSort; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "quickSort", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkO3O67R4I_js.quickSort; }
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=algorithm.js.map
|
|
44
|
+
//# sourceMappingURL=algorithm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"algorithm.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"algorithm.mjs"}
|
package/dist/array.d.mts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数组工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 数组去重
|
|
6
|
+
* @param arr - 输入数组
|
|
7
|
+
* @returns 去重后的数组
|
|
8
|
+
*/
|
|
9
|
+
declare function unique<T>(arr: T[]): T[];
|
|
10
|
+
/**
|
|
11
|
+
* 数组分组
|
|
12
|
+
* @param arr - 输入数组
|
|
13
|
+
* @param keyFn - 分组键函数或属性名
|
|
14
|
+
* @returns 分组后的对象
|
|
15
|
+
*/
|
|
16
|
+
declare function groupBy<T, K extends string | number>(arr: T[], keyFn: ((item: T) => K) | string): Record<K, T[]>;
|
|
17
|
+
/**
|
|
18
|
+
* 数组分块
|
|
19
|
+
* @param arr - 输入数组
|
|
20
|
+
* @param size - 每块大小
|
|
21
|
+
* @returns 分块后的二维数组
|
|
22
|
+
*/
|
|
23
|
+
declare function chunk<T>(arr: T[], size: number): T[][];
|
|
24
|
+
/**
|
|
25
|
+
* 数组扁平化
|
|
26
|
+
* @param arr - 输入数组
|
|
27
|
+
* @param depth - 扁平化深度,默认为 1
|
|
28
|
+
* @returns 扁平化后的数组
|
|
29
|
+
*/
|
|
30
|
+
declare function flatten<T>(arr: (T | T[])[], depth?: number): T[];
|
|
31
|
+
/**
|
|
32
|
+
* 数组随机打乱(Fisher-Yates算法)
|
|
33
|
+
* @param arr - 输入数组
|
|
34
|
+
* @returns 打乱后的新数组
|
|
35
|
+
*/
|
|
36
|
+
declare function shuffle<T>(arr: T[]): T[];
|
|
37
|
+
/**
|
|
38
|
+
* 随机取样
|
|
39
|
+
* @param arr - 输入数组
|
|
40
|
+
* @param count - 取样数量,默认为 1。当 count=1 时返回单个元素,否则返回数组
|
|
41
|
+
* @returns 随机取样的数组或单个元素
|
|
42
|
+
*/
|
|
43
|
+
declare function sample<T>(arr: T[]): T;
|
|
44
|
+
declare function sample<T>(arr: T[], count: number): T | T[];
|
|
45
|
+
/**
|
|
46
|
+
* 数组差集(在arr1中但不在arr2中的元素)
|
|
47
|
+
* @param arr1 - 第一个数组
|
|
48
|
+
* @param arr2 - 第二个数组
|
|
49
|
+
* @returns 差集数组
|
|
50
|
+
*/
|
|
51
|
+
declare function difference<T>(arr1: T[], arr2: T[]): T[];
|
|
52
|
+
/**
|
|
53
|
+
* 数组交集
|
|
54
|
+
* @param arr1 - 第一个数组
|
|
55
|
+
* @param arr2 - 第二个数组
|
|
56
|
+
* @returns 交集数组
|
|
57
|
+
*/
|
|
58
|
+
declare function intersection<T>(arr1: T[], arr2: T[]): T[];
|
|
59
|
+
/**
|
|
60
|
+
* 数组并集
|
|
61
|
+
* @param arr1 - 第一个数组
|
|
62
|
+
* @param arr2 - 第二个数组
|
|
63
|
+
* @returns 并集数组
|
|
64
|
+
*/
|
|
65
|
+
declare function union<T>(arr1: T[], arr2: T[]): T[];
|
|
66
|
+
/**
|
|
67
|
+
* 按属性排序
|
|
68
|
+
* @param arr - 输入数组
|
|
69
|
+
* @param keyFn - 获取排序键的函数或属性名
|
|
70
|
+
* @param order - 排序顺序,'asc' 或 'desc',默认为 'asc'
|
|
71
|
+
* @returns 排序后的新数组
|
|
72
|
+
*/
|
|
73
|
+
declare function sortBy<T, K extends string | number>(arr: T[], keyFn: ((item: T) => K) | string, order?: 'asc' | 'desc'): T[];
|
|
74
|
+
/**
|
|
75
|
+
* 按条件查找索引
|
|
76
|
+
* @param arr - 输入数组
|
|
77
|
+
* @param predicate - 条件函数
|
|
78
|
+
* @returns 找到的索引,未找到返回 -1
|
|
79
|
+
*/
|
|
80
|
+
declare function findIndexBy<T>(arr: T[], predicate: (item: T) => boolean): number;
|
|
81
|
+
/**
|
|
82
|
+
* 数组分割(满足条件/不满足条件)
|
|
83
|
+
* @param arr - 输入数组
|
|
84
|
+
* @param predicate - 条件函数
|
|
85
|
+
* @returns 包含两个数组的元组:[满足条件的数组, 不满足条件的数组]
|
|
86
|
+
*/
|
|
87
|
+
declare function partition<T>(arr: T[], predicate: (item: T) => boolean): [T[], T[]];
|
|
88
|
+
/**
|
|
89
|
+
* 数组压缩(将多个数组合并成元组数组)
|
|
90
|
+
* @param arrays - 要压缩的数组
|
|
91
|
+
* @returns 压缩后的元组数组
|
|
92
|
+
*/
|
|
93
|
+
declare function zip<T extends readonly unknown[]>(...arrays: T): Array<{
|
|
94
|
+
[K in keyof T]: T[K] extends readonly (infer U)[] ? U : never;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* 数组解压(将元组数组拆分成多个数组)
|
|
98
|
+
* @param array - 要解压的数组
|
|
99
|
+
* @returns 解压后的数组元组
|
|
100
|
+
*/
|
|
101
|
+
declare function unzip<T extends readonly unknown[]>(array: Array<{
|
|
102
|
+
[K in keyof T]: T[number] extends readonly (infer U)[] ? U : never;
|
|
103
|
+
}>): T;
|
|
104
|
+
/**
|
|
105
|
+
* 移除假值(null, undefined, false, 0, '')
|
|
106
|
+
* @param arr - 输入数组
|
|
107
|
+
* @returns 移除假值后的数组
|
|
108
|
+
*/
|
|
109
|
+
declare function compact<T>(arr: (T | null | undefined | false | 0 | '')[]): T[];
|
|
110
|
+
/**
|
|
111
|
+
* 取前N个元素
|
|
112
|
+
* @param arr - 输入数组
|
|
113
|
+
* @param n - 要取的元素数量
|
|
114
|
+
* @returns 前N个元素的数组
|
|
115
|
+
*/
|
|
116
|
+
declare function take<T>(arr: T[], n: number): T[];
|
|
117
|
+
/**
|
|
118
|
+
* 跳过前N个元素
|
|
119
|
+
* @param arr - 输入数组
|
|
120
|
+
* @param n - 要跳过的元素数量
|
|
121
|
+
* @returns 跳过后的数组
|
|
122
|
+
*/
|
|
123
|
+
declare function drop<T>(arr: T[], n: number): T[];
|
|
124
|
+
/**
|
|
125
|
+
* 条件取元素(直到条件不满足)
|
|
126
|
+
* @param arr - 输入数组
|
|
127
|
+
* @param predicate - 条件函数
|
|
128
|
+
* @returns 满足条件的连续元素数组
|
|
129
|
+
*/
|
|
130
|
+
declare function takeWhile<T>(arr: T[], predicate: (item: T) => boolean): T[];
|
|
131
|
+
/**
|
|
132
|
+
* 条件跳过元素(直到条件不满足)
|
|
133
|
+
* @param arr - 输入数组
|
|
134
|
+
* @param predicate - 条件函数
|
|
135
|
+
* @returns 跳过后的数组
|
|
136
|
+
*/
|
|
137
|
+
declare function dropWhile<T>(arr: T[], predicate: (item: T) => boolean): T[];
|
|
138
|
+
|
|
139
|
+
export { chunk, compact, difference, drop, dropWhile, findIndexBy, flatten, groupBy, intersection, partition, sample, shuffle, sortBy, take, takeWhile, union, unique, unzip, zip };
|