100 lines
4.0 KiB
JavaScript
100 lines
4.0 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.MatcherWalker = void 0;
|
|
const convertion_1 = __importDefault(require("../pattern/convertion"));
|
|
const localized_time_1 = require("./localized-time");
|
|
const time_matcher_1 = require("./time-matcher");
|
|
const week_day_names_conversion_1 = __importDefault(require("../pattern/convertion/week-day-names-conversion"));
|
|
class MatcherWalker {
|
|
cronExpression;
|
|
baseDate;
|
|
pattern;
|
|
expressions;
|
|
timeMatcher;
|
|
timezone;
|
|
constructor(cronExpression, baseDate, timezone) {
|
|
this.cronExpression = cronExpression;
|
|
this.baseDate = baseDate;
|
|
this.timeMatcher = new time_matcher_1.TimeMatcher(cronExpression, timezone);
|
|
this.timezone = timezone;
|
|
this.expressions = (0, convertion_1.default)(cronExpression);
|
|
}
|
|
isMatching() {
|
|
return this.timeMatcher.match(this.baseDate);
|
|
}
|
|
matchNext() {
|
|
const findNextDateIgnoringWeekday = () => {
|
|
const baseDate = new Date(this.baseDate.getTime());
|
|
baseDate.setMilliseconds(0);
|
|
const localTime = new localized_time_1.LocalizedTime(baseDate, this.timezone);
|
|
const dateParts = localTime.getParts();
|
|
const date = new localized_time_1.LocalizedTime(localTime.toDate(), this.timezone);
|
|
const seconds = this.expressions[0];
|
|
const nextSecond = availableValue(seconds, dateParts.second);
|
|
if (nextSecond) {
|
|
date.set('second', nextSecond);
|
|
if (this.timeMatcher.match(date.toDate())) {
|
|
return date;
|
|
}
|
|
}
|
|
date.set('second', seconds[0]);
|
|
const minutes = this.expressions[1];
|
|
const nextMinute = availableValue(minutes, dateParts.minute);
|
|
if (nextMinute) {
|
|
date.set('minute', nextMinute);
|
|
if (this.timeMatcher.match(date.toDate())) {
|
|
return date;
|
|
}
|
|
}
|
|
date.set('minute', minutes[0]);
|
|
const hours = this.expressions[2];
|
|
const nextHour = availableValue(hours, dateParts.hour);
|
|
if (nextHour) {
|
|
date.set('hour', nextHour);
|
|
if (this.timeMatcher.match(date.toDate())) {
|
|
return date;
|
|
}
|
|
}
|
|
date.set('hour', hours[0]);
|
|
const days = this.expressions[3];
|
|
const nextDay = availableValue(days, dateParts.day);
|
|
if (nextDay) {
|
|
date.set('day', nextDay);
|
|
if (this.timeMatcher.match(date.toDate())) {
|
|
return date;
|
|
}
|
|
}
|
|
date.set('day', days[0]);
|
|
const months = this.expressions[4];
|
|
const nextMonth = availableValue(months, dateParts.month);
|
|
if (nextMonth) {
|
|
date.set('month', nextMonth);
|
|
if (this.timeMatcher.match(date.toDate())) {
|
|
return date;
|
|
}
|
|
}
|
|
date.set('year', date.getParts().year + 1);
|
|
date.set('month', months[0]);
|
|
return date;
|
|
};
|
|
const date = findNextDateIgnoringWeekday();
|
|
const weekdays = this.expressions[5];
|
|
let currentWeekday = parseInt((0, week_day_names_conversion_1.default)(date.getParts().weekday));
|
|
while (!(weekdays.indexOf(currentWeekday) > -1)) {
|
|
date.set('year', date.getParts().year + 1);
|
|
currentWeekday = parseInt((0, week_day_names_conversion_1.default)(date.getParts().weekday));
|
|
}
|
|
return date;
|
|
}
|
|
}
|
|
exports.MatcherWalker = MatcherWalker;
|
|
function availableValue(values, currentValue) {
|
|
const availableValues = values.sort((a, b) => a - b).filter(s => s > currentValue);
|
|
if (availableValues.length > 0)
|
|
return availableValues[0];
|
|
return false;
|
|
}
|
|
//# sourceMappingURL=matcher-walker.js.map
|