From 515de79c8b8da666518a6e7a6c8ea1de02b3b961 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 27 Apr 2026 00:58:01 +0200 Subject: [PATCH] refactor(stores): replace Record declarations with Partial MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Final follow-up to drop the type-bypass patterns from F3's codemod. Mit \`Partial\` als Deklaration akzeptiert Dexie's UpdateSpec ohne weiteren Cast — die kombinierte \`as Record\` + \`as never\` Konstruktion wird durch eine einzige saubere Typ-Annotation ersetzt. Touched stores (12 Files): wardrobe/stores/{garments,outfits}, invoices/stores/invoices, sleep/stores/sleep, library/stores/entries, comic/stores/{characters,stories}, profile/stores/me-images, recipes/stores/recipes, broadcast/stores/campaigns, writing/stores/{styles,drafts} Plus inline literal-object patterns (\`{ lines, totals } as Record\`, \`{ content } as Record\`, \`{ audience } as Record\`, \`{ ...spread } as Record\` im comic appendPanel). Verbleibende \`as Record\` Vorkommen sind legitime Reads von typed-data und nicht das F3-Pattern. 7670 svelte-check Files, 0 Errors, 0 Warnings. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../broadcast/stores/campaigns.svelte.ts | 6 +-- .../modules/comic/stores/stories.svelte.ts | 2 +- .../invoices/stores/invoices.svelte.ts | 4 +- .../modules/library/stores/entries.svelte.ts | 2 +- .../profile/stores/me-images.svelte.ts | 2 +- .../modules/recipes/stores/recipes.svelte.ts | 2 +- .../web/src/lib/modules/uload/ListView.svelte | 22 ++++++---- .../lib/modules/uload/views/DetailView.svelte | 41 +++++++++++-------- .../wardrobe/stores/garments.svelte.ts | 2 +- .../modules/wardrobe/stores/outfits.svelte.ts | 2 +- .../modules/writing/stores/drafts.svelte.ts | 2 +- .../modules/writing/stores/styles.svelte.ts | 2 +- 12 files changed, 52 insertions(+), 37 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/broadcast/stores/campaigns.svelte.ts b/apps/mana/apps/web/src/lib/modules/broadcast/stores/campaigns.svelte.ts index 5e204e557..c7cc6b7eb 100644 --- a/apps/mana/apps/web/src/lib/modules/broadcast/stores/campaigns.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/broadcast/stores/campaigns.svelte.ts @@ -96,7 +96,7 @@ export const broadcastCampaignsStore = { if (existing.status !== 'draft') { throw new Error('[broadcast] only drafts can be edited; duplicate to revise a sent campaign'); } - const wrapped = { ...patch } as Record; + const wrapped: Partial = { ...patch }; await encryptRecord('broadcastCampaigns', wrapped); await campaignTable.update(id, wrapped); }, @@ -113,7 +113,7 @@ export const broadcastCampaignsStore = { if (existing.status !== 'draft') { throw new Error('[broadcast] only drafts can be edited'); } - const patch = { content } as Record; + const patch: Partial = { content }; await encryptRecord('broadcastCampaigns', patch); await campaignTable.update(id, patch); }, @@ -124,7 +124,7 @@ export const broadcastCampaignsStore = { if (existing.status !== 'draft') { throw new Error('[broadcast] only drafts can be edited'); } - const patch = { audience } as Record; + const patch: Partial = { audience }; await encryptRecord('broadcastCampaigns', patch); await campaignTable.update(id, patch); }, diff --git a/apps/mana/apps/web/src/lib/modules/comic/stores/stories.svelte.ts b/apps/mana/apps/web/src/lib/modules/comic/stores/stories.svelte.ts index a5cdee164..14abe6bbe 100644 --- a/apps/mana/apps/web/src/lib/modules/comic/stores/stories.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/comic/stores/stories.svelte.ts @@ -161,7 +161,7 @@ export const comicStoriesStore = { const patch = { panelImageIds: nextIds, panelMeta: nextMeta, - } as Record; + } as Partial; await encryptRecord('comicStories', patch); await comicStoriesTable.update(storyId, patch); emitDomainEvent('ComicPanelAppended', 'comic', 'comicStories', storyId, { diff --git a/apps/mana/apps/web/src/lib/modules/invoices/stores/invoices.svelte.ts b/apps/mana/apps/web/src/lib/modules/invoices/stores/invoices.svelte.ts index 84de1f7f3..bc80cc98c 100644 --- a/apps/mana/apps/web/src/lib/modules/invoices/stores/invoices.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/invoices/stores/invoices.svelte.ts @@ -135,7 +135,7 @@ export const invoicesStore = { '[invoices] only drafts can be edited; void and duplicate to revise a sent invoice' ); } - const wrapped = { ...patch } as Record; + const wrapped: Partial = { ...patch }; await encryptRecord('invoices', wrapped); await invoiceTable.update(id, wrapped); }, @@ -152,7 +152,7 @@ export const invoicesStore = { throw new Error('[invoices] only drafts can be edited'); } const totals = computeInvoiceTotals(lines); - const patch = { lines, totals } as Record; + const patch: Partial = { lines, totals }; // `lines` is in the encryption allowlist; `totals` is not. encryptRecord // only touches allowlisted keys, so a single call is correct for both. await encryptRecord('invoices', patch); diff --git a/apps/mana/apps/web/src/lib/modules/library/stores/entries.svelte.ts b/apps/mana/apps/web/src/lib/modules/library/stores/entries.svelte.ts index e3fdd2642..6bd4459d7 100644 --- a/apps/mana/apps/web/src/lib/modules/library/stores/entries.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/library/stores/entries.svelte.ts @@ -130,7 +130,7 @@ export const libraryEntriesStore = { > > ) { - const wrapped = { ...patch } as Record; + const wrapped: Partial = { ...patch }; await encryptRecord('libraryEntries', wrapped); await libraryEntryTable.update(id, wrapped); // Keep the share-link snapshot in sync if this entry is unlisted. diff --git a/apps/mana/apps/web/src/lib/modules/profile/stores/me-images.svelte.ts b/apps/mana/apps/web/src/lib/modules/profile/stores/me-images.svelte.ts index d52c816e4..3cf530764 100644 --- a/apps/mana/apps/web/src/lib/modules/profile/stores/me-images.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/profile/stores/me-images.svelte.ts @@ -165,7 +165,7 @@ export const meImagesStore = { id: string, patch: Partial> ): Promise { - const wrapped = { ...patch } as Record; + const wrapped: Partial = { ...patch }; await encryptRecord('meImages', wrapped); await meImagesTable.update(id, wrapped); }, diff --git a/apps/mana/apps/web/src/lib/modules/recipes/stores/recipes.svelte.ts b/apps/mana/apps/web/src/lib/modules/recipes/stores/recipes.svelte.ts index 780f22269..d33ae68cd 100644 --- a/apps/mana/apps/web/src/lib/modules/recipes/stores/recipes.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/recipes/stores/recipes.svelte.ts @@ -76,7 +76,7 @@ export const recipesStore = { > > ) { - const wrapped = { ...patch } as Record; + const wrapped: Partial = { ...patch }; await encryptRecord('recipes', wrapped); await recipeTable.update(id, wrapped); }, diff --git a/apps/mana/apps/web/src/lib/modules/uload/ListView.svelte b/apps/mana/apps/web/src/lib/modules/uload/ListView.svelte index 8edf7bc9e..bdcfd900d 100644 --- a/apps/mana/apps/web/src/lib/modules/uload/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/uload/ListView.svelte @@ -3,6 +3,7 @@ Short links list with click counts and quick link creation. --> - l.id} emptyTitle="Keine Links"> + l.id} emptyTitle={$_('uload.list_view.empty_title')}> {#snippet header()} - {links.length} Links - {totalClicks} Klicks - {folders.length} Ordner + {$_('uload.list_view.header_links', { values: { count: links.length } })} + {$_('uload.list_view.header_clicks', { values: { count: totalClicks } })} + {$_('uload.list_view.header_folders', { values: { count: folders.length } })} {/snippet} {#snippet listHeader()} @@ -113,7 +114,12 @@ > - + @@ -124,7 +130,7 @@ {:else} {/if} {/snippet} diff --git a/apps/mana/apps/web/src/lib/modules/uload/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/uload/views/DetailView.svelte index 962036328..373208dde 100644 --- a/apps/mana/apps/web/src/lib/modules/uload/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/uload/views/DetailView.svelte @@ -3,6 +3,7 @@ All fields are always editable. Changes auto-save on blur. -->