pediatric-ai-scribe-v3/public/js
Daniel bc2580b148 test(lint): static reference linter — catches dead-code + orphan refs
You were right that Playwright has been catching the easy bugs while
the high-signal bugs (lightbox stranded after the Bedside reorg, PVC
clinically wrong, prod not rebuilt) all had to be caught by you as
the user. Adding a static linter so the class of bug that produced
the lightbox regression fails CI next time instead of the app.

scripts/lint-references.js walks public/js and validates every
getElementById('X') and querySelector('#X') resolves to an id that
is defined SOMEWHERE in the repo — either a static HTML attribute,
a .id = 'X' assignment, or an id="X" substring inside a JS template
string. It also walks HTML for asset references (data-img-src,
<img src>, <audio src>, <link href>) and verifies each root-absolute
path maps to a real file on disk.

Running it on the current tree surfaced two real problems:

1. shadess.js:917 reached for #wv-note-transcript when collecting
   refine source context. The actual id is #wv-transcript (no -note-
   infix — the transcript element is shared across well-visit sub-
   panels). The bug meant a generated well-visit note's Refine call
   silently missed the original transcript as source context; the AI
   still "worked" but with less signal and no error. Fixed.

2. public/js/adminMilestones.js (221 lines) referenced 17 ids that
   were removed a year+ ago in commit 3173ce6 ("Remove milestone
   admin UI, add CMS content refresh button"). That commit dropped
   the HTML but forgot the JS, which has been dead-loaded on every
   page view since. All its addEventListener calls are guarded with
   optional chaining, so nothing errored — just silent cruft.
   Deleted the file and dropped the <script defer> tag from
   index.html.

scripts/e2e.sh runs the linter as a preflight before the Playwright
container starts; a broken reference now fails the suite before any
test even boots.

Allowlist is kept small and prefix-based for the handful of id families
that are built dynamically by JS (bedside em-* sections, BP chart
elements, etc.). When a new component is added, its ids get picked up
automatically by the repo-wide collect() pass; the allowlist rarely
needs to grow.

Suite: 294 passed / 0 failed.
2026-04-23 18:58:38 +02:00
..
bedside feat(ui-state): persist sub-pill selections across reload + sign-out 2026-04-23 18:58:38 +02:00
admin.js fix(admin): restore SSO settings loading on admin panel 2026-04-21 22:19:50 +02:00
app.js Security hardening: low-risk easy wins 2026-04-14 02:42:32 +02:00
audioBackup.js v6.1: Turnstile bot protection, LiteLLM provider, PPTX tables, audio backup fixes, docs 2026-04-04 22:56:24 +02:00
auth.js Hide APK download link on the native Android app 2026-04-14 22:47:59 +02:00
authFetch.js Batch of security + scale fixes 2026-04-14 05:24:40 +02:00
browserWhisper.js FIX: Browser Whisper - 100% self-hosted, zero CDN dependencies 2026-03-31 23:12:21 +00:00
calc-math.js feat: Bedside clinical reference module + age→weight estimator + dose-math unit tests 2026-04-20 02:49:42 +02:00
calculators.js feat(ui-state): persist sub-pill selections across reload + sign-out 2026-04-23 18:58:38 +02:00
chartReview.js Add automatic ICD-10 and CPT billing code suggestions 2026-04-11 01:50:17 +02:00
correctionTracker.js v9: Major feature update — audio backup, SOAP save, Dragon memory, S3 docs, CI/CD, APK 2026-03-28 21:08:32 +00:00
documents.js Hybrid auth: cookie-only on web, Keychain Bearer on mobile 2026-04-14 04:11:55 +02:00
drugs-loader.js feat: B — extract drug data to public/data/drugs.json (schema v1.0) 2026-04-20 04:23:24 +02:00
e2e-bootstrap.js feat(nav): promote Bedside to its own tab; reorganise sidebar sections 2026-04-23 18:58:38 +02:00
encounters.js Cache-busting version stamps + client-side encounter version tracking 2026-04-14 05:40:42 +02:00
extensions.js fix(ui): replace native alert/confirm with showConfirm/showToast helpers 2026-04-22 19:29:53 +02:00
hospitalCourse.js Add automatic ICD-10 and CPT billing code suggestions 2026-04-11 01:50:17 +02:00
learningHub.js Security hardening: PHI encryption, argon2, DOMPurify, SRI 2026-04-14 02:49:38 +02:00
liveEncounter.js Native Android: biometric auth, foreground service bridge, mic fix 2026-04-11 03:42:23 +02:00
memories.js Replace all browser dialogs with modern modal, add OIDC admin UI 2026-04-09 02:43:23 +02:00
milestones.js v6.2: Session management, password change, audit logging, refine context, UI fixes 2026-04-08 20:27:45 +02:00
milestonesData.js v4: Fix milestones display + add OpenID auth + 100MB PDF support 2026-04-01 17:59:51 +00:00
nextcloud.js Fix WebDAV selection, pdf-parse, prompt(), CSP, security issues 1/2/4/5 2026-03-24 02:28:43 -04:00
pediatricScheduleData.js feat(wellvisit): add Expected Reflexes section to By Visit Age 2026-04-21 22:20:07 +02:00
peGuide.js fix(pe-guide): remove PVC entry from cardiac sounds library 2026-04-23 18:58:38 +02:00
secureStorage.js Add hardware-backed secure storage for mobile auth token 2026-04-14 02:33:32 +02:00
shadess.js test(lint): static reference linter — catches dead-code + orphan refs 2026-04-23 18:58:38 +02:00
sickVisit.js Add automatic ICD-10 and CPT billing code suggestions 2026-04-11 01:50:17 +02:00
soap.js Add pause/stop buttons to SOAP note recording 2026-04-11 05:19:12 +02:00
speechRecognition.js Add Web Speech Recognition option for real-time streaming 2026-03-31 21:57:24 +00:00
transcriptionSettings.js Replace all browser dialogs with modern modal, add OIDC admin UI 2026-04-09 02:43:23 +02:00
ui-state.js feat(ui-state): persist sub-pill selections across reload + sign-out 2026-04-23 18:58:38 +02:00
voiceDictation.js Add automatic ICD-10 and CPT billing code suggestions 2026-04-11 01:50:17 +02:00
voicePreferences.js Fix TTS preview for 'Server default' voice option 2026-03-31 16:15:41 +00:00
wellVisit.js feat(ui-state): persist sub-pill selections across reload + sign-out 2026-04-23 18:58:38 +02:00
whisperWorker.js FIX: Browser Whisper - 100% self-hosted, zero CDN dependencies 2026-03-31 23:12:21 +00:00
whisperWorkerV2.js v16: Make Browser Whisper CDN failure graceful with clear warnings 2026-03-31 16:18:46 +00:00