@lee-zg/melange 1.2.0 → 1.2.2
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 +14 -14
- package/dist/{chunk-V5THPEB2.cjs → chunk-BEY4UAYF.cjs} +2 -2
- package/dist/{chunk-V5THPEB2.cjs.map → chunk-BEY4UAYF.cjs.map} +1 -1
- package/dist/{chunk-VGZMISJD.js → chunk-GZBY4BUP.js} +2 -2
- package/dist/chunk-GZBY4BUP.js.map +1 -0
- package/dist/{chunk-MBBJMHTS.js → chunk-ILNGTDQ4.js} +2 -2
- package/dist/{chunk-MBBJMHTS.js.map → chunk-ILNGTDQ4.js.map} +1 -1
- package/dist/{chunk-KUJARU3D.cjs → chunk-JLBTZPBY.cjs} +2 -2
- package/dist/chunk-JLBTZPBY.cjs.map +1 -0
- package/dist/core/index.cjs +23 -23
- package/dist/core/index.js +1 -1
- package/dist/index.cjs +93 -93
- package/dist/index.js +2 -2
- package/dist/utils/index.cjs +73 -73
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-KUJARU3D.cjs.map +0 -1
- package/dist/chunk-VGZMISJD.js.map +0 -1
package/dist/utils/index.cjs
CHANGED
|
@@ -1,297 +1,297 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkJLBTZPBY_cjs = require('../chunk-JLBTZPBY.cjs');
|
|
4
4
|
require('../chunk-PK6SKIKE.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "camelCase", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkJLBTZPBY_cjs.camelCase; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "capitalize", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkJLBTZPBY_cjs.capitalize; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "chunk", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkJLBTZPBY_cjs.chunk; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "collapseWhitespace", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkJLBTZPBY_cjs.collapseWhitespace; }
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "constantCase", {
|
|
25
25
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkJLBTZPBY_cjs.constantCase; }
|
|
27
27
|
});
|
|
28
28
|
Object.defineProperty(exports, "countOccurrences", {
|
|
29
29
|
enumerable: true,
|
|
30
|
-
get: function () { return
|
|
30
|
+
get: function () { return chunkJLBTZPBY_cjs.countOccurrences; }
|
|
31
31
|
});
|
|
32
32
|
Object.defineProperty(exports, "createDeferred", {
|
|
33
33
|
enumerable: true,
|
|
34
|
-
get: function () { return
|
|
34
|
+
get: function () { return chunkJLBTZPBY_cjs.createDeferred; }
|
|
35
35
|
});
|
|
36
36
|
Object.defineProperty(exports, "debounce", {
|
|
37
37
|
enumerable: true,
|
|
38
|
-
get: function () { return
|
|
38
|
+
get: function () { return chunkJLBTZPBY_cjs.debounce; }
|
|
39
39
|
});
|
|
40
40
|
Object.defineProperty(exports, "deepClone", {
|
|
41
41
|
enumerable: true,
|
|
42
|
-
get: function () { return
|
|
42
|
+
get: function () { return chunkJLBTZPBY_cjs.deepClone; }
|
|
43
43
|
});
|
|
44
44
|
Object.defineProperty(exports, "deepMerge", {
|
|
45
45
|
enumerable: true,
|
|
46
|
-
get: function () { return
|
|
46
|
+
get: function () { return chunkJLBTZPBY_cjs.deepMerge; }
|
|
47
47
|
});
|
|
48
48
|
Object.defineProperty(exports, "delay", {
|
|
49
49
|
enumerable: true,
|
|
50
|
-
get: function () { return
|
|
50
|
+
get: function () { return chunkJLBTZPBY_cjs.delay; }
|
|
51
51
|
});
|
|
52
52
|
Object.defineProperty(exports, "difference", {
|
|
53
53
|
enumerable: true,
|
|
54
|
-
get: function () { return
|
|
54
|
+
get: function () { return chunkJLBTZPBY_cjs.difference; }
|
|
55
55
|
});
|
|
56
56
|
Object.defineProperty(exports, "escapeHtml", {
|
|
57
57
|
enumerable: true,
|
|
58
|
-
get: function () { return
|
|
58
|
+
get: function () { return chunkJLBTZPBY_cjs.escapeHtml; }
|
|
59
59
|
});
|
|
60
60
|
Object.defineProperty(exports, "filterObject", {
|
|
61
61
|
enumerable: true,
|
|
62
|
-
get: function () { return
|
|
62
|
+
get: function () { return chunkJLBTZPBY_cjs.filterObject; }
|
|
63
63
|
});
|
|
64
64
|
Object.defineProperty(exports, "first", {
|
|
65
65
|
enumerable: true,
|
|
66
|
-
get: function () { return
|
|
66
|
+
get: function () { return chunkJLBTZPBY_cjs.first; }
|
|
67
67
|
});
|
|
68
68
|
Object.defineProperty(exports, "flatten", {
|
|
69
69
|
enumerable: true,
|
|
70
|
-
get: function () { return
|
|
70
|
+
get: function () { return chunkJLBTZPBY_cjs.flatten; }
|
|
71
71
|
});
|
|
72
72
|
Object.defineProperty(exports, "flattenDeep", {
|
|
73
73
|
enumerable: true,
|
|
74
|
-
get: function () { return
|
|
74
|
+
get: function () { return chunkJLBTZPBY_cjs.flattenDeep; }
|
|
75
75
|
});
|
|
76
76
|
Object.defineProperty(exports, "fromEntries", {
|
|
77
77
|
enumerable: true,
|
|
78
|
-
get: function () { return
|
|
78
|
+
get: function () { return chunkJLBTZPBY_cjs.fromEntries; }
|
|
79
79
|
});
|
|
80
80
|
Object.defineProperty(exports, "get", {
|
|
81
81
|
enumerable: true,
|
|
82
|
-
get: function () { return
|
|
82
|
+
get: function () { return chunkJLBTZPBY_cjs.get; }
|
|
83
83
|
});
|
|
84
84
|
Object.defineProperty(exports, "groupBy", {
|
|
85
85
|
enumerable: true,
|
|
86
|
-
get: function () { return
|
|
86
|
+
get: function () { return chunkJLBTZPBY_cjs.groupBy; }
|
|
87
87
|
});
|
|
88
88
|
Object.defineProperty(exports, "has", {
|
|
89
89
|
enumerable: true,
|
|
90
|
-
get: function () { return
|
|
90
|
+
get: function () { return chunkJLBTZPBY_cjs.has; }
|
|
91
91
|
});
|
|
92
92
|
Object.defineProperty(exports, "intersection", {
|
|
93
93
|
enumerable: true,
|
|
94
|
-
get: function () { return
|
|
94
|
+
get: function () { return chunkJLBTZPBY_cjs.intersection; }
|
|
95
95
|
});
|
|
96
96
|
Object.defineProperty(exports, "isArray", {
|
|
97
97
|
enumerable: true,
|
|
98
|
-
get: function () { return
|
|
98
|
+
get: function () { return chunkJLBTZPBY_cjs.isArray; }
|
|
99
99
|
});
|
|
100
100
|
Object.defineProperty(exports, "isBigInt", {
|
|
101
101
|
enumerable: true,
|
|
102
|
-
get: function () { return
|
|
102
|
+
get: function () { return chunkJLBTZPBY_cjs.isBigInt; }
|
|
103
103
|
});
|
|
104
104
|
Object.defineProperty(exports, "isBoolean", {
|
|
105
105
|
enumerable: true,
|
|
106
|
-
get: function () { return
|
|
106
|
+
get: function () { return chunkJLBTZPBY_cjs.isBoolean; }
|
|
107
107
|
});
|
|
108
108
|
Object.defineProperty(exports, "isDate", {
|
|
109
109
|
enumerable: true,
|
|
110
|
-
get: function () { return
|
|
110
|
+
get: function () { return chunkJLBTZPBY_cjs.isDate; }
|
|
111
111
|
});
|
|
112
112
|
Object.defineProperty(exports, "isEmail", {
|
|
113
113
|
enumerable: true,
|
|
114
|
-
get: function () { return
|
|
114
|
+
get: function () { return chunkJLBTZPBY_cjs.isEmail; }
|
|
115
115
|
});
|
|
116
116
|
Object.defineProperty(exports, "isEmpty", {
|
|
117
117
|
enumerable: true,
|
|
118
|
-
get: function () { return
|
|
118
|
+
get: function () { return chunkJLBTZPBY_cjs.isEmpty; }
|
|
119
119
|
});
|
|
120
120
|
Object.defineProperty(exports, "isFunction", {
|
|
121
121
|
enumerable: true,
|
|
122
|
-
get: function () { return
|
|
122
|
+
get: function () { return chunkJLBTZPBY_cjs.isFunction; }
|
|
123
123
|
});
|
|
124
124
|
Object.defineProperty(exports, "isInRange", {
|
|
125
125
|
enumerable: true,
|
|
126
|
-
get: function () { return
|
|
126
|
+
get: function () { return chunkJLBTZPBY_cjs.isInRange; }
|
|
127
127
|
});
|
|
128
128
|
Object.defineProperty(exports, "isInteger", {
|
|
129
129
|
enumerable: true,
|
|
130
|
-
get: function () { return
|
|
130
|
+
get: function () { return chunkJLBTZPBY_cjs.isInteger; }
|
|
131
131
|
});
|
|
132
132
|
Object.defineProperty(exports, "isNegative", {
|
|
133
133
|
enumerable: true,
|
|
134
|
-
get: function () { return
|
|
134
|
+
get: function () { return chunkJLBTZPBY_cjs.isNegative; }
|
|
135
135
|
});
|
|
136
136
|
Object.defineProperty(exports, "isNil", {
|
|
137
137
|
enumerable: true,
|
|
138
|
-
get: function () { return
|
|
138
|
+
get: function () { return chunkJLBTZPBY_cjs.isNil; }
|
|
139
139
|
});
|
|
140
140
|
Object.defineProperty(exports, "isNotEmpty", {
|
|
141
141
|
enumerable: true,
|
|
142
|
-
get: function () { return
|
|
142
|
+
get: function () { return chunkJLBTZPBY_cjs.isNotEmpty; }
|
|
143
143
|
});
|
|
144
144
|
Object.defineProperty(exports, "isNotNil", {
|
|
145
145
|
enumerable: true,
|
|
146
|
-
get: function () { return
|
|
146
|
+
get: function () { return chunkJLBTZPBY_cjs.isNotNil; }
|
|
147
147
|
});
|
|
148
148
|
Object.defineProperty(exports, "isNumber", {
|
|
149
149
|
enumerable: true,
|
|
150
|
-
get: function () { return
|
|
150
|
+
get: function () { return chunkJLBTZPBY_cjs.isNumber; }
|
|
151
151
|
});
|
|
152
152
|
Object.defineProperty(exports, "isObject", {
|
|
153
153
|
enumerable: true,
|
|
154
|
-
get: function () { return
|
|
154
|
+
get: function () { return chunkJLBTZPBY_cjs.isObject; }
|
|
155
155
|
});
|
|
156
156
|
Object.defineProperty(exports, "isPlainObject", {
|
|
157
157
|
enumerable: true,
|
|
158
|
-
get: function () { return
|
|
158
|
+
get: function () { return chunkJLBTZPBY_cjs.isPlainObject; }
|
|
159
159
|
});
|
|
160
160
|
Object.defineProperty(exports, "isPositive", {
|
|
161
161
|
enumerable: true,
|
|
162
|
-
get: function () { return
|
|
162
|
+
get: function () { return chunkJLBTZPBY_cjs.isPositive; }
|
|
163
163
|
});
|
|
164
164
|
Object.defineProperty(exports, "isPromise", {
|
|
165
165
|
enumerable: true,
|
|
166
|
-
get: function () { return
|
|
166
|
+
get: function () { return chunkJLBTZPBY_cjs.isPromise; }
|
|
167
167
|
});
|
|
168
168
|
Object.defineProperty(exports, "isString", {
|
|
169
169
|
enumerable: true,
|
|
170
|
-
get: function () { return
|
|
170
|
+
get: function () { return chunkJLBTZPBY_cjs.isString; }
|
|
171
171
|
});
|
|
172
172
|
Object.defineProperty(exports, "isSymbol", {
|
|
173
173
|
enumerable: true,
|
|
174
|
-
get: function () { return
|
|
174
|
+
get: function () { return chunkJLBTZPBY_cjs.isSymbol; }
|
|
175
175
|
});
|
|
176
176
|
Object.defineProperty(exports, "isURL", {
|
|
177
177
|
enumerable: true,
|
|
178
|
-
get: function () { return
|
|
178
|
+
get: function () { return chunkJLBTZPBY_cjs.isURL; }
|
|
179
179
|
});
|
|
180
180
|
Object.defineProperty(exports, "isUUID", {
|
|
181
181
|
enumerable: true,
|
|
182
|
-
get: function () { return
|
|
182
|
+
get: function () { return chunkJLBTZPBY_cjs.isUUID; }
|
|
183
183
|
});
|
|
184
184
|
Object.defineProperty(exports, "kebabCase", {
|
|
185
185
|
enumerable: true,
|
|
186
|
-
get: function () { return
|
|
186
|
+
get: function () { return chunkJLBTZPBY_cjs.kebabCase; }
|
|
187
187
|
});
|
|
188
188
|
Object.defineProperty(exports, "last", {
|
|
189
189
|
enumerable: true,
|
|
190
|
-
get: function () { return
|
|
190
|
+
get: function () { return chunkJLBTZPBY_cjs.last; }
|
|
191
191
|
});
|
|
192
192
|
Object.defineProperty(exports, "mapValues", {
|
|
193
193
|
enumerable: true,
|
|
194
|
-
get: function () { return
|
|
194
|
+
get: function () { return chunkJLBTZPBY_cjs.mapValues; }
|
|
195
195
|
});
|
|
196
196
|
Object.defineProperty(exports, "omit", {
|
|
197
197
|
enumerable: true,
|
|
198
|
-
get: function () { return
|
|
198
|
+
get: function () { return chunkJLBTZPBY_cjs.omit; }
|
|
199
199
|
});
|
|
200
200
|
Object.defineProperty(exports, "padEnd", {
|
|
201
201
|
enumerable: true,
|
|
202
|
-
get: function () { return
|
|
202
|
+
get: function () { return chunkJLBTZPBY_cjs.padEnd; }
|
|
203
203
|
});
|
|
204
204
|
Object.defineProperty(exports, "padStart", {
|
|
205
205
|
enumerable: true,
|
|
206
|
-
get: function () { return
|
|
206
|
+
get: function () { return chunkJLBTZPBY_cjs.padStart; }
|
|
207
207
|
});
|
|
208
208
|
Object.defineProperty(exports, "parallel", {
|
|
209
209
|
enumerable: true,
|
|
210
|
-
get: function () { return
|
|
210
|
+
get: function () { return chunkJLBTZPBY_cjs.parallel; }
|
|
211
211
|
});
|
|
212
212
|
Object.defineProperty(exports, "partition", {
|
|
213
213
|
enumerable: true,
|
|
214
|
-
get: function () { return
|
|
214
|
+
get: function () { return chunkJLBTZPBY_cjs.partition; }
|
|
215
215
|
});
|
|
216
216
|
Object.defineProperty(exports, "pascalCase", {
|
|
217
217
|
enumerable: true,
|
|
218
|
-
get: function () { return
|
|
218
|
+
get: function () { return chunkJLBTZPBY_cjs.pascalCase; }
|
|
219
219
|
});
|
|
220
220
|
Object.defineProperty(exports, "pick", {
|
|
221
221
|
enumerable: true,
|
|
222
|
-
get: function () { return
|
|
222
|
+
get: function () { return chunkJLBTZPBY_cjs.pick; }
|
|
223
223
|
});
|
|
224
224
|
Object.defineProperty(exports, "randomString", {
|
|
225
225
|
enumerable: true,
|
|
226
|
-
get: function () { return
|
|
226
|
+
get: function () { return chunkJLBTZPBY_cjs.randomString; }
|
|
227
227
|
});
|
|
228
228
|
Object.defineProperty(exports, "range", {
|
|
229
229
|
enumerable: true,
|
|
230
|
-
get: function () { return
|
|
230
|
+
get: function () { return chunkJLBTZPBY_cjs.range; }
|
|
231
231
|
});
|
|
232
232
|
Object.defineProperty(exports, "retry", {
|
|
233
233
|
enumerable: true,
|
|
234
|
-
get: function () { return
|
|
234
|
+
get: function () { return chunkJLBTZPBY_cjs.retry; }
|
|
235
235
|
});
|
|
236
236
|
Object.defineProperty(exports, "reverse", {
|
|
237
237
|
enumerable: true,
|
|
238
|
-
get: function () { return
|
|
238
|
+
get: function () { return chunkJLBTZPBY_cjs.reverse; }
|
|
239
239
|
});
|
|
240
240
|
Object.defineProperty(exports, "sample", {
|
|
241
241
|
enumerable: true,
|
|
242
|
-
get: function () { return
|
|
242
|
+
get: function () { return chunkJLBTZPBY_cjs.sample; }
|
|
243
243
|
});
|
|
244
244
|
Object.defineProperty(exports, "sequence", {
|
|
245
245
|
enumerable: true,
|
|
246
|
-
get: function () { return
|
|
246
|
+
get: function () { return chunkJLBTZPBY_cjs.sequence; }
|
|
247
247
|
});
|
|
248
248
|
Object.defineProperty(exports, "set", {
|
|
249
249
|
enumerable: true,
|
|
250
|
-
get: function () { return
|
|
250
|
+
get: function () { return chunkJLBTZPBY_cjs.set; }
|
|
251
251
|
});
|
|
252
252
|
Object.defineProperty(exports, "shuffle", {
|
|
253
253
|
enumerable: true,
|
|
254
|
-
get: function () { return
|
|
254
|
+
get: function () { return chunkJLBTZPBY_cjs.shuffle; }
|
|
255
255
|
});
|
|
256
256
|
Object.defineProperty(exports, "snakeCase", {
|
|
257
257
|
enumerable: true,
|
|
258
|
-
get: function () { return
|
|
258
|
+
get: function () { return chunkJLBTZPBY_cjs.snakeCase; }
|
|
259
259
|
});
|
|
260
260
|
Object.defineProperty(exports, "sortBy", {
|
|
261
261
|
enumerable: true,
|
|
262
|
-
get: function () { return
|
|
262
|
+
get: function () { return chunkJLBTZPBY_cjs.sortBy; }
|
|
263
263
|
});
|
|
264
264
|
Object.defineProperty(exports, "throttle", {
|
|
265
265
|
enumerable: true,
|
|
266
|
-
get: function () { return
|
|
266
|
+
get: function () { return chunkJLBTZPBY_cjs.throttle; }
|
|
267
267
|
});
|
|
268
268
|
Object.defineProperty(exports, "timeout", {
|
|
269
269
|
enumerable: true,
|
|
270
|
-
get: function () { return
|
|
270
|
+
get: function () { return chunkJLBTZPBY_cjs.timeout; }
|
|
271
271
|
});
|
|
272
272
|
Object.defineProperty(exports, "titleCase", {
|
|
273
273
|
enumerable: true,
|
|
274
|
-
get: function () { return
|
|
274
|
+
get: function () { return chunkJLBTZPBY_cjs.titleCase; }
|
|
275
275
|
});
|
|
276
276
|
Object.defineProperty(exports, "truncate", {
|
|
277
277
|
enumerable: true,
|
|
278
|
-
get: function () { return
|
|
278
|
+
get: function () { return chunkJLBTZPBY_cjs.truncate; }
|
|
279
279
|
});
|
|
280
280
|
Object.defineProperty(exports, "unescapeHtml", {
|
|
281
281
|
enumerable: true,
|
|
282
|
-
get: function () { return
|
|
282
|
+
get: function () { return chunkJLBTZPBY_cjs.unescapeHtml; }
|
|
283
283
|
});
|
|
284
284
|
Object.defineProperty(exports, "unique", {
|
|
285
285
|
enumerable: true,
|
|
286
|
-
get: function () { return
|
|
286
|
+
get: function () { return chunkJLBTZPBY_cjs.unique; }
|
|
287
287
|
});
|
|
288
288
|
Object.defineProperty(exports, "words", {
|
|
289
289
|
enumerable: true,
|
|
290
|
-
get: function () { return
|
|
290
|
+
get: function () { return chunkJLBTZPBY_cjs.words; }
|
|
291
291
|
});
|
|
292
292
|
Object.defineProperty(exports, "zip", {
|
|
293
293
|
enumerable: true,
|
|
294
|
-
get: function () { return
|
|
294
|
+
get: function () { return chunkJLBTZPBY_cjs.zip; }
|
|
295
295
|
});
|
|
296
296
|
//# sourceMappingURL=index.cjs.map
|
|
297
297
|
//# sourceMappingURL=index.cjs.map
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { camelCase, capitalize, chunk, collapseWhitespace, constantCase, countOccurrences, createDeferred, debounce, deepClone, deepMerge, delay, difference, escapeHtml, filterObject, first, flatten, flattenDeep, fromEntries, get, groupBy, has, intersection, isArray, isBigInt, isBoolean, isDate, isEmail, isEmpty, isFunction, isInRange, isInteger, isNegative, isNil, isNotEmpty, isNotNil, isNumber, isObject, isPlainObject, isPositive, isPromise, isString, isSymbol, isURL, isUUID, kebabCase, last, mapValues, omit, padEnd, padStart, parallel, partition, pascalCase, pick, randomString, range, retry, reverse, sample, sequence, set, shuffle, snakeCase, sortBy, throttle, timeout, titleCase, truncate, unescapeHtml, unique, words, zip } from '../chunk-
|
|
1
|
+
export { camelCase, capitalize, chunk, collapseWhitespace, constantCase, countOccurrences, createDeferred, debounce, deepClone, deepMerge, delay, difference, escapeHtml, filterObject, first, flatten, flattenDeep, fromEntries, get, groupBy, has, intersection, isArray, isBigInt, isBoolean, isDate, isEmail, isEmpty, isFunction, isInRange, isInteger, isNegative, isNil, isNotEmpty, isNotNil, isNumber, isObject, isPlainObject, isPositive, isPromise, isString, isSymbol, isURL, isUUID, kebabCase, last, mapValues, omit, padEnd, padStart, parallel, partition, pascalCase, pick, randomString, range, retry, reverse, sample, sequence, set, shuffle, snakeCase, sortBy, throttle, timeout, titleCase, truncate, unescapeHtml, unique, words, zip } from '../chunk-GZBY4BUP.js';
|
|
2
2
|
import '../chunk-7QVYU63E.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/object.ts","../src/utils/array.ts","../src/utils/string.ts","../src/utils/timing.ts","../src/utils/guards.ts"],"names":["result","__name","first"],"mappings":"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","file":"chunk-KUJARU3D.cjs","sourcesContent":["/**\n * @fileoverview 对象操作工具\n * @module melange/utils/object\n * @description 提供深度克隆、合并和\n * 安全操作 JavaScript 对象的工具。\n */\n\n/**\n * 创建对象的深度克隆。\n * 处理嵌套对象、数组、日期和其他内置类型。\n *\n * @description\n * 此函数创建输入的真实深度副本,意味着嵌套\n * 对象也会被克隆而不是引用。它处理循环\n * 引用和特殊对象类型。\n *\n * @example\n * ```typescript\n * const original = { a: 1, b: { c: 2 } };\n * const clone = deepClone(original);\n *\n * clone.b.c = 3;\n * console.log(original.b.c); // 2 (未改变)\n * ```\n *\n * @template T - 要克隆的值的类型\n * @param value - 要克隆的值\n * @returns 值的深度副本\n */\nexport function deepClone<T>(value: T): T {\n // Handle primitives and null\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Handle Date\n if (value instanceof Date) {\n return new Date(value.getTime()) as unknown as T;\n }\n\n // Handle RegExp\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as unknown as T;\n }\n\n // Handle Array\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as unknown as T;\n }\n\n // Handle Map\n if (value instanceof Map) {\n const result = new Map();\n value.forEach((v, k) => {\n result.set(deepClone(k), deepClone(v));\n });\n return result as unknown as T;\n }\n\n // Handle Set\n if (value instanceof Set) {\n const result = new Set();\n value.forEach(v => {\n result.add(deepClone(v));\n });\n return result as unknown as T;\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n\n return result as unknown as T;\n}\n\n/**\n * 深度合并多个对象为一个。\n * 后面的对象会覆盖前面对象的冲突键。\n *\n * @example\n * ```typescript\n * const base = { a: 1, b: { c: 2, d: 3 } };\n * const override = { b: { c: 4 } };\n * const merged = deepMerge(base, override);\n * // { a: 1, b: { c: 4, d: 3 } }\n * ```\n *\n * @template T - 合并对象的类型\n * @param objects - 要合并的对象\n * @returns 合并后的对象\n */\nexport function deepMerge<T extends object>(...objects: Partial<T>[]): T {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n if (!obj) continue;\n\n for (const key of Object.keys(obj)) {\n const targetValue = result[key];\n const sourceValue = (obj as Record<string, unknown>)[key];\n\n if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n result[key] = deepClone(sourceValue);\n }\n }\n }\n\n return result as T;\n}\n\n/**\n * 从对象中选择指定属性。\n *\n * @example\n * ```typescript\n * const user = { id: 1, name: 'John', email: 'john@example.com' };\n * const partial = pick(user, ['id', 'name']);\n * // { id: 1, name: 'John' }\n * ```\n *\n * @template T - 对象类型\n * @template K - 要选择的键\n * @param obj - 源对象\n * @param keys - 要选择的键\n * @returns 只包含指定键的新对象\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: readonly K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n\n return result;\n}\n\n/**\n * 从对象中省略指定属性。\n *\n * @example\n * ```typescript\n * const user = { id: 1, name: 'John', password: 'secret' };\n * const safe = omit(user, ['password']);\n * // { id: 1, name: 'John' }\n * ```\n *\n * @template T - 对象类型\n * @template K - 要省略的键\n * @param obj - 源对象\n * @param keys - 要省略的键\n * @returns 不包含指定键的新对象\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: readonly K[]): Omit<T, K> {\n const keysSet = new Set<keyof T>(keys);\n const result = {} as Omit<T, K>;\n\n for (const key of Object.keys(obj) as Array<keyof T>) {\n if (!keysSet.has(key)) {\n (result as Record<keyof T, unknown>)[key] = obj[key];\n }\n }\n\n return result;\n}\n\n/**\n * 使用路径字符串或数组获取嵌套属性值。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * get(obj, 'a.b.c'); // 42\n * get(obj, ['a', 'b', 'c']); // 42\n * get(obj, 'a.x.y', 'default'); // 'default'\n * ```\n *\n * @template T - 默认值类型\n * @param obj - 要获取的对象\n * @param path - 属性路径\n * @param defaultValue - 路径不存在时的默认值\n * @returns 路径处的值或默认值\n */\nexport function get<T = unknown>(\n obj: unknown,\n path: string | readonly string[],\n defaultValue?: T\n): T {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let result: unknown = obj;\n\n for (const key of keys) {\n if (result == null || typeof result !== 'object') {\n return defaultValue as T;\n }\n result = (result as Record<string, unknown>)[key];\n }\n\n return (result === undefined ? defaultValue : result) as T;\n}\n\n/**\n * 使用路径字符串或数组设置嵌套属性值。\n * 根据需要创建中间对象。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: 1 } };\n * set(obj, 'a.c.d', 42);\n * // { a: { b: 1, c: { d: 42 } } }\n * ```\n *\n * @template T - 对象类型\n * @param obj - 要修改的对象\n * @param path - 属性路径\n * @param value - 要设置的值\n * @returns 修改后的对象\n */\nexport function set<T extends object>(obj: T, path: string | readonly string[], value: unknown): T {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let current: Record<string, unknown> = obj as Record<string, unknown>;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (key === undefined) continue;\n\n if (current[key] == null || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n current[lastKey] = value;\n }\n\n return obj;\n}\n\n/**\n * 检查对象是否具有嵌套属性。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * has(obj, 'a.b.c'); // true\n * has(obj, 'a.x'); // false\n * ```\n *\n * @param obj - 要检查的对象\n * @param path - 要检查的路径\n * @returns 如果路径存在则返回 true\n */\nexport function has(obj: unknown, path: string | readonly string[]): boolean {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') {\n return false;\n }\n if (!(key in current)) {\n return false;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return true;\n}\n\n/**\n * 检查值是否为普通对象(非数组、null 或其他类型)。\n *\n * @param value - 要检查的值\n * @returns 如果值是普通对象则返回 true\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * 从键值对创建对象。\n *\n * @example\n * ```typescript\n * fromEntries([['a', 1], ['b', 2]]);\n * // { a: 1, b: 2 }\n * ```\n *\n * @template K - 键类型\n * @template V - 值类型\n * @param entries - 键值对数组\n * @returns 从条目创建的对象\n */\nexport function fromEntries<K extends string | number | symbol, V>(\n entries: readonly (readonly [K, V])[]\n): Record<K, V> {\n const result = {} as Record<K, V>;\n\n for (const [key, value] of entries) {\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * 映射对象值同时保留键。\n *\n * @example\n * ```typescript\n * const prices = { apple: 1, banana: 2 };\n * const doubled = mapValues(prices, v => v * 2);\n * // { apple: 2, banana: 4 }\n * ```\n *\n * @template T - 原始值类型\n * @template U - 映射值类型\n * @param obj - 要映射的对象\n * @param fn - 映射函数\n * @returns 具有映射值的对象\n */\nexport function mapValues<T, U>(\n obj: Record<string, T>,\n fn: (value: T, key: string) => U\n): Record<string, U> {\n const result: Record<string, U> = {};\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (value !== undefined) {\n result[key] = fn(value, key);\n }\n }\n\n return result;\n}\n\n/**\n * 基于谓词过滤对象条目。\n *\n * @example\n * ```typescript\n * const prices = { apple: 1, banana: 2, cherry: 3 };\n * const expensive = filterObject(prices, v => v > 1);\n * // { banana: 2, cherry: 3 }\n * ```\n *\n * @template T - 值类型\n * @param obj - 要过滤的对象\n * @param predicate - 过滤函数\n * @returns 过滤后的对象\n */\nexport function filterObject<T>(\n obj: Record<string, T>,\n predicate: (value: T, key: string) => boolean\n): Record<string, T> {\n const result: Record<string, T> = {};\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (value !== undefined && predicate(value, key)) {\n result[key] = value;\n }\n }\n\n return result;\n}\n","/**\n * @fileoverview 数组操作工具\n * @module melange/utils/array\n * @description 提供操作数组的工具,包括\n * 分块、扁平化、分组和排序。\n */\n\n/**\n * 将数组拆分为指定大小的块。\n *\n * @example\n * ```typescript\n * chunk([1, 2, 3, 4, 5], 2);\n * // [[1, 2], [3, 4], [5]]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要分块的数组\n * @param size - 块大小\n * @returns 块数组\n */\nexport function chunk<T>(array: readonly T[], size: number): T[][] {\n if (size <= 0) {\n throw new Error('Chunk size must be positive');\n }\n\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n\n return result;\n}\n\n/**\n * 将嵌套数组扁平化一级。\n *\n * @example\n * ```typescript\n * flatten([[1, 2], [3, 4], [5]]);\n * // [1, 2, 3, 4, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要扁平化的嵌套数组\n * @returns 扁平化后的数组\n */\nexport function flatten<T>(array: readonly (T | readonly T[])[]): T[] {\n const result: T[] = [];\n\n for (const item of array) {\n if (Array.isArray(item)) {\n result.push(...item);\n } else {\n result.push(item as T);\n }\n }\n\n return result;\n}\n\n/**\n * 深度扁平化嵌套数组。\n *\n * @example\n * ```typescript\n * flattenDeep([1, [2, [3, [4, 5]]]]);\n * // [1, 2, 3, 4, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要扁平化的嵌套数组\n * @returns 深度扁平化后的数组\n */\nexport function flattenDeep<T>(array: readonly unknown[]): T[] {\n const result: T[] = [];\n\n function flattenHelper(arr: readonly unknown[]): void {\n for (const item of arr) {\n if (Array.isArray(item)) {\n flattenHelper(item);\n } else {\n result.push(item as T);\n }\n }\n }\n\n flattenHelper(array);\n return result;\n}\n\n/**\n * 返回数组中的唯一元素。\n *\n * @example\n * ```typescript\n * unique([1, 2, 2, 3, 3, 3]);\n * // [1, 2, 3]\n *\n * const users = [{ id: 1 }, { id: 2 }, { id: 1 }];\n * unique(users, u => u.id);\n * // [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 唯一性的键类型\n * @param array - 要去重的数组\n * @param keyFn - 提取比较键的可选函数\n * @returns 包含唯一元素的数组\n */\nexport function unique<T, K = T>(array: readonly T[], keyFn?: (item: T) => K): T[] {\n if (!keyFn) {\n return [...new Set(array)];\n }\n\n const seen = new Set<K>();\n const result: T[] = [];\n\n for (const item of array) {\n const key = keyFn(item);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(item);\n }\n }\n\n return result;\n}\n\n/**\n * 按键对数组元素进行分组。\n *\n * @example\n * ```typescript\n * const users = [\n * { name: 'Alice', age: 25 },\n * { name: 'Bob', age: 30 },\n * { name: 'Charlie', age: 25 }\n * ];\n *\n * groupBy(users, u => u.age);\n * // {\n * // 25: [{ name: 'Alice', age: 25 }, { name: 'Charlie', age: 25 }],\n * // 30: [{ name: 'Bob', age: 30 }]\n * // }\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 分组键类型\n * @param array - 要分组的数组\n * @param keyFn - 提取分组键的函数\n * @returns 包含分组元素的对象\n */\nexport function groupBy<T, K extends string | number | symbol>(\n array: readonly T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n const result = {} as Record<K, T[]>;\n\n for (const item of array) {\n const key = keyFn(item);\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n }\n\n return result;\n}\n\n/**\n * 按键对数组进行排序,返回新的排序数组。\n *\n * @example\n * ```typescript\n * const users = [\n * { name: 'Charlie', age: 25 },\n * { name: 'Alice', age: 30 },\n * { name: 'Bob', age: 20 }\n * ];\n *\n * sortBy(users, u => u.age);\n * // 按年龄升序排列\n *\n * sortBy(users, u => u.name, 'desc');\n * // 按姓名降序排列\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 排序键类型\n * @param array - 要排序的数组\n * @param keyFn - 提取排序键的函数\n * @param order - 排序顺序: 'asc' 或 'desc'\n * @returns 新的排序数组\n */\nexport function sortBy<T, K extends string | number>(\n array: readonly T[],\n keyFn: (item: T) => K,\n order: 'asc' | 'desc' = 'asc'\n): T[] {\n const multiplier = order === 'asc' ? 1 : -1;\n\n return [...array].sort((a, b) => {\n const keyA = keyFn(a);\n const keyB = keyFn(b);\n\n if (keyA < keyB) return -1 * multiplier;\n if (keyA > keyB) return 1 * multiplier;\n return 0;\n });\n}\n\n/**\n * 根据谓词将数组分区为两个数组。\n *\n * @example\n * ```typescript\n * const [evens, odds] = partition([1, 2, 3, 4, 5], n => n % 2 === 0);\n * // evens = [2, 4], odds = [1, 3, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要分区的数组\n * @param predicate - 分区谓词\n * @returns [匹配, 不匹配] 数组的元组\n */\nexport function partition<T>(array: readonly T[], predicate: (item: T) => boolean): [T[], T[]] {\n const pass: T[] = [];\n const fail: T[] = [];\n\n for (const item of array) {\n if (predicate(item)) {\n pass.push(item);\n } else {\n fail.push(item);\n }\n }\n\n return [pass, fail];\n}\n\n/**\n * 将多个数组压缩在一起。\n *\n * @example\n * ```typescript\n * zip([1, 2, 3], ['a', 'b', 'c']);\n * // [[1, 'a'], [2, 'b'], [3, 'c']]\n *\n * zip([1, 2], ['a', 'b', 'c']);\n * // [[1, 'a'], [2, 'b']]\n * ```\n *\n * @template T - 第一个数组元素类型\n * @template U - 第二个数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 元组数组\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n\n for (let i = 0; i < length; i++) {\n const first = arr1[i];\n const second = arr2[i];\n if (first !== undefined && second !== undefined) {\n result.push([first, second]);\n }\n }\n\n return result;\n}\n\n/**\n * 返回数组的第一个元素,如果为空则返回 undefined。\n *\n * @example\n * ```typescript\n * first([1, 2, 3]); // 1\n * first([]); // undefined\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 第一个元素或 undefined\n */\nexport function first<T>(array: readonly T[]): T | undefined {\n return array[0];\n}\n\n/**\n * 返回数组的最后一个元素,如果为空则返回 undefined。\n *\n * @example\n * ```typescript\n * last([1, 2, 3]); // 3\n * last([]); // undefined\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 最后一个元素或 undefined\n */\nexport function last<T>(array: readonly T[]): T | undefined {\n return array[array.length - 1];\n}\n\n/**\n * 从数组中返回随机元素。\n *\n * @example\n * ```typescript\n * sample([1, 2, 3, 4, 5]); // 随机元素\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 随机元素,如果为空则返回 undefined\n */\nexport function sample<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * 随机打乱数组(Fisher-Yates 算法),返回新数组。\n *\n * @example\n * ```typescript\n * shuffle([1, 2, 3, 4, 5]); // 随机打乱\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要打乱的数组\n * @returns 新的打乱数组\n */\nexport function shuffle<T>(array: readonly T[]): T[] {\n const result = [...array];\n\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j] as T, result[i] as T];\n }\n\n return result;\n}\n\n/**\n * 创建从开始到结束(不包含)的数字数组。\n *\n * @example\n * ```typescript\n * range(5); // [0, 1, 2, 3, 4]\n * range(1, 5); // [1, 2, 3, 4]\n * range(0, 10, 2); // [0, 2, 4, 6, 8]\n * ```\n *\n * @param startOrEnd - 如果只有这一个参数,则为结束值;否则为开始值\n * @param end - 结束值(不包含)\n * @param step - 数字之间的步长\n * @returns 数字数组\n */\nexport function range(startOrEnd: number, end?: number, step: number = 1): number[] {\n let start = 0;\n let finalEnd = startOrEnd;\n\n if (end !== undefined) {\n start = startOrEnd;\n finalEnd = end;\n }\n\n if (step === 0) {\n throw new Error('Step cannot be zero');\n }\n\n const result: number[] = [];\n\n if (step > 0) {\n for (let i = start; i < finalEnd; i += step) {\n result.push(i);\n }\n } else {\n for (let i = start; i > finalEnd; i += step) {\n result.push(i);\n }\n }\n\n return result;\n}\n\n/**\n * 返回两个数组的交集。\n *\n * @example\n * ```typescript\n * intersection([1, 2, 3], [2, 3, 4]); // [2, 3]\n * ```\n *\n * @template T - 数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 两个数组中存在的元素\n */\nexport function intersection<T>(arr1: readonly T[], arr2: readonly T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => set2.has(item));\n}\n\n/**\n * 返回两个数组的差集(在 arr1 中但不在 arr2 中的元素)。\n *\n * @example\n * ```typescript\n * difference([1, 2, 3], [2, 3, 4]); // [1]\n * ```\n *\n * @template T - 数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 在 arr1 中但不在 arr2 中的元素\n */\nexport function difference<T>(arr1: readonly T[], arr2: readonly T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => !set2.has(item));\n}\n","/**\n * @fileoverview 字符串操作工具\n * @module melange/utils/string\n * @description 提供字符串操作工具,包括\n * 大小写转换、截断和格式化。\n */\n\n/**\n * 将字符串的第一个字母大写。\n *\n * @example\n * ```typescript\n * capitalize('hello'); // 'Hello'\n * capitalize('HELLO'); // 'HELLO'\n * ```\n *\n * @param str - 要大写的字符串\n * @returns 大写后的字符串\n */\nexport function capitalize(str: string): string {\n if (str.length === 0) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * 将字符串转换为驼峰命名法。\n *\n * @example\n * ```typescript\n * camelCase('hello world'); // 'helloWorld'\n * camelCase('hello-world'); // 'helloWorld'\n * camelCase('hello_world'); // 'helloWorld'\n * camelCase('HelloWorld'); // 'helloWorld'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 驼峰命名法字符串\n */\nexport function camelCase(str: string): string {\n return str\n .replace(/[\\s_-]+(.)?/g, (_, char: string | undefined) => (char ? char.toUpperCase() : ''))\n .replace(/^[A-Z]/, char => char.toLowerCase());\n}\n\n/**\n * 将字符串转换为帕斯卡命名法。\n *\n * @example\n * ```typescript\n * pascalCase('hello world'); // 'HelloWorld'\n * pascalCase('hello-world'); // 'HelloWorld'\n * pascalCase('hello_world'); // 'HelloWorld'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 帕斯卡命名法字符串\n */\nexport function pascalCase(str: string): string {\n return capitalize(camelCase(str));\n}\n\n/**\n * 将字符串转换为蛇形命名法。\n *\n * @example\n * ```typescript\n * snakeCase('helloWorld'); // 'hello_world'\n * snakeCase('HelloWorld'); // 'hello_world'\n * snakeCase('hello-world'); // 'hello_world'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 蛇形命名法字符串\n */\nexport function snakeCase(str: string): string {\n return str\n .replace(/[\\s-]+/g, '_')\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n .toLowerCase();\n}\n\n/**\n * 将字符串转换为烤肉串命名法。\n *\n * @example\n * ```typescript\n * kebabCase('helloWorld'); // 'hello-world'\n * kebabCase('HelloWorld'); // 'hello-world'\n * kebabCase('hello_world'); // 'hello-world'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 烤肉串命名法字符串\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/[\\s_]+/g, '-')\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * 将字符串转换为常量命名法。\n *\n * @example\n * ```typescript\n * constantCase('helloWorld'); // 'HELLO_WORLD'\n * constantCase('hello-world'); // 'HELLO_WORLD'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 常量命名法字符串\n */\nexport function constantCase(str: string): string {\n return snakeCase(str).toUpperCase();\n}\n\n/**\n * 将字符串截断到最大长度,必要时添加省略号。\n *\n * @example\n * ```typescript\n * truncate('Hello, World!', 10); // 'Hello, ...'\n * truncate('Hello', 10); // 'Hello'\n * truncate('Hello, World!', 10, '…'); // 'Hello, Wo…'\n * ```\n *\n * @param str - 要截断的字符串\n * @param maxLength - 最大长度\n * @param suffix - 要添加的后缀(默认:'...')\n * @returns 截断后的字符串\n */\nexport function truncate(str: string, maxLength: number, suffix: string = '...'): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * 在字符串左侧填充到最小长度。\n *\n * @example\n * ```typescript\n * padStart('5', 3, '0'); // '005'\n * padStart('42', 3, '0'); // '042'\n * ```\n *\n * @param str - 要填充的字符串\n * @param length - 目标长度\n * @param padChar - 填充字符\n * @returns 填充后的字符串\n */\nexport function padStart(str: string, length: number, padChar: string = ' '): string {\n if (str.length >= length) return str;\n const padding = padChar.repeat(Math.ceil((length - str.length) / padChar.length));\n return (padding + str).slice(-length);\n}\n\n/**\n * 在字符串右侧填充到最小长度。\n *\n * @example\n * ```typescript\n * padEnd('5', 3, '0'); // '500'\n * padEnd('42', 3, '0'); // '420'\n * ```\n *\n * @param str - 要填充的字符串\n * @param length - 目标长度\n * @param padChar - 填充字符\n * @returns 填充后的字符串\n */\nexport function padEnd(str: string, length: number, padChar: string = ' '): string {\n if (str.length >= length) return str;\n const padding = padChar.repeat(Math.ceil((length - str.length) / padChar.length));\n return (str + padding).slice(0, length);\n}\n\n/**\n * 删除前导和尾随空白并折叠多个空格。\n *\n * @example\n * ```typescript\n * collapseWhitespace(' hello world '); // 'hello world'\n * ```\n *\n * @param str - 要清理的字符串\n * @returns 清理后的字符串\n */\nexport function collapseWhitespace(str: string): string {\n return str.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * 转义特殊字符以在 HTML 中使用。\n *\n * @example\n * ```typescript\n * escapeHtml('<script>alert(\"xss\")</script>');\n * // '<script>alert("xss")</script>'\n * ```\n *\n * @param str - 要转义的字符串\n * @returns 转义后的字符串\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n\n return str.replace(/[&<>\"']/g, char => htmlEntities[char] ?? char);\n}\n\n/**\n * 反转义 HTML 实体。\n *\n * @example\n * ```typescript\n * unescapeHtml('<div>Hello</div>');\n * // '<div>Hello</div>'\n * ```\n *\n * @param str - 要反转义的字符串\n * @returns 反转义后的字符串\n */\nexport function unescapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n };\n\n return str.replace(/&(?:amp|lt|gt|quot|#39|apos);/g, entity => htmlEntities[entity] ?? entity);\n}\n\n/**\n * 生成指定长度的随机字符串。\n *\n * @example\n * ```typescript\n * randomString(10); // 'a1b2c3d4e5'\n * randomString(8, 'abc'); // 'abcabcab'\n * ```\n *\n * @param length - 要生成的字符串长度\n * @param chars - 要使用的字符(默认:字母数字)\n * @returns 随机字符串\n */\nexport function randomString(\n length: number,\n chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n}\n\n/**\n * 从字符串中提取单词。\n *\n * @example\n * ```typescript\n * words('helloWorld'); // ['hello', 'World']\n * words('hello-world'); // ['hello', 'world']\n * words('hello_world'); // ['hello', 'world']\n * ```\n *\n * @param str - 要提取单词的字符串\n * @returns 单词数组\n */\nexport function words(str: string): string[] {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[\\s_-]+/g, ' ')\n .trim()\n .split(' ')\n .filter(word => word.length > 0);\n}\n\n/**\n * 将字符串转换为标题大小写。\n *\n * @example\n * ```typescript\n * titleCase('hello world'); // 'Hello World'\n * titleCase('the quick brown fox'); // 'The Quick Brown Fox'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 标题大小写字符串\n */\nexport function titleCase(str: string): string {\n return words(str)\n .map(word => capitalize(word.toLowerCase()))\n .join(' ');\n}\n\n/**\n * 反转字符串。\n *\n * @example\n * ```typescript\n * reverse('hello'); // 'olleh'\n * ```\n *\n * @param str - 要反转的字符串\n * @returns 反转后的字符串\n */\nexport function reverse(str: string): string {\n return [...str].reverse().join('');\n}\n\n/**\n * 计算子字符串的出现次数。\n *\n * @example\n * ```typescript\n * countOccurrences('hello hello hello', 'hello'); // 3\n * ```\n *\n * @param str - 要搜索的字符串\n * @param substr - 要计数的子字符串\n * @returns 出现次数\n */\nexport function countOccurrences(str: string, substr: string): number {\n if (substr.length === 0) return 0;\n\n let count = 0;\n let pos = 0;\n\n while ((pos = str.indexOf(substr, pos)) !== -1) {\n count++;\n pos += substr.length;\n }\n\n return count;\n}\n","/**\n * @fileoverview 计时和速率限制工具\n * @module melange/utils/timing\n * @description 提供防抖、节流、延迟、\n * 重试和超时处理的工具。\n */\n\nimport type { AnyFunction } from '../types';\n\n/**\n * 创建函数的防抖版本。\n * 防抖函数会延迟调用,直到自上次调用防抖函数以来经过了 `wait` 毫秒。\n *\n * @description\n * 防抖对于限制用户输入事件(如在搜索框中打字)的速率很有用,\n * 您希望等到用户停止打字后再进行 API 调用。\n *\n * @example\n * ```typescript\n * const search = debounce((query: string) => {\n * console.log('搜索中:', query);\n * }, 300);\n *\n * search('h');\n * search('he');\n * search('hel');\n * search('hell');\n * search('hello');\n * // 只在 300ms 无调用后记录 '搜索中: hello'\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要防抖的函数\n * @param wait - 等待的毫秒数\n * @param options - 可选配置\n * @returns 函数的防抖版本\n */\nexport function debounce<T extends AnyFunction>(\n fn: T,\n wait: number,\n options?: { leading?: boolean; trailing?: boolean }\n): T & { cancel: () => void; flush: () => void } {\n const { leading = false, trailing = true } = options ?? {};\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n let lastThis: unknown = null;\n let result: ReturnType<T>;\n\n function invokeFunc(): void {\n if (lastArgs !== null) {\n result = fn.apply(lastThis, lastArgs) as ReturnType<T>;\n lastArgs = null;\n lastThis = null;\n }\n }\n\n function debounced(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n lastArgs = args;\n lastThis = this;\n\n if (leading && timeoutId === null) {\n invokeFunc();\n }\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n if (trailing) {\n invokeFunc();\n }\n timeoutId = null;\n }, wait);\n\n return result;\n }\n\n debounced.cancel = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n lastThis = null;\n };\n\n debounced.flush = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n if (trailing) {\n invokeFunc();\n }\n }\n };\n\n return debounced as T & { cancel: () => void; flush: () => void };\n}\n\n/**\n * 创建函数的节流版本。\n * 节流函数每 `limit` 毫秒最多调用一次。\n *\n * @description\n * 节流对于限制频繁触发的事件(如滚动或调整大小事件)的速率很有用,\n * 您希望确保处理程序以一致的速率运行。\n *\n * @example\n * ```typescript\n * const onScroll = throttle(() => {\n * console.log('滚动位置:', window.scrollY);\n * }, 100);\n *\n * window.addEventListener('scroll', onScroll);\n * // 滚动期间最多每 100ms 记录一次\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要节流的函数\n * @param limit - 调用之间的最小时间\n * @returns 函数的节流版本\n */\nexport function throttle<T extends AnyFunction>(fn: T, limit: number): T & { cancel: () => void } {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n let lastThis: unknown = null;\n\n function throttled(this: unknown, ...args: Parameters<T>): ReturnType<T> | undefined {\n const now = Date.now();\n const remaining = limit - (now - lastCall);\n\n lastArgs = args;\n lastThis = this;\n\n if (remaining <= 0) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastCall = now;\n return fn.apply(this, args) as ReturnType<T>;\n }\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n timeoutId = null;\n if (lastArgs !== null) {\n fn.apply(lastThis, lastArgs);\n lastArgs = null;\n lastThis = null;\n }\n }, remaining);\n }\n\n return undefined;\n }\n\n throttled.cancel = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n lastThis = null;\n };\n\n return throttled as T & { cancel: () => void };\n}\n\n/**\n * 创建在指定延迟后解决的承诺。\n *\n * @example\n * ```typescript\n * console.log('开始');\n * await delay(1000);\n * console.log('1秒后');\n *\n * // 带值\n * const result = await delay(1000, 'hello');\n * console.log(result); // 'hello'\n * ```\n *\n * @template T - 值类型\n * @param ms - 延迟毫秒数\n * @param value - 解决时的可选值\n * @returns 在延迟后解决的承诺\n */\nexport function delay<T = void>(ms: number, value?: T): Promise<T> {\n return new Promise(resolve => setTimeout(() => resolve(value as T), ms));\n}\n\n/**\n * 重试异步函数直到成功或达到最大重试次数。\n *\n * @example\n * ```typescript\n * const result = await retry(\n * () => fetch('/api/data').then(r => r.json()),\n * {\n * maxRetries: 3,\n * delay: 1000,\n * backoff: 'exponential'\n * }\n * );\n * ```\n *\n * @template T - 返回类型\n * @param fn - 要重试的异步函数\n * @param options - 重试选项\n * @returns 函数的结果\n * @throws 如果所有重试都失败,则抛出最后一个错误\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: {\n maxRetries?: number;\n delay?: number;\n backoff?: 'none' | 'linear' | 'exponential';\n onRetry?: (error: unknown, attempt: number) => void;\n }\n): Promise<T> {\n const { maxRetries = 3, delay: retryDelay = 1000, backoff = 'none', onRetry } = options ?? {};\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt < maxRetries) {\n onRetry?.(error, attempt + 1);\n\n let waitTime = retryDelay;\n if (backoff === 'linear') {\n waitTime = retryDelay * (attempt + 1);\n } else if (backoff === 'exponential') {\n waitTime = retryDelay * Math.pow(2, attempt);\n }\n\n await delay(waitTime);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * 用超时包装承诺。\n *\n * @example\n * ```typescript\n * try {\n * const result = await timeout(fetch('/api/data'), 5000);\n * } catch (error) {\n * if (error.message.includes('timed out')) {\n * console.log('请求耗时太长');\n * }\n * }\n * ```\n *\n * @template T - 承诺结果类型\n * @param promise - 要包装的承诺\n * @param ms - 超时毫秒数\n * @param errorMessage - 可选的自定义错误消息\n * @returns 如果超过超时时间则拒绝的承诺\n */\nexport function timeout<T>(promise: Promise<T>, ms: number, errorMessage?: string): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(errorMessage ?? `Operation timed out after ${ms}ms`));\n }, ms);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n}\n\n/**\n * 创建可以从外部解决或拒绝的延迟承诺。\n *\n * @example\n * ```typescript\n * const deferred = createDeferred<string>();\n *\n * setTimeout(() => {\n * deferred.resolve('Hello!');\n * }, 1000);\n *\n * const result = await deferred.promise; // 'Hello!'\n * ```\n *\n * @template T - 承诺结果类型\n * @returns 带有 promise、resolve 和 reject 的延迟对象\n */\nexport function createDeferred<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * 以并发限制运行多个异步函数。\n *\n * @example\n * ```typescript\n * const urls = ['url1', 'url2', 'url3', 'url4', 'url5'];\n *\n * const results = await parallel(\n * urls.map(url => () => fetch(url)),\n * { concurrency: 2 }\n * );\n * ```\n *\n * @template T - 结果类型\n * @param tasks - 异步任务函数数组\n * @param options - 配置选项\n * @returns 结果数组\n */\nexport async function parallel<T>(\n tasks: Array<() => Promise<T>>,\n options?: { concurrency?: number }\n): Promise<T[]> {\n const { concurrency = Infinity } = options ?? {};\n const results: T[] = new Array(tasks.length);\n let currentIndex = 0;\n\n async function runNext(): Promise<void> {\n while (currentIndex < tasks.length) {\n const index = currentIndex++;\n const task = tasks[index];\n if (task) {\n results[index] = await task();\n }\n }\n }\n\n const workers = Array.from({ length: Math.min(concurrency, tasks.length) }, () => runNext());\n\n await Promise.all(workers);\n return results;\n}\n\n/**\n * 顺序运行任务,一个接一个。\n *\n * @example\n * ```typescript\n * const results = await sequence([\n * () => fetch('/api/step1'),\n * () => fetch('/api/step2'),\n * () => fetch('/api/step3'),\n * ]);\n * ```\n *\n * @template T - 结果类型\n * @param tasks - 异步任务函数数组\n * @returns 结果数组\n */\nexport async function sequence<T>(tasks: Array<() => Promise<T>>): Promise<T[]> {\n const results: T[] = [];\n\n for (const task of tasks) {\n results.push(await task());\n }\n\n return results;\n}\n","/**\n * @fileoverview 类型检查和验证工具\n * @module melange/utils/guards\n * @description 提供类型守卫和验证函数用于\n * 运行时类型检查。\n */\n\n/**\n * 检查值是否为字符串。\n *\n * @example\n * ```typescript\n * isString('hello'); // true\n * isString(123); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是字符串则返回 true\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * 检查值是否为数字(且不是 NaN)。\n *\n * @example\n * ```typescript\n * isNumber(123); // true\n * isNumber(NaN); // false\n * isNumber('123'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有限数字则返回 true\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * 检查值是否为布尔值。\n *\n * @example\n * ```typescript\n * isBoolean(true); // true\n * isBoolean(false); // true\n * isBoolean(0); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是布尔值则返回 true\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * 检查值是否为对象(非 null 或数组)。\n *\n * @example\n * ```typescript\n * isObject({}); // true\n * isObject([]); // false\n * isObject(null); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是普通对象则返回 true\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * 检查值是否为数组。\n *\n * @example\n * ```typescript\n * isArray([]); // true\n * isArray([1, 2]); // true\n * isArray({}); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是数组则返回 true\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * 检查值是否为函数。\n *\n * @example\n * ```typescript\n * isFunction(() => {}); // true\n * isFunction(function() {}); // true\n * isFunction(async () => {}); // true\n * isFunction({}); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是函数则返回 true\n */\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n\n/**\n * 检查值是否为 null 或 undefined。\n *\n * @example\n * ```typescript\n * isNil(null); // true\n * isNil(undefined); // true\n * isNil(0); // false\n * isNil(''); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是 null 或 undefined 则返回 true\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * 检查值是否不为 null 或 undefined。\n *\n * @example\n * ```typescript\n * isNotNil(0); // true\n * isNotNil(''); // true\n * isNotNil(null); // false\n * isNotNil(undefined); // false\n * ```\n *\n * @template T - 值类型\n * @param value - 要检查的值\n * @returns 如果值不是 null 或 undefined 则返回 true\n */\nexport function isNotNil<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * 检查值是否为\"空\"。\n * 空值:null, undefined, '', [], {}, Map(0), Set(0)\n *\n * @example\n * ```typescript\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(null); // true\n * isEmpty(0); // false\n * isEmpty('hello'); // false\n * isEmpty([1]); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值为空则返回 true\n */\nexport function isEmpty(value: unknown): boolean {\n if (isNil(value)) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (value instanceof Map || value instanceof Set) return value.size === 0;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * 检查值是否不为\"空\"。\n *\n * @example\n * ```typescript\n * isNotEmpty('hello'); // true\n * isNotEmpty([1, 2]); // true\n * isNotEmpty(''); // false\n * isNotEmpty([]); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值不为空则返回 true\n */\nexport function isNotEmpty(value: unknown): boolean {\n return !isEmpty(value);\n}\n\n/**\n * 检查值是否为有效的 Date 对象。\n *\n * @example\n * ```typescript\n * isDate(new Date()); // true\n * isDate(new Date('invalid')); // false\n * isDate('2023-01-01'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效日期则返回 true\n */\nexport function isDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * 检查值是否为 Promise。\n *\n * @example\n * ```typescript\n * isPromise(Promise.resolve()); // true\n * isPromise(async () => {}); // false (函数,不是 promise)\n * isPromise({ then: () => {} }); // true (thenable)\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是 Promise 或 thenable 则返回 true\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n return (\n value instanceof Promise ||\n (value !== null &&\n typeof value === 'object' &&\n typeof (value as { then?: unknown }).then === 'function')\n );\n}\n\n/**\n * 检查值是否为 Symbol。\n *\n * @param value - 要检查的值\n * @returns 如果值是 Symbol 则返回 true\n */\nexport function isSymbol(value: unknown): value is symbol {\n return typeof value === 'symbol';\n}\n\n/**\n * 检查值是否为 BigInt。\n *\n * @param value - 要检查的值\n * @returns 如果值是 BigInt 则返回 true\n */\nexport function isBigInt(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\n/**\n * 检查值是否为有效的电子邮件地址。\n *\n * @example\n * ```typescript\n * isEmail('user@example.com'); // true\n * isEmail('user@'); // false\n * isEmail('not-an-email'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效邮箱则返回 true\n */\nexport function isEmail(value: unknown): boolean {\n if (!isString(value)) return false;\n // Basic email regex - covers most common cases\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n}\n\n/**\n * 检查值是否为有效的 UUID v4。\n *\n * @example\n * ```typescript\n * isUUID('550e8400-e29b-41d4-a716-446655440000'); // true\n * isUUID('not-a-uuid'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效 UUID 则返回 true\n */\nexport function isUUID(value: unknown): boolean {\n if (!isString(value)) return false;\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(value);\n}\n\n/**\n * 检查值是否为有效的 URL。\n *\n * @example\n * ```typescript\n * isURL('https://example.com'); // true\n * isURL('http://localhost:3000'); // true\n * isURL('not-a-url'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效 URL 则返回 true\n */\nexport function isURL(value: unknown): boolean {\n if (!isString(value)) return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 检查值是否为整数。\n *\n * @example\n * ```typescript\n * isInteger(42); // true\n * isInteger(42.0); // true\n * isInteger(42.5); // false\n * isInteger('42'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是整数则返回 true\n */\nexport function isInteger(value: unknown): value is number {\n return isNumber(value) && Number.isInteger(value);\n}\n\n/**\n * 检查值是否为正数。\n *\n * @example\n * ```typescript\n * isPositive(1); // true\n * isPositive(0); // false\n * isPositive(-1); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是正数则返回 true\n */\nexport function isPositive(value: unknown): value is number {\n return isNumber(value) && value > 0;\n}\n\n/**\n * 检查值是否为负数。\n *\n * @example\n * ```typescript\n * isNegative(-1); // true\n * isNegative(0); // false\n * isNegative(1); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是负数则返回 true\n */\nexport function isNegative(value: unknown): value is number {\n return isNumber(value) && value < 0;\n}\n\n/**\n * 检查值是否在范围内(包含边界)。\n *\n * @example\n * ```typescript\n * isInRange(5, 1, 10); // true\n * isInRange(0, 1, 10); // false\n * isInRange(1, 1, 10); // true\n * isInRange(10, 1, 10); // true\n * ```\n *\n * @param value - 要检查的值\n * @param min - 最小值\n * @param max - 最大值\n * @returns 如果值在范围内则返回 true\n */\nexport function isInRange(value: unknown, min: number, max: number): value is number {\n return isNumber(value) && value >= min && value <= max;\n}\n"]}
|