UNPKG

@valkyriestudios/validator

Version:

A lightweight configurable javascript validator

74 lines (73 loc) 2.28 kB
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 };