From f2b29507760c615dd7967873b458fb95466566cb Mon Sep 17 00:00:00 2001 From: Tommaso Sebastianelli Date: Wed, 7 Feb 2024 17:02:44 +0100 Subject: [PATCH] fix: include undefined values if formatting with zero option set to true --- src/formatDuration/index.ts | 2 +- src/formatDuration/test.ts | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/formatDuration/index.ts b/src/formatDuration/index.ts index 08a8ff9095..2f3586950b 100644 --- a/src/formatDuration/index.ts +++ b/src/formatDuration/index.ts @@ -105,7 +105,7 @@ export function formatDuration( const token = `x${unit.replace(/(^.)/, (m) => m.toUpperCase(), )}` as FormatDistanceToken; - const value = duration[unit]; + const value = duration[unit] ?? (zero ? 0 : undefined); if (value !== undefined && (zero || duration[unit])) { return acc.concat(locale.formatDistance(token, value)); } diff --git a/src/formatDuration/test.ts b/src/formatDuration/test.ts index af7aad2097..711ce92e3e 100644 --- a/src/formatDuration/test.ts +++ b/src/formatDuration/test.ts @@ -77,4 +77,38 @@ describe("formatDuration", () => { "9 months, 2 days", ); }); + + it("allows to provide a custom locale formatter", () => { + assert( + formatDuration( + { + hours: 1, + minutes: 10, + seconds: 30, + }, + { + delimiter: ":", + format: ["hours", "minutes", "seconds"], + locale: { + formatDistance: (_, count) => String(count).padStart(2, "0"), + }, + zero: true, + }, + ) === "01:10:30", + ); + }); + + it("includes undefined duration values when formatting if zero is true", () => { + assert( + formatDuration( + { + seconds: 10, + }, + { + format: ["hours", "minutes", "seconds"], + zero: true, + }, + ) === "0 hours 0 minutes 10 seconds", + ); + }); });