1
1
import { isNumber } from '@alwatr/is-number' ;
2
2
3
- import type { DurationString , DurationUnit } from './type' ;
4
-
5
- export * from './type' ;
6
-
7
3
/**
8
4
* Unit conversion table
9
5
*/
@@ -18,29 +14,46 @@ const unitConversion_ = {
18
14
} as const ;
19
15
20
16
/**
21
- * Parse duration string to milliseconds
17
+ * Duration unit: `s` for seconds, `m` for minutes, `h` for hours, `d` for days, `w` for weeks, `M` for months, `y` for years.
18
+ */
19
+ export type DurationUnit = keyof typeof unitConversion_ ;
20
+
21
+ /**
22
+ * Duration string format: `number + unit`, for example `10m` means 10 minutes.
23
+ */
24
+ export type DurationString = `${number } ${DurationUnit } `;
25
+
26
+ /**
27
+ * Parse duration string to milliseconds number.
22
28
*
23
29
* @param duration - duration string, for example `10m` means 10 minutes.
24
30
* @param toUnit - convert to unit, default is `ms` for milliseconds.
25
- *
26
31
* @return duration in milliseconds.
27
- *
28
32
* @example
29
33
* ```ts
30
34
* parseDuration('10m'); // 600000
31
35
* parseDuration('10m', 's'); // 600
32
36
* ```
33
37
*/
34
- export const parseDuration = ( duration : DurationString , toUnit : DurationUnit | 'ms' = 'ms' ) : number => {
35
- duration = duration . trim ( ) as DurationString ;
36
- const durationNumberStr = duration . substring ( 0 , duration . length - 1 ) . trimEnd ( ) ; // trimEnd for `10 m`
38
+ export const parseDuration = ( duration : DurationString , toUnit ?: DurationUnit ) : number => {
39
+ const durationNumberStr = duration . slice ( 0 , duration . length - 1 ) ;
37
40
if ( ! isNumber ( durationNumberStr ) ) {
38
41
throw new Error ( `not_a_number` ) ;
39
42
}
40
43
const durationNumber = + durationNumberStr ;
41
- const durationUnit = duration . substring ( duration . length - 1 ) as DurationUnit ;
42
- if ( unitConversion_ [ durationUnit ] == null ) {
43
- throw new Error ( `invalid_init` ) ;
44
+ const durationUnit = duration . slice ( - 1 ) as DurationUnit ;
45
+ const factor = unitConversion_ [ durationUnit ] ;
46
+ if ( factor === undefined ) {
47
+ throw new Error ( `invalid_unit` , { cause : { duration} } ) ;
48
+ }
49
+ const ms = durationNumber * factor ;
50
+ if ( toUnit === undefined ) {
51
+ return ms ;
52
+ }
53
+ // else
54
+ const toFactor = unitConversion_ [ toUnit ] ;
55
+ if ( toFactor === undefined ) {
56
+ throw new Error ( `invalid_unit` , { cause : { toUnit} } ) ;
44
57
}
45
- return ( durationNumber * unitConversion_ [ durationUnit ] ) / ( toUnit === 'ms' ? 1 : unitConversion_ [ toUnit ] ) ;
58
+ return ms / toFactor ;
46
59
} ;
0 commit comments