feat(pwa): Cache-Manifest-Diff-Funktion + Tests
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m19s
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m19s
Pure Funktion diffManifest(current, cached) → {toAdd, toRemove}.
Vom SW beim Update-Sync genutzt: neue Rezept-IDs nachladen,
gelöschte aus dem Cache räumen. 5 Tests decken add/remove/
beides/unchanged/empty-cache ab.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
14
src/lib/sw/diff-manifest.ts
Normal file
14
src/lib/sw/diff-manifest.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
// Vergleicht die aktuelle Rezept-ID-Liste (vom Server) mit dem, was
|
||||
// der Cache schon hat. Der SW nutzt das Delta, um nur Neue zu laden
|
||||
// und Gelöschte abzuräumen.
|
||||
export type ManifestDiff = { toAdd: number[]; toRemove: number[] };
|
||||
|
||||
export function diffManifest(currentIds: number[], cachedIds: number[]): ManifestDiff {
|
||||
const current = new Set(currentIds);
|
||||
const cached = new Set(cachedIds);
|
||||
const toAdd: number[] = [];
|
||||
const toRemove: number[] = [];
|
||||
for (const id of current) if (!cached.has(id)) toAdd.push(id);
|
||||
for (const id of cached) if (!current.has(id)) toRemove.push(id);
|
||||
return { toAdd, toRemove };
|
||||
}
|
||||
34
tests/unit/diff-manifest.test.ts
Normal file
34
tests/unit/diff-manifest.test.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { diffManifest } from '../../src/lib/sw/diff-manifest';
|
||||
|
||||
describe('diffManifest', () => {
|
||||
it('detects new IDs to add', () => {
|
||||
const result = diffManifest([1, 2, 3, 4], [1, 2]);
|
||||
expect(result.toAdd.sort()).toEqual([3, 4]);
|
||||
expect(result.toRemove).toEqual([]);
|
||||
});
|
||||
|
||||
it('detects removed IDs', () => {
|
||||
const result = diffManifest([1, 2], [1, 2, 3, 4]);
|
||||
expect(result.toAdd).toEqual([]);
|
||||
expect(result.toRemove.sort()).toEqual([3, 4]);
|
||||
});
|
||||
|
||||
it('detects both add and remove in one diff', () => {
|
||||
const result = diffManifest([1, 3, 5], [1, 2, 3]);
|
||||
expect(result.toAdd).toEqual([5]);
|
||||
expect(result.toRemove).toEqual([2]);
|
||||
});
|
||||
|
||||
it('returns empty arrays when identical', () => {
|
||||
const result = diffManifest([1, 2, 3], [3, 2, 1]);
|
||||
expect(result.toAdd).toEqual([]);
|
||||
expect(result.toRemove).toEqual([]);
|
||||
});
|
||||
|
||||
it('handles empty caches (first sync)', () => {
|
||||
const result = diffManifest([1, 2], []);
|
||||
expect(result.toAdd.sort()).toEqual([1, 2]);
|
||||
expect(result.toRemove).toEqual([]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user