{"record":{"id":"88ac7f3f29ce08dd","repo":"twentyhq/twenty","slug":"invalid-cron-expression-errormessage","errorCode":null,"errorMessage":"Invalid cron expression: ${errorMessage}","messagePattern":"Invalid cron expression: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/twenty-front/src/modules/workflow/workflow-trigger/utils/cron-to-human/utils/parseCronExpression.ts","lineNumber":65,"sourceCode":"        dayOfWeek: parts[4],\n      };\n    } else if (parts.length === 6) {\n      // Extended format: second minute hour day month dayOfWeek\n      return {\n        seconds: parts[0],\n        minutes: parts[1],\n        hours: parts[2],\n        dayOfMonth: parts[3],\n        month: parts[4],\n        dayOfWeek: parts[5],\n      };\n    }\n\n    throw new Error('Unexpected error in cron expression parsing');\n  } catch (error) {\n    const errorMessage =\n      error instanceof Error ? error.message : 'Unknown error';\n    throw new Error(`Invalid cron expression: ${errorMessage}`);\n  }\n};\n","sourceCodeStart":47,"sourceCodeEnd":68,"githubUrl":"https://github.com/twentyhq/twenty/blob/1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6/packages/twenty-front/src/modules/workflow/workflow-trigger/utils/cron-to-human/utils/parseCronExpression.ts#L47-L68","documentation":"Thrown by parseCronExpression after the cron-parser library rejects a cron string, or after an unexpected internal failure during field-splitting. The outer catch wraps any error (parse failure or the unreachable 'Unexpected error' fallback) and re-throws with the underlying message. This is the terminal validation gate for all cron-based workflow triggers in the Twenty frontend.","triggerScenarios":"Calling parseCronExpression(expression) where expression has invalid field values (e.g. '99 99 * * *' — out-of-range minute/hour), unsupported syntax the normalizer cannot fix, or a 4-6 field string that cron-parser.rejects. Also fires if parts.length is 4-6 but none of the if/else-if branches match (defensive).","commonSituations":"User types a cron expression like '0 9 * * MONDAY' (named day not supported by this parser config), or '*/0 * * * *' (zero-step interval). Copy-pasting a cron string from a different system (e.g. AWS EventBridge with year field) that has 7 fields triggers the earlier field-count error, but a 5-field string with a bad range like '0 25 * * *' reaches this catch.","solutions":["Validate the cron expression against cron-parser directly before calling parseCronExpression, using CronExpressionParser.parseTry() (non-throwing variant) to get a friendly preview.","Ensure dayOfWeek uses numeric values 0-7 (0 and 7 both = Sunday) rather than names like 'MON'.","Check each field range: minute 0-59, hour 0-23, dayOfMonth 1-31, month 1-12, dayOfWeek 0-7.","If using step syntax '*/N', ensure N is a positive integer (not 0 or negative)."],"exampleFix":"// before\nconst parts = parseCronExpression(userInput);\n\n// after\nimport { CronExpressionParser } from 'cron-parser';\ntry {\n  CronExpressionParser.parse(userInput, { tz: 'UTC' });\n} catch {\n  throw new Error(`Please enter a valid cron expression. Use numeric fields (0-59 min, 0-23 hour, 1-31 day, 1-12 month, 0-7 weekday).`);\n}\nconst parts = parseCronExpression(userInput);","handlingStrategy":"validation","validationCode":"import { CronExpressionParser } from 'cron-parser';\n\nconst isParsableCron = (expr: string): boolean => {\n  try {\n    CronExpressionParser.parse(expr, { tz: 'UTC' });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n// Before calling parseCronExpression:\nif (!isParsableCron(userInput)) {\n  setFieldError('cron', 'Enter a valid cron expression (numeric fields only).');\n  return;\n}","typeGuard":"const isValidCronFieldRange = (field: string, min: number, max: number): boolean => {\n  if (field === '*' || field.startsWith('*/')) return true;\n  return field.split(',').every((part) => {\n    const n = parseInt(part, 10);\n    return !isNaN(n) && n >= min && n <= max;\n  });\n};","tryCatchPattern":"try {\n  const parts = parseCronExpression(expression);\n} catch (error) {\n  if (error instanceof Error && error.message.startsWith('Invalid cron expression')) {\n    // Show user-friendly validation message\n    showCronValidationError(error.message);\n    return;\n  }\n  throw error;\n}","preventionTips":["Provide a cron expression picker/builder UI rather than free-text input.","Pre-validate with cron-parser before passing to parseCronExpression.","Document the supported cron format (numeric fields, no named days/months) near the input field."],"tags":["cron","workflow-trigger","validation","frontend"],"backgroundTag":null,"analyzedSha":"1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6","analyzedAt":"2026-08-12T15:37:27.593Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}