@braintwopoint0/playback-commons 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -85,7 +85,8 @@ import {
85
85
  useEffect,
86
86
  useState,
87
87
  useMemo,
88
- useCallback
88
+ useCallback,
89
+ useRef
89
90
  } from "react";
90
91
  import { useRouter } from "next/navigation";
91
92
 
@@ -115,6 +116,8 @@ function AuthProvider({
115
116
  lastFetched: null
116
117
  });
117
118
  const router = useRouter();
119
+ const routerRef = useRef(router);
120
+ routerRef.current = router;
118
121
  const supabase = useMemo(() => createClient(), []);
119
122
  const isOnboardingComplete = useMemo(() => {
120
123
  return !!profile.data;
@@ -255,14 +258,14 @@ function AuthProvider({
255
258
  return;
256
259
  }
257
260
  if (event === "SIGNED_IN") {
258
- router.refresh();
261
+ routerRef.current.refresh();
259
262
  } else if (event === "SIGNED_OUT") {
260
- router.push("/");
261
- router.refresh();
263
+ routerRef.current.push("/");
264
+ routerRef.current.refresh();
262
265
  }
263
266
  });
264
267
  return () => subscription.unsubscribe();
265
- }, [supabase.auth, router]);
268
+ }, [supabase.auth]);
266
269
  const signUp = useCallback(
267
270
  async (email, password, metadata) => {
268
271
  setLoading(true);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/shared.ts","../../src/auth/context.tsx","../../src/supabase/client.ts"],"sourcesContent":["import { User } from '@supabase/supabase-js'\n\nexport function validateEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\nexport function validatePassword(password: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n }\n\n if (!/(?=.*[a-z])/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n }\n\n if (!/(?=.*[A-Z])/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n }\n\n if (!/(?=.*\\d)/.test(password)) {\n errors.push('Password must contain at least one number')\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n }\n}\n\nexport function validateUsername(username: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n if (username.length < 3) {\n errors.push('Username must be at least 3 characters long')\n }\n\n if (username.length > 30) {\n errors.push('Username cannot be longer than 30 characters')\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(username)) {\n errors.push(\n 'Username can only contain letters, numbers, underscores, and hyphens'\n )\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n }\n}\n\nexport function hasRole(user: User | null, role: string): boolean {\n if (!user) return false\n return user.user_metadata?.role === role\n}\n\nexport function hasAnyRole(user: User | null, roles: string[]): boolean {\n if (!user) return false\n return roles.includes(user.user_metadata?.role)\n}\n\nexport function isPlayer(user: User | null): boolean {\n return hasRole(user, 'player')\n}\n\nexport function isCoach(user: User | null): boolean {\n return hasRole(user, 'coach')\n}\n\nexport function isScout(user: User | null): boolean {\n return hasRole(user, 'scout')\n}\n\nexport function isFan(user: User | null): boolean {\n return hasRole(user, 'fan')\n}\n\nexport function getAuthErrorMessage(error: any): string {\n if (!error) return 'An unknown error occurred'\n\n const message = error.message || error.error_description || error.toString()\n\n const errorMappings: Record<string, string> = {\n 'Invalid login credentials':\n 'Invalid email or password. Please check your credentials and try again.',\n 'Email not confirmed':\n 'Please check your email and click the confirmation link before signing in.',\n 'User already registered':\n 'An account with this email address already exists. Please sign in instead.',\n 'Password should be at least 6 characters':\n 'Password must be at least 6 characters long.',\n 'Signup requires a valid password': 'Please provide a valid password.',\n 'Invalid email': 'Please provide a valid email address.',\n 'Email rate limit exceeded':\n 'Too many emails sent. Please wait before requesting another.',\n 'duplicate key value violates unique constraint \"profiles_username_key\"':\n 'This username is already taken. Please choose a different username.',\n }\n\n return errorMappings[message] || message\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo,\n useCallback,\n} from 'react'\nimport { User, Session, AuthError } from '@supabase/supabase-js'\nimport { useRouter } from 'next/navigation'\nimport { createClient } from '../supabase/client'\n\ninterface UserProfile {\n id: string\n user_id: string\n username: string\n email: string | null\n full_name: string | null\n bio: string | null\n avatar_url: string | null\n cover_image_url: string | null\n date_of_birth: string | null\n height_cm: number | null\n weight_kg: number | null\n nationality: string | null\n location: string | null\n phone: string | null\n website: string | null\n social_links: any\n is_public: boolean | null\n created_at: string | null\n updated_at: string | null\n}\n\ninterface ProfileState {\n data: UserProfile | null\n loading: boolean\n error: string | null\n lastFetched: number | null\n}\n\ninterface AuthContextType {\n user: User | null\n session: Session | null\n loading: boolean\n profile: ProfileState\n isOnboardingComplete: boolean\n signUp: (\n email: string,\n password: string,\n metadata?: Record<string, any>\n ) => Promise<{ data: any; error: AuthError | null }>\n signIn: (\n email: string,\n password: string\n ) => Promise<{ error: AuthError | null }>\n signOut: () => Promise<{ error: AuthError | null }>\n resetPassword: (email: string) => Promise<{ error: AuthError | null }>\n refreshProfile: (force?: boolean) => Promise<void>\n updateProfile: (updates: Partial<UserProfile>) => void\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined)\n\nconst CACHE_TIMEOUT = 5 * 60 * 1000\n\nexport function AuthProvider({\n children,\n}: {\n children: React.ReactNode\n}) {\n const [user, setUser] = useState<User | null>(null)\n const [session, setSession] = useState<Session | null>(null)\n const [loading, setLoading] = useState(true)\n const [profile, setProfile] = useState<ProfileState>({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n\n const router = useRouter()\n const supabase = useMemo(() => createClient(), [])\n\n const isOnboardingComplete = useMemo(() => {\n return !!profile.data\n }, [profile.data])\n\n const fetchProfile = useCallback(\n async (userId: string) => {\n try {\n const { data: profileData, error: profileError } = await supabase\n .from('profiles')\n .select('*')\n .eq('user_id', userId)\n .single()\n\n if (profileError) throw profileError\n\n return { data: profileData, error: null }\n } catch (error) {\n return {\n data: null,\n error:\n error instanceof Error ? error.message : 'Failed to fetch profile',\n }\n }\n },\n [supabase]\n )\n\n const refreshProfile = useCallback(\n async (force = false) => {\n if (!user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n return\n }\n\n const now = Date.now()\n const isCacheValid =\n profile.lastFetched && now - profile.lastFetched < CACHE_TIMEOUT\n\n if (!force && isCacheValid && profile.data) {\n return\n }\n\n setProfile((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const result = await fetchProfile(user.id)\n setProfile({\n data: result.data,\n loading: false,\n error: result.error,\n lastFetched: now,\n })\n } catch (error) {\n setProfile((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }))\n }\n },\n [user, profile.lastFetched, profile.data, fetchProfile]\n )\n\n const updateProfile = useCallback((updates: Partial<UserProfile>) => {\n setProfile((prev) => ({\n ...prev,\n data: prev.data ? { ...prev.data, ...updates } : null,\n }))\n }, [])\n\n useEffect(() => {\n const initializeAuth = async () => {\n try {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error) {\n console.error('Error getting session:', error)\n } else {\n setSession(session)\n setUser(session?.user ?? null)\n\n if (session?.user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n }\n }\n } catch (error) {\n console.error('Session initialization error:', error)\n } finally {\n setLoading(false)\n }\n }\n\n initializeAuth()\n }, [supabase.auth])\n\n useEffect(() => {\n if (!loading && user && !profile.data && !profile.loading) {\n const loadProfile = async () => {\n setProfile((prev) => ({ ...prev, loading: true, error: null }))\n try {\n const result = await fetchProfile(user.id)\n setProfile({\n data: result.data,\n loading: false,\n error: result.error,\n lastFetched: Date.now(),\n })\n } catch (error) {\n setProfile((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }))\n }\n }\n loadProfile()\n }\n }, [loading, user, profile.data, profile.loading, fetchProfile])\n\n useEffect(() => {\n let isInitialEvent = true\n\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange(async (event, session) => {\n setSession(session)\n setUser(session?.user ?? null)\n setLoading(false)\n\n if (session?.user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n } else {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n }\n\n // Skip router actions on initial mount to avoid refresh loops\n if (isInitialEvent) {\n isInitialEvent = false\n return\n }\n\n if (event === 'SIGNED_IN') {\n router.refresh()\n } else if (event === 'SIGNED_OUT') {\n router.push('/')\n router.refresh()\n }\n })\n\n return () => subscription.unsubscribe()\n }, [supabase.auth, router])\n\n const signUp = useCallback(\n async (email: string, password: string, metadata?: Record<string, any>) => {\n setLoading(true)\n try {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: {\n data: metadata,\n emailRedirectTo: `${window.location.origin}/auth/callback`,\n },\n })\n return { data, error }\n } finally {\n setLoading(false)\n }\n },\n [supabase.auth]\n )\n\n const signIn = useCallback(\n async (email: string, password: string) => {\n setLoading(true)\n try {\n const { error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n return { error }\n } finally {\n setLoading(false)\n }\n },\n [supabase.auth]\n )\n\n const signOut = useCallback(async () => {\n setLoading(true)\n try {\n const { error } = await supabase.auth.signOut()\n return { error }\n } finally {\n setLoading(false)\n }\n }, [supabase.auth])\n\n const resetPassword = useCallback(\n async (email: string) => {\n const { error } = await supabase.auth.resetPasswordForEmail(email, {\n redirectTo: `${window.location.origin}/auth/reset-password`,\n })\n return { error }\n },\n [supabase.auth]\n )\n\n const value = useMemo(\n () => ({\n user,\n session,\n loading,\n profile,\n isOnboardingComplete,\n signUp,\n signIn,\n signOut,\n resetPassword,\n refreshProfile,\n updateProfile,\n }),\n [\n user,\n session,\n loading,\n profile,\n isOnboardingComplete,\n refreshProfile,\n updateProfile,\n signIn,\n signOut,\n resetPassword,\n signUp,\n ]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\nexport function useAuth() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n return context\n}\n\nexport function useProfile() {\n const { profile, refreshProfile, updateProfile } = useAuth()\n return { profile, refreshProfile, updateProfile }\n}\n\nexport function useOnboardingStatus() {\n const { isOnboardingComplete, profile } = useAuth()\n return {\n isComplete: isOnboardingComplete,\n loading: profile.loading,\n error: profile.error,\n }\n}\n","import { createBrowserClient } from '@supabase/ssr'\n\nexport function createClient() {\n return createBrowserClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!\n )\n}\n"],"mappings":"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","names":["session"]}
1
+ {"version":3,"sources":["../../src/auth/shared.ts","../../src/auth/context.tsx","../../src/supabase/client.ts"],"sourcesContent":["import { User } from '@supabase/supabase-js'\n\nexport function validateEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\nexport function validatePassword(password: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n }\n\n if (!/(?=.*[a-z])/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n }\n\n if (!/(?=.*[A-Z])/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n }\n\n if (!/(?=.*\\d)/.test(password)) {\n errors.push('Password must contain at least one number')\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n }\n}\n\nexport function validateUsername(username: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n if (username.length < 3) {\n errors.push('Username must be at least 3 characters long')\n }\n\n if (username.length > 30) {\n errors.push('Username cannot be longer than 30 characters')\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(username)) {\n errors.push(\n 'Username can only contain letters, numbers, underscores, and hyphens'\n )\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n }\n}\n\nexport function hasRole(user: User | null, role: string): boolean {\n if (!user) return false\n return user.user_metadata?.role === role\n}\n\nexport function hasAnyRole(user: User | null, roles: string[]): boolean {\n if (!user) return false\n return roles.includes(user.user_metadata?.role)\n}\n\nexport function isPlayer(user: User | null): boolean {\n return hasRole(user, 'player')\n}\n\nexport function isCoach(user: User | null): boolean {\n return hasRole(user, 'coach')\n}\n\nexport function isScout(user: User | null): boolean {\n return hasRole(user, 'scout')\n}\n\nexport function isFan(user: User | null): boolean {\n return hasRole(user, 'fan')\n}\n\nexport function getAuthErrorMessage(error: any): string {\n if (!error) return 'An unknown error occurred'\n\n const message = error.message || error.error_description || error.toString()\n\n const errorMappings: Record<string, string> = {\n 'Invalid login credentials':\n 'Invalid email or password. Please check your credentials and try again.',\n 'Email not confirmed':\n 'Please check your email and click the confirmation link before signing in.',\n 'User already registered':\n 'An account with this email address already exists. Please sign in instead.',\n 'Password should be at least 6 characters':\n 'Password must be at least 6 characters long.',\n 'Signup requires a valid password': 'Please provide a valid password.',\n 'Invalid email': 'Please provide a valid email address.',\n 'Email rate limit exceeded':\n 'Too many emails sent. Please wait before requesting another.',\n 'duplicate key value violates unique constraint \"profiles_username_key\"':\n 'This username is already taken. Please choose a different username.',\n }\n\n return errorMappings[message] || message\n}\n","'use client'\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo,\n useCallback,\n useRef,\n} from 'react'\nimport { User, Session, AuthError } from '@supabase/supabase-js'\nimport { useRouter } from 'next/navigation'\nimport { createClient } from '../supabase/client'\n\ninterface UserProfile {\n id: string\n user_id: string\n username: string\n email: string | null\n full_name: string | null\n bio: string | null\n avatar_url: string | null\n cover_image_url: string | null\n date_of_birth: string | null\n height_cm: number | null\n weight_kg: number | null\n nationality: string | null\n location: string | null\n phone: string | null\n website: string | null\n social_links: any\n is_public: boolean | null\n created_at: string | null\n updated_at: string | null\n}\n\ninterface ProfileState {\n data: UserProfile | null\n loading: boolean\n error: string | null\n lastFetched: number | null\n}\n\ninterface AuthContextType {\n user: User | null\n session: Session | null\n loading: boolean\n profile: ProfileState\n isOnboardingComplete: boolean\n signUp: (\n email: string,\n password: string,\n metadata?: Record<string, any>\n ) => Promise<{ data: any; error: AuthError | null }>\n signIn: (\n email: string,\n password: string\n ) => Promise<{ error: AuthError | null }>\n signOut: () => Promise<{ error: AuthError | null }>\n resetPassword: (email: string) => Promise<{ error: AuthError | null }>\n refreshProfile: (force?: boolean) => Promise<void>\n updateProfile: (updates: Partial<UserProfile>) => void\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined)\n\nconst CACHE_TIMEOUT = 5 * 60 * 1000\n\nexport function AuthProvider({\n children,\n}: {\n children: React.ReactNode\n}) {\n const [user, setUser] = useState<User | null>(null)\n const [session, setSession] = useState<Session | null>(null)\n const [loading, setLoading] = useState(true)\n const [profile, setProfile] = useState<ProfileState>({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n\n const router = useRouter()\n const routerRef = useRef(router)\n routerRef.current = router\n const supabase = useMemo(() => createClient(), [])\n\n const isOnboardingComplete = useMemo(() => {\n return !!profile.data\n }, [profile.data])\n\n const fetchProfile = useCallback(\n async (userId: string) => {\n try {\n const { data: profileData, error: profileError } = await supabase\n .from('profiles')\n .select('*')\n .eq('user_id', userId)\n .single()\n\n if (profileError) throw profileError\n\n return { data: profileData, error: null }\n } catch (error) {\n return {\n data: null,\n error:\n error instanceof Error ? error.message : 'Failed to fetch profile',\n }\n }\n },\n [supabase]\n )\n\n const refreshProfile = useCallback(\n async (force = false) => {\n if (!user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n return\n }\n\n const now = Date.now()\n const isCacheValid =\n profile.lastFetched && now - profile.lastFetched < CACHE_TIMEOUT\n\n if (!force && isCacheValid && profile.data) {\n return\n }\n\n setProfile((prev) => ({ ...prev, loading: true, error: null }))\n\n try {\n const result = await fetchProfile(user.id)\n setProfile({\n data: result.data,\n loading: false,\n error: result.error,\n lastFetched: now,\n })\n } catch (error) {\n setProfile((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }))\n }\n },\n [user, profile.lastFetched, profile.data, fetchProfile]\n )\n\n const updateProfile = useCallback((updates: Partial<UserProfile>) => {\n setProfile((prev) => ({\n ...prev,\n data: prev.data ? { ...prev.data, ...updates } : null,\n }))\n }, [])\n\n useEffect(() => {\n const initializeAuth = async () => {\n try {\n const {\n data: { session },\n error,\n } = await supabase.auth.getSession()\n\n if (error) {\n console.error('Error getting session:', error)\n } else {\n setSession(session)\n setUser(session?.user ?? null)\n\n if (session?.user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n }\n }\n } catch (error) {\n console.error('Session initialization error:', error)\n } finally {\n setLoading(false)\n }\n }\n\n initializeAuth()\n }, [supabase.auth])\n\n useEffect(() => {\n if (!loading && user && !profile.data && !profile.loading) {\n const loadProfile = async () => {\n setProfile((prev) => ({ ...prev, loading: true, error: null }))\n try {\n const result = await fetchProfile(user.id)\n setProfile({\n data: result.data,\n loading: false,\n error: result.error,\n lastFetched: Date.now(),\n })\n } catch (error) {\n setProfile((prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }))\n }\n }\n loadProfile()\n }\n }, [loading, user, profile.data, profile.loading, fetchProfile])\n\n useEffect(() => {\n let isInitialEvent = true\n\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange(async (event, session) => {\n setSession(session)\n setUser(session?.user ?? null)\n setLoading(false)\n\n if (session?.user) {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n } else {\n setProfile({\n data: null,\n loading: false,\n error: null,\n lastFetched: null,\n })\n }\n\n // Skip router actions on initial mount to avoid refresh loops\n if (isInitialEvent) {\n isInitialEvent = false\n return\n }\n\n if (event === 'SIGNED_IN') {\n routerRef.current.refresh()\n } else if (event === 'SIGNED_OUT') {\n routerRef.current.push('/')\n routerRef.current.refresh()\n }\n })\n\n return () => subscription.unsubscribe()\n }, [supabase.auth])\n\n const signUp = useCallback(\n async (email: string, password: string, metadata?: Record<string, any>) => {\n setLoading(true)\n try {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: {\n data: metadata,\n emailRedirectTo: `${window.location.origin}/auth/callback`,\n },\n })\n return { data, error }\n } finally {\n setLoading(false)\n }\n },\n [supabase.auth]\n )\n\n const signIn = useCallback(\n async (email: string, password: string) => {\n setLoading(true)\n try {\n const { error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n return { error }\n } finally {\n setLoading(false)\n }\n },\n [supabase.auth]\n )\n\n const signOut = useCallback(async () => {\n setLoading(true)\n try {\n const { error } = await supabase.auth.signOut()\n return { error }\n } finally {\n setLoading(false)\n }\n }, [supabase.auth])\n\n const resetPassword = useCallback(\n async (email: string) => {\n const { error } = await supabase.auth.resetPasswordForEmail(email, {\n redirectTo: `${window.location.origin}/auth/reset-password`,\n })\n return { error }\n },\n [supabase.auth]\n )\n\n const value = useMemo(\n () => ({\n user,\n session,\n loading,\n profile,\n isOnboardingComplete,\n signUp,\n signIn,\n signOut,\n resetPassword,\n refreshProfile,\n updateProfile,\n }),\n [\n user,\n session,\n loading,\n profile,\n isOnboardingComplete,\n refreshProfile,\n updateProfile,\n signIn,\n signOut,\n resetPassword,\n signUp,\n ]\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n\nexport function useAuth() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n return context\n}\n\nexport function useProfile() {\n const { profile, refreshProfile, updateProfile } = useAuth()\n return { profile, refreshProfile, updateProfile }\n}\n\nexport function useOnboardingStatus() {\n const { isOnboardingComplete, profile } = useAuth()\n return {\n isComplete: isOnboardingComplete,\n loading: profile.loading,\n error: profile.error,\n }\n}\n","import { createBrowserClient } from '@supabase/ssr'\n\nexport function createClient() {\n return createBrowserClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!\n )\n}\n"],"mappings":"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","names":["session"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@braintwopoint0/playback-commons",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Shared UI components, auth utilities, and Supabase client for the PLAYBACK Sports ecosystem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",