fix(ext/cron): automatically override unspecified values (#22042)

Fixes #22041
This commit is contained in:
Igor Zinkovsky 2024-01-23 16:45:11 -08:00 committed by GitHub
parent 47620641e7
commit 46b91eceb1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 87 additions and 1 deletions

View file

@ -391,3 +391,70 @@ Deno.test("error on two handlers", () => {
"Deno.cron requires a single handler",
);
});
Deno.test("Parse test", () => {
assertEquals(
parseScheduleToString({
minute: 3,
}),
"3 * * * *",
);
assertEquals(
parseScheduleToString({
hour: { every: 2 },
}),
"0 */2 * * *",
);
assertEquals(
parseScheduleToString({
dayOfMonth: { every: 10 },
}),
"0 0 */10 * *",
);
assertEquals(
parseScheduleToString({
month: { every: 3 },
}),
"0 0 1 */3 *",
);
assertEquals(
parseScheduleToString({
dayOfWeek: { every: 2 },
}),
"0 0 * * */2",
);
assertEquals(
parseScheduleToString({
minute: 3,
hour: { every: 2 },
}),
"3 */2 * * *",
);
assertEquals(
parseScheduleToString({
dayOfMonth: { start: 1, end: 10 },
}),
"0 0 1-10 * *",
);
assertEquals(
parseScheduleToString({
minute: { every: 10 },
dayOfMonth: { every: 5 },
}),
"*/10 * */5 * *",
);
assertEquals(
parseScheduleToString({
hour: { every: 3 },
month: { every: 2 },
}),
"0 */3 * */2 *",
);
assertEquals(
parseScheduleToString({
minute: { every: 5 },
month: { every: 2 },
}),
"*/5 * * */2 *",
);
});

View file

@ -62,7 +62,7 @@ export function parseScheduleToString(
if (typeof schedule === "string") {
return schedule;
} else {
const {
let {
minute,
hour,
dayOfMonth,
@ -70,6 +70,25 @@ export function parseScheduleToString(
dayOfWeek,
} = schedule;
// Automatically override unspecified values for convenience. For example,
// to run every 2 hours, `{ hour: { every: 2 } }` can be specified without
// explicitely specifying `minute`.
if (minute !== undefined) {
// Nothing to override.
} else if (hour !== undefined) {
// Override minute to 0 since it's not specified.
minute = 0;
} else if (dayOfMonth !== undefined || dayOfWeek !== undefined) {
// Override minute and hour to 0 since they're not specified.
minute = 0;
hour = 0;
} else if (month !== undefined) {
// Override minute and hour to 0, and dayOfMonth to 1 since they're not specified.
minute = 0;
hour = 0;
dayOfMonth = 1;
}
return formatToCronSchedule(minute) +
" " + formatToCronSchedule(hour) +
" " + formatToCronSchedule(dayOfMonth) +