Skip to content

Comments

feat(oxlint/lsp): support jsPlugins#17840

Merged
graphite-app[bot] merged 1 commit intomainfrom
01-10-feat_oxlint_lsp_support_jsplugins_
Jan 30, 2026
Merged

feat(oxlint/lsp): support jsPlugins#17840
graphite-app[bot] merged 1 commit intomainfrom
01-10-feat_oxlint_lsp_support_jsplugins_

Conversation

@Sysix
Copy link
Member

@Sysix Sysix commented Jan 9, 2026

No description provided.

@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI A-editor Area - Editor and Language Server A-linter-plugins Area - Linter JS plugins C-enhancement Category - New feature or request labels Jan 9, 2026
Copy link
Member Author

Sysix commented Jan 9, 2026


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@codspeed-hq
Copy link

codspeed-hq bot commented Jan 9, 2026

CodSpeed Performance Report

Merging this PR will not alter performance

Comparing 01-10-feat_oxlint_lsp_support_jsplugins_ (86c17d3) with 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ (2949b9d)

Summary

✅ 46 untouched benchmarks
⏩ 3 skipped benchmarks1

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 553af17 to bd30b7d Compare January 9, 2026 23:32
graphite-app bot pushed a commit that referenced this pull request Jan 10, 2026
…oad_plugin` on napi side (#17841)

found here #17840 (comment)
The check for reserved plugin names can be done before when we know the name already, avoiding a call to the NAPI side.
This fixes the panic for the `oxc` git project when testing it with nested configs enabled.

Added a comment for a possible panic in the future.

This does not will show up in `CLI` because it fast fails on this error, the `--lsp` integrations wants to skip it.
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from bd30b7d to 9894ace Compare January 10, 2026 12:57
@Sysix Sysix force-pushed the 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ branch from a816eec to dd99973 Compare January 10, 2026 12:57
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 9894ace to 4043c6b Compare January 10, 2026 16:39
@Sysix Sysix force-pushed the 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ branch from dd99973 to 33e572e Compare January 10, 2026 16:39
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 4043c6b to 5dfa180 Compare January 10, 2026 17:50
@Sysix Sysix force-pushed the 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ branch 2 times, most recently from c9a2b57 to 86cd53e Compare January 10, 2026 18:24
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 5dfa180 to 1f869a6 Compare January 10, 2026 18:24
@Sysix Sysix changed the base branch from 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ to graphite-base/17840 January 10, 2026 20:52
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 1f869a6 to e3ebf6b Compare January 12, 2026 19:07
@Sysix Sysix force-pushed the graphite-base/17840 branch from 86cd53e to 82b44d7 Compare January 12, 2026 19:07
@Sysix Sysix changed the base branch from graphite-base/17840 to 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ January 12, 2026 19:07
@Sysix Sysix force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from e3ebf6b to 94949af Compare January 13, 2026 20:08
@Sysix Sysix force-pushed the 01-08-chore_oxlint_napi_add_napi_function_createworkspace_and_destroyworkspace_ branch from 82b44d7 to 65cbb8d Compare January 13, 2026 20:08
@camc314 camc314 force-pushed the graphite-base/17840 branch from 2949b9d to 5bd6758 Compare January 30, 2026 14:00
@camc314 camc314 force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 86c17d3 to 4bf9e7d Compare January 30, 2026 14:00
@graphite-app graphite-app bot force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 4bf9e7d to 7d485f4 Compare January 30, 2026 14:00
@graphite-app graphite-app bot changed the base branch from graphite-base/17840 to main January 30, 2026 14:01
@graphite-app graphite-app bot force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 7d485f4 to 57357bf Compare January 30, 2026 14:01
@graphite-app graphite-app bot force-pushed the 01-10-feat_oxlint_lsp_support_jsplugins_ branch from 57357bf to 7a5c268 Compare January 30, 2026 14:23
graphite-app bot pushed a commit that referenced this pull request Jan 30, 2026
…18727)

#17809 and #17840 add support for JS plugins to LSP. However:

* We don't have much test coverage yet.
* The support for workspaces imposes a perf cost on Oxlint CLI (frequent hash map lookups on JS side).
* I believe there's a bug in JS-side code - #17809 (comment).

I think it'd be easier to merge this stack and then iterate on it in further PRs to fix the above.

To prevent any breakage for users in the meantime, this PR disables JS plugin support in LSP unless the `testing` Cargo feature is enabled - i.e. it's only enabled in tests for now.
@graphite-app graphite-app bot merged commit 7a5c268 into main Jan 30, 2026
22 checks passed
@graphite-app graphite-app bot deleted the 01-10-feat_oxlint_lsp_support_jsplugins_ branch January 30, 2026 14:29
@graphite-app graphite-app bot removed the 0-merge Merge with Graphite Merge Queue label Jan 30, 2026
graphite-app bot pushed a commit that referenced this pull request Jan 31, 2026
…:read_to_arena_str` (#18770)

Follow-on after #17840. After that PR we can loosen the lifetime requirements on `RuntimeFileSystem::read_to_arena_str`. All implementations now read/copy the source text into `Allocator`, so `&self` no longer needs to be `&'a self` - lifetime of the returned `&str` depends only on lifetime of the `&'a Allocator`.
camc314 added a commit that referenced this pull request Feb 2, 2026
# Oxlint
### 💥 BREAKING CHANGES

- b34a155 linter/plugins: [**BREAKING**] `RuleTester` set
`context.filename` to absolute path (#18702) (overlookmotel)

### 🚀 Features

- 1753209 linter/vscode: Run extension when JS configs are detected
(#18832) (camc314)
- c962dd2 linter/lsp: Implement support for oxlint.config.ts (#18826)
(camc314)
- da32203 linter: Auto generate oxlint.config.ts types (#18597)
(camc314)
- 19b4df7 oxlint: Introduce `defineConfig` helper (#18596) (camc314)
- ea97231 linter: Implement `oxlint.config.ts` support (#17563)
(camc314)
- 17ca42d linter: Implement `react/no-multi-comp` rule. (#18794)
(connorshea)
- 88f30e0 linter/plugins: Move eslint compatible plugin conversion to
`eslintCompatPlugin` function (#18791) (overlookmotel)
- 2a72794 linter/plugins: `RuleTester` take `cwd` property (#18756)
(overlookmotel)
- 9f533db linter: Add `find_prev_token_within` method for token search
(#18769) (camc314)
- 772ea70 linter: Introduce `load_js_configs` napi callback (#18767)
(camc314)
- e9690c1 linter: Introduce `DiscoveredConfig` in preparation for JS
configs (#18674) (camc314)
- 558b588 linter/prefer-namespace-keyword: Move to correctness (#18733)
(camc314)
- 7a5c268 oxlint/lsp: Support `jsPlugins` (#17840) (Sysix)
- c07497c linter/prefer-modern-dom-apis: Implement suggestion (#17965)
(Mikhail Baev)
- 8531bc9 linter: Implement `prefer-const` (#18687) (camchenry)
- 8670b18 parser: Error on ambient class accessor implementations
(#18592) (camc314)
- 6b8a5ae linter: Add `eslint-plugin-import/no-nodejs-modules` rule
(#18006) (Mikhail Baev)
- 04f400d linter/no-duplicates: Add support for `considerQueryString`
option (#18657) (camc314)
- 3b7f260 linter/consistent-generic-constructor: Implement fixer
(#18616) (camc314)
- 794f9e4 linter/prefer-exponentation-operator: Implement suggestion
(#18602) (camc314)
- 773d916 linter: `eslint/sort_keys` ignore leading and trailing spreads
in auto-fix (#18485) (Lonami)
- 20d4ede linter: Implement `import/no-relative-parent-imports` rule
(#18513) (Valentin Maerten)
- 0da45ef vscode: Fallback to globally installed oxlint/oxfmt packages
(#18007) (Sysix)

### 🐛 Bug Fixes

- a3417b1 linter/plugins: Clear state when reloading workspace (#18837)
(overlookmotel)
- c879992 linter: Error on arrays passed in as config (#18822) (camc314)
- 5c80422 linter/tsdown: Ensure relative path for globals import starts
with `./` (#18820) (camc314)
- 7419dfb linter: Remove invalid debug assersion, add test (#18819)
(camc314)
- 0ca6269 ci: Fix the repo path normalization logic for tests on
Windows. (#18815) (connorshea)
- c7b0a65 linter: Fix config option docs for `react/jsx-boolean-value`
rule. (#18811) (connorshea)
- cce374e linter/prefer-const: Replace entire declaration over just the
`let` kw (#18814) (camc314)
- 41f92d1 linter: Error when given config options for a lint rule that
has no config options defined. (#18809) (connorshea)
- 0867a36 linter/consistent-index-object-style: False positive with
mapped + generic types (#18801) (camc314)
- 1d34b42 linter: Fix 32 bit build (#18783) (camc314)
- 95df577 linter/plugins: Handle error from `destroyWorkspace` (#18763)
(overlookmotel)
- b3261dc linter: Fix the curly rule config to enforce the shape of the
config and emit correct docs (#18743) (connorshea)
- d981978 linter/plugins: Use non-blocking mode when calling
`destroyWorkspace` (#18762) (overlookmotel)
- 3f43d4c linter: Accept bools as valid values for `fixable` (#18772)
(camc314)
- 005910a linter/plugins: Support plugins outside of workspace (#18755)
(overlookmotel)
- fd92711 vscode: Use `fsPath` for workspace mapping (#18728) (Sysix)
- 358b2c1 linter/consistent-generic-constructors: Check bounds when
searching for `:` token (#18745) (connorshea)
- abd0c28 linter/capitalized-comments: Fix generated rule option docs
(#18748) (connorshea)
- d90a9f6 linter: Add more tests for `prefer-const`'s fixer and fix its
invalid behavior. (#18747) (connorshea)
- f82011b oxlint/lsp: Disable JS plugins support in LSP except in tests
(#18727) (overlookmotel)
- 94505c8 linter/jest: Change `prefer-spy-on` autofix to suggestion
(#18152) (Ben Lowery)
- 6ec1112 linter: Mark unused disable directive fix as suggestion
(#18703) (ddmoney420)
- 49609ec linter/no-useless-constructor: Consider argument
transformation as used (#18706) (ddmoney420)
- 40218de linter: Fix behavior of
jsx-a11y/no-static-element-interactions rule. (#17817) (connorshea)
- db9751d linter/no-html-link-for-pages: Handle `target=_blank`
correctly (#18693) (camc314)
- e440b78 linter/plugins: Pass all args to CFG event handlers when 2
rules use same handler (#18683) (overlookmotel)
- b393430 linter/curly: Fix multi-or-nest and consistent conflict
(#18660) (camc314)
- 2e1fbc2 linter/plugins: Implement `context.parserPath` (#18644)
(overlookmotel)
- 34951ed linter/plugins: `filename` option takes precedence over
`parserOptions.lang` in `RuleTester` (#18643) (overlookmotel)
- 28df160 linter/plugins: Allow line number passed to `report` to be 0
(#18642) (overlookmotel)
- 14fabec vscode: Use built-in `getWorkspaceFolder` for detecting the
right workspace of a given uri (#18583) (Sysix)
- 0ff4cea oxlint/cli: Report error when nested config could not be
parsed (#18504) (Sysix)

### ⚡ Performance

- 9862224 linter/plugins: Reduce cost of workspaces (#18758)
(overlookmotel)
- 6bc0bde linter: Remove string allocation (#18725) (overlookmotel)
- 3a6b41e linter/plugins: Replace ESLint Traverser with lightweight
traverseNode (#18529) (Rintaro Itokawa)

### 📚 Documentation

- dd1a653 linter: Fix doc comment for ignoreStateless config option.
(#18808) (connorshea)
- 5909085 linter/plugins: Add doc comments (#18753) (overlookmotel)
- ffe53a3 linter: Update lint function docs (#18766) (camc314)
- b82faec linter: Glob for any css module for no-unassigned-import
(#18713) (Ben Stickley)
- cd86347 linter: Mark some react rules as unsupported, misc docs
improvements (#18617) (connorshea)
- 23401d8 linter: Update fixes and suggestions status for tsgolint rules
(#18619) (camchenry)
# Oxfmt
### 🚀 Features

- ee30de9 oxfmt: Add config migration from biome (#18638) (Luca Fischer)

### 🐛 Bug Fixes

- e754b18 oxfmt/migrate-prettier: Set `experimentalSortPackagejson:
false` by default (#18831) (leaysgur)
- a83c266 formatter: Keep decorated function pattern hugged when params
break (#18830) (Dunqing)
- 0c8efe1 formatter: Quote numeric property keys with `quoteProps:
consistent` (#18803) (Dunqing)
- 9c14c3e formatter: Ignore comment does not work for sequence
expressions in arrow function body (#18799) (Dunqing)
- 54984ae formatter: Handle leading comments in arrow function sequence
expressions (#18798) (Dunqing)
- 61bb2b5 formatter: Correctly expand JSX returned from arrow callbacks
in JSX expression containers (#18797) (Dunqing)
- 34ee194 formatter: Tailwindcss sorting doesn't work for object
property keys (#18773) (Dunqing)
- 48f1e35 oxfmt: Prevent ThreadsafeFunction crash on Node.js exit
(#18723) (Boshen)
- e96adca formatter: Follow Prettier's approach for for-in initializer
parentheses (#18695) (Dunqing)
- 1215a6f formatter: Preserve quote for class property key in TypeScript
(#18692) (Dunqing)
- 059acae formatter: Incorrect comments placement for union type in
`TSTypeIntersection` (#18690) (Dunqing)
- c3d05c1 formatter,oxfmt: Handle CRLF with embedded formatting (#18686)
(leaysgur)
- 7cb3085 formatter: Preserve comments on rest elements (#18649)
(Dunqing)
- 21984dd formatter: Preserve type cast comments on rest parameters
(#18648) (Dunqing)
- 2f70254 formatter: Don't add extra semicolon on suppressed class
properties (#18631) (Dunqing)
- ac1ff4e oxfmt: Use `empty_line` IR for empty xxx-in-js line (#18623)
(leaysgur)
- 8f76900 oxfmt: Dedent xxx-in-js templates before calling prettier
(#18622) (leaysgur)
- 6b726ef oxfmt: Trim whitespace only xxx-in-js templates (#18621)
(leaysgur)

Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
@yzhe554
Copy link

yzhe554 commented Feb 2, 2026

Updated to 1.43.0 and it doesn't seem to be working for me.

@camc314
Copy link
Contributor

camc314 commented Feb 2, 2026

Updated to 1.43.0 and it doesn't seem to be working for me.

It didn't make it into 1.43.0 - you can build oxlint manually to test. It will be in next mondays release

@yzhe554
Copy link

yzhe554 commented Feb 2, 2026

Updated to 1.43.0 and it doesn't seem to be working for me.

It didn't make it into 1.43.0 - you can build oxlint manually to test. It will be in next mondays release

Is there any docs on how to build this manually?

@camc314
Copy link
Contributor

camc314 commented Feb 2, 2026

https://oxc.rs/docs/contribute/vscode.html

@andresgutgon
Copy link

andresgutgon commented Feb 7, 2026

Not working for me in nvim. I have the LSP pointing to this version

- oxlint (id: 3)
  - Version: 1.43.0
  - Root directory: ~/code/my-project/assets
  - Command: { "/Users/MY_USER/Library/pnpm/oxlint", "--lsp" }
  - Settings: {}
  - Attached buffers: 8

@Sysix
Copy link
Member Author

Sysix commented Feb 7, 2026

@andresgutgon the next release will enable it for the public :) It should come on Monday.
I guess you are still testing without the --testing feature flag

@andresgutgon
Copy link

Awesome, how can try with testing?

@Sysix
Copy link
Member Author

Sysix commented Feb 7, 2026

I updated yesterday to docs how to test unreleased versions:
https://oxc.rs/docs/contribute/vscode.html#testing-unreleased-versions-of-oxlint-oxfmt
You need to restart the editor after the path changes.

@andresgutgon
Copy link

Oh so i have to clone the oxc project and build it myself no?

@andresgutgon
Copy link

The thing is that 1.43.0 is already on npm no?

@Sysix
Copy link
Member Author

Sysix commented Feb 7, 2026

#18727 disabled this in the same release.
This week we enabled it for all #18834

Oh so i have to clone the oxc project and build it myself no?

Yes, until next release :)

@andresgutgon
Copy link

andresgutgon commented Feb 14, 2026

1.47.0 works perfectly in my nvim. Thanks!

This is a js plugin:

└╴  Fast refresh only works when a file only exports components. 
Use a new file to share constants or functions between components. 
oxc (react-refresh(only-export-components)) [253, 3]

@overlookmotel
Copy link
Member

1.47.0 works perfectly in my nvim. Thanks!

Thanks for the feedback. Glad it works!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-cli Area - CLI A-editor Area - Editor and Language Server A-linter Area - Linter A-linter-plugins Area - Linter JS plugins C-enhancement Category - New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants