Files
b8eba4f703 Mark bun builtin modules as external (fixes #75220) (#77616)
Fixes https://github.com/vercel/next.js/issues/75220

This marks Bun's builtin modules as external, following the same pattern
as for Node.

- `"bun:ffi"`
- `"bun:jsc"`
- `"bun:sqlite"`
- `"bun:test"`
- `"bun:wrap"`
- `"bun"`

I have not manually tested this change yet, nor attempted to write tests
for this. I did check for other places in the code that should be
updated and _maybe_
`externals/crates/next-custom-transforms/src/transforms/warn_for_edge_runtime.rs`
should as well, but I'll leave that up to you whether or not that makes
sense. Opening as a draft until this can be at least manually tested.

By the way, node's `sqlite` module is missing from `NODE_EXTERNALS`.
That seemed out of scope but worth mentioning.

Current error message:

![image](https://github.com/user-attachments/assets/0538fd35-a1ce-44fe-af7f-1db696cd3e7b)

---------

Co-authored-by: Alistair Smith <[email protected]>
2025-08-01 11:15:57 +02:00

78 lines
2.0 KiB
TypeScript

export default function Page() {
// These should be handled as external modules
// When not running in Bun, require() will throw "Cannot find module"
let bunFfiStatus = 'not loaded'
let bunJscStatus = 'not loaded'
let bunSqliteStatus = 'not loaded'
let bunTestStatus = 'not loaded'
let bunWrapStatus = 'not loaded'
let bunStatus = 'not loaded'
try {
require('bun:ffi')
bunFfiStatus = 'loaded successfully'
} catch (e: any) {
// Expected error when not running in Bun
bunFfiStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
try {
require('bun:jsc')
bunJscStatus = 'loaded successfully'
} catch (e: any) {
bunJscStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
try {
require('bun:sqlite')
bunSqliteStatus = 'loaded successfully'
} catch (e: any) {
bunSqliteStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
try {
require('bun:test')
bunTestStatus = 'loaded successfully'
} catch (e: any) {
bunTestStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
try {
require('bun:wrap')
bunWrapStatus = 'loaded successfully'
} catch (e: any) {
bunWrapStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
try {
require('bun')
bunStatus = 'loaded successfully'
} catch (e: any) {
bunStatus = e.message.includes('Cannot find module')
? 'external (not found)'
: 'error: ' + e.message
}
return (
<div>
<h1>Bun Externals Test</h1>
<div id="bun-ffi">{bunFfiStatus}</div>
<div id="bun-jsc">{bunJscStatus}</div>
<div id="bun-sqlite">{bunSqliteStatus}</div>
<div id="bun-test">{bunTestStatus}</div>
<div id="bun-wrap">{bunWrapStatus}</div>
<div id="bun">{bunStatus}</div>
</div>
)
}