Build and Push Docker Image / build-and-push (push) Successful in 7m14s
Sync and data safety - Autosave flushes on leaving a study or the tab; storage-full errors are reported - Unsynced studies, deletes and ink are queued and retried when back online - Deletes propagate across devices (with a "Keep it" undo) and no longer resurrect - Server assigns study versions (no client-clock conflicts); "Combine both" merges a conflicted study chunk by chunk - Reading-plan progress made offline is merged, not overwritten; plans, ink and marks are cleared from the device on sign-out Security - Block SSRF through the ntfy reminder URL; failure-only rate limiting per IP and account; constant-time login; TOTP replay protection; input validation; SESSION_SECRET required in production; admin user delete fixed - Forgot password: one-time code sent to the account's ntfy topic Features - IQ Bible proxy (route allow-list, text-only caching per its terms): more commentaries, lexicons, study aids, daily verse and devotional, plan calendar export, narrations, podcast background - Study templates, reading-plan catch-up, account export, daily database snapshots Tests and tooling - ESLint config; App tests split into src/test; tests for sync queues, library hook, merge, templates, IQ Bible UI and reset form Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
33 lines
1.1 KiB
JavaScript
33 lines
1.1 KiB
JavaScript
// Everything one account holds on the server, in the same file format the app's own "Download backup"
|
|
// makes, so it can be restored from Settings on any device.
|
|
export const BACKUP_APP = 'bible-study-project';
|
|
export const BACKUP_VERSION = 1;
|
|
|
|
// `store` supplies the account's data: { projects(), prefs(), marks(), ink(), plans() }.
|
|
export function buildAccountExport(user, store, now = new Date()) {
|
|
const prefs = store.prefs() ?? {};
|
|
const marks = store.marks() ?? {};
|
|
const plans = store.plans() ?? {};
|
|
return {
|
|
app: BACKUP_APP,
|
|
version: BACKUP_VERSION,
|
|
exportedAt: now.toISOString(),
|
|
account: user.email,
|
|
source: 'server',
|
|
projects: store.projects(),
|
|
reader: {
|
|
bookmarks: marks.bookmarks ?? {},
|
|
highlights: marks.highlights ?? [],
|
|
colorLabels: prefs.colorLabels?.v ?? {},
|
|
ink: store.ink() ?? {},
|
|
},
|
|
readingPlans: {
|
|
progress: plans.progress ?? [],
|
|
customPlans: plans.customPlans ?? [],
|
|
activity: plans.activity ?? [],
|
|
},
|
|
};
|
|
}
|
|
|
|
export const accountExportName = (now = new Date()) => `bible-study-account-${now.toISOString().slice(0, 10)}.json`;
|