export function parseDurationMs(raw: string, opts?: DurationMsParseOptions): number { const trimmed = normalizeLowercaseStringOrEmpty(normalizeOptionalString(raw) ?? ""); if (!trimmed) { thrownew Error("invalid duration (empty)");
}
// Fast path for a single token (supports default unit for bare numbers). const single = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/.exec(trimmed); if (single) { const value = Number(single[1]); if (!Number.isFinite(value) || value < 0) { thrownew Error(`invalid duration: ${raw}`);
} const unit = (single[2] ?? opts?.defaultUnit ?? "ms") as "ms" | "s" | "m" | "h" | "d"; const ms = Math.round(value * DURATION_MULTIPLIERS[unit]); if (!Number.isFinite(ms)) { thrownew Error(`invalid duration: ${raw}`);
} return ms;
}
// Composite form (e.g. "1h30m", "2m500ms"); each token must include a unit.
let totalMs = 0;
let consumed = 0; const tokenRe = /(\d+(?:\.\d+)?)(ms|s|m|h|d)/g; for (const match of trimmed.matchAll(tokenRe)) { const [full, valueRaw, unitRaw] = match; const index = match.index ?? -1; if (!full || !valueRaw || !unitRaw || index < 0) { thrownew Error(`invalid duration: ${raw}`);
} if (index !== consumed) { thrownew Error(`invalid duration: ${raw}`);
} const value = Number(valueRaw); if (!Number.isFinite(value) || value < 0) { thrownew Error(`invalid duration: ${raw}`);
} const multiplier = DURATION_MULTIPLIERS[unitRaw]; if (!multiplier) { thrownew Error(`invalid duration: ${raw}`);
}
totalMs += value * multiplier;
consumed += full.length;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.