@alibarbar/common 1.0.9 → 1.1.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 (185) hide show
  1. package/dist/{chunk-O3O67R4I.js → algorithm.cjs} +1 -3
  2. package/dist/algorithm.js +130 -44
  3. package/dist/{chunk-LOAZSPGQ.js → array.cjs} +1 -3
  4. package/dist/array.js +135 -84
  5. package/dist/{chunk-Y364QIQH.js → color.cjs} +1 -3
  6. package/dist/color.js +127 -40
  7. package/dist/{chunk-DYBSRI7V.js → crypto.cjs} +109 -3
  8. package/dist/crypto.d.mts +48 -1
  9. package/dist/crypto.d.ts +48 -1
  10. package/dist/crypto.js +274 -60
  11. package/dist/{chunk-BHCRFURU.js → data-structure.cjs} +1 -3
  12. package/dist/data-structure.js +481 -32
  13. package/dist/{chunk-I3L42475.js → date.cjs} +1 -3
  14. package/dist/date.js +125 -72
  15. package/dist/{chunk-JK2SE3I2.js → dom.cjs} +1 -3
  16. package/dist/dom.js +84 -56
  17. package/dist/{chunk-7V5UQXIO.js → file.cjs} +1 -3
  18. package/dist/file.js +79 -32
  19. package/dist/{chunk-OX5PLOWB.js → i18n.cjs} +1 -3
  20. package/dist/i18n.js +78 -40
  21. package/dist/index.cjs +4543 -0
  22. package/dist/index.d.mts +6 -162
  23. package/dist/index.d.ts +6 -162
  24. package/dist/index.js +3712 -17374
  25. package/dist/{chunk-4RGXV4SJ.js → network.cjs} +1 -3
  26. package/dist/network.js +97 -28
  27. package/dist/{chunk-3FRYJPHG.js → number.cjs} +1 -3
  28. package/dist/number.js +77 -56
  29. package/dist/{chunk-27UDDVLZ.js → object.cjs} +1 -3
  30. package/dist/object.js +237 -80
  31. package/dist/{chunk-JQZBPAPO.js → performance.cjs} +1 -3
  32. package/dist/performance.js +145 -40
  33. package/dist/services.cjs +291 -0
  34. package/dist/services.d.mts +161 -0
  35. package/dist/services.d.ts +161 -0
  36. package/dist/services.js +281 -0
  37. package/dist/storage.cjs +943 -0
  38. package/dist/storage.d.mts +46 -1
  39. package/dist/storage.d.ts +46 -1
  40. package/dist/storage.js +930 -32
  41. package/dist/{chunk-D7CS5EKF.js → string.cjs} +1 -3
  42. package/dist/string.js +91 -68
  43. package/dist/{chunk-56W6YECK.js → tracking.cjs} +1 -3
  44. package/dist/tracking.js +359 -52
  45. package/dist/{chunk-ZDMFMUDR.js → transform.cjs} +1 -3
  46. package/dist/transform.js +299 -32
  47. package/dist/{chunk-NJARVI6X.mjs → upload.cjs} +42 -15
  48. package/dist/upload.d.mts +1 -1
  49. package/dist/upload.d.ts +1 -1
  50. package/dist/upload.js +402 -20
  51. package/dist/{chunk-KGFTD255.js → url.cjs} +1 -3
  52. package/dist/url.js +91 -44
  53. package/dist/{chunk-TQN37HIN.js → validation.cjs} +1 -3
  54. package/dist/validation.js +77 -60
  55. package/package.json +7 -2
  56. package/dist/algorithm.js.map +0 -1
  57. package/dist/algorithm.mjs +0 -4
  58. package/dist/algorithm.mjs.map +0 -1
  59. package/dist/array.js.map +0 -1
  60. package/dist/array.mjs +0 -4
  61. package/dist/array.mjs.map +0 -1
  62. package/dist/chunk-27UDDVLZ.js.map +0 -1
  63. package/dist/chunk-2R2QWFJC.mjs +0 -138
  64. package/dist/chunk-2R2QWFJC.mjs.map +0 -1
  65. package/dist/chunk-3FRYJPHG.js.map +0 -1
  66. package/dist/chunk-4RGXV4SJ.js.map +0 -1
  67. package/dist/chunk-56W6YECK.js.map +0 -1
  68. package/dist/chunk-5BGSUGTI.mjs +0 -128
  69. package/dist/chunk-5BGSUGTI.mjs.map +0 -1
  70. package/dist/chunk-7E6GELHJ.mjs +0 -302
  71. package/dist/chunk-7E6GELHJ.mjs.map +0 -1
  72. package/dist/chunk-7V5UQXIO.js.map +0 -1
  73. package/dist/chunk-A4SWQXX7.mjs +0 -484
  74. package/dist/chunk-A4SWQXX7.mjs.map +0 -1
  75. package/dist/chunk-BHCRFURU.js.map +0 -1
  76. package/dist/chunk-CDSGEAOK.mjs +0 -80
  77. package/dist/chunk-CDSGEAOK.mjs.map +0 -1
  78. package/dist/chunk-D7CS5EKF.js.map +0 -1
  79. package/dist/chunk-DYBSRI7V.js.map +0 -1
  80. package/dist/chunk-FEBKPX5A.js +0 -386
  81. package/dist/chunk-FEBKPX5A.js.map +0 -1
  82. package/dist/chunk-FJ6ZGZIA.mjs +0 -39
  83. package/dist/chunk-FJ6ZGZIA.mjs.map +0 -1
  84. package/dist/chunk-HLDFI7R2.mjs +0 -175
  85. package/dist/chunk-HLDFI7R2.mjs.map +0 -1
  86. package/dist/chunk-I3L42475.js.map +0 -1
  87. package/dist/chunk-JBLX27WD.mjs +0 -240
  88. package/dist/chunk-JBLX27WD.mjs.map +0 -1
  89. package/dist/chunk-JHZ7M2MR.mjs +0 -133
  90. package/dist/chunk-JHZ7M2MR.mjs.map +0 -1
  91. package/dist/chunk-JK2SE3I2.js.map +0 -1
  92. package/dist/chunk-JQZBPAPO.js.map +0 -1
  93. package/dist/chunk-JXYGC2C5.mjs +0 -100
  94. package/dist/chunk-JXYGC2C5.mjs.map +0 -1
  95. package/dist/chunk-KGFTD255.js.map +0 -1
  96. package/dist/chunk-LBHBNPNJ.mjs +0 -148
  97. package/dist/chunk-LBHBNPNJ.mjs.map +0 -1
  98. package/dist/chunk-LF4CILQS.mjs +0 -87
  99. package/dist/chunk-LF4CILQS.mjs.map +0 -1
  100. package/dist/chunk-LOAZSPGQ.js.map +0 -1
  101. package/dist/chunk-NJARVI6X.mjs.map +0 -1
  102. package/dist/chunk-NSSDYX2U.mjs +0 -80
  103. package/dist/chunk-NSSDYX2U.mjs.map +0 -1
  104. package/dist/chunk-O3O67R4I.js.map +0 -1
  105. package/dist/chunk-OIXQ3E6W.mjs +0 -354
  106. package/dist/chunk-OIXQ3E6W.mjs.map +0 -1
  107. package/dist/chunk-OX5PLOWB.js.map +0 -1
  108. package/dist/chunk-PJ7UCTX4.mjs +0 -362
  109. package/dist/chunk-PJ7UCTX4.mjs.map +0 -1
  110. package/dist/chunk-PR4QN5HX.js +0 -44
  111. package/dist/chunk-PR4QN5HX.js.map +0 -1
  112. package/dist/chunk-QIBE7GVN.mjs +0 -81
  113. package/dist/chunk-QIBE7GVN.mjs.map +0 -1
  114. package/dist/chunk-QIOC54LQ.mjs +0 -130
  115. package/dist/chunk-QIOC54LQ.mjs.map +0 -1
  116. package/dist/chunk-TQN37HIN.js.map +0 -1
  117. package/dist/chunk-WZDOPUJW.js +0 -361
  118. package/dist/chunk-WZDOPUJW.js.map +0 -1
  119. package/dist/chunk-XJTZDXSR.mjs +0 -94
  120. package/dist/chunk-XJTZDXSR.mjs.map +0 -1
  121. package/dist/chunk-Y364QIQH.js.map +0 -1
  122. package/dist/chunk-YXM6Q4JS.mjs +0 -94
  123. package/dist/chunk-YXM6Q4JS.mjs.map +0 -1
  124. package/dist/chunk-ZDMFMUDR.js.map +0 -1
  125. package/dist/chunk-ZVJ6NQUM.mjs +0 -82
  126. package/dist/chunk-ZVJ6NQUM.mjs.map +0 -1
  127. package/dist/color.js.map +0 -1
  128. package/dist/color.mjs +0 -4
  129. package/dist/color.mjs.map +0 -1
  130. package/dist/crypto.js.map +0 -1
  131. package/dist/crypto.mjs +0 -4
  132. package/dist/crypto.mjs.map +0 -1
  133. package/dist/data-structure.js.map +0 -1
  134. package/dist/data-structure.mjs +0 -4
  135. package/dist/data-structure.mjs.map +0 -1
  136. package/dist/date.js.map +0 -1
  137. package/dist/date.mjs +0 -4
  138. package/dist/date.mjs.map +0 -1
  139. package/dist/dom.js.map +0 -1
  140. package/dist/dom.mjs +0 -4
  141. package/dist/dom.mjs.map +0 -1
  142. package/dist/file.js.map +0 -1
  143. package/dist/file.mjs +0 -4
  144. package/dist/file.mjs.map +0 -1
  145. package/dist/i18n.js.map +0 -1
  146. package/dist/i18n.mjs +0 -4
  147. package/dist/i18n.mjs.map +0 -1
  148. package/dist/index.js.map +0 -1
  149. package/dist/index.mjs +0 -17155
  150. package/dist/index.mjs.map +0 -1
  151. package/dist/network.js.map +0 -1
  152. package/dist/network.mjs +0 -4
  153. package/dist/network.mjs.map +0 -1
  154. package/dist/number.js.map +0 -1
  155. package/dist/number.mjs +0 -4
  156. package/dist/number.mjs.map +0 -1
  157. package/dist/object.js.map +0 -1
  158. package/dist/object.mjs +0 -4
  159. package/dist/object.mjs.map +0 -1
  160. package/dist/performance.js.map +0 -1
  161. package/dist/performance.mjs +0 -4
  162. package/dist/performance.mjs.map +0 -1
  163. package/dist/storage.js.map +0 -1
  164. package/dist/storage.mjs +0 -5
  165. package/dist/storage.mjs.map +0 -1
  166. package/dist/string.js.map +0 -1
  167. package/dist/string.mjs +0 -4
  168. package/dist/string.mjs.map +0 -1
  169. package/dist/tracking.js.map +0 -1
  170. package/dist/tracking.mjs +0 -4
  171. package/dist/tracking.mjs.map +0 -1
  172. package/dist/transform.js.map +0 -1
  173. package/dist/transform.mjs +0 -4
  174. package/dist/transform.mjs.map +0 -1
  175. package/dist/upload.js.map +0 -1
  176. package/dist/upload.mjs +0 -5
  177. package/dist/upload.mjs.map +0 -1
  178. package/dist/url.js.map +0 -1
  179. package/dist/url.mjs +0 -4
  180. package/dist/url.mjs.map +0 -1
  181. package/dist/validation.js.map +0 -1
  182. package/dist/validation.mjs +0 -4
  183. package/dist/validation.mjs.map +0 -1
  184. /package/dist/{upload-DchqyDBQ.d.mts → index-DchqyDBQ.d.mts} +0 -0
  185. /package/dist/{upload-DchqyDBQ.d.ts → index-DchqyDBQ.d.ts} +0 -0
@@ -1,484 +0,0 @@
1
- // src/data/data-structure.ts
2
- var Stack = class {
3
- constructor() {
4
- this.items = [];
5
- }
6
- /**
7
- * 入栈
8
- */
9
- push(item) {
10
- this.items.push(item);
11
- }
12
- /**
13
- * 出栈
14
- */
15
- pop() {
16
- return this.items.pop();
17
- }
18
- /**
19
- * 查看栈顶元素
20
- */
21
- peek() {
22
- return this.items[this.items.length - 1];
23
- }
24
- /**
25
- * 判断栈是否为空
26
- */
27
- isEmpty() {
28
- return this.items.length === 0;
29
- }
30
- /**
31
- * 获取栈的大小
32
- */
33
- size() {
34
- return this.items.length;
35
- }
36
- /**
37
- * 清空栈
38
- */
39
- clear() {
40
- this.items = [];
41
- }
42
- /**
43
- * 转换为数组
44
- */
45
- toArray() {
46
- return [...this.items];
47
- }
48
- };
49
- var DataQueue = class {
50
- constructor() {
51
- this.items = [];
52
- }
53
- /**
54
- * 入队
55
- */
56
- enqueue(item) {
57
- this.items.push(item);
58
- }
59
- /**
60
- * 出队
61
- */
62
- dequeue() {
63
- return this.items.shift();
64
- }
65
- /**
66
- * 查看队首元素
67
- */
68
- front() {
69
- return this.items[0];
70
- }
71
- /**
72
- * 判断队列是否为空
73
- */
74
- isEmpty() {
75
- return this.items.length === 0;
76
- }
77
- /**
78
- * 获取队列的大小
79
- */
80
- size() {
81
- return this.items.length;
82
- }
83
- /**
84
- * 清空队列
85
- */
86
- clear() {
87
- this.items = [];
88
- }
89
- /**
90
- * 转换为数组
91
- */
92
- toArray() {
93
- return [...this.items];
94
- }
95
- };
96
- var ListNode = class {
97
- constructor(value) {
98
- this.next = null;
99
- this.value = value;
100
- }
101
- };
102
- var LinkedList = class {
103
- constructor() {
104
- this.head = null;
105
- this.length = 0;
106
- }
107
- /**
108
- * 在链表末尾添加元素
109
- */
110
- append(value) {
111
- const newNode = new ListNode(value);
112
- if (!this.head) {
113
- this.head = newNode;
114
- } else {
115
- let current = this.head;
116
- while (current.next) {
117
- current = current.next;
118
- }
119
- current.next = newNode;
120
- }
121
- this.length++;
122
- }
123
- /**
124
- * 在指定位置插入元素
125
- */
126
- insert(index, value) {
127
- if (index < 0 || index > this.length) {
128
- return false;
129
- }
130
- const newNode = new ListNode(value);
131
- if (index === 0) {
132
- newNode.next = this.head;
133
- this.head = newNode;
134
- } else {
135
- let current = this.head;
136
- for (let i = 0; i < index - 1; i++) {
137
- current = current.next;
138
- }
139
- newNode.next = current.next;
140
- current.next = newNode;
141
- }
142
- this.length++;
143
- return true;
144
- }
145
- /**
146
- * 删除指定位置的元素
147
- */
148
- removeAt(index) {
149
- if (index < 0 || index >= this.length || !this.head) {
150
- return null;
151
- }
152
- let current = this.head;
153
- if (index === 0) {
154
- this.head = current.next;
155
- this.length--;
156
- return current.value;
157
- }
158
- for (let i = 0; i < index - 1; i++) {
159
- current = current.next;
160
- }
161
- const removed = current.next;
162
- current.next = removed.next;
163
- this.length--;
164
- return removed.value;
165
- }
166
- /**
167
- * 查找元素索引
168
- */
169
- indexOf(value) {
170
- let current = this.head;
171
- let index = 0;
172
- while (current) {
173
- if (current.value === value) {
174
- return index;
175
- }
176
- current = current.next;
177
- index++;
178
- }
179
- return -1;
180
- }
181
- /**
182
- * 获取指定位置的元素
183
- */
184
- get(index) {
185
- if (index < 0 || index >= this.length || !this.head) {
186
- return null;
187
- }
188
- let current = this.head;
189
- for (let i = 0; i < index; i++) {
190
- current = current.next;
191
- }
192
- return current.value;
193
- }
194
- /**
195
- * 判断链表是否为空
196
- */
197
- isEmpty() {
198
- return this.length === 0;
199
- }
200
- /**
201
- * 获取链表长度
202
- */
203
- size() {
204
- return this.length;
205
- }
206
- /**
207
- * 转换为数组
208
- */
209
- toArray() {
210
- const result = [];
211
- let current = this.head;
212
- while (current) {
213
- result.push(current.value);
214
- current = current.next;
215
- }
216
- return result;
217
- }
218
- };
219
- var TreeNode = class {
220
- constructor(value) {
221
- this.left = null;
222
- this.right = null;
223
- this.value = value;
224
- }
225
- };
226
- var BinaryTree = class {
227
- constructor() {
228
- this.root = null;
229
- }
230
- /**
231
- * 插入节点
232
- */
233
- insert(value) {
234
- const newNode = new TreeNode(value);
235
- if (!this.root) {
236
- this.root = newNode;
237
- return;
238
- }
239
- this.insertNode(this.root, newNode);
240
- }
241
- insertNode(node, newNode) {
242
- if (newNode.value <= node.value) {
243
- if (!node.left) {
244
- node.left = newNode;
245
- } else {
246
- this.insertNode(node.left, newNode);
247
- }
248
- } else {
249
- if (!node.right) {
250
- node.right = newNode;
251
- } else {
252
- this.insertNode(node.right, newNode);
253
- }
254
- }
255
- }
256
- /**
257
- * 查找节点
258
- */
259
- search(value) {
260
- return this.searchNode(this.root, value);
261
- }
262
- searchNode(node, value) {
263
- if (!node) {
264
- return false;
265
- }
266
- if (value === node.value) {
267
- return true;
268
- }
269
- if (value < node.value) {
270
- return this.searchNode(node.left, value);
271
- }
272
- return this.searchNode(node.right, value);
273
- }
274
- /**
275
- * 中序遍历
276
- */
277
- inOrder() {
278
- const result = [];
279
- this.inOrderTraverse(this.root, result);
280
- return result;
281
- }
282
- inOrderTraverse(node, result) {
283
- if (node) {
284
- this.inOrderTraverse(node.left, result);
285
- result.push(node.value);
286
- this.inOrderTraverse(node.right, result);
287
- }
288
- }
289
- /**
290
- * 前序遍历
291
- */
292
- preOrder() {
293
- const result = [];
294
- this.preOrderTraverse(this.root, result);
295
- return result;
296
- }
297
- preOrderTraverse(node, result) {
298
- if (node) {
299
- result.push(node.value);
300
- this.preOrderTraverse(node.left, result);
301
- this.preOrderTraverse(node.right, result);
302
- }
303
- }
304
- /**
305
- * 后序遍历
306
- */
307
- postOrder() {
308
- const result = [];
309
- this.postOrderTraverse(this.root, result);
310
- return result;
311
- }
312
- postOrderTraverse(node, result) {
313
- if (node) {
314
- this.postOrderTraverse(node.left, result);
315
- this.postOrderTraverse(node.right, result);
316
- result.push(node.value);
317
- }
318
- }
319
- };
320
- var Graph = class {
321
- constructor() {
322
- this.vertices = /* @__PURE__ */ new Map();
323
- }
324
- /**
325
- * 添加顶点
326
- */
327
- addVertex(vertex) {
328
- if (!this.vertices.has(vertex)) {
329
- this.vertices.set(vertex, []);
330
- }
331
- }
332
- /**
333
- * 添加边(无向图)
334
- */
335
- addEdge(vertex1, vertex2) {
336
- if (!this.vertices.has(vertex1)) {
337
- this.addVertex(vertex1);
338
- }
339
- if (!this.vertices.has(vertex2)) {
340
- this.addVertex(vertex2);
341
- }
342
- const neighbors1 = this.vertices.get(vertex1);
343
- const neighbors2 = this.vertices.get(vertex2);
344
- if (!neighbors1.includes(vertex2)) {
345
- neighbors1.push(vertex2);
346
- }
347
- if (!neighbors2.includes(vertex1)) {
348
- neighbors2.push(vertex1);
349
- }
350
- }
351
- /**
352
- * 获取顶点的邻居
353
- */
354
- getNeighbors(vertex) {
355
- return this.vertices.get(vertex) || [];
356
- }
357
- /**
358
- * 深度优先搜索
359
- */
360
- dfs(start, callback) {
361
- const visited = /* @__PURE__ */ new Set();
362
- const result = [];
363
- const dfsVisit = (vertex) => {
364
- visited.add(vertex);
365
- result.push(vertex);
366
- if (callback) {
367
- callback(vertex);
368
- }
369
- const neighbors = this.getNeighbors(vertex);
370
- for (const neighbor of neighbors) {
371
- if (!visited.has(neighbor)) {
372
- dfsVisit(neighbor);
373
- }
374
- }
375
- };
376
- dfsVisit(start);
377
- return result;
378
- }
379
- /**
380
- * 广度优先搜索
381
- */
382
- bfs(start, callback) {
383
- const visited = /* @__PURE__ */ new Set();
384
- const queue = [start];
385
- const result = [];
386
- visited.add(start);
387
- while (queue.length > 0) {
388
- const vertex = queue.shift();
389
- result.push(vertex);
390
- if (callback) {
391
- callback(vertex);
392
- }
393
- const neighbors = this.getNeighbors(vertex);
394
- for (const neighbor of neighbors) {
395
- if (!visited.has(neighbor)) {
396
- visited.add(neighbor);
397
- queue.push(neighbor);
398
- }
399
- }
400
- }
401
- return result;
402
- }
403
- /**
404
- * 获取所有顶点
405
- */
406
- getVertices() {
407
- return Array.from(this.vertices.keys());
408
- }
409
- };
410
- var LRUCache = class {
411
- constructor(capacity) {
412
- if (capacity <= 0) {
413
- throw new Error("Capacity must be greater than 0");
414
- }
415
- this.capacity = capacity;
416
- this.cache = /* @__PURE__ */ new Map();
417
- }
418
- /**
419
- * 获取值
420
- */
421
- get(key) {
422
- if (!this.cache.has(key)) {
423
- return void 0;
424
- }
425
- const value = this.cache.get(key);
426
- this.cache.delete(key);
427
- this.cache.set(key, value);
428
- return value;
429
- }
430
- /**
431
- * 设置值
432
- */
433
- set(key, value) {
434
- if (this.cache.has(key)) {
435
- this.cache.delete(key);
436
- } else if (this.cache.size >= this.capacity) {
437
- const firstKey = this.cache.keys().next().value;
438
- if (firstKey !== void 0) {
439
- this.cache.delete(firstKey);
440
- }
441
- }
442
- this.cache.set(key, value);
443
- }
444
- /**
445
- * 删除键
446
- */
447
- delete(key) {
448
- return this.cache.delete(key);
449
- }
450
- /**
451
- * 清空缓存
452
- */
453
- clear() {
454
- this.cache.clear();
455
- }
456
- /**
457
- * 判断是否包含键
458
- */
459
- has(key) {
460
- return this.cache.has(key);
461
- }
462
- /**
463
- * 获取缓存大小
464
- */
465
- size() {
466
- return this.cache.size;
467
- }
468
- /**
469
- * 获取所有键
470
- */
471
- keys() {
472
- return Array.from(this.cache.keys()).filter((key) => key !== void 0);
473
- }
474
- /**
475
- * 获取所有值
476
- */
477
- values() {
478
- return Array.from(this.cache.values());
479
- }
480
- };
481
-
482
- export { BinaryTree, DataQueue, Graph, LRUCache, LinkedList, Stack };
483
- //# sourceMappingURL=chunk-A4SWQXX7.mjs.map
484
- //# sourceMappingURL=chunk-A4SWQXX7.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/data-structure.ts"],"names":[],"mappings":"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","file":"chunk-A4SWQXX7.mjs","sourcesContent":["/**\n * 数据结构工具\n */\n\n/**\n * 栈实现\n */\nexport class Stack<T> {\n private items: T[] = [];\n\n /**\n * 入栈\n */\n push(item: T): void {\n this.items.push(item);\n }\n\n /**\n * 出栈\n */\n pop(): T | undefined {\n return this.items.pop();\n }\n\n /**\n * 查看栈顶元素\n */\n peek(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n /**\n * 判断栈是否为空\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * 获取栈的大小\n */\n size(): number {\n return this.items.length;\n }\n\n /**\n * 清空栈\n */\n clear(): void {\n this.items = [];\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * 队列实现(数据结构版本,与performance.Queue区分)\n */\nexport class DataQueue<T> {\n private items: T[] = [];\n\n /**\n * 入队\n */\n enqueue(item: T): void {\n this.items.push(item);\n }\n\n /**\n * 出队\n */\n dequeue(): T | undefined {\n return this.items.shift();\n }\n\n /**\n * 查看队首元素\n */\n front(): T | undefined {\n return this.items[0];\n }\n\n /**\n * 判断队列是否为空\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * 获取队列的大小\n */\n size(): number {\n return this.items.length;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.items = [];\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * 链表节点\n */\nclass ListNode<T> {\n value: T;\n next: ListNode<T> | null = null;\n\n constructor(value: T) {\n this.value = value;\n }\n}\n\n/**\n * 链表实现\n */\nexport class LinkedList<T> {\n private head: ListNode<T> | null = null;\n private length = 0;\n\n /**\n * 在链表末尾添加元素\n */\n append(value: T): void {\n const newNode = new ListNode(value);\n\n if (!this.head) {\n this.head = newNode;\n } else {\n let current = this.head;\n while (current.next) {\n current = current.next;\n }\n current.next = newNode;\n }\n\n this.length++;\n }\n\n /**\n * 在指定位置插入元素\n */\n insert(index: number, value: T): boolean {\n if (index < 0 || index > this.length) {\n return false;\n }\n\n const newNode = new ListNode(value);\n\n if (index === 0) {\n newNode.next = this.head;\n this.head = newNode;\n } else {\n let current = this.head;\n for (let i = 0; i < index - 1; i++) {\n current = current!.next;\n }\n newNode.next = current!.next;\n current!.next = newNode;\n }\n\n this.length++;\n return true;\n }\n\n /**\n * 删除指定位置的元素\n */\n removeAt(index: number): T | null {\n if (index < 0 || index >= this.length || !this.head) {\n return null;\n }\n\n let current = this.head;\n\n if (index === 0) {\n this.head = current.next;\n this.length--;\n return current.value;\n }\n\n for (let i = 0; i < index - 1; i++) {\n current = current.next!;\n }\n\n const removed = current.next!;\n current.next = removed.next;\n this.length--;\n\n return removed.value;\n }\n\n /**\n * 查找元素索引\n */\n indexOf(value: T): number {\n let current = this.head;\n let index = 0;\n\n while (current) {\n if (current.value === value) {\n return index;\n }\n current = current.next;\n index++;\n }\n\n return -1;\n }\n\n /**\n * 获取指定位置的元素\n */\n get(index: number): T | null {\n if (index < 0 || index >= this.length || !this.head) {\n return null;\n }\n\n let current = this.head;\n for (let i = 0; i < index; i++) {\n current = current.next!;\n }\n\n return current.value;\n }\n\n /**\n * 判断链表是否为空\n */\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * 获取链表长度\n */\n size(): number {\n return this.length;\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n const result: T[] = [];\n let current = this.head;\n\n while (current) {\n result.push(current.value);\n current = current.next;\n }\n\n return result;\n }\n}\n\n/**\n * 二叉树节点\n */\nclass TreeNode<T> {\n value: T;\n left: TreeNode<T> | null = null;\n right: TreeNode<T> | null = null;\n\n constructor(value: T) {\n this.value = value;\n }\n}\n\n/**\n * 二叉树实现\n */\nexport class BinaryTree<T> {\n private root: TreeNode<T> | null = null;\n\n /**\n * 插入节点\n */\n insert(value: T): void {\n const newNode = new TreeNode(value);\n\n if (!this.root) {\n this.root = newNode;\n return;\n }\n\n this.insertNode(this.root, newNode);\n }\n\n private insertNode(node: TreeNode<T>, newNode: TreeNode<T>): void {\n // 简单实现:小于等于的放左边,大于的放右边\n if (newNode.value <= node.value) {\n if (!node.left) {\n node.left = newNode;\n } else {\n this.insertNode(node.left, newNode);\n }\n } else {\n if (!node.right) {\n node.right = newNode;\n } else {\n this.insertNode(node.right, newNode);\n }\n }\n }\n\n /**\n * 查找节点\n */\n search(value: T): boolean {\n return this.searchNode(this.root, value);\n }\n\n private searchNode(node: TreeNode<T> | null, value: T): boolean {\n if (!node) {\n return false;\n }\n\n if (value === node.value) {\n return true;\n }\n\n if (value < node.value) {\n return this.searchNode(node.left, value);\n }\n\n return this.searchNode(node.right, value);\n }\n\n /**\n * 中序遍历\n */\n inOrder(): T[] {\n const result: T[] = [];\n this.inOrderTraverse(this.root, result);\n return result;\n }\n\n private inOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n this.inOrderTraverse(node.left, result);\n result.push(node.value);\n this.inOrderTraverse(node.right, result);\n }\n }\n\n /**\n * 前序遍历\n */\n preOrder(): T[] {\n const result: T[] = [];\n this.preOrderTraverse(this.root, result);\n return result;\n }\n\n private preOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n result.push(node.value);\n this.preOrderTraverse(node.left, result);\n this.preOrderTraverse(node.right, result);\n }\n }\n\n /**\n * 后序遍历\n */\n postOrder(): T[] {\n const result: T[] = [];\n this.postOrderTraverse(this.root, result);\n return result;\n }\n\n private postOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n this.postOrderTraverse(node.left, result);\n this.postOrderTraverse(node.right, result);\n result.push(node.value);\n }\n }\n}\n\n/**\n * 图实现(邻接表)\n */\nexport class Graph<T> {\n private vertices: Map<T, T[]> = new Map();\n\n /**\n * 添加顶点\n */\n addVertex(vertex: T): void {\n if (!this.vertices.has(vertex)) {\n this.vertices.set(vertex, []);\n }\n }\n\n /**\n * 添加边(无向图)\n */\n addEdge(vertex1: T, vertex2: T): void {\n if (!this.vertices.has(vertex1)) {\n this.addVertex(vertex1);\n }\n if (!this.vertices.has(vertex2)) {\n this.addVertex(vertex2);\n }\n\n const neighbors1 = this.vertices.get(vertex1)!;\n const neighbors2 = this.vertices.get(vertex2)!;\n\n if (!neighbors1.includes(vertex2)) {\n neighbors1.push(vertex2);\n }\n if (!neighbors2.includes(vertex1)) {\n neighbors2.push(vertex1);\n }\n }\n\n /**\n * 获取顶点的邻居\n */\n getNeighbors(vertex: T): T[] {\n return this.vertices.get(vertex) || [];\n }\n\n /**\n * 深度优先搜索\n */\n dfs(start: T, callback?: (vertex: T) => void): T[] {\n const visited = new Set<T>();\n const result: T[] = [];\n\n const dfsVisit = (vertex: T): void => {\n visited.add(vertex);\n result.push(vertex);\n if (callback) {\n callback(vertex);\n }\n\n const neighbors = this.getNeighbors(vertex);\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n dfsVisit(neighbor);\n }\n }\n };\n\n dfsVisit(start);\n return result;\n }\n\n /**\n * 广度优先搜索\n */\n bfs(start: T, callback?: (vertex: T) => void): T[] {\n const visited = new Set<T>();\n const queue: T[] = [start];\n const result: T[] = [];\n\n visited.add(start);\n\n while (queue.length > 0) {\n const vertex = queue.shift()!;\n result.push(vertex);\n if (callback) {\n callback(vertex);\n }\n\n const neighbors = this.getNeighbors(vertex);\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return result;\n }\n\n /**\n * 获取所有顶点\n */\n getVertices(): T[] {\n return Array.from(this.vertices.keys());\n }\n}\n\n/**\n * LRU缓存实现\n */\nexport class LRUCache<K, V> {\n private capacity: number;\n private cache: Map<K, V>;\n\n constructor(capacity: number) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this.capacity = capacity;\n this.cache = new Map();\n }\n\n /**\n * 获取值\n */\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n // 将访问的键移到末尾(最近使用)\n const value = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, value);\n\n return value;\n }\n\n /**\n * 设置值\n */\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新现有键,移到末尾\n this.cache.delete(key);\n } else if (this.cache.size >= this.capacity) {\n // 删除最久未使用的键(第一个)\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, value);\n }\n\n /**\n * 删除键\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * 清空缓存\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * 判断是否包含键\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * 获取缓存大小\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * 获取所有键\n */\n keys(): K[] {\n return Array.from(this.cache.keys()).filter((key): key is K => key !== undefined);\n }\n\n /**\n * 获取所有值\n */\n values(): V[] {\n return Array.from(this.cache.values());\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/data-structure.ts"],"names":[],"mappings":"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","file":"chunk-BHCRFURU.js","sourcesContent":["/**\n * 数据结构工具\n */\n\n/**\n * 栈实现\n */\nexport class Stack<T> {\n private items: T[] = [];\n\n /**\n * 入栈\n */\n push(item: T): void {\n this.items.push(item);\n }\n\n /**\n * 出栈\n */\n pop(): T | undefined {\n return this.items.pop();\n }\n\n /**\n * 查看栈顶元素\n */\n peek(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n /**\n * 判断栈是否为空\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * 获取栈的大小\n */\n size(): number {\n return this.items.length;\n }\n\n /**\n * 清空栈\n */\n clear(): void {\n this.items = [];\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * 队列实现(数据结构版本,与performance.Queue区分)\n */\nexport class DataQueue<T> {\n private items: T[] = [];\n\n /**\n * 入队\n */\n enqueue(item: T): void {\n this.items.push(item);\n }\n\n /**\n * 出队\n */\n dequeue(): T | undefined {\n return this.items.shift();\n }\n\n /**\n * 查看队首元素\n */\n front(): T | undefined {\n return this.items[0];\n }\n\n /**\n * 判断队列是否为空\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * 获取队列的大小\n */\n size(): number {\n return this.items.length;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.items = [];\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * 链表节点\n */\nclass ListNode<T> {\n value: T;\n next: ListNode<T> | null = null;\n\n constructor(value: T) {\n this.value = value;\n }\n}\n\n/**\n * 链表实现\n */\nexport class LinkedList<T> {\n private head: ListNode<T> | null = null;\n private length = 0;\n\n /**\n * 在链表末尾添加元素\n */\n append(value: T): void {\n const newNode = new ListNode(value);\n\n if (!this.head) {\n this.head = newNode;\n } else {\n let current = this.head;\n while (current.next) {\n current = current.next;\n }\n current.next = newNode;\n }\n\n this.length++;\n }\n\n /**\n * 在指定位置插入元素\n */\n insert(index: number, value: T): boolean {\n if (index < 0 || index > this.length) {\n return false;\n }\n\n const newNode = new ListNode(value);\n\n if (index === 0) {\n newNode.next = this.head;\n this.head = newNode;\n } else {\n let current = this.head;\n for (let i = 0; i < index - 1; i++) {\n current = current!.next;\n }\n newNode.next = current!.next;\n current!.next = newNode;\n }\n\n this.length++;\n return true;\n }\n\n /**\n * 删除指定位置的元素\n */\n removeAt(index: number): T | null {\n if (index < 0 || index >= this.length || !this.head) {\n return null;\n }\n\n let current = this.head;\n\n if (index === 0) {\n this.head = current.next;\n this.length--;\n return current.value;\n }\n\n for (let i = 0; i < index - 1; i++) {\n current = current.next!;\n }\n\n const removed = current.next!;\n current.next = removed.next;\n this.length--;\n\n return removed.value;\n }\n\n /**\n * 查找元素索引\n */\n indexOf(value: T): number {\n let current = this.head;\n let index = 0;\n\n while (current) {\n if (current.value === value) {\n return index;\n }\n current = current.next;\n index++;\n }\n\n return -1;\n }\n\n /**\n * 获取指定位置的元素\n */\n get(index: number): T | null {\n if (index < 0 || index >= this.length || !this.head) {\n return null;\n }\n\n let current = this.head;\n for (let i = 0; i < index; i++) {\n current = current.next!;\n }\n\n return current.value;\n }\n\n /**\n * 判断链表是否为空\n */\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * 获取链表长度\n */\n size(): number {\n return this.length;\n }\n\n /**\n * 转换为数组\n */\n toArray(): T[] {\n const result: T[] = [];\n let current = this.head;\n\n while (current) {\n result.push(current.value);\n current = current.next;\n }\n\n return result;\n }\n}\n\n/**\n * 二叉树节点\n */\nclass TreeNode<T> {\n value: T;\n left: TreeNode<T> | null = null;\n right: TreeNode<T> | null = null;\n\n constructor(value: T) {\n this.value = value;\n }\n}\n\n/**\n * 二叉树实现\n */\nexport class BinaryTree<T> {\n private root: TreeNode<T> | null = null;\n\n /**\n * 插入节点\n */\n insert(value: T): void {\n const newNode = new TreeNode(value);\n\n if (!this.root) {\n this.root = newNode;\n return;\n }\n\n this.insertNode(this.root, newNode);\n }\n\n private insertNode(node: TreeNode<T>, newNode: TreeNode<T>): void {\n // 简单实现:小于等于的放左边,大于的放右边\n if (newNode.value <= node.value) {\n if (!node.left) {\n node.left = newNode;\n } else {\n this.insertNode(node.left, newNode);\n }\n } else {\n if (!node.right) {\n node.right = newNode;\n } else {\n this.insertNode(node.right, newNode);\n }\n }\n }\n\n /**\n * 查找节点\n */\n search(value: T): boolean {\n return this.searchNode(this.root, value);\n }\n\n private searchNode(node: TreeNode<T> | null, value: T): boolean {\n if (!node) {\n return false;\n }\n\n if (value === node.value) {\n return true;\n }\n\n if (value < node.value) {\n return this.searchNode(node.left, value);\n }\n\n return this.searchNode(node.right, value);\n }\n\n /**\n * 中序遍历\n */\n inOrder(): T[] {\n const result: T[] = [];\n this.inOrderTraverse(this.root, result);\n return result;\n }\n\n private inOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n this.inOrderTraverse(node.left, result);\n result.push(node.value);\n this.inOrderTraverse(node.right, result);\n }\n }\n\n /**\n * 前序遍历\n */\n preOrder(): T[] {\n const result: T[] = [];\n this.preOrderTraverse(this.root, result);\n return result;\n }\n\n private preOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n result.push(node.value);\n this.preOrderTraverse(node.left, result);\n this.preOrderTraverse(node.right, result);\n }\n }\n\n /**\n * 后序遍历\n */\n postOrder(): T[] {\n const result: T[] = [];\n this.postOrderTraverse(this.root, result);\n return result;\n }\n\n private postOrderTraverse(node: TreeNode<T> | null, result: T[]): void {\n if (node) {\n this.postOrderTraverse(node.left, result);\n this.postOrderTraverse(node.right, result);\n result.push(node.value);\n }\n }\n}\n\n/**\n * 图实现(邻接表)\n */\nexport class Graph<T> {\n private vertices: Map<T, T[]> = new Map();\n\n /**\n * 添加顶点\n */\n addVertex(vertex: T): void {\n if (!this.vertices.has(vertex)) {\n this.vertices.set(vertex, []);\n }\n }\n\n /**\n * 添加边(无向图)\n */\n addEdge(vertex1: T, vertex2: T): void {\n if (!this.vertices.has(vertex1)) {\n this.addVertex(vertex1);\n }\n if (!this.vertices.has(vertex2)) {\n this.addVertex(vertex2);\n }\n\n const neighbors1 = this.vertices.get(vertex1)!;\n const neighbors2 = this.vertices.get(vertex2)!;\n\n if (!neighbors1.includes(vertex2)) {\n neighbors1.push(vertex2);\n }\n if (!neighbors2.includes(vertex1)) {\n neighbors2.push(vertex1);\n }\n }\n\n /**\n * 获取顶点的邻居\n */\n getNeighbors(vertex: T): T[] {\n return this.vertices.get(vertex) || [];\n }\n\n /**\n * 深度优先搜索\n */\n dfs(start: T, callback?: (vertex: T) => void): T[] {\n const visited = new Set<T>();\n const result: T[] = [];\n\n const dfsVisit = (vertex: T): void => {\n visited.add(vertex);\n result.push(vertex);\n if (callback) {\n callback(vertex);\n }\n\n const neighbors = this.getNeighbors(vertex);\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n dfsVisit(neighbor);\n }\n }\n };\n\n dfsVisit(start);\n return result;\n }\n\n /**\n * 广度优先搜索\n */\n bfs(start: T, callback?: (vertex: T) => void): T[] {\n const visited = new Set<T>();\n const queue: T[] = [start];\n const result: T[] = [];\n\n visited.add(start);\n\n while (queue.length > 0) {\n const vertex = queue.shift()!;\n result.push(vertex);\n if (callback) {\n callback(vertex);\n }\n\n const neighbors = this.getNeighbors(vertex);\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return result;\n }\n\n /**\n * 获取所有顶点\n */\n getVertices(): T[] {\n return Array.from(this.vertices.keys());\n }\n}\n\n/**\n * LRU缓存实现\n */\nexport class LRUCache<K, V> {\n private capacity: number;\n private cache: Map<K, V>;\n\n constructor(capacity: number) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this.capacity = capacity;\n this.cache = new Map();\n }\n\n /**\n * 获取值\n */\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n // 将访问的键移到末尾(最近使用)\n const value = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, value);\n\n return value;\n }\n\n /**\n * 设置值\n */\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新现有键,移到末尾\n this.cache.delete(key);\n } else if (this.cache.size >= this.capacity) {\n // 删除最久未使用的键(第一个)\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, value);\n }\n\n /**\n * 删除键\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * 清空缓存\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * 判断是否包含键\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * 获取缓存大小\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * 获取所有键\n */\n keys(): K[] {\n return Array.from(this.cache.keys()).filter((key): key is K => key !== undefined);\n }\n\n /**\n * 获取所有值\n */\n values(): V[] {\n return Array.from(this.cache.values());\n }\n}\n"]}
@@ -1,80 +0,0 @@
1
- // src/format/number.ts
2
- function formatNumber(num, options = {}) {
3
- const { decimals, separator = ",", decimalPoint = ".", minimumFractionDigits } = options;
4
- let numStr;
5
- if (decimals !== void 0) {
6
- numStr = num.toFixed(decimals);
7
- } else if (minimumFractionDigits !== void 0) {
8
- numStr = num.toFixed(minimumFractionDigits);
9
- } else {
10
- const str = num.toString();
11
- if (str.includes(".")) {
12
- numStr = str;
13
- } else {
14
- numStr = num.toFixed(0);
15
- }
16
- }
17
- const parts = numStr.split(".");
18
- parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator);
19
- return parts.join(decimalPoint);
20
- }
21
- function random(min, max, integer = false) {
22
- const value = Math.random() * (max - min) + min;
23
- return integer ? Math.floor(value) : value;
24
- }
25
- function clamp(num, min, max) {
26
- return Math.min(Math.max(num, min), max);
27
- }
28
- function round(num, decimals = 0) {
29
- const factor = Math.pow(10, decimals);
30
- return Math.round(num * factor) / factor;
31
- }
32
- function floor(num, decimals = 0) {
33
- const factor = Math.pow(10, decimals);
34
- return Math.floor(num * factor) / factor;
35
- }
36
- function ceil(num, decimals = 0) {
37
- const factor = Math.pow(10, decimals);
38
- return Math.ceil(num * factor) / factor;
39
- }
40
- function toFixed(num, decimals) {
41
- return num.toFixed(decimals);
42
- }
43
- function parseNumber(str, defaultValue = 0) {
44
- const num = Number(str);
45
- return isNaN(num) ? defaultValue : num;
46
- }
47
- function isBetween(num, min, max, inclusive = true) {
48
- if (inclusive) {
49
- return num >= min && num <= max;
50
- }
51
- return num > min && num < max;
52
- }
53
- function percent(value, decimalsOrTotal, decimals) {
54
- if (value >= 0 && value <= 1 && (decimalsOrTotal === void 0 || decimalsOrTotal < 10)) {
55
- const dec2 = decimalsOrTotal ?? 0;
56
- return Number((value * 100).toFixed(dec2));
57
- }
58
- if (decimalsOrTotal !== void 0 && decimalsOrTotal >= 10) {
59
- const total = decimalsOrTotal;
60
- const dec2 = decimals ?? 2;
61
- if (total === 0) return "0%";
62
- return `${(value / total * 100).toFixed(dec2)}%`;
63
- }
64
- const dec = decimalsOrTotal ?? 0;
65
- return Number((value * 100).toFixed(dec));
66
- }
67
- function formatCurrency(num, currency = "\xA5", decimals = 2) {
68
- return `${currency}${formatNumber(num, { decimals, separator: "," })}`;
69
- }
70
- function formatBytes(bytes, decimals = 2) {
71
- if (bytes === 0) return "0 Bytes";
72
- const k = 1024;
73
- const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"];
74
- const i = Math.floor(Math.log(bytes) / Math.log(k));
75
- return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;
76
- }
77
-
78
- export { ceil, clamp, floor, formatBytes, formatCurrency, formatNumber, isBetween, parseNumber, percent, random, round, toFixed };
79
- //# sourceMappingURL=chunk-CDSGEAOK.mjs.map
80
- //# sourceMappingURL=chunk-CDSGEAOK.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/format/number.ts"],"names":["dec"],"mappings":"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","file":"chunk-CDSGEAOK.mjs","sourcesContent":["/**\n * 数字工具函数\n */\n\n/**\n * 数字格式化(千分位)\n * @param num - 数字\n * @param options - 格式化选项\n * @returns 格式化后的字符串\n */\nexport function formatNumber(\n num: number,\n options: {\n decimals?: number;\n separator?: string;\n decimalPoint?: string;\n minimumFractionDigits?: number;\n } = {}\n): string {\n const { decimals, separator = ',', decimalPoint = '.', minimumFractionDigits } = options;\n\n // 如果没有指定 decimals,自动检测小数位\n let numStr: string;\n if (decimals !== undefined) {\n numStr = num.toFixed(decimals);\n } else if (minimumFractionDigits !== undefined) {\n numStr = num.toFixed(minimumFractionDigits);\n } else {\n // 自动检测小数位\n const str = num.toString();\n if (str.includes('.')) {\n numStr = str;\n } else {\n numStr = num.toFixed(0);\n }\n }\n\n const parts = numStr.split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\n return parts.join(decimalPoint);\n}\n\n/**\n * 生成随机数\n * @param min - 最小值\n * @param max - 最大值\n * @param integer - 是否为整数,默认为 false\n * @returns 随机数\n */\nexport function random(min: number, max: number, integer = false): number {\n const value = Math.random() * (max - min) + min;\n return integer ? Math.floor(value) : value;\n}\n\n/**\n * 限制数值范围\n * @param num - 数字\n * @param min - 最小值\n * @param max - 最大值\n * @returns 限制后的数字\n */\nexport function clamp(num: number, min: number, max: number): number {\n return Math.min(Math.max(num, min), max);\n}\n\n/**\n * 增强版四舍五入\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 四舍五入后的数字\n */\nexport function round(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.round(num * factor) / factor;\n}\n\n/**\n * 增强版向下取整\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 向下取整后的数字\n */\nexport function floor(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.floor(num * factor) / factor;\n}\n\n/**\n * 增强版向上取整\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 向上取整后的数字\n */\nexport function ceil(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.ceil(num * factor) / factor;\n}\n\n/**\n * 保留小数位(增强版)\n * @param num - 数字\n * @param decimals - 小数位数\n * @returns 格式化后的字符串\n */\nexport function toFixed(num: number, decimals: number): string {\n return num.toFixed(decimals);\n}\n\n/**\n * 解析数字字符串\n * @param str - 数字字符串\n * @param defaultValue - 默认值,解析失败时返回\n * @returns 解析后的数字\n */\nexport function parseNumber(str: string, defaultValue = 0): number {\n const num = Number(str);\n return isNaN(num) ? defaultValue : num;\n}\n\n/**\n * 判断是否在范围内\n * @param num - 数字\n * @param min - 最小值\n * @param max - 最大值\n * @param inclusive - 是否包含边界,默认为 true\n * @returns 是否在范围内\n */\nexport function isBetween(num: number, min: number, max: number, inclusive = true): boolean {\n if (inclusive) {\n return num >= min && num <= max;\n }\n return num > min && num < max;\n}\n\n/**\n * 百分比计算\n * @param value - 当前值(0-1之间的小数)或当前值(当提供total时)\n * @param decimals - 小数位数,默认为 0(当value是0-1之间的小数时)或总值(当value是实际值时)\n * @returns 百分比数字(当value是0-1之间的小数时)或百分比字符串(当提供total时)\n */\nexport function percent(value: number, decimals?: number): number;\nexport function percent(value: number, total: number, decimals: number): string;\nexport function percent(\n value: number,\n decimalsOrTotal?: number,\n decimals?: number\n): number | string {\n // 如果 value 是 0-1 之间的小数,且只传了一个参数或第二个参数是小数位数\n if (value >= 0 && value <= 1 && (decimalsOrTotal === undefined || decimalsOrTotal < 10)) {\n const dec = decimalsOrTotal ?? 0;\n return Number((value * 100).toFixed(dec));\n }\n\n // 如果提供了 total(第二个参数大于等于10,认为是total)\n if (decimalsOrTotal !== undefined && decimalsOrTotal >= 10) {\n const total = decimalsOrTotal;\n const dec = decimals ?? 2;\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(dec)}%`;\n }\n\n // 默认情况:value 是 0-1 之间的小数\n const dec = decimalsOrTotal ?? 0;\n return Number((value * 100).toFixed(dec));\n}\n\n/**\n * 货币格式化\n * @param num - 数字\n * @param currency - 货币符号,默认为 '¥'\n * @param decimals - 小数位数,默认为 2\n * @returns 格式化后的货币字符串\n */\nexport function formatCurrency(num: number, currency = '¥', decimals = 2): string {\n return `${currency}${formatNumber(num, { decimals, separator: ',' })}`;\n}\n\n/**\n * 字节格式化\n * @param bytes - 字节数\n * @param decimals - 小数位数,默认为 2\n * @returns 格式化后的字节字符串\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;\n}\n"]}