@oscarpalmer/atoms 0.77.0 → 0.77.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/dist/js/array/chunk.cjs +1 -1
- package/dist/js/array/chunk.js +1 -1
- package/dist/js/value/equal.cjs +4 -1
- package/dist/js/value/equal.js +4 -1
- package/package.json +1 -1
- package/src/js/array/chunk.ts +1 -1
- package/src/js/array/count.ts +6 -6
- package/src/js/array/exists.ts +6 -6
- package/src/js/array/filter.ts +6 -6
- package/src/js/array/find.ts +6 -6
- package/src/js/array/group-by.ts +67 -55
- package/src/js/array/index-of.ts +6 -6
- package/src/js/array/sort.ts +20 -0
- package/src/js/array/to-map.ts +55 -47
- package/src/js/array/to-record.ts +61 -57
- package/src/js/array/unique.ts +6 -6
- package/src/js/internal/value/handle.ts +5 -5
- package/src/js/value/clone.ts +3 -1
- package/src/js/value/equal.ts +4 -1
- package/src/js/value/get.ts +9 -9
- package/src/js/value/set.ts +10 -11
- package/types/array/count.d.cts +34 -2
- package/types/array/count.d.ts +3 -3
- package/types/array/exists.d.cts +34 -2
- package/types/array/exists.d.ts +3 -3
- package/types/array/filter.d.cts +34 -2
- package/types/array/filter.d.ts +3 -3
- package/types/array/find.d.cts +34 -2
- package/types/array/find.d.ts +3 -3
- package/types/array/group-by.d.cts +44 -12
- package/types/array/group-by.d.ts +14 -14
- package/types/array/index-of.d.cts +34 -2
- package/types/array/index-of.d.ts +3 -3
- package/types/array/index.d.cts +88 -46
- package/types/array/sort.d.cts +42 -0
- package/types/array/sort.d.ts +11 -1
- package/types/array/to-map.d.cts +42 -10
- package/types/array/to-map.d.ts +13 -13
- package/types/array/to-record.d.cts +44 -12
- package/types/array/to-record.d.ts +13 -13
- package/types/array/unique.d.cts +34 -2
- package/types/array/unique.d.ts +3 -3
- package/types/index.d.cts +1034 -317
- package/types/internal/value/handle.d.cts +27 -2
- package/types/internal/value/handle.d.ts +2 -2
- package/types/models.d.cts +467 -210
- package/types/value/clone.d.cts +1 -1
- package/types/value/clone.d.ts +1 -1
- package/types/value/get.d.cts +470 -211
- package/types/value/get.d.ts +3 -3
- package/types/value/index.d.cts +515 -224
- package/types/value/set.d.cts +357 -170
- package/types/value/set.d.ts +3 -3
- package/types/value/smush.d.cts +463 -209
package/types/value/set.d.cts
CHANGED
|
@@ -5,7 +5,14 @@ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/
|
|
|
5
5
|
|
|
6
6
|
@category Type
|
|
7
7
|
*/
|
|
8
|
-
export type Primitive =
|
|
8
|
+
export type Primitive =
|
|
9
|
+
| null
|
|
10
|
+
| undefined
|
|
11
|
+
| string
|
|
12
|
+
| number
|
|
13
|
+
| boolean
|
|
14
|
+
| symbol
|
|
15
|
+
| bigint;
|
|
9
16
|
declare const emptyObjectSymbol: unique symbol;
|
|
10
17
|
/**
|
|
11
18
|
Represents a strictly empty plain object, the `{}` value.
|
|
@@ -62,7 +69,11 @@ type Includes<Value extends readonly any[], Item> =
|
|
|
62
69
|
@category Type Guard
|
|
63
70
|
@category Utilities
|
|
64
71
|
*/
|
|
65
|
-
export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends
|
|
72
|
+
export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <
|
|
73
|
+
G,
|
|
74
|
+
>() => G extends B ? 1 : 2
|
|
75
|
+
? true
|
|
76
|
+
: false;
|
|
66
77
|
/**
|
|
67
78
|
Represents an object with `unknown` value. You probably want this instead of `{}`.
|
|
68
79
|
|
|
@@ -129,14 +140,16 @@ type B = StaticPartOfArray<A>;
|
|
|
129
140
|
//=> [string, number, boolean]
|
|
130
141
|
```
|
|
131
142
|
*/
|
|
132
|
-
export type StaticPartOfArray<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
143
|
+
export type StaticPartOfArray<
|
|
144
|
+
T extends UnknownArray,
|
|
145
|
+
Result extends UnknownArray = [],
|
|
146
|
+
> = T extends unknown
|
|
147
|
+
? number extends T['length']
|
|
148
|
+
? T extends readonly [infer U, ...infer V]
|
|
149
|
+
? StaticPartOfArray<V, [...Result, U]>
|
|
150
|
+
: Result
|
|
151
|
+
: T
|
|
152
|
+
: never; // Should never happen
|
|
140
153
|
/**
|
|
141
154
|
Returns the variable, non-fixed-length portion of the given array, excluding static-length parts.
|
|
142
155
|
|
|
@@ -147,11 +160,11 @@ type B = VariablePartOfArray<A>;
|
|
|
147
160
|
//=> string[]
|
|
148
161
|
```
|
|
149
162
|
*/
|
|
150
|
-
export type VariablePartOfArray<T extends UnknownArray> = T extends unknown
|
|
151
|
-
...StaticPartOfArray<T>,
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
163
|
+
export type VariablePartOfArray<T extends UnknownArray> = T extends unknown
|
|
164
|
+
? T extends readonly [...StaticPartOfArray<T>, ...infer U]
|
|
165
|
+
? U
|
|
166
|
+
: []
|
|
167
|
+
: never; // Should never happen
|
|
155
168
|
/**
|
|
156
169
|
Returns a boolean for whether the given type is `any`.
|
|
157
170
|
|
|
@@ -194,7 +207,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
|
|
|
194
207
|
*/
|
|
195
208
|
// See https://github.com/microsoft/TypeScript/issues/31752
|
|
196
209
|
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
197
|
-
export type PositiveInfinity =
|
|
210
|
+
export type PositiveInfinity = 1e999;
|
|
198
211
|
/**
|
|
199
212
|
Matches the hidden `-Infinity` type.
|
|
200
213
|
|
|
@@ -206,7 +219,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
|
|
|
206
219
|
*/
|
|
207
220
|
// See https://github.com/microsoft/TypeScript/issues/31752
|
|
208
221
|
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
209
|
-
export type NegativeInfinity = -
|
|
222
|
+
export type NegativeInfinity = -1e999;
|
|
210
223
|
/**
|
|
211
224
|
A negative `number`/`bigint` (`-∞ < x < 0`)
|
|
212
225
|
|
|
@@ -217,7 +230,11 @@ Use-case: Validating and documenting parameters.
|
|
|
217
230
|
|
|
218
231
|
@category Numeric
|
|
219
232
|
*/
|
|
220
|
-
export type Negative<T extends Numeric> = T extends Zero
|
|
233
|
+
export type Negative<T extends Numeric> = T extends Zero
|
|
234
|
+
? never
|
|
235
|
+
: `${T}` extends `-${string}`
|
|
236
|
+
? T
|
|
237
|
+
: never;
|
|
221
238
|
/**
|
|
222
239
|
Returns a boolean for whether the given number is a negative number.
|
|
223
240
|
|
|
@@ -233,7 +250,9 @@ type ShouldBeTrue = IsNegative<-1>;
|
|
|
233
250
|
|
|
234
251
|
@category Numeric
|
|
235
252
|
*/
|
|
236
|
-
export type IsNegative<T extends Numeric> = T extends Negative<T>
|
|
253
|
+
export type IsNegative<T extends Numeric> = T extends Negative<T>
|
|
254
|
+
? true
|
|
255
|
+
: false;
|
|
237
256
|
/**
|
|
238
257
|
Returns a boolean for whether two given types are both true.
|
|
239
258
|
|
|
@@ -254,11 +273,12 @@ And<true, false>;
|
|
|
254
273
|
*/
|
|
255
274
|
export type And<A extends boolean, B extends boolean> = [
|
|
256
275
|
A,
|
|
257
|
-
B
|
|
258
|
-
][number] extends true
|
|
259
|
-
|
|
260
|
-
IsEqual<B, false>
|
|
261
|
-
|
|
276
|
+
B,
|
|
277
|
+
][number] extends true
|
|
278
|
+
? true
|
|
279
|
+
: true extends [IsEqual<A, false>, IsEqual<B, false>][number]
|
|
280
|
+
? false
|
|
281
|
+
: never;
|
|
262
282
|
/**
|
|
263
283
|
Returns a boolean for whether either of two given types are true.
|
|
264
284
|
|
|
@@ -279,11 +299,12 @@ Or<false, false>;
|
|
|
279
299
|
*/
|
|
280
300
|
export type Or<A extends boolean, B extends boolean> = [
|
|
281
301
|
A,
|
|
282
|
-
B
|
|
283
|
-
][number] extends false
|
|
284
|
-
|
|
285
|
-
IsEqual<B, true>
|
|
286
|
-
|
|
302
|
+
B,
|
|
303
|
+
][number] extends false
|
|
304
|
+
? false
|
|
305
|
+
: true extends [IsEqual<A, true>, IsEqual<B, true>][number]
|
|
306
|
+
? true
|
|
307
|
+
: never;
|
|
287
308
|
/**
|
|
288
309
|
Returns a boolean for whether a given number is greater than another number.
|
|
289
310
|
|
|
@@ -301,32 +322,44 @@ GreaterThan<1, 5>;
|
|
|
301
322
|
//=> false
|
|
302
323
|
```
|
|
303
324
|
*/
|
|
304
|
-
export type GreaterThan<A extends number, B extends number> = number extends
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
]
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
] extends R
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
]
|
|
325
|
+
export type GreaterThan<A extends number, B extends number> = number extends
|
|
326
|
+
| A
|
|
327
|
+
| B
|
|
328
|
+
? never
|
|
329
|
+
: [
|
|
330
|
+
IsEqual<A, PositiveInfinity>,
|
|
331
|
+
IsEqual<A, NegativeInfinity>,
|
|
332
|
+
IsEqual<B, PositiveInfinity>,
|
|
333
|
+
IsEqual<B, NegativeInfinity>,
|
|
334
|
+
] extends infer R extends [boolean, boolean, boolean, boolean]
|
|
335
|
+
? Or<
|
|
336
|
+
And<IsEqual<R[0], true>, IsEqual<R[2], false>>,
|
|
337
|
+
And<IsEqual<R[3], true>, IsEqual<R[1], false>>
|
|
338
|
+
> extends true
|
|
339
|
+
? true
|
|
340
|
+
: Or<
|
|
341
|
+
And<IsEqual<R[1], true>, IsEqual<R[3], false>>,
|
|
342
|
+
And<IsEqual<R[2], true>, IsEqual<R[0], false>>
|
|
343
|
+
> extends true
|
|
344
|
+
? false
|
|
345
|
+
: true extends R[number]
|
|
346
|
+
? false
|
|
347
|
+
: [IsNegative<A>, IsNegative<B>] extends infer R extends [
|
|
348
|
+
boolean,
|
|
349
|
+
boolean,
|
|
350
|
+
]
|
|
351
|
+
? [true, false] extends R
|
|
352
|
+
? false
|
|
353
|
+
: [false, true] extends R
|
|
354
|
+
? true
|
|
355
|
+
: [false, false] extends R
|
|
356
|
+
? PositiveNumericStringGt<`${A}`, `${B}`>
|
|
357
|
+
: PositiveNumericStringGt<
|
|
358
|
+
`${NumberAbsolute<B>}`,
|
|
359
|
+
`${NumberAbsolute<A>}`
|
|
360
|
+
>
|
|
361
|
+
: never
|
|
362
|
+
: never;
|
|
330
363
|
/**
|
|
331
364
|
Returns a boolean for whether a given number is greater than or equal to another number.
|
|
332
365
|
|
|
@@ -344,7 +377,10 @@ GreaterThanOrEqual<1, 5>;
|
|
|
344
377
|
//=> false
|
|
345
378
|
```
|
|
346
379
|
*/
|
|
347
|
-
export type GreaterThanOrEqual<
|
|
380
|
+
export type GreaterThanOrEqual<
|
|
381
|
+
A extends number,
|
|
382
|
+
B extends number,
|
|
383
|
+
> = number extends A | B ? never : A extends B ? true : GreaterThan<A, B>;
|
|
348
384
|
/**
|
|
349
385
|
Returns a boolean for whether a given number is less than another number.
|
|
350
386
|
|
|
@@ -362,7 +398,11 @@ LessThan<1, 5>;
|
|
|
362
398
|
//=> true
|
|
363
399
|
```
|
|
364
400
|
*/
|
|
365
|
-
export type LessThan<A extends number, B extends number> = number extends A | B
|
|
401
|
+
export type LessThan<A extends number, B extends number> = number extends A | B
|
|
402
|
+
? never
|
|
403
|
+
: GreaterThanOrEqual<A, B> extends true
|
|
404
|
+
? false
|
|
405
|
+
: true;
|
|
366
406
|
/**
|
|
367
407
|
Create a tuple type of the given length `<L>` and fill it with the given type `<Fill>`.
|
|
368
408
|
|
|
@@ -370,11 +410,11 @@ If `<Fill>` is not provided, it will default to `unknown`.
|
|
|
370
410
|
|
|
371
411
|
@link https://itnext.io/implementing-arithmetic-within-typescripts-type-system-a1ef140a6f6f
|
|
372
412
|
*/
|
|
373
|
-
export type BuildTuple<
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
]>;
|
|
413
|
+
export type BuildTuple<
|
|
414
|
+
L extends number,
|
|
415
|
+
Fill = unknown,
|
|
416
|
+
T extends readonly unknown[] = [],
|
|
417
|
+
> = T['length'] extends L ? T : BuildTuple<L, Fill, [...T, Fill]>;
|
|
378
418
|
/**
|
|
379
419
|
Returns the maximum value from a tuple of integers.
|
|
380
420
|
|
|
@@ -390,10 +430,16 @@ ArrayMax<[1, 2, 5, 3, 99, -1]>;
|
|
|
390
430
|
//=> 99
|
|
391
431
|
```
|
|
392
432
|
*/
|
|
393
|
-
export type TupleMax<
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
433
|
+
export type TupleMax<
|
|
434
|
+
A extends number[],
|
|
435
|
+
Result extends number = NegativeInfinity,
|
|
436
|
+
> = number extends A[number]
|
|
437
|
+
? never
|
|
438
|
+
: A extends [infer F extends number, ...infer R extends number[]]
|
|
439
|
+
? GreaterThan<F, Result> extends true
|
|
440
|
+
? TupleMax<R, F>
|
|
441
|
+
: TupleMax<R, Result>
|
|
442
|
+
: Result;
|
|
397
443
|
/**
|
|
398
444
|
Returns the minimum value from a tuple of integers.
|
|
399
445
|
|
|
@@ -409,10 +455,16 @@ ArrayMin<[1, 2, 5, 3, -5]>;
|
|
|
409
455
|
//=> -5
|
|
410
456
|
```
|
|
411
457
|
*/
|
|
412
|
-
export type TupleMin<
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
458
|
+
export type TupleMin<
|
|
459
|
+
A extends number[],
|
|
460
|
+
Result extends number = PositiveInfinity,
|
|
461
|
+
> = number extends A[number]
|
|
462
|
+
? never
|
|
463
|
+
: A extends [infer F extends number, ...infer R extends number[]]
|
|
464
|
+
? LessThan<F, Result> extends true
|
|
465
|
+
? TupleMin<R, F>
|
|
466
|
+
: TupleMin<R, Result>
|
|
467
|
+
: Result;
|
|
416
468
|
/**
|
|
417
469
|
Return a string representation of the given string or number.
|
|
418
470
|
|
|
@@ -447,7 +499,14 @@ type NegativeInfinity = StringToNumber<'-Infinity'>;
|
|
|
447
499
|
@category Numeric
|
|
448
500
|
@category Template literal
|
|
449
501
|
*/
|
|
450
|
-
export type StringToNumber<S extends string> =
|
|
502
|
+
export type StringToNumber<S extends string> =
|
|
503
|
+
S extends `${infer N extends number}`
|
|
504
|
+
? N
|
|
505
|
+
: S extends 'Infinity'
|
|
506
|
+
? PositiveInfinity
|
|
507
|
+
: S extends '-Infinity'
|
|
508
|
+
? NegativeInfinity
|
|
509
|
+
: never;
|
|
451
510
|
/**
|
|
452
511
|
Returns an array of the characters of the string.
|
|
453
512
|
|
|
@@ -462,11 +521,14 @@ StringToArray<string>;
|
|
|
462
521
|
|
|
463
522
|
@category String
|
|
464
523
|
*/
|
|
465
|
-
export type StringToArray<
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
524
|
+
export type StringToArray<
|
|
525
|
+
S extends string,
|
|
526
|
+
Result extends string[] = [],
|
|
527
|
+
> = string extends S
|
|
528
|
+
? never
|
|
529
|
+
: S extends `${infer F}${infer R}`
|
|
530
|
+
? StringToArray<R, [...Result, F]>
|
|
531
|
+
: Result;
|
|
470
532
|
/**
|
|
471
533
|
Returns the length of the given string.
|
|
472
534
|
|
|
@@ -482,7 +544,9 @@ StringLength<string>;
|
|
|
482
544
|
@category String
|
|
483
545
|
@category Template literal
|
|
484
546
|
*/
|
|
485
|
-
export type StringLength<S extends string> = string extends S
|
|
547
|
+
export type StringLength<S extends string> = string extends S
|
|
548
|
+
? never
|
|
549
|
+
: StringToArray<S>['length'];
|
|
486
550
|
/**
|
|
487
551
|
Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both numeric strings and have the same length.
|
|
488
552
|
|
|
@@ -495,8 +559,17 @@ SameLengthPositiveNumericStringGt<'10', '10'>;
|
|
|
495
559
|
//=> false
|
|
496
560
|
```
|
|
497
561
|
*/
|
|
498
|
-
export type SameLengthPositiveNumericStringGt<
|
|
499
|
-
|
|
562
|
+
export type SameLengthPositiveNumericStringGt<
|
|
563
|
+
A extends string,
|
|
564
|
+
B extends string,
|
|
565
|
+
> = A extends `${infer FirstA}${infer RestA}`
|
|
566
|
+
? B extends `${infer FirstB}${infer RestB}`
|
|
567
|
+
? FirstA extends FirstB
|
|
568
|
+
? SameLengthPositiveNumericStringGt<RestA, RestB>
|
|
569
|
+
: PositiveNumericCharacterGt<FirstA, FirstB>
|
|
570
|
+
: never
|
|
571
|
+
: false;
|
|
572
|
+
export type NumericString = '0123456789';
|
|
500
573
|
/**
|
|
501
574
|
Returns a boolean for whether `A` is greater than `B`, where `A` and `B` are both positive numeric strings.
|
|
502
575
|
|
|
@@ -512,16 +585,21 @@ PositiveNumericStringGt<'1', '500'>;
|
|
|
512
585
|
//=> false
|
|
513
586
|
```
|
|
514
587
|
*/
|
|
515
|
-
export type PositiveNumericStringGt<
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
588
|
+
export type PositiveNumericStringGt<
|
|
589
|
+
A extends string,
|
|
590
|
+
B extends string,
|
|
591
|
+
> = A extends B
|
|
592
|
+
? false
|
|
593
|
+
: [
|
|
594
|
+
BuildTuple<StringLength<A>, 0>,
|
|
595
|
+
BuildTuple<StringLength<B>, 0>,
|
|
596
|
+
] extends infer R extends [readonly unknown[], readonly unknown[]]
|
|
597
|
+
? R[0] extends [...R[1], ...infer Remain extends readonly unknown[]]
|
|
598
|
+
? 0 extends Remain['length']
|
|
599
|
+
? SameLengthPositiveNumericStringGt<A, B>
|
|
600
|
+
: true
|
|
601
|
+
: false
|
|
602
|
+
: never;
|
|
525
603
|
/**
|
|
526
604
|
Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both positive numeric characters.
|
|
527
605
|
|
|
@@ -534,7 +612,16 @@ PositiveNumericCharacterGt<'1', '1'>;
|
|
|
534
612
|
//=> false
|
|
535
613
|
```
|
|
536
614
|
*/
|
|
537
|
-
export type PositiveNumericCharacterGt<
|
|
615
|
+
export type PositiveNumericCharacterGt<
|
|
616
|
+
A extends string,
|
|
617
|
+
B extends string,
|
|
618
|
+
> = NumericString extends `${infer HeadA}${A}${infer TailA}`
|
|
619
|
+
? NumericString extends `${infer HeadB}${B}${infer TailB}`
|
|
620
|
+
? HeadA extends `${HeadB}${infer _}${infer __}`
|
|
621
|
+
? true
|
|
622
|
+
: false
|
|
623
|
+
: never
|
|
624
|
+
: never;
|
|
538
625
|
/**
|
|
539
626
|
Returns the absolute value of a given value.
|
|
540
627
|
|
|
@@ -550,7 +637,10 @@ NumberAbsolute<NegativeInfinity>
|
|
|
550
637
|
//=> PositiveInfinity
|
|
551
638
|
```
|
|
552
639
|
*/
|
|
553
|
-
export type NumberAbsolute<N extends number> =
|
|
640
|
+
export type NumberAbsolute<N extends number> =
|
|
641
|
+
`${N}` extends `-${infer StringPositiveN}`
|
|
642
|
+
? StringToNumber<StringPositiveN>
|
|
643
|
+
: N;
|
|
554
644
|
/**
|
|
555
645
|
Check whether the given type is a number or a number string.
|
|
556
646
|
|
|
@@ -570,7 +660,13 @@ type C = IsNumberLike<1>;
|
|
|
570
660
|
type D = IsNumberLike<'a'>;
|
|
571
661
|
//=> false
|
|
572
662
|
*/
|
|
573
|
-
export type IsNumberLike<N> = N extends number
|
|
663
|
+
export type IsNumberLike<N> = N extends number
|
|
664
|
+
? true
|
|
665
|
+
: N extends `${number}`
|
|
666
|
+
? true
|
|
667
|
+
: N extends `${number}.${number}`
|
|
668
|
+
? true
|
|
669
|
+
: false;
|
|
574
670
|
/**
|
|
575
671
|
Matches any primitive, `void`, `Date`, or `RegExp` value.
|
|
576
672
|
*/
|
|
@@ -578,7 +674,12 @@ export type BuiltIns = Primitive | void | Date | RegExp;
|
|
|
578
674
|
/**
|
|
579
675
|
Matches non-recursive types.
|
|
580
676
|
*/
|
|
581
|
-
export type NonRecursiveType =
|
|
677
|
+
export type NonRecursiveType =
|
|
678
|
+
| BuiltIns
|
|
679
|
+
| Function
|
|
680
|
+
| (new (
|
|
681
|
+
...arguments_: any[]
|
|
682
|
+
) => unknown);
|
|
582
683
|
/**
|
|
583
684
|
Returns the sum of two numbers.
|
|
584
685
|
|
|
@@ -610,35 +711,45 @@ Sum<PositiveInfinity, NegativeInfinity>;
|
|
|
610
711
|
@category Numeric
|
|
611
712
|
*/
|
|
612
713
|
// TODO: Support big integer and negative number.
|
|
613
|
-
export type Sum<A extends number, B extends number> = number extends A | B
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
714
|
+
export type Sum<A extends number, B extends number> = number extends A | B
|
|
715
|
+
? number
|
|
716
|
+
: [
|
|
717
|
+
IsEqual<A, PositiveInfinity>,
|
|
718
|
+
IsEqual<A, NegativeInfinity>,
|
|
719
|
+
IsEqual<B, PositiveInfinity>,
|
|
720
|
+
IsEqual<B, NegativeInfinity>,
|
|
721
|
+
] extends infer R extends [boolean, boolean, boolean, boolean]
|
|
722
|
+
? Or<
|
|
723
|
+
And<IsEqual<R[0], true>, IsEqual<R[3], false>>,
|
|
724
|
+
And<IsEqual<R[2], true>, IsEqual<R[1], false>>
|
|
725
|
+
> extends true
|
|
726
|
+
? PositiveInfinity
|
|
727
|
+
: Or<
|
|
728
|
+
And<IsEqual<R[1], true>, IsEqual<R[2], false>>,
|
|
729
|
+
And<IsEqual<R[3], true>, IsEqual<R[0], false>>
|
|
730
|
+
> extends true
|
|
731
|
+
? NegativeInfinity
|
|
732
|
+
: true extends R[number]
|
|
733
|
+
? number
|
|
734
|
+
: ([IsNegative<A>, IsNegative<B>] extends infer R
|
|
735
|
+
? [false, false] extends R
|
|
736
|
+
? [...BuildTuple<A>, ...BuildTuple<B>]['length']
|
|
737
|
+
: [true, true] extends R
|
|
738
|
+
? number
|
|
739
|
+
: TupleMax<
|
|
740
|
+
[NumberAbsolute<A>, NumberAbsolute<B>]
|
|
741
|
+
> extends infer Max_
|
|
742
|
+
? TupleMin<
|
|
743
|
+
[NumberAbsolute<A>, NumberAbsolute<B>]
|
|
744
|
+
> extends infer Min_ extends number
|
|
745
|
+
? Max_ extends A | B
|
|
746
|
+
? Subtract<Max_, Min_>
|
|
747
|
+
: number
|
|
748
|
+
: never
|
|
749
|
+
: never
|
|
750
|
+
: never) &
|
|
751
|
+
number
|
|
752
|
+
: never;
|
|
642
753
|
/**
|
|
643
754
|
Returns the difference between two numbers.
|
|
644
755
|
|
|
@@ -669,29 +780,40 @@ Subtract<PositiveInfinity, PositiveInfinity>;
|
|
|
669
780
|
@category Numeric
|
|
670
781
|
*/
|
|
671
782
|
// TODO: Support big integer and negative number.
|
|
672
|
-
export type Subtract<A extends number, B extends number> = number extends A | B
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
783
|
+
export type Subtract<A extends number, B extends number> = number extends A | B
|
|
784
|
+
? number
|
|
785
|
+
: [
|
|
786
|
+
IsEqual<A, PositiveInfinity>,
|
|
787
|
+
IsEqual<A, NegativeInfinity>,
|
|
788
|
+
IsEqual<B, PositiveInfinity>,
|
|
789
|
+
IsEqual<B, NegativeInfinity>,
|
|
790
|
+
] extends infer R extends [boolean, boolean, boolean, boolean]
|
|
791
|
+
? Or<
|
|
792
|
+
And<IsEqual<R[0], true>, IsEqual<R[2], false>>,
|
|
793
|
+
And<IsEqual<R[3], true>, IsEqual<R[1], false>>
|
|
794
|
+
> extends true
|
|
795
|
+
? PositiveInfinity
|
|
796
|
+
: Or<
|
|
797
|
+
And<IsEqual<R[1], true>, IsEqual<R[3], false>>,
|
|
798
|
+
And<IsEqual<R[2], true>, IsEqual<R[0], false>>
|
|
799
|
+
> extends true
|
|
800
|
+
? NegativeInfinity
|
|
801
|
+
: true extends R[number]
|
|
802
|
+
? number
|
|
803
|
+
: [IsNegative<A>, IsNegative<B>] extends infer R
|
|
804
|
+
? [false, false] extends R
|
|
805
|
+
? BuildTuple<A> extends infer R
|
|
806
|
+
? R extends [...BuildTuple<B>, ...infer R]
|
|
807
|
+
? R['length']
|
|
808
|
+
: number
|
|
809
|
+
: never
|
|
810
|
+
: LessThan<A, B> extends true
|
|
811
|
+
? number
|
|
812
|
+
: [false, true] extends R
|
|
813
|
+
? Sum<A, NumberAbsolute<B>>
|
|
814
|
+
: Subtract<NumberAbsolute<B>, NumberAbsolute<A>>
|
|
815
|
+
: never
|
|
816
|
+
: never;
|
|
695
817
|
/**
|
|
696
818
|
Paths options.
|
|
697
819
|
|
|
@@ -782,36 +904,96 @@ open('listB.1'); // TypeError. Because listB only has one element.
|
|
|
782
904
|
@category Object
|
|
783
905
|
@category Array
|
|
784
906
|
*/
|
|
785
|
-
export type Paths<T, Options extends PathsOptions = {}> = _Paths<
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
]
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
907
|
+
export type Paths<T, Options extends PathsOptions = {}> = _Paths<
|
|
908
|
+
T,
|
|
909
|
+
{
|
|
910
|
+
// Set default maxRecursionDepth to 10
|
|
911
|
+
maxRecursionDepth: Options['maxRecursionDepth'] extends number
|
|
912
|
+
? Options['maxRecursionDepth']
|
|
913
|
+
: DefaultPathsOptions['maxRecursionDepth'];
|
|
914
|
+
// Set default bracketNotation to false
|
|
915
|
+
bracketNotation: Options['bracketNotation'] extends boolean
|
|
916
|
+
? Options['bracketNotation']
|
|
917
|
+
: DefaultPathsOptions['bracketNotation'];
|
|
918
|
+
}
|
|
919
|
+
>;
|
|
920
|
+
export type _Paths<T, Options extends Required<PathsOptions>> = T extends
|
|
921
|
+
| NonRecursiveType
|
|
922
|
+
| ReadonlyMap<unknown, unknown>
|
|
923
|
+
| ReadonlySet<unknown>
|
|
924
|
+
? never
|
|
925
|
+
: IsAny<T> extends true
|
|
926
|
+
? never
|
|
927
|
+
: T extends UnknownArray
|
|
928
|
+
? number extends T['length']
|
|
929
|
+
?
|
|
930
|
+
| InternalPaths<StaticPartOfArray<T>, Options>
|
|
931
|
+
| InternalPaths<Array<VariablePartOfArray<T>[number]>, Options>
|
|
932
|
+
: InternalPaths<T, Options>
|
|
933
|
+
: T extends object
|
|
934
|
+
? InternalPaths<T, Options>
|
|
935
|
+
: never;
|
|
936
|
+
export type InternalPaths<
|
|
937
|
+
T,
|
|
938
|
+
Options extends Required<PathsOptions>,
|
|
939
|
+
> = Options['maxRecursionDepth'] extends infer MaxDepth extends number
|
|
940
|
+
? Required<T> extends infer T
|
|
941
|
+
? T extends EmptyObject | readonly []
|
|
942
|
+
? never
|
|
943
|
+
: {
|
|
944
|
+
[Key in keyof T]: Key extends string | number // Limit `Key` to string or number.
|
|
945
|
+
? (
|
|
946
|
+
Options['bracketNotation'] extends true
|
|
947
|
+
? IsNumberLike<Key> extends true
|
|
948
|
+
? `[${Key}]`
|
|
949
|
+
: Key | ToString<Key>
|
|
950
|
+
: never | Options['bracketNotation'] extends false
|
|
951
|
+
? Key | ToString<Key>
|
|
952
|
+
: never
|
|
953
|
+
) extends infer TranformedKey extends string | number
|
|
954
|
+
? // 1. If style is 'a[0].b' and 'Key' is a numberlike value like 3 or '3', transform 'Key' to `[${Key}]`, else to `${Key}` | Key
|
|
955
|
+
// 2. If style is 'a.0.b', transform 'Key' to `${Key}` | Key
|
|
956
|
+
| TranformedKey
|
|
957
|
+
// Recursively generate paths for the current key
|
|
958
|
+
| (GreaterThan<MaxDepth, 0> extends true // Limit the depth to prevent infinite recursion
|
|
959
|
+
? _Paths<
|
|
960
|
+
T[Key],
|
|
961
|
+
{
|
|
962
|
+
bracketNotation: Options['bracketNotation'];
|
|
963
|
+
maxRecursionDepth: Subtract<MaxDepth, 1>;
|
|
964
|
+
}
|
|
965
|
+
> extends infer SubPath
|
|
966
|
+
? SubPath extends string | number
|
|
967
|
+
?
|
|
968
|
+
| (Options['bracketNotation'] extends true
|
|
969
|
+
? SubPath extends
|
|
970
|
+
| `[${any}]`
|
|
971
|
+
| `[${any}]${string}`
|
|
972
|
+
? `${TranformedKey}${SubPath}` // If next node is number key like `[3]`, no need to add `.` before it.
|
|
973
|
+
: `${TranformedKey}.${SubPath}`
|
|
974
|
+
: never)
|
|
975
|
+
| (Options['bracketNotation'] extends false
|
|
976
|
+
? `${TranformedKey}.${SubPath}`
|
|
977
|
+
: never)
|
|
978
|
+
: never
|
|
979
|
+
: never
|
|
980
|
+
: never)
|
|
981
|
+
: never
|
|
982
|
+
: never;
|
|
983
|
+
}[keyof T & (T extends UnknownArray ? number : unknown)]
|
|
984
|
+
: never
|
|
985
|
+
: never;
|
|
986
|
+
export type ArrayOrPlainObject = UnknownArray | UnknownRecord;
|
|
808
987
|
/**
|
|
809
988
|
* - Set the value in an object using a known path
|
|
810
989
|
* - You can set a nested value by using dot notation, e.g., `foo.bar.baz`
|
|
811
990
|
* - If a part of the path does not exist, it will be created, either as an array or a generic object, depending on the path
|
|
812
991
|
* - Returns the original object
|
|
813
992
|
*/
|
|
814
|
-
export declare function setValue<
|
|
993
|
+
export declare function setValue<
|
|
994
|
+
Data extends ArrayOrPlainObject,
|
|
995
|
+
Path extends Paths<Data>,
|
|
996
|
+
>(data: Data, path: Path, value: unknown): Data;
|
|
815
997
|
/**
|
|
816
998
|
* - Set the value in an object using an unknown path
|
|
817
999
|
* - You can set a nested value by using dot notation, e.g., `foo.bar.baz`
|
|
@@ -819,6 +1001,11 @@ export declare function setValue<Data extends PlainObject, Path extends Paths<Da
|
|
|
819
1001
|
* - If `ignoreCase` is `true`, path matching will be case-insensitive
|
|
820
1002
|
* - Returns the original object
|
|
821
1003
|
*/
|
|
822
|
-
export declare function setValue<Data extends
|
|
1004
|
+
export declare function setValue<Data extends ArrayOrPlainObject>(
|
|
1005
|
+
data: Data,
|
|
1006
|
+
path: string,
|
|
1007
|
+
value: unknown,
|
|
1008
|
+
ignoreCase?: boolean,
|
|
1009
|
+
): Data;
|
|
823
1010
|
|
|
824
1011
|
export {};
|