cron-toolkit-ts
Version:
Type-safe Toolkit to get cron expressions for JavaScript and TypeScript
162 lines (161 loc) • 10.1 kB
TypeScript
type Seconds = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59;
type Minutes = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59;
type Hours = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23;
type Days = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31;
type Months = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
type WeekDays = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
type DayName = "Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday";
type DayNameToNumber<T extends DayName> = T extends "Sunday" ? 0 : T extends "Monday" ? 1 : T extends "Tuesday" ? 2 : T extends "Wednesday" ? 3 : T extends "Thursday" ? 4 : T extends "Friday" ? 5 : T extends "Saturday" ? 6 : never;
type EverySecond<T extends Seconds> = T extends 0 ? "* * * * * *" : `*/${T} * * * * *`;
type EveryMinute<T extends Minutes> = T extends 0 ? "* * * * *" : `*/${T} * * * *`;
type EveryHour<T extends Hours> = T extends 0 ? "0 * * * *" : `0 */${T} * * *`;
type EveryDay<T extends Days> = T extends 0 ? "0 0 * * *" : `0 0 ${T} * *`;
type EveryDayAt<T extends Hours> = T extends 0 ? "0 0 * * *" : `0 ${T} * * *`;
type EveryDayAtHourAndMinute<T extends Hours, U extends Minutes> = T extends 0 ? `${U} 0 * * *` : `${U} ${T} * * *`;
type EveryDayToDay<T extends DayName, U extends DayName> = `0 0 * * ${DayNameToNumber<T>}-${DayNameToNumber<U>}`;
type EveryDayToDayAt<T extends DayName, U extends DayName, V extends Hours> = `0 ${V} * * ${DayNameToNumber<T>}-${DayNameToNumber<U>}`;
type EveryMonths<T extends Months> = T extends 0 ? "0 0 1 * *" : `0 0 1 ${T} *`;
type EveryMonthOn<T extends Days> = `0 0 ${T} * *`;
type EveryWeekDays<T extends WeekDays> = T extends 0 ? "0 0 * * 0" : `0 0 * * ${T}`;
type AtMinutes<T extends Minutes> = T extends 0 ? "0 * * * *" : `${T} * * * *`;
type AtEveryMinutes<T extends Minutes, U extends Minutes> = T extends 0 ? "0 * * * *" : `${T}-${U} * * * *`;
type AtHours<T extends Hours> = T extends 0 ? "0 0 * * *" : `0 ${T} * * *`;
type AtDays<T extends Days> = T extends 0 ? "0 0 1 * *" : `0 0 ${T} * *`;
type AtMonths<T extends Months> = T extends 0 ? "0 0 1 1 *" : `0 0 1 ${T} *`;
type BetweenMinutes<T extends Minutes, U extends Minutes> = `${T}-${U} * * * *`;
type BetweenHours<T extends Hours, U extends Hours> = `0 ${T}-${U} * * *`;
type BetweenDays<T extends Days, U extends Days> = `0 0 ${T}-${U} * *`;
type BetweenMonths<T extends Months, U extends Months> = `0 0 1 ${T}-${U} *`;
type StandardCronExpression<T extends string> = T extends `${infer A} ${infer B} ${infer C} ${infer D} ${infer E}` ? `${A} ${B} ${C} ${D} ${E}` : never;
type NonStandardCronExpression<T extends string> = T extends `${infer A} ${infer B} ${infer C} ${infer D} ${infer E} ${infer F}` ? `${A} ${B} ${C} ${D} ${E} ${F}` : never;
type UseNonStandardCronExpression = {
everySecond: () => EverySecond<Seconds>;
everyCustomSecond: <T extends Seconds>(second: T) => EverySecond<T>;
every5Seconds: () => NonStandardCronExpression<"*/5 * * * * *">;
every10Seconds: () => NonStandardCronExpression<"*/10 * * * * *">;
every15Seconds: () => NonStandardCronExpression<"*/15 * * * * *">;
every30Seconds: () => NonStandardCronExpression<"*/30 * * * * *">;
every45Seconds: () => NonStandardCronExpression<"*/45 * * * * *">;
};
type CRON = {
everyMinute: () => EveryMinute<Minutes>;
everyCustomMinute: <T extends Minutes>(minute: T) => EveryMinute<T>;
everyFiveMinutes: () => StandardCronExpression<"*/5 * * * *">;
every5Minutes: () => StandardCronExpression<"*/5 * * * *">;
everyTenMinutes: () => StandardCronExpression<"*/10 * * * *">;
every10Minutes: () => StandardCronExpression<"*/10 * * * *">;
every15Minutes: () => StandardCronExpression<"*/15 * * * *">;
every30Minutes: () => StandardCronExpression<"*/30 * * * *">;
every45Minutes: () => StandardCronExpression<"*/45 * * * *">;
everyHour: () => EveryHour<Hours>;
everyCustomHour: <T extends Hours>(hour: T) => EveryHour<T>;
every2Hours: () => StandardCronExpression<"0 */2 * * *">;
every3Hours: () => StandardCronExpression<"0 */3 * * *">;
every6Hours: () => StandardCronExpression<"0 */6 * * *">;
every12Hours: () => StandardCronExpression<"0 */12 * * *">;
everyDay: () => {
get: () => EveryDay<0>;
atHour: <T extends Hours>(hour: T) => {
get: () => EveryDayAt<T>;
atMinute: <U extends Minutes>(minute: U) => EveryDayAtHourAndMinute<T, U>;
};
};
everyDayAt: <T extends Hours>(hour: T) => EveryDayAt<T>;
fromDay: <T extends DayName>(from: T) => {
toDay: <U extends DayName>(to: U) => EveryDayToDay<T, U>;
toDayAt: <U extends DayName, V extends Hours>(to: U, hour: V) => EveryDayToDayAt<T, U, V>;
};
everyWeekDay: () => StandardCronExpression<"0 0 * * 1-5">;
everyMonth: () => {
get: () => EveryMonths<1>;
onDay: <T extends Days>(day: T) => {
get: () => EveryMonthOn<T>;
atHour: <U extends Hours>(hour: U) => {
get: () => EveryDayAt<U>;
atMinute: <V extends Minutes>(min: V) => EveryDayAtHourAndMinute<U, V>;
};
};
};
atMinute: <T extends Minutes>(minute: T) => AtMinutes<T>;
atHour: <T extends Hours>(hour: T) => AtHours<T>;
atDay: <T extends Days>(day: T) => AtDays<T>;
atMonth: <T extends Months>(month: T) => AtMonths<T>;
atStartOfTheDay: () => StandardCronExpression<"0 0 * * *">;
atMorning: () => StandardCronExpression<"0 9 * * *">;
atNoon: () => StandardCronExpression<"0 12 * * *">;
atAfternoon: () => StandardCronExpression<"0 15 * * *">;
atEvening: () => StandardCronExpression<"0 18 * * *">;
atNight: () => StandardCronExpression<"0 21 * * *">;
betweenMinutes: <T extends Minutes, U extends Minutes>(start: T, end: U) => BetweenMinutes<T, U>;
betweenHours: <T extends Hours, U extends Hours>(start: T, end: U) => BetweenHours<T, U>;
betweenDays: <T extends Days, U extends Days>(start: T, end: U) => BetweenDays<T, U>;
betweenMonths: <T extends Months, U extends Months>(start: T, end: U) => BetweenMonths<T, U>;
useNonStandard: () => UseNonStandardCronExpression;
};
declare class Cron implements CRON {
everyMinute: () => "* * * * *";
everyCustomMinute: <T extends Minutes>(minute: T) => EveryMinute<T>;
everyFiveMinutes: () => "*/5 * * * *";
every5Minutes: () => "*/5 * * * *";
everyTenMinutes: () => "*/10 * * * *";
every10Minutes: () => "*/10 * * * *";
every15Minutes: () => "*/15 * * * *";
every30Minutes: () => "*/30 * * * *";
every45Minutes: () => "*/45 * * * *";
everyHour: () => "0 * * * *";
everyCustomHour: <T extends Hours>(hour: T) => EveryHour<T>;
every2Hours: () => "0 */2 * * *";
every3Hours: () => "0 */3 * * *";
every6Hours: () => "0 */6 * * *";
every12Hours: () => "0 */12 * * *";
everyDay: () => {
/** Everyday at 00:00 */
get: () => "0 0 * * *";
atHour: <T extends Hours>(hour: T) => {
get: () => EveryDayAt<T>;
atMinute: <U extends Minutes>(min: U) => EveryDayAtHourAndMinute<T, U>;
};
};
everyDayAt: <T extends Hours>(hour: T) => EveryDayAt<T>;
fromDay<T extends DayName>(from: T): {
toDay: <U extends DayName>(to: U) => `0 0 * * ${DayNameToNumber<T>}-${DayNameToNumber<U>}`;
toDayAt: <U_1 extends DayName, V extends Hours>(to: U_1, hour: V) => `0 ${V} * * ${DayNameToNumber<T>}-${DayNameToNumber<U_1>}`;
};
everyWeekDay: () => "0 0 * * 1-5";
everyMonth: () => {
/** At 00:00 on day 1 of month */
get: () => "0 0 1 1 *";
onDay: <T extends Days>(day: T) => {
get: () => `0 0 ${T} * *`;
atHour: <U extends Hours>(hour: U) => {
get: () => EveryDayAt<U>;
atMinute: <V extends Minutes>(min: V) => EveryDayAtHourAndMinute<U, V>;
};
};
};
atMinute: <T extends Minutes>(minute: T) => AtMinutes<T>;
atHour: <T extends Hours>(hour: T) => AtHours<T>;
atDay: <T extends Days>(day: T) => AtDays<T>;
atMonth: <T extends Months>(month: T) => AtMonths<T>;
atStartOfTheDay: () => "0 0 * * *";
atMorning: () => "0 9 * * *";
atNoon: () => "0 12 * * *";
atAfternoon: () => "0 15 * * *";
atEvening: () => "0 18 * * *";
atNight: () => "0 21 * * *";
betweenMinutes<T extends Minutes, U extends Minutes>(start: T, end: U): `${T}-${U} * * * *`;
betweenHours<T extends Hours, U extends Hours>(start: T, end: U): `0 ${T}-${U} * * *`;
betweenDays<T extends Days, U extends Days>(start: T, end: U): `0 0 ${T}-${U} * *`;
betweenMonths<T extends Months, U extends Months>(start: T, end: U): `0 0 1 ${T}-${U} *`;
useNonStandard(): {
everySecond: () => "* * * * * *";
every5Seconds: () => "*/5 * * * * *";
every10Seconds: () => "*/10 * * * * *";
every15Seconds: () => "*/15 * * * * *";
every30Seconds: () => "*/30 * * * * *";
every45Seconds: () => "*/45 * * * * *";
everyCustomSecond: <T extends Seconds>(second: T) => EverySecond<T>;
};
}
export type { Minutes, Hours, Days, Months, WeekDays, DayName, StandardCronExpression, NonStandardCronExpression, EveryMinute, EveryHour, EveryDay, EveryWeekDays, EveryMonths, AtMinutes, AtHours, AtDays, AtMonths, AtEveryMinutes, BetweenMinutes, BetweenHours, BetweenDays, BetweenMonths, };
export default Cron;