JSFiddle - React, Tailwind, and code Playground
by rajnandan1
JavaScript
function validateCronExpression(cronExp) {
// Check if expression is provided and is a string
if (!cronExp || typeof cronExp !== 'string') {
return { isValid: false, message: 'Cron expression must be a non-empty string' };
}
// Split the expression into its components
const fields = cronExp.trim().split(/\s+/);
// Standard cron should have 5 or 6 fields
// minute hour day-of-month month day-of-week [year]
if (fields.length < 5 || fields.length > 6) {
return {
isValid: false,
message: 'Cron expression must have 5 or 6 fields'
};
}
// Define field constraints
const fieldConstraints = [
{ name: 'minute', min: 0, max: 59 },
{ name: 'hour', min: 0, max: 23 },
{ name: 'day', min: 1, max: 31 },
{ name: 'month', min: 1, max: 12 },
{ name: 'weekday', min: 0, max: 6 },
{ name: 'year', min: 1970, max: 2099 } // Optional field
];
// Valid characters in cron expressions
const validChars = /^[\d/*,\-]+$/;
// Validate each field
for (let i = 0; i < fields.length; i++) {
const field = fields[i];
const constraint = fieldConstraints[i];
// Check for valid characters
if (!validChars.test(field)) {
return {
isValid: false,
message: `Invalid characters in ${constraint.name} field`
};
}
// Handle special characters
if (field === '*') {
continue; // Asterisk is valid for all fields
}
// Handle lists (comma-separated values)
if (field.includes(',')) {
const values = field.split(',');
for (const value of values) {
if (!isValidRange(value, constraint.min, constraint.max)) {
return {
isValid: false,
message: `Invalid value in ${constraint.name} field: ${value}`
};
}
}
continue;
}
// Handle ranges (with hyphens)
if (field.includes('-')) {
const [start, end] = field.split('-').map(Number);
if (start == null || end == null...