Built and signed on GitHub ActionsBuilt and signed on GitHub Actions
Built and signed on GitHub Actions
⏳ Fantastic cron parser and constructor.
This package works with Cloudflare Workers, Node.js, Deno, Bun, Browsers
JSR Score
100%
Published
2 months ago (0.3.3)
import { entriesToObject } from "jsr:@coven/iterables@^0.3.3"; import type { Maybe } from "jsr:@coven/types@^0.3.3"; import type { RangeField } from "./RangeField.ts"; import { isRangeString } from "./isRangeString.ts"; import { parseNumberMap } from "./parseNumberMap.ts"; import { FROM_NAME, TO_NAME } from "./rangeFieldNames.ts"; import { RANGE_EXPRESSION_SEPARATOR_TOKEN } from "./tokens.ts"; import { zipRangeNames } from "./zipRangeNames.ts"; /** * Parses a cron range into an object. * * @example * ```typescript * parseRange("1-13"); // { from: 1, to: 13 } * parseRange("13-13"); // 13 (normalized) * parseRange("13-1"); // undefined * ``` * @see {@linkcode isRangeString} * @see {@linkcode zipRangeNames} * @see {@linkcode parseNumberMap} * * @param value String that might be a range. * @returns Parsed ranged of `undefined` if it isn't a range string. */ export const parseRange = <Predicated extends number>( value: string, ): Maybe<Predicated | RangeField<Predicated>> => { const maybeRange = isRangeString(value) ? entriesToObject( zipRangeNames( parseNumberMap( value.split(RANGE_EXPRESSION_SEPARATOR_TOKEN), ), ), ) : undefined; return ( maybeRange?.[FROM_NAME] === maybeRange?.[TO_NAME] ? maybeRange?.[FROM_NAME] : maybeRange ) as Maybe<Predicated | RangeField<Predicated>>; };