Files
Live_RC/package.json
larssand 94794350e5 Add a results archive and purge orphaned passing rows on delete
Until now there was no way to find a completed session without already
knowing which event it belonged to - navigation was strictly Events ->
one event -> its sessions. A new "Resultatarkiv" view lists every
finished session across all events, searchable by event/session name,
class, driver and date range.

Opening a session reuses the existing single-session leaderboard
builder for standings and the existing per-competitor lap lookup for
lap history - no new results logic - plus a session-wide penalties/
corrections list (resultsBySession[id].adjustments), previously only
visible in the live judging action log. Export buttons reuse the
existing per-event PDF and race-package JSON export functions rather
than adding a new format.

Investigated what should happen to raw timing data when a race is
deleted. Training statistics and session replay already read from
their own independent, deliberately-retained copies that survive
deletion by existing design - unaffected either way. The one thing
that outlived deletion with no purpose was the raw `passings` SQLite
rows (write-only; nothing in the app reads them), growing forever with
driver IDs never purged. A new POST /api/passings/purge endpoint now
removes exactly the deleted session(s)' rows, called as a best-effort
side call from both delete-event and delete-session.

Also fixes a real bug found while building this: ensureSessionResult
guarded adjustments/splits/pitEvents/pitStops against being missing on
an already-existing result, but not passings itself, so viewing lap
history for such a result (e.g. an older/imported race package)
crashed outright.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 15:49:10 +02:00

34 lines
1.1 KiB
JSON

{
"name": "rc-racecore",
"version": "1.6.0",
"private": true,
"description": "RC RaceCore live timing and race control with AMMC ingest and SQLite persistence",
"engines": {
"node": ">=22 <27",
"npm": ">=10"
},
"allowScripts": {
"better-sqlite3": true
},
"scripts": {
"preinstall": "node scripts/preinstall.js",
"postinstall": "node scripts/verify-install.js",
"start": "node scripts/serverctl.js start",
"start:fg": "node server.js",
"stop": "node scripts/serverctl.js stop",
"status": "node scripts/serverctl.js status",
"restart": "node scripts/serverctl.js restart",
"verify": "node scripts/verify-install.js",
"backup:restore": "node scripts/restore-backup.js",
"audit:prod": "npm audit --omit=dev",
"test": "node --experimental-default-type=module tests/run.js",
"test:browser": "node --experimental-default-type=module tests/browser_smoke.js",
"setup:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File windows/setup.ps1"
},
"dependencies": {
"better-sqlite3": "^12.11.1",
"express": "5.2.1",
"qrcode": "^1.5.4"
}
}