Files
zerobyte/app/utils/utils.ts
Nico c6b569bed6 feat(schedule-form): allow custom cron expression (#214)
* feat(schedule-form): allow custom cron expression

* refactor: guard against potential undefined cron expression
2025-12-22 19:50:26 +01:00

51 lines
1.3 KiB
TypeScript

import { intervalToDuration } from "date-fns";
export const getCronExpression = (
frequency: string,
dailyTime?: string,
weeklyDay?: string,
monthlyDays?: string[],
cronExpression?: string,
): string => {
if (frequency === "cron" && cronExpression) {
return cronExpression;
}
if (frequency === "hourly") {
return "0 * * * *";
}
if (!dailyTime) {
dailyTime = "02:00";
}
const [hours, minutes] = dailyTime.split(":");
if (frequency === "daily") {
return `${minutes} ${hours} * * *`;
}
if (frequency === "monthly") {
const sortedDays = (monthlyDays || [])
.map(Number)
.filter((day) => day >= 1 && day <= 31)
.sort((a, b) => a - b);
const days = sortedDays.length > 0 ? sortedDays.join(",") : "1";
return `${minutes} ${hours} ${days} * *`;
}
return `${minutes} ${hours} * * ${weeklyDay ?? "0"}`;
};
export const formatDuration = (seconds: number) => {
const duration = intervalToDuration({ start: 0, end: seconds * 1000 });
const parts: string[] = [];
if (duration.days) parts.push(`${duration.days}d`);
if (duration.hours) parts.push(`${duration.hours}h`);
if (duration.minutes) parts.push(`${duration.minutes}m`);
if (duration.seconds || parts.length === 0) parts.push(`${duration.seconds || 0}s`);
return parts.join(" ");
};