@rschedule/rule-tools
The optional package @rschedule/rule-tools contains utility functions for manipulating rSchedule Rule and Schedule objects and working with common recurrence rule patterns. Even if you don't use it, it can provide a useful example of how to manipulate and build up immutable rSchedule objects.
Example:
import { addSchedulePattern } from '@rschedule/rule-tools';
let schedule = new Schedule();
schedule = addSchedulePattern('every [WEEKDAY]', new Date(), schedule);
// Assume the day is "Tuesday" so `new Date().getDay() === 2`
schedule.rrules[0].options; // { start: new Date(), frequency: 'WEEKLY', byDayOfWeek: ['TU']}
schedule.occursOn({ weekday: 'TU' }); // true
Installation
yarn add @rschedule/rule-tools
# or
npm install @rschedule/rule-tools
Usage
@rschedule/rule-tools provides utility functions for working with common occurrence and recurrence patterns which I've identified.
Currently, @rschedule/rule-tools defines four common recurrence patterns and one common occurrence pattern. A RecurrencePattern is a common combination of rule options for defining a recurring schedule. An OccurrencePattern is a common singleton occurrence definition.
The rule-tools package is meant to make it easier to add these common rule options to Schedule objects, remove these common rule options, check if a schedule has a specific one of these common rule options on a given day, or update one of these common rule options to "stop" on a given day.
In practical terms, here is an example workflow:
- A user clicks on a day on the calendar.
- The
validRecurrencePatternsOnDate()function can be used to find what common recurrence patterns can be added for the clicked date. - The
scheduleHasPattern()function can be used to see if a specificScheduleobject already has a specific occurrence pattern on the given date.- For all the rules existing in the
Schedulefor the given date, you can provide an option to the user toendthat rule on that date, or remove the rule altogether.endScheduleRecurrencePattern()removeSchedulePattern()
- For all the common rule patterns which the
Scheduledoesn't have on the given date, you can provide an option to the user to add a rule matching that pattern starting on the given date.addSchedulePattern()
- For all the rules existing in the
- If you have a
Ruleor rule options object, you can useisRecurrencePattern()to see if the rule options match a given recurrence pattern. - If you want to make a new
Rulefrom scratch, you can usebuildRecurrencePattern()to generate an options object matching the given recurrence pattern.
RecurrencePattern type
The RecurrencePattern type defines four common recurrence patterns. Where a recurrence pattern is a common set of rule options defining a schedule's repeating occurrences.
type RecurrencePattern =
| 'every [WEEKDAY]'
| 'the [MONTH_WEEKNO] [WEEKDAY] of every month'
| 'the [MONTH_DAYNO] of every month'
| 'the last [WEEKDAY] of every month';
Examples:
'every [WEEKDAY]'- "Every Tuesday"
- "Every Friday"
'the [MONTH_WEEKNO] [WEEKDAY] of every month'- "The 1st Monday of every month"
- "The 5th Sunday of every month"
'the [MONTH_DAYNO] of every month'- "The 15th of every month"
- "The 1st of every month"
'the last [WEEKDAY] of every month';- "The last Friday of every month"
- "The last Saturday of every month"
OccurrencePattern type
The OccurrencePattern type defines one common definition for singleton occurrences.
export type OccurrencePattern = 'date';
Examples:
'date'- "2019/05/04"
- January 1st, 2019
Schedule functions
@rschedule/rule-tools provides utility functions for working with Schedule objects.
scheduleHasPattern()
Checks to see if a schedule contains the OccurrencePattern or RecurrencePattern on the given date.
-
Pass the
ignoreStart: trueoption to ignore thestarttime of the rules being checked (this means that the provideddatecan be before the rule'sstarttime). -
Pass the
ignoreEnd: trueoption to ignore theendtime of the rules being checked (this means that the provideddatecan be after the rule'sendtime).
function scheduleHasPattern(args: {
pattern: Pattern;
date: DateInput;
schedule: Schedule<any>;
ignoreStart?: boolean | undefined;
ignoreEnd?: boolean | undefined;
}): boolean;
addSchedulePattern()
Adds the OccurrencePattern or RecurrencePattern to the schedule on the provided date.
function addSchedulePattern<S extends Schedule>(pattern: Pattern, date: DateInput, schedule: S): S;
endScheduleRecurrencePattern()
End any matching RecurrencePatterns the schedule has on the provided date.
function endScheduleRecurrencePattern<S extends Schedule>(args: {
pattern: RecurrencePattern;
date: DateInput;
schedule: S;
cleanEXDates?: boolean;
}): S;
removeSchedulePattern()
Remove any matching OccurrencePatterns or RecurrencePatterns the schedule has on the provided date.
function removeSchedulePattern<S extends Schedule>(args: {
pattern: Pattern;
date: DateInput;
schedule: S;
cleanEXDates?: boolean;
}): S;
cleanScheduleEXDates()
Remove all of the schedule's exdates which do not intersect the schedule's occurrences.
function cleanScheduleEXDates<S extends Schedule>(schedule: S): S;
Rule functions
isRecurrencePattern()
Checks to see if the provided rule/rule options match the given RecurrencePattern.
function isRecurrencePattern(args: {
pattern: RecurrencePattern;
date: DateInput;
rule: Rule | IRuleOptions;
ignoreStart?: boolean;
ignoreEnd?: boolean;
}): boolean;
validRecurrencePatternsOnDate()
Returns an array containing all the RecurrencePatterns which are valid on a given date.
function validRecurrencePatternsOnDate(date: DateInput): RecurrencePattern[];
buildRecurrencePattern()
Builds a rule options object matching the given RecurrencePattern with the given start date.
function buildRecurrencePattern(pattern: RecurrencePattern, start: DateInput): IRuleOptions;