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...