export type Schedule = | "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday" | "week" | "day" | "midnight" | "noon" | "hour" | "30 minutes" | "15 minutes" | "5 minutes" | "1 minute" | "30minutes" | "15minutes" | "5minutes" | "1minute" | 30 | 15 | 5 | 1 export type CronJob = { id: string // "appname:filename" app: string name: string // filename without .ts file: string // full path schedule: Schedule cronExpr: string state: 'idle' | 'running' | 'disabled' lastRun?: number lastDuration?: number lastExitCode?: number lastError?: string nextRun?: number } export const SCHEDULES = [ '1 minute', '5 minutes', '15 minutes', '30 minutes', 'hour', 'noon', 'midnight', 'day', 'week', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', ] as const const SCHEDULE_MAP: Record = { sunday: '0 0 * * 0', monday: '0 0 * * 1', tuesday: '0 0 * * 2', wednesday: '0 0 * * 3', thursday: '0 0 * * 4', friday: '0 0 * * 5', saturday: '0 0 * * 6', week: '0 0 * * 0', day: '0 0 * * *', midnight: '0 0 * * *', noon: '0 12 * * *', hour: '0 * * * *', '30 minutes': '0,30 * * * *', '15 minutes': '0,15,30,45 * * * *', '5 minutes': '*/5 * * * *', '1 minute': '* * * * *', '30minutes': '0,30 * * * *', '15minutes': '0,15,30,45 * * * *', '5minutes': '*/5 * * * *', '1minute': '* * * * *', } export function toCronExpr(schedule: Schedule): string { if (typeof schedule === 'number') { return SCHEDULE_MAP[`${schedule}minutes`]! } return SCHEDULE_MAP[schedule]! } export function isValidSchedule(value: unknown): value is Schedule { if (typeof value === 'number') { return [1, 5, 15, 30].includes(value) } if (typeof value === 'string') { return value in SCHEDULE_MAP } return false }