diff --git a/apps/chat/apps/backend/docker-entrypoint.sh b/apps/chat/apps/backend/docker-entrypoint.sh index 7daab15ef..6ab516601 100644 --- a/apps/chat/apps/backend/docker-entrypoint.sh +++ b/apps/chat/apps/backend/docker-entrypoint.sh @@ -11,7 +11,7 @@ until pg_isready -h ${DB_HOST:-postgres} -p ${DB_PORT:-5432} -U ${DB_USER:-chat} done echo "PostgreSQL is up!" -cd /app/chat/backend +cd /app/apps/chat/apps/backend # Run schema push (for development) or migrations (for production) if [ "$NODE_ENV" = "production" ] && [ -d "src/db/migrations/meta" ]; then diff --git a/apps/chat/apps/web/src/routes/(protected)/archive/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/archive/+page.svelte index a46146872..f1015b53a 100644 --- a/apps/chat/apps/web/src/routes/(protected)/archive/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/archive/+page.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { authStore } from '$lib/stores/auth.svelte'; import { conversationsStore } from '$lib/stores/conversations.svelte'; + import { PageHeader } from '@manacore/shared-ui'; import type { Conversation } from '@chat/types'; let conversations = $state([]); @@ -55,13 +56,7 @@
- -
-

Archiv

-

- Deine archivierten Konversationen. -

-
+ {#if isLoading} diff --git a/apps/chat/apps/web/src/routes/(protected)/documents/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/documents/+page.svelte index 4d677b778..6f8a7fc50 100644 --- a/apps/chat/apps/web/src/routes/(protected)/documents/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/documents/+page.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { authStore } from '$lib/stores/auth.svelte'; import { documentService } from '$lib/services/document'; + import { PageHeader } from '@manacore/shared-ui'; import type { DocumentWithConversation } from '@chat/types'; let documents = $state([]); @@ -79,30 +80,29 @@
- -
-
-

Dokumente

-

- Alle Dokumente aus deinen Konversationen im Dokumentmodus. -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if isLoading} diff --git a/apps/chat/apps/web/src/routes/(protected)/spaces/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/spaces/+page.svelte index 6d2bf5b50..77c8de63f 100644 --- a/apps/chat/apps/web/src/routes/(protected)/spaces/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/spaces/+page.svelte @@ -4,6 +4,7 @@ import { authStore } from '$lib/stores/auth.svelte'; import { spacesStore } from '$lib/stores/spaces.svelte'; import { conversationsStore } from '$lib/stores/conversations.svelte'; + import { PageHeader } from '@manacore/shared-ui'; import SpaceCard from '$lib/components/spaces/SpaceCard.svelte'; import SpaceForm from '$lib/components/spaces/SpaceForm.svelte'; import type { Space } from '@chat/types'; @@ -88,30 +89,29 @@
- -
-
-

Spaces

-

- Organisiere deine Konversationen in kollaborativen Arbeitsbereichen. -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if spacesStore.isLoading} diff --git a/apps/chat/apps/web/src/routes/(protected)/spaces/[id]/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/spaces/[id]/+page.svelte index eb0d346da..4ecc7c487 100644 --- a/apps/chat/apps/web/src/routes/(protected)/spaces/[id]/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/spaces/[id]/+page.svelte @@ -7,6 +7,7 @@ import { spaceService } from '$lib/services/space'; import { conversationService } from '$lib/services/conversation'; import { chatService } from '$lib/services/chat'; + import { PageHeader } from '@manacore/shared-ui'; import type { Space, Conversation, AIModel } from '@chat/types'; const spaceId = $derived($page.params.id ?? ''); @@ -97,29 +98,12 @@ {:else if space}
- -
-
- - - - - -

{space.name}

-
- {#if space.description} -

{space.description}

- {/if} -
+
- -
-
-

Vorlagen

-

- Erstelle Vorlagen mit benutzerdefinierten System-Prompts für verschiedene - KI-Verhaltensweisen. -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if templatesStore.isLoading} diff --git a/apps/manacore/apps/web/package.json b/apps/manacore/apps/web/package.json index 5595c4759..8110e5434 100644 --- a/apps/manacore/apps/web/package.json +++ b/apps/manacore/apps/web/package.json @@ -41,9 +41,12 @@ "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-feedback-service": "workspace:*", + "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-config": "workspace:*", "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", + "@manacore/shared-profile-ui": "workspace:*", "@manacore/shared-subscription-types": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-supabase": "workspace:*", diff --git a/apps/manacore/apps/web/src/hooks.server.ts b/apps/manacore/apps/web/src/hooks.server.ts index e50ef21cc..1ae4f5d6a 100644 --- a/apps/manacore/apps/web/src/hooks.server.ts +++ b/apps/manacore/apps/web/src/hooks.server.ts @@ -1,12 +1,15 @@ import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; import { createServerClient } from '@supabase/ssr'; -import { type Handle, redirect } from '@sveltejs/kit'; -import { sequence } from '@sveltejs/kit/hooks'; +import type { Handle } from '@sveltejs/kit'; -const supabase: Handle = async ({ event, resolve }) => { - /** - * Creates a Supabase client specific to this server request. - */ +/** + * Server hooks for ManaCore web app + * + * Note: Authentication is handled client-side via Mana Core Auth. + * Supabase is only used for database operations (not auth). + */ +export const handle: Handle = async ({ event, resolve }) => { + // Create Supabase client for database operations only event.locals.supabase = createServerClient(PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY, { cookies: { getAll: () => event.cookies.getAll(), @@ -18,70 +21,9 @@ const supabase: Handle = async ({ event, resolve }) => { }, }) as any; - /** - * Unlike `supabase.auth.getSession()`, which returns the session _without_ - * validating the JWT, this function also calls `getUser()` to validate the - * JWT before returning the session. - */ - event.locals.safeGetSession = async () => { - const { - data: { session }, - } = await event.locals.supabase.auth.getSession(); - - if (!session) { - return { session: null, user: null }; - } - - const { - data: { user }, - error, - } = await event.locals.supabase.auth.getUser(); - - if (error) { - // JWT validation has failed - return { session: null, user: null }; - } - - return { session, user }; - }; - return resolve(event, { filterSerializedResponseHeaders(name) { return name === 'content-range' || name === 'x-supabase-api-version'; }, }); }; - -const authGuard: Handle = async ({ event, resolve }) => { - const { session, user } = await event.locals.safeGetSession(); - event.locals.session = session; - event.locals.user = user; - - // Log user data - if (user) { - console.log('=== AUTH GUARD ==='); - console.log('Path:', event.url.pathname); - console.log('User ID:', user.id); - console.log('User Email:', user.email); - console.log('User metadata:', JSON.stringify(user.user_metadata, null, 2)); - console.log('Session expires at:', session?.expires_at); - console.log('==================\n'); - } - - // Protect (app) routes - redirect to login if not authenticated - if (!event.locals.session && event.url.pathname.startsWith('/(app)')) { - redirect(303, '/login'); - } - - // Redirect to dashboard if already logged in and trying to access auth pages - if ( - event.locals.session && - (event.url.pathname === '/login' || event.url.pathname === '/register') - ) { - redirect(303, '/dashboard'); - } - - return resolve(event); -}; - -export const handle: Handle = sequence(supabase, authGuard); diff --git a/apps/manacore/apps/web/src/lib/api/feedback.ts b/apps/manacore/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..877bd1796 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,14 @@ +/** + * Feedback Service Instance for ManaCore Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { authStore } from '$lib/stores/authStore.svelte'; + +const MANA_AUTH_URL = 'http://localhost:3001'; // TODO: Use PUBLIC_MANA_CORE_AUTH_URL from env + +export const feedbackService = createFeedbackService({ + apiUrl: MANA_AUTH_URL, + appId: 'manacore', + getAuthToken: async () => authStore.getAccessToken(), +}); diff --git a/apps/manacore/apps/web/src/lib/stores/authStore.svelte.ts b/apps/manacore/apps/web/src/lib/stores/authStore.svelte.ts index 589ce58d1..0c7049815 100644 --- a/apps/manacore/apps/web/src/lib/stores/authStore.svelte.ts +++ b/apps/manacore/apps/web/src/lib/stores/authStore.svelte.ts @@ -1,82 +1,186 @@ -import { createBrowserClient } from '@supabase/ssr'; -import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; +/** + * Auth Store - Manages authentication state using Svelte 5 runes + * Uses Mana Core Auth + */ -// Create browser Supabase client -function getSupabaseClient() { - return createBrowserClient(PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY); +import { browser } from '$app/environment'; +import { initializeWebAuth, type UserData } from '@manacore/shared-auth'; + +// Initialize Mana Core Auth only on the client side +// TODO: Use PUBLIC_MANA_CORE_AUTH_URL from env when available +const MANA_AUTH_URL = 'http://localhost:3001'; + +// Lazy initialization to avoid SSR issues with localStorage +let _authService: ReturnType['authService'] | null = null; +let _tokenManager: ReturnType['tokenManager'] | null = null; + +function getAuthService() { + if (!browser) return null; + if (!_authService) { + const auth = initializeWebAuth({ baseUrl: MANA_AUTH_URL }); + _authService = auth.authService; + _tokenManager = auth.tokenManager; + } + return _authService; } +// State +let user = $state(null); +let loading = $state(true); +let initialized = $state(false); + export const authStore = { + // Getters + get user() { + return user; + }, + get loading() { + return loading; + }, + get isAuthenticated() { + return !!user; + }, + get initialized() { + return initialized; + }, + + /** + * Initialize auth state from stored tokens + */ + async initialize() { + if (initialized) return; + + const authService = getAuthService(); + if (!authService) { + initialized = true; + loading = false; + return; + } + + loading = true; + try { + const authenticated = await authService.isAuthenticated(); + if (authenticated) { + const userData = await authService.getUserFromToken(); + user = userData; + } + initialized = true; + } catch (error) { + console.error('Failed to initialize auth:', error); + user = null; + } finally { + loading = false; + } + }, + /** * Sign in with email and password */ async signIn(email: string, password: string) { - const supabase = getSupabaseClient(); - const { error } = await supabase.auth.signInWithPassword({ - email, - password, - }); - - if (error) { - return { - success: false, - error: error.message, - }; + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server' }; } - return { success: true }; + try { + const result = await authService.signIn(email, password); + + if (!result.success) { + return { success: false, error: result.error || 'Login failed' }; + } + + // Get user data from token + const userData = await authService.getUserFromToken(); + user = userData; + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage }; + } }, /** * Sign up with email and password */ async signUp(email: string, password: string) { - const supabase = getSupabaseClient(); - const { data, error } = await supabase.auth.signUp({ - email, - password, - }); - - if (error) { - return { - success: false, - error: error.message, - }; + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server', needsVerification: false }; } - // Check if email confirmation is required - const needsVerification = !data.session; + try { + const result = await authService.signUp(email, password); - return { - success: true, - needsVerification, - }; - }, + if (!result.success) { + return { success: false, error: result.error || 'Signup failed', needsVerification: false }; + } - /** - * Send password reset email - */ - async forgotPassword(email: string) { - const supabase = getSupabaseClient(); - const { error } = await supabase.auth.resetPasswordForEmail(email, { - redirectTo: `${window.location.origin}/reset-password`, - }); + // Mana Core Auth requires separate login after signup + if (result.needsVerification) { + return { success: true, needsVerification: true }; + } - if (error) { - return { - success: false, - error: error.message, - }; + // Auto sign in after successful signup + const signInResult = await this.signIn(email, password); + return { ...signInResult, needsVerification: false }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage, needsVerification: false }; } - - return { success: true }; }, /** * Sign out */ async signOut() { - const supabase = getSupabaseClient(); - await supabase.auth.signOut(); + const authService = getAuthService(); + if (!authService) { + user = null; + return; + } + + try { + await authService.signOut(); + user = null; + } catch (error) { + console.error('Sign out error:', error); + // Clear user even if sign out fails + user = null; + } + }, + + /** + * Send password reset email + */ + async forgotPassword(email: string) { + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server' }; + } + + try { + const result = await authService.forgotPassword(email); + + if (!result.success) { + return { success: false, error: result.error || 'Password reset failed' }; + } + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage }; + } + }, + + /** + * Get access token for API calls + */ + async getAccessToken() { + const authService = getAuthService(); + if (!authService) { + return null; + } + return await authService.getAppToken(); }, }; diff --git a/apps/manacore/apps/web/src/routes/(app)/+layout.svelte b/apps/manacore/apps/web/src/routes/(app)/+layout.svelte index 2ff2f3883..ae9945e64 100644 --- a/apps/manacore/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/+layout.svelte @@ -6,12 +6,13 @@ import { PillNavigation } from '@manacore/shared-ui'; import type { PillNavItem } from '@manacore/shared-ui'; import { theme } from '$lib/stores/theme'; + import { authStore } from '$lib/stores/authStore.svelte'; import { isSidebarMode as sidebarModeStore, isNavCollapsed as collapsedStore, } from '$lib/stores/navigation'; - let { data, children }: { data: any; children: Snippet } = $props(); + let { children }: { children: Snippet } = $props(); let loading = $state(true); let isSidebarMode = $state(false); @@ -25,6 +26,7 @@ { href: '/dashboard', label: 'Dashboard', icon: 'home' }, { href: '/organizations', label: 'Organizations', icon: 'building' }, { href: '/teams', label: 'Teams', icon: 'users' }, + { href: '/profile', label: 'Profil', icon: 'user' }, { href: '/mana', label: 'Mana', icon: 'mana' }, { href: '/settings', label: 'Settings', icon: 'settings' }, ]; @@ -71,12 +73,13 @@ } async function handleSignOut() { - await data.supabase.auth.signOut(); + await authStore.signOut(); goto('/login'); } $effect(() => { - if (!data.session) { + // Redirect to login if not authenticated (after initialization) + if (authStore.initialized && !authStore.isAuthenticated) { goto('/login'); } }); @@ -102,7 +105,7 @@ -{#if loading} +{#if loading || authStore.loading}
Loading...

-{:else} +{:else if authStore.isAuthenticated}
{ - if (!session) { - throw redirect(307, '/login'); - } - - console.log('=== DASHBOARD LOAD ==='); - console.log('Session user ID:', session.user.id); - console.log('Session user email:', session.user.email); - - // Fetch user profile - const { data: profile, error: profileError } = await supabase - .from('users') - .select('*') - .eq('auth_id', session.user.id) - .single(); - - console.log('Profile query error:', profileError); - console.log('Profile data:', JSON.stringify(profile, null, 2)); - - // Count organizations - const { count: organizationCount } = await supabase - .from('user_roles') - .select('organization_id', { count: 'exact', head: true }) - .eq('user_id', session.user.id) - .not('organization_id', 'is', null); - - console.log('Organization count:', organizationCount); - - // Count teams - const { count: teamCount } = await supabase - .from('team_members') - .select('team_id', { count: 'exact', head: true }) - .eq('user_id', session.user.id); - - console.log('Team count:', teamCount); - console.log('======================\n'); - +/** + * Dashboard page server load + * + * Note: Auth is now handled client-side via Mana Core Auth. + * Data fetching will need to be done client-side with the auth token. + */ +export const load: PageServerLoad = async () => { + // Return empty data - auth is handled client-side + // TODO: Implement client-side data fetching with Mana Core Auth token return { - profile, - organizationCount: organizationCount || 0, - teamCount: teamCount || 0, + profile: null, + organizationCount: 0, + teamCount: 0, }; }; diff --git a/apps/manacore/apps/web/src/routes/(app)/dashboard/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/dashboard/+page.svelte index 0b02b30a7..8cd047807 100644 --- a/apps/manacore/apps/web/src/routes/(app)/dashboard/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/dashboard/+page.svelte @@ -1,5 +1,5 @@
-
-

Dashboard

-

- Welcome back, {data.profile?.first_name || data.session?.user?.email} -

-
+
{#each stats as stat} diff --git a/apps/manacore/apps/web/src/routes/(app)/feedback/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/feedback/+page.svelte new file mode 100644 index 000000000..9ab4cb4da --- /dev/null +++ b/apps/manacore/apps/web/src/routes/(app)/feedback/+page.svelte @@ -0,0 +1,11 @@ + + + diff --git a/apps/manacore/apps/web/src/routes/(app)/organizations/+page.server.ts b/apps/manacore/apps/web/src/routes/(app)/organizations/+page.server.ts index 6a132c321..77ddd5f58 100644 --- a/apps/manacore/apps/web/src/routes/(app)/organizations/+page.server.ts +++ b/apps/manacore/apps/web/src/routes/(app)/organizations/+page.server.ts @@ -1,51 +1,15 @@ -import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -export const load: PageServerLoad = async ({ locals: { supabase, session } }) => { - if (!session) { - throw redirect(307, '/login'); - } - - // Get all organizations where user has a role - const { data: userRoles } = await supabase - .from('user_roles') - .select('organization_id, role_id, roles(name)') - .eq('user_id', session.user.id) - .not('organization_id', 'is', null); - - if (!userRoles || userRoles.length === 0) { - return { organizations: [] }; - } - - const orgIds = userRoles.map((ur) => ur.organization_id); - - // Get organization details - const { data: organizations } = await supabase.from('organizations').select('*').in('id', orgIds); - - if (!organizations) { - return { organizations: [] }; - } - - // Count teams for each organization - const orgsWithStats = await Promise.all( - organizations.map(async (org) => { - const { count: teamCount } = await supabase - .from('teams') - .select('id', { count: 'exact', head: true }) - .eq('organization_id', org.id); - - const userRole = userRoles.find((ur) => ur.organization_id === org.id); - const roleName = userRole?.roles as any; - - return { - ...org, - team_count: teamCount || 0, - user_role: roleName?.name || 'member', - }; - }) - ); - +/** + * Organizations page server load + * + * Note: Auth is now handled client-side via Mana Core Auth. + * Data fetching will need to be done client-side with the auth token. + */ +export const load: PageServerLoad = async () => { + // Return empty data - auth is handled client-side + // TODO: Implement client-side data fetching with Mana Core Auth token return { - organizations: orgsWithStats, + organizations: [], }; }; diff --git a/apps/manacore/apps/web/src/routes/(app)/organizations/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/organizations/+page.svelte index 5cbec9617..38eed0083 100644 --- a/apps/manacore/apps/web/src/routes/(app)/organizations/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/organizations/+page.svelte @@ -1,5 +1,5 @@
-
-
-

Organizations

-

- Manage your organizations and allocate credits -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if data.organizations && data.organizations.length > 0}
diff --git a/apps/manacore/apps/web/src/routes/(app)/profile/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/profile/+page.svelte new file mode 100644 index 000000000..7995a5f3c --- /dev/null +++ b/apps/manacore/apps/web/src/routes/(app)/profile/+page.svelte @@ -0,0 +1,43 @@ + + + diff --git a/apps/manacore/apps/web/src/routes/(app)/settings/+page.server.ts b/apps/manacore/apps/web/src/routes/(app)/settings/+page.server.ts index 3cf401c0a..8e32704b4 100644 --- a/apps/manacore/apps/web/src/routes/(app)/settings/+page.server.ts +++ b/apps/manacore/apps/web/src/routes/(app)/settings/+page.server.ts @@ -1,50 +1,15 @@ -import { redirect, fail } from '@sveltejs/kit'; -import type { Actions, PageServerLoad } from './$types'; - -export const load: PageServerLoad = async ({ locals: { supabase, session } }) => { - if (!session) { - throw redirect(307, '/login'); - } - - const { data: profile } = await supabase - .from('users') - .select('*') - .eq('auth_id', session.user.id) - .single(); +import type { PageServerLoad } from './$types'; +/** + * Settings page server load + * + * Note: Auth is now handled client-side via Mana Core Auth. + * Data fetching will need to be done client-side with the auth token. + */ +export const load: PageServerLoad = async () => { + // Return empty data - auth is handled client-side + // TODO: Implement client-side data fetching with Mana Core Auth token return { - profile, + profile: null, }; }; - -export const actions: Actions = { - updateProfile: async ({ request, locals: { supabase, session } }) => { - if (!session) { - return fail(401, { error: 'Unauthorized' }); - } - - const formData = await request.formData(); - const firstName = formData.get('firstName') as string; - const lastName = formData.get('lastName') as string; - - const { error } = await supabase - .from('users') - .update({ - first_name: firstName, - last_name: lastName, - updated_at: new Date().toISOString(), - }) - .eq('auth_id', session.user.id); - - if (error) { - console.error('Profile update error:', error); - return fail(500, { - error: 'Failed to update profile', - }); - } - - return { - success: true, - }; - }, -}; diff --git a/apps/manacore/apps/web/src/routes/(app)/teams/+page.server.ts b/apps/manacore/apps/web/src/routes/(app)/teams/+page.server.ts index 9c75cb8b6..07a874b54 100644 --- a/apps/manacore/apps/web/src/routes/(app)/teams/+page.server.ts +++ b/apps/manacore/apps/web/src/routes/(app)/teams/+page.server.ts @@ -1,59 +1,15 @@ -import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -export const load: PageServerLoad = async ({ locals: { supabase, session } }) => { - if (!session) { - throw redirect(307, '/login'); - } - - // Get all teams where user is a member - const { data: teamMembers } = await supabase - .from('team_members') - .select('team_id, allocated_credits, used_credits') - .eq('user_id', session.user.id); - - if (!teamMembers || teamMembers.length === 0) { - return { teams: [] }; - } - - const teamIds = teamMembers.map((tm) => tm.team_id); - - // Get team details with organization info - const { data: teams } = await supabase - .from('teams') - .select('*, organization:organizations(*)') - .in('id', teamIds); - - if (!teams) { - return { teams: [] }; - } - - // Check if user is team admin and count members - const teamsWithStats = await Promise.all( - teams.map(async (team) => { - const { count: memberCount } = await supabase - .from('team_members') - .select('user_id', { count: 'exact', head: true }) - .eq('team_id', team.id); - - const { data: userRole } = await supabase - .from('user_roles') - .select('roles(name)') - .eq('user_id', session.user.id) - .eq('team_id', team.id) - .single(); - - const roleName = userRole?.roles as any; - - return { - ...team, - member_count: memberCount || 0, - user_role: roleName?.name || 'member', - }; - }) - ); - +/** + * Teams page server load + * + * Note: Auth is now handled client-side via Mana Core Auth. + * Data fetching will need to be done client-side with the auth token. + */ +export const load: PageServerLoad = async () => { + // Return empty data - auth is handled client-side + // TODO: Implement client-side data fetching with Mana Core Auth token return { - teams: teamsWithStats, + teams: [], }; }; diff --git a/apps/manacore/apps/web/src/routes/(app)/teams/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/teams/+page.svelte index 459cccf3e..79ea071f3 100644 --- a/apps/manacore/apps/web/src/routes/(app)/teams/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/teams/+page.svelte @@ -1,5 +1,5 @@
-
-
-

Teams

-

- Manage your teams and collaborate with members -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if data.teams && data.teams.length > 0}
diff --git a/apps/manacore/apps/web/src/routes/+layout.server.ts b/apps/manacore/apps/web/src/routes/+layout.server.ts index 0ea8840ca..11770fd80 100644 --- a/apps/manacore/apps/web/src/routes/+layout.server.ts +++ b/apps/manacore/apps/web/src/routes/+layout.server.ts @@ -1,8 +1,7 @@ import type { LayoutServerLoad } from './$types'; -export const load: LayoutServerLoad = async ({ locals: { session }, cookies }) => { +export const load: LayoutServerLoad = async ({ cookies }) => { return { - session, cookies: cookies.getAll(), }; }; diff --git a/apps/manacore/apps/web/src/routes/+layout.svelte b/apps/manacore/apps/web/src/routes/+layout.svelte index c44a9a7b7..4f5c0d7c7 100644 --- a/apps/manacore/apps/web/src/routes/+layout.svelte +++ b/apps/manacore/apps/web/src/routes/+layout.svelte @@ -1,29 +1,20 @@ diff --git a/apps/manacore/apps/web/vite.config.ts b/apps/manacore/apps/web/vite.config.ts index b27d43722..dd72326dd 100644 --- a/apps/manacore/apps/web/vite.config.ts +++ b/apps/manacore/apps/web/vite.config.ts @@ -11,4 +11,34 @@ export default defineConfig({ port: 4173, strictPort: true, }, + ssr: { + noExternal: [ + '@manacore/shared-icons', + '@manacore/shared-ui', + '@manacore/shared-tailwind', + '@manacore/shared-theme', + '@manacore/shared-theme-ui', + '@manacore/shared-feedback-ui', + '@manacore/shared-feedback-service', + '@manacore/shared-feedback-types', + '@manacore/shared-auth', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + ], + }, + optimizeDeps: { + exclude: [ + '@manacore/shared-icons', + '@manacore/shared-ui', + '@manacore/shared-tailwind', + '@manacore/shared-theme', + '@manacore/shared-theme-ui', + '@manacore/shared-feedback-ui', + '@manacore/shared-feedback-service', + '@manacore/shared-feedback-types', + '@manacore/shared-auth', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + ], + }, }); diff --git a/apps/manadeck/apps/web/package.json b/apps/manadeck/apps/web/package.json index 3e3776bb5..c5b20ec60 100644 --- a/apps/manadeck/apps/web/package.json +++ b/apps/manadeck/apps/web/package.json @@ -29,9 +29,12 @@ "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-feedback-service": "workspace:*", + "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-config": "workspace:*", "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", + "@manacore/shared-profile-ui": "workspace:*", "@manacore/shared-subscription-types": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", diff --git a/apps/manadeck/apps/web/src/lib/api/feedback.ts b/apps/manadeck/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..f8d68757a --- /dev/null +++ b/apps/manadeck/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,15 @@ +/** + * Feedback Service Instance for ManaDeck Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { authService } from '$lib/auth'; +import { PUBLIC_MANA_CORE_AUTH_URL } from '$env/static/public'; + +const MANA_AUTH_URL = PUBLIC_MANA_CORE_AUTH_URL || 'http://localhost:3001'; + +export const feedbackService = createFeedbackService({ + apiUrl: MANA_AUTH_URL, + appId: 'manadeck', + getAuthToken: async () => authService.getAppToken(), +}); diff --git a/apps/manadeck/apps/web/src/routes/(app)/feedback/+page.svelte b/apps/manadeck/apps/web/src/routes/(app)/feedback/+page.svelte new file mode 100644 index 000000000..62515ede6 --- /dev/null +++ b/apps/manadeck/apps/web/src/routes/(app)/feedback/+page.svelte @@ -0,0 +1,11 @@ + + + diff --git a/apps/manadeck/apps/web/src/routes/(app)/profile/+page.svelte b/apps/manadeck/apps/web/src/routes/(app)/profile/+page.svelte index e571c3fa7..225ce40bd 100644 --- a/apps/manadeck/apps/web/src/routes/(app)/profile/+page.svelte +++ b/apps/manadeck/apps/web/src/routes/(app)/profile/+page.svelte @@ -1,88 +1,43 @@ - - Profile - Manadeck - - -
-
-

Profile

-

Manage your account and settings

-
- - - -
-
-
- {authStore.user?.email?.[0].toUpperCase() || 'U'} -
-
-

{authStore.user?.email || 'User'}

-

- Member since {new Date().toLocaleDateString()} -

-
-
-
-
- - - -
-
-

Mana Credits

-

Use credits for AI features

-
-
- {#if loadingCredits} -
...
- {:else if credits !== null} -
⚡ {credits}
- {:else} - - {/if} -
-
-
- - - -

Settings

-
-
- Theme - System -
-
- Notifications - Enabled -
-
- Study Reminders - Daily -
-
-
-
+ diff --git a/apps/picture/apps/web/package.json b/apps/picture/apps/web/package.json index bf9cce73f..b60ce1a3b 100644 --- a/apps/picture/apps/web/package.json +++ b/apps/picture/apps/web/package.json @@ -19,8 +19,11 @@ "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-feedback-service": "workspace:*", + "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", + "@manacore/shared-profile-ui": "workspace:*", "@manacore/shared-subscription-types": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", diff --git a/apps/picture/apps/web/src/lib/api/feedback.ts b/apps/picture/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..a7359d865 --- /dev/null +++ b/apps/picture/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,15 @@ +/** + * Feedback Service Instance for Picture Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { authStore } from '$lib/stores/auth.svelte'; +import { env } from '$env/dynamic/public'; + +const MANA_AUTH_URL = env.PUBLIC_MANA_CORE_AUTH_URL || 'http://localhost:3001'; + +export const feedbackService = createFeedbackService({ + apiUrl: MANA_AUTH_URL, + appId: 'picture', + getAuthToken: async () => authStore.getAccessToken(), +}); diff --git a/apps/picture/apps/web/src/routes/app/board/+page.svelte b/apps/picture/apps/web/src/routes/app/board/+page.svelte index 4e4248c99..c87e06b43 100644 --- a/apps/picture/apps/web/src/routes/app/board/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/board/+page.svelte @@ -14,6 +14,7 @@ removeBoardFromList, } from '$lib/stores/boards'; import { getBoards, deleteBoard, duplicateBoard } from '$lib/api/boards'; + import { PageHeader } from '@manacore/shared-ui'; import Button from '$lib/components/ui/Button.svelte'; import Modal from '$lib/components/ui/Modal.svelte'; import { showToast } from '$lib/stores/toast'; @@ -163,19 +164,18 @@
- -
-
-

Moodboards

-

- Erstelle und organisiere deine Bilder auf einem Canvas -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if $isLoadingBoards} diff --git a/apps/picture/apps/web/src/routes/app/feedback/+page.svelte b/apps/picture/apps/web/src/routes/app/feedback/+page.svelte new file mode 100644 index 000000000..aea3c1329 --- /dev/null +++ b/apps/picture/apps/web/src/routes/app/feedback/+page.svelte @@ -0,0 +1,11 @@ + + + diff --git a/apps/picture/apps/web/src/routes/app/generate/+page.svelte b/apps/picture/apps/web/src/routes/app/generate/+page.svelte index b57312b3d..2988da68a 100644 --- a/apps/picture/apps/web/src/routes/app/generate/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/generate/+page.svelte @@ -1,4 +1,5 @@ @@ -8,12 +9,11 @@
-
-

Generate Image

-

- Create stunning AI-generated images from your text descriptions -

-
+
diff --git a/apps/picture/apps/web/src/routes/app/profile/+page.svelte b/apps/picture/apps/web/src/routes/app/profile/+page.svelte index 932652961..1c7d1fff1 100644 --- a/apps/picture/apps/web/src/routes/app/profile/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/profile/+page.svelte @@ -1,183 +1,50 @@ - - Profile - Picture - + -
-
-

Profile

-

Manage your account settings

-
- -
- - -
-

- Account Information -

- -
- -
-
-

Email

-

{authStore.user?.email || 'Not available'}

-
- {#if authStore.user?.email} - - Verified - - {:else} - - Not verified - - {/if} -
- - -
-
-

User ID

-

{authStore.user?.id || 'Not available'}

-
-
- - -
-
-

Member Since

-

-

-
-
-
-
-
- - -
-

Appearance

- -
- - - -
-

Settings

- -
- -
-
-

Language

-

- Select your preferred language -

-
- -
-
-
-
- - - -
-

Statistics

- -
-
-

Total Images

-

-

-
-
-

Generated

-

-

-
-
-

Archived

-

-

-
-
-

Statistics coming soon...

-
-
- - - -
-

Danger Zone

- -
-
-
-

Log Out

-

Sign out of your account

-
- -
- -
-
-

Delete Account

-

Permanently delete your account and all data

-
- -
-
-
-
-
+ +
+

Erscheinungsbild

+
diff --git a/apps/picture/apps/web/src/routes/app/tags/+page.svelte b/apps/picture/apps/web/src/routes/app/tags/+page.svelte index 6e26ab998..2e0756630 100644 --- a/apps/picture/apps/web/src/routes/app/tags/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/tags/+page.svelte @@ -3,6 +3,7 @@ import { tags, isLoadingTags } from '$lib/stores/tags'; import { getAllTags, createTag, updateTag, deleteTag, type Tag } from '$lib/api/tags'; import { showToast } from '$lib/stores/toast'; + import { PageHeader } from '@manacore/shared-ui'; import { Plus, Tag as TagIcon, PencilSimple, Trash } from '@manacore/shared-icons'; let showCreateModal = $state(false); @@ -105,22 +106,21 @@
- -
-
-

Tag-Verwaltung

-

- Verwalte deine Tags für eine bessere Organisation deiner Bilder -

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if $isLoadingTags} diff --git a/apps/picture/apps/web/src/routes/app/upload/+page.svelte b/apps/picture/apps/web/src/routes/app/upload/+page.svelte index 72b5d5682..555d09355 100644 --- a/apps/picture/apps/web/src/routes/app/upload/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/upload/+page.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { uploadMultipleImages, type UploadProgress } from '$lib/api/upload'; import { showToast } from '$lib/stores/toast'; + import { PageHeader } from '@manacore/shared-ui'; import DropZone from '$lib/components/upload/DropZone.svelte'; import { images } from '$lib/stores/images'; import { Check, Image, CloudArrowUp, CheckCircle } from '@manacore/shared-icons'; @@ -58,13 +59,11 @@
- -
-

Bilder hochladen

-

- Lade deine eigenen Bilder hoch und verwalte sie in deiner Galerie -

-
+ {#if successCount > 0 && !uploading} diff --git a/apps/presi/apps/web/package.json b/apps/presi/apps/web/package.json index 89cf4bb53..0bee5d4f1 100644 --- a/apps/presi/apps/web/package.json +++ b/apps/presi/apps/web/package.json @@ -33,7 +33,11 @@ "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-feedback-service": "workspace:*", + "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-icons": "workspace:*", + "@manacore/shared-profile-ui": "workspace:*", + "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", "@manacore/shared-theme": "workspace:*", "@manacore/shared-theme-ui": "workspace:*", diff --git a/apps/presi/apps/web/src/lib/api/feedback.ts b/apps/presi/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..ed4e35d69 --- /dev/null +++ b/apps/presi/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,15 @@ +/** + * Feedback Service Instance for Presi Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { auth } from '$lib/stores/auth.svelte'; +import { PUBLIC_MANA_CORE_AUTH_URL } from '$env/static/public'; + +const MANA_AUTH_URL = PUBLIC_MANA_CORE_AUTH_URL || 'http://localhost:3001'; + +export const feedbackService = createFeedbackService({ + apiUrl: MANA_AUTH_URL, + appId: 'presi', + getAuthToken: async () => auth.getAccessToken(), +}); diff --git a/apps/presi/apps/web/src/routes/+layout.svelte b/apps/presi/apps/web/src/routes/+layout.svelte index b04cb9a5c..9f1387c49 100644 --- a/apps/presi/apps/web/src/routes/+layout.svelte +++ b/apps/presi/apps/web/src/routes/+layout.svelte @@ -44,6 +44,7 @@ const navItems: PillNavItem[] = [ { href: '/', label: 'Decks', icon: 'document' }, { href: '/profile', label: 'Profil', icon: 'user' }, + { href: '/mana', label: 'Mana', icon: 'sparkles' }, { href: '/settings', label: 'Einstellungen', icon: 'settings' }, ]; diff --git a/apps/presi/apps/web/src/routes/+page.svelte b/apps/presi/apps/web/src/routes/+page.svelte index e07fd9c91..908372625 100644 --- a/apps/presi/apps/web/src/routes/+page.svelte +++ b/apps/presi/apps/web/src/routes/+page.svelte @@ -2,6 +2,7 @@ import { onMount } from 'svelte'; import { goto } from '$app/navigation'; import { decksStore } from '$lib/stores/decks.svelte'; + import { PageHeader } from '@manacore/shared-ui'; import { Plus, Presentation, Trash2, MoreVertical, Clock, Layers } from 'lucide-svelte'; let showCreateModal = $state(false); @@ -60,19 +61,21 @@
-
-
-

My Presentations

-

Create and manage your slide decks

-
- -
+ + {#snippet actions()} + + {/snippet} + {#if decksStore.isLoading}
diff --git a/apps/presi/apps/web/src/routes/feedback/+page.svelte b/apps/presi/apps/web/src/routes/feedback/+page.svelte new file mode 100644 index 000000000..7eba9a895 --- /dev/null +++ b/apps/presi/apps/web/src/routes/feedback/+page.svelte @@ -0,0 +1,11 @@ + + + diff --git a/apps/presi/apps/web/src/routes/mana/+page.svelte b/apps/presi/apps/web/src/routes/mana/+page.svelte new file mode 100644 index 000000000..4cfee8e12 --- /dev/null +++ b/apps/presi/apps/web/src/routes/mana/+page.svelte @@ -0,0 +1,39 @@ + + + + Mana - Presi + + +
+ +
+ + diff --git a/apps/presi/apps/web/src/routes/profile/+page.svelte b/apps/presi/apps/web/src/routes/profile/+page.svelte index a0556bb5b..5d475cb47 100644 --- a/apps/presi/apps/web/src/routes/profile/+page.svelte +++ b/apps/presi/apps/web/src/routes/profile/+page.svelte @@ -1,23 +1,34 @@ - - Profile - Presi - - -
-
- - - -

Profile

-
+ + +
{#if isLoading} -
+
{:else} -
- + +
+

Statistiken

-
-
- +
+
+
+ +
+
+ {decksStore.decks.length} +
+
Präsentationen
-

- {auth.user?.email || 'User'} -

-

- ID: {auth.user?.id?.slice(0, 8)}... -

-
-
- - -
-
-

Statistics

-
-
-
- -
-
- -
-
- {decksStore.decks.length} -
-
Total Decks
-
- - -
-
- -
-
-
-
Total Slides
+
+
+
+
-
+
Folien
+
- - {#if decksStore.decks.length > 0} + + {#if decksStore.decks.length > 0} +
+

Letzte Präsentationen

+ {/if} {/if}
diff --git a/apps/zitare/apps/web/package.json b/apps/zitare/apps/web/package.json index b26179845..43a97cbbd 100644 --- a/apps/zitare/apps/web/package.json +++ b/apps/zitare/apps/web/package.json @@ -27,7 +27,14 @@ "vite": "^6.0.0" }, "dependencies": { + "@manacore/shared-auth": "workspace:*", + "@manacore/shared-auth-ui": "workspace:*", + "@manacore/shared-branding": "workspace:*", + "@manacore/shared-feedback-service": "workspace:*", + "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-icons": "workspace:*", + "@manacore/shared-profile-ui": "workspace:*", + "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", "@manacore/shared-theme": "workspace:*", "@manacore/shared-theme-ui": "workspace:*", diff --git a/apps/zitare/apps/web/src/lib/api/feedback.ts b/apps/zitare/apps/web/src/lib/api/feedback.ts new file mode 100644 index 000000000..2bd2db69e --- /dev/null +++ b/apps/zitare/apps/web/src/lib/api/feedback.ts @@ -0,0 +1,14 @@ +/** + * Feedback Service Instance for Zitare Web App + */ + +import { createFeedbackService } from '@manacore/shared-feedback-service'; +import { authStore } from '$lib/stores/auth.svelte'; + +const MANA_AUTH_URL = 'http://localhost:3001'; // TODO: Use PUBLIC_MANA_CORE_AUTH_URL from env + +export const feedbackService = createFeedbackService({ + apiUrl: MANA_AUTH_URL, + appId: 'zitare', + getAuthToken: async () => authStore.getAccessToken(), +}); diff --git a/apps/zitare/apps/web/src/lib/stores/auth.svelte.ts b/apps/zitare/apps/web/src/lib/stores/auth.svelte.ts new file mode 100644 index 000000000..5611cb329 --- /dev/null +++ b/apps/zitare/apps/web/src/lib/stores/auth.svelte.ts @@ -0,0 +1,186 @@ +/** + * Auth Store - Manages authentication state using Svelte 5 runes + * Uses Mana Core Auth + */ + +import { browser } from '$app/environment'; +import { initializeWebAuth, type UserData } from '@manacore/shared-auth'; + +// Initialize Mana Core Auth only on the client side +// TODO: Use PUBLIC_MANA_CORE_AUTH_URL from env when available +const MANA_AUTH_URL = 'http://localhost:3001'; + +// Lazy initialization to avoid SSR issues with localStorage +let _authService: ReturnType['authService'] | null = null; +let _tokenManager: ReturnType['tokenManager'] | null = null; + +function getAuthService() { + if (!browser) return null; + if (!_authService) { + const auth = initializeWebAuth({ baseUrl: MANA_AUTH_URL }); + _authService = auth.authService; + _tokenManager = auth.tokenManager; + } + return _authService; +} + +// State +let user = $state(null); +let loading = $state(true); +let initialized = $state(false); + +export const authStore = { + // Getters + get user() { + return user; + }, + get loading() { + return loading; + }, + get isAuthenticated() { + return !!user; + }, + get initialized() { + return initialized; + }, + + /** + * Initialize auth state from stored tokens + */ + async initialize() { + if (initialized) return; + + const authService = getAuthService(); + if (!authService) { + initialized = true; + loading = false; + return; + } + + loading = true; + try { + const authenticated = await authService.isAuthenticated(); + if (authenticated) { + const userData = await authService.getUserFromToken(); + user = userData; + } + initialized = true; + } catch (error) { + console.error('Failed to initialize auth:', error); + user = null; + } finally { + loading = false; + } + }, + + /** + * Sign in with email and password + */ + async signIn(email: string, password: string) { + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server' }; + } + + try { + const result = await authService.signIn(email, password); + + if (!result.success) { + return { success: false, error: result.error || 'Login failed' }; + } + + // Get user data from token + const userData = await authService.getUserFromToken(); + user = userData; + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage }; + } + }, + + /** + * Sign up with email and password + */ + async signUp(email: string, password: string) { + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server', needsVerification: false }; + } + + try { + const result = await authService.signUp(email, password); + + if (!result.success) { + return { success: false, error: result.error || 'Signup failed', needsVerification: false }; + } + + // Mana Core Auth requires separate login after signup + if (result.needsVerification) { + return { success: true, needsVerification: true }; + } + + // Auto sign in after successful signup + const signInResult = await this.signIn(email, password); + return { ...signInResult, needsVerification: false }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage, needsVerification: false }; + } + }, + + /** + * Sign out + */ + async signOut() { + const authService = getAuthService(); + if (!authService) { + user = null; + return; + } + + try { + await authService.signOut(); + user = null; + } catch (error) { + console.error('Sign out error:', error); + // Clear user even if sign out fails + user = null; + } + }, + + /** + * Send password reset email + */ + async resetPassword(email: string) { + const authService = getAuthService(); + if (!authService) { + return { success: false, error: 'Auth not available on server' }; + } + + try { + const result = await authService.forgotPassword(email); + + if (!result.success) { + return { success: false, error: result.error || 'Password reset failed' }; + } + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: errorMessage }; + } + }, + + /** + * Get access token for API calls + */ + async getAccessToken() { + const authService = getAuthService(); + if (!authService) { + return null; + } + return await authService.getAppToken(); + }, +}; diff --git a/apps/zitare/apps/web/src/routes/(auth)/+layout.svelte b/apps/zitare/apps/web/src/routes/(auth)/+layout.svelte new file mode 100644 index 000000000..c2c6dda35 --- /dev/null +++ b/apps/zitare/apps/web/src/routes/(auth)/+layout.svelte @@ -0,0 +1,7 @@ + + +{@render children()} diff --git a/apps/zitare/apps/web/src/routes/(auth)/forgot-password/+page.svelte b/apps/zitare/apps/web/src/routes/(auth)/forgot-password/+page.svelte new file mode 100644 index 000000000..77bdcfa45 --- /dev/null +++ b/apps/zitare/apps/web/src/routes/(auth)/forgot-password/+page.svelte @@ -0,0 +1,25 @@ + + + + Passwort vergessen - Zitare + + + diff --git a/apps/zitare/apps/web/src/routes/(auth)/login/+page.svelte b/apps/zitare/apps/web/src/routes/(auth)/login/+page.svelte new file mode 100644 index 000000000..b0d63703e --- /dev/null +++ b/apps/zitare/apps/web/src/routes/(auth)/login/+page.svelte @@ -0,0 +1,27 @@ + + + + Anmelden - Zitare + + + diff --git a/apps/zitare/apps/web/src/routes/(auth)/register/+page.svelte b/apps/zitare/apps/web/src/routes/(auth)/register/+page.svelte new file mode 100644 index 000000000..4d35fda6a --- /dev/null +++ b/apps/zitare/apps/web/src/routes/(auth)/register/+page.svelte @@ -0,0 +1,26 @@ + + + + Registrieren - Zitare + + + diff --git a/apps/zitare/apps/web/src/routes/+layout.svelte b/apps/zitare/apps/web/src/routes/+layout.svelte index 3cf37a384..cbbf639fb 100644 --- a/apps/zitare/apps/web/src/routes/+layout.svelte +++ b/apps/zitare/apps/web/src/routes/+layout.svelte @@ -5,6 +5,7 @@ import { PillNavigation } from '@manacore/shared-ui'; import type { PillNavItem, PillDropdownItem } from '@manacore/shared-ui'; import { theme } from '$lib/stores/theme'; + import { authStore } from '$lib/stores/auth.svelte'; import { THEME_DEFINITIONS } from '@manacore/shared-theme'; import { isSidebarMode as sidebarModeStore, @@ -53,6 +54,8 @@ { href: '/authors', label: 'Autoren', icon: 'users' }, { href: '/favorites', label: 'Favoriten', icon: 'heart' }, { href: '/lists', label: 'Listen', icon: 'list' }, + { href: '/profile', label: 'Profil', icon: 'user' }, + { href: '/mana', label: 'Mana', icon: 'sparkles' }, ]; // Navigation shortcuts (Ctrl+1-5) @@ -104,10 +107,18 @@ theme.toggleMode(); } - onMount(() => { + async function handleLogout() { + await authStore.signOut(); + goto('/login'); + } + + onMount(async () => { // Initialize theme theme.initialize(); + // Initialize auth + await authStore.initialize(); + // Initialize sidebar mode from localStorage const savedSidebar = localStorage.getItem('zitare-nav-sidebar'); if (savedSidebar === 'true') { @@ -159,7 +170,8 @@ {themeVariantItems} {currentThemeVariantLabel} showLanguageSwitcher={false} - showLogout={false} + showLogout={authStore.isAuthenticated} + onLogout={handleLogout} primaryColor="#f59e0b" /> diff --git a/apps/zitare/apps/web/src/routes/authors/+page.svelte b/apps/zitare/apps/web/src/routes/authors/+page.svelte index cb87dad7c..433b3c78a 100644 --- a/apps/zitare/apps/web/src/routes/authors/+page.svelte +++ b/apps/zitare/apps/web/src/routes/authors/+page.svelte @@ -1,5 +1,6 @@ + + diff --git a/apps/zitare/apps/web/src/routes/lists/+page.svelte b/apps/zitare/apps/web/src/routes/lists/+page.svelte index e6a91bcd5..cdd63af3f 100644 --- a/apps/zitare/apps/web/src/routes/lists/+page.svelte +++ b/apps/zitare/apps/web/src/routes/lists/+page.svelte @@ -1,6 +1,7 @@ + + + Mana - Zitare + + +
+ +
+ + diff --git a/apps/zitare/apps/web/src/routes/profile/+page.svelte b/apps/zitare/apps/web/src/routes/profile/+page.svelte new file mode 100644 index 000000000..e3eff074d --- /dev/null +++ b/apps/zitare/apps/web/src/routes/profile/+page.svelte @@ -0,0 +1,43 @@ + + + diff --git a/apps/zitare/apps/web/vite.config.ts b/apps/zitare/apps/web/vite.config.ts index 8a008af9d..8af87e0e3 100644 --- a/apps/zitare/apps/web/vite.config.ts +++ b/apps/zitare/apps/web/vite.config.ts @@ -18,6 +18,13 @@ export default defineConfig({ '@manacore/shared-tailwind', '@manacore/shared-theme', '@manacore/shared-theme-ui', + '@manacore/shared-feedback-ui', + '@manacore/shared-feedback-service', + '@manacore/shared-feedback-types', + '@manacore/shared-auth', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + '@manacore/shared-subscription-ui', ], }, optimizeDeps: { @@ -30,6 +37,13 @@ export default defineConfig({ '@manacore/shared-tailwind', '@manacore/shared-theme', '@manacore/shared-theme-ui', + '@manacore/shared-feedback-ui', + '@manacore/shared-feedback-service', + '@manacore/shared-feedback-types', + '@manacore/shared-auth', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + '@manacore/shared-subscription-ui', ], }, }); diff --git a/packages/shared-branding/src/logos/ZitareLogo.svelte b/packages/shared-branding/src/logos/ZitareLogo.svelte new file mode 100644 index 000000000..6eae69cb1 --- /dev/null +++ b/packages/shared-branding/src/logos/ZitareLogo.svelte @@ -0,0 +1,13 @@ + + + diff --git a/packages/shared-branding/src/logos/index.ts b/packages/shared-branding/src/logos/index.ts index 9f19f4e33..ac387a50c 100644 --- a/packages/shared-branding/src/logos/index.ts +++ b/packages/shared-branding/src/logos/index.ts @@ -10,3 +10,4 @@ export { default as UloadLogo } from './UloadLogo.svelte'; export { default as ChatLogo } from './ChatLogo.svelte'; export { default as PresiLogo } from './PresiLogo.svelte'; export { default as NutriPhiLogo } from './NutriPhiLogo.svelte'; +export { default as ZitareLogo } from './ZitareLogo.svelte'; diff --git a/packages/shared-profile-ui/tsconfig.json b/packages/shared-profile-ui/tsconfig.json index c08ae7cb9..c05c7cc81 100644 --- a/packages/shared-profile-ui/tsconfig.json +++ b/packages/shared-profile-ui/tsconfig.json @@ -1,12 +1,19 @@ { - "extends": "../../tsconfig.base.json", "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "declaration": true, - "declarationDir": "dist", + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, "types": ["svelte"] }, "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules"] } diff --git a/packages/shared-ui/src/molecules/PageHeader.svelte b/packages/shared-ui/src/molecules/PageHeader.svelte index f63175caf..c2a138530 100644 --- a/packages/shared-ui/src/molecules/PageHeader.svelte +++ b/packages/shared-ui/src/molecules/PageHeader.svelte @@ -110,6 +110,24 @@
+ + {#if backHref} + + + + + + {/if} + {#if icon}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bf9694ef..56bb0c007 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,7 +76,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.9 - version: 10.4.9(esbuild@0.27.0) + version: 10.4.9(esbuild@0.19.12) '@nestjs/schematics': specifier: ^10.2.3 version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3) @@ -109,7 +109,7 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.1 - version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)) + version: 9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.19.12)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) @@ -136,14 +136,14 @@ importers: version: link:../../../../packages/shared-landing-ui astro: specifier: ^5.16.0 - version: 5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + version: 5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) typescript: specifier: ^5.0.0 version: 5.9.3 devDependencies: '@astrojs/tailwind': specifier: ^6.0.0 - version: 6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) + version: 6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) @@ -522,12 +522,21 @@ importers: '@manacore/shared-config': specifier: workspace:* version: link:../../../../packages/shared-config + '@manacore/shared-feedback-service': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-service + '@manacore/shared-feedback-ui': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-ui '@manacore/shared-i18n': specifier: workspace:* version: link:../../../../packages/shared-i18n '@manacore/shared-icons': specifier: workspace:* version: link:../../../../packages/shared-icons + '@manacore/shared-profile-ui': + specifier: workspace:* + version: link:../../../../packages/shared-profile-ui '@manacore/shared-subscription-types': specifier: workspace:* version: link:../../../../packages/shared-subscription-types @@ -958,12 +967,21 @@ importers: '@manacore/shared-config': specifier: workspace:* version: link:../../../../packages/shared-config + '@manacore/shared-feedback-service': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-service + '@manacore/shared-feedback-ui': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-ui '@manacore/shared-i18n': specifier: workspace:* version: link:../../../../packages/shared-i18n '@manacore/shared-icons': specifier: workspace:* version: link:../../../../packages/shared-icons + '@manacore/shared-profile-ui': + specifier: workspace:* + version: link:../../../../packages/shared-profile-ui '@manacore/shared-subscription-types': specifier: workspace:* version: link:../../../../packages/shared-subscription-types @@ -1398,12 +1416,21 @@ importers: '@manacore/shared-branding': specifier: workspace:* version: link:../../../../packages/shared-branding + '@manacore/shared-feedback-service': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-service + '@manacore/shared-feedback-ui': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-ui '@manacore/shared-i18n': specifier: workspace:* version: link:../../../../packages/shared-i18n '@manacore/shared-icons': specifier: workspace:* version: link:../../../../packages/shared-icons + '@manacore/shared-profile-ui': + specifier: workspace:* + version: link:../../../../packages/shared-profile-ui '@manacore/shared-subscription-types': specifier: workspace:* version: link:../../../../packages/shared-subscription-types @@ -1743,9 +1770,21 @@ importers: '@manacore/shared-branding': specifier: workspace:* version: link:../../../../packages/shared-branding + '@manacore/shared-feedback-service': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-service + '@manacore/shared-feedback-ui': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-ui '@manacore/shared-icons': specifier: workspace:* version: link:../../../../packages/shared-icons + '@manacore/shared-profile-ui': + specifier: workspace:* + version: link:../../../../packages/shared-profile-ui + '@manacore/shared-subscription-ui': + specifier: workspace:* + version: link:../../../../packages/shared-subscription-ui '@manacore/shared-tailwind': specifier: workspace:* version: link:../../../../packages/shared-tailwind @@ -1897,7 +1936,7 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.1 - version: 9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.27.0)) + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) @@ -2110,9 +2149,30 @@ importers: apps/zitare/apps/web: dependencies: + '@manacore/shared-auth': + specifier: workspace:* + version: link:../../../../packages/shared-auth + '@manacore/shared-auth-ui': + specifier: workspace:* + version: link:../../../../packages/shared-auth-ui + '@manacore/shared-branding': + specifier: workspace:* + version: link:../../../../packages/shared-branding + '@manacore/shared-feedback-service': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-service + '@manacore/shared-feedback-ui': + specifier: workspace:* + version: link:../../../../packages/shared-feedback-ui '@manacore/shared-icons': specifier: workspace:* version: link:../../../../packages/shared-icons + '@manacore/shared-profile-ui': + specifier: workspace:* + version: link:../../../../packages/shared-profile-ui + '@manacore/shared-subscription-ui': + specifier: workspace:* + version: link:../../../../packages/shared-subscription-ui '@manacore/shared-tailwind': specifier: workspace:* version: link:../../../../packages/shared-tailwind @@ -2841,7 +2901,7 @@ importers: version: 1.57.0 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@24.10.1) + version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) vitest: specifier: ^3.0.0 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -2955,7 +3015,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^11.0.0 - version: 11.0.12(@types/node@22.19.1)(esbuild@0.19.12) + version: 11.0.12(@types/node@22.19.1) '@nestjs/schematics': specifier: ^11.0.0 version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) @@ -3009,10 +3069,10 @@ importers: version: 7.1.4 ts-jest: specifier: ^29.2.5 - version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.19.12)(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3) ts-loader: specifier: ^9.5.1 - version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)) + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) @@ -4866,7 +4926,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -17195,6 +17255,16 @@ snapshots: transitivePeerDependencies: - ts-node + '@astrojs/tailwind@6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))': + dependencies: + astro: 5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + autoprefixer: 10.4.22(postcss@8.5.6) + postcss: 8.5.6 + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - ts-node + '@astrojs/tailwind@6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))': dependencies: astro: 5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) @@ -19096,7 +19166,7 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.18.3 optionalDependencies: - expo-router: 6.0.15(jiucxy5ca3jdtbnulaxuc46jdq) + expo-router: 6.0.15(5e7ih2rh6mb55wruwvjljgzihq) react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -19173,7 +19243,7 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.18.3 optionalDependencies: - expo-router: 6.0.15(ohit2up6tuxb3x34brxduivol4) + expo-router: 6.0.15(nttrd3tw67nnyhowcwgdzipb5e) react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -20413,41 +20483,6 @@ snapshots: jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.19.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.19.1) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 @@ -20483,6 +20518,78 @@ snapshots: - supports-color - ts-node + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@30.2.0(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3))': + dependencies: + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.19.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + optional: true + '@jest/core@30.2.0(esbuild-register@3.6.0(esbuild@0.27.0))': dependencies: '@jest/console': 30.2.0 @@ -20909,6 +21016,32 @@ snapshots: - uglify-js - webpack-cli + '@nestjs/cli@10.4.9(esbuild@0.19.12)': + dependencies: + '@angular-devkit/core': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.3.11(chokidar@3.6.0) + '@nestjs/schematics': 10.2.3(chokidar@3.6.0)(typescript@5.7.2) + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.5 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1(esbuild@0.19.12)) + glob: 10.4.5 + inquirer: 8.2.6 + node-emoji: 1.11.0 + ora: 5.4.1 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.7.2 + webpack: 5.97.1(esbuild@0.19.12) + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - esbuild + - uglify-js + - webpack-cli + '@nestjs/cli@10.4.9(esbuild@0.27.0)': dependencies: '@angular-devkit/core': 17.3.11(chokidar@3.6.0) @@ -20935,7 +21068,7 @@ snapshots: - uglify-js - webpack-cli - '@nestjs/cli@11.0.12(@types/node@22.19.1)(esbuild@0.19.12)': + '@nestjs/cli@11.0.12(@types/node@22.19.1)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) @@ -20946,14 +21079,14 @@ snapshots: chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.100.2) glob: 12.0.0 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.100.2(esbuild@0.19.12) + webpack: 5.100.2 webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@types/node' @@ -23387,7 +23520,7 @@ snapshots: react-test-renderer: 19.1.0(react@19.1.0) redent: 3.0.0 - '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react-native@13.3.3(jest@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: jest-matcher-utils: 30.2.0 picocolors: 1.1.1 @@ -23397,20 +23530,7 @@ snapshots: react-test-renderer: 19.1.0(react@19.1.0) redent: 3.0.0 optionalDependencies: - jest: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) - optional: true - - '@testing-library/react-native@13.3.3(jest@30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - jest-matcher-utils: 30.2.0 - picocolors: 1.1.1 - pretty-format: 30.2.0 - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0) - react-test-renderer: 19.1.0(react@19.1.0) - redent: 3.0.0 - optionalDependencies: - jest: 30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)) + jest: 30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) optional: true '@testing-library/react-native@13.3.3(jest@30.2.0(@types/node@24.10.1)(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)': @@ -24372,11 +24492,11 @@ snapshots: - vite optional: true - '@vitest/browser@3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(playwright@1.57.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.2 @@ -24416,6 +24536,15 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@3.2.4(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + optional: true + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -24445,7 +24574,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -25039,6 +25168,108 @@ snapshots: - uploadthing - yaml + astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/markdown-remark': 6.3.9 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 3.0.1 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.1 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.1.0 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.5.0 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.12 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.1 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.5.0 + piccolore: 0.1.3 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.3 + shiki: 3.15.0 + smol-toml: 1.5.2 + svgo: 4.0.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.6.0 + unist-util-visit: 5.0.0 + unstorage: 1.17.3(@netlify/blobs@10.4.1)(ioredis@5.8.2) + vfile: 6.0.3 + vite: 6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 @@ -26127,13 +26358,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@24.10.1): + create-jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.10.1) + jest-config: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26998,9 +27229,9 @@ snapshots: '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-expo: 1.0.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 @@ -27015,9 +27246,9 @@ snapshots: '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.39.1(jiti@2.6.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-expo: 0.1.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 @@ -27087,7 +27318,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -27098,7 +27329,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + get-tsconfig: 4.13.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -27122,25 +27368,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -27240,7 +27486,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -27251,7 +27497,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -27269,7 +27515,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -27280,7 +27526,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -28421,54 +28667,7 @@ snapshots: - '@types/react-dom' - supports-color - expo-router@6.0.15(jiucxy5ca3jdtbnulaxuc46jdq): - dependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - '@expo/schema-utils': 0.1.7 - '@radix-ui/react-slot': 1.2.0(@types/react@19.2.7)(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-navigation/bottom-tabs': 7.8.6(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - '@react-navigation/native-stack': 7.8.0(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - client-only: 0.0.1 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)) - expo-linking: 8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - expo-server: 1.0.4 - fast-deep-equal: 3.1.3 - invariant: 2.2.4 - nanoid: 3.3.11 - query-string: 7.1.3 - react: 19.1.0 - react-fast-compare: 3.2.2 - react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0) - react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - semver: 7.6.3 - server-only: 0.0.1 - sf-symbols-typescript: 2.1.0 - shallowequal: 1.1.0 - use-latest-callback: 0.2.6(react@19.1.0) - vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - optionalDependencies: - '@react-navigation/drawer': 7.7.4(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.6.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - '@testing-library/react-native': 13.3.3(jest@30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0) - react-dom: 19.1.0(react@19.1.0) - react-native-gesture-handler: 2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.6.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.27.0)) - transitivePeerDependencies: - - '@react-native-masked-view/masked-view' - - '@types/react' - - '@types/react-dom' - - supports-color - optional: true - - expo-router@6.0.15(ohit2up6tuxb3x34brxduivol4): + expo-router@6.0.15(nttrd3tw67nnyhowcwgdzipb5e): dependencies: '@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) '@expo/schema-utils': 0.1.7 @@ -28502,12 +28701,12 @@ snapshots: vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) optionalDependencies: '@react-navigation/drawer': 7.7.4(@react-navigation/native@7.1.21(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.6.1(@babel/core@7.28.5)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0) + '@testing-library/react-native': 13.3.3(jest@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0) react-dom: 19.1.0(react@19.1.0) react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.6.1(@babel/core@7.28.5)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.19.12)) + react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.97.1(esbuild@0.19.12)) transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@types/react' @@ -29365,6 +29564,23 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(esbuild@0.19.12)): + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 8.3.6(typescript@5.7.2) + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.7.3 + tapable: 2.3.0 + typescript: 5.7.2 + webpack: 5.97.1(esbuild@0.19.12) + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(esbuild@0.27.0)): dependencies: '@babel/code-frame': 7.27.1 @@ -29399,23 +29615,6 @@ snapshots: typescript: 5.7.2 webpack: 5.97.1 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 4.1.2 - chokidar: 4.0.3 - cosmiconfig: 8.3.6(typescript@5.9.3) - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.3 - tapable: 2.3.0 - typescript: 5.9.3 - webpack: 5.100.2(esbuild@0.19.12) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)): dependencies: '@babel/code-frame': 7.27.1 @@ -29433,6 +29632,23 @@ snapshots: typescript: 5.9.3 webpack: 5.100.2(esbuild@0.27.0) + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.100.2): + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + chokidar: 4.0.3 + cosmiconfig: 8.3.6(typescript@5.9.3) + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.7.3 + tapable: 2.3.0 + typescript: 5.9.3 + webpack: 5.100.2 + form-data-encoder@1.7.2: {} form-data@3.0.4: @@ -30515,16 +30731,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@24.10.1): + jest-cli@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.10.1) + create-jest: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.10.1) + jest-config: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -30534,15 +30750,15 @@ snapshots: - supports-color - ts-node - jest-cli@30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)): + jest-cli@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.27.0)) + '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)) + jest-config: 30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -30612,36 +30828,6 @@ snapshots: - ts-node optional: true - jest-config@29.7.0(@types/node@22.19.1): - dependencies: - '@babel/core': 7.28.5 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.5) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.19.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.5 @@ -30673,7 +30859,38 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@24.10.1): + jest-config@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.28.5 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.5) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.19.1 + ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -30699,11 +30916,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 24.10.1 + ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)): + jest-config@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.5 '@jest/get-type': 30.1.0 @@ -30730,8 +30948,9 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.25 - esbuild-register: 3.6.0(esbuild@0.27.0) + '@types/node': 22.19.1 + esbuild-register: 3.6.0(esbuild@0.19.12) + ts-node: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -31380,24 +31599,24 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@24.10.1): + jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.10.1) + jest-cli: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)): + jest@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.27.0)) + '@jest/core': 30.2.0(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@20.19.25)(esbuild-register@3.6.0(esbuild@0.27.0)) + jest-cli: 30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -35011,16 +35230,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.19.12)): - dependencies: - acorn-loose: 8.5.2 - neo-async: 2.6.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - webpack: 5.100.2(esbuild@0.19.12) - webpack-sources: 3.3.3 - optional: true - react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.27.0)): dependencies: acorn-loose: 8.5.2 @@ -35030,6 +35239,16 @@ snapshots: webpack: 5.100.2(esbuild@0.27.0) webpack-sources: 3.3.3 + react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.97.1(esbuild@0.19.12)): + dependencies: + acorn-loose: 8.5.2 + neo-async: 2.6.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + webpack: 5.97.1(esbuild@0.19.12) + webpack-sources: 3.3.3 + optional: true + react-style-singleton@2.2.3(@types/react@18.3.27)(react@18.3.1): dependencies: get-nonce: 1.0.1 @@ -36252,14 +36471,14 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.100.2(esbuild@0.19.12)): + terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.97.1(esbuild@0.19.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.1 - webpack: 5.100.2(esbuild@0.19.12) + webpack: 5.97.1(esbuild@0.19.12) optionalDependencies: esbuild: 0.19.12 @@ -36285,6 +36504,15 @@ snapshots: optionalDependencies: esbuild: 0.27.0 + terser-webpack-plugin@5.3.14(webpack@5.100.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.100.2 + terser-webpack-plugin@5.3.14(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -36440,27 +36668,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.19.12)(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.8 - jest: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.3 - type-fest: 4.41.0 - typescript: 5.9.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.28.5 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.28.5) - esbuild: 0.19.12 - jest-util: 30.2.0 - ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.27.0)(jest-util@30.2.0)(jest@30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.27.0))(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 @@ -36482,15 +36689,25 @@ snapshots: esbuild: 0.27.0 jest-util: 30.2.0 - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)): + ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.18.3 - micromatch: 4.0.8 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 semver: 7.7.3 - source-map: 0.7.6 + type-fest: 4.41.0 typescript: 5.9.3 - webpack: 5.100.2(esbuild@0.19.12) + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) + jest-util: 30.2.0 ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)): dependencies: @@ -36502,7 +36719,7 @@ snapshots: typescript: 5.9.3 webpack: 5.100.2(esbuild@0.27.0) - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.27.0)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 @@ -36510,7 +36727,17 @@ snapshots: semver: 7.7.3 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.97.1(esbuild@0.27.0) + webpack: 5.100.2 + + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.19.12)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + micromatch: 4.0.8 + semver: 7.7.3 + source-map: 0.7.6 + typescript: 5.9.3 + webpack: 5.97.1(esbuild@0.19.12) ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3): dependencies: @@ -37126,6 +37353,23 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 + vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.30.2 + terser: 5.44.1 + tsx: 4.20.6 + yaml: 2.8.1 + vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.12 @@ -37185,6 +37429,10 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + optionalDependencies: + vite: 6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -37270,7 +37518,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.1 - '@vitest/browser': 3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.57.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 27.2.0 transitivePeerDependencies: @@ -37433,7 +37681,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.100.2(esbuild@0.19.12): + webpack@5.100.2: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -37457,7 +37705,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.19.12)(webpack@5.100.2(esbuild@0.19.12)) + terser-webpack-plugin: 5.3.14(webpack@5.100.2) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -37527,6 +37775,36 @@ snapshots: - esbuild - uglify-js + webpack@5.97.1(esbuild@0.19.12): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + browserslist: 4.28.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.19.12)(webpack@5.97.1(esbuild@0.19.12)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.97.1(esbuild@0.27.0): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/services/mana-core-auth/src/feedback/feedback.module.ts b/services/mana-core-auth/src/feedback/feedback.module.ts index 28893c629..2d8bc3f5e 100644 --- a/services/mana-core-auth/src/feedback/feedback.module.ts +++ b/services/mana-core-auth/src/feedback/feedback.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { FeedbackController } from './feedback.controller'; import { FeedbackService } from './feedback.service'; +import { JwtAuthGuard } from '../common/guards/jwt-auth.guard'; +import { OptionalAuthGuard } from '../common/guards/optional-auth.guard'; @Module({ controllers: [FeedbackController], - providers: [FeedbackService], + providers: [FeedbackService, JwtAuthGuard, OptionalAuthGuard], exports: [FeedbackService], }) export class FeedbackModule {}