diff --git a/packages/canyon-platform/app/api/auth/[...nextauth]/route.ts b/packages/canyon-platform/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000..00db783e --- /dev/null +++ b/packages/canyon-platform/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,2 @@ +import { handlers } from "@/auth"; // Referring to the auth.ts we just created +export const { GET, POST } = handlers; diff --git a/packages/canyon-platform/app/api/user/route.ts b/packages/canyon-platform/app/api/user/route.ts index 4ae03f69..16cbaf88 100644 --- a/packages/canyon-platform/app/api/user/route.ts +++ b/packages/canyon-platform/app/api/user/route.ts @@ -1,8 +1,10 @@ // export const dynamic = 'force-static' -import prisma from "@/lib/prisma"; +// import prisma from "@/lib/prisma"; +import { auth } from "@/auth"; export async function GET() { // const users = await prisma.user.findMany(); - - return Response.json({ data: [] }); + const session = await auth(); + // console.log(session.user); + return Response.json(session.user); } diff --git a/packages/canyon-platform/app/globals.css b/packages/canyon-platform/app/globals.css index 3879c70a..8e5260ba 100755 --- a/packages/canyon-platform/app/globals.css +++ b/packages/canyon-platform/app/globals.css @@ -26,6 +26,25 @@ body { border-inline-end: none !important; } +/*登陆页面*/ +.ant-tabs-nav { + padding-left: 40px !important; +} + + +.ant-table-wrapper .ant-table-pagination.ant-pagination { + margin-right: 16px; +} + +.ant-collapse-header { + background-color: #f8f9fa !important; + padding: 24px 20px !important; +} + +.ant-collapse-item { + margin-bottom: 0 !important; +} + a { color: #0071c2 !important; } diff --git a/packages/canyon-platform/app/login/LoginBtn.tsx b/packages/canyon-platform/app/login/LoginBtn.tsx new file mode 100644 index 00000000..7e07478f --- /dev/null +++ b/packages/canyon-platform/app/login/LoginBtn.tsx @@ -0,0 +1,56 @@ +import { FC } from "react"; + +// import github from "../../../../../assets/img/github.svg"; +// import gitlab from "../../../../../assets/img/gitlab.svg"; +// import google from "../../../../../assets/img/google.svg"; +import { Button } from "antd"; +import { signIn } from "next-auth/react"; +import Image from "next/image"; +// import img from '../../../../../assets/img/img.png'; + +const LoginBtn: FC<{ + oauthUrl: { google?: string; github?: string; gitlab?: string }; +}> = ({ oauthUrl }) => { + return ( +
+ + + + +
+ ); +}; +export default LoginBtn; diff --git a/packages/canyon-platform/app/login/LoginForm.tsx b/packages/canyon-platform/app/login/LoginForm.tsx new file mode 100644 index 00000000..8de2c6c9 --- /dev/null +++ b/packages/canyon-platform/app/login/LoginForm.tsx @@ -0,0 +1,60 @@ +// import { useRequest } from "ahooks"; +import { FC } from "react"; +import { Button, Form, Input } from "antd"; +const onFinishFailed = (errorInfo: any) => { + console.log("Failed:", errorInfo); +}; + +type FieldType = { + companyname?: string; + username?: string; + password?: string; +}; + +const LoginForm: FC<{ + onLoginSuccess: () => void; +}> = ({ onLoginSuccess }) => { + const [form] = Form.useForm(); + const onFinish = (values: any) => { + console.log("Success:", values); + // run({ + // companyname: String(values.companyname), + // username: String(values.username), + // password: String(values.password), + // }); + }; + return ( +
+ + label="Username" + name="username" + rules={[{ required: true, message: "Please input your username!" }]} + > + + + + + label="Password" + name="password" + rules={[{ required: true, message: "Please input your password!" }]} + > + + + + + + + + ); +}; + +export default LoginForm; diff --git a/packages/canyon-platform/app/login/page.tsx b/packages/canyon-platform/app/login/page.tsx index 7f6661c9..80ab8f6e 100644 --- a/packages/canyon-platform/app/login/page.tsx +++ b/packages/canyon-platform/app/login/page.tsx @@ -1,20 +1,91 @@ "use client"; -import { useTranslations } from "next-intl"; -import useSWR from "swr"; -import axios from "axios"; -const fetcher = (url: any) => - axios - .post(url, { - name: "locale", - value: "cn", - }) - .then((res) => res.data); +import Icon from "@ant-design/icons"; +import { FC } from "react"; -const LoginPage = () => { - // const - const { data, error, isLoading } = useSWR("/api/cookie", fetcher); - const t = useTranslations(); - return
{t("welcome.hello")}
; +// import { EpTopRight } from "../../../../../assets/icons/EpTopRight.tsx"; +// import img from "../../../../../assets/img/img.png"; +// import { CanyonCardPrimary } from "../../card"; +import LoginBtn from "./LoginBtn"; +import LoginForm from "./LoginForm"; +import { Divider, Tabs, Typography } from "antd"; +import { CanyonCardPrimary } from "@/components/wget/card"; +import { EpTopRight } from "@/components/EpTopRight"; +import WithTheme from "@/theme"; +import Image from "next/image"; + +const { Title } = Typography; + +const CanyonPageLogin: FC<{ + // onLoginSuccess: () => void; + // oauthUrl: { gitlab: string }; + // logo: React.ReactNode; + // register?: string; +}> = () => { + const { onLoginSuccess, oauthUrl, logo, register } = { + onLoginSuccess: () => {}, + oauthUrl: { gitlab: "" }, + logo: "", + register: "", + }; + return ( +
+
+ +
+
+ + <Image width={45} height={45} src={`/logo.svg`} alt={""} /> + +
+ +
+
+ Log in and continue +
+ + + Register + + +
+ ) + } + items={[ + { + label: "Sign In", + key: "login", + children: ( +
+ + + +
+ ), + }, + ]} + /> +
+
+ +
+ +
+ + ); }; -export default LoginPage; +export default () => WithTheme(); diff --git a/packages/canyon-platform/auth.ts b/packages/canyon-platform/auth.ts new file mode 100644 index 00000000..20e5331d --- /dev/null +++ b/packages/canyon-platform/auth.ts @@ -0,0 +1,63 @@ +import NextAuth from "next-auth"; +import GitLab from "next-auth/providers/gitlab"; +import GitHub from "next-auth/providers/github"; +import prisma from "@/lib/prisma"; + +export const { handlers, auth } = NextAuth({ + providers: [ + GitLab({ + // authorization: "https://git.com/oauth/authorize?scope=read_user", + // token: "https://git.com/oauth/token", + // userinfo: "https://git.com/api/v4/user", + }), + GitHub, + ], + callbacks: { + redirect: async () => { + return "/projects"; + }, + // 登陆的时候从gitlab获取用户信息 + async signIn({ profile, account, user }) { + const userTest: any = { + accessToken: "accessToken", + refreshToken: "refreshToken", + username: profile?.username || profile?.login || "username", + nickname: user.name, + avatar: user.image || "/default-avatar.png", + email: user.email, + password: "123456", + favor: "", + createdAt: new Date(), + }; + + await prisma.user.upsert({ + where: { + // @ts-ignore + id: String(account.provider + "-" + profile.id), + }, + update: { + accessToken: "accessToken", + refreshToken: "refreshToken", + }, + create: { + // @ts-ignore + id: String(account.provider + "-" + profile.id), + ...userTest, + }, + }); + return true; + }, + jwt({ token, user, profile, account }) { + if (user) { + // @ts-ignore + token.id = String(account.provider + "-" + profile.id); + } + return token; + }, + session({ session, token }) { + // @ts-ignore + session.user.id = token.id; + return session; + }, + }, +}); diff --git a/packages/canyon-platform/components/EpTopRight.tsx b/packages/canyon-platform/components/EpTopRight.tsx new file mode 100644 index 00000000..413d1e2b --- /dev/null +++ b/packages/canyon-platform/components/EpTopRight.tsx @@ -0,0 +1,23 @@ +// import React from 'react'; +import type { SVGProps } from "react"; + +export function EpTopRight(props: SVGProps) { + return ( + + + + + ); +} diff --git a/packages/canyon-platform/components/UserAvatar.tsx b/packages/canyon-platform/components/UserAvatar.tsx new file mode 100644 index 00000000..eea75ac7 --- /dev/null +++ b/packages/canyon-platform/components/UserAvatar.tsx @@ -0,0 +1,13 @@ +import { auth } from "@/auth"; + +export default async function UserAvatar() { + const session = await auth(); + + if (!session?.user) return null; + + return ( +
+ User Avatar +
+ ); +} diff --git a/packages/canyon-platform/components/sign-in.tsx b/packages/canyon-platform/components/sign-in.tsx new file mode 100644 index 00000000..aa8398dd --- /dev/null +++ b/packages/canyon-platform/components/sign-in.tsx @@ -0,0 +1,12 @@ +"use client"; + +import { signIn } from "next-auth/react"; + +export default function SignIn() { + return ( +
+ ; + ; +
+ ); +} diff --git a/packages/canyon-platform/components/wget/card/Primary.tsx b/packages/canyon-platform/components/wget/card/Primary.tsx new file mode 100644 index 00000000..b5cf4e48 --- /dev/null +++ b/packages/canyon-platform/components/wget/card/Primary.tsx @@ -0,0 +1,24 @@ +import { FC } from "react"; +import { theme } from "antd"; + +const { useToken } = theme; +const CanyonCardPrimary: FC<{ + theme?: any; + language?: any; + children: any; +}> = ({ theme, language, children }) => { + const { token } = useToken(); + return ( +
+ {children} +
+ ); +}; + +export default CanyonCardPrimary; diff --git a/packages/canyon-platform/components/wget/card/index.ts b/packages/canyon-platform/components/wget/card/index.ts new file mode 100644 index 00000000..800d5e80 --- /dev/null +++ b/packages/canyon-platform/components/wget/card/index.ts @@ -0,0 +1 @@ +export { default as CanyonCardPrimary } from "./Primary"; diff --git a/packages/canyon-platform/components/wget/layout/main-box.tsx b/packages/canyon-platform/components/wget/layout/main-box.tsx index c7db6a8e..0d04124b 100644 --- a/packages/canyon-platform/components/wget/layout/main-box.tsx +++ b/packages/canyon-platform/components/wget/layout/main-box.tsx @@ -17,6 +17,7 @@ import React, { useEffect, useMemo } from "react"; // import CIcon from "@/components/c-icon"; import AppFooter from "@/components/wget/layout/app-footer"; import Link from "next/link"; +import useSWR from "swr"; const menuItems = [ { @@ -59,8 +60,11 @@ const MeData = { }, }; const { useToken } = theme; +const fetcher = (url: string) => fetch(url).then((res) => res.json()); + const MainBoxWrap = ({ children }: React.PropsWithChildren) => { const routeName = usePathname(); + const { data, error } = useSWR("/api/user", fetcher); const { id, sha } = useParams(); // 获取动态路由参数 const { token } = useToken(); const onSelectMenu = (selectInfo: any) => { @@ -185,17 +189,22 @@ const MainBoxWrap = ({ children }: React.PropsWithChildren) => { >
- +
- {MeData?.me.nickname} + {data?.name} - - {MeData?.me.email || ""} + + {data?.email || ""}
{/**/} diff --git a/packages/canyon-platform/middleware.ts b/packages/canyon-platform/middleware.ts new file mode 100644 index 00000000..8155fe04 --- /dev/null +++ b/packages/canyon-platform/middleware.ts @@ -0,0 +1 @@ +export { auth as middleware } from "@/auth"; diff --git a/packages/canyon-platform/package.json b/packages/canyon-platform/package.json index 1008423e..3c606ace 100755 --- a/packages/canyon-platform/package.json +++ b/packages/canyon-platform/package.json @@ -25,16 +25,16 @@ "echarts-for-react": "^3.0.2", "lucide-react": "^0.460.0", "next": "15.0.3", + "next-auth": "5.0.0-beta.25", + "next-intl": "^3.25.3", "prisma": "5.16.1", "react": "^19.0.0", "react-dom": "^19.0.0", "recharts": "^2.13.3", "shiki": "^1.22.1", - "swr": "^2.2.5", - "next-intl": "^3.25.3" + "swr": "^2.2.5" }, "devDependencies": { - "tailwind-merge": "^2.5.5", "@iconify/json": "^2.2.242", "@iconify/tailwind": "^1.1.3", "@types/node": "^20", @@ -49,6 +49,7 @@ "postcss": "^8", "swc-plugin-canyon": "2.0.0-beta.3", "swc-plugin-coverage-instrument": "^0.0.25", + "tailwind-merge": "^2.5.5", "tailwindcss": "^3.4.1", "tailwindcss-animate": "^1.0.7", "typescript": "^5" diff --git a/packages/canyon-platform/public/providers/github.svg b/packages/canyon-platform/public/providers/github.svg new file mode 100644 index 00000000..6eeeace6 --- /dev/null +++ b/packages/canyon-platform/public/providers/github.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-platform/public/providers/gitlab.svg b/packages/canyon-platform/public/providers/gitlab.svg new file mode 100644 index 00000000..f5556c4b --- /dev/null +++ b/packages/canyon-platform/public/providers/gitlab.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-platform/public/providers/google.svg b/packages/canyon-platform/public/providers/google.svg new file mode 100644 index 00000000..6f895153 --- /dev/null +++ b/packages/canyon-platform/public/providers/google.svg @@ -0,0 +1 @@ + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68f632d3..7706db8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 9.1.7 pnpm: specifier: latest - version: 9.14.4 + version: 9.15.0 turbo: specifier: latest version: 2.3.3 @@ -226,6 +226,9 @@ importers: next: specifier: 15.0.3 version: 15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-auth: + specifier: 5.0.0-beta.25 + version: 5.0.0-beta.25(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) next-intl: specifier: ^3.25.3 version: 3.25.3(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) @@ -468,10 +471,10 @@ importers: version: 2.0.0(typescript@5.7.2) vite: specifier: latest - version: 6.0.2(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1) + version: 6.0.3(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1) vite-plugin-istanbul: specifier: latest - version: 6.0.2(vite@6.0.2(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)) + version: 6.0.2(vite@6.0.3(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)) tools/canyon-sdk: dependencies: @@ -499,7 +502,7 @@ importers: version: 1.7.40(@swc/helpers@0.5.15) rolldown: specifier: nightly - version: 0.15.0-snapshot-22747a3-20241206003640(@babel/runtime@7.26.0) + version: 0.15.0-snapshot-de64ad9-20241209003633(@babel/runtime@7.26.0) tools/canyon-uploader: dependencies: @@ -527,7 +530,7 @@ importers: version: 1.7.40(@swc/helpers@0.5.15) rolldown: specifier: nightly - version: 0.15.0-snapshot-22747a3-20241206003640(@babel/runtime@7.26.0) + version: 0.15.0-snapshot-de64ad9-20241209003633(@babel/runtime@7.26.0) packages: @@ -600,6 +603,20 @@ packages: peerDependencies: react: '>=16.9.0' + '@auth/core@0.37.2': + resolution: {integrity: sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + '@babel/cli@7.25.9': resolution: {integrity: sha512-I+02IfrTiSanpxJBlZQYb18qCxB6c2Ih371cVpfgIrPQrjAYkf45XxomTJOG8JBWX5GY35/+TmhCMdJ4ZPkL8Q==} engines: {node: '>=6.9.0'} @@ -1922,6 +1939,9 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2014,67 +2034,67 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rolldown/binding-darwin-arm64@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-qQwxvtYrA0H8W/WeTVxCLuXqiQ6Ivfi6P5yOrSqjEdgkSTwn2hHxbGRoOULQ8c5Anb2eM+/h7PcBzdLXbm0+sg==} + '@rolldown/binding-darwin-arm64@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-NszzqLpq51ql/AlyRv0tyz+zKgUSl3NFM64nu4lrSC7kkoiApZE8xUIqybDGMt0gMrd/oSLpsKixyeJQH7BJ4w==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-ZjR33I0GI5p0cvIzBGYJDiwDXoN6v+uu16ixZ0aN1CTFiVWy/OxOw7ZBxSJSv542C/FTCquYlQMNlio5gu8/yA==} + '@rolldown/binding-darwin-x64@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-+5x3M6UBS6vockC1pEpNwNEQv7BBytar7jvKo/hWgPV39x2AiszLRslNEX7N8Xovlo1ecpkVLmwfrUsvrfD+YA==} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-qrcmSG61bmfSSSy2LACrrMutkQvS6guLvjEqavHZEAHHXAK41mA5SePqreToeiqKYNRZlHxim4EkyRxeDE4YQw==} + '@rolldown/binding-freebsd-x64@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-CZRqAXJghqB/CTJVoKrkS7rqS+Q+ZHR6J/g+IdJSLXYIewVUMDswwcBjucZ0cz+ol8UQKcj90Stq9uRUkS+iLA==} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-JhPLDKH3fw8oggOwUwDxzh3rIqk/qcOArTEMje213PDMehJdvVBPLYdzFlm3s6shge6lC8OZU6zqgzKPTJfoSA==} + '@rolldown/binding-linux-arm-gnueabihf@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-InnY0/csQrDkbcdHBhyv3NIfzwVXX2AN6n0yejcJdwTBwWk9SoBMyRlBVbbmaXHGaIuEOsvyUtSP7UnzebfPZQ==} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-5B/VPjoXabZ8kWmdWjraYPkUYLxVPftSdiIrkGqQWgP5mQVUZaFrf09giw8NqxbJihdCcd1AiVRoNaYVsnLukw==} + '@rolldown/binding-linux-arm64-gnu@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-v+qWM02F8vL+6LRCbm2o69So+fx1+/7cn8HNTYnZPMft+GZWLydsIGhykF30BOEEdn3RCPbuKlaQJHUPBDunbw==} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-VoEjypm09HjJvSbcEB+ec7OfRMvHij2ECBerRBZcPr9Hhx6UY1noHFNsJIJj5yhtariXrpq2nVj9zBnNX5WbpQ==} + '@rolldown/binding-linux-arm64-musl@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-SdCRfgazwbHb9EIAX8ZLbGK586WS5lAmVpEM4gm10s29n85OX1aoFyPWD/diQ3zv7ul8XObIj5TUlbHMGYlWOw==} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-DKmGLiqKKuHa60aQgVPPMjhUXoFRe6gdzembpWDQ7HoGQlAv9fwI+qMldnmKMoiEf94VCGUDJLiqhMa0vpFCSQ==} + '@rolldown/binding-linux-x64-gnu@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-nUblcr19AlGdzPS8YC0OwPehANxWLQpqr3o0/OKTNBbPSj20io+CATauSz1bxTcd6ssMSYiRKsrsmrlE5TNjpA==} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-Kb0PxQVWj3sVjTpoYvHbUoREzAfQyqvLBZ2zXmWPW5ec8gFxayM+8OleYcbFXfTF/VBas+rzDXZ8havTsXopsA==} + '@rolldown/binding-linux-x64-musl@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-E7xu0hRMiyQVutgf/cNmKJTmn6vGyt8OtF/V4PlkqMlY5pZ/MLAdxqCOtGyzB6IHNdA9l3HAiVW89X07OxdrLw==} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-wasm32-wasi@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-3rBmdEEWPpVOFaOoE9csk3teZcfAiERmirN0h3Fi3hiIMtbegV8nwESoJOGMkcf0HFF0AxhTrBfEA876lDosBw==} + '@rolldown/binding-wasm32-wasi@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-sygxTVcrcBFII4nG7VCAXRIOGPd2n9YwW5EbDmeVJ068i0A/2/zjUw8c/Tj3RlyJFa8ZpjM9aoM+jsP/57ctSg==} engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-owuSEVERSW4SDFPJlq45oy0W0lY8+UFo7DOa3Jh9VnJGjz8LrwpiO0utDeNyxbyA/jcvkSjBWd7mdgs80hhcHg==} + '@rolldown/binding-win32-arm64-msvc@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-y2myoo/CNeA+urujbeLZ0ufhx6WjgxT8K2wEbVuuMhpgKxL/zciQAXP/Sm7Lb3uDjt69uyJpDy1jlJfW/NbnDg==} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-/NetUp293hWlz2igozjpbsPOtq7ez5wwBIbqVup0BJjO0ME175aKRgpY1dWW7dg3PJbm9gBXz6++EwfGKPR4Yw==} + '@rolldown/binding-win32-ia32-msvc@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-OhdUa9F33CfJF12NksJBxN/3l/lgtszoJWiLWCrqUjMPZagQb8KJUOobZuHSRHGLwqOkEohRHsny1oV1sz37hg==} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@0.15.0-snapshot-22747a3-20241206003640': - resolution: {integrity: sha512-CR2vjFeG4gx0/0gzkwxLnW6ghxzsPcHEylFDePpIRYZfQnNZSq10R7TghzkP/4POksyLEWeCzLblct+BqmI7Lw==} + '@rolldown/binding-win32-x64-msvc@0.15.0-snapshot-de64ad9-20241209003633': + resolution: {integrity: sha512-VJn1pgeaS4vFg444q/J79xiwkgmaaSjItl/V2EzeoRU1H2R6ag0V91pZ39YNKiZnDHCHbCLbxTB5ejKeyYNbbA==} cpu: [x64] os: [win32] @@ -2522,6 +2542,9 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} @@ -4882,6 +4905,9 @@ packages: resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} hasBin: true + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5322,6 +5348,22 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-auth@5.0.0-beta.25: + resolution: {integrity: sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + next: ^14.0.0-0 || ^15.0.0-0 + nodemailer: ^6.6.5 + react: ^18.2.0 || ^19.0.0-0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + next-intl@3.25.3: resolution: {integrity: sha512-3VQ+OZdU9Z2enx5uWLYfmd/eb/gZN6QIfj59ROE/R+MTSD7ZAOPsGFnKqj5wwqm4EISGviYenkSuxypyYnhomA==} peerDependencies: @@ -5415,6 +5457,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + oauth4webapi@3.1.4: + resolution: {integrity: sha512-eVfN3nZNbok2s/ROifO0UAc5G8nRoLSbrcKJ09OqmucgnhXEfdIQOR4gq1eJH1rN3gV7rNw62bDEgftsgFtBEg==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5652,8 +5697,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm@9.14.4: - resolution: {integrity: sha512-yBgLP75OS8oCyUI0cXiWtVKXQKbLrfGfp4JUJwQD6i8n1OHUagig9WyJtj3I6/0+5TMm2nICc3lOYgD88NGEqw==} + pnpm@9.15.0: + resolution: {integrity: sha512-duI3l2CkMo7EQVgVvNZije5yevN3mqpMkU45RBVsQpmSGon5djge4QfUHxLPpLZmgcqccY8GaPoIMe1MbYulbA==} engines: {node: '>=18.12'} hasBin: true @@ -5868,6 +5913,14 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + preact-render-to-string@5.2.3: + resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} + peerDependencies: + preact: '>=10' + + preact@10.11.3: + resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -5894,6 +5947,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + prisma@5.16.1: resolution: {integrity: sha512-Z1Uqodk44diztImxALgJJfNl2Uisl9xDRvqybMKEBYJLNKNhDfAHf+ZIJbZyYiBhLMbKU9cYGdDVG5IIXEnL2Q==} engines: {node: '>=16.13'} @@ -6366,8 +6422,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@0.15.0-snapshot-22747a3-20241206003640: - resolution: {integrity: sha512-jeeMxobtlNzBhch6VXHWh2o2Sjkkw6qwHlHWWwdrtTzc+Us12uqt5Nao4Tcz6pUbFg7AIgufPnD50n7DhN8c5w==} + rolldown@0.15.0-snapshot-de64ad9-20241209003633: + resolution: {integrity: sha512-q1dHKqM/lFgJKu0zQuy89FkBvoMJNLlsOngJedw9VOG6knxhoLiccgZjPLTs89JVF14afCf9epwMw1PBvZqrmw==} hasBin: true peerDependencies: '@babel/runtime': '>=7' @@ -7260,8 +7316,8 @@ packages: peerDependencies: vite: '>=4 <=6' - vite@6.0.2: - resolution: {integrity: sha512-XdQ+VsY2tJpBsKGs0wf3U/+azx8BBpYRHFAyKm5VeEZNOJZRB63q7Sc8Iup3k0TrN3KO6QgyzFf+opSbfY1y0g==} + vite@6.0.3: + resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -7580,6 +7636,16 @@ snapshots: resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 + '@auth/core@0.37.2': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.7.1 + jose: 5.9.6 + oauth4webapi: 3.1.4 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + '@babel/cli@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8897,6 +8963,8 @@ snapshots: transitivePeerDependencies: - encoding + '@panva/hkdf@1.2.1': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -9061,42 +9129,42 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@rolldown/binding-darwin-arm64@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-darwin-arm64@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-darwin-x64@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-darwin-x64@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-freebsd-x64@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-freebsd-x64@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-linux-arm-gnueabihf@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-linux-arm-gnueabihf@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-linux-arm64-gnu@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-linux-arm64-gnu@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-linux-arm64-musl@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-linux-arm64-musl@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-linux-x64-gnu@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-linux-x64-gnu@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-linux-x64-musl@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-linux-x64-musl@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-wasm32-wasi@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-wasm32-wasi@0.15.0-snapshot-de64ad9-20241209003633': dependencies: '@napi-rs/wasm-runtime': 0.2.5 optional: true - '@rolldown/binding-win32-arm64-msvc@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-win32-arm64-msvc@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-win32-ia32-msvc@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-win32-ia32-msvc@0.15.0-snapshot-de64ad9-20241209003633': optional: true - '@rolldown/binding-win32-x64-msvc@0.15.0-snapshot-22747a3-20241206003640': + '@rolldown/binding-win32-x64-msvc@0.15.0-snapshot-de64ad9-20241209003633': optional: true '@rollup/plugin-alias@5.1.1(rollup@3.29.5)': @@ -9481,6 +9549,8 @@ snapshots: dependencies: '@types/node': 20.17.9 + '@types/cookie@0.6.0': {} + '@types/cookiejar@2.1.5': {} '@types/d3-array@3.2.1': {} @@ -11185,8 +11255,8 @@ snapshots: '@typescript-eslint/parser': 8.16.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) @@ -11209,37 +11279,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.16.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -11250,7 +11320,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -12587,6 +12657,8 @@ snapshots: jiti@2.4.0: {} + jose@5.9.6: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -12997,6 +13069,12 @@ snapshots: neo-async@2.6.2: {} + next-auth@5.0.0-beta.25(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0): + dependencies: + '@auth/core': 0.37.2 + next: 15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + next-intl@3.25.3(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0): dependencies: '@formatjs/intl-localematcher': 0.5.8 @@ -13101,6 +13179,8 @@ snapshots: dependencies: boolbase: 1.0.0 + oauth4webapi@3.1.4: {} + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -13319,7 +13399,7 @@ snapshots: pluralize@8.0.0: {} - pnpm@9.14.4: {} + pnpm@9.15.0: {} possible-typed-array-names@1.0.0: {} @@ -13516,6 +13596,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact-render-to-string@5.2.3(preact@10.11.3): + dependencies: + preact: 10.11.3 + pretty-format: 3.8.0 + + preact@10.11.3: {} + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 @@ -13547,6 +13634,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@3.8.0: {} + prisma@5.16.1: dependencies: '@prisma/engines': 5.16.1 @@ -14438,23 +14527,23 @@ snapshots: dependencies: glob: 7.2.3 - rolldown@0.15.0-snapshot-22747a3-20241206003640(@babel/runtime@7.26.0): + rolldown@0.15.0-snapshot-de64ad9-20241209003633(@babel/runtime@7.26.0): dependencies: zod: 3.23.8 optionalDependencies: '@babel/runtime': 7.26.0 - '@rolldown/binding-darwin-arm64': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-darwin-x64': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-freebsd-x64': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-linux-arm-gnueabihf': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-linux-arm64-gnu': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-linux-arm64-musl': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-linux-x64-gnu': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-linux-x64-musl': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-wasm32-wasi': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-win32-arm64-msvc': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-win32-ia32-msvc': 0.15.0-snapshot-22747a3-20241206003640 - '@rolldown/binding-win32-x64-msvc': 0.15.0-snapshot-22747a3-20241206003640 + '@rolldown/binding-darwin-arm64': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-darwin-x64': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-freebsd-x64': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-linux-arm-gnueabihf': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-linux-arm64-gnu': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-linux-arm64-musl': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-linux-x64-gnu': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-linux-x64-musl': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-wasm32-wasi': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-win32-arm64-msvc': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-win32-ia32-msvc': 0.15.0-snapshot-de64ad9-20241209003633 + '@rolldown/binding-win32-x64-msvc': 0.15.0-snapshot-de64ad9-20241209003633 rollup-plugin-dts@6.1.1(rollup@3.29.5)(typescript@5.7.2): dependencies: @@ -15462,7 +15551,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-istanbul@6.0.2(vite@6.0.2(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)): + vite-plugin-istanbul@6.0.2(vite@6.0.3(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)): dependencies: '@istanbuljs/load-nyc-config': 1.1.0 espree: 10.3.0 @@ -15470,11 +15559,11 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.4 test-exclude: 6.0.0 - vite: 6.0.2(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1) + vite: 6.0.3(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1) transitivePeerDependencies: - supports-color - vite@6.0.2(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1): + vite@6.0.3(@types/node@20.17.9)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1): dependencies: esbuild: 0.24.0 postcss: 8.4.49 diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 92f9db76..4daf288d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -10,6 +10,21 @@ datasource db { url = env("DATABASE_URL") // uses connection pooling } +model User { + id String @id + username String + password String + nickname String + avatar String + refreshToken String @map("refresh_token") + accessToken String @map("access_token") + email String + favor String + createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(3) + + @@map("canyon_v3_user") +} + model Coverage { id String @id @default(cuid()) sha String