d1ec7367a0
Root cause: when auth.me() failed during initial navigation, the catch block
called navigate('/login') without clearing _pendingLoginRedirect. The outer
finally then fired a second concurrent navigate('/login'), which held
isNavigating=true while running. If the user submitted the login form (or
iCloud Keychain autofilled credentials) before the second navigation
completed, navigate('/', user) was silently blocked by the isNavigating guard —
login appeared to succeed but the app never advanced to the dashboard.
Fix: clear _pendingLoginRedirect in the catch block so the finally handler
does not spawn the duplicate navigation.
Also adds a GET /api/v1/version endpoint (no auth required) and shows the
version on the login page, so users can verify their PWA has received the
latest cached JS.
Resolves #68
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
2.2 KiB
JSON
48 lines
2.2 KiB
JSON
{
|
|
"name": "oikos",
|
|
"version": "0.20.41",
|
|
"description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.",
|
|
"main": "server/index.js",
|
|
"type": "module",
|
|
"engines": {
|
|
"node": ">=22.0.0"
|
|
},
|
|
"scripts": {
|
|
"start": "node --import dotenv/config server/index.js",
|
|
"dev": "node --import dotenv/config --watch server/index.js",
|
|
"setup": "node --import dotenv/config setup.js",
|
|
"test:db": "node --experimental-sqlite test-db.js",
|
|
"test:dashboard": "node --experimental-sqlite test-dashboard.js",
|
|
"test:tasks": "node --experimental-sqlite test-tasks.js",
|
|
"test:shopping": "node --experimental-sqlite test-shopping.js",
|
|
"test:meals": "node --experimental-sqlite test-meals.js",
|
|
"test:calendar": "node --experimental-sqlite test-calendar.js",
|
|
"test:ncb": "node --experimental-sqlite test-notes-contacts-budget.js",
|
|
"test:ux-utils": "node test-ux-utils.js",
|
|
"test:modal-utils": "node --loader ./test-browser-loader.mjs test-modal-utils.js",
|
|
"test:reminders": "node --experimental-sqlite test-reminders.js",
|
|
"test:api": "node test-api.js",
|
|
"test:ics-parser": "node test-ics-parser.js",
|
|
"test:ics-sub": "node --experimental-sqlite test-ics-subscription.js",
|
|
"test": "node --experimental-sqlite test-db.js && node --experimental-sqlite test-dashboard.js && node --experimental-sqlite test-tasks.js && node --experimental-sqlite test-shopping.js && node --experimental-sqlite test-meals.js && node --experimental-sqlite test-calendar.js && node --experimental-sqlite test-notes-contacts-budget.js && npm run test:ux-utils && npm run test:modal-utils && npm run test:reminders && npm run test:api && npm run test:ics-parser && npm run test:ics-sub"
|
|
},
|
|
"dependencies": {
|
|
"bcrypt": "^6.0.0",
|
|
"better-sqlite3": "^12.9.0",
|
|
"dotenv": "^17.4.2",
|
|
"express": "^5.2.1",
|
|
"express-rate-limit": "^8.3.2",
|
|
"express-session": "^1.19.0",
|
|
"helmet": "^8.1.0",
|
|
"node-fetch": "^3.3.2"
|
|
},
|
|
"optionalDependencies": {
|
|
"googleapis": "^171.4.0",
|
|
"tsdav": "^2.1.8"
|
|
},
|
|
"license": "MIT",
|
|
"devDependencies": {
|
|
"sharp": "^0.34.5"
|
|
}
|
|
}
|