Repository navigation
Closed
Description
Describe the bug
vite-plus has oxfmt and oxlint bin files that should be referenced by related files in node_modules/.bin/
But vite-plus also installs its oxfmt and oxlint dependencies, which have their own bin files, and those bin files are referenced in node_modules/.bin/ instead of the vite-plus bins.
This breaks the oxc vscode extension when trying to use vite.config.ts as the configPath
Not sure if this is only an issue with Windows and/or npm, either way the bin names should probably not conflict.
Reproduction
https://github.com/nstepien/vite-plus-bug
Steps to reproduce
npm i vite-plus@latest- look at the relevant
oxfmt/oxlintfiles undernode_modules/.bin/ - check if the formatter and linter work correctly in vscode
System Info
Environment:
Version 25.9.0
Source default
Source Path C:\Users\Stepi\.vite-plus\config.json
Tool Paths:
node C:\Users\Stepi\.vite-plus\js_runtime\node\25.9.0\node.exe
npm C:\Users\Stepi\.vite-plus\js_runtime\node\25.9.0\npm.cmd
npx C:\Users\Stepi\.vite-plus\js_runtime\node\25.9.0\npx.cmd
vp v0.1.19
Local vite-plus:
vite-plus v0.1.19
Tools:
vite v8.0.8
rolldown v1.0.0-rc.16
vitest v4.1.4
oxfmt v0.45.0
oxlint v1.60.0
oxlint-tsgolint v0.21.1
tsdown v0.21.9
Environment:
Package manager npm vlatest
Node.js v25.9.0
`npm version` output:
{
npm: '11.13.0',
node: '25.9.0',
acorn: '8.16.0',
ada: '3.4.4',
amaro: '1.1.8',
ares: '1.34.6',
brotli: '1.2.0',
cldr: '48.0',
icu: '78.2',
lief: '0.17.0',
llhttp: '9.3.1',
merve: '1.2.2',
modules: '141',
napi: '10',
nbytes: '0.1.3',
ncrypto: '0.0.1',
nghttp2: '1.68.0',
nghttp3: '',
ngtcp2: '',
openssl: '3.5.5',
simdjson: '4.5.0',
simdutf: '7.3.3',
sqlite: '3.51.3',
tz: '2026a',
undici: '7.24.4',
unicode: '17.0',
uv: '1.51.0',
uvwasi: '0.0.23',
v8: '14.1.146.11-node.25',
zlib: '1.3.1-e00f703',
zstd: '1.5.7'
}Used Package Manager
npm
Logs
2026-04-26 21:21:35.001 [info] 2026-04-26T20:21:34.961695Z WARN oxlint::lsp::server_linter: Failed to load config: Failed to parse config from d:/repos/vite-plus-bug\vite.config.tsValidations
- Read the Contributing Guidelines.
- Check that there isn't already an issue for the same bug.
- Confirm this is a Vite+ issue and not an upstream issue (Vite, Vitest, tsdown, Rolldown, or Oxc).
- The provided reproduction is a minimal reproducible example.
Reacted by JongKyung Lee , Connor Shea, mikkelal and Max
Metadata
Metadata
Labels
bugSomething isn't workingSomething isn't working
Type
Fields
Priority
None yet
Effort
None yet
Target date
None yet
Start date
None yet
Activity
leaysgur commentedon Apr 27, 2026
I think I was able to reproduce it too, with
npmand on macOS.With
pnpm:With
npm:The same happens with
vp iw/npm.@fengmk2 What was this supposed to look like in the first place? Usage with
npmis broken from day 1...?jong-kyung commentedon Apr 27, 2026
I can reproduce this too. I think the root cause is dependency hoisting. 🤔
fengmk2 commentedon Apr 27, 2026
@leaysgur It's quite possible that we only tested the pnpm scenario at that time. In that case, we can't use the bin wrapper anymore and need to detect vite-plus and use the actual vp bin instead. 😢
leaysgur commentedon Apr 28, 2026
I tested a possible workaround that works on npm/pnpm/yarn without upstream changes:
oxlint/oxfmttobundleDependenciesso they get nested undernode_modules/vite-plus/instead of being hoisted.bin/oxlintand.bin/oxfmtpointing at our wrapper bins@oxlint/binding-*and@oxfmt/binding-*as directoptionalDependenciesonvite-plusbundleDependenciesThe catch is release complexity; ~38 binding entries to keep version-matched for every
oxlint/oxfmtupgrade.fengmk2 commentedon Apr 28, 2026
@leaysgur If the project's own dependencies or indirect dependencies include oxlint and oxfmt, will it also cause similar issues under npm due to hoisting?
leaysgur commentedon Apr 28, 2026
I think so. And that's still the case with
pnpmtoday.fengmk2 commentedon Apr 28, 2026
@leaysgur Should we directly consider switching to a different solution and stop implementing it through a temporary bin wrapper? Similar to the vitest extension, we first detect whether it's a vite-plus project. If it is, we use the vp bin; if not, we use the oxlint|fmt bin.
leaysgur commentedon Apr 30, 2026
(The reason I'm hesitant to make changes on the extension side (= the LSP consumer) is that, unlike Vitest, there are many other editors besides VS Code that oxapps need to support...)
Summary:
Unlike other sub-tools, only
oxlintandoxfmtare bundled with Vite+ in a way that is visible externally (the presence ofnode_modules/oxlint|fmt).Because of this, if a user installs
oxlintoroxfmtseparately later, they end up using an arbitrary version instead.vp -Vdiffers from the one shown byvp lint|fmt -Vvite-plus, to be overwritten (and broken)Additionally, we've found that when using
npmas the package manager, thevite-pluswrapper binaries aren't installed at all (the subject of this issue).Could we bundle these in a way that makes them invisible from the outside, just like the other tools?
UPDATE: We decided to remove wrapper bin. Please follow #1557
will-stone commentedon May 28, 2026
Hi, is there a plan to release a new
vite-plusevery time anoxlintoroxfmtis released? I'm usingvite-plusto build out my shared Oxlint/Oxfmt configs package and noticed it runs on older versions of Oxlint so doesn't include all the rules.fengmk2 commentedon May 28, 2026
@will-stone The current version release plan is that vite-plus will include these new versions in the following week after the new releases of oxlint/oxfmt.
will-stone commentedon May 28, 2026
Okay, thanks @fengmk2
nstepien commentedon Sep 24, 2026
I guess the only blocker left is in oxc-vscode now?
oxc-project/oxc-vscode#401 / oxc-project/oxc-vscode#384 / oxc-project/oxc-vscode#402
leaysgur commentedon Sep 25, 2026
Thank you for tracking. 😉
I've just released our IDE extensions, so now this issue can be closed.