M54: harden operations and demo resilience
MobilityOps acceptance / backend (push) Failing after 19s
MobilityOps acceptance / frontend (push) Successful in 25s
MobilityOps acceptance / e2e (push) Skipped

This commit is contained in:
NuklearRabbit
2026-08-24 03:31:03 +02:00
parent b0706989db
commit 81e3fd63bd
101 changed files with 5641 additions and 828 deletions
+22 -2
View File
@@ -21,7 +21,13 @@ function partsAt(value: Date): Record<string, string> {
export function toBrusselsDateTimeLocal(value: Date): string {
const parts = partsAt(value);
return `${parts.year}-${parts.month}-${parts.day}T${parts.hour}:${parts.minute}`;
return `${toBrusselsDate(value)}T${parts.hour}:${parts.minute}`;
}
/** Render an instant as the Fleet Ops Europe/Brussels calendar date (YYYY-MM-DD). */
export function toBrusselsDate(value: Date): string {
const parts = partsAt(value);
return `${parts.year}-${parts.month}-${parts.day}`;
}
export function brusselsDateTimeFromNow(hours: number): string {
@@ -42,7 +48,21 @@ export function brusselsLocalToIso(value: string): string {
const represented = Date.UTC(+parts.year, +parts.month - 1, +parts.day, +parts.hour, +parts.minute);
candidate += wallClockUtc - represented;
}
return new Date(candidate).toISOString();
const result = new Date(candidate);
// Date.UTC normalises impossible calendar values and Brussels' spring transition
// contains a wall-clock hour that does not exist. Never silently shift either one.
if (toBrusselsDateTimeLocal(result) !== value) {
throw new Error("Invalid or non-existent Brussels date-time");
}
return result.toISOString();
}
export function tryBrusselsLocalToIso(value: string): string | null {
try {
return brusselsLocalToIso(value);
} catch {
return null;
}
}
/** Start of the given Brussels calendar day (YYYY-MM-DD) as a UTC ISO instant. */