@valkyriestudios/validator
Version:
A lightweight configurable javascript validator
74 lines (73 loc) • 2.28 kB
JavaScript
import { isIntGt, isIntBetween } from '@valkyriestudios/utils/number';
const RGX_DIGITS = /^\d+$/;
function isSubpart(part, min, max) {
if (!RGX_DIGITS.test(part))
return null;
const normalized = parseFloat(part);
return isIntBetween(normalized, min, max) ? normalized : null;
}
function isPart(part, min, max) {
if (part === '*') {
return true;
}
else if (part.indexOf('/') > -1) {
const [base, stepStr] = part.split('/', 2);
const step = parseFloat(stepStr);
if (!isIntGt(step, 0) || !isIntBetween(step, min, max))
return false;
if (base === '*')
return true;
let start = min;
let end = max;
if (base.indexOf('-') > -1) {
const chunks = base.split('-');
if (chunks.length !== 2)
return false;
start = isSubpart(chunks[0], min, max);
end = isSubpart(chunks[1], min, max);
}
else {
start = isSubpart(base, min, max);
}
if (start === null || end === null)
return false;
if (start > end)
return false;
if (step > (end - start))
return false;
return true;
}
else if (part.indexOf('-') > -1) {
const chunks = part.split('-');
if (chunks.length !== 2)
return false;
const start = isSubpart(chunks[0], min, max);
const end = isSubpart(chunks[1], min, max);
if (start === null || end === null)
return false;
return start < end;
}
else if (part.indexOf(',') > -1) {
const chunks = part.split(',');
for (let i = 0; i < chunks.length; i++) {
if (isSubpart(chunks[i], min, max) === null)
return false;
}
return true;
}
else {
return isSubpart(part, min, max) !== null;
}
}
function vCron(val) {
if (typeof val !== 'string')
return false;
const parts = val.split(' ', 6);
return (parts.length === 5 &&
isPart(parts[0], 0, 59) &&
isPart(parts[1], 0, 23) &&
isPart(parts[2], 1, 31) &&
isPart(parts[3], 1, 12) &&
isPart(parts[4], 0, 6));
}
export { vCron, vCron as default };