Skip to content

Commit be62163

Browse files
committed
feat(parse-duration): rewrite module 🤦🏻
1 parent a6343d2 commit be62163

File tree

5 files changed

+44
-43
lines changed

5 files changed

+44
-43
lines changed

packages/parse-duration/README.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Parse-duration
22

3-
A simple utility to parse a duration string into milliseconds.
3+
A simple utility to parse a duration string into milliseconds number.
44

55
## Installation
66

@@ -23,14 +23,14 @@ parseDuration('10y'); // 315,360,000,000
2323
parseDuration('10d', 'h'); // 240
2424
```
2525

26-
### Abbreviation Table
27-
28-
| Abbreviation | Description |
29-
|--------------|-------------|
30-
| `s` | Second |
31-
| `m` | Minute |
32-
| `h` | Hour |
33-
| `d` | Day |
34-
| `w` | Week |
35-
| `M` | Month |
36-
| `y` | Year |
26+
### Unit Table
27+
28+
| Unit | Description |
29+
|------|--------|
30+
| `s` | Second |
31+
| `m` | Minute |
32+
| `h` | Hour |
33+
| `d` | Day |
34+
| `w` | Week |
35+
| `M` | Month |
36+
| `y` | Year |

packages/parse-duration/package.json

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@alwatr/parse-duration",
33
"version": "0.0.0",
4-
"description": "A simple utility to parse a duration string into milliseconds.",
4+
"description": "A simple utility to parse a duration string into milliseconds number.",
55
"author": "S. Ali Mihandoost <[email protected]>",
66
"keywords": [
77
"parse",
@@ -14,9 +14,6 @@
1414
"javascript",
1515
"node",
1616
"nodejs",
17-
"deno",
18-
"web-worker",
19-
"nwjs",
2017
"browser",
2118
"esm",
2219
"module",
@@ -75,8 +72,5 @@
7572
"@alwatr/tsconfig-base": "workspace:^",
7673
"@types/node": "^20.10.8",
7774
"typescript": "^5.3.3"
78-
},
79-
"dependencies": {
80-
"@alwatr/is-number": "workspace:^"
8175
}
8276
}

packages/parse-duration/src/main.ts

+27-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import {isNumber} from '@alwatr/is-number';
22

3-
import type {DurationString, DurationUnit} from './type';
4-
5-
export * from './type';
6-
73
/**
84
* Unit conversion table
95
*/
@@ -18,29 +14,46 @@ const unitConversion_ = {
1814
} as const;
1915

2016
/**
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.
2228
*
2329
* @param duration - duration string, for example `10m` means 10 minutes.
2430
* @param toUnit - convert to unit, default is `ms` for milliseconds.
25-
*
2631
* @return duration in milliseconds.
27-
*
2832
* @example
2933
* ```ts
3034
* parseDuration('10m'); // 600000
3135
* parseDuration('10m', 's'); // 600
3236
* ```
3337
*/
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);
3740
if (!isNumber(durationNumberStr)) {
3841
throw new Error(`not_a_number`);
3942
}
4043
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}});
4457
}
45-
return (durationNumber * unitConversion_[durationUnit]) / (toUnit === 'ms' ? 1 : unitConversion_[toUnit]);
58+
return ms / toFactor;
4659
};

packages/parse-duration/src/type.ts

-9
This file was deleted.

packages/parse-duration/tsconfig.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@
66
"emitDeclarationOnly": true,
77
"composite": true,
88
},
9-
"include": ["src/**/*.ts"]
9+
"include": ["src/**/*.ts"],
10+
"references": [
11+
{"path": "../is-number"}
12+
]
1013
}

0 commit comments

Comments
 (0)