Description
As a developer using Vite+ with Bun as my package manager, I want vp lint to
use Bun to load vite.config.ts so that Node.js is not required in my toolchain.
Currently vp lint is the only command in the entire Vite+ toolchain that
requires Node.js >=22.18.0. Everything else — vp build, vp dev, vp fmt,
vp staged, vp install — works entirely through Bun when bun.lock is present.
Error seen when Node < 22.18.0:
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"
TypeScript config files require Node.js ^20.19.0 || >=22.18.0.
Detected Node.js v22.15.1.
This forces Bun-first projects to maintain a Node installation solely for
vp lint config loading, which defeats the purpose of a unified Bun toolchain.
Suggested solution
When bun.lock or bun.lockb is detected in the workspace root (the same
detection logic already used by vp install), use Bun instead of Node to
load vite.config.ts for lint configuration.
Alternatively, respect a VP_ACTIVE_NODE or VP_CONFIG_RUNTIME environment
variable that lets users specify which binary to use for config loading.
We tested symlinking bun as node in PATH — vp lint ran correctly with Bun
as the runtime, suggesting there is no real incompatibility, only a hardcoded
node binary lookup.
Alternative
Use .oxlintrc.json instead of vite.config.ts for lint config — this bypasses
Node entirely since Oxlint reads JSON natively. However the official Vite+ docs
explicitly state "We do not recommend using .oxlintrc.json with Vite+",
so this is not a proper solution for users following the recommended setup.
Additional context
Environment:
- Package manager: Bun
1.3.10 (bun.lock present)
- vite-plus:
0.1.20
- OS: macOS darwin-arm64
- Node currently required:
v25.9.0 (used only for this one step)
All other vp commands use Bun correctly:
| Command |
Runtime |
Works without Node? |
vp install |
Bun (delegates via bun.lock detection) |
✅ |
vp build / vp dev |
Bun loads vite.config.ts |
✅ |
vp fmt |
Pure Rust, no runtime needed |
✅ |
vp staged |
Bun orchestrates the hook |
✅ |
vp lint |
Requires Node >=22.18.0 to load vite.config.ts |
❌ |
vp lint is the only outlier. Making it consistent with the rest of the
toolchain would allow Bun-first projects to run entirely without Node.
Validations
Description
As a developer using Vite+ with Bun as my package manager, I want
vp linttouse Bun to load
vite.config.tsso that Node.js is not required in my toolchain.Currently
vp lintis the only command in the entire Vite+ toolchain thatrequires Node.js
>=22.18.0. Everything else —vp build,vp dev,vp fmt,vp staged,vp install— works entirely through Bun whenbun.lockis present.Error seen when Node < 22.18.0:
This forces Bun-first projects to maintain a Node installation solely for
vp lintconfig loading, which defeats the purpose of a unified Bun toolchain.Suggested solution
When
bun.lockorbun.lockbis detected in the workspace root (the samedetection logic already used by
vp install), use Bun instead of Node toload
vite.config.tsfor lint configuration.Alternatively, respect a
VP_ACTIVE_NODEorVP_CONFIG_RUNTIMEenvironmentvariable that lets users specify which binary to use for config loading.
We tested symlinking
bunasnodein PATH —vp lintran correctly with Bunas the runtime, suggesting there is no real incompatibility, only a hardcoded
nodebinary lookup.Alternative
Use
.oxlintrc.jsoninstead ofvite.config.tsfor lint config — this bypassesNode entirely since Oxlint reads JSON natively. However the official Vite+ docs
explicitly state "We do not recommend using
.oxlintrc.jsonwith Vite+",so this is not a proper solution for users following the recommended setup.
Additional context
Environment:
1.3.10(bun.lockpresent)0.1.20v25.9.0(used only for this one step)All other
vpcommands use Bun correctly:vp installbun.lockdetection)vp build/vp devvite.config.tsvp fmtvp stagedvp lint>=22.18.0to loadvite.config.tsvp lintis the only outlier. Making it consistent with the rest of thetoolchain would allow Bun-first projects to run entirely without Node.
Validations