jlcodes99/cockpit-tools · error
crontab_range_invalid
crontab_range_invalid
Error message
crontab_range_invalid
What it means
When a crontab segment contains an explicit range 'start-end', both bounds are validated against the field's min/max, then compared. If end < start the range is descending and cannot be expanded, so parseCrontabSegment throws 'crontab_range_invalid'.
Source
Thrown at src/pages/WakeupTasksPage.tsx:497
const rangePart = rawRange.trim();
const step = rawStep ? parseCrontabNumber(rawStep) : 1;
if (step <= 0) {
throw new Error('crontab_step_must_be_positive');
}
if (rangePart === '*') {
insertCrontabRange(target, min, max, step, normalizeDayOfWeek);
return;
}
if (rangePart.includes('-')) {
const [rawStart, rawEnd] = rangePart.split('-');
const start = parseCrontabNumber(rawStart);
const end = parseCrontabNumber(rawEnd);
validateCrontabValue(start, min, max, normalizeDayOfWeek);
validateCrontabValue(end, min, max, normalizeDayOfWeek);
if (end < start) {
throw new Error('crontab_range_invalid');
}
insertCrontabRange(target, start, end, step, normalizeDayOfWeek);
return;
}
const single = parseCrontabNumber(rangePart);
validateCrontabValue(single, min, max, normalizeDayOfWeek);
if (step === 1) {
target.add(normalizeDayOfWeek ? normalizeCrontabDayOfWeek(single) : single);
return;
}
insertCrontabRange(target, single, max, step, normalizeDayOfWeek);
};
const parseCrontabField = (
field: string,
min: number,
max: number,View on GitHub (pinned to 1ed8b77992)
Solutions
- Rewrite the range so start <= end (e.g. '5-10' instead of '10-5').
- If a wrap-around range is intended, express it as two ranges (e.g. '22-23,0-5' instead of '22-5').
- Catch the error at input time and surface 'crontab_range_invalid' as an inline form validation message before submit.
Example fix
// before '22-5 * * * *' // end < start // after '22-23,0-5 * * * *' // or '5-22 * * * *'
Defensive patterns
Strategy: validation
Validate before calling
const m = segment.match(/^(\d+)-(\d+)/);
if (m && Number(m[2]) < Number(m[1])) {
throw new Error('crontab_range_invalid');
} Type guard
const isAscendingRange = (start: number, end: number): boolean => end >= start;
Try / catch
try {
const parsed = parseCrontabExpression(expr);
} catch (e) {
if ((e as Error).message === 'crontab_range_invalid') {
setFieldError('range end must be >= start; use a comma list for wrap-around');
}
} Prevention
- When generating ranges programmatically, sort bounds: [Math.min(a,b), Math.max(a,b)]
- Express wrap-around windows as two ranges joined by commas
- Validate cron input inline as the user types, not only on submit
When it happens
Trigger: A segment like '10-5' in the minute field, or any 'start-end/step' segment where the numeric end is less than the start (both already passing validateCrontabValue bounds).
Common situations: Hand-typed cron expressions in the Wakeup Tasks UI where the user swaps bounds ('30-10' meaning 'every 10 from 30'); copy-pasted cron from docs using a different dialect that permits wrap-around ranges.
Related errors
- crontab_step_must_be_positive
- crontab_field_empty
- crontab_segment_empty
- crontab_parts_must_be_five
- crontab_no_values
AI-assisted analysis of jlcodes99/cockpit-tools@1ed8b77992 (2026-09-05).
Data as JSON: /api/errors/8bd750eb14e061be.
Report an issue: GitHub.