🙄

NextAuth(v4)のtypes.tsのコメントアウトを和訳した。

2024/08/17に公開
node_modules/next-auth/src/core/types.ts
import type { Adapter, AdapterUser } from "../adapters"
import type {
  Provider,
  CredentialInput,
  ProviderType,
  EmailConfig,
  CredentialsConfig,
  OAuthConfig,
  AuthorizationEndpointHandler,
  TokenEndpointHandler,
  UserinfoEndpointHandler,
} from "../providers"
import type { TokenSetParameters } from "openid-client"
import type { JWT, JWTOptions } from "../jwt"
import type { LoggerInstance } from "../utils/logger"
import type { CookieSerializeOptions } from "cookie"

import type { NextApiRequest, NextApiResponse } from "next"

import type { InternalUrl } from "../utils/parse-url"

export type Awaitable<T> = T | PromiseLike<T>

export type { LoggerInstance }

/**
 * NextAuth インスタンスを設定します
 *
 * [ドキュメント](https://next-auth.js.org/configuration/options#options)
 */
export interface AuthOptions {
  /**
   * サインインのための認証プロバイダーの配列
   * (例: Google、Facebook、Twitter、GitHub、Email など)、順序は自由です。
   * これには、組み込みプロバイダーやカスタムプロバイダーのオブジェクトが含まれます。
   * * **デフォルト値**: `[]`
   * * **必須**: *はい*
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#providers) | [プロバイダーのドキュメント](https://next-auth.js.org/configuration/providers)
   */
  providers: Provider[]
  /**
   * トークンをハッシュ化し、クッキーに署名し、暗号化キーを生成するために使用されるランダムな文字列。
   * 指定されない場合、`jwt.secret` や環境変数 `NEXTAUTH_SECRET` にフォールバックします。
   * それ以外の場合、エントロピーとしてクライアント ID/シークレットを含むすべての設定オプションのハッシュを使用します。
   *
   * 注: 最後の動作は非常に不安定であり、本番環境ではエラーが発生します。
   * * **デフォルト値**: `string` ("options" オブジェクトのSHAハッシュ)
   * * **必須**: いいえ - **しかし、強く推奨されます**!
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#secret)
   */
  secret?: string
  /**
   * JWT またはデータベースの使用を選択するなど、セッション設定を構成します。
   * セッションのアイドル状態での有効期限の長さを設定したり、データベース使用時の書き込み操作のスロットリングを実装したりできます。
   * * **デフォルト値**: ドキュメントページを参照
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#session)
   */
  session?: Partial<SessionOptions>
  /**
   * アダプターを指定しない場合、JSON Web Tokens はデフォルトで有効です。
   * JSON Web Tokens はデフォルトで暗号化 (JWE) されています。この動作を維持することをお勧めします。
   * * **デフォルト値**: ドキュメントページを参照
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#jwt)
   */
  jwt?: Partial<JWTOptions>
  /**
   * カスタムのサインイン、サインアウト、エラーページを作成したい場合、使用するURLを指定します。
   * 指定されたページは、対応する組み込みページを上書きします。
   * * **デフォルト値**: `{}`
   * * **必須**: いいえ
   * @例
   *
   * ```js
   *   pages: {
   *     signIn: '/auth/signin',
   *     signOut: '/auth/signout',
   *     error: '/auth/error',
   *     verifyRequest: '/auth/verify-request',
   *     newUser: '/auth/new-user'
   *   }
   * ```
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#pages) | [ページのドキュメント](https://next-auth.js.org/configuration/pages)
   */
  pages?: Partial<PagesOptions>
  /**
   * コールバックは、アクションが実行されたときに何が起こるかを制御するために使用できる非同期関数です。
   * コールバックは *非常に強力* で、特に JSON Web Tokens を使用するシナリオでは
   * **データベースを使用せずにアクセス制御を実装** したり、**外部データベースやAPIと統合** することができます。
   * * **デフォルト値**: コールバックのドキュメントを参照
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#callbacks) | [コールバックのドキュメント](https://next-auth.js.org/configuration/callbacks)
   */
  callbacks?: Partial<CallbacksOptions>
  /**
   * イベントは非同期関数で、応答を返さず、監査ログに役立ちます。
   * デバッグや監査ログの作成などの目的で、以下のいずれかのイベントのハンドラーを指定できます。
   * メッセージオブジェクトの内容は、フローによって異なります
   * (例: OAuth や Email 認証フロー、JWT またはデータベースセッションなど)。
   * しかし、通常はユーザーオブジェクトや JSON Web Token の内容、
   * そのイベントに関連するその他の情報が含まれます。
   * * **デフォルト値**: `{}`
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#events) | [イベントのドキュメント](https://next-auth.js.org/configuration/events)
   */
  events?: Partial<EventCallbacks>
  /**
   * データベースアダプターを渡すためにアダプターオプションを使用できます。
   *
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#adapter) |
   * [アダプターの概要](https://next-auth.js.org/adapters/overview)
   */
  adapter?: Adapter
  /**
   * デバッグを true に設定すると、認証およびデータベース操作に関するデバッグメッセージが有効になります。
   * * **デフォルト値**: `false`
   * * **必須**: いいえ
   *
   * - ⚠ カスタム `logger` を追加した場合、この設定は無視されます。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#debug) | [ロガードキュメント](https://next-auth.js.org/configuration/options#logger)
   */
  debug?: boolean
  /**
   * ロガーレベルの上書き (`undefined` のレベルは組み込みのロガーを使用します)、
   * および NextAuth でのログのインターセプト。
   * このオプションを使用して、NextAuth のログをサードパーティのログサービスに送信できます。
   * * **デフォルト値**: `console`
   * * **必須**: いいえ
   *
   * @例
   *
   * ```js
   * // /pages/api/auth/[...nextauth].js
   * import log from "logging-service"
   * export default NextAuth({
   *   logger: {
   *     error(code, ...message) {
   *       log.error(code, message)
   *     },
   *     warn(code, ...message) {
   *       log.warn(code, message)
   *     },
   *     debug(code, ...message) {
   *       log.debug(code, message)
   *     }
   *   }
   * })
   * ```
   *
   * - ⚠ 設定された場合、`debug` オプションは無視されます
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#logger) |
   * [デバッグドキュメント](https://next-auth.js.org/configuration/options#debug)
   */
  logger?: Partial<LoggerInstance>
  /**
   * 組み込みページのテーマを変更します。
   * ページを常にライトテーマにしたい場合は `"light"` に設定します。
   * ページを常にダークテーマにしたい場合は `"dark"` に設定します。
   * `"auto"` に設定するか、このオプションを省略すると、ページはシステムのテーマ設定に従います。
   * * **デフォルト値**: `"auto"`
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#theme) | [ページのドキュメント]("https://next-auth.js.org/configuration/pages")
   */
  theme?: Theme
  /**
   * `true` に設定すると、NextAuth.js によって設定されたすべてのクッキーは HTTPS URL からのみアクセス可能になります。
   * このオプションは開発者の利便性のために、`http://` で始まるURL (例: http://localhost:3000) ではデフォルトで `false` になります。
   * このセキュリティ機能を無効にして、非保護URLからクッキーにアクセスできるようにするには、このオプションを手動で `false` に設定することができます (これは推奨されません)。
   * * **デフォルト値**: HTTPSサイトでは `true`、HTTPサイトでは `false`
   * * **必須**: いいえ
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#usesecurecookies)
   *
   * - ⚠ **これは高度なオプションです。** 高度なオプションは基本的なオプションと同じ方法で渡されますが、
   * **複雑な影響** や副作用がある可能性があります。
   * **高度なオプションの使用は避けるべきです**。
   */
  useSecureCookies?: boolean
  /**
   * NextAuth.js が使用するクッキーのデフォルト名とオプションを上書きできます。
   * 1つ以上のクッキーにカスタムプロパティを指定できますが、
   * クッキーにカスタムオプションを指定する場合は、そのクッキーのすべてのオプションを指定する必要があります。
   * この機能を使用する場合、開発と本番ビルドで異なるクッキーポリシーを設定するために条件付き動作を作成することを望むでしょう。
   * これは組み込みの動的ポリシーをオプトアウトすることになるためです。
   * * **デフォルト値**: `{}`
   * * **必須**: いいえ
   *
   * - ⚠ **これは高度なオプションです。** 高度なオプションは基本的なオプションと同じ方法で渡されますが、
   * **複雑な影響** や副作用がある可能性があります。
   * **高度なオプションの使用は避けるべきです**。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#cookies) | [使用例](https://next-auth.js.org/configuration/options#example)
   */
  cookies?: Partial<CookiesOptions>
}

/**
 * 組み込みページのテーマを変更します。
 *
 * [ドキュメント](https://next-auth.js.org/configuration/options#theme) |
 * [ページ](https://next-auth.js.org/configuration/pages)
 */
export interface Theme {
  colorScheme?: "auto" | "dark" | "light"
  logo?: string
  brandColor?: string
  buttonText?: string
}

/**
 * OAuthプロバイダーによって返される異なるトークン。
 * 一部のトークンは異なる大文字小文字で利用可能ですが、
 * 同じ値を指します。
 */
export type TokenSet = TokenSetParameters

/**
 * 通常、使用されているプロバイダーに関する情報を含んでおり、
 * OAuthプロバイダーから返される異なるトークンを拡張します。
 */
export interface Account extends Partial<TokenSet> {
  /**
   * この値は、アカウントを作成するために使用されたプロバイダーの種類に依存します。
   * - oauth: OAuthアカウントのID(`profile()`コールバックから返されます)。
   * - email: ユーザーのメールアドレス。
   * - credentials: `authorize()`コールバックから返されるID
   */
  providerAccountId: string
  /** このアカウントが属するユーザーのID。 */
  userId?: string
  /** このアカウントで使用されるプロバイダーのID */
  provider: string
  /** このアカウントのプロバイダータイプ */
  type: ProviderType
}

/** プロバイダーから返されるOAuthプロフィール */
export interface Profile {
  sub?: string
  name?: string
  email?: string
  image?: string
}

/** [ドキュメント](https://next-auth.js.org/configuration/callbacks) */
export interface CallbacksOptions<P = Profile, A = Account> {
  /**
   * このコールバックを使用して、ユーザーがサインインを許可されるかどうかを制御します。
   * `true` を返すと、サインインフローが続行されます。
   * エラーをスローするか文字列を返すと、フローが停止し、ユーザーがリダイレクトされます。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/callbacks#sign-in-callback)
   */
  signIn: (params: {
    user: User | AdapterUser
    account: A | null
    /**
     * OAuth プロバイダーが使用されている場合、プロバイダーから返される完全な OAuth プロフィールが含まれます。
     */
    profile?: P
    /**
     * Email プロバイダーが使用されている場合、最初の呼び出し時に `verificationRequest: true` プロパティが含まれ、
     * これは検証リクエストフローでトリガーされていることを示します。
     * コールバックがユーザーがサインインリンクをクリックした後に呼び出された場合、このプロパティは存在しません。
     * `verificationRequest` プロパティをチェックして、ブロックリストにあるアドレスやドメインにメールを送信しないようにしたり、
     * 許可リストにあるメールアドレスにのみ明示的に生成することができます。
     */
    email?: {
      verificationRequest?: boolean
    }
    /** Credentials プロバイダーが使用されている場合、ユーザーのクレデンシャルが含まれます */
    credentials?: Record<string, CredentialInput>
  }) => Awaitable<string | boolean>
  /**
   * このコールバックは、ユーザーがサインインまたはサインアウトする際に、コールバックURLにリダイレクトされるたびに呼び出されます。
   * デフォルトでは、サイトと同じURL上のURLのみが許可されますが、このコールバックを使用してその動作をカスタマイズできます。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/callbacks#redirect-callback)
   */
  redirect: (params: {
    /** クライアントによってコールバックURLとして提供されたURL */
    url: string
    /** サイトのデフォルトベースURL (フォールバックとして使用可能) */
    baseUrl: string
  }) => Awaitable<string>
  /**
   * このコールバックは、セッションがチェックされるたびに呼び出されます。
   * (例: `/api/session` エンドポイントを呼び出したり、`useSession` や `getSession` を使用した場合など)
   *
   * ⚠ デフォルトでは、セキュリティ向上のためにトークンのサブセット(メールアドレス、名前、画像)のみが返されます。
   *
   * `jwt` コールバックでトークンに追加したものをクライアントで使用できるようにするには、
   * ここで明示的に転送する必要があります。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/callbacks#session-callback) |
   * [`jwt` コールバック](https://next-auth.js.org/configuration/callbacks#jwt-callback) |
   * [`useSession`](https://next-auth.js.org/getting-started/client#usesession) |
   * [`getSession`](https://next-auth.js.org/getting-started/client#getsession) |
   */
  session: (
    params:
      | {
          session: Session
          /** {@link SessionOptions.strategy} が `"jwt"` に設定されている場合に利用可能 */
          token: JWT
          /** {@link SessionOptions.strategy} が `"database"` に設定されている場合に利用可能 */
          user: AdapterUser
        } & {
          /**
           * {@link SessionOptions.strategy} `"database"` を使用している場合、これはクライアントから [`useSession().update`](https://next-auth.js.org/getting-started/client#update-session) メソッド経由で送信されるデータです。
           *
           * ⚠ 注意、このデータを使用する前に検証する必要があります。
           */
          newSession: any
          trigger: "update"
        }
  ) => Awaitable<Session | DefaultSession>
  /**
   * このコールバックは、JSON Web Token が作成されたとき(例: サインイン時)や
   * 更新されたとき(例: クライアントでセッションがアクセスされたとき)に呼び出されます。
   * その内容は `session` コールバックに転送され、クライアントに返すべきものを制御できます。
   * その他の内容はフロントエンドに保持されます。
   *
   * JWTはデフォルトで暗号化されています。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/callbacks#jwt-callback) |
   * [`session` コールバック](https://next-auth.js.org/configuration/callbacks#session-callback)
   */
  jwt: (
    // TODO: `@auth/core` で `trigger: "signUp"` に置き換える
    params: {
      /**
       * `trigger` が `"signIn"` または `"signUp"` の場合、{@link JWT} のサブセットであり、
       * `name`、`email`、`picture` が含まれます。
       *
       * それ以外の場合は、以降の呼び出しで完全な {@link JWT} が返されます。
       */
      token: JWT
      /**
       * {@link OAuthConfig.profile} または {@link CredentialsConfig.authorize} コールバックの結果。
       * @note `trigger` が `"signIn"` または `"signUp"` の場合に利用可能です。
       *
       * 参考資料:
       * - [Credentials プロバイダー](https://next-auth.js.org/providers/credentials)
       * - [ユーザーデータベースモデル](https://authjs.dev/reference/adapters#user)
       */
      user: User | AdapterUser
      /**
       * サインインに使用されたプロバイダーに関する情報が含まれています。
       * また、{@link TokenSet} も含まれます。
       * @note `trigger` が `"signIn"` または `"signUp"` の場合に利用可能です。
       */
      account: A | null
      /**
       * プロバイダーから返されたOAuthプロフィール。
       * (OIDCの場合はデコードされたIDトークンまたは /userinfo のレスポンス)
       * @note `trigger` が `"signIn"` の場合に利用可能です。
       */
      profile?: P
      /**
       * なぜ jwt コールバックが呼び出されたのか確認します。考えられる理由は以下の通りです:
       * - ユーザーサインイン: コールバックが最初に呼び出されたとき、`user`、`profile`、および `account` が存在します。
       * - ユーザーサインアップ: データベースに初めてユーザーが作成される({@link SessionOptions.strategy} が `"database"` に設定されている場合)
       * - 更新イベント: [`useSession().update`](https://next-auth.js.org/getting-started/client#update-session) メソッドによってトリガーされます。
       * 後者の場合、`trigger` は `undefined` になります。
       */
      trigger?: "signIn" | "signUp" | "update"
      /** @deprecated 代わりに `trigger === "signUp"` を使用してください */
      isNewUser?: boolean
      /**
       * {@link SessionOptions.strategy} `"jwt"` を使用している場合、これはクライアントから [`useSession().update`](https://next-auth.js.org/getting-started/client#update-session) メソッド経由で送信されるデータです。
       *
       * ⚠ 注意、このデータを使用する前に検証する必要があります。
       */
      session?: any
    }
  ) => Awaitable<JWT>
}

/** [ドキュメント](https://next-auth.js.org/configuration/options#cookies) */
export interface CookieOption {
  name: string
  options: CookieSerializeOptions
}

/** [ドキュメント](https://next-auth.js.org/configuration/options#cookies) */
export interface CookiesOptions {
  sessionToken: CookieOption
  callbackUrl: CookieOption
  csrfToken: CookieOption
  pkceCodeVerifier: CookieOption
  state: CookieOption
  nonce: CookieOption
}

/**
 * next-auth から登録できる様々なイベントコールバック
 *
 * [ドキュメント](https://next-auth.js.org/configuration/events)
 */
export interface EventCallbacks {
  /**
   * `credentials` タイプの認証を使用している場合、ユーザーは認証プロバイダーからの生のレスポンスです。
   * 他のプロバイダーでは、アダプターからのユーザーオブジェクト、アカウント、
   * そしてそのユーザーがアダプターに新規に登録されたかどうかのインジケーターが取得されます。
   */
  signIn: (message: {
    user: User
    account: Account | null
    profile?: Profile
    isNewUser?: boolean
  }) => Awaitable<void>
  /**
   * メッセージオブジェクトは、JWTまたはデータベースに永続化されたセッションを使用しているかに応じて以下のいずれかを含みます:
   * - `token`: このセッションのJWTトークン。
   * - `session`: 終了しているアダプターからのセッションオブジェクト。
   */
  signOut: (message: { session: Session; token: JWT }) => Awaitable<void>
  createUser: (message: { user: User }) => Awaitable<void>
  updateUser: (message: { user: User }) => Awaitable<void>
  linkAccount: (message: {
    user: User | AdapterUser
    account: Account
    profile: User | AdapterUser
  }) => Awaitable<void>
  /**
   * メッセージオブジェクトは、JWTまたはデータベースに永続化されたセッションを使用しているかに応じて以下のいずれかを含みます:
   * - `token`: このセッションのJWTトークン。
   * - `session`: アダプターからのセッションオブジェクト。
   */
  session: (message: { session: Session; token: JWT }) => Awaitable<void>
}

export type EventType = keyof EventCallbacks

/** [ドキュメント](https://next-auth.js.org/configuration/pages) */
export interface PagesOptions {
  signIn: string
  signOut: string
  /** クエリ文字列として渡されたエラーコード ?error= */
  error: string
  verifyRequest: string
  /** 設定されている場合、新しいユーザーは初回サインイン時にここにリダイレクトされます */
  newUser: string
}

export type ISODateString = string

export interface DefaultSession {
  user?: {
    name?: string | null
    email?: string | null
    image?: string | null
  }
  expires: ISODateString
}

/**
 * `useSession`、`getSession`によって返されるもの、
 * `session` コールバックによって返されるもの、
 * および `SessionProvider` React コンテキストのプロパティとして受け取られる形状。
 *
 * [`useSession`](https://next-auth.js.org/getting-started/client#usesession) |
 * [`getSession`](https://next-auth.js.org/getting-started/client#getsession) |
 * [`SessionProvider`](https://next-auth.js.org/getting-started/client#sessionprovider) |
 * [`session` コールバック](https://next-auth.js.org/configuration/callbacks#jwt-callback)
 */
export interface Session extends DefaultSession {}

export type SessionStrategy = "jwt" | "database"

/** [ドキュメント](https://next-auth.js.org/configuration/options#session) */
export interface SessionOptions {
  /**
   * ユーザーセッションを保存する方法を選択します。
   * デフォルトは、セッションクッキー内の暗号化されたJWT (JWE) です。
   *
   * ただし、`adapter` を使用する場合は、デフォルトで `"database"` になります。
   * `"jwt"` を明示的に定義することで、JWTセッションを強制することもできます。
   *
   * `"database"` を使用する場合、セッションクッキーには `sessionToken` 値のみが含まれ、
   * データベース内のセッションを検索するために使用されます。
   *
   * [ドキュメント](https://next-auth.js.org/configuration/options#session) |
   * [アダプター](https://next-auth.js.org/configuration/options#adapter) |
   * [JSON Web トークンについて](https://next-auth.js.org/faq#json-web-tokens)
   */
  strategy: SessionStrategy
  /**
   * 現在からの相対時間でセッションが期限切れになる秒数
   * @default 2592000 // 30日
   */
  maxAge: number
  /**
   * セッションが更新されるべき頻度 (秒単位)。
   * `0` に設定すると、毎回セッションが更新されます。
   * @default 86400 // 1日
   */
  updateAge: number
  /**
   * データベースベースのセッション用にカスタムセッショントークンを生成します。
   * デフォルトでは、Node.js のバージョンに応じてランダムなUUIDまたは文字列が生成されます。
   * ただし、独自のカスタム文字列 (CUID など) を指定して使用することもできます。
   * @default `randomUUID` または Node.js のバージョンに応じて `randomBytes.toHex`
   */
  generateSessionToken: () => Awaitable<string>
}

export interface DefaultUser {
  id: string
  name?: string | null
  email?: string | null
  image?: string | null
}

/**
 * OAuth プロバイダーの `profile` コールバックで返されるオブジェクトの形状。
 * `jwt` および `session` コールバックで使用可能、
 * またはデータベースを使用する場合、`session` コールバックの第二引数としても使用可能。
 *
 * [`signIn` コールバック](https://next-auth.js.org/configuration/callbacks#sign-in-callback) |
 * [`session` コールバック](https://next-auth.js.org/configuration/callbacks#jwt-callback) |
 * [`jwt` コールバック](https://next-auth.js.org/configuration/callbacks#jwt-callback) |
 * [`profile` OAuth プロバイダー コールバック](https://next-auth.js.org/configuration/providers#using-a-custom-provider)
 */
export interface User extends DefaultUser {}

// 以下は next-auth 内部でのみ使用されるべき型です

/** @internal */
export interface OAuthConfigInternal<P>
  extends Omit<OAuthConfig<P>, "authorization" | "token" | "userinfo"> {
  authorization?: AuthorizationEndpointHandler
  token?: TokenEndpointHandler
  userinfo?: UserinfoEndpointHandler
}

/** @internal */
export type InternalProvider<T = ProviderType> = (T extends "oauth"
  ? OAuthConfigInternal<any>
  : T extends "email"
  ? EmailConfig
  : T extends "credentials"
  ? CredentialsConfig
  : never) & {
  signinUrl: string
  callbackUrl: string
}

export type AuthAction =
  | "providers"
  | "session"
  | "csrf"
  | "signin"
  | "signout"
  | "callback"
  | "verify-request"
  | "error"
  | "_log"

type NonNullableFields<T> = {
  [P in keyof T]-?: NonNullable<T[P]>
}

/** @internal */
export interface InternalOptions<TProviderType = ProviderType> {
  providers: InternalProvider[]
  /**
   * `NEXTAUTH_URL` または信頼されるホストの `x-forwarded-host` および `x-forwarded-proto` から解析されます。
   * @default "http://localhost:3000/api/auth"
   */
  url: InternalUrl
  action: AuthAction
  provider: InternalProvider<TProviderType>
  csrfToken?: string
  csrfTokenVerified?: boolean
  secret: string
  theme: Theme
  debug: boolean
  logger: LoggerInstance
  session: Required<SessionOptions>
  pages: Partial<PagesOptions>
  jwt: JWTOptions
  events: Partial<EventCallbacks>
  adapter?: NonNullableFields<Adapter>
  callbacks: CallbacksOptions
  cookies: CookiesOptions
  callbackUrl: string
}

/** @internal */
export interface NextAuthRequest extends NextApiRequest {
  options: InternalOptions
}

/** @internal */
export type NextAuthResponse<T = any> = NextApiResponse<T>

/** @internal */
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
export type NextAuthApiHandler<Result = void, Response = any> = (
  req: NextAuthRequest,
  res: NextAuthResponse<Response>
) => Awaitable<Result>

Discussion