Select Git revision
-
Sergio Zharinov authoredSergio Zharinov authored
schedule.js 5.62 KiB
const is = require('@sindresorhus/is');
const later = require('later');
const moment = require('moment-timezone');
module.exports = {
hasValidTimezone,
hasValidSchedule,
isScheduledNow,
};
const scheduleMappings = {
'every month': 'before 3am on the first day of the month',
monthly: 'before 3am on the first day of the month',
};
function fixShortHours(input) {
return input.replace(/( \d?\d)((a|p)m)/g, '$1:00$2');
}
function hasValidTimezone(timezone) {
if (!moment.tz.zone(timezone)) {
return [false, `Invalid timezone: ${timezone}`];
}
return [true];
}
function hasValidSchedule(schedule) {
let message;
if (
!schedule ||
schedule === 'at any time' ||
schedule[0] === 'at any time'
) {
return [true];
}
// check if any of the schedules fail to parse
const hasFailedSchedules = schedule.some(scheduleText => {
const massagedText = fixShortHours(
scheduleMappings[scheduleText] || scheduleText
);
const parsedSchedule = later.parse.text(massagedText);
if (parsedSchedule.error !== -1) {
message = `Failed to parse schedule "${scheduleText}"`;
// It failed to parse
return true;
}
if (parsedSchedule.schedules.some(s => s.m)) {
message = `Schedule "${scheduleText}" should not specify minutes`;
return true;
}
if (
!parsedSchedule.schedules.some(
s => s.d !== undefined || s.D || s.t_a !== undefined || s.t_b
)
) {
message = `Schedule "${scheduleText}" has no days of week or time of day`;
return true;
}
// It must be OK
return false;
});
if (hasFailedSchedules) {
// If any fail then we invalidate the whole thing
return [false, message];
}
return [true];
}
function isScheduledNow(config) {
let configSchedule = config.schedule;