chore: update nextjs example

This commit is contained in:
Bereket Engida
2024-10-20 22:44:33 +03:00
parent 4edc4289e5
commit dbd91509a3
11 changed files with 517 additions and 53 deletions

View File

@@ -2,8 +2,6 @@ GOOGLE_CLIENT_SECRET=
GOOGLE_CLIENT_ID=
BETTER_AUTH_URL="http://localhost:3000"
BETTER_AUTH_SECRET=
TURSO_DATABASE_URL=
TURSO_AUTH_TOKEN=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
RESEND_API_KEY=

View File

@@ -3,21 +3,28 @@ import { headers } from "next/headers";
import { redirect } from "next/navigation";
import UserCard from "./user-card";
import { OrganizationCard } from "./organization-card";
import AccountSwitcher from "@/components/account-swtich";
export default async function DashboardPage() {
const [session, activeSessions] = await Promise.all([
const [session, activeSessions, deviceSessions] = await Promise.all([
auth.api.getSession({
headers: await headers(),
}),
auth.api.listSessions({
headers: await headers(),
}),
auth.api.listDeviceSessions({
headers: await headers(),
}),
]).catch((e) => {
throw redirect("/sign-in");
});
return (
<div className="w-full">
<div className="flex gap-4 flex-col">
<AccountSwitcher
sessions={JSON.parse(JSON.stringify(deviceSessions))}
/>
<UserCard
session={JSON.parse(JSON.stringify(session))}
activeSessions={JSON.parse(JSON.stringify(activeSessions))}

View File

@@ -3,6 +3,7 @@
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
@@ -24,7 +25,7 @@
--border: 20 5.9% 90%;
--input: 20 5.9% 90%;
--ring: 20 14.3% 4.1%;
--radius: 0.3rem;
--radius: 0rem;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;

View File

@@ -0,0 +1,141 @@
"use client";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import {
Command,
CommandGroup,
CommandItem,
CommandList,
CommandSeparator,
} from "@/components/ui/command";
import { ChevronDown, LogOutIcon, PlusCircle } from "lucide-react";
import { useQuery } from "@tanstack/react-query";
import { Session } from "@/lib/auth-types";
import { client, useSession } from "@/lib/auth-client";
import { useRouter } from "next/navigation";
export default function AccountSwitcher({
sessions,
}: {
sessions: Session[];
}) {
const { data: users } = useQuery({
queryKey: ["users"],
queryFn: async () => {
return;
},
});
const { data: currentUser } = useSession();
const [open, setOpen] = useState(false);
const handleUserSelect = (user: Session) => {
// setCurrentUser(user);
setOpen(false);
};
const handleAddAccount = () => {
// Implement add account logic here
console.log("Add account clicked");
setOpen(false);
};
const router = useRouter();
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
role="combobox"
aria-expanded={open}
aria-label="Select a user"
className="w-[250px] justify-between"
>
<Avatar className="mr-2 h-6 w-6">
<AvatarImage
src={currentUser?.user.image}
alt={currentUser?.user.name}
/>
<AvatarFallback>{currentUser?.user.name.charAt(0)}</AvatarFallback>
</Avatar>
{currentUser?.user.name}
<ChevronDown className="ml-auto h-4 w-4 shrink-0 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[250px] p-0">
<Command>
<CommandList>
<CommandGroup heading="Current Account">
<CommandItem
onSelect={() => {}}
className="text-sm w-full justify-between"
key={currentUser?.user.id}
>
<div className="flex items-center">
<Avatar className="mr-2 h-5 w-5">
<AvatarImage
src={currentUser?.user.image}
alt={currentUser?.user.name}
/>
<AvatarFallback>
{currentUser?.user.name.charAt(0)}
</AvatarFallback>
</Avatar>
{currentUser?.user.name}
</div>
</CommandItem>
</CommandGroup>
<CommandSeparator />
<CommandGroup heading="Switch Account">
{sessions
.filter((s) => s.user.id !== currentUser?.user.id)
.map((u, i) => (
<CommandItem
key={i}
onSelect={async () => {
await client.multiSession.setActive({
sessionId: u.session.id,
});
setOpen(false);
}}
className="text-sm"
>
<Avatar className="mr-2 h-5 w-5">
<AvatarImage src={u.user.image} alt={u.user.name} />
<AvatarFallback>{u.user.name.charAt(0)}</AvatarFallback>
</Avatar>
<div className="flex items-center justify-between w-full">
<div>
<p>{u.user.name}</p>
<p className="text-xs">({u.user.email})</p>
</div>
</div>
</CommandItem>
))}
</CommandGroup>
</CommandList>
<CommandSeparator />
<CommandList>
<CommandGroup>
<CommandItem
onSelect={() => {
router.push("/sign-in");
setOpen(false);
}}
className="cursor-pointer text-sm"
>
<PlusCircle className="mr-2 h-5 w-5" />
Add Account
</CommandItem>
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
);
}

View File

@@ -15,7 +15,7 @@ import { Label } from "@/components/ui/label";
import { PasswordInput } from "@/components/ui/password-input";
import { signIn } from "@/lib/auth-client";
import { DiscordLogoIcon, GitHubLogoIcon } from "@radix-ui/react-icons";
import { Key, Loader2 } from "lucide-react";
import { Key, Loader2, TwitchIcon } from "lucide-react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
@@ -124,12 +124,33 @@ export default function SignIn() {
onClick={async () => {
await signIn.social({
provider: "discord",
callbackURL: "/dashboard",
});
}}
>
<DiscordLogoIcon />
</Button>
<Button
variant="outline"
className="w-full gap-2"
onClick={async () => {
await signIn.social({
provider: "twitch",
callbackURL: "/dashboard",
});
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="1.2em"
height="1.2em"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M11.64 5.93h1.43v4.28h-1.43m3.93-4.28H17v4.28h-1.43M7 2L3.43 5.57v12.86h4.28V22l3.58-3.57h2.85L20.57 12V2m-1.43 9.29l-2.85 2.85h-2.86l-2.5 2.5v-2.5H7.71V3.43h11.43Z"
></path>
</svg>
</Button>
<Button
variant="outline"
className="w-full gap-2"

View File

@@ -16,10 +16,11 @@ const PasswordInput = React.forwardRef<HTMLInputElement, InputProps>(
return (
<div className="relative">
<Input
{...props}
type={showPassword ? "text" : "password"}
name="password_fake"
className={cn("hide-password-toggle pr-10", className)}
ref={ref}
{...props}
/>
<Button
type="button"

View File

@@ -4,6 +4,7 @@ import {
passkeyClient,
twoFactorClient,
adminClient,
multiSessionClient,
} from "better-auth/client/plugins";
import { toast } from "sonner";
@@ -16,6 +17,7 @@ export const client = createAuthClient({
}),
passkeyClient(),
adminClient(),
multiSessionClient(),
],
fetchOptions: {
onError(e) {

View File

@@ -1,3 +1,4 @@
import Database from "better-sqlite3";
import { betterAuth } from "better-auth";
import {
bearer,
@@ -5,6 +6,7 @@ import {
passkey,
twoFactor,
admin,
multiSession,
} from "better-auth/plugins";
import { reactInvitationEmail } from "./email/invitation";
import { LibsqlDialect } from "@libsql/kysely-libsql";
@@ -14,16 +16,10 @@ import { resend } from "./email/resend";
const from = process.env.BETTER_AUTH_EMAIL || "delivered@resend.dev";
const to = process.env.TEST_EMAIL || "";
const libsql = new LibsqlDialect({
url: process.env.TURSO_DATABASE_URL || "",
authToken: process.env.TURSO_AUTH_TOKEN || "",
});
const database = new Database("better-auth.sqlite");
export const auth = betterAuth({
database: {
dialect: libsql,
type: "sqlite",
},
database,
emailVerification: {
async sendVerificationEmail(user, url) {
console.log("Sending verification email to", user.email);
@@ -35,7 +31,12 @@ export const auth = betterAuth({
});
console.log(res, user.email);
},
sendEmailVerificationOnSignUp: true,
sendOnSignUp: true,
},
account: {
accountLinking: {
trustedProviders: ["google", "github"],
},
},
emailAndPassword: {
enabled: true,
@@ -51,6 +52,28 @@ export const auth = betterAuth({
});
},
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID || "",
clientSecret: process.env.GITHUB_CLIENT_SECRET || "",
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID || "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET || "",
},
discord: {
clientId: process.env.DISCORD_CLIENT_ID || "",
clientSecret: process.env.DISCORD_CLIENT_SECRET || "",
},
microsoft: {
clientId: process.env.MICROSOFT_CLIENT_ID || "",
clientSecret: process.env.MICROSOFT_CLIENT_SECRET || "",
},
twitch: {
clientId: process.env.TWITCH_CLIENT_ID || "",
clientSecret: process.env.TWITCH_CLIENT_SECRET || "",
},
},
plugins: [
organization({
async sendInvitationEmail(data) {
@@ -91,27 +114,6 @@ export const auth = betterAuth({
passkey(),
bearer(),
admin(),
multiSession(),
],
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID || "",
clientSecret: process.env.GITHUB_CLIENT_SECRET || "",
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID || "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET || "",
},
discord: {
clientId: process.env.DISCORD_CLIENT_ID || "",
clientSecret: process.env.DISCORD_CLIENT_SECRET || "",
},
microsoft: {
clientId: process.env.MICROSOFT_CLIENT_ID || "",
clientSecret: process.env.MICROSOFT_CLIENT_SECRET || "",
},
twitch: {
clientId: process.env.TWITCH_CLIENT_ID || "",
clientSecret: process.env.TWITCH_CLIENT_SECRET || "",
},
},
});

View File

@@ -1,12 +1,10 @@
import { authMiddleware } from "better-auth/next-js";
import { NextResponse } from "next/server";
import { auth } from "@/lib/auth";
export default authMiddleware({
customRedirect: async (session, request) => {
const baseURL = request.nextUrl.origin;
if (request.nextUrl.pathname === "/sign-in" && session) {
return NextResponse.redirect(new URL("/dashboard", baseURL));
}
if (request.nextUrl.pathname === "/dashboard" && !session) {
return NextResponse.redirect(new URL("/sign-in", baseURL));
}

View File

@@ -1,10 +1,11 @@
{
"name": "@example/nextjs-example",
"name": "@better-auth/nextjs",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"dev": "pnpm migrate && next dev",
"dev:secure": "next dev --experimental-https",
"migrate": "pnpx @better-auth/cli@latest migrate",
"typecheck": "tsc --noEmit",
"build": "next build",
"start": "next start",

312
pnpm-lock.yaml generated
View File

@@ -701,7 +701,7 @@ importers:
version: 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-dialog':
specifier: ^1.1.1
version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.1
version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
@@ -803,7 +803,7 @@ importers:
version: 8.3.0(react@19.0.0-rc-7771d3a7-20240827)
framer-motion:
specifier: ^11.5.4
version: 11.8.0(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
version: 11.11.0(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
geist:
specifier: ^1.3.1
version: 1.3.1(next@15.0.0-canary.185(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827))
@@ -860,10 +860,10 @@ importers:
version: 1.5.0(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
tailwind-merge:
specifier: ^2.5.2
version: 2.5.2
version: 2.5.4
tailwindcss-animate:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.2)))
version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3)))
three:
specifier: ^0.168.0
version: 0.168.0
@@ -900,16 +900,16 @@ importers:
version: 7.4.2
eslint-config-next:
specifier: 15.0.0-canary.149
version: 15.0.0-canary.149(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.2)
version: 15.0.0-canary.149(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
postcss:
specifier: ^8
version: 8.4.47
tailwindcss:
specifier: ^3.4.1
version: 3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.2))
version: 3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3))
typescript:
specifier: ^5
version: 5.6.2
version: 5.6.3
examples/nuxt-example:
dependencies:
@@ -10102,12 +10102,10 @@ packages:
libsql@0.3.19:
resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==}
cpu: [x64, arm64, wasm32]
os: [darwin, linux, win32]
libsql@0.4.5:
resolution: {integrity: sha512-sorTJV6PNt94Wap27Sai5gtVLIea4Otb2LUiAUyr3p6BPOScGMKGt5F1b5X/XgkNtcsDKeX5qfeBDj+PdShclQ==}
cpu: [x64, arm64, wasm32]
os: [darwin, linux, win32]
lilconfig@2.1.0:
@@ -17426,6 +17424,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.9
'@radix-ui/react-context@1.1.1(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
react: 19.0.0-rc-7771d3a7-20240827
optionalDependencies:
'@types/react': 18.3.9
'@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.25.6
@@ -17538,6 +17542,28 @@ snapshots:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
'@radix-ui/primitive': 1.1.0
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-context': 1.1.1(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
aria-hidden: 1.2.4
react: 19.0.0-rc-7771d3a7-20240827
react-dom: 19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827)
react-remove-scroll: 2.6.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
optionalDependencies:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-direction@1.1.0(@types/react@18.3.9)(react@18.3.1)':
dependencies:
react: 18.3.1
@@ -17617,6 +17643,19 @@ snapshots:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
'@radix-ui/primitive': 1.1.0
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
react: 19.0.0-rc-7771d3a7-20240827
react-dom: 19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827)
optionalDependencies:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@radix-ui/primitive': 1.1.0
@@ -17679,6 +17718,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.9
'@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
react: 19.0.0-rc-7771d3a7-20240827
optionalDependencies:
'@types/react': 18.3.9
'@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.25.6
@@ -18079,6 +18124,16 @@ snapshots:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
react: 19.0.0-rc-7771d3a7-20240827
react-dom: 19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827)
optionalDependencies:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.25.6
@@ -18131,6 +18186,16 @@ snapshots:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
react: 19.0.0-rc-7771d3a7-20240827
react-dom: 19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827)
optionalDependencies:
'@types/react': 18.3.9
'@types/react-dom': 18.3.0
'@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.25.6
@@ -20116,6 +20181,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.7.0
eslint: 9.11.1(jiti@2.3.3)
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies:
'@typescript-eslint/scope-manager': 6.21.0
@@ -20142,6 +20225,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.7.0
debug: 4.3.7
eslint: 9.11.1(jiti@2.3.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@6.21.0':
dependencies:
'@typescript-eslint/types': 6.21.0
@@ -20176,6 +20272,18 @@ snapshots:
- eslint
- supports-color
'@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.3)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
'@typescript-eslint/types@6.21.0': {}
'@typescript-eslint/types@8.7.0': {}
@@ -20210,6 +20318,21 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.3)':
dependencies:
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/visitor-keys': 8.7.0
debug: 4.3.7
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
@@ -20235,6 +20358,17 @@ snapshots:
- supports-color
- typescript
'@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.3.3))
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.3)
eslint: 9.11.1(jiti@2.3.3)
transitivePeerDependencies:
- supports-color
- typescript
'@typescript-eslint/visitor-keys@6.21.0':
dependencies:
'@typescript-eslint/types': 6.21.0
@@ -23523,6 +23657,26 @@ snapshots:
- eslint-plugin-import-x
- supports-color
eslint-config-next@15.0.0-canary.149(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3):
dependencies:
'@next/eslint-plugin-next': 15.0.0-canary.149
'@rushstack/eslint-patch': 1.10.4
'@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.11.1(jiti@2.3.3)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@9.11.1(jiti@2.3.3))
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3))
eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.3.3))
eslint-plugin-react: 7.36.1(eslint@9.11.1(jiti@2.3.3))
eslint-plugin-react-hooks: 4.6.2(eslint@9.11.1(jiti@2.3.3))
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7
@@ -23569,6 +23723,25 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@9.11.1(jiti@2.3.3)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 9.11.1(jiti@2.3.3)
eslint-module-utils: 2.11.1(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3))
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3))
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
eslint-module-utils@2.11.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
debug: 3.2.7
@@ -23591,6 +23764,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.11.1(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
eslint: 9.11.1(jiti@2.3.3)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@9.11.1(jiti@2.3.3))
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
@@ -23647,6 +23831,34 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
eslint: 9.11.1(jiti@2.3.3)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.11.1(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.3.3))
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
minimatch: 3.1.2
object.fromentries: 2.0.8
object.groupby: 1.0.3
object.values: 1.2.0
semver: 6.3.1
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.3.3))(typescript@5.6.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1):
dependencies:
aria-query: 5.1.3
@@ -24264,6 +24476,13 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
framer-motion@11.11.0(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827):
dependencies:
tslib: 2.7.0
optionalDependencies:
react: 19.0.0-rc-7771d3a7-20240827
react-dom: 19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827)
framer-motion@11.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
tslib: 2.7.0
@@ -27958,6 +28177,14 @@ snapshots:
postcss: 8.4.47
ts-node: 10.9.1(@types/node@20.16.9)(typescript@5.6.2)
postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3)):
dependencies:
lilconfig: 3.1.2
yaml: 2.5.1
optionalDependencies:
postcss: 8.4.47
ts-node: 10.9.1(@types/node@20.16.9)(typescript@5.6.3)
postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2)):
dependencies:
lilconfig: 3.1.2
@@ -28548,6 +28775,17 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.9
react-remove-scroll@2.6.0(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827):
dependencies:
react: 19.0.0-rc-7771d3a7-20240827
react-remove-scroll-bar: 2.3.6(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
react-style-singleton: 2.2.1(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
tslib: 2.7.0
use-callback-ref: 1.3.2(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
use-sidecar: 1.1.2(@types/react@18.3.9)(react@19.0.0-rc-7771d3a7-20240827)
optionalDependencies:
'@types/react': 18.3.9
react-resizable-panels@2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
@@ -29817,6 +30055,10 @@ snapshots:
dependencies:
tailwindcss: 3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.2))
tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3))):
dependencies:
tailwindcss: 3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3))
tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2))):
dependencies:
tailwindcss: 3.4.13(ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2))
@@ -29844,7 +30086,7 @@ snapshots:
postcss: 8.4.47
postcss-import: 15.1.0(postcss@8.4.47)
postcss-js: 4.0.1(postcss@8.4.47)
postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2))
postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3))
postcss-nested: 6.2.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
@@ -29879,6 +30121,33 @@ snapshots:
transitivePeerDependencies:
- ts-node
tailwindcss@3.4.13(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3)):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.6
lilconfig: 2.1.0
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.0
postcss: 8.4.47
postcss-import: 15.1.0(postcss@8.4.47)
postcss-js: 4.0.1(postcss@8.4.47)
postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3))
postcss-nested: 6.2.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
tailwindcss@3.4.13(ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2)):
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -30104,6 +30373,10 @@ snapshots:
dependencies:
typescript: 5.6.2
ts-api-utils@1.3.0(typescript@5.6.3):
dependencies:
typescript: 5.6.3
ts-dedent@2.2.0: {}
ts-deepmerge@7.0.1: {}
@@ -30129,6 +30402,25 @@ snapshots:
yn: 3.1.1
optional: true
ts-node@10.9.1(@types/node@20.16.9)(typescript@5.6.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
'@types/node': 20.16.9
acorn: 8.12.1
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
typescript: 5.6.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optional: true
ts-node@10.9.1(@types/node@22.3.0)(typescript@5.6.2):
dependencies:
'@cspotcode/source-map-support': 0.8.1