import { Account, User, Awaitable } from "." import type { Adapter as FutureAdapter } from "@auth/core/adapters" export interface AdapterUser extends User { id: string email: string emailVerified: Date | null } export interface AdapterAccount extends Account { userId: string } export interface AdapterSession { /** A randomly generated value that is used to get hold of the session. */ sessionToken: string /** Used to connect the session to a particular user */ userId: string expires: Date } export interface VerificationToken { identifier: string expires: Date token: string } /** * Using a custom adapter you can connect to any database backend or even several different databases. * Custom adapters created and maintained by our community can be found in the adapters repository. * Feel free to add a custom adapter from your project to the repository, * or even become a maintainer of a certain adapter. * Custom adapters can still be created and used in a project without being added to the repository. * * **Required methods** * * _(These methods are required for all sign in flows)_ * - `createUser` * - `getUser` * - `getUserByEmail` * - `getUserByAccount` * - `linkAccount` * - `createSession` * - `getSessionAndUser` * - `updateSession` * - `deleteSession` * - `updateUser` * * _(Required to support email / passwordless sign in)_ * * - `createVerificationToken` * - `useVerificationToken` * * **Unimplemented methods** * * _(These methods will be required in a future release, but are not yet invoked)_ * - `deleteUser` * - `unlinkAccount` * * [Adapters Overview](https://next-auth.js.org/adapters/overview) | * [Create a custom adapter](https://next-auth.js.org/tutorials/creating-a-database-adapter) */ export interface Adapter { createUser?: | FutureAdapter["createUser"] | ((user: Omit) => Awaitable) getUser?: (id: string) => Awaitable getUserByEmail?: (email: string) => Awaitable /** Using the provider id and the id of the user for a specific account, get the user. */ getUserByAccount?: ( providerAccountId: Pick ) => Awaitable updateUser?: ( user: Partial & Pick ) => Awaitable /** @todo Implement */ deleteUser?: ( userId: string ) => Promise | Awaitable linkAccount?: | FutureAdapter["linkAccount"] | (( account: AdapterAccount, ) => Promise | Awaitable) /** @todo Implement */ unlinkAccount?: | FutureAdapter["unlinkAccount"] | (( providerAccountId: Pick< AdapterAccount, "provider" | "providerAccountId" >, ) => Promise | Awaitable) /** Creates a session for the user and returns it. */ createSession?: (session: { sessionToken: string userId: string expires: Date }) => Awaitable getSessionAndUser?: ( sessionToken: string ) => Awaitable<{ session: AdapterSession; user: AdapterUser } | null> updateSession?: ( session: Partial & Pick ) => Awaitable /** * Deletes a session from the database. * It is preferred that this method also returns the session * that is being deleted for logging purposes. */ deleteSession?: ( sessionToken: string ) => Promise | Awaitable createVerificationToken?: ( verificationToken: VerificationToken ) => Awaitable /** * Return verification token from the database * and delete it so it cannot be used again. */ useVerificationToken?: (params: { identifier: string token: string }) => Awaitable }