From 6607ad910441f3f4261a66d99aa42b236a76ee5f Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 20 May 2026 20:47:04 +0200 Subject: [PATCH 1/5] test(frontend): add unit spec for extractErrorCode Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/lib/shared/api.server.spec.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 frontend/src/lib/shared/api.server.spec.ts diff --git a/frontend/src/lib/shared/api.server.spec.ts b/frontend/src/lib/shared/api.server.spec.ts new file mode 100644 index 00000000..d53a0675 --- /dev/null +++ b/frontend/src/lib/shared/api.server.spec.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from 'vitest'; +import { extractErrorCode } from './api.server'; + +describe('extractErrorCode', () => { + it('returns the code string when error has a code property', () => { + expect(extractErrorCode({ code: 'DOCUMENT_NOT_FOUND' })).toBe('DOCUMENT_NOT_FOUND'); + }); + it('returns undefined when error is undefined', () => { + expect(extractErrorCode(undefined)).toBeUndefined(); + }); + it('returns undefined when error is null', () => { + expect(extractErrorCode(null)).toBeUndefined(); + }); + it('returns undefined when error is a plain string', () => { + expect(extractErrorCode('oops')).toBeUndefined(); + }); + it('returns undefined when error object has no code property', () => { + expect(extractErrorCode({ message: 'fail' })).toBeUndefined(); + }); +}); -- 2.49.1 From fc9a02a6a00fb2c1b5070a7c931bfdacea1b64fd Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 20 May 2026 20:47:23 +0200 Subject: [PATCH 2/5] refactor(frontend): add ApiError interface and extractErrorCode helper Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/lib/shared/api.server.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/src/lib/shared/api.server.ts b/frontend/src/lib/shared/api.server.ts index 126834ba..b1aab396 100644 --- a/frontend/src/lib/shared/api.server.ts +++ b/frontend/src/lib/shared/api.server.ts @@ -23,3 +23,12 @@ export function createApiClient(fetch: typeof globalThis.fetch) { fetch }); } + +export interface ApiError { + code?: string; + message?: string; +} + +export function extractErrorCode(error: unknown): string | undefined { + return (error as ApiError | undefined)?.code; +} -- 2.49.1 From 4edd2461d1ef3d736584d407e7ea6086c1698f64 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 20 May 2026 20:54:32 +0200 Subject: [PATCH 3/5] refactor(frontend): replace all as-unknown-as error casts with extractErrorCode Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/routes/admin/+layout.server.ts | 14 +++---- .../routes/admin/groups/[id]/+page.server.ts | 12 +++--- .../routes/admin/groups/new/+page.server.ts | 7 ++-- .../src/routes/admin/invites/+page.server.ts | 18 ++++----- frontend/src/routes/admin/ocr/+page.server.ts | 5 +-- .../admin/ocr/[personId]/+page.server.ts | 5 +-- .../routes/admin/ocr/global/+page.server.ts | 5 +-- .../routes/admin/tags/[id]/+page.server.ts | 17 ++++---- .../routes/admin/users/[id]/+page.server.ts | 12 +++--- .../routes/admin/users/new/+page.server.ts | 7 ++-- .../src/routes/briefwechsel/+page.server.ts | 11 ++--- frontend/src/routes/documents/+page.server.ts | 5 +-- .../src/routes/documents/[id]/+page.server.ts | 5 +-- .../documents/[id]/edit/+page.server.ts | 10 ++--- .../src/routes/enrich/[id]/+page.server.ts | 5 +-- .../src/routes/geschichten/+page.server.ts | 5 +-- .../routes/geschichten/[id]/+page.server.ts | 5 +-- .../geschichten/[id]/edit/+page.server.ts | 5 +-- .../src/routes/persons/[id]/+page.server.ts | 8 ++-- .../routes/persons/[id]/edit/+page.server.ts | 40 +++++++++++-------- .../src/routes/persons/new/+page.server.ts | 5 +-- frontend/src/routes/profile/+page.server.ts | 12 +++--- frontend/src/routes/stammbaum/+page.server.ts | 5 +-- .../src/routes/users/[id]/+page.server.ts | 5 +-- 24 files changed, 116 insertions(+), 112 deletions(-) diff --git a/frontend/src/routes/admin/+layout.server.ts b/frontend/src/routes/admin/+layout.server.ts index b148bba2..56e0b7f7 100644 --- a/frontend/src/routes/admin/+layout.server.ts +++ b/frontend/src/routes/admin/+layout.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import { env } from '$env/dynamic/private'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { components } from '$lib/generated/api'; @@ -34,16 +34,16 @@ export async function load({ fetch, locals }) { ]); if (!usersResult.response.ok) { - const code = (usersResult.error as unknown as { code?: string })?.code; - throw error(usersResult.response.status, getErrorMessage(code)); + throw error(usersResult.response.status, getErrorMessage(extractErrorCode(usersResult.error))); } if (!groupsResult.response.ok) { - const code = (groupsResult.error as unknown as { code?: string })?.code; - throw error(groupsResult.response.status, getErrorMessage(code)); + throw error( + groupsResult.response.status, + getErrorMessage(extractErrorCode(groupsResult.error)) + ); } if (!tagsResult.response.ok) { - const code = (tagsResult.error as unknown as { code?: string })?.code; - throw error(tagsResult.response.status, getErrorMessage(code)); + throw error(tagsResult.response.status, getErrorMessage(extractErrorCode(tagsResult.error))); } let inviteCount = 0; diff --git a/frontend/src/routes/admin/groups/[id]/+page.server.ts b/frontend/src/routes/admin/groups/[id]/+page.server.ts index a4da8b4d..efc57f8a 100644 --- a/frontend/src/routes/admin/groups/[id]/+page.server.ts +++ b/frontend/src/routes/admin/groups/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; import type { PageServerLoad, Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ params, parent }) => { @@ -24,8 +24,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } return { success: true }; @@ -38,8 +39,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, '/admin/groups'); diff --git a/frontend/src/routes/admin/groups/new/+page.server.ts b/frontend/src/routes/admin/groups/new/+page.server.ts index c8006164..e9b3ac1a 100644 --- a/frontend/src/routes/admin/groups/new/+page.server.ts +++ b/frontend/src/routes/admin/groups/new/+page.server.ts @@ -1,6 +1,6 @@ import { fail, redirect } from '@sveltejs/kit'; import type { Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const actions: Actions = { @@ -16,8 +16,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, '/admin/groups'); diff --git a/frontend/src/routes/admin/invites/+page.server.ts b/frontend/src/routes/admin/invites/+page.server.ts index 9123de94..3cde71d3 100644 --- a/frontend/src/routes/admin/invites/+page.server.ts +++ b/frontend/src/routes/admin/invites/+page.server.ts @@ -1,5 +1,5 @@ import { fail } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { Actions, PageServerLoad } from './$types'; import type { components } from '$lib/generated/api'; @@ -25,8 +25,7 @@ export const load: PageServerLoad = async ({ url, fetch }) => { let invites: InviteListItem[] = []; let loadError: string | null = null; if (!invitesResult.response.ok) { - const code = (invitesResult.error as unknown as { code?: string })?.code; - loadError = code ?? 'INTERNAL_ERROR'; + loadError = extractErrorCode(invitesResult.error) ?? 'INTERNAL_ERROR'; } else { invites = (invitesResult.data ?? []) as InviteListItem[]; } @@ -34,8 +33,7 @@ export const load: PageServerLoad = async ({ url, fetch }) => { let groups: UserGroup[] = []; let groupsLoadError: string | null = null; if (!groupsResult.response.ok) { - const code = (groupsResult.error as unknown as { code?: string })?.code; - groupsLoadError = code ?? 'INTERNAL_ERROR'; + groupsLoadError = extractErrorCode(groupsResult.error) ?? 'INTERNAL_ERROR'; } else { const raw = groupsResult.data ?? []; groups = [...raw].sort((a, b) => a.name.localeCompare(b.name)); @@ -62,8 +60,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { createError: code ?? 'INTERNAL_ERROR' }); + return fail(result.response.status, { + createError: extractErrorCode(result.error) ?? 'INTERNAL_ERROR' + }); } return { created: result.data! as InviteListItem }; @@ -78,8 +77,9 @@ export const actions = { const result = await api.DELETE('/api/invites/{id}', { params: { path: { id } } }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { revokeError: code ?? 'INTERNAL_ERROR' }); + return fail(result.response.status, { + revokeError: extractErrorCode(result.error) ?? 'INTERNAL_ERROR' + }); } return { revoked: id }; diff --git a/frontend/src/routes/admin/ocr/+page.server.ts b/frontend/src/routes/admin/ocr/+page.server.ts index bb76e818..e6ae5b65 100644 --- a/frontend/src/routes/admin/ocr/+page.server.ts +++ b/frontend/src/routes/admin/ocr/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ fetch }) => { @@ -8,8 +8,7 @@ export const load: PageServerLoad = async ({ fetch }) => { const result = await api.GET('/api/ocr/training-info'); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { trainingInfo: result.data! }; diff --git a/frontend/src/routes/admin/ocr/[personId]/+page.server.ts b/frontend/src/routes/admin/ocr/[personId]/+page.server.ts index ec658a31..e8b03b65 100644 --- a/frontend/src/routes/admin/ocr/[personId]/+page.server.ts +++ b/frontend/src/routes/admin/ocr/[personId]/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ params, fetch }) => { @@ -10,8 +10,7 @@ export const load: PageServerLoad = async ({ params, fetch }) => { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { history: result.data!, personId: params.personId }; diff --git a/frontend/src/routes/admin/ocr/global/+page.server.ts b/frontend/src/routes/admin/ocr/global/+page.server.ts index a9f6d743..74b0449d 100644 --- a/frontend/src/routes/admin/ocr/global/+page.server.ts +++ b/frontend/src/routes/admin/ocr/global/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ fetch }) => { @@ -8,8 +8,7 @@ export const load: PageServerLoad = async ({ fetch }) => { const result = await api.GET('/api/ocr/training-info/global'); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { history: result.data! }; diff --git a/frontend/src/routes/admin/tags/[id]/+page.server.ts b/frontend/src/routes/admin/tags/[id]/+page.server.ts index c88b6b5e..24fc7059 100644 --- a/frontend/src/routes/admin/tags/[id]/+page.server.ts +++ b/frontend/src/routes/admin/tags/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; import type { PageServerLoad, Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ params, parent, url }) => { @@ -25,8 +25,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } return { success: true }; @@ -43,8 +44,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, `/admin/tags/${result.data!.id}?merged=1`); @@ -65,8 +67,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, '/admin/tags'); diff --git a/frontend/src/routes/admin/users/[id]/+page.server.ts b/frontend/src/routes/admin/users/[id]/+page.server.ts index 38f4e27f..67d59ab8 100644 --- a/frontend/src/routes/admin/users/[id]/+page.server.ts +++ b/frontend/src/routes/admin/users/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; import type { PageServerLoad, Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { components } from '$lib/generated/api'; @@ -55,8 +55,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } return { success: true }; @@ -69,8 +70,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, '/admin/users'); diff --git a/frontend/src/routes/admin/users/new/+page.server.ts b/frontend/src/routes/admin/users/new/+page.server.ts index 8eebe742..881455da 100644 --- a/frontend/src/routes/admin/users/new/+page.server.ts +++ b/frontend/src/routes/admin/users/new/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; import type { PageServerLoad, Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ fetch, locals }) => { @@ -35,8 +35,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { error: getErrorMessage(code) }); + return fail(result.response.status, { + error: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, '/admin/users'); diff --git a/frontend/src/routes/briefwechsel/+page.server.ts b/frontend/src/routes/briefwechsel/+page.server.ts index fd8f5ee4..675c15b2 100644 --- a/frontend/src/routes/briefwechsel/+page.server.ts +++ b/frontend/src/routes/briefwechsel/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import type { components } from '$lib/generated/api'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export async function load({ url, fetch, locals }) { @@ -39,8 +39,7 @@ export async function load({ url, fetch, locals }) { }) .then((result) => { if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } documents = result.data ?? []; }) @@ -49,8 +48,7 @@ export async function load({ url, fetch, locals }) { requests.push( api.GET('/api/persons/{id}', { params: { path: { id: senderId } } }).then((result) => { if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } const p = result.data as { displayName: string } | undefined; if (p) senderName = p.displayName; @@ -62,8 +60,7 @@ export async function load({ url, fetch, locals }) { requests.push( api.GET('/api/persons/{id}', { params: { path: { id: receiverId } } }).then((result) => { if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } const p = result.data as { displayName: string } | undefined; if (p) receiverName = p.displayName; diff --git a/frontend/src/routes/documents/+page.server.ts b/frontend/src/routes/documents/+page.server.ts index 1c9510e9..64f270e5 100644 --- a/frontend/src/routes/documents/+page.server.ts +++ b/frontend/src/routes/documents/+page.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { components } from '$lib/generated/api'; @@ -103,8 +103,7 @@ export async function load({ url, fetch }) { } const errorMessage: string | null = !result.response.ok - ? (getErrorMessage((result.error as unknown as { code?: string })?.code) ?? - 'Daten konnten nicht geladen werden.') + ? (getErrorMessage(extractErrorCode(result.error)) ?? 'Daten konnten nicht geladen werden.') : null; return { diff --git a/frontend/src/routes/documents/[id]/+page.server.ts b/frontend/src/routes/documents/[id]/+page.server.ts index 478d70ef..62cf5365 100644 --- a/frontend/src/routes/documents/[id]/+page.server.ts +++ b/frontend/src/routes/documents/[id]/+page.server.ts @@ -1,5 +1,5 @@ import { error, redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import { inferredRelationshipLabel } from '$lib/person/relationshipLabels'; @@ -17,8 +17,7 @@ export async function load({ params, fetch }) { if (docResult.response.status === 401) throw redirect(302, '/login'); if (!docResult.response.ok) { - const code = (docResult.error as unknown as { code?: string })?.code; - throw error(docResult.response.status, getErrorMessage(code)); + throw error(docResult.response.status, getErrorMessage(extractErrorCode(docResult.error))); } const document = docResult.data!; diff --git a/frontend/src/routes/documents/[id]/edit/+page.server.ts b/frontend/src/routes/documents/[id]/edit/+page.server.ts index 1dec1ead..4cd24a81 100644 --- a/frontend/src/routes/documents/[id]/edit/+page.server.ts +++ b/frontend/src/routes/documents/[id]/edit/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; import { env } from '$env/dynamic/private'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { parseBackendError, getErrorMessage } from '$lib/shared/errors'; export async function load({ @@ -30,8 +30,7 @@ export async function load({ ]); if (!docResult.response.ok) { - const code = (docResult.error as unknown as { code?: string })?.code; - throw error(docResult.response.status, getErrorMessage(code)); + throw error(docResult.response.status, getErrorMessage(extractErrorCode(docResult.error))); } if (!personsResult.response.ok) { throw error(personsResult.response.status, getErrorMessage('INTERNAL_ERROR')); @@ -76,8 +75,9 @@ export const actions = { // Fetch current document to preserve all existing fields const docResult = await api.GET('/api/documents/{id}', { params: { path: { id: params.id } } }); if (!docResult.response.ok) { - const code = (docResult.error as unknown as { code?: string })?.code; - return fail(docResult.response.status, { error: getErrorMessage(code) }); + return fail(docResult.response.status, { + error: getErrorMessage(extractErrorCode(docResult.error)) + }); } const doc = docResult.data!; diff --git a/frontend/src/routes/enrich/[id]/+page.server.ts b/frontend/src/routes/enrich/[id]/+page.server.ts index b9f2736d..52a9110f 100644 --- a/frontend/src/routes/enrich/[id]/+page.server.ts +++ b/frontend/src/routes/enrich/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, redirect } from '@sveltejs/kit'; import { env } from '$env/dynamic/private'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage, parseBackendError } from '$lib/shared/errors'; export async function load({ @@ -31,8 +31,7 @@ export async function load({ ]); if (!docResult.response.ok) { - const code = (docResult.error as unknown as { code?: string })?.code; - throw error(docResult.response.status, getErrorMessage(code)); + throw error(docResult.response.status, getErrorMessage(extractErrorCode(docResult.error))); } const incompleteCount = countResult.response.ok ? (countResult.data?.count ?? 0) : 0; diff --git a/frontend/src/routes/geschichten/+page.server.ts b/frontend/src/routes/geschichten/+page.server.ts index 3d8044a9..6d802e8e 100644 --- a/frontend/src/routes/geschichten/+page.server.ts +++ b/frontend/src/routes/geschichten/+page.server.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { components } from '$lib/generated/api'; import type { PageServerLoad } from './$types'; @@ -25,8 +25,7 @@ export const load: PageServerLoad = async ({ url, fetch }) => { ]); if (!listResult.response.ok) { - const code = (listResult.error as unknown as { code?: string })?.code; - throw error(listResult.response.status, getErrorMessage(code)); + throw error(listResult.response.status, getErrorMessage(extractErrorCode(listResult.error))); } const personFilters = personResults diff --git a/frontend/src/routes/geschichten/[id]/+page.server.ts b/frontend/src/routes/geschichten/[id]/+page.server.ts index 5d28c74e..2689e06d 100644 --- a/frontend/src/routes/geschichten/[id]/+page.server.ts +++ b/frontend/src/routes/geschichten/[id]/+page.server.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { PageServerLoad } from './$types'; @@ -9,8 +9,7 @@ export const load: PageServerLoad = async ({ params, fetch }) => { params: { path: { id: params.id } } }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { geschichte: result.data! }; }; diff --git a/frontend/src/routes/geschichten/[id]/edit/+page.server.ts b/frontend/src/routes/geschichten/[id]/edit/+page.server.ts index 53afd234..5544eb73 100644 --- a/frontend/src/routes/geschichten/[id]/edit/+page.server.ts +++ b/frontend/src/routes/geschichten/[id]/edit/+page.server.ts @@ -1,5 +1,5 @@ import { error, redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import type { PageServerLoad } from './$types'; @@ -13,8 +13,7 @@ export const load: PageServerLoad = async ({ params, fetch, parent }) => { params: { path: { id: params.id } } }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { geschichte: result.data! }; }; diff --git a/frontend/src/routes/persons/[id]/+page.server.ts b/frontend/src/routes/persons/[id]/+page.server.ts index 2abf9062..bdc81a34 100644 --- a/frontend/src/routes/persons/[id]/+page.server.ts +++ b/frontend/src/routes/persons/[id]/+page.server.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export async function load({ params, fetch, locals }) { @@ -32,8 +32,10 @@ export async function load({ params, fetch, locals }) { ]); if (!personResult.response.ok) { - const code = (personResult.error as unknown as { code?: string })?.code; - throw error(personResult.response.status, getErrorMessage(code)); + throw error( + personResult.response.status, + getErrorMessage(extractErrorCode(personResult.error)) + ); } return { diff --git a/frontend/src/routes/persons/[id]/edit/+page.server.ts b/frontend/src/routes/persons/[id]/edit/+page.server.ts index d42e2c1a..a48d68ec 100644 --- a/frontend/src/routes/persons/[id]/edit/+page.server.ts +++ b/frontend/src/routes/persons/[id]/edit/+page.server.ts @@ -1,5 +1,5 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import { normalizePersonType, @@ -25,8 +25,7 @@ export async function load({ params, fetch, locals }) { ]); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } const person = result.data!; @@ -74,8 +73,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { updateError: getErrorMessage(code) }); + return fail(result.response.status, { + updateError: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, `/persons/${params.id}`); @@ -100,8 +100,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { mergeError: getErrorMessage(code) }); + return fail(result.response.status, { + mergeError: getErrorMessage(extractErrorCode(result.error)) + }); } throw redirect(303, `/persons/${targetPersonId}`); @@ -127,8 +128,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { aliasError: getErrorMessage(code) }); + return fail(result.response.status, { + aliasError: getErrorMessage(extractErrorCode(result.error)) + }); } return { aliasSuccess: true }; @@ -148,8 +150,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { aliasError: getErrorMessage(code) }); + return fail(result.response.status, { + aliasError: getErrorMessage(extractErrorCode(result.error)) + }); } return { aliasSuccess: true }; @@ -166,8 +169,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { relationshipError: getErrorMessage(code) }); + return fail(result.response.status, { + relationshipError: getErrorMessage(extractErrorCode(result.error)) + }); } return { relationshipSuccess: true }; }, @@ -211,8 +215,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { relationshipError: getErrorMessage(code) }); + return fail(result.response.status, { + relationshipError: getErrorMessage(extractErrorCode(result.error)) + }); } return { relationshipSuccess: true }; }, @@ -230,8 +235,9 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { relationshipError: getErrorMessage(code) }); + return fail(result.response.status, { + relationshipError: getErrorMessage(extractErrorCode(result.error)) + }); } return { relationshipSuccess: true }; } diff --git a/frontend/src/routes/persons/new/+page.server.ts b/frontend/src/routes/persons/new/+page.server.ts index 8dff7899..3231627e 100644 --- a/frontend/src/routes/persons/new/+page.server.ts +++ b/frontend/src/routes/persons/new/+page.server.ts @@ -1,5 +1,5 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; import { normalizePersonType, @@ -57,9 +57,8 @@ export const actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; return fail(result.response.status, { - error: getErrorMessage(code), + error: getErrorMessage(extractErrorCode(result.error)), personType, title, firstName, diff --git a/frontend/src/routes/profile/+page.server.ts b/frontend/src/routes/profile/+page.server.ts index ec40ca45..554749ab 100644 --- a/frontend/src/routes/profile/+page.server.ts +++ b/frontend/src/routes/profile/+page.server.ts @@ -1,7 +1,7 @@ import { fail } from '@sveltejs/kit'; import { env } from '$env/dynamic/private'; import type { PageServerLoad, Actions } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; const apiBase = () => env.API_INTERNAL_URL || 'http://localhost:8080'; @@ -27,8 +27,9 @@ export const actions: Actions = { const result = await api.PUT('/api/users/me', { body }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { updateError: getErrorMessage(code) }); + return fail(result.response.status, { + updateError: getErrorMessage(extractErrorCode(result.error)) + }); } return { updateSuccess: true }; @@ -50,8 +51,9 @@ export const actions: Actions = { }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - return fail(result.response.status, { passwordError: getErrorMessage(code) }); + return fail(result.response.status, { + passwordError: getErrorMessage(extractErrorCode(result.error)) + }); } return { passwordSuccess: true }; diff --git a/frontend/src/routes/stammbaum/+page.server.ts b/frontend/src/routes/stammbaum/+page.server.ts index d0c8fc45..f060df29 100644 --- a/frontend/src/routes/stammbaum/+page.server.ts +++ b/frontend/src/routes/stammbaum/+page.server.ts @@ -1,5 +1,5 @@ import { error, redirect } from '@sveltejs/kit'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export async function load({ fetch }) { @@ -9,8 +9,7 @@ export async function load({ fetch }) { if (result.response.status === 401) throw redirect(302, '/login'); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } const network = result.data!; diff --git a/frontend/src/routes/users/[id]/+page.server.ts b/frontend/src/routes/users/[id]/+page.server.ts index 521dbbdd..349e9cc1 100644 --- a/frontend/src/routes/users/[id]/+page.server.ts +++ b/frontend/src/routes/users/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -import { createApiClient } from '$lib/shared/api.server'; +import { createApiClient, extractErrorCode } from '$lib/shared/api.server'; import { getErrorMessage } from '$lib/shared/errors'; export const load: PageServerLoad = async ({ params, fetch }) => { @@ -8,8 +8,7 @@ export const load: PageServerLoad = async ({ params, fetch }) => { const result = await api.GET('/api/users/{id}', { params: { path: { id: params.id } } }); if (!result.response.ok) { - const code = (result.error as unknown as { code?: string })?.code; - throw error(result.response.status, getErrorMessage(code)); + throw error(result.response.status, getErrorMessage(extractErrorCode(result.error))); } return { profileUser: result.data! }; -- 2.49.1 From eb69135f2c3802977cf557b5d67e7514bce19d58 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 20 May 2026 23:03:35 +0200 Subject: [PATCH 4/5] refactor(frontend): drop unused message field from ApiError interface Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/lib/shared/api.server.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/lib/shared/api.server.ts b/frontend/src/lib/shared/api.server.ts index b1aab396..97b0fbf7 100644 --- a/frontend/src/lib/shared/api.server.ts +++ b/frontend/src/lib/shared/api.server.ts @@ -26,7 +26,6 @@ export function createApiClient(fetch: typeof globalThis.fetch) { export interface ApiError { code?: string; - message?: string; } export function extractErrorCode(error: unknown): string | undefined { -- 2.49.1 From f4cc4d6c20e1f3693c9eecacca80f912cebb0a89 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 21 May 2026 09:17:54 +0200 Subject: [PATCH 5/5] fix(frontend): add extractErrorCode to all api.server vi.mock factories All route spec files that mock $lib/shared/api.server were missing extractErrorCode from the mock factory, causing a vitest "No export defined" error after the refactor introduced the new export. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/routes/admin/groups/[id]/page.server.spec.ts | 3 ++- frontend/src/routes/admin/groups/layout.server.spec.ts | 5 ++++- frontend/src/routes/admin/layout.server.spec.ts | 5 ++++- frontend/src/routes/admin/ocr/[personId]/page.server.spec.ts | 5 ++++- frontend/src/routes/admin/ocr/global/page.server.spec.ts | 5 ++++- frontend/src/routes/admin/ocr/page.server.spec.ts | 5 ++++- frontend/src/routes/admin/tags/[id]/page.server.spec.ts | 3 ++- frontend/src/routes/admin/tags/layout.server.spec.ts | 5 ++++- frontend/src/routes/admin/users/[id]/page.server.spec.ts | 5 ++++- frontend/src/routes/admin/users/layout.server.spec.ts | 5 ++++- frontend/src/routes/aktivitaeten/page.server.spec.ts | 3 ++- frontend/src/routes/briefwechsel/page.server.spec.ts | 5 ++++- frontend/src/routes/documents/[id]/page.server.spec.ts | 5 ++++- frontend/src/routes/documents/page.server.spec.ts | 5 ++++- frontend/src/routes/page.server.spec.ts | 5 ++++- frontend/src/routes/persons/[id]/page.server.spec.ts | 5 ++++- 16 files changed, 58 insertions(+), 16 deletions(-) diff --git a/frontend/src/routes/admin/groups/[id]/page.server.spec.ts b/frontend/src/routes/admin/groups/[id]/page.server.spec.ts index 1407e102..53b3e419 100644 --- a/frontend/src/routes/admin/groups/[id]/page.server.spec.ts +++ b/frontend/src/routes/admin/groups/[id]/page.server.spec.ts @@ -7,7 +7,8 @@ const mockApi = { }; vi.mock('$lib/shared/api.server', () => ({ - createApiClient: () => mockApi + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code })); beforeEach(() => vi.clearAllMocks()); diff --git a/frontend/src/routes/admin/groups/layout.server.spec.ts b/frontend/src/routes/admin/groups/layout.server.spec.ts index 08cff99c..c23bddc1 100644 --- a/frontend/src/routes/admin/groups/layout.server.spec.ts +++ b/frontend/src/routes/admin/groups/layout.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+layout.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/admin/layout.server.spec.ts b/frontend/src/routes/admin/layout.server.spec.ts index 0fb89809..034f077f 100644 --- a/frontend/src/routes/admin/layout.server.spec.ts +++ b/frontend/src/routes/admin/layout.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+layout.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/admin/ocr/[personId]/page.server.spec.ts b/frontend/src/routes/admin/ocr/[personId]/page.server.spec.ts index 4d2f6ef7..fe300b5e 100644 --- a/frontend/src/routes/admin/ocr/[personId]/page.server.spec.ts +++ b/frontend/src/routes/admin/ocr/[personId]/page.server.spec.ts @@ -3,7 +3,10 @@ import { load } from './+page.server'; const mockApi = { GET: vi.fn() }; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: () => mockApi })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); beforeEach(() => vi.clearAllMocks()); diff --git a/frontend/src/routes/admin/ocr/global/page.server.spec.ts b/frontend/src/routes/admin/ocr/global/page.server.spec.ts index b96438de..eab91036 100644 --- a/frontend/src/routes/admin/ocr/global/page.server.spec.ts +++ b/frontend/src/routes/admin/ocr/global/page.server.spec.ts @@ -3,7 +3,10 @@ import { load } from './+page.server'; const mockApi = { GET: vi.fn() }; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: () => mockApi })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); beforeEach(() => vi.clearAllMocks()); diff --git a/frontend/src/routes/admin/ocr/page.server.spec.ts b/frontend/src/routes/admin/ocr/page.server.spec.ts index a7c4f019..a2df41d0 100644 --- a/frontend/src/routes/admin/ocr/page.server.spec.ts +++ b/frontend/src/routes/admin/ocr/page.server.spec.ts @@ -3,7 +3,10 @@ import { load } from './+page.server'; const mockApi = { GET: vi.fn() }; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: () => mockApi })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); beforeEach(() => vi.clearAllMocks()); diff --git a/frontend/src/routes/admin/tags/[id]/page.server.spec.ts b/frontend/src/routes/admin/tags/[id]/page.server.spec.ts index c8b724c0..ce7b5e7d 100644 --- a/frontend/src/routes/admin/tags/[id]/page.server.spec.ts +++ b/frontend/src/routes/admin/tags/[id]/page.server.spec.ts @@ -8,7 +8,8 @@ const mockApi = { }; vi.mock('$lib/shared/api.server', () => ({ - createApiClient: () => mockApi + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code })); beforeEach(() => vi.clearAllMocks()); diff --git a/frontend/src/routes/admin/tags/layout.server.spec.ts b/frontend/src/routes/admin/tags/layout.server.spec.ts index d50440f5..9dd91504 100644 --- a/frontend/src/routes/admin/tags/layout.server.spec.ts +++ b/frontend/src/routes/admin/tags/layout.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+layout.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/admin/users/[id]/page.server.spec.ts b/frontend/src/routes/admin/users/[id]/page.server.spec.ts index da2f3921..1199a880 100644 --- a/frontend/src/routes/admin/users/[id]/page.server.spec.ts +++ b/frontend/src/routes/admin/users/[id]/page.server.spec.ts @@ -4,7 +4,10 @@ vi.mock('$env/dynamic/private', () => ({ env: { API_INTERNAL_URL: 'http://localhost:8080' } })); -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { load, actions } from './+page.server'; import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/admin/users/layout.server.spec.ts b/frontend/src/routes/admin/users/layout.server.spec.ts index bd4ab7ff..6bc0144a 100644 --- a/frontend/src/routes/admin/users/layout.server.spec.ts +++ b/frontend/src/routes/admin/users/layout.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+layout.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/aktivitaeten/page.server.spec.ts b/frontend/src/routes/aktivitaeten/page.server.spec.ts index 31a1619f..f2521954 100644 --- a/frontend/src/routes/aktivitaeten/page.server.spec.ts +++ b/frontend/src/routes/aktivitaeten/page.server.spec.ts @@ -6,7 +6,8 @@ const mockApi = { }; vi.mock('$lib/shared/api.server', () => ({ - createApiClient: () => mockApi + createApiClient: () => mockApi, + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code })); function buildUrl(search = ''): URL { diff --git a/frontend/src/routes/briefwechsel/page.server.spec.ts b/frontend/src/routes/briefwechsel/page.server.spec.ts index 1c8232ef..5329e896 100644 --- a/frontend/src/routes/briefwechsel/page.server.spec.ts +++ b/frontend/src/routes/briefwechsel/page.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+page.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); vi.mock('$lib/shared/errors', () => ({ getErrorMessage: (code: string) => code ?? 'Unknown error' })); diff --git a/frontend/src/routes/documents/[id]/page.server.spec.ts b/frontend/src/routes/documents/[id]/page.server.spec.ts index f2735a9e..777a77db 100644 --- a/frontend/src/routes/documents/[id]/page.server.spec.ts +++ b/frontend/src/routes/documents/[id]/page.server.spec.ts @@ -1,6 +1,9 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); vi.mock('$env/dynamic/private', () => ({ env: { API_INTERNAL_URL: 'http://test-backend:8080' } })); import { load } from './+page.server'; diff --git a/frontend/src/routes/documents/page.server.spec.ts b/frontend/src/routes/documents/page.server.spec.ts index ac71972f..2ed33a86 100644 --- a/frontend/src/routes/documents/page.server.spec.ts +++ b/frontend/src/routes/documents/page.server.spec.ts @@ -1,6 +1,9 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { load } from './+page.server'; import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/page.server.spec.ts b/frontend/src/routes/page.server.spec.ts index 9ffae2b9..b87ce9a8 100644 --- a/frontend/src/routes/page.server.spec.ts +++ b/frontend/src/routes/page.server.spec.ts @@ -1,6 +1,9 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { load } from './+page.server'; import { createApiClient } from '$lib/shared/api.server'; diff --git a/frontend/src/routes/persons/[id]/page.server.spec.ts b/frontend/src/routes/persons/[id]/page.server.spec.ts index c2fc6dea..a855716d 100644 --- a/frontend/src/routes/persons/[id]/page.server.spec.ts +++ b/frontend/src/routes/persons/[id]/page.server.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { load } from './+page.server'; -vi.mock('$lib/shared/api.server', () => ({ createApiClient: vi.fn() })); +vi.mock('$lib/shared/api.server', () => ({ + createApiClient: vi.fn(), + extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code +})); import { createApiClient } from '$lib/shared/api.server'; -- 2.49.1