Migrate the Timeline/Saved history state module to idiomatic Svelte 5 runes and wire up type-checking. - Rename history.ts -> historyState.svelte.ts and replace the Svelte stores with $state-backed reactive values, removing the get() calls (the only remaining one reads the external inputStateStore). A small localStorage-backed `persisted()` helper keeps the same keys, so user data is preserved. Consumers read via the reactive `historyState` getter object instead of store auto-subscriptions. - The gist loader now replaces the in-memory revisions in one call (setLoaderEntries) instead of appending, so loading a new gist no longer accumulates stale revisions. - Add svelte-check: new `check` script, a "Type check" step in the unit-tests CI workflow, and skipLibCheck so the check passes on the dependency .d.ts files. svelte-check reports 0 errors / 0 warnings. - Add accessible labels to the History toggle and the per-item Restore/Delete buttons (a11y + testability). - Unskip tests/history.spec.ts and rewrite it against the new UI: load-from-localStorage + restore, tab-highlight follows the mode, save/dedupe, auto-vs-manual isolation, and delete/clear. All pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
import { writable, get, type Writable } from 'svelte/store';
|
|
import { persist, localStorage } from '$lib/util/persist';
|
|
import { injectHistoryIDs } from '$lib/components/History/historyState.svelte';
|
|
import { logEvent } from './stats';
|
|
|
|
interface MigrationState {
|
|
version: number;
|
|
}
|
|
|
|
const migrations: Record<string, () => void> = {
|
|
injectHistoryIDs
|
|
};
|
|
|
|
const migrationStore: Writable<MigrationState> = persist(
|
|
writable({ version: -1 }),
|
|
localStorage(),
|
|
'migrations'
|
|
);
|
|
|
|
export const applyMigrations = (): void => {
|
|
const { version }: MigrationState = get(migrationStore);
|
|
const allMigrations = Object.entries(migrations);
|
|
if (version === allMigrations.length - 1) {
|
|
return;
|
|
}
|
|
console.log(`Current migration version: v${version}. Migrating to v${allMigrations.length - 1}.`);
|
|
for (let i = version + 1; i < allMigrations.length; i++) {
|
|
const [key, fn] = allMigrations[i];
|
|
console.log(`Applying migration ${i}: ${key}.`);
|
|
fn();
|
|
logEvent('migration', { key });
|
|
migrationStore.set({ version: i });
|
|
}
|
|
logEvent('migration', { status: 'complete', from: version, to: allMigrations.length - 1 });
|
|
};
|