feat: allow hour durations
This commit is contained in:
@@ -15,6 +15,10 @@ describe("parseDurationMs", () => {
|
||||
expect(parseDurationMs("1m")).toBe(60_000);
|
||||
});
|
||||
|
||||
it("parses hours suffix", () => {
|
||||
expect(parseDurationMs("2h")).toBe(7_200_000);
|
||||
});
|
||||
|
||||
it("supports decimals", () => {
|
||||
expect(parseDurationMs("0.5s")).toBe(500);
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export type DurationMsParseOptions = {
|
||||
defaultUnit?: "ms" | "s" | "m";
|
||||
defaultUnit?: "ms" | "s" | "m" | "h";
|
||||
};
|
||||
|
||||
export function parseDurationMs(
|
||||
@@ -11,7 +11,7 @@ export function parseDurationMs(
|
||||
.toLowerCase();
|
||||
if (!trimmed) throw new Error("invalid duration (empty)");
|
||||
|
||||
const m = /^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(trimmed);
|
||||
const m = /^(\d+(?:\.\d+)?)(ms|s|m|h)?$/.exec(trimmed);
|
||||
if (!m) throw new Error(`invalid duration: ${raw}`);
|
||||
|
||||
const value = Number(m[1]);
|
||||
@@ -19,8 +19,13 @@ export function parseDurationMs(
|
||||
throw new Error(`invalid duration: ${raw}`);
|
||||
}
|
||||
|
||||
const unit = (m[2] ?? opts?.defaultUnit ?? "ms") as "ms" | "s" | "m";
|
||||
const multiplier = unit === "ms" ? 1 : unit === "s" ? 1000 : 60_000;
|
||||
const unit = (m[2] ?? opts?.defaultUnit ?? "ms") as
|
||||
| "ms"
|
||||
| "s"
|
||||
| "m"
|
||||
| "h";
|
||||
const multiplier =
|
||||
unit === "ms" ? 1 : unit === "s" ? 1000 : unit === "m" ? 60_000 : 3_600_000;
|
||||
const ms = Math.round(value * multiplier);
|
||||
if (!Number.isFinite(ms)) throw new Error(`invalid duration: ${raw}`);
|
||||
return ms;
|
||||
|
||||
@@ -463,7 +463,7 @@ const HeartbeatSchema = z
|
||||
ctx.addIssue({
|
||||
code: z.ZodIssueCode.custom,
|
||||
path: ["every"],
|
||||
message: "invalid duration (use ms, s, m)",
|
||||
message: "invalid duration (use ms, s, m, h)",
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user