quartzcron
Version:
version: `0.1.0` [CHANGELOG](https://github.com/fedeghe/quartzcron/blob/master/CHANGELOG.md)
71 lines (68 loc) • 2.23 kB
JavaScript
/*
quartzcron (v.0.1.0)
*/
const { rx, errors } = require('./constants.js');
const getRangeValidator = (mainRx, cadenceRx) => val => {
const v = `${val}`;
if (v.match(rx.dumb.astrxn)) return true;
const elements = v.split(/,/),
matches = elements.map(el => el.match(rx.loose['n-n/nOPZ'])).filter(Boolean);
if(matches.length !== elements.length) return false;
// 1,3,5 => n-n/n
// 1,3 => n-n
// 1,5 => n/n
// 1 => n
return matches.every(m => {
const base = m[1].match(mainRx);
if (base) {
if (m[3] && m[5]){
return m[3].match(mainRx) && m[5].match(cadenceRx);
}
if(m[3]) return m[3].match(mainRx);
if(m[5]) return m[5].match(cadenceRx);
}
return base;
});
},
getValidator = rxs => v => rxs.find(r => {
if(typeof r === 'function') return r(v);
return `${v}`.match(r);
}),
rx059 = getRangeValidator(rx.ranged['0-59'], rx.ranged['0-59'] ),
rx023 = getRangeValidator(rx.ranged['0-23'], rx.ranged['0-23'] ),
rx131 = getRangeValidator(rx.ranged['1-31'], rx.ranged['1-31'] ),
rxmonth = getRangeValidator(rx.month, rx.month ),
rxYear = getRangeValidator(rx.year, rx.yearCadence ),
rxWeekday = getRangeValidator(rx.ranged['maybelabelled-wd'], rx.ranged['maybelabelled-wd'] ),
rxDom = getValidator([
rx131,
rx.ranged['1-31'],
rx.dumb.quest,
rx.dumb.astrxn,
rx.dumb['LW?'],
rx.ranged['L-md'],
rx.ranged['1-31L'],
rx.ranged['1-31W']
]),
rxDow = getValidator([
rx.dumb.quest,
rxWeekday,
rx.ranged.fullWd,
rx.ranged.nthFullWd
]),
fieldCorrelationValidators = [{
validator: ({dom, dow}) => !(dow!=='?' && dom!=='?') && !(dow==='?'&&dom==='?'),
message: errors.domdowExclusivity
}];
module.exports = {
validators: {
second: rx059,
minute: rx059,
hour: rx023,
month: rxmonth,
year: rxYear,
dayOfMonth: rxDom,
dayOfWeek: rxDow
},
fieldCorrelationValidators
};