Skip to content

Commit 228dd07

Browse files
authored
Improve output for big numbers, require Node.js 18 (#65)
1 parent 8113894 commit 228dd07

5 files changed

Lines changed: 135 additions & 121 deletions

File tree

.github/workflows/main.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ jobs:
1010
fail-fast: false
1111
matrix:
1212
node-version:
13+
- 20
1314
- 18
14-
- 16
15-
- 14
1615
steps:
17-
- uses: actions/checkout@v3
18-
- uses: actions/setup-node@v3
16+
- uses: actions/checkout@v4
17+
- uses: actions/setup-node@v4
1918
with:
2019
node-version: ${{ matrix.node-version }}
2120
- run: npm install

index.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export interface Options {
1+
export type Options = {
22
/**
33
Number of digits to appear after the seconds decimal point.
44
@@ -75,7 +75,7 @@ export interface Options {
7575
@default false
7676
*/
7777
readonly colonNotation?: boolean;
78-
}
78+
};
7979

8080
/**
8181
Convert milliseconds to a human readable string: `1337000000` → `15d 11h 23m 20s`.

index.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import parseMilliseconds from 'parse-ms';
22

3-
const pluralize = (word, count) => count === 1 ? word : `${word}s`;
3+
const isZero = value => value === 0 || value === 0n;
4+
const pluralize = (word, count) => (count === 1 || count === 1n) ? word : `${word}s`;
45

56
const SECOND_ROUNDING_EPSILON = 0.000_000_1;
67

@@ -30,7 +31,10 @@ export default function prettyMilliseconds(milliseconds, options = {}) {
3031
};
3132

3233
const add = (value, long, short, valueString) => {
33-
if ((result.length === 0 || !options.colonNotation) && value === 0 && !(options.colonNotation && short === 'm')) {
34+
if (
35+
(result.length === 0 || !options.colonNotation)
36+
&& isZero(value)
37+
&& !(options.colonNotation && short === 'm')) {
3438
return;
3539
}
3640

@@ -53,7 +57,7 @@ export default function prettyMilliseconds(milliseconds, options = {}) {
5357

5458
const parsed = parseMilliseconds(milliseconds);
5559

56-
add(Math.trunc(parsed.days / 365), 'year', 'y');
60+
add(BigInt(parsed.days) / 365n, 'year', 'y');
5761
add(parsed.days % 365, 'day', 'd');
5862
add(parsed.hours, 'hour', 'h');
5963
add(parsed.minutes, 'minute', 'm');
@@ -79,13 +83,13 @@ export default function prettyMilliseconds(milliseconds, options = {}) {
7983
? options.millisecondsDecimalDigits
8084
: 0;
8185

82-
const roundedMiliseconds = millisecondsAndBelow >= 1
86+
const roundedMilliseconds = millisecondsAndBelow >= 1
8387
? Math.round(millisecondsAndBelow)
8488
: Math.ceil(millisecondsAndBelow);
8589

8690
const millisecondsString = millisecondsDecimalDigits
8791
? millisecondsAndBelow.toFixed(millisecondsDecimalDigits)
88-
: roundedMiliseconds;
92+
: roundedMilliseconds;
8993

9094
add(
9195
Number.parseFloat(millisecondsString),

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"exports": "./index.js",
1515
"types": "./index.d.ts",
1616
"engines": {
17-
"node": ">=14.16"
17+
"node": ">=18"
1818
},
1919
"scripts": {
2020
"test": "xo && ava && tsd"
@@ -42,11 +42,11 @@
4242
"hrtime"
4343
],
4444
"dependencies": {
45-
"parse-ms": "^3.0.0"
45+
"parse-ms": "^4.0.0"
4646
},
4747
"devDependencies": {
48-
"ava": "^4.3.0",
49-
"tsd": "^0.20.0",
50-
"xo": "^0.49.0"
48+
"ava": "^6.0.1",
49+
"tsd": "^0.30.4",
50+
"xo": "^0.56.0"
5151
}
5252
}

test.js

Lines changed: 116 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ test('prettify milliseconds', t => {
2020
t.is(prettyMilliseconds(1000 * 60 * 67 * 24 * 465), '1y 154d 6h');
2121
t.is(prettyMilliseconds(119_999), '1m 59.9s');
2222
t.is(prettyMilliseconds(120_000), '2m');
23+
t.is(prettyMilliseconds(Number.MAX_SAFE_INTEGER), '285616y 151d 8h 59m 0.9s');
24+
t.is(prettyMilliseconds(Number.MAX_VALUE), '5700447535712568547083700427941645003808085225292279557374304680873482979681895890593452082909683139015032646149857723394516742095667500822861020052921074432454921864096959420926519725467567456931340929884912090099277441972878147362726992943838905852030073647982034630974035871792165820638724934142y 218d 8h 8m 48s');
2325
});
2426

2527
test('have a compact option', t => {
@@ -62,24 +64,24 @@ test('have a keepDecimalsOnWholeSeconds option', t => {
6264
});
6365

6466
test('have a verbose option', t => {
65-
const fn = milliseconds => prettyMilliseconds(milliseconds, {verbose: true});
67+
const format = milliseconds => prettyMilliseconds(milliseconds, {verbose: true});
6668

67-
t.is(fn(0), '0 milliseconds');
68-
t.is(fn(0.1), '1 millisecond');
69-
t.is(fn(1), '1 millisecond');
70-
t.is(fn(1000), '1 second');
71-
t.is(fn(1000 + 400), '1.4 seconds');
72-
t.is(fn((1000 * 2) + 400), '2.4 seconds');
73-
t.is(fn(1000 * 5), '5 seconds');
74-
t.is(fn(1000 * 55), '55 seconds');
75-
t.is(fn(1000 * 67), '1 minute 7 seconds');
76-
t.is(fn(1000 * 60 * 5), '5 minutes');
77-
t.is(fn(1000 * 60 * 67), '1 hour 7 minutes');
78-
t.is(fn(1000 * 60 * 60 * 12), '12 hours');
79-
t.is(fn(1000 * 60 * 60 * 40), '1 day 16 hours');
80-
t.is(fn(1000 * 60 * 60 * 999), '41 days 15 hours');
81-
t.is(fn(1000 * 60 * 60 * 24 * 465), '1 year 100 days');
82-
t.is(fn(1000 * 60 * 67 * 24 * 465), '1 year 154 days 6 hours');
69+
t.is(format(0), '0 milliseconds');
70+
t.is(format(0.1), '1 millisecond');
71+
t.is(format(1), '1 millisecond');
72+
t.is(format(1000), '1 second');
73+
t.is(format(1000 + 400), '1.4 seconds');
74+
t.is(format((1000 * 2) + 400), '2.4 seconds');
75+
t.is(format(1000 * 5), '5 seconds');
76+
t.is(format(1000 * 55), '55 seconds');
77+
t.is(format(1000 * 67), '1 minute 7 seconds');
78+
t.is(format(1000 * 60 * 5), '5 minutes');
79+
t.is(format(1000 * 60 * 67), '1 hour 7 minutes');
80+
t.is(format(1000 * 60 * 60 * 12), '12 hours');
81+
t.is(format(1000 * 60 * 60 * 40), '1 day 16 hours');
82+
t.is(format(1000 * 60 * 60 * 999), '41 days 15 hours');
83+
t.is(format(1000 * 60 * 60 * 24 * 465), '1 year 100 days');
84+
t.is(format(1000 * 60 * 67 * 24 * 465), '1 year 154 days 6 hours');
8385
});
8486

8587
test('have a separateMilliseconds option', t => {
@@ -100,24 +102,24 @@ test('have a formatSubMilliseconds option', t => {
100102
});
101103

102104
test('work with verbose and compact options', t => {
103-
const fn = milliseconds => prettyMilliseconds(milliseconds, {
105+
const format = milliseconds => prettyMilliseconds(milliseconds, {
104106
verbose: true,
105107
compact: true,
106108
});
107109

108-
t.is(fn(1000), '1 second');
109-
t.is(fn(1000 + 400), '1 second');
110-
t.is(fn((1000 * 2) + 400), '2 seconds');
111-
t.is(fn(1000 * 5), '5 seconds');
112-
t.is(fn(1000 * 55), '55 seconds');
113-
t.is(fn(1000 * 67), '1 minute');
114-
t.is(fn(1000 * 60 * 5), '5 minutes');
115-
t.is(fn(1000 * 60 * 67), '1 hour');
116-
t.is(fn(1000 * 60 * 60 * 12), '12 hours');
117-
t.is(fn(1000 * 60 * 60 * 40), '1 day');
118-
t.is(fn(1000 * 60 * 60 * 999), '41 days');
119-
t.is(fn(1000 * 60 * 60 * 24 * 465), '1 year');
120-
t.is(fn(1000 * 60 * 67 * 24 * 750), '2 years');
110+
t.is(format(1000), '1 second');
111+
t.is(format(1000 + 400), '1 second');
112+
t.is(format((1000 * 2) + 400), '2 seconds');
113+
t.is(format(1000 * 5), '5 seconds');
114+
t.is(format(1000 * 55), '55 seconds');
115+
t.is(format(1000 * 67), '1 minute');
116+
t.is(format(1000 * 60 * 5), '5 minutes');
117+
t.is(format(1000 * 60 * 67), '1 hour');
118+
t.is(format(1000 * 60 * 60 * 12), '12 hours');
119+
t.is(format(1000 * 60 * 60 * 40), '1 day');
120+
t.is(format(1000 * 60 * 60 * 999), '41 days');
121+
t.is(format(1000 * 60 * 60 * 24 * 465), '1 year');
122+
t.is(format(1000 * 60 * 67 * 24 * 750), '2 years');
121123
});
122124

123125
test('work with verbose and unitCount options', t => {
@@ -130,29 +132,29 @@ test('work with verbose and unitCount options', t => {
130132
});
131133

132134
test('work with verbose and secondsDecimalDigits options', t => {
133-
const fn = milliseconds => prettyMilliseconds(milliseconds, {
135+
const format = milliseconds => prettyMilliseconds(milliseconds, {
134136
verbose: true,
135137
secondsDecimalDigits: 4,
136138
});
137139

138-
t.is(fn(1000), '1 second');
139-
t.is(fn(1000 + 400), '1.4000 seconds');
140-
t.is(fn((1000 * 2) + 400), '2.4000 seconds');
141-
t.is(fn((1000 * 5) + 254), '5.2540 seconds');
142-
t.is(fn(33_333), '33.3330 seconds');
140+
t.is(format(1000), '1 second');
141+
t.is(format(1000 + 400), '1.4000 seconds');
142+
t.is(format((1000 * 2) + 400), '2.4000 seconds');
143+
t.is(format((1000 * 5) + 254), '5.2540 seconds');
144+
t.is(format(33_333), '33.3330 seconds');
143145
});
144146

145147
test('work with verbose and millisecondsDecimalDigits options', t => {
146-
const fn = milliseconds => prettyMilliseconds(milliseconds, {
148+
const format = milliseconds => prettyMilliseconds(milliseconds, {
147149
verbose: true,
148150
millisecondsDecimalDigits: 4,
149151
});
150152

151-
t.is(fn(1), '1.0000 millisecond');
152-
t.is(fn(1 + 0.4), '1.4000 milliseconds');
153-
t.is(fn((1 * 2) + 0.4), '2.4000 milliseconds');
154-
t.is(fn((1 * 5) + 0.254), '5.2540 milliseconds');
155-
t.is(fn(33.333), '33.3330 milliseconds');
153+
t.is(format(1), '1.0000 millisecond');
154+
t.is(format(1 + 0.4), '1.4000 milliseconds');
155+
t.is(format((1 * 2) + 0.4), '2.4000 milliseconds');
156+
t.is(format((1 * 5) + 0.254), '5.2540 milliseconds');
157+
t.is(format(33.333), '33.3330 milliseconds');
156158
});
157159

158160
test('work with verbose and formatSubMilliseconds options', t => {
@@ -218,82 +220,91 @@ test('throw on invalid', t => {
218220
});
219221

220222
test('properly rounds milliseconds with secondsDecimalDigits', t => {
221-
const fn = milliseconds =>
223+
const format = milliseconds =>
222224
prettyMilliseconds(milliseconds, {
223225
verbose: true,
224226
secondsDecimalDigits: 0,
225227
});
226-
t.is(fn(3 * 60 * 1000), '3 minutes');
227-
t.is(fn((3 * 60 * 1000) - 1), '2 minutes 59 seconds');
228-
t.is(fn(365 * 24 * 3600 * 1e3), '1 year');
229-
t.is(fn((365 * 24 * 3600 * 1e3) - 1), '364 days 23 hours 59 minutes 59 seconds');
230-
t.is(fn(24 * 3600 * 1e3), '1 day');
231-
t.is(fn((24 * 3600 * 1e3) - 1), '23 hours 59 minutes 59 seconds');
232-
t.is(fn(3600 * 1e3), '1 hour');
233-
t.is(fn((3600 * 1e3) - 1), '59 minutes 59 seconds');
234-
t.is(fn(2 * 3600 * 1e3), '2 hours');
235-
t.is(fn((2 * 3600 * 1e3) - 1), '1 hour 59 minutes 59 seconds');
228+
t.is(format(3 * 60 * 1000), '3 minutes');
229+
t.is(format((3 * 60 * 1000) - 1), '2 minutes 59 seconds');
230+
t.is(format(365 * 24 * 3600 * 1e3), '1 year');
231+
t.is(format((365 * 24 * 3600 * 1e3) - 1), '364 days 23 hours 59 minutes 59 seconds');
232+
t.is(format(24 * 3600 * 1e3), '1 day');
233+
t.is(format((24 * 3600 * 1e3) - 1), '23 hours 59 minutes 59 seconds');
234+
t.is(format(3600 * 1e3), '1 hour');
235+
t.is(format((3600 * 1e3) - 1), '59 minutes 59 seconds');
236+
t.is(format(2 * 3600 * 1e3), '2 hours');
237+
t.is(format((2 * 3600 * 1e3) - 1), '1 hour 59 minutes 59 seconds');
236238
});
237239

238240
test('`colonNotation` option', t => {
241+
const format = (milliseconds, options) =>
242+
prettyMilliseconds(milliseconds, {
243+
colonNotation: true,
244+
...options,
245+
});
239246
// Default formats
240-
t.is(prettyMilliseconds(1000, {colonNotation: true}), '0:01');
241-
t.is(prettyMilliseconds(1543, {colonNotation: true}), '0:01.5');
242-
t.is(prettyMilliseconds(1000 * 60, {colonNotation: true}), '1:00');
243-
t.is(prettyMilliseconds(1000 * 90, {colonNotation: true}), '1:30');
244-
t.is(prettyMilliseconds(95_543, {colonNotation: true}), '1:35.5');
245-
t.is(prettyMilliseconds((1000 * 60 * 10) + 543, {colonNotation: true}), '10:00.5');
246-
t.is(prettyMilliseconds((1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true}), '59:59.5');
247-
t.is(prettyMilliseconds((1000 * 60 * 60 * 15) + (1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true}), '15:59:59.5');
247+
t.is(format(1000), '0:01');
248+
t.is(format(1543), '0:01.5');
249+
t.is(format(1000 * 60), '1:00');
250+
t.is(format(1000 * 90), '1:30');
251+
t.is(format(95_543), '1:35.5');
252+
t.is(format((1000 * 60 * 10) + 543), '10:00.5');
253+
t.is(format((1000 * 60 * 59) + (1000 * 59) + 543), '59:59.5');
254+
t.is(format((1000 * 60 * 60 * 15) + (1000 * 60 * 59) + (1000 * 59) + 543), '15:59:59.5');
248255

249256
// Together with `secondsDecimalDigits`
250-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 0}), '0:00');
251-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 1}), '0:00.9');
252-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 2}), '0:00.99');
253-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 3}), '0:00.999');
254-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 0}), '0:01');
255-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 1}), '0:01');
256-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 2}), '0:01');
257-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 3}), '0:01');
258-
t.is(prettyMilliseconds(1001, {colonNotation: true, secondsDecimalDigits: 0}), '0:01');
259-
t.is(prettyMilliseconds(1001, {colonNotation: true, secondsDecimalDigits: 1}), '0:01');
260-
t.is(prettyMilliseconds(1001, {colonNotation: true, secondsDecimalDigits: 2}), '0:01');
261-
t.is(prettyMilliseconds(1001, {colonNotation: true, secondsDecimalDigits: 3}), '0:01.001');
262-
t.is(prettyMilliseconds(1543, {colonNotation: true, secondsDecimalDigits: 0}), '0:01');
263-
t.is(prettyMilliseconds(1543, {colonNotation: true, secondsDecimalDigits: 1}), '0:01.5');
264-
t.is(prettyMilliseconds(1543, {colonNotation: true, secondsDecimalDigits: 2}), '0:01.54');
265-
t.is(prettyMilliseconds(1543, {colonNotation: true, secondsDecimalDigits: 3}), '0:01.543');
266-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 0}), '1:35');
267-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 1}), '1:35.5');
268-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 2}), '1:35.54');
269-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 3}), '1:35.543');
270-
t.is(prettyMilliseconds((1000 * 60 * 10) + 543, {colonNotation: true, secondsDecimalDigits: 3}), '10:00.543');
271-
t.is(prettyMilliseconds((1000 * 60 * 60 * 15) + (1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true, secondsDecimalDigits: 3}), '15:59:59.543');
257+
t.is(format(999, {secondsDecimalDigits: 0}), '0:00');
258+
t.is(format(999, {secondsDecimalDigits: 1}), '0:00.9');
259+
t.is(format(999, {secondsDecimalDigits: 2}), '0:00.99');
260+
t.is(format(999, {secondsDecimalDigits: 3}), '0:00.999');
261+
t.is(format(1000, {secondsDecimalDigits: 0}), '0:01');
262+
t.is(format(1000, {secondsDecimalDigits: 1}), '0:01');
263+
t.is(format(1000, {secondsDecimalDigits: 2}), '0:01');
264+
t.is(format(1000, {secondsDecimalDigits: 3}), '0:01');
265+
t.is(format(1001, {secondsDecimalDigits: 0}), '0:01');
266+
t.is(format(1001, {secondsDecimalDigits: 1}), '0:01');
267+
t.is(format(1001, {secondsDecimalDigits: 2}), '0:01');
268+
t.is(format(1001, {secondsDecimalDigits: 3}), '0:01.001');
269+
t.is(format(1543, {secondsDecimalDigits: 0}), '0:01');
270+
t.is(format(1543, {secondsDecimalDigits: 1}), '0:01.5');
271+
t.is(format(1543, {secondsDecimalDigits: 2}), '0:01.54');
272+
t.is(format(1543, {secondsDecimalDigits: 3}), '0:01.543');
273+
t.is(format(95_543, {secondsDecimalDigits: 0}), '1:35');
274+
t.is(format(95_543, {secondsDecimalDigits: 1}), '1:35.5');
275+
t.is(format(95_543, {secondsDecimalDigits: 2}), '1:35.54');
276+
t.is(format(95_543, {secondsDecimalDigits: 3}), '1:35.543');
277+
t.is(format((1000 * 60 * 10) + 543, {secondsDecimalDigits: 3}), '10:00.543');
278+
t.is(format((1000 * 60 * 60 * 15) + (1000 * 60 * 59) + (1000 * 59) + 543, {secondsDecimalDigits: 3}), '15:59:59.543');
272279

273280
// Together with `keepDecimalsOnWholeSeconds`
274-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 0, keepDecimalsOnWholeSeconds: true}), '0:00');
275-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 1, keepDecimalsOnWholeSeconds: true}), '0:00.9');
276-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 2, keepDecimalsOnWholeSeconds: true}), '0:00.99');
277-
t.is(prettyMilliseconds(999, {colonNotation: true, secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '0:00.999');
278-
t.is(prettyMilliseconds(1000, {colonNotation: true, keepDecimalsOnWholeSeconds: true}), '0:01.0');
279-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 0, keepDecimalsOnWholeSeconds: true}), '0:01');
280-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 1, keepDecimalsOnWholeSeconds: true}), '0:01.0');
281-
t.is(prettyMilliseconds(1000, {colonNotation: true, secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '0:01.000');
282-
t.is(prettyMilliseconds(1000 * 90, {colonNotation: true, keepDecimalsOnWholeSeconds: true}), '1:30.0');
283-
t.is(prettyMilliseconds(1000 * 90, {colonNotation: true, secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '1:30.000');
284-
t.is(prettyMilliseconds(1000 * 60 * 10, {colonNotation: true, secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '10:00.000');
281+
t.is(format(999, {secondsDecimalDigits: 0, keepDecimalsOnWholeSeconds: true}), '0:00');
282+
t.is(format(999, {secondsDecimalDigits: 1, keepDecimalsOnWholeSeconds: true}), '0:00.9');
283+
t.is(format(999, {secondsDecimalDigits: 2, keepDecimalsOnWholeSeconds: true}), '0:00.99');
284+
t.is(format(999, {secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '0:00.999');
285+
t.is(format(1000, {keepDecimalsOnWholeSeconds: true}), '0:01.0');
286+
t.is(format(1000, {secondsDecimalDigits: 0, keepDecimalsOnWholeSeconds: true}), '0:01');
287+
t.is(format(1000, {secondsDecimalDigits: 1, keepDecimalsOnWholeSeconds: true}), '0:01.0');
288+
t.is(format(1000, {secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '0:01.000');
289+
t.is(format(1000 * 90, {keepDecimalsOnWholeSeconds: true}), '1:30.0');
290+
t.is(format(1000 * 90, {secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '1:30.000');
291+
t.is(format(1000 * 60 * 10, {secondsDecimalDigits: 3, keepDecimalsOnWholeSeconds: true}), '10:00.000');
285292

286293
// Together with `unitCount`
287-
t.is(prettyMilliseconds(1000 * 90, {colonNotation: true, secondsDecimalDigits: 0, unitCount: 1}), '1');
288-
t.is(prettyMilliseconds(1000 * 90, {colonNotation: true, secondsDecimalDigits: 0, unitCount: 2}), '1:30');
289-
t.is(prettyMilliseconds(1000 * 60 * 90, {colonNotation: true, secondsDecimalDigits: 0, unitCount: 3}), '1:30:00');
290-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 1, unitCount: 1}), '1');
291-
t.is(prettyMilliseconds(95_543, {colonNotation: true, secondsDecimalDigits: 1, unitCount: 2}), '1:35.5');
292-
t.is(prettyMilliseconds(95_543 + (1000 * 60 * 60), {colonNotation: true, secondsDecimalDigits: 1, unitCount: 3}), '1:01:35.5');
294+
t.is(format(1000 * 90, {secondsDecimalDigits: 0, unitCount: 1}), '1');
295+
t.is(format(1000 * 90, {secondsDecimalDigits: 0, unitCount: 2}), '1:30');
296+
t.is(format(1000 * 60 * 90, {secondsDecimalDigits: 0, unitCount: 3}), '1:30:00');
297+
t.is(format(95_543, {secondsDecimalDigits: 1, unitCount: 1}), '1');
298+
t.is(format(95_543, {secondsDecimalDigits: 1, unitCount: 2}), '1:35.5');
299+
t.is(format(95_543 + (1000 * 60 * 60), {secondsDecimalDigits: 1, unitCount: 3}), '1:01:35.5');
293300

294301
// Make sure incompatible options fall back to `colonNotation`
295-
t.is(prettyMilliseconds((1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true, formatSubMilliseconds: true}), '59:59.5');
296-
t.is(prettyMilliseconds((1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true, separateMilliseconds: true}), '59:59.5');
297-
t.is(prettyMilliseconds((1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true, verbose: true}), '59:59.5');
298-
t.is(prettyMilliseconds((1000 * 60 * 59) + (1000 * 59) + 543, {colonNotation: true, compact: true}), '59:59.5');
302+
t.is(format((1000 * 60 * 59) + (1000 * 59) + 543, {formatSubMilliseconds: true}), '59:59.5');
303+
t.is(format((1000 * 60 * 59) + (1000 * 59) + 543, {separateMilliseconds: true}), '59:59.5');
304+
t.is(format((1000 * 60 * 59) + (1000 * 59) + 543, {verbose: true}), '59:59.5');
305+
t.is(format((1000 * 60 * 59) + (1000 * 59) + 543, {compact: true}), '59:59.5');
306+
307+
// Big numbers
308+
t.is(format(Number.MAX_SAFE_INTEGER), '285616:151:08:59:00.9');
309+
t.is(format(Number.MAX_VALUE), '5700447535712568547083700427941645003808085225292279557374304680873482979681895890593452082909683139015032646149857723394516742095667500822861020052921074432454921864096959420926519725467567456931340929884912090099277441972878147362726992943838905852030073647982034630974035871792165820638724934142:218:08:08:48');
299310
});

0 commit comments

Comments
 (0)