import { CronType } from "@/enums"; import { CronExpressionParser } from "cron-parser"; export function parseCron(cron: string | null): { type: CronType; value: number; } { let value: RegExpMatchArray | null; if (cron === null) { return { type: CronType.ONE_TIME, value: 0, }; } else if ((value = /^0 (\d+) \* \* \*$/i.exec(cron)) !== null) { return { type: CronType.EVERY_DAY, value: parseInt(value[1] ?? ""), }; } else if ((value = /^0 0 \* \* (\d+)$/i.exec(cron)) !== null) { return { type: CronType.EVERY_WEEK, value: parseInt(value[1] ?? ""), }; } else if ((value = /^0 0 (\d+) \* \*$/i.exec(cron)) !== null) { return { type: CronType.EVERY_MONTH, value: parseInt(value[1] ?? ""), }; } else if ((value = /^0 0 1 (\d+) \*$/i.exec(cron)) !== null) { return { type: CronType.EVERY_YEAR, value: parseInt(value[1] ?? ""), }; } else { return { type: CronType.SPECIFIC, value: 0, }; } } export function getCron( type: CronType, value: number, fallback: string, ): string | null { switch (type) { case CronType.EVERY_DAY: return `0 ${value.toFixed(0)} * * *`; case CronType.EVERY_WEEK: return `0 0 * * ${value.toFixed(0)}`; case CronType.EVERY_MONTH: return `0 0 ${value.toFixed(0)} * *`; case CronType.EVERY_YEAR: return `0 0 1 ${value.toFixed(0)} *`; case CronType.SPECIFIC: if (validCron(fallback)) { return fallback; } } return null; } export function validCron(cron: string): boolean { try { CronExpressionParser.parse(cron); return true; } catch { return false; } }