@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.
Files changed (210) hide show
  1. package/README.md +338 -0
  2. package/dist/algorithm.d.mts +66 -0
  3. package/dist/algorithm.d.ts +66 -0
  4. package/dist/algorithm.js +44 -0
  5. package/dist/algorithm.js.map +1 -0
  6. package/dist/algorithm.mjs +3 -0
  7. package/dist/algorithm.mjs.map +1 -0
  8. package/dist/array.d.mts +139 -0
  9. package/dist/array.d.ts +139 -0
  10. package/dist/array.js +84 -0
  11. package/dist/array.js.map +1 -0
  12. package/dist/array.mjs +3 -0
  13. package/dist/array.mjs.map +1 -0
  14. package/dist/chunk-27UDDVLZ.js +259 -0
  15. package/dist/chunk-27UDDVLZ.js.map +1 -0
  16. package/dist/chunk-2FFSQ573.mjs +138 -0
  17. package/dist/chunk-2FFSQ573.mjs.map +1 -0
  18. package/dist/chunk-4RGXV4SJ.js +106 -0
  19. package/dist/chunk-4RGXV4SJ.js.map +1 -0
  20. package/dist/chunk-56W6YECK.js +374 -0
  21. package/dist/chunk-56W6YECK.js.map +1 -0
  22. package/dist/chunk-5BGSUGTI.mjs +128 -0
  23. package/dist/chunk-5BGSUGTI.mjs.map +1 -0
  24. package/dist/chunk-7E6GELHJ.mjs +302 -0
  25. package/dist/chunk-7E6GELHJ.mjs.map +1 -0
  26. package/dist/chunk-7V5UQXIO.js +89 -0
  27. package/dist/chunk-7V5UQXIO.js.map +1 -0
  28. package/dist/chunk-A4SWQXX7.mjs +484 -0
  29. package/dist/chunk-A4SWQXX7.mjs.map +1 -0
  30. package/dist/chunk-ALDC6LRJ.mjs +85 -0
  31. package/dist/chunk-ALDC6LRJ.mjs.map +1 -0
  32. package/dist/chunk-BHCRFURU.js +491 -0
  33. package/dist/chunk-BHCRFURU.js.map +1 -0
  34. package/dist/chunk-D7CS5EKF.js +110 -0
  35. package/dist/chunk-D7CS5EKF.js.map +1 -0
  36. package/dist/chunk-DYBSRI7V.js +189 -0
  37. package/dist/chunk-DYBSRI7V.js.map +1 -0
  38. package/dist/chunk-F3LAGHPG.js +332 -0
  39. package/dist/chunk-F3LAGHPG.js.map +1 -0
  40. package/dist/chunk-HLDFI7R2.mjs +175 -0
  41. package/dist/chunk-HLDFI7R2.mjs.map +1 -0
  42. package/dist/chunk-HME2N3VY.mjs +354 -0
  43. package/dist/chunk-HME2N3VY.mjs.map +1 -0
  44. package/dist/chunk-I3L42475.js +145 -0
  45. package/dist/chunk-I3L42475.js.map +1 -0
  46. package/dist/chunk-JBLX27WD.mjs +240 -0
  47. package/dist/chunk-JBLX27WD.mjs.map +1 -0
  48. package/dist/chunk-JHZ7M2MR.mjs +133 -0
  49. package/dist/chunk-JHZ7M2MR.mjs.map +1 -0
  50. package/dist/chunk-JK2SE3I2.js +100 -0
  51. package/dist/chunk-JK2SE3I2.js.map +1 -0
  52. package/dist/chunk-JQZBPAPO.js +157 -0
  53. package/dist/chunk-JQZBPAPO.js.map +1 -0
  54. package/dist/chunk-JXYGC2C5.mjs +100 -0
  55. package/dist/chunk-JXYGC2C5.mjs.map +1 -0
  56. package/dist/chunk-KGFTD255.js +104 -0
  57. package/dist/chunk-KGFTD255.js.map +1 -0
  58. package/dist/chunk-LBHBNPNJ.mjs +148 -0
  59. package/dist/chunk-LBHBNPNJ.mjs.map +1 -0
  60. package/dist/chunk-LCXGZISK.js +158 -0
  61. package/dist/chunk-LCXGZISK.js.map +1 -0
  62. package/dist/chunk-LF4CILQS.mjs +87 -0
  63. package/dist/chunk-LF4CILQS.mjs.map +1 -0
  64. package/dist/chunk-MMR6XQNX.js +98 -0
  65. package/dist/chunk-MMR6XQNX.js.map +1 -0
  66. package/dist/chunk-NSSDYX2U.mjs +80 -0
  67. package/dist/chunk-NSSDYX2U.mjs.map +1 -0
  68. package/dist/chunk-O3O67R4I.js +143 -0
  69. package/dist/chunk-O3O67R4I.js.map +1 -0
  70. package/dist/chunk-OX5PLOWB.js +90 -0
  71. package/dist/chunk-OX5PLOWB.js.map +1 -0
  72. package/dist/chunk-PJ7UCTX4.mjs +362 -0
  73. package/dist/chunk-PJ7UCTX4.mjs.map +1 -0
  74. package/dist/chunk-QIBE7GVN.mjs +81 -0
  75. package/dist/chunk-QIBE7GVN.mjs.map +1 -0
  76. package/dist/chunk-QIOC54LQ.mjs +130 -0
  77. package/dist/chunk-QIOC54LQ.mjs.map +1 -0
  78. package/dist/chunk-QV6MIQ7H.mjs +328 -0
  79. package/dist/chunk-QV6MIQ7H.mjs.map +1 -0
  80. package/dist/chunk-TQN37HIN.js +94 -0
  81. package/dist/chunk-TQN37HIN.js.map +1 -0
  82. package/dist/chunk-XJTZDXSR.mjs +94 -0
  83. package/dist/chunk-XJTZDXSR.mjs.map +1 -0
  84. package/dist/chunk-XVUE53T3.js +361 -0
  85. package/dist/chunk-XVUE53T3.js.map +1 -0
  86. package/dist/chunk-Y364QIQH.js +139 -0
  87. package/dist/chunk-Y364QIQH.js.map +1 -0
  88. package/dist/chunk-YXM6Q4JS.mjs +94 -0
  89. package/dist/chunk-YXM6Q4JS.mjs.map +1 -0
  90. package/dist/chunk-ZDMFMUDR.js +309 -0
  91. package/dist/chunk-ZDMFMUDR.js.map +1 -0
  92. package/dist/chunk-ZVJ6NQUM.mjs +82 -0
  93. package/dist/chunk-ZVJ6NQUM.mjs.map +1 -0
  94. package/dist/color.d.mts +74 -0
  95. package/dist/color.d.ts +74 -0
  96. package/dist/color.js +40 -0
  97. package/dist/color.js.map +1 -0
  98. package/dist/color.mjs +3 -0
  99. package/dist/color.mjs.map +1 -0
  100. package/dist/crypto.d.mts +92 -0
  101. package/dist/crypto.d.ts +92 -0
  102. package/dist/crypto.js +60 -0
  103. package/dist/crypto.js.map +1 -0
  104. package/dist/crypto.mjs +3 -0
  105. package/dist/crypto.mjs.map +1 -0
  106. package/dist/data-structure.d.mts +213 -0
  107. package/dist/data-structure.d.ts +213 -0
  108. package/dist/data-structure.js +32 -0
  109. package/dist/data-structure.js.map +1 -0
  110. package/dist/data-structure.mjs +3 -0
  111. package/dist/data-structure.mjs.map +1 -0
  112. package/dist/date.d.mts +108 -0
  113. package/dist/date.d.ts +108 -0
  114. package/dist/date.js +72 -0
  115. package/dist/date.js.map +1 -0
  116. package/dist/date.mjs +3 -0
  117. package/dist/date.mjs.map +1 -0
  118. package/dist/dom.d.mts +92 -0
  119. package/dist/dom.d.ts +92 -0
  120. package/dist/dom.js +56 -0
  121. package/dist/dom.js.map +1 -0
  122. package/dist/dom.mjs +3 -0
  123. package/dist/dom.mjs.map +1 -0
  124. package/dist/file.d.mts +44 -0
  125. package/dist/file.d.ts +44 -0
  126. package/dist/file.js +32 -0
  127. package/dist/file.js.map +1 -0
  128. package/dist/file.mjs +3 -0
  129. package/dist/file.mjs.map +1 -0
  130. package/dist/i18n.d.mts +77 -0
  131. package/dist/i18n.d.ts +77 -0
  132. package/dist/i18n.js +40 -0
  133. package/dist/i18n.js.map +1 -0
  134. package/dist/i18n.mjs +3 -0
  135. package/dist/i18n.mjs.map +1 -0
  136. package/dist/index.d.mts +155 -0
  137. package/dist/index.d.ts +155 -0
  138. package/dist/index.js +839 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/index.mjs +22 -0
  141. package/dist/index.mjs.map +1 -0
  142. package/dist/network.d.mts +47 -0
  143. package/dist/network.d.ts +47 -0
  144. package/dist/network.js +28 -0
  145. package/dist/network.js.map +1 -0
  146. package/dist/network.mjs +3 -0
  147. package/dist/network.mjs.map +1 -0
  148. package/dist/number.d.mts +100 -0
  149. package/dist/number.d.ts +100 -0
  150. package/dist/number.js +56 -0
  151. package/dist/number.js.map +1 -0
  152. package/dist/number.mjs +3 -0
  153. package/dist/number.mjs.map +1 -0
  154. package/dist/object.d.mts +132 -0
  155. package/dist/object.d.ts +132 -0
  156. package/dist/object.js +80 -0
  157. package/dist/object.js.map +1 -0
  158. package/dist/object.mjs +3 -0
  159. package/dist/object.mjs.map +1 -0
  160. package/dist/performance.d.mts +85 -0
  161. package/dist/performance.d.ts +85 -0
  162. package/dist/performance.js +40 -0
  163. package/dist/performance.js.map +1 -0
  164. package/dist/performance.mjs +3 -0
  165. package/dist/performance.mjs.map +1 -0
  166. package/dist/storage.d.mts +176 -0
  167. package/dist/storage.d.ts +176 -0
  168. package/dist/storage.js +33 -0
  169. package/dist/storage.js.map +1 -0
  170. package/dist/storage.mjs +4 -0
  171. package/dist/storage.mjs.map +1 -0
  172. package/dist/string.d.mts +105 -0
  173. package/dist/string.d.ts +105 -0
  174. package/dist/string.js +68 -0
  175. package/dist/string.js.map +1 -0
  176. package/dist/string.mjs +3 -0
  177. package/dist/string.mjs.map +1 -0
  178. package/dist/tracking.d.mts +182 -0
  179. package/dist/tracking.d.ts +182 -0
  180. package/dist/tracking.js +52 -0
  181. package/dist/tracking.js.map +1 -0
  182. package/dist/tracking.mjs +3 -0
  183. package/dist/tracking.mjs.map +1 -0
  184. package/dist/transform.d.mts +53 -0
  185. package/dist/transform.d.ts +53 -0
  186. package/dist/transform.js +32 -0
  187. package/dist/transform.js.map +1 -0
  188. package/dist/transform.mjs +3 -0
  189. package/dist/transform.mjs.map +1 -0
  190. package/dist/upload-DzlQtUBc.d.mts +202 -0
  191. package/dist/upload-DzlQtUBc.d.ts +202 -0
  192. package/dist/upload.d.mts +1 -0
  193. package/dist/upload.d.ts +1 -0
  194. package/dist/upload.js +17 -0
  195. package/dist/upload.js.map +1 -0
  196. package/dist/upload.mjs +4 -0
  197. package/dist/upload.mjs.map +1 -0
  198. package/dist/url.d.mts +82 -0
  199. package/dist/url.d.ts +82 -0
  200. package/dist/url.js +44 -0
  201. package/dist/url.js.map +1 -0
  202. package/dist/url.mjs +3 -0
  203. package/dist/url.mjs.map +1 -0
  204. package/dist/validation.d.mts +83 -0
  205. package/dist/validation.d.ts +83 -0
  206. package/dist/validation.js +60 -0
  207. package/dist/validation.js.map +1 -0
  208. package/dist/validation.mjs +3 -0
  209. package/dist/validation.mjs.map +1 -0
  210. 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,3 @@
1
+ export { binarySearch, bubbleSort, factorial, fibonacci, fibonacciSequence, gcd, lcm, mergeSort, quickSort } from './chunk-JHZ7M2MR.mjs';
2
+ //# sourceMappingURL=algorithm.mjs.map
3
+ //# sourceMappingURL=algorithm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"algorithm.mjs"}
@@ -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 };