UNPKG

cron-toolkit-ts

Version:

Type-safe Toolkit to get cron expressions for JavaScript and TypeScript

162 lines (161 loc) 10.1 kB
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;