prisma and auth init

上级 90f4931c
# * Create an .env file with the following content:
# Created by Vercel CLI
NEXT_PUBLIC_APP_URL=""
NX_DAEMON=""
TURBO_REMOTE_ONLY=""
TURBO_RUN_SUMMARY=""
VERCEL=""
VERCEL_ENV=""
VERCEL_GIT_COMMIT_AUTHOR_LOGIN=""
VERCEL_GIT_COMMIT_AUTHOR_NAME=""
VERCEL_GIT_COMMIT_MESSAGE=""
VERCEL_GIT_COMMIT_REF=""
VERCEL_GIT_COMMIT_SHA=""
VERCEL_GIT_PREVIOUS_SHA=""
VERCEL_GIT_PROVIDER=""
VERCEL_GIT_PULL_REQUEST_ID=""
VERCEL_GIT_REPO_ID=""
VERCEL_GIT_REPO_OWNER=""
VERCEL_GIT_REPO_SLUG=""
VERCEL_URL=""
# Postgres
POSTGRES_URL=""
POSTGRES_PRISMA_URL=""
POSTGRES_URL_NON_POOLING=""
POSTGRES_USER=""
POSTGRES_HOST=""
POSTGRES_PASSWORD=""
POSTGRES_DATABASE=""
# Providers
GITHUB_ID=""
GITHUB_SECRET=""
# Auth config
NEXTAUTH_SECRET=""
NEXTAUTH_URL=""
......@@ -25,6 +25,7 @@ yarn-error.log*
# local env files
.env
.env.local
.env*.local
.env.development.local
.env.test.local
.env.production.local
......
import NextAuth from 'next-auth';
import { authConfig } from '@/lib/auth';
const authHandler = NextAuth(authConfig);
export {authHandler as GET , authHandler as POST};
......@@ -2,6 +2,7 @@ import '@/styles/website.scss';
import { creator, description, name, uiUrl } from '@/config/site';
import PageProgress from '@/components/PageProgress';
import { NextAuthProvider } from '@/components/NextAuthProvider';
export const metadata = {
title: {
......@@ -74,7 +75,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
</head>
<body className="body-gradient">
<PageProgress />
{children}
<NextAuthProvider>{children}</NextAuthProvider>
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
<script src="https://assets.lemonsqueezy.com/lemon.js" defer />
</body>
......
'use client';
import { SessionProvider } from 'next-auth/react';
type Props = {
children?: React.ReactNode;
};
export const NextAuthProvider = ({ children }: Props) => {
return <SessionProvider>{children}</SessionProvider>;
};
\ No newline at end of file
......@@ -20,6 +20,7 @@ import Link from '@/components/Link';
import NavLink from '@/components/NavLink';
import Shape from '@/components/Shape';
import { usePathname } from 'next/navigation';
import { signOut, useSession } from 'next-auth/react';
const NavDropdown = ({ title, children, active, footer = false }) => {
return (
......@@ -117,7 +118,7 @@ const menuLinks = [
{
menu: 'sponsors',
href: sponsorsUrl,
type: 'blankButton',
type: 'button',
title: (
<span>
Sponsor<span className="d-none lg:d-inline"> project</span>
......@@ -125,31 +126,12 @@ const menuLinks = [
),
icon: <Icon name="heart" filled color="red" />,
},
{
menu: 'signin',
href: '/signin',
type: 'button',
title: (
<span>
Login
</span>
),
},
];
const NavbarLink = (link, menu) => {
// const router = useRouter()
if (link.type === 'button') {
return (
<div className="navbar-item">
<a href={link.href} className="btn">
{link.icon}
{link.title}
</a>
</div>
);
} else if (link.type === 'blankButton') {
return (
<div className="navbar-item">
<a href={link.href} className="btn" target="_blank" rel="noopener noreferrer">
......@@ -229,8 +211,28 @@ const Navbar = ({
onClick?: (event: React.MouseEvent) => void;
className?: string
}) => {
const { data: session, status } = useSession();
return <div className={clsx('navbar', opened && 'opened', props.className)}>
{menuLinks.map((link) => (<Fragment key={link.menu}>{NavbarLink(link, menu)}</Fragment>))}
<div className="navbar-item">
{
!session &&
<a href="/api/auth/signin" className="btn">
{
status === 'loading'
? 'Validating session ...'
: 'Log in'
}
</a>
}
{
session &&
<a onClick={() => signOut()} className="btn">
Log out
</a>
}
</div>
</div>;
};
......
......@@ -3,9 +3,14 @@
import Link from '@/components/Link';
import { useRouter } from 'next/navigation';
import Icon from '@/components/Icon';
import { signIn } from 'next-auth/react';
export default function Signin() {
const router = useRouter();
const router = useRouter();'/';
const handleLogin = async (provider: 'github'): Promise<void> => {
await signIn(provider, {callbackUrl: '/'});
};
return (
<>
......@@ -37,12 +42,12 @@ export default function Signin() {
<div className="card-body">
<div className="row">
<div className="col">
<a href="#" className="btn w-100">
<a onClick={() => handleLogin('github')} className="btn w-100">
<Icon name="brand-github"/>
Login with Github
</a>
</div>
</div>
</div>
</div>
</div>
<div className="text-center text-secondary mt-3">
......
......@@ -31,7 +31,7 @@ export default function Signup() {
</form>
<div className="text-center text-secondary mt-3">
Already have account?
<a className="ml-2" onClick={() => router.push('/signin')}>
<a className="ml-2" onClick={() => router.push('/api/auth/signin')}>
Sign in</a>
</div>
</>
......
import { PrismaAdapter } from '@next-auth/prisma-adapter';
import GitHubProvider from 'next-auth/providers/github';
import prisma from '@/lib/prisma';
export const authConfig = {
providers: [
GitHubProvider({
clientId: process.env.GITHUB_ID as string,
clientSecret: process.env.GITHUB_SECRET as string,
}),
],
pages: {
signIn: '/signin',
},
adapter: PrismaAdapter(prisma),
secret: process.env.NEXTAUTH_SECRET,
database: process.env.POSTGRES_PRISMA_URL,
};
import { PrismaClient } from '@prisma/client';
let prisma: PrismaClient;
if (process.env.NODE_ENV === 'production') {
prisma = new PrismaClient();
} else {
if (!global.prisma) {
global.prisma = new PrismaClient();
}
prisma = global.prisma;
}
export default prisma;
\ No newline at end of file
......@@ -25,8 +25,10 @@
"@headlessui/react": "^1.7.16",
"@mdx-js/loader": "^2.3.0",
"@mdx-js/react": "2.3.0",
"@next-auth/prisma-adapter": "^1.0.7",
"@next/env": "^13.4.12",
"@next/mdx": "^13.4.12",
"@prisma/client": "5.1.1",
"@sindresorhus/slugify": "^2.2.1",
"@svgr/webpack": "^8.0.1",
"@tabler/icons": "^2.30.0",
......@@ -113,5 +115,8 @@
"unist-util-visit": "^5.0.0",
"webpack": "^5.88.2",
"yaml": "^2.3.1"
},
"devDependencies": {
"prisma": "^5.1.1"
}
}
lockfileVersion: '6.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
'@glidejs/glide':
specifier: ^3.6.0
......@@ -13,12 +17,18 @@ dependencies:
'@mdx-js/react':
specifier: 2.3.0
version: 2.3.0(react@18.2.0)
'@next-auth/prisma-adapter':
specifier: ^1.0.7
version: 1.0.7(@prisma/client@5.1.1)(next-auth@4.22.3)
'@next/env':
specifier: ^13.4.12
version: 13.4.12
'@next/mdx':
specifier: ^13.4.12
version: 13.4.12(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0)
'@prisma/client':
specifier: 5.1.1
version: 5.1.1(prisma@5.1.1)
'@sindresorhus/slugify':
specifier: ^2.2.1
version: 2.2.1
......@@ -84,7 +94,7 @@ dependencies:
version: 8.2.0
contentlayer:
specifier: ^0.3.4
version: 0.3.4(markdown-wasm@1.2.0)
version: 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
date-fns:
specifier: ^2.30.0
version: 2.30.0
......@@ -159,13 +169,13 @@ dependencies:
version: 1.1.3
next:
specifier: ^13.4.12
version: 13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
version: 13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
next-auth:
specifier: ^4.22.3
version: 4.22.3(next@13.4.12)(react-dom@18.2.0)(react@18.2.0)
next-contentlayer:
specifier: ^0.3.4
version: 0.3.4(contentlayer@0.3.4)(markdown-wasm@1.2.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0)
version: 0.3.4(contentlayer@0.3.4)(esbuild@0.17.18)(markdown-wasm@1.2.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0)
next-mdx-remote:
specifier: ^4.4.1
version: 4.4.1(react-dom@18.2.0)(react@18.2.0)
......@@ -273,11 +283,16 @@ dependencies:
version: 5.0.0
webpack:
specifier: ^5.88.2
version: 5.88.2
version: 5.88.2(esbuild@0.17.18)
yaml:
specifier: ^2.3.1
version: 2.3.1
devDependencies:
prisma:
specifier: ^5.1.1
version: 5.1.1
packages:
/@ampproject/remapping@2.2.0:
......@@ -1677,32 +1692,35 @@ packages:
to-fast-properties: 2.0.0
dev: false
/@contentlayer/cli@0.3.4(markdown-wasm@1.2.0):
/@contentlayer/cli@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-vNDwgLuhYNu+m70NZ3XK9kexKNguuxPXg7Yvzj3B34cEilQjjzSrcTY/i+AIQm9V7uT5GGshx9ukzPf+SmoszQ==}
dependencies:
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/utils': 0.3.4
clipanion: 3.2.1
clipanion: 3.2.1(typanion@3.12.1)
typanion: 3.12.1
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
/@contentlayer/client@0.3.4(markdown-wasm@1.2.0):
/@contentlayer/client@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-QSlLyc3y4PtdC5lFw0L4wTZUH8BQnv2nk37hNCsPAqGf+dRO7TLAzdc+2/mVIRgK+vSH+pSOzjLsQpFxxXRTZA==}
dependencies:
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
/@contentlayer/core@0.3.4(markdown-wasm@1.2.0):
/@contentlayer/core@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-o68oBLwfYZ+2vtgfk1lgHxOl3LoxvRNiUfeQ8IWFWy/L4wnIkKIqLZX01zlRE5IzYM+ZMMN5V0cKQlO7DsyR9g==}
peerDependencies:
esbuild: 0.17.x || 0.18.x
markdown-wasm: 1.x
peerDependenciesMeta:
esbuild:
......@@ -1729,10 +1747,10 @@ packages:
- supports-color
dev: false
/@contentlayer/source-files@0.3.4(markdown-wasm@1.2.0):
/@contentlayer/source-files@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-4njyn0OFPu7WY4tAjMxiJgWOKeiHuBOGdQ36EYE03iij/pPPRbiWbL+cmLccYXUFEW58mDwpqROZZm6pnxjRDQ==}
dependencies:
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/utils': 0.3.4
chokidar: 3.5.3
fast-glob: 3.2.12
......@@ -1745,18 +1763,20 @@ packages:
zod: 3.21.4
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
/@contentlayer/source-remote-files@0.3.4(markdown-wasm@1.2.0):
/@contentlayer/source-remote-files@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-cyiv4sNUySZvR0uAKlM+kSAELzNd2h2QT1R2e41dRKbwOUVxeLfmGiLugr0aVac6Q3xYcD99dbHyR1xWPV+w9w==}
dependencies:
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/source-files': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/source-files': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/utils': 0.3.4
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
......@@ -2218,7 +2238,7 @@ packages:
dependencies:
'@mdx-js/mdx': 2.2.1
source-map: 0.7.4
webpack: 5.88.2
webpack: 5.88.2(esbuild@0.17.18)
transitivePeerDependencies:
- supports-color
dev: false
......@@ -2257,6 +2277,16 @@ packages:
react: 18.2.0
dev: false
/@next-auth/prisma-adapter@1.0.7(@prisma/client@5.1.1)(next-auth@4.22.3):
resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==}
peerDependencies:
'@prisma/client': '>=2.26.0 || >=3'
next-auth: ^4
dependencies:
'@prisma/client': 5.1.1(prisma@5.1.1)
next-auth: 4.22.3(next@13.4.12)(react-dom@18.2.0)(react@18.2.0)
dev: false
/@next/env@13.4.12:
resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==}
dev: false
......@@ -2615,6 +2645,28 @@ packages:
tslib: 2.4.1
dev: false
/@prisma/client@5.1.1(prisma@5.1.1):
resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==}
engines: {node: '>=16.13'}
requiresBuild: true
peerDependencies:
prisma: '*'
peerDependenciesMeta:
prisma:
optional: true
dependencies:
'@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e
prisma: 5.1.1
dev: false
/@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e:
resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==}
dev: false
/@prisma/engines@5.1.1:
resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==}
requiresBuild: true
/@protobufjs/aspromise@1.1.2:
resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
dev: false
......@@ -3643,8 +3695,10 @@ packages:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
dev: false
/clipanion@3.2.1:
/clipanion@3.2.1(typanion@3.12.1):
resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==}
peerDependencies:
typanion: '*'
dependencies:
typanion: 3.12.1
dev: false
......@@ -3754,20 +3808,21 @@ packages:
proto-list: 1.2.4
dev: false
/contentlayer@0.3.4(markdown-wasm@1.2.0):
/contentlayer@0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0):
resolution: {integrity: sha512-FYDdTUFaN4yqep0waswrhcXjmMJnPD5iXDTtxcUCGdklfuIrXM2xLx51xl748cHmGA6IsC+27YZFxU6Ym13QIA==}
engines: {node: '>=14.18'}
hasBin: true
requiresBuild: true
dependencies:
'@contentlayer/cli': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/client': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/source-files': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/source-remote-files': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/cli': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/client': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/source-files': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/source-remote-files': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/utils': 0.3.4
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
......@@ -4656,7 +4711,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.88.2
webpack: 5.88.2(esbuild@0.17.18)
dev: false
/fill-range@7.0.1:
......@@ -5180,7 +5235,7 @@ packages:
dependencies:
html-minifier-terser: 7.1.0
parse5: 7.1.2
webpack: 5.88.2
webpack: 5.88.2(esbuild@0.17.18)
dev: false
/html-minifier-terser@7.1.0:
......@@ -6860,7 +6915,7 @@ packages:
'@panva/hkdf': 1.0.4
cookie: 0.5.0
jose: 4.13.1
next: 13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
next: 13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
oauth: 0.9.15
openid-client: 5.4.0
preact: 10.13.1
......@@ -6870,7 +6925,7 @@ packages:
uuid: 8.3.2
dev: false
/next-contentlayer@0.3.4(contentlayer@0.3.4)(markdown-wasm@1.2.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0):
/next-contentlayer@0.3.4(contentlayer@0.3.4)(esbuild@0.17.18)(markdown-wasm@1.2.0)(next@13.4.12)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UtUCwgAl159KwfhNaOwyiI7Lg6sdioyKMeh+E7jxx0CJ29JuXGxBEYmCI6+72NxFGIFZKx8lvttbbQhbnYWYSw==}
peerDependencies:
contentlayer: 0.3.4
......@@ -6878,14 +6933,15 @@ packages:
react: '*'
react-dom: '*'
dependencies:
'@contentlayer/core': 0.3.4(markdown-wasm@1.2.0)
'@contentlayer/core': 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
'@contentlayer/utils': 0.3.4
contentlayer: 0.3.4(markdown-wasm@1.2.0)
next: 13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
contentlayer: 0.3.4(esbuild@0.17.18)(markdown-wasm@1.2.0)
next: 13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
- markdown-wasm
- supports-color
dev: false
......@@ -6918,10 +6974,10 @@ packages:
'@next/env': 13.4.12
fast-glob: 3.2.12
minimist: 1.2.8
next: 13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
next: 13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
dev: false
/next@13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1):
/next@13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1):
resolution: {integrity: sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==}
engines: {node: '>=16.8.0'}
hasBin: true
......@@ -6940,6 +6996,7 @@ packages:
optional: true
dependencies:
'@next/env': 13.4.12
'@opentelemetry/api': 1.4.1
'@swc/helpers': 0.5.1
busboy: 1.6.0
caniuse-lite: 1.0.30001464
......@@ -6947,7 +7004,7 @@ packages:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
sass: 1.64.1
styled-jsx: 5.1.1(react@18.2.0)
styled-jsx: 5.1.1(@babel/core@7.21.4)(react@18.2.0)
watchpack: 2.4.0
zod: 3.21.4
optionalDependencies:
......@@ -6973,7 +7030,7 @@ packages:
react-dom: '>= 16.0.0'
dependencies:
'@types/nprogress': 0.2.0
next: 13.4.12(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
next: 13.4.12(@babel/core@7.21.4)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0)(sass@1.64.1)
nprogress: 0.2.0
prop-types: 15.8.1
react: 18.2.0
......@@ -7407,6 +7464,14 @@ packages:
resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
dev: false
/prisma@5.1.1:
resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==}
engines: {node: '>=16.13'}
hasBin: true
requiresBuild: true
dependencies:
'@prisma/engines': 5.1.1
/prismjs@1.27.0:
resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
engines: {node: '>=6'}
......@@ -8286,7 +8351,7 @@ packages:
inline-style-parser: 0.1.1
dev: false
/styled-jsx@5.1.1(react@18.2.0):
/styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0):
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
peerDependencies:
......@@ -8299,6 +8364,7 @@ packages:
babel-plugin-macros:
optional: true
dependencies:
'@babel/core': 7.21.4
client-only: 0.0.1
react: 18.2.0
dev: false
......@@ -8359,7 +8425,7 @@ packages:
engines: {node: '>=6'}
dev: false
/terser-webpack-plugin@5.3.7(webpack@5.88.2):
/terser-webpack-plugin@5.3.7(esbuild@0.17.18)(webpack@5.88.2):
resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==}
engines: {node: '>= 10.13.0'}
peerDependencies:
......@@ -8376,11 +8442,12 @@ packages:
optional: true
dependencies:
'@jridgewell/trace-mapping': 0.3.17
esbuild: 0.17.18
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.1
terser: 5.17.1
webpack: 5.88.2
webpack: 5.88.2(esbuild@0.17.18)
dev: false
/terser@5.17.1:
......@@ -8797,7 +8864,7 @@ packages:
engines: {node: '>=10.13.0'}
dev: false
/webpack@5.88.2:
/webpack@5.88.2(esbuild@0.17.18):
resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==}
engines: {node: '>=10.13.0'}
hasBin: true
......@@ -8828,7 +8895,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.7(webpack@5.88.2)
terser-webpack-plugin: 5.3.7(esbuild@0.17.18)(webpack@5.88.2)
watchpack: 2.4.0
webpack-sources: 3.2.3
transitivePeerDependencies:
......
-- CreateTable
CREATE TABLE "accounts" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"provider" TEXT NOT NULL,
"provider_account_id" TEXT NOT NULL,
"refresh_token" TEXT,
"access_token" TEXT,
"expires_at" INTEGER,
"token_type" TEXT,
"scope" TEXT,
"id_token" TEXT,
"session_state" TEXT,
"refresh_token_expires_in" INTEGER,
CONSTRAINT "accounts_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "sessions" (
"id" TEXT NOT NULL,
"session_token" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"expires" TIMESTAMP(3) NOT NULL,
CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "users" (
"id" TEXT NOT NULL,
"name" TEXT,
"email" TEXT,
"email_verified" TIMESTAMP(3),
"image" TEXT,
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "verificationtokens" (
"identifier" TEXT NOT NULL,
"token" TEXT NOT NULL,
"expires" TIMESTAMP(3) NOT NULL
);
-- CreateIndex
CREATE UNIQUE INDEX "accounts_provider_provider_account_id_key" ON "accounts"("provider", "provider_account_id");
-- CreateIndex
CREATE UNIQUE INDEX "sessions_session_token_key" ON "sessions"("session_token");
-- CreateIndex
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
-- CreateIndex
CREATE UNIQUE INDEX "verificationtokens_token_key" ON "verificationtokens"("token");
-- CreateIndex
CREATE UNIQUE INDEX "verificationtokens_identifier_token_key" ON "verificationtokens"("identifier", "token");
-- AddForeignKey
ALTER TABLE "accounts" ADD CONSTRAINT "accounts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
\ No newline at end of file
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("POSTGRES_PRISMA_URL") // uses connection pooling
directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection
shadowDatabaseUrl = env("POSTGRES_URL_NON_POOLING") // used for migrations
}
model Account {
id String @id @default(cuid())
userId String @map("user_id")
type String
provider String
providerAccountId String @map("provider_account_id")
refresh_token String? @db.Text
access_token String? @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? @db.Text
session_state String?
refresh_token_expires_in Int?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
@@map("accounts")
}
model Session {
id String @id @default(cuid())
sessionToken String @unique @map("session_token")
userId String @map("user_id")
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("sessions")
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime? @map("email_verified")
image String?
accounts Account[]
sessions Session[]
@@map("users")
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
@@map("verificationtokens")
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册