main
chore: copy redirect + tests to new api (#53999)
fix(api): handle Date values for completedChallenge.completedDate (#60400)
fix(api): handle users without email addresses (#60467)
feat(api): add user id to user report (#59816)
fix(api): whitespace in default values (#60199)
fix(api): use generic error message if CSRF error (#55264)
feat(api): add POST /exam-challenge-completed (#52395)
chore: update Knip to v5 (#56244)
refactor(api): more, smaller tests (#54671)
refactor(api, curriculum): use the shared shuffleArray util (#56444)
fix(api): getChallenges helper function (#51011)
fix(api): allow server to be run from any dir (#54610)
feat(api): use jwt_access_token (in development) (#53997)
chore(api): compile TS into /dist (#49812
feat(api): add exam-environment endpoints (#55662)
fix(api): deduplicating objects in logs (#60319)
fix(api): handle string challengeType (#60491)
feat(api): add /user/get-session-user (#50557)
feat(api): api/users/get-public-profile (#54729)
fix(api): strip query params on redirect (#58608)
chore: upgrade eslint (#58575)
feat(api): port /confirm-email to new api (#54975)
feat(api): add charge-stripe and create-stripe-payment-intent endpoints (#54545)
feat(api): project-completed (#50701)
feat(api): report user endpoint (#51170)