[GH-ISSUE #3498] "Buffer" is not exported by "__vite-browser-external" #9625

Closed
opened 2026-04-13 05:12:12 -05:00 by GiteaMirror · 6 comments
Owner

Originally created by @asterikx on GitHub (Jul 20, 2025).
Original GitHub issue: https://github.com/better-auth/better-auth/issues/3498

Is this suited for github?

  • Yes, this is suited for github

To Reproduce

Building a Tanstack Start app (i.e. using Vite) results in the following error after upgrading from 1.2.12 to 1.3.1:

✗ Build failed in 5.16s
error during build:
../../node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js (1:9): "Buffer" is not exported by "__vite-browser-external", imported by "../../node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js".
file: /Users/asterikx/monorepo/node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js:1:9

1: import { Buffer } from 'node:buffer';
            ^
2: import { decoder } from '../lib/buffer_utils.js';
3: function normalize(input) {

    at getRollupError (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/parseAst.js:401:41)
    at error (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/parseAst.js:397:42)
    at Module.error (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:16803:16)
    at Module.traceVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:17252:29)
    at ModuleScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:14901:39)
    at ReturnValueScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:5620:38)
    at FunctionBodyScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:5620:38)
    at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:7324:49)
    at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23)
    at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:11986:15)
    at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23)
    at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:7339:19)
    at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23)
    at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:11986:15)
    at ArrowFunctionExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23)
    at VariableDeclarator.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23)
    at VariableDeclaration.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2781:28)
    at Program.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2781:28)
    at Module.bindReferences (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:16782:18)
    at Graph.sortModules (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22571:20)
    at Graph.build (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22469:14)
    at async file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:23157:13
    at async catchUnfinishedHookActions (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22628:16)
    at async rollupInternal (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:23152:5)
    at async buildEnvironment (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34135:12)
    at async Object.build (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34490:19)
    at async Object.buildApp (file:///Users/asterikx/monorepo/node_modules/@tanstack/start-plugin-core/dist/esm/nitro-plugin/plugin.js:45:15)
    at async Object.buildApp (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34486:38)
    at async CAC.<anonymous> (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/cli.js:642:3)
Command failed with exit code 1: /Users/asterikx/monorepo/node_modules/.bin/vite build
error: script "build" exited with code 1
error: script "deploy" exited with code 1

Current vs. Expected behavior

No build errors

What version of Better Auth are you using?

1.3.1

Originally created by @asterikx on GitHub (Jul 20, 2025). Original GitHub issue: https://github.com/better-auth/better-auth/issues/3498 ### Is this suited for github? - [x] Yes, this is suited for github ### To Reproduce Building a Tanstack Start app (i.e. using Vite) results in the following error after upgrading from 1.2.12 to 1.3.1: ```txt ✗ Build failed in 5.16s error during build: ../../node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js (1:9): "Buffer" is not exported by "__vite-browser-external", imported by "../../node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js". file: /Users/asterikx/monorepo/node_modules/better-auth/node_modules/jose/dist/node/esm/runtime/base64url.js:1:9 1: import { Buffer } from 'node:buffer'; ^ 2: import { decoder } from '../lib/buffer_utils.js'; 3: function normalize(input) { at getRollupError (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/parseAst.js:401:41) at error (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/parseAst.js:397:42) at Module.error (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:16803:16) at Module.traceVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:17252:29) at ModuleScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:14901:39) at ReturnValueScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:5620:38) at FunctionBodyScope.findVariable (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:5620:38) at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:7324:49) at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23) at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:11986:15) at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23) at MemberExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:7339:19) at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23) at CallExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:11986:15) at ArrowFunctionExpression.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23) at VariableDeclarator.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2785:23) at VariableDeclaration.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2781:28) at Program.bind (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:2781:28) at Module.bindReferences (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:16782:18) at Graph.sortModules (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22571:20) at Graph.build (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22469:14) at async file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:23157:13 at async catchUnfinishedHookActions (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:22628:16) at async rollupInternal (file:///Users/asterikx/monorepo/node_modules/rollup/dist/es/shared/node-entry.js:23152:5) at async buildEnvironment (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34135:12) at async Object.build (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34490:19) at async Object.buildApp (file:///Users/asterikx/monorepo/node_modules/@tanstack/start-plugin-core/dist/esm/nitro-plugin/plugin.js:45:15) at async Object.buildApp (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/chunks/dep-Bg4HVnP5.js:34486:38) at async CAC.<anonymous> (file:///Users/asterikx/monorepo/node_modules/vite/dist/node/cli.js:642:3) Command failed with exit code 1: /Users/asterikx/monorepo/node_modules/.bin/vite build error: script "build" exited with code 1 error: script "deploy" exited with code 1 ``` ### Current vs. Expected behavior No build errors ### What version of Better Auth are you using? 1.3.1
GiteaMirror added the locked label 2026-04-13 05:12:12 -05:00
Author
Owner

@dosubot[bot] commented on GitHub (Jul 20, 2025):

Hi @asterikx! I'm Dosu and I’m helping the better-auth team.

This error happens because the ESM-only jose library (a dependency of better-auth) imports Node.js built-ins like Buffer, which aren't available in browser builds unless polyfilled. The better-auth package tries to separate client and server code, but if you import from the default entrypoint (import { betterAuth } from "better-auth"), Vite may bundle server-only code (and thus jose and Buffer) into your client build, causing this error.

To avoid this, always import from the explicit client entrypoint:

import { betterAuth } from "better-auth/client"

This ensures only browser-safe code is included in your client bundle and avoids pulling in jose or Node.js modules like Buffer source.

If you must use the default entrypoint, you would need to configure Vite to polyfill Node.js built-ins, but this is not recommended and can lead to other issues. There is currently no official better-auth or jose documentation for Vite-specific polyfills or workarounds source.

Switching your import to "better-auth/client" should resolve the build error. If you still see issues, double-check all imports and dependencies to ensure nothing is pulling in server-only code on the client.

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

<!-- gh-comment-id:3094494833 --> @dosubot[bot] commented on GitHub (Jul 20, 2025): <!-- Greeting --> Hi @asterikx! I'm [Dosu](https://go.dosu.dev/dosubot) and I’m helping the better-auth team. <!-- Answer --> This error happens because the ESM-only `jose` library (a dependency of better-auth) imports Node.js built-ins like `Buffer`, which aren't available in browser builds unless polyfilled. The better-auth package tries to separate client and server code, but if you import from the default entrypoint (`import { betterAuth } from "better-auth"`), Vite may bundle server-only code (and thus `jose` and `Buffer`) into your client build, causing this error. To avoid this, always import from the explicit client entrypoint: ```js import { betterAuth } from "better-auth/client" ``` This ensures only browser-safe code is included in your client bundle and avoids pulling in `jose` or Node.js modules like `Buffer` [source](https://github.com/better-auth/better-auth/blob/99460c6325fef3661bc990826e8ae71933516330/packages/better-auth/src/client/index.ts). If you must use the default entrypoint, you would need to configure Vite to polyfill Node.js built-ins, but this is not recommended and can lead to other issues. There is currently no official better-auth or jose documentation for Vite-specific polyfills or workarounds [source](https://better-auth.com/docs/basic-usage). Switching your import to `"better-auth/client"` should resolve the build error. If you still see issues, double-check all imports and dependencies to ensure nothing is pulling in server-only code on the client. <!-- Dosu Comment Footer --> *To reply, just mention [@dosu](https://go.dosu.dev/dosubot).* --- <sup>How did I do? [Good](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=great_response) | [Irrelevant](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=irrelevant_answer) | [Incorrect](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=incorrect_sources) | [Verbose](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=too_verbose) | [Hallucination](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=hallucination) | [Report 🐛](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=bug_report) | [Other](https://app.dosu.dev/response-feedback/a50c4fdd-e9fc-4cd9-9462-6a9612f2cb10?feedback_type=other)</sup>&nbsp;&nbsp;[![Join Discord](https://img.shields.io/badge/join-5865F2?logo=discord&logoColor=white&label=)](https://go.dosu.dev/discord-bot)&nbsp;[![Share on X](https://img.shields.io/badge/X-share-black)](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/better-auth/better-auth/issues/3498)
Author
Owner

@Kinfe123 commented on GitHub (Jul 21, 2025):

What version node are you using ?

<!-- gh-comment-id:3095528776 --> @Kinfe123 commented on GitHub (Jul 21, 2025): What version node are you using ?
Author
Owner

@asterikx commented on GitHub (Jul 21, 2025):

@Kinfe123 I'm running on Node v22.16.0.
When I downgrade to better-auth@1.2.12 everything works again as expected.

<!-- gh-comment-id:3097615548 --> @asterikx commented on GitHub (Jul 21, 2025): @Kinfe123 I'm running on Node v22.16.0. When I downgrade to `better-auth@1.2.12` everything works again as expected.
Author
Owner

@Kinfe123 commented on GitHub (Jul 21, 2025):

can you try upgrade node to v23.6.0 or something latest ?

<!-- gh-comment-id:3098201306 --> @Kinfe123 commented on GitHub (Jul 21, 2025): can you try upgrade node to v23.6.0 or something latest ?
Author
Owner

@asterikx commented on GitHub (Jul 21, 2025):

With v22.17.1 (latest LTS) and v24.4.1 (latest stable version) I get the same build error as above and the same client-side error in development:

(0 , import_node_util.promisify) is not a function

and browser console warnings:

Module "node:crypto" has been externalized for browser compatibility. Cannot access "node:crypto.webcrypto" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
Module "node:util" has been externalized for browser compatibility. Cannot access "node:util.promisify" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
Module "node:crypto" has been externalized for browser compatibility. Cannot access "node:crypto.generateKeyPair" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
<!-- gh-comment-id:3099336265 --> @asterikx commented on GitHub (Jul 21, 2025): With v22.17.1 (latest LTS) and v24.4.1 (latest stable version) I get the same build error as above and the same client-side error in development: ``` (0 , import_node_util.promisify) is not a function ``` and browser console warnings: ``` Module "node:crypto" has been externalized for browser compatibility. Cannot access "node:crypto.webcrypto" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. Module "node:util" has been externalized for browser compatibility. Cannot access "node:util.promisify" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. Module "node:crypto" has been externalized for browser compatibility. Cannot access "node:crypto.generateKeyPair" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. ```
Author
Owner

@asterikx commented on GitHub (Aug 2, 2025):

The error no longer seems to occur with better-auth version 1.3.4.

<!-- gh-comment-id:3146535284 --> @asterikx commented on GitHub (Aug 2, 2025): The error no longer seems to occur with better-auth version 1.3.4.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#9625