Compare commits

...

11 Commits

Author SHA1 Message Date
0888cca45b fix(deps): update dependency lucide-react to ^0.526.0
All checks were successful
Lint / Lint and Check (push) Successful in 54s
2025-07-26 20:04:14 +00:00
5314c98508 chore(deps): update typescript-eslint monorepo to v8.38.0
All checks were successful
Lint / Lint and Check (push) Successful in 52s
2025-07-26 03:07:57 +00:00
484047a7bd chore(deps): update eslint monorepo to v9.32.0
All checks were successful
Lint / Lint and Check (push) Successful in 47s
2025-07-26 02:12:19 +00:00
80d95065e8 fix(deps): update nextjs monorepo to v15.4.4
All checks were successful
Lint / Lint and Check (push) Successful in 45s
2025-07-26 01:10:21 +00:00
5386dad5c9 fix(deps): update dependency dotenv to v17.2.1
All checks were successful
Lint / Lint and Check (push) Successful in 45s
2025-07-26 00:07:16 +00:00
4e63d0ac42 fix(deps): update nextjs monorepo to v15.4.2
All checks were successful
Lint / Lint and Check (push) Successful in 44s
2025-07-19 03:06:17 +00:00
485e75dc93 chore(deps): update dependency turbo to v2.5.5
All checks were successful
Lint / Lint and Check (push) Successful in 52s
2025-07-19 02:10:23 +00:00
49c8389d9d chore(deps): update dependency @types/node to v22.16.5
All checks were successful
Lint / Lint and Check (push) Successful in 44s
2025-07-19 01:09:05 +00:00
92a27f544b chore(deps): pin dependencies
All checks were successful
Lint / Lint and Check (push) Successful in 1m4s
2025-07-19 00:06:53 +00:00
b02f5e6364 linter fixes, env fixes
All checks were successful
Lint / Lint and Check (push) Successful in 51s
2025-07-15 23:15:32 +02:00
f5fff9c52b fix not able to install on nixos 2025-07-15 21:59:57 +02:00
11 changed files with 405 additions and 303 deletions

View File

@@ -4,16 +4,17 @@ import { generateMemorableToken, isValidToken } from '@/lib/auth/tokens';
import { setTokenCookie, getTokenCookie } from '@/lib/auth/cookies'; import { setTokenCookie, getTokenCookie } from '@/lib/auth/cookies';
import { eq } from 'drizzle-orm'; import { eq } from 'drizzle-orm';
export async function GET(request: NextRequest) { export async function GET() {
try { try {
// Check if user already has a token // Check if user already has a token
const existingToken = await getTokenCookie(); const existingToken = await getTokenCookie();
if (existingToken) { if (existingToken) {
// Verify token exists in database // Verify token exists in database
const [user] = await db.select().from(users).where(eq(users.token, existingToken)); const userRows = await db.select().from(users).where(eq(users.token, existingToken));
if (user) { if (userRows.length > 0) {
const user = userRows[0];
return NextResponse.json({ return NextResponse.json({
authenticated: true, authenticated: true,
token: existingToken, token: existingToken,
@@ -31,20 +32,25 @@ export async function GET(request: NextRequest) {
export async function POST(request: NextRequest) { export async function POST(request: NextRequest) {
try { try {
const body = await request.json(); const body = (await request.json()) as { action: string; token?: string };
const { action, token } = body; const { action, token } = body;
if (action === 'create') { if (action === 'create') {
// Generate new token and create user // Generate new token and create user
const newToken = generateMemorableToken(); const newToken = generateMemorableToken();
const [newUser] = await db const newUserRows = await db
.insert(users) .insert(users)
.values({ .values({
token: newToken, token: newToken,
}) })
.returning(); .returning();
if (newUserRows.length === 0) {
throw new Error('Failed to create user');
}
const newUser = newUserRows[0];
await setTokenCookie(newToken); await setTokenCookie(newToken);
return NextResponse.json({ return NextResponse.json({
@@ -67,9 +73,9 @@ export async function POST(request: NextRequest) {
} }
// Check if token exists // Check if token exists
const [user] = await db.select().from(users).where(eq(users.token, token)); const userRows = await db.select().from(users).where(eq(users.token, token));
if (!user) { if (userRows.length === 0) {
return NextResponse.json( return NextResponse.json(
{ {
success: false, success: false,
@@ -79,6 +85,7 @@ export async function POST(request: NextRequest) {
); );
} }
const user = userRows[0];
await setTokenCookie(token); await setTokenCookie(token);
return NextResponse.json({ return NextResponse.json({

View File

@@ -7,8 +7,8 @@ async function getUserFromToken() {
const token = await getTokenCookie(); const token = await getTokenCookie();
if (!token) return null; if (!token) return null;
const [user] = await db.select().from(users).where(eq(users.token, token)); const userRows = await db.select().from(users).where(eq(users.token, token));
return user; return userRows.length > 0 ? userRows[0] : null;
} }
export async function POST(request: NextRequest, { params }: { params: Promise<{ id: string }> }) { export async function POST(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
@@ -26,20 +26,20 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
} }
// Verify habit belongs to user // Verify habit belongs to user
const [habit] = await db const habitRows = await db
.select() .select()
.from(habits) .from(habits)
.where(and(eq(habits.id, habitId), eq(habits.userId, user.id))); .where(and(eq(habits.id, habitId), eq(habits.userId, user.id)));
if (!habit) { if (habitRows.length === 0) {
return NextResponse.json({ error: 'Habit not found' }, { status: 404 }); return NextResponse.json({ error: 'Habit not found' }, { status: 404 });
} }
const body = await request.json(); const body = (await request.json()) as { note?: string };
const { note } = body; const { note } = body;
// Create log entry // Create log entry
const [log] = await db const logRows = await db
.insert(habitLogs) .insert(habitLogs)
.values({ .values({
habitId, habitId,
@@ -47,6 +47,11 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
}) })
.returning(); .returning();
if (logRows.length === 0) {
throw new Error('Failed to create log entry');
}
const log = logRows[0];
return NextResponse.json({ log }); return NextResponse.json({ log });
} catch (error) { } catch (error) {
console.error('Log habit error:', error); console.error('Log habit error:', error);

View File

@@ -7,11 +7,11 @@ async function getUserFromToken() {
const token = await getTokenCookie(); const token = await getTokenCookie();
if (!token) return null; if (!token) return null;
const [user] = await db.select().from(users).where(eq(users.token, token)); const userRows = await db.select().from(users).where(eq(users.token, token));
return user; return userRows.length > 0 ? userRows[0] : null;
} }
export async function GET(request: NextRequest) { export async function GET() {
try { try {
const user = await getUserFromToken(); const user = await getUserFromToken();
if (!user) { if (!user) {
@@ -83,7 +83,13 @@ export async function POST(request: NextRequest) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
} }
const body = await request.json(); const body = (await request.json()) as {
name: string;
type: string;
targetFrequency?: { value: number; period: 'day' | 'week' | 'month' };
color?: string;
icon?: string;
};
const { name, type, targetFrequency, color, icon } = body; const { name, type, targetFrequency, color, icon } = body;
if (!name || !type) { if (!name || !type) {
@@ -95,18 +101,33 @@ export async function POST(request: NextRequest) {
); );
} }
const [newHabit] = await db // Validate type is one of the allowed enum values
if (!['positive', 'neutral', 'negative'].includes(type)) {
return NextResponse.json(
{
error: 'Type must be one of: positive, neutral, negative',
},
{ status: 400 },
);
}
const newHabitRows = await db
.insert(habits) .insert(habits)
.values({ .values({
userId: user.id, userId: user.id,
name, name,
type, type: type as 'positive' | 'neutral' | 'negative',
targetFrequency, targetFrequency,
color, color,
icon, icon,
}) })
.returning(); .returning();
if (newHabitRows.length === 0) {
throw new Error('Failed to create habit');
}
const newHabit = newHabitRows[0];
return NextResponse.json({ habit: newHabit }); return NextResponse.json({ habit: newHabit });
} catch (error) { } catch (error) {
console.error('Create habit error:', error); console.error('Create habit error:', error);

View File

@@ -36,6 +36,12 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
import { Separator } from '@/components/ui/separator'; import { Separator } from '@/components/ui/separator';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
interface AuthData {
authenticated: boolean;
token?: string;
userId?: string;
}
interface Habit { interface Habit {
id: number; id: number;
name: string; name: string;
@@ -47,6 +53,23 @@ interface Habit {
createdAt: string; createdAt: string;
} }
interface HabitsResponse {
habits: Habit[];
}
interface LogResponse {
log: {
id: number;
habitId: number;
loggedAt: string;
note?: string;
};
}
interface HabitResponse {
habit: Habit;
}
export default function Dashboard() { export default function Dashboard() {
const router = useRouter(); const router = useRouter();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
@@ -57,11 +80,11 @@ export default function Dashboard() {
const [copiedToken, setCopiedToken] = useState(false); const [copiedToken, setCopiedToken] = useState(false);
// Check authentication // Check authentication
const { data: authData, isLoading: authLoading } = useQuery({ const { data: authData, isLoading: authLoading } = useQuery<AuthData>({
queryKey: ['auth'], queryKey: ['auth'],
queryFn: async () => { queryFn: async (): Promise<AuthData> => {
const res = await fetch('/api/auth'); const res = await fetch('/api/auth');
const data = await res.json(); const data = (await res.json()) as AuthData;
if (!data.authenticated) { if (!data.authenticated) {
router.push('/'); router.push('/');
} }
@@ -76,45 +99,45 @@ export default function Dashboard() {
}, [authData]); }, [authData]);
// Fetch habits // Fetch habits
const { data: habitsData, isLoading: habitsLoading } = useQuery({ const { data: habitsData, isLoading: habitsLoading } = useQuery<HabitsResponse>({
queryKey: ['habits'], queryKey: ['habits'],
queryFn: async () => { queryFn: async (): Promise<HabitsResponse> => {
const res = await fetch('/api/habits'); const res = await fetch('/api/habits');
if (!res.ok) throw new Error('Failed to fetch habits'); if (!res.ok) throw new Error('Failed to fetch habits');
return res.json(); return res.json() as Promise<HabitsResponse>;
}, },
enabled: !!authData?.authenticated, enabled: !!authData?.authenticated,
}); });
// Log habit mutation // Log habit mutation
const logHabitMutation = useMutation({ const logHabitMutation = useMutation<LogResponse, Error, number>({
mutationFn: async (habitId: number) => { mutationFn: async (habitId: number): Promise<LogResponse> => {
const res = await fetch(`/api/habits/${habitId}/log`, { const res = await fetch(`/api/habits/${String(habitId)}/log`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}), body: JSON.stringify({}),
}); });
if (!res.ok) throw new Error('Failed to log habit'); if (!res.ok) throw new Error('Failed to log habit');
return res.json(); return res.json() as Promise<LogResponse>;
}, },
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['habits'] }); void queryClient.invalidateQueries({ queryKey: ['habits'] });
}, },
}); });
// Create habit mutation // Create habit mutation
const createHabitMutation = useMutation({ const createHabitMutation = useMutation<HabitResponse, Error, { name: string; type: string }>({
mutationFn: async (data: { name: string; type: string }) => { mutationFn: async (data: { name: string; type: string }): Promise<HabitResponse> => {
const res = await fetch('/api/habits', { const res = await fetch('/api/habits', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data), body: JSON.stringify(data),
}); });
if (!res.ok) throw new Error('Failed to create habit'); if (!res.ok) throw new Error('Failed to create habit');
return res.json(); return res.json() as Promise<HabitResponse>;
}, },
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['habits'] }); void queryClient.invalidateQueries({ queryKey: ['habits'] });
setShowNewHabitDialog(false); setShowNewHabitDialog(false);
setNewHabitName(''); setNewHabitName('');
setNewHabitType('neutral'); setNewHabitType('neutral');
@@ -132,9 +155,11 @@ export default function Dashboard() {
const copyToken = () => { const copyToken = () => {
if (userToken) { if (userToken) {
navigator.clipboard.writeText(userToken); void navigator.clipboard.writeText(userToken);
setCopiedToken(true); setCopiedToken(true);
setTimeout(() => setCopiedToken(false), 2000); setTimeout(() => {
setCopiedToken(false);
}, 2000);
} }
}; };
@@ -199,7 +224,7 @@ export default function Dashboard() {
); );
} }
const habits = habitsData?.habits || []; const habits = habitsData?.habits ?? [];
return ( return (
<div className="min-h-screen bg-black"> <div className="min-h-screen bg-black">
@@ -233,13 +258,20 @@ export default function Dashboard() {
id="name" id="name"
placeholder="e.g., Exercise, Read, Meditate..." placeholder="e.g., Exercise, Read, Meditate..."
value={newHabitName} value={newHabitName}
onChange={(e) => setNewHabitName(e.target.value)} onChange={(e) => {
setNewHabitName(e.target.value);
}}
className="border-zinc-800 bg-zinc-900" className="border-zinc-800 bg-zinc-900"
/> />
</div> </div>
<div className="grid gap-2"> <div className="grid gap-2">
<Label htmlFor="type">Habit Type</Label> <Label htmlFor="type">Habit Type</Label>
<Select value={newHabitType} onValueChange={(value: any) => setNewHabitType(value)}> <Select
value={newHabitType}
onValueChange={(value: 'positive' | 'neutral' | 'negative') => {
setNewHabitType(value);
}}
>
<SelectTrigger className="border-zinc-800 bg-zinc-900"> <SelectTrigger className="border-zinc-800 bg-zinc-900">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@@ -267,7 +299,12 @@ export default function Dashboard() {
</div> </div>
</div> </div>
<DialogFooter> <DialogFooter>
<Button variant="outline" onClick={() => setShowNewHabitDialog(false)}> <Button
variant="outline"
onClick={() => {
setShowNewHabitDialog(false);
}}
>
Cancel Cancel
</Button> </Button>
<Button <Button
@@ -317,7 +354,9 @@ export default function Dashboard() {
className={`transform cursor-pointer transition-all duration-200 hover:scale-[1.02] ${getHabitCardClass( className={`transform cursor-pointer transition-all duration-200 hover:scale-[1.02] ${getHabitCardClass(
habit.type, habit.type,
)} ${logHabitMutation.isPending ? 'opacity-75' : ''}`} )} ${logHabitMutation.isPending ? 'opacity-75' : ''}`}
onClick={() => logHabitMutation.mutate(habit.id)} onClick={() => {
logHabitMutation.mutate(habit.id);
}}
> >
<CardHeader className="pb-3"> <CardHeader className="pb-3">
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
@@ -384,7 +423,9 @@ export default function Dashboard() {
<h3 className="mb-2 text-lg font-semibold">No habits yet</h3> <h3 className="mb-2 text-lg font-semibold">No habits yet</h3>
<p className="mb-4 text-sm text-zinc-500">Start building better habits today</p> <p className="mb-4 text-sm text-zinc-500">Start building better habits today</p>
<Button <Button
onClick={() => setShowNewHabitDialog(true)} onClick={() => {
setShowNewHabitDialog(true);
}}
className="bg-emerald-600 hover:bg-emerald-700" className="bg-emerald-600 hover:bg-emerald-700"
> >
<Plus className="mr-2 h-4 w-4" /> <Plus className="mr-2 h-4 w-4" />

View File

@@ -9,7 +9,14 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label'; import { Label } from '@/components/ui/label';
import { Alert, AlertDescription } from '@/components/ui/alert'; import { Alert, AlertDescription } from '@/components/ui/alert';
import { Separator } from '@/components/ui/separator'; import { Separator } from '@/components/ui/separator';
import { LogIn, Sparkles, Shield, Zap, ArrowLeft } from 'lucide-react'; import { LogIn, Shield, Zap, ArrowLeft, Activity, CalendarCheck } from 'lucide-react';
interface AuthResponse {
success?: boolean;
token?: string;
userId?: string;
error?: string;
}
export default function Welcome() { export default function Welcome() {
const router = useRouter(); const router = useRouter();
@@ -18,14 +25,14 @@ export default function Welcome() {
const [error, setError] = useState(''); const [error, setError] = useState('');
const createAccountMutation = useMutation({ const createAccountMutation = useMutation({
mutationFn: async () => { mutationFn: async (): Promise<AuthResponse> => {
const res = await fetch('/api/auth', { const res = await fetch('/api/auth', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'create' }), body: JSON.stringify({ action: 'create' }),
}); });
if (!res.ok) throw new Error('Failed to create account'); if (!res.ok) throw new Error('Failed to create account');
return res.json(); return res.json() as Promise<AuthResponse>;
}, },
onSuccess: () => { onSuccess: () => {
router.push('/dashboard'); router.push('/dashboard');
@@ -36,17 +43,17 @@ export default function Welcome() {
}); });
const loginMutation = useMutation({ const loginMutation = useMutation({
mutationFn: async (token: string) => { mutationFn: async (token: string): Promise<AuthResponse> => {
const res = await fetch('/api/auth', { const res = await fetch('/api/auth', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'login', token }), body: JSON.stringify({ action: 'login', token }),
}); });
if (!res.ok) { if (!res.ok) {
const data = await res.json(); const data = (await res.json()) as AuthResponse;
throw new Error(data.error || 'Failed to login'); throw new Error(data.error ?? 'Failed to login');
} }
return res.json(); return res.json() as Promise<AuthResponse>;
}, },
onSuccess: () => { onSuccess: () => {
router.push('/dashboard'); router.push('/dashboard');
@@ -63,6 +70,12 @@ export default function Welcome() {
} }
}; };
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
handleTokenLogin();
}
};
return ( return (
<Card className="w-full max-w-md border-zinc-800 bg-zinc-950"> <Card className="w-full max-w-md border-zinc-800 bg-zinc-950">
<CardHeader className="space-y-2 text-center"> <CardHeader className="space-y-2 text-center">
@@ -93,7 +106,7 @@ export default function Welcome() {
</div> </div>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-emerald-950"> <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-emerald-950">
<Sparkles className="h-4 w-4 text-emerald-500" /> <Activity className="h-4 w-4 text-emerald-500" />
</div> </div>
<p className="text-zinc-400">Track positive, neutral, or negative habits</p> <p className="text-zinc-400">Track positive, neutral, or negative habits</p>
</div> </div>
@@ -104,7 +117,9 @@ export default function Welcome() {
{/* Actions */} {/* Actions */}
<div className="space-y-3"> <div className="space-y-3">
<Button <Button
onClick={() => createAccountMutation.mutate()} onClick={() => {
createAccountMutation.mutate();
}}
disabled={createAccountMutation.isPending} disabled={createAccountMutation.isPending}
className="w-full bg-emerald-600 text-white hover:bg-emerald-700" className="w-full bg-emerald-600 text-white hover:bg-emerald-700"
size="lg" size="lg"
@@ -113,7 +128,7 @@ export default function Welcome() {
<>Creating your account...</> <>Creating your account...</>
) : ( ) : (
<> <>
<Sparkles className="mr-2 h-4 w-4" /> <CalendarCheck className="mr-2 h-4 w-4" />
Start Tracking Now Start Tracking Now
</> </>
)} )}
@@ -130,7 +145,9 @@ export default function Welcome() {
<Button <Button
variant="outline" variant="outline"
onClick={() => setShowTokenInput(true)} onClick={() => {
setShowTokenInput(true);
}}
className="w-full border-zinc-800 hover:bg-zinc-900" className="w-full border-zinc-800 hover:bg-zinc-900"
size="lg" size="lg"
> >
@@ -161,8 +178,10 @@ export default function Welcome() {
type="text" type="text"
placeholder="e.g., happy-blue-cat-1234" placeholder="e.g., happy-blue-cat-1234"
value={tokenInput} value={tokenInput}
onChange={(e) => setTokenInput(e.target.value)} onChange={(e) => {
onKeyPress={(e) => e.key === 'Enter' && handleTokenLogin()} setTokenInput(e.target.value);
}}
onKeyDown={handleKeyDown}
className="border-zinc-800 bg-zinc-900 placeholder:text-zinc-600" className="border-zinc-800 bg-zinc-900 placeholder:text-zinc-600"
autoFocus autoFocus
/> />

View File

@@ -1,11 +1,17 @@
import { defineConfig } from 'drizzle-kit'; import { defineConfig } from 'drizzle-kit';
import { env } from 'node:process'; import dotenv from 'dotenv';
dotenv.config({ path: ['.env.local', '.env'] });
const DATABASE_URL = process.env.POSTGRES_URL;
if (!DATABASE_URL) {
throw new Error('POSTGRES_URL environment variable is required');
}
export default defineConfig({ export default defineConfig({
schema: './lib/db/schema.ts', schema: './lib/db/schema.ts',
dialect: 'postgresql', dialect: 'postgresql',
dbCredentials: { dbCredentials: {
url: env.POSTGRES_URL!, url: DATABASE_URL,
}, },
out: './drizzle', out: './drizzle',
}); });

View File

@@ -1,8 +1,14 @@
import { drizzle } from 'drizzle-orm/node-postgres'; import { drizzle } from 'drizzle-orm/node-postgres';
import * as schema from './schema'; import * as schema from './schema';
import 'dotenv/config'; import dotenv from 'dotenv';
dotenv.config({ path: ['.env.local', '.env'] });
export const db = drizzle(process.env.POSTGRES_URL!, { schema }); const DATABASE_URL = process.env.POSTGRES_URL;
if (!DATABASE_URL) {
throw new Error('POSTGRES_URL environment variable is required');
}
export const db = drizzle(DATABASE_URL, { schema });
// Re-export schema types for convenience // Re-export schema types for convenience
export * from './schema'; export * from './schema';

View File

@@ -28,9 +28,7 @@ export const habits = pgTable(
createdAt: timestamp('created_at').defaultNow().notNull(), createdAt: timestamp('created_at').defaultNow().notNull(),
archivedAt: timestamp('archived_at'), archivedAt: timestamp('archived_at'),
}, },
(table) => ({ (table) => [index('habits_user_id_idx').on(table.userId)],
userIdIdx: index('habits_user_id_idx').on(table.userId),
}),
); );
export const habitLogs = pgTable( export const habitLogs = pgTable(
@@ -43,10 +41,10 @@ export const habitLogs = pgTable(
loggedAt: timestamp('logged_at').defaultNow().notNull(), loggedAt: timestamp('logged_at').defaultNow().notNull(),
note: text('note'), note: text('note'),
}, },
(table) => ({ (table) => [
habitIdIdx: index('habit_logs_habit_id_idx').on(table.habitId), index('habit_logs_habit_id_idx').on(table.habitId),
loggedAtIdx: index('habit_logs_logged_at_idx').on(table.loggedAt), index('habit_logs_logged_at_idx').on(table.loggedAt),
}), ],
); );
// Relations // Relations

View File

@@ -29,9 +29,9 @@
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"dotenv": "^17.2.0", "dotenv": "^17.2.0",
"drizzle-orm": "^0.44.3", "drizzle-orm": "^0.44.3",
"lucide-react": "^0.525.0", "lucide-react": "^0.526.0",
"nanoid": "^5.1.5", "nanoid": "^5.1.5",
"next": "15.4.1", "next": "15.4.4",
"next-plausible": "^3.12.4", "next-plausible": "^3.12.4",
"pg": "^8.16.3", "pg": "^8.16.3",
"pg-native": "^3.5.2", "pg-native": "^3.5.2",
@@ -43,25 +43,25 @@
"tailwindcss-animate": "^1.0.7" "tailwindcss-animate": "^1.0.7"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.31.0", "@eslint/js": "9.32.0",
"@next/eslint-plugin-next": "^15.4.1", "@next/eslint-plugin-next": "15.4.4",
"@tailwindcss/postcss": "4.1.11", "@tailwindcss/postcss": "4.1.11",
"@types/node": "22.16.3", "@types/node": "22.16.5",
"@types/pg": "^8.15.4", "@types/pg": "8.15.4",
"@types/react": "19.1.8", "@types/react": "19.1.8",
"@types/react-dom": "19.1.6", "@types/react-dom": "19.1.6",
"@typescript-eslint/eslint-plugin": "^8.37.0", "@typescript-eslint/eslint-plugin": "8.38.0",
"@typescript-eslint/parser": "^8.37.0", "@typescript-eslint/parser": "8.38.0",
"drizzle-kit": "^0.31.4", "drizzle-kit": "0.31.4",
"eslint": "9.31.0", "eslint": "9.32.0",
"eslint-config-next": "15.4.1", "eslint-config-next": "15.4.4",
"postcss": "8.5.6", "postcss": "8.5.6",
"prettier": "^3.6.2", "prettier": "3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14", "prettier-plugin-tailwindcss": "0.6.14",
"tailwindcss": "4.1.11", "tailwindcss": "4.1.11",
"turbo": "2.5.4", "turbo": "2.5.5",
"typescript": "5.8.3", "typescript": "5.8.3",
"typescript-eslint": "^8.37.0" "typescript-eslint": "8.38.0"
}, },
"packageManager": "pnpm@10.13.1" "packageManager": "pnpm@10.13.1"
} }

442
pnpm-lock.yaml generated
View File

@@ -43,22 +43,22 @@ importers:
version: 4.1.0 version: 4.1.0
dotenv: dotenv:
specifier: ^17.2.0 specifier: ^17.2.0
version: 17.2.0 version: 17.2.1
drizzle-orm: drizzle-orm:
specifier: ^0.44.3 specifier: ^0.44.3
version: 0.44.3(@types/pg@8.15.4)(@vercel/postgres@0.10.0)(pg@8.16.3(pg-native@3.5.2)) version: 0.44.3(@types/pg@8.15.4)(@vercel/postgres@0.10.0)(pg@8.16.3(pg-native@3.5.2))
lucide-react: lucide-react:
specifier: ^0.525.0 specifier: ^0.526.0
version: 0.525.0(react@19.1.0) version: 0.526.0(react@19.1.0)
nanoid: nanoid:
specifier: ^5.1.5 specifier: ^5.1.5
version: 5.1.5 version: 5.1.5
next: next:
specifier: 15.4.1 specifier: 15.4.4
version: 15.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) version: 15.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next-plausible: next-plausible:
specifier: ^3.12.4 specifier: ^3.12.4
version: 3.12.4(next@15.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) version: 3.12.4(next@15.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
pg: pg:
specifier: ^8.16.3 specifier: ^8.16.3
version: 8.16.3(pg-native@3.5.2) version: 8.16.3(pg-native@3.5.2)
@@ -85,19 +85,19 @@ importers:
version: 1.0.7(tailwindcss@4.1.11) version: 1.0.7(tailwindcss@4.1.11)
devDependencies: devDependencies:
'@eslint/js': '@eslint/js':
specifier: ^9.31.0 specifier: 9.32.0
version: 9.31.0 version: 9.32.0
'@next/eslint-plugin-next': '@next/eslint-plugin-next':
specifier: ^15.4.1 specifier: 15.4.4
version: 15.4.1 version: 15.4.4
'@tailwindcss/postcss': '@tailwindcss/postcss':
specifier: 4.1.11 specifier: 4.1.11
version: 4.1.11 version: 4.1.11
'@types/node': '@types/node':
specifier: 22.16.3 specifier: 22.16.5
version: 22.16.3 version: 22.16.5
'@types/pg': '@types/pg':
specifier: ^8.15.4 specifier: 8.15.4
version: 8.15.4 version: 8.15.4
'@types/react': '@types/react':
specifier: 19.1.8 specifier: 19.1.8
@@ -106,41 +106,41 @@ importers:
specifier: 19.1.6 specifier: 19.1.6
version: 19.1.6(@types/react@19.1.8) version: 19.1.6(@types/react@19.1.8)
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.37.0 specifier: 8.38.0
version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) version: 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.37.0 specifier: 8.38.0
version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
drizzle-kit: drizzle-kit:
specifier: ^0.31.4 specifier: 0.31.4
version: 0.31.4 version: 0.31.4
eslint: eslint:
specifier: 9.31.0 specifier: 9.32.0
version: 9.31.0(jiti@2.4.2) version: 9.32.0(jiti@2.4.2)
eslint-config-next: eslint-config-next:
specifier: 15.4.1 specifier: 15.4.4
version: 15.4.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) version: 15.4.4(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
postcss: postcss:
specifier: 8.5.6 specifier: 8.5.6
version: 8.5.6 version: 8.5.6
prettier: prettier:
specifier: ^3.6.2 specifier: 3.6.2
version: 3.6.2 version: 3.6.2
prettier-plugin-tailwindcss: prettier-plugin-tailwindcss:
specifier: ^0.6.14 specifier: 0.6.14
version: 0.6.14(prettier@3.6.2) version: 0.6.14(prettier@3.6.2)
tailwindcss: tailwindcss:
specifier: 4.1.11 specifier: 4.1.11
version: 4.1.11 version: 4.1.11
turbo: turbo:
specifier: 2.5.4 specifier: 2.5.5
version: 2.5.4 version: 2.5.5
typescript: typescript:
specifier: 5.8.3 specifier: 5.8.3
version: 5.8.3 version: 5.8.3
typescript-eslint: typescript-eslint:
specifier: ^8.37.0 specifier: 8.38.0
version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
packages: packages:
@@ -744,16 +744,16 @@ packages:
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.31.0': '@eslint/js@9.32.0':
resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6': '@eslint/object-schema@2.1.6':
resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.3.3': '@eslint/plugin-kit@0.3.4':
resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@floating-ui/core@1.7.2': '@floating-ui/core@1.7.2':
@@ -936,56 +936,56 @@ packages:
'@neondatabase/serverless@0.9.5': '@neondatabase/serverless@0.9.5':
resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==} resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==}
'@next/env@15.4.1': '@next/env@15.4.4':
resolution: {integrity: sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A==} resolution: {integrity: sha512-SJKOOkULKENyHSYXE5+KiFU6itcIb6wSBjgM92meK0HVKpo94dNOLZVdLLuS7/BxImROkGoPsjR4EnuDucqiiA==}
'@next/eslint-plugin-next@15.4.1': '@next/eslint-plugin-next@15.4.4':
resolution: {integrity: sha512-lQnHUxN7mMksK7IxgKDIXNMWFOBmksVrjamMEURXiYfo7zgsc30lnU8u4y/MJktSh+nB80ktTQeQbWdQO6c8Ow==} resolution: {integrity: sha512-1FDsyN//ai3Jd97SEd7scw5h1yLdzDACGOPRofr2GD3sEFsBylEEoL0MHSerd4n2dq9Zm/mFMqi4+NRMOreOKA==}
'@next/swc-darwin-arm64@15.4.1': '@next/swc-darwin-arm64@15.4.4':
resolution: {integrity: sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig==} resolution: {integrity: sha512-eVG55dnGwfUuG+TtnUCt+mEJ+8TGgul6nHEvdb8HEH7dmJIFYOCApAaFrIrxwtEq2Cdf+0m5sG1Np8cNpw9EAw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@15.4.1': '@next/swc-darwin-x64@15.4.4':
resolution: {integrity: sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw==} resolution: {integrity: sha512-zqG+/8apsu49CltEj4NAmCGZvHcZbOOOsNoTVeIXphYWIbE4l6A/vuQHyqll0flU2o3dmYCXsBW5FmbrGDgljQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@15.4.1': '@next/swc-linux-arm64-gnu@15.4.4':
resolution: {integrity: sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ==} resolution: {integrity: sha512-LRD4l2lq4R+2QCHBQVC0wjxxkLlALGJCwigaJ5FSRSqnje+MRKHljQNZgDCaKUZQzO/TXxlmUdkZP/X3KNGZaw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-arm64-musl@15.4.1': '@next/swc-linux-arm64-musl@15.4.4':
resolution: {integrity: sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g==} resolution: {integrity: sha512-LsGUCTvuZ0690fFWerA4lnQvjkYg9gHo12A3wiPUR4kCxbx/d+SlwmonuTH2SWZI+RVGA9VL3N0S03WTYv6bYg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-x64-gnu@15.4.1': '@next/swc-linux-x64-gnu@15.4.4':
resolution: {integrity: sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ==} resolution: {integrity: sha512-aOy5yNRpLL3wNiJVkFYl6w22hdREERNjvegE6vvtix8LHRdsTHhWTpgvcYdCK7AIDCQW5ATmzr9XkPHvSoAnvg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-linux-x64-musl@15.4.1': '@next/swc-linux-x64-musl@15.4.4':
resolution: {integrity: sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw==} resolution: {integrity: sha512-FL7OAn4UkR8hKQRGBmlHiHinzOb07tsfARdGh7v0Z0jEJ3sz8/7L5bR23ble9E6DZMabSStqlATHlSxv1fuzAg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-win32-arm64-msvc@15.4.1': '@next/swc-win32-arm64-msvc@15.4.4':
resolution: {integrity: sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg==} resolution: {integrity: sha512-eEdNW/TXwjYhOulQh0pffTMMItWVwKCQpbziSBmgBNFZIIRn2GTXrhrewevs8wP8KXWYMx8Z+mNU0X+AfvtrRg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@15.4.1': '@next/swc-win32-x64-msvc@15.4.4':
resolution: {integrity: sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ==} resolution: {integrity: sha512-SE5pYNbn/xZKMy1RE3pAs+4xD32OI4rY6mzJa4XUkp/ItZY+OMjIgilskmErt8ls/fVJ+Ihopi2QIeW6O3TrMw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -1440,8 +1440,8 @@ packages:
'@types/json5@0.0.29': '@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node@22.16.3': '@types/node@22.16.5':
resolution: {integrity: sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==} resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==}
'@types/pg@8.11.6': '@types/pg@8.11.6':
resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==}
@@ -1457,63 +1457,63 @@ packages:
'@types/react@19.1.8': '@types/react@19.1.8':
resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==}
'@typescript-eslint/eslint-plugin@8.37.0': '@typescript-eslint/eslint-plugin@8.38.0':
resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.37.0 '@typescript-eslint/parser': ^8.38.0
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/parser@8.37.0': '@typescript-eslint/parser@8.38.0':
resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/project-service@8.37.0': '@typescript-eslint/project-service@8.38.0':
resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/scope-manager@8.37.0': '@typescript-eslint/scope-manager@8.38.0':
resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.37.0': '@typescript-eslint/tsconfig-utils@8.38.0':
resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/type-utils@8.37.0': '@typescript-eslint/type-utils@8.38.0':
resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/types@8.37.0': '@typescript-eslint/types@8.38.0':
resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.37.0': '@typescript-eslint/typescript-estree@8.38.0':
resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/utils@8.37.0': '@typescript-eslint/utils@8.38.0':
resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/visitor-keys@8.37.0': '@typescript-eslint/visitor-keys@8.38.0':
resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@unrs/resolver-binding-android-arm-eabi@1.11.1': '@unrs/resolver-binding-android-arm-eabi@1.11.1':
@@ -1942,8 +1942,8 @@ packages:
domutils@3.2.2: domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
dotenv@17.2.0: dotenv@17.2.1:
resolution: {integrity: sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==} resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
drizzle-kit@0.31.4: drizzle-kit@0.31.4:
@@ -2115,8 +2115,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'} engines: {node: '>=10'}
eslint-config-next@15.4.1: eslint-config-next@15.4.4:
resolution: {integrity: sha512-XIIN+lq8XuSwXUrcv+0uHMDFGJFPxLAw04/a4muFZYygSvStvVa15nY7kh4Il6yOVJyxdMUyVdQ9ApGedaeupw==} resolution: {integrity: sha512-sK/lWLUVF5om18O5w76Jt3F8uzu/LP5mVa6TprCMWkjWHUmByq80iHGHcdH7k1dLiJlj+DRIWf98d5piwRsSuA==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1' typescript: '>=3.3.1'
@@ -2201,8 +2201,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.31.0: eslint@9.32.0:
resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -2636,8 +2636,8 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true hasBin: true
lucide-react@0.525.0: lucide-react@0.526.0:
resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} resolution: {integrity: sha512-uGWG/2RKuDLeQHCodn5cmJ9Zij80EstOdcBP+j//B2sr78w7woiEL4aMu6CRlRkyOyJ8sZry8QLhQTmZjynLdA==}
peerDependencies: peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -2716,8 +2716,8 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
next@15.4.1: next@15.4.4:
resolution: {integrity: sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw==} resolution: {integrity: sha512-kNcubvJjOL9yUOfwtZF3HfDhuhp+kVD+FM2A6Tyua1eI/xfmY4r/8ZS913MMz+oWKDlbps/dQOWdDricuIkXLw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -3594,38 +3594,38 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
turbo-darwin-64@2.5.4: turbo-darwin-64@2.5.5:
resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
turbo-darwin-arm64@2.5.4: turbo-darwin-arm64@2.5.5:
resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
turbo-linux-64@2.5.4: turbo-linux-64@2.5.5:
resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
turbo-linux-arm64@2.5.4: turbo-linux-arm64@2.5.5:
resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
turbo-windows-64@2.5.4: turbo-windows-64@2.5.5:
resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
turbo-windows-arm64@2.5.4: turbo-windows-arm64@2.5.5:
resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
turbo@2.5.4: turbo@2.5.5:
resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==}
hasBin: true hasBin: true
type-check@0.4.0: type-check@0.4.0:
@@ -3648,8 +3648,8 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typescript-eslint@8.37.0: typescript-eslint@8.38.0:
resolution: {integrity: sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==} resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@@ -4193,9 +4193,9 @@ snapshots:
'@esbuild/win32-x64@0.25.6': '@esbuild/win32-x64@0.25.6':
optional: true optional: true
'@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.4.2))':
dependencies: dependencies:
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {} '@eslint-community/regexpp@4.12.1': {}
@@ -4228,11 +4228,11 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@9.31.0': {} '@eslint/js@9.32.0': {}
'@eslint/object-schema@2.1.6': {} '@eslint/object-schema@2.1.6': {}
'@eslint/plugin-kit@0.3.3': '@eslint/plugin-kit@0.3.4':
dependencies: dependencies:
'@eslint/core': 0.15.1 '@eslint/core': 0.15.1
levn: 0.4.1 levn: 0.4.1
@@ -4383,34 +4383,34 @@ snapshots:
'@types/pg': 8.11.6 '@types/pg': 8.11.6
optional: true optional: true
'@next/env@15.4.1': {} '@next/env@15.4.4': {}
'@next/eslint-plugin-next@15.4.1': '@next/eslint-plugin-next@15.4.4':
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/swc-darwin-arm64@15.4.1': '@next/swc-darwin-arm64@15.4.4':
optional: true optional: true
'@next/swc-darwin-x64@15.4.1': '@next/swc-darwin-x64@15.4.4':
optional: true optional: true
'@next/swc-linux-arm64-gnu@15.4.1': '@next/swc-linux-arm64-gnu@15.4.4':
optional: true optional: true
'@next/swc-linux-arm64-musl@15.4.1': '@next/swc-linux-arm64-musl@15.4.4':
optional: true optional: true
'@next/swc-linux-x64-gnu@15.4.1': '@next/swc-linux-x64-gnu@15.4.4':
optional: true optional: true
'@next/swc-linux-x64-musl@15.4.1': '@next/swc-linux-x64-musl@15.4.4':
optional: true optional: true
'@next/swc-win32-arm64-msvc@15.4.1': '@next/swc-win32-arm64-msvc@15.4.4':
optional: true optional: true
'@next/swc-win32-x64-msvc@15.4.1': '@next/swc-win32-x64-msvc@15.4.4':
optional: true optional: true
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
@@ -4813,20 +4813,20 @@ snapshots:
'@types/json5@0.0.29': {} '@types/json5@0.0.29': {}
'@types/node@22.16.3': '@types/node@22.16.5':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
'@types/pg@8.11.6': '@types/pg@8.11.6':
dependencies: dependencies:
'@types/node': 22.16.3 '@types/node': 22.16.5
pg-protocol: 1.10.3 pg-protocol: 1.10.3
pg-types: 4.0.2 pg-types: 4.0.2
optional: true optional: true
'@types/pg@8.15.4': '@types/pg@8.15.4':
dependencies: dependencies:
'@types/node': 22.16.3 '@types/node': 22.16.5
pg-protocol: 1.10.3 pg-protocol: 1.10.3
pg-types: 2.2.0 pg-types: 2.2.0
@@ -4838,15 +4838,15 @@ snapshots:
dependencies: dependencies:
csstype: 3.1.3 csstype: 3.1.3
'@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/scope-manager': 8.38.0
'@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.37.0 '@typescript-eslint/visitor-keys': 8.38.0
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
@@ -4855,56 +4855,56 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': '@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/scope-manager': 8.38.0
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.37.0 '@typescript-eslint/visitor-keys': 8.38.0
debug: 4.4.1 debug: 4.4.1
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3)
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
debug: 4.4.1 debug: 4.4.1
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.37.0': '@typescript-eslint/scope-manager@8.38.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
'@typescript-eslint/visitor-keys': 8.37.0 '@typescript-eslint/visitor-keys': 8.38.0
'@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)':
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.8.3
'@typescript-eslint/type-utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
debug: 4.4.1 debug: 4.4.1
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
ts-api-utils: 2.1.0(typescript@5.8.3) ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.37.0': {} '@typescript-eslint/types@8.38.0': {}
'@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3)
'@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3)
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
'@typescript-eslint/visitor-keys': 8.37.0 '@typescript-eslint/visitor-keys': 8.38.0
debug: 4.4.1 debug: 4.4.1
fast-glob: 3.3.3 fast-glob: 3.3.3
is-glob: 4.0.3 is-glob: 4.0.3
@@ -4915,20 +4915,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2))
'@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/scope-manager': 8.38.0
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.37.0': '@typescript-eslint/visitor-keys@8.38.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.37.0 '@typescript-eslint/types': 8.38.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
'@unrs/resolver-binding-android-arm-eabi@1.11.1': '@unrs/resolver-binding-android-arm-eabi@1.11.1':
@@ -5385,7 +5385,7 @@ snapshots:
domelementtype: 2.3.0 domelementtype: 2.3.0
domhandler: 5.0.3 domhandler: 5.0.3
dotenv@17.2.0: {} dotenv@17.2.1: {}
drizzle-kit@0.31.4: drizzle-kit@0.31.4:
dependencies: dependencies:
@@ -5585,19 +5585,19 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-config-next@15.4.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): eslint-config-next@15.4.4(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.4.1 '@next/eslint-plugin-next': 15.4.4
'@rushstack/eslint-patch': 1.12.0 '@rushstack/eslint-patch': 1.12.0
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.31.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.4.2))
eslint-plugin-react: 7.37.5(eslint@9.31.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.4.2))
eslint-plugin-react-hooks: 5.2.0(eslint@9.31.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.4.2))
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -5613,33 +5613,33 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)): eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.1 debug: 4.4.1
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
get-tsconfig: 4.10.1 get-tsconfig: 4.10.1
is-bun-module: 2.0.0 is-bun-module: 2.0.0
stable-hash: 0.0.5 stable-hash: 0.0.5
tinyglobby: 0.2.14 tinyglobby: 0.2.14
unrs-resolver: 1.11.1 unrs-resolver: 1.11.1
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)): eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)): eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.9 array-includes: 3.1.9
@@ -5648,9 +5648,9 @@ snapshots:
array.prototype.flatmap: 1.3.3 array.prototype.flatmap: 1.3.3
debug: 3.2.7 debug: 3.2.7
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2))
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@@ -5662,13 +5662,13 @@ snapshots:
string.prototype.trimend: 1.0.9 string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-plugin-jsx-a11y@6.10.2(eslint@9.31.0(jiti@2.4.2)): eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
aria-query: 5.3.2 aria-query: 5.3.2
array-includes: 3.1.9 array-includes: 3.1.9
@@ -5678,7 +5678,7 @@ snapshots:
axobject-query: 4.1.0 axobject-query: 4.1.0
damerau-levenshtein: 1.0.8 damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2 emoji-regex: 9.2.2
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
language-tags: 1.0.9 language-tags: 1.0.9
@@ -5687,11 +5687,11 @@ snapshots:
safe-regex-test: 1.1.0 safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1 string.prototype.includes: 2.0.1
eslint-plugin-react-hooks@5.2.0(eslint@9.31.0(jiti@2.4.2)): eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
eslint-plugin-react@7.37.5(eslint@9.31.0(jiti@2.4.2)): eslint-plugin-react@7.37.5(eslint@9.32.0(jiti@2.4.2)):
dependencies: dependencies:
array-includes: 3.1.9 array-includes: 3.1.9
array.prototype.findlast: 1.2.5 array.prototype.findlast: 1.2.5
@@ -5699,7 +5699,7 @@ snapshots:
array.prototype.tosorted: 1.1.4 array.prototype.tosorted: 1.1.4
doctrine: 2.1.0 doctrine: 2.1.0
es-iterator-helpers: 1.2.1 es-iterator-helpers: 1.2.1
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
estraverse: 5.3.0 estraverse: 5.3.0
hasown: 2.0.2 hasown: 2.0.2
jsx-ast-utils: 3.3.5 jsx-ast-utils: 3.3.5
@@ -5722,16 +5722,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {} eslint-visitor-keys@4.2.1: {}
eslint@9.31.0(jiti@2.4.2): eslint@9.32.0(jiti@2.4.2):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2))
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.21.0 '@eslint/config-array': 0.21.0
'@eslint/config-helpers': 0.3.0 '@eslint/config-helpers': 0.3.0
'@eslint/core': 0.15.1 '@eslint/core': 0.15.1
'@eslint/eslintrc': 3.3.1 '@eslint/eslintrc': 3.3.1
'@eslint/js': 9.31.0 '@eslint/js': 9.32.0
'@eslint/plugin-kit': 0.3.3 '@eslint/plugin-kit': 0.3.4
'@humanfs/node': 0.16.6 '@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3 '@humanwhocodes/retry': 0.4.3
@@ -6176,7 +6176,7 @@ snapshots:
dependencies: dependencies:
js-tokens: 4.0.0 js-tokens: 4.0.0
lucide-react@0.525.0(react@19.1.0): lucide-react@0.526.0(react@19.1.0):
dependencies: dependencies:
react: 19.1.0 react: 19.1.0
@@ -6227,15 +6227,15 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
next-plausible@3.12.4(next@15.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): next-plausible@3.12.4(next@15.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies: dependencies:
next: 15.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: 15.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0 react: 19.1.0
react-dom: 19.1.0(react@19.1.0) react-dom: 19.1.0(react@19.1.0)
next@15.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): next@15.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies: dependencies:
'@next/env': 15.4.1 '@next/env': 15.4.4
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
caniuse-lite: 1.0.30001727 caniuse-lite: 1.0.30001727
postcss: 8.4.31 postcss: 8.4.31
@@ -6243,14 +6243,14 @@ snapshots:
react-dom: 19.1.0(react@19.1.0) react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(react@19.1.0) styled-jsx: 5.1.6(react@19.1.0)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 15.4.1 '@next/swc-darwin-arm64': 15.4.4
'@next/swc-darwin-x64': 15.4.1 '@next/swc-darwin-x64': 15.4.4
'@next/swc-linux-arm64-gnu': 15.4.1 '@next/swc-linux-arm64-gnu': 15.4.4
'@next/swc-linux-arm64-musl': 15.4.1 '@next/swc-linux-arm64-musl': 15.4.4
'@next/swc-linux-x64-gnu': 15.4.1 '@next/swc-linux-x64-gnu': 15.4.4
'@next/swc-linux-x64-musl': 15.4.1 '@next/swc-linux-x64-musl': 15.4.4
'@next/swc-win32-arm64-msvc': 15.4.1 '@next/swc-win32-arm64-msvc': 15.4.4
'@next/swc-win32-x64-msvc': 15.4.1 '@next/swc-win32-x64-msvc': 15.4.4
sharp: 0.34.3 sharp: 0.34.3
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
@@ -7174,32 +7174,32 @@ snapshots:
tslib@2.8.1: {} tslib@2.8.1: {}
turbo-darwin-64@2.5.4: turbo-darwin-64@2.5.5:
optional: true optional: true
turbo-darwin-arm64@2.5.4: turbo-darwin-arm64@2.5.5:
optional: true optional: true
turbo-linux-64@2.5.4: turbo-linux-64@2.5.5:
optional: true optional: true
turbo-linux-arm64@2.5.4: turbo-linux-arm64@2.5.5:
optional: true optional: true
turbo-windows-64@2.5.4: turbo-windows-64@2.5.5:
optional: true optional: true
turbo-windows-arm64@2.5.4: turbo-windows-arm64@2.5.5:
optional: true optional: true
turbo@2.5.4: turbo@2.5.5:
optionalDependencies: optionalDependencies:
turbo-darwin-64: 2.5.4 turbo-darwin-64: 2.5.5
turbo-darwin-arm64: 2.5.4 turbo-darwin-arm64: 2.5.5
turbo-linux-64: 2.5.4 turbo-linux-64: 2.5.5
turbo-linux-arm64: 2.5.4 turbo-linux-arm64: 2.5.5
turbo-windows-64: 2.5.4 turbo-windows-64: 2.5.5
turbo-windows-arm64: 2.5.4 turbo-windows-arm64: 2.5.5
type-check@0.4.0: type-check@0.4.0:
dependencies: dependencies:
@@ -7238,13 +7238,13 @@ snapshots:
possible-typed-array-names: 1.1.0 possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10 reflect.getprototypeof: 1.0.10
typescript-eslint@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): typescript-eslint@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
'@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)
eslint: 9.31.0(jiti@2.4.2) eslint: 9.32.0(jiti@2.4.2)
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color

View File

@@ -1,4 +1,3 @@
onlyBuiltDependencies: onlyBuiltDependencies:
- '@tailwindcss/oxide' - '@tailwindcss/oxide'
- libpq
- sharp - sharp