nextauthjs / next-auth

Authentication for the Web.
https://authjs.dev
ISC License
24.37k stars 3.41k forks source link

Declaration TypeScript Bug in NextAuth v5 #10568

Open SiebeBaree opened 5 months ago

SiebeBaree commented 5 months ago

Environment

System: OS: macOS 14.4.1 CPU: (8) arm64 Apple M1 Memory: 63.70 MB / 16.00 GB Shell: 5.9 - /bin/zsh Binaries: Node: 21.7.1 - /opt/homebrew/bin/node npm: 10.5.0 - /opt/homebrew/bin/npm pnpm: 8.15.6 - /opt/homebrew/bin/pnpm bun: 1.1.3 - ~/.bun/bin/bun Watchman: 2024.03.25.00 - /opt/homebrew/bin/watchman Browsers: Brave Browser: 123.1.64.122 Chrome: 123.0.6312.123 Safari: 17.4.1 npmPackages: next: 13.5.4 => 13.5.4 next-auth: ^5.0.0-beta.16 => 5.0.0-beta.16 react: ^18 => 18.2.0

Reproduction URL

https://github.com/SiebeBaree/declaration-ts-bug-next-auth-v5

Describe the issue

When turning on declararation and declarationMap in the tsconfig.json NextAuth v5 beta 16 will give the following error:

The inferred type of 'auth' cannot be named without a reference to '../node_modules/next-auth/lib'. This is likely not portable. A type annotation is necessary.

The code works perfectly fine in dev mode but will cause build errors during deployment. The error happens in src/auth.ts in the reproduction repo linked above

How to reproduce

  1. npx create-next-app@latest (enable TypeScript)
  2. npm install next-auth@beta
  3. Create the auth.ts file like the installation guide recommends
  4. Set the declaration and declarationMap to true in the compilerOptions of your tsconfig.json

This repository uses Bun but this error is the same on npm, pnpm with node.js runtime.

Expected behavior

That even with declaration and declarationMap set to true NextAuth should give any issues when using the new auth() function.

andrevenancio commented 5 months ago

same here!

Edit by maintainer bot: Comment was automatically minimized because it was considered unhelpful. (If you think this was by mistake, let us know). Please only comment if it adds context to the issue. If you want to express that you have the same problem, use the upvote 👍 on the issue description or subscribe to the issue for updates. Thanks!

brunowego commented 5 months ago

@SiebeBaree same here. Did you find a workaround?

SiebeBaree commented 5 months ago

@SiebeBaree same here. Did you find a workaround?

Yes, turn of declaration and declarationMap in your tsconfig

mj-schweiger commented 3 months ago

Does anyone know what to do if another part of the project requires declarationMap & declaration to be set to "true"? Is this a bug in NextAuth?

shuaibu-shehu commented 3 months ago

Team! please respond to this as i am also facing same issue

  The inferred type of 'auth' cannot be named without a reference to '@/node_modules/next-auth/lib'. This is likely not portable. A type annotation is necessary.ts(2742)
The inferred type of 'auth' cannot be named without a reference to '@/node_modules/next-auth/lib/types'. This is likely not portable. A type annotation is necessary.ts(2742)
export const { handlers:{GET, POST},signIn, signOut, auth }  = NextAuth({
  callbacks: {
    async signIn({ user, account }) {
      console.log(user);
      //Allow 0Auth

      if(account?.provider!=="credentials") return true

      const existingUser= await getUserById(user.id!);

      // prevent sign in without email verification
       if(!existingUser || !existingUser.emailVerified){
        return false
      }

      return true
      },
    async session({ session, token }) {
      if(token.sub && session.user){
        session.user.id = token.sub
      }

      return session
    },
    async jwt({ token }) {

      if(!token.sub) return token
      const existingUser= await getUserById(token.sub)

      return token
  }
},
secret: process.env.NEXTAUTH_SECRET || "secr3t",
  adapter: PrismaAdapter(db),
  session: { strategy: "jwt"},
  ...authConfig,
})

the type error comes from the auth(), but i am using turbo repo and when i remove the "extents" property from tsconfig.ts it works without the error

 {
  "extends": "@repo/typescript-config/nextjs.json",
  "compilerOptions": {
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./*"]
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
  "exclude": ["node_modules"]
}
ghbishal commented 3 months ago

@shuaibu-shehu just add below lines inside the compilerOptions

    "declaration": false,
    "declarationMap": false,
coldflyingcats commented 2 months ago

sharing workaround (declarationMap & declaration to be set to "true")

import NextAuth, { NextAuthResult } from "next-auth";

const nextAuth = NextAuth(authConfig);

const signIn: NextAuthResult["signIn"] = nextAuth.signIn;
const auth: NextAuthResult["auth"] = nextAuth.auth;