@alwatr/parse-duration
Version:
A simple utility to parse a duration string into milliseconds number.
8 lines (7 loc) • 3.72 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/main.ts"],
"sourcesContent": ["import {toNumber} from '@alwatr/is-number';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\n/**\n * Unit conversion table (milliseconds)\n */\nconst unitConversion = /* #__PURE__ */ Object.freeze({\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n M: 2_592_000_000,\n y: 31_536_000_000,\n} as const);\n\n/**\n * Duration unit: `s` for seconds, `m` for minutes, `h` for hours, `d` for days, `w` for weeks, `M` for months, `y` for years.\n */\nexport type DurationUnit = keyof typeof unitConversion;\n\n/**\n * Duration string format: `number + unit`, for example `10m` means 10 minutes.\n */\nexport type Duration = `${number}${DurationUnit}` | number;\n\n/**\n * Error types that can be thrown by parseDuration\n */\nexport type DurationError = 'not_a_number' | 'invalid_unit' | 'invalid_format';\n\n/**\n * Parse duration string to milliseconds number.\n *\n * @param duration - Duration string or number, for example `10m` means 10 minutes.\n * @param toUnit - Convert to unit, default is `ms` for milliseconds.\n * @throws {Error} With message 'not_a_number' if duration string doesn't contain a valid number.\n * @throws {Error} With message 'invalid_unit' if the unit is not recognized.\n * @throws {Error} With message 'invalid_format' if the duration format is invalid.\n * @returns Duration in specified unit (or milliseconds by default).\n *\n * @example\n * ```ts\n * parseDuration('10m'); // 600000\n * parseDuration('10m', 's'); // 600\n * parseDuration(120_000, 'm'); // 2\n * ```\n */\nexport const parseDuration = (duration: Duration, toUnit?: DurationUnit): number => {\n let ms: number;\n\n // Convert input to milliseconds\n if (typeof duration === 'number') {\n ms = duration;\n }\n else {\n if (duration.length < 2) {\n throw new Error('invalid_format', {cause: {duration}});\n }\n\n const durationUnit = duration.slice(-1) as DurationUnit;\n const unitConversionFactor = unitConversion[durationUnit];\n\n if (unitConversionFactor === undefined) {\n throw new Error('invalid_unit', {cause: {durationUnit}});\n }\n\n const durationNumber = toNumber(duration.slice(0, -1));\n if (durationNumber === null) {\n throw new Error('not_a_number', {cause: {duration}});\n }\n\n ms = durationNumber * unitConversionFactor;\n }\n\n // Return as is if no conversion needed\n if (toUnit === undefined) {\n return ms;\n }\n\n // Convert to target unit\n const toFactor = unitConversion[toUnit];\n if (toFactor === undefined) {\n throw new Error('invalid_unit', {cause: {toUnit}});\n }\n\n return ms / toFactor;\n};\n"],
"mappings": ";;;AAAA,SAAQ,gBAAe;AACvB,SAAQ,qBAAoB;AAE5B,aAAc,eAAc,IAAI,0BAAkB,OAAmB;AAKrE,IAAM,iBAAiC,uBAAO,OAAO;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAU;AAkCH,IAAM,gBAAgB,CAAC,UAAoB,WAAkC;AAClF,MAAI;AAGJ,MAAI,OAAO,aAAa,UAAU;AAChC,SAAK;AAAA,EACP,OACK;AACH,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,IAAI,MAAM,kBAAkB,EAAC,OAAO,EAAC,SAAQ,EAAC,CAAC;AAAA,IACvD;AAEA,UAAM,eAAe,SAAS,MAAM,EAAE;AACtC,UAAM,uBAAuB,eAAe,YAAY;AAExD,QAAI,yBAAyB,QAAW;AACtC,YAAM,IAAI,MAAM,gBAAgB,EAAC,OAAO,EAAC,aAAY,EAAC,CAAC;AAAA,IACzD;AAEA,UAAM,iBAAiB,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACrD,QAAI,mBAAmB,MAAM;AAC3B,YAAM,IAAI,MAAM,gBAAgB,EAAC,OAAO,EAAC,SAAQ,EAAC,CAAC;AAAA,IACrD;AAEA,SAAK,iBAAiB;AAAA,EACxB;AAGA,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,eAAe,MAAM;AACtC,MAAI,aAAa,QAAW;AAC1B,UAAM,IAAI,MAAM,gBAAgB,EAAC,OAAO,EAAC,OAAM,EAAC,CAAC;AAAA,EACnD;AAEA,SAAO,KAAK;AACd;",
"names": []
}