Files
sencho/frontend/src/lib/scheduling.ts
T
Anso db8bb70b7d fix(scheduler): reject 6-field cron in Scheduled Operations (#1435)
* fix(scheduler): reject 6-field cron in Scheduled Operations

Create and edit validation parsed cron with cron-parser, which accepts both
5- and 6-field expressions, while the form, presets, and docs all describe a
5-field cron. Because the scheduler ticks once per minute, a leading seconds
field can never improve precision, so a 6-field expression was silently
accepted but never honored on its stated schedule.

Add a field-count guard on both sides: the API rejects 6-field input at
create and edit with a clear message, and the form surfaces the same error
inline and disables save. Cron nicknames such as @daily still pass. Document
the five-field requirement in the cron reference.

* chore: merge main into scheduled cron validation

* fix: avoid logging policy bypass actor in debug output
2026-06-24 23:00:56 -04:00

29 lines
899 B
TypeScript

import cronstrue from 'cronstrue';
export function getCronDescription(expression: string): string {
try {
return cronstrue.toString(expression);
} catch {
return 'Invalid expression';
}
}
/**
* Reject cron expressions with a leading seconds field (6 or more fields). The
* scheduler is minute-granular, so the seconds field could never be honored.
* Nicknames like `@daily` (one token) pass. Returns an error message or null
* when the field count is acceptable.
*/
export function getCronFieldError(expression: string): string | null {
const trimmed = expression.trim();
if (trimmed && trimmed.split(/\s+/).length >= 6) {
return 'Use 5 fields (minute hour day month weekday). The seconds field is not supported.';
}
return null;
}
export function formatTimestamp(ts: number | null): string {
if (ts == null) return '-';
return new Date(ts).toLocaleString();
}