Files
vercel_dashboard_example/.pnpm-store/v11/files/7e/c48ef6a484f3aa46aeb9bcadda9c88ed3d6b79ccd7c503cc49b9e50afe8ec671a56bc0965575fb414d67f74f3e8f195e7ecca1e949049c25180289680bc78d
T
2026-05-12 14:53:15 +00:00

145 lines
4.6 KiB
Plaintext

import { Auth, raw, skipCSRFCheck, createActionURL } from "@auth/core"
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
import { headers as nextHeaders, cookies } from "next/headers"
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
import { redirect } from "next/navigation"
import type { NextAuthConfig } from "./index.js"
import type { NextAuthResult, Session } from "../index.js"
import type { ProviderType } from "@auth/core/providers"
type SignInParams = Parameters<NextAuthResult["signIn"]>
export async function signIn(
provider: SignInParams[0],
options: SignInParams[1] = {},
authorizationParams: SignInParams[2],
config: NextAuthConfig
) {
const headers = new Headers(await nextHeaders())
const {
redirect: shouldRedirect = true,
redirectTo,
...rest
} = options instanceof FormData ? Object.fromEntries(options) : options
const callbackUrl = redirectTo?.toString() ?? headers.get("Referer") ?? "/"
const signInURL = createActionURL(
"signin",
// @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default
headers.get("x-forwarded-proto"),
headers,
process.env,
config
)
if (!provider) {
signInURL.searchParams.append("callbackUrl", callbackUrl)
if (shouldRedirect) redirect(signInURL.toString())
return signInURL.toString()
}
let url = `${signInURL}/${provider}?${new URLSearchParams(
authorizationParams
)}`
let foundProvider: { id?: SignInParams[0]; type?: ProviderType } = {}
for (const providerConfig of config.providers) {
const { options, ...defaults } =
typeof providerConfig === "function" ? providerConfig() : providerConfig
const id = (options?.id as string | undefined) ?? defaults.id
if (id === provider) {
foundProvider = {
id,
type: (options?.type as ProviderType | undefined) ?? defaults.type,
}
break
}
}
if (!foundProvider.id) {
const url = `${signInURL}?${new URLSearchParams({ callbackUrl })}`
if (shouldRedirect) redirect(url)
return url
}
if (foundProvider.type === "credentials") {
url = url.replace("signin", "callback")
}
headers.set("Content-Type", "application/x-www-form-urlencoded")
const body = new URLSearchParams({ ...rest, callbackUrl })
const req = new Request(url, { method: "POST", headers, body })
const res = await Auth(req, { ...config, raw, skipCSRFCheck })
const cookieJar = await cookies()
for (const c of res?.cookies ?? []) cookieJar.set(c.name, c.value, c.options)
const responseUrl =
res instanceof Response ? res.headers.get("Location") : res.redirect
// NOTE: if for some unexpected reason the responseUrl is not set,
// we redirect to the original url
const redirectUrl = responseUrl ?? url
if (shouldRedirect) return redirect(redirectUrl)
return redirectUrl as any
}
type SignOutParams = Parameters<NextAuthResult["signOut"]>
export async function signOut(
options: SignOutParams[0],
config: NextAuthConfig
) {
const headers = new Headers(await nextHeaders())
headers.set("Content-Type", "application/x-www-form-urlencoded")
const url = createActionURL(
"signout",
// @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default
headers.get("x-forwarded-proto"),
headers,
process.env,
config
)
const callbackUrl = options?.redirectTo ?? headers.get("Referer") ?? "/"
const body = new URLSearchParams({ callbackUrl })
const req = new Request(url, { method: "POST", headers, body })
const res = await Auth(req, { ...config, raw, skipCSRFCheck })
const cookieJar = await cookies()
for (const c of res?.cookies ?? []) cookieJar.set(c.name, c.value, c.options)
if (options?.redirect ?? true) return redirect(res.redirect!)
return res as any
}
type UpdateParams = Parameters<NextAuthResult["unstable_update"]>
export async function update(
data: UpdateParams[0],
config: NextAuthConfig
): Promise<Session | null> {
const headers = new Headers(await nextHeaders())
headers.set("Content-Type", "application/json")
const url = createActionURL(
"session",
// @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default
headers.get("x-forwarded-proto"),
headers,
process.env,
config
)
const body = JSON.stringify({ data })
const req = new Request(url, { method: "POST", headers, body })
const res: any = await Auth(req, { ...config, raw, skipCSRFCheck })
const cookieJar = await cookies()
for (const c of res?.cookies ?? []) cookieJar.set(c.name, c.value, c.options)
return res.body
}