(expr: string)
| 48 | } |
| 49 | |
| 50 | export function parseCron(expr: string): CronExpression { |
| 51 | const trimmed = expr.trim(); |
| 52 | const aliased = ALIASES[trimmed.toLowerCase()] ?? trimmed; |
| 53 | const parts = aliased.split(/\s+/); |
| 54 | if (parts.length !== 5) { |
| 55 | throw new Error(`Invalid cron expression "${expr}" — expected 5 fields, got ${parts.length}`); |
| 56 | } |
| 57 | const fields = parts.map((p, i) => parseField(p, FIELD_RANGES[i]!, i)); |
| 58 | return { raw: expr, fields }; |
| 59 | } |
| 60 | |
| 61 | function parseField(field: string, [min, max]: [number, number], idx: number): Set<number> { |
| 62 | const out = new Set<number>(); |
no test coverage detected