···22import { Temporal } from "@js-temporal/polyfill";
3344/**
55+ * Parse a time string with unit suffix or raw milliseconds
66+ * @param value - Time string like "10s", "90m", "3h" or raw milliseconds
77+ * @returns Time in milliseconds
88+ * @example
99+ * parseTimeValue("10s") // → 10000
1010+ * parseTimeValue("90m") // → 5400000
1111+ * parseTimeValue("3h") // → 10800000
1212+ * parseTimeValue("5400000") // → 5400000 (backward compat)
1313+ * parseTimeValue(10000) // → 10000 (already a number)
1414+ */
1515+function parseTimeValue(value: string | number | undefined): number {
1616+ if (value === undefined || value === "") {
1717+ throw new Error("Time value is required");
1818+ }
1919+2020+ if (typeof value === "number") {
2121+ return value;
2222+ }
2323+2424+ const match = value.trim().match(/^(\d+(?:\.\d+)?)\s*(s|m|h|ms)?$/i);
2525+2626+ if (!match) {
2727+ throw new Error(
2828+ `Invalid time format: "${value}". Expected: "10s", "90m", "3h", or raw milliseconds`,
2929+ );
3030+ }
3131+3232+ const [, numStr, unit] = match;
3333+ const num = parseFloat(numStr);
3434+3535+ if (isNaN(num) || num < 0) {
3636+ throw new Error(`Time value must be a positive number: "${value}"`);
3737+ }
3838+3939+ switch (unit?.toLowerCase()) {
4040+ case "s":
4141+ return msFrom.seconds(num);
4242+ case "m":
4343+ return msFrom.minutes(num);
4444+ case "h":
4545+ return msFrom.hours(num);
4646+ case "ms":
4747+ case undefined:
4848+ return num;
4949+ default:
5050+ throw new Error(`Invalid unit: "${unit}". Use s/m/h/ms`);
5151+ }
5252+}
5353+5454+/**
555 * Convert time units to milliseconds
656 */
757export const msFrom = {
···2070 * @param h - number of hours
2171 */
2272 hours: (hours: number): number => hours * 60 * 60 * 1000,
7373+ /**
7474+ * Parse a time string with unit suffix (e.g., "10s", "90m", "3h") or raw milliseconds
7575+ * @param value - Time string or number
7676+ * @returns Time in milliseconds
7777+ */
7878+ parse: parseTimeValue,
2379};
24802581/**