Skip to content

feat(linter/plugins): allow JS plugins to access globals#16512

Merged
overlookmotel merged 11 commits intooxc-project:mainfrom
lilnasy:globals-quick-dirty-and-inefficient
Dec 6, 2025
Merged

feat(linter/plugins): allow JS plugins to access globals#16512
overlookmotel merged 11 commits intooxc-project:mainfrom
lilnasy:globals-quick-dirty-and-inefficient

Conversation

@lilnasy
Copy link
Contributor

@lilnasy lilnasy commented Dec 4, 2025

Future work

  • Add test for globals from the env field. Implement support if not currently supported.
  • Optimization: we want to serialize globals for all files only once at the start of the lint run.

AI Usage

  • This PR was drafted by Claude Sonnet 4.5 in Plan + Agent mode, then manually reviewed and iterated on.

@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI A-linter-plugins Area - Linter JS plugins labels Dec 4, 2025
@codspeed-hq
Copy link

codspeed-hq bot commented Dec 4, 2025

CodSpeed Performance Report

Merging #16512 will not alter performance

Comparing lilnasy:globals-quick-dirty-and-inefficient (f9bb9fc) with main (a7d435b)

Summary

✅ 4 untouched
⏩ 41 skipped1

Footnotes

  1. 41 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.

Copy link
Member

@overlookmotel overlookmotel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know you've said this is just an experiment, but I think we should merge it!

Yes, it's inefficient to serialize globals for every file (ditto settings). But at least it works! Much better than just not supporting it at all, which is what we have now.

A few comments below - none major.


We also support an env option in config: https://oxc.rs/docs/guide/usage/linter/config.html#configuration-file-format

I'm not sure globals from env already get merged into OxlintGlobals on Rust side, in which case it'll work already after this PR.

If so, we should add a test for that. If not, we should add support for env (simplest way would be to just apply env to OxlintGlobals on Rust side, before serializing to JSON). Either way, I suggest leaving that to a follow-up PR.

@lilnasy
Copy link
Contributor Author

lilnasy commented Dec 6, 2025

@overlookmotel Makes sense. I'll address the review comments tonight and add todo comments for performance.

@lilnasy lilnasy changed the title experiment(linter/plugins): allow JS plugins to access globals by serializing globals for every file feat(linter/plugins): allow JS plugins to access globals Dec 6, 2025
@lilnasy lilnasy force-pushed the globals-quick-dirty-and-inefficient branch from 53416c8 to d8a94c0 Compare December 6, 2025 18:18
@github-actions github-actions bot added the C-enhancement Category - New feature or request label Dec 6, 2025
@lilnasy lilnasy marked this pull request as ready for review December 6, 2025 18:58
@lilnasy lilnasy requested a review from camc314 as a code owner December 6, 2025 18:58
Copilot AI review requested due to automatic review settings December 6, 2025 18:58
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enables JavaScript plugins to access the globals configuration by passing serialized globals from Rust to JavaScript for each file during linting. The implementation follows the existing pattern used for settings, serializing the globals once per file to support folder-level overrides.

Key Changes:

  • Added globals serialization in Rust and deserialization in TypeScript with lazy initialization
  • Extended the ExternalLinterLintFileCb type signature to include globals JSON parameter
  • Implemented globals conversion from "writeable" to "writable" for ESLint compatibility in JavaScript

Reviewed changes

Copilot reviewed 17 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
crates/oxc_linter/src/lib.rs Serializes globals to JSON and passes to external linter callback
crates/oxc_linter/src/external_linter.rs Updates type signature to accept globals JSON parameter
crates/oxc_linter/src/context/host.rs Adds getter method to expose globals from config
crates/oxc_linter/src/config/globals.rs Adds TODO comment about adding serde rename for ESLint compatibility
apps/oxlint/src/run.rs Updates type signature for globals parameter in JS callback
apps/oxlint/src/js_plugins/external_linter.rs Passes globals JSON to JavaScript lint function
apps/oxlint/src-js/plugins/lint.ts Accepts and processes globals JSON parameter, with incorrect import extension
apps/oxlint/src-js/plugins/globals.ts New module implementing globals deserialization with "writeable" to "writable" conversion, contains incorrect import extension
apps/oxlint/src-js/plugins/context.ts Exposes globals via languageOptions with lazy initialization
apps/oxlint/src-js/plugins/config.ts Updates TODO to include globals setup
apps/oxlint/src-js/package/rule_tester.ts Adds empty globals JSON parameter for testing
apps/oxlint/src-js/cli.ts Forwards globals JSON parameter to lint function
apps/oxlint/src-js/bindings.d.ts Updates type definition to include globals parameter
apps/oxlint/test/fixtures/globals/* Test fixtures verifying globals functionality with base and override configurations

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@lilnasy
Copy link
Contributor Author

lilnasy commented Dec 6, 2025

Addressed all review comments. CI is failing because spell check flaked.

I wish `oxfmt` would do this automatically for us. It will, but not implemented yet...
Tiny optimization. Avoids property lookup on each call.
Copy link
Member

@overlookmotel overlookmotel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent!

Pushed a few commits with my usual style nits, but made no substantive changes.

By the way, the as casts I've added are ugly and probably make it less readable, but I think on balance preferable to avoid // @ts-expect-error comments where possible. So annoying that TS doesn't allow type-asserting side effects of functions. It seems designed to guide you away from performant patterns, and make you introduce extra temp variables everywhere if you want to type cast.

@overlookmotel overlookmotel self-assigned this Dec 6, 2025
@overlookmotel overlookmotel merged commit 5c62c16 into oxc-project:main Dec 6, 2025
20 checks passed
overlookmotel pushed a commit that referenced this pull request Dec 8, 2025
# Oxlint
### 🚀 Features

- 5c62c16 linter/plugins: Allow JS plugins to access `globals` (#16512)
(Arsh)
- ba7bd51 linter: Implement no-useless-return rule (#16388) (FMP1783)
- fa605df linter: Fix `arrow-body-style` automatically (#16252) (Hamir
Mahal)
- 7584938 linter/plugins: Add ESLint compat mode to `RuleTester`
(#16538) (overlookmotel)
- b38c2d0 linter/plugins: Add `SourceCode#lineStartIndices` getter
(#16510) (overlookmotel)
- ba93ffc linter/plugins: Add `SourceCode#tokensAndComments` getter
(#16503) (overlookmotel)
- d2ca540 linter/plugins: Add `SourceCode#isESTree` property (#16499)
(overlookmotel)
- 9001234 linter: Add fix support for tsgolint diagnostics (#16344)
(camc314)
- 2d6bb85 editors: Toggle client after vscode config changing (#16162)
(Liang Mi)
- 0ec454c linter/plugins: Merge default options into options (#16358)
(overlookmotel)

### 🐛 Bug Fixes

- a806d74 linter: Use import type for ESTree in visitor.d.ts (#16472)
(camc314)
- 8933c84 linter: Fix jest/expect-expect rule docs. (#16550)
(connorshea)
- 1c08879 linter: Fix false positive in no-invalid-fetch-options for
conditional expressions (#16570) (camc314)
- 1a69b06 linter: Junit support for multiple files/errors/diagnostics
(#16568) (Shrey Sudhir)
- a7d435b linter/sort-keys: Preserve multi-line formatting in autofix
(#16563) (camc314)
- fd84dcc linter/plugins: `RuleTester` parser catch fatal errors
(#16558) (overlookmotel)
- ab4deb0 linter/plugins: Improve safety of options merging (#16549)
(overlookmotel)
- a58c76a linter: Fix the `react/jsx-fragments` rule config to take a
string argument (#16175) (connorshea)
- f7751cc linter/plugins: Fix TS types for `RuleTester` (#16546)
(overlookmotel)
- 6d33320 linter/plugins: Prevent user modifying the default config
(#16545) (overlookmotel)
- b4483c5 linter/plugins: Add config support skeleton to `RuleTester`
(#16537) (overlookmotel)
- 3a49158 linter/plugins: Improve TS types for tokens (#16502)
(overlookmotel)
- 0c14531 oxlint/lsp: Revalidate all known files after internal restart
(#16407) (Sysix)
- 2d3217e linter/plugins: Remove panics from `lint_file` and
`setup_configs` (#16453) (overlookmotel)
- 655341b linter/oxc: Not emit error when the threshold is zero and we
haven't detected a barrel file (#16455) (Said Atrahouch)
- b9f359f linter/no-var: Expand fix span to prevent conflicts with other
rules (#16445) (camc314)
- c6778f3 linter: Preserve original quote style in no-hex-escape fixer
(#16410) (camc314)
- 3ad913b linter: Improve rule docs page autofix description (#16281)
(Hamir Mahal)
- 0b7e00c linter: Handle keyword unary expressions in yoda rule fix
(#16402) (camc314)
- 5fd3096 lsp: Skip (un)registering file watcher when not dynamic
watchers are supported (#16406) (Sysix)
- 804144f lsp: Respect `null` as invalid settings for
`workspace/didChangeConfiguration` (#16361) (Sysix)
- 723a7e5 linter: Prevent invalid BigInt literal fix for exponential
notation (#16401) (camc314)
- 2589fb1 linter: Fix prefer_expect_resolves fixer for member
expressions (#16393) (camc314)
- 428c7cd linter: Wrap logical expressions in parentheses when fixing
no-extra-boolean-cast (#16363) (camc314)
- 3903567 linter: Skip prefer-string-raw in type annotations and .d.ts
files (#16382) (camc314)
- d490daa linter/func-names: Use centralized reserved keyword check and
fix ancestor traversal (#16362) (camc314)
- d846c53 tsgolint: Use `expect` when sending diagnostics (#16341)
(camc314)
- 114665d lsp: Watch for files when workspace folder is added &
`workspace/configuration` is not supported (#16307) (Sysix)
- f5d0ebb linter/func-names: Avoid suggesting reserved keywords as
function names (#16352) (camc314)
- d268135 linter/no-console-spaces: Preserve escape sequences in fixer
output (#16349) (camc314)
- b02c21a linter/valid-title: Preserve escape sequences in fixer output
(#16348) (camc314)
- 2373b76 linter/no-untyped-mock-factory: Fix fixer producing invalid
syntax when newline exists after opening paren (#16351) (camc314)

### ⚡ Performance

- 67cfa58 lsp: Avoid some clones (#16519) (Sysix)
- 2a09665 oxlint/lsp: Store only `LinterCodeAction` instead of the
complete `DiagnosticReport` (#16516) (Sysix)
- 0ca9754 lsp: Avoid `Uri` to `String` and back to `Uri` conversion
(#16470) (Sysix)
- 2736636 lsp: Avoid cloning when revalidating diagnostics (#16469)
(Sysix)
- 793b989 linter/plugins: Move result-processing work off main JS thread
(#16456) (overlookmotel)
- 44dff7b linter/plugins: Skip serialization overhead when no errors
(#16443) (overlookmotel)
- 1aa2409 linter/plugins: Do not remove `messageId` field from
`DiagnosticReport` before sending to Rust (#16442) (overlookmotel)
- 5017db8 linter/plugins: Reduce calls to `Path::to_string_lossy`
(#16429) (overlookmotel)
- 194e357 linter: Use `SmallVec` for rule options (#16400) (Copilot)
- e31b2bd linter: Only clone config if required (#16350) (overlookmotel)
- 3026086 linter: Avoid cloning rule options (#16338) (overlookmotel)

### 📚 Documentation

- fef77af linter: Fix `jsx-a11y/img-redundant-alt` configuration option
names. (#16552) (connorshea)
- c0766df linter: Add config option docs for `unicorn/filename-case`
rule. (#16280) (connorshea)
- e24aabd linter/plugins: Correct comment (#16559) (overlookmotel)
- 514c724 linter: Fix the name of the IIFEs config option in
eslint/max-lines-per-function (#16554) (connorshea)
- 4d94438 linter/rules: Correct arrow body style options in
documentation (#16509) (GRK)
- 6bac4ec linter: Pull configuration struct doc comment when rendering
config docs (#16288) (connorshea)
- 8c85e08 linter/plugins: Add TODO comment (#16511) (overlookmotel)
- a9b9298 linter/plugins: Add JSDoc comments to `SourceCode` properties
(#16497) (overlookmotel)
- 467cc1a linter/plugins: Improve comment on error branch (#16464)
(overlookmotel)
- 041b119 linter: Add config option docs to `jest/consistent-test-it`
rule. (#16286) (connorshea)

### 🛡️ Security

- d90ef9f deps: Update dependency rolldown to v1.0.0-beta.53 (#16428)
(renovate[bot])
# Oxfmt
### 🚀 Features

- 3184f17 oxfmt: Pass filepath field to prettier formatting (#16591)
(Yuji Sugiura)
- 7bb3304 oxfmt: Pass populated config to prettier formatting (#16584)
(leaysgur)
- 69f84d2 oxfmt: Pass raw config to prettier formatting (#16582)
(leaysgur)
- a83a2ec oxfmt: Expose `setupConfig(configJSON: string)` napi callback
(#16579) (leaysgur)
- 930533f formatter: Convert single `\r` to `\n` in string and add a
debug assertion to ensure that there is no `\r` in the text (#16531)
(Dunqing)
- af76b0e oxfmt: Support formatting HTML, YAML, GraphQL, Handlerbars,
Markdown, CSS files (#16524) (leaysgur)
- 66b64ef oxfmt: Support formatting JSON files (#16523) (leaysgur)
- 4767926 oxfmt: Prepare non-js/ts file support with prettier (#16480)
(leaysgur)
- 2b4ce5d oxfmt: Use dedicated `format_by_xxx_formatter` method by
`SourceType` (#16417) (leaysgur)
- 0867d2f oxfmt: Set up JS `formatFile()` function for Rust via napi
(#16415) (leaysgur)
- b6feb66 oxfmt: Rename `embedded.ts` with preparing `formatFile()`
function (#16414) (leaysgur)
- 80e6999 formatter: Add debug assertion to ensure that there is no
empty content is passed in (#16475) (Dunqing)
- 7374856 formatter/sort-imports: Support `options.internalPattern`
(#16372) (leaysgur)
- dd2cb62 oxfmt: Not error on explicit `--write` flag used (#16376)
(leaysgur)

### 🐛 Bug Fixes

- 40b0134 formatter: Incorrect formatting of `useImperativeHandle` hook
(#16533) (Dunqing)
- 75393e7 formatter: Incorrect handling of `CRLF` for multiline block
comment (#16528) (Dunqing)
- ee0756b formatter: JSX text wrapping incorrect 2 (#16320) (Dunqing)
- 36308b8 formatter: Fix indent for new expression with type cast
(#16380) (leaysgur)

### ⚡ Performance

- 6f16a8f formatter: Avoid using an indent with a empty content (#16474)
(Dunqing)
- 201c98f formatter: Early return when no comments need to be printed
(#16432) (Dunqing)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Copilot AI pushed a commit that referenced this pull request Dec 10, 2025
# Oxlint
### 🚀 Features

- 5c62c16 linter/plugins: Allow JS plugins to access `globals` (#16512)
(Arsh)
- ba7bd51 linter: Implement no-useless-return rule (#16388) (FMP1783)
- fa605df linter: Fix `arrow-body-style` automatically (#16252) (Hamir
Mahal)
- 7584938 linter/plugins: Add ESLint compat mode to `RuleTester`
(#16538) (overlookmotel)
- b38c2d0 linter/plugins: Add `SourceCode#lineStartIndices` getter
(#16510) (overlookmotel)
- ba93ffc linter/plugins: Add `SourceCode#tokensAndComments` getter
(#16503) (overlookmotel)
- d2ca540 linter/plugins: Add `SourceCode#isESTree` property (#16499)
(overlookmotel)
- 9001234 linter: Add fix support for tsgolint diagnostics (#16344)
(camc314)
- 2d6bb85 editors: Toggle client after vscode config changing (#16162)
(Liang Mi)
- 0ec454c linter/plugins: Merge default options into options (#16358)
(overlookmotel)

### 🐛 Bug Fixes

- a806d74 linter: Use import type for ESTree in visitor.d.ts (#16472)
(camc314)
- 8933c84 linter: Fix jest/expect-expect rule docs. (#16550)
(connorshea)
- 1c08879 linter: Fix false positive in no-invalid-fetch-options for
conditional expressions (#16570) (camc314)
- 1a69b06 linter: Junit support for multiple files/errors/diagnostics
(#16568) (Shrey Sudhir)
- a7d435b linter/sort-keys: Preserve multi-line formatting in autofix
(#16563) (camc314)
- fd84dcc linter/plugins: `RuleTester` parser catch fatal errors
(#16558) (overlookmotel)
- ab4deb0 linter/plugins: Improve safety of options merging (#16549)
(overlookmotel)
- a58c76a linter: Fix the `react/jsx-fragments` rule config to take a
string argument (#16175) (connorshea)
- f7751cc linter/plugins: Fix TS types for `RuleTester` (#16546)
(overlookmotel)
- 6d33320 linter/plugins: Prevent user modifying the default config
(#16545) (overlookmotel)
- b4483c5 linter/plugins: Add config support skeleton to `RuleTester`
(#16537) (overlookmotel)
- 3a49158 linter/plugins: Improve TS types for tokens (#16502)
(overlookmotel)
- 0c14531 oxlint/lsp: Revalidate all known files after internal restart
(#16407) (Sysix)
- 2d3217e linter/plugins: Remove panics from `lint_file` and
`setup_configs` (#16453) (overlookmotel)
- 655341b linter/oxc: Not emit error when the threshold is zero and we
haven't detected a barrel file (#16455) (Said Atrahouch)
- b9f359f linter/no-var: Expand fix span to prevent conflicts with other
rules (#16445) (camc314)
- c6778f3 linter: Preserve original quote style in no-hex-escape fixer
(#16410) (camc314)
- 3ad913b linter: Improve rule docs page autofix description (#16281)
(Hamir Mahal)
- 0b7e00c linter: Handle keyword unary expressions in yoda rule fix
(#16402) (camc314)
- 5fd3096 lsp: Skip (un)registering file watcher when not dynamic
watchers are supported (#16406) (Sysix)
- 804144f lsp: Respect `null` as invalid settings for
`workspace/didChangeConfiguration` (#16361) (Sysix)
- 723a7e5 linter: Prevent invalid BigInt literal fix for exponential
notation (#16401) (camc314)
- 2589fb1 linter: Fix prefer_expect_resolves fixer for member
expressions (#16393) (camc314)
- 428c7cd linter: Wrap logical expressions in parentheses when fixing
no-extra-boolean-cast (#16363) (camc314)
- 3903567 linter: Skip prefer-string-raw in type annotations and .d.ts
files (#16382) (camc314)
- d490daa linter/func-names: Use centralized reserved keyword check and
fix ancestor traversal (#16362) (camc314)
- d846c53 tsgolint: Use `expect` when sending diagnostics (#16341)
(camc314)
- 114665d lsp: Watch for files when workspace folder is added &
`workspace/configuration` is not supported (#16307) (Sysix)
- f5d0ebb linter/func-names: Avoid suggesting reserved keywords as
function names (#16352) (camc314)
- d268135 linter/no-console-spaces: Preserve escape sequences in fixer
output (#16349) (camc314)
- b02c21a linter/valid-title: Preserve escape sequences in fixer output
(#16348) (camc314)
- 2373b76 linter/no-untyped-mock-factory: Fix fixer producing invalid
syntax when newline exists after opening paren (#16351) (camc314)

### ⚡ Performance

- 67cfa58 lsp: Avoid some clones (#16519) (Sysix)
- 2a09665 oxlint/lsp: Store only `LinterCodeAction` instead of the
complete `DiagnosticReport` (#16516) (Sysix)
- 0ca9754 lsp: Avoid `Uri` to `String` and back to `Uri` conversion
(#16470) (Sysix)
- 2736636 lsp: Avoid cloning when revalidating diagnostics (#16469)
(Sysix)
- 793b989 linter/plugins: Move result-processing work off main JS thread
(#16456) (overlookmotel)
- 44dff7b linter/plugins: Skip serialization overhead when no errors
(#16443) (overlookmotel)
- 1aa2409 linter/plugins: Do not remove `messageId` field from
`DiagnosticReport` before sending to Rust (#16442) (overlookmotel)
- 5017db8 linter/plugins: Reduce calls to `Path::to_string_lossy`
(#16429) (overlookmotel)
- 194e357 linter: Use `SmallVec` for rule options (#16400) (Copilot)
- e31b2bd linter: Only clone config if required (#16350) (overlookmotel)
- 3026086 linter: Avoid cloning rule options (#16338) (overlookmotel)

### 📚 Documentation

- fef77af linter: Fix `jsx-a11y/img-redundant-alt` configuration option
names. (#16552) (connorshea)
- c0766df linter: Add config option docs for `unicorn/filename-case`
rule. (#16280) (connorshea)
- e24aabd linter/plugins: Correct comment (#16559) (overlookmotel)
- 514c724 linter: Fix the name of the IIFEs config option in
eslint/max-lines-per-function (#16554) (connorshea)
- 4d94438 linter/rules: Correct arrow body style options in
documentation (#16509) (GRK)
- 6bac4ec linter: Pull configuration struct doc comment when rendering
config docs (#16288) (connorshea)
- 8c85e08 linter/plugins: Add TODO comment (#16511) (overlookmotel)
- a9b9298 linter/plugins: Add JSDoc comments to `SourceCode` properties
(#16497) (overlookmotel)
- 467cc1a linter/plugins: Improve comment on error branch (#16464)
(overlookmotel)
- 041b119 linter: Add config option docs to `jest/consistent-test-it`
rule. (#16286) (connorshea)

### 🛡️ Security

- d90ef9f deps: Update dependency rolldown to v1.0.0-beta.53 (#16428)
(renovate[bot])
# Oxfmt
### 🚀 Features

- 3184f17 oxfmt: Pass filepath field to prettier formatting (#16591)
(Yuji Sugiura)
- 7bb3304 oxfmt: Pass populated config to prettier formatting (#16584)
(leaysgur)
- 69f84d2 oxfmt: Pass raw config to prettier formatting (#16582)
(leaysgur)
- a83a2ec oxfmt: Expose `setupConfig(configJSON: string)` napi callback
(#16579) (leaysgur)
- 930533f formatter: Convert single `\r` to `\n` in string and add a
debug assertion to ensure that there is no `\r` in the text (#16531)
(Dunqing)
- af76b0e oxfmt: Support formatting HTML, YAML, GraphQL, Handlerbars,
Markdown, CSS files (#16524) (leaysgur)
- 66b64ef oxfmt: Support formatting JSON files (#16523) (leaysgur)
- 4767926 oxfmt: Prepare non-js/ts file support with prettier (#16480)
(leaysgur)
- 2b4ce5d oxfmt: Use dedicated `format_by_xxx_formatter` method by
`SourceType` (#16417) (leaysgur)
- 0867d2f oxfmt: Set up JS `formatFile()` function for Rust via napi
(#16415) (leaysgur)
- b6feb66 oxfmt: Rename `embedded.ts` with preparing `formatFile()`
function (#16414) (leaysgur)
- 80e6999 formatter: Add debug assertion to ensure that there is no
empty content is passed in (#16475) (Dunqing)
- 7374856 formatter/sort-imports: Support `options.internalPattern`
(#16372) (leaysgur)
- dd2cb62 oxfmt: Not error on explicit `--write` flag used (#16376)
(leaysgur)

### 🐛 Bug Fixes

- 40b0134 formatter: Incorrect formatting of `useImperativeHandle` hook
(#16533) (Dunqing)
- 75393e7 formatter: Incorrect handling of `CRLF` for multiline block
comment (#16528) (Dunqing)
- ee0756b formatter: JSX text wrapping incorrect 2 (#16320) (Dunqing)
- 36308b8 formatter: Fix indent for new expression with type cast
(#16380) (leaysgur)

### ⚡ Performance

- 6f16a8f formatter: Avoid using an indent with a empty content (#16474)
(Dunqing)
- 201c98f formatter: Early return when no comments need to be printed
(#16432) (Dunqing)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
taearls pushed a commit to taearls/oxc that referenced this pull request Dec 11, 2025
…ct#16512)

- This PR implements a naive, inefficient solution to oxc-project#16359.
- To establish current and expected behavior, this PR serializes
rust-resolved and -overridden globals once for every file.

## Future work
- [ ] Add test for globals from the `env` field. Implement support if
not currently supported.
- [ ] Optimization: we want to serialize `globals` for all files only
once at the start of the lint run.

## AI Usage
- This PR was drafted by Claude Sonnet 4.5 in Plan + Agent mode, then
manually reviewed and iterated on.

---------

Co-authored-by: overlookmotel <theoverlookmotel@gmail.com>
taearls pushed a commit to taearls/oxc that referenced this pull request Dec 11, 2025
# Oxlint
### 🚀 Features

- 5c62c16 linter/plugins: Allow JS plugins to access `globals` (oxc-project#16512)
(Arsh)
- ba7bd51 linter: Implement no-useless-return rule (oxc-project#16388) (FMP1783)
- fa605df linter: Fix `arrow-body-style` automatically (oxc-project#16252) (Hamir
Mahal)
- 7584938 linter/plugins: Add ESLint compat mode to `RuleTester`
(oxc-project#16538) (overlookmotel)
- b38c2d0 linter/plugins: Add `SourceCode#lineStartIndices` getter
(oxc-project#16510) (overlookmotel)
- ba93ffc linter/plugins: Add `SourceCode#tokensAndComments` getter
(oxc-project#16503) (overlookmotel)
- d2ca540 linter/plugins: Add `SourceCode#isESTree` property (oxc-project#16499)
(overlookmotel)
- 9001234 linter: Add fix support for tsgolint diagnostics (oxc-project#16344)
(camc314)
- 2d6bb85 editors: Toggle client after vscode config changing (oxc-project#16162)
(Liang Mi)
- 0ec454c linter/plugins: Merge default options into options (oxc-project#16358)
(overlookmotel)

### 🐛 Bug Fixes

- a806d74 linter: Use import type for ESTree in visitor.d.ts (oxc-project#16472)
(camc314)
- 8933c84 linter: Fix jest/expect-expect rule docs. (oxc-project#16550)
(connorshea)
- 1c08879 linter: Fix false positive in no-invalid-fetch-options for
conditional expressions (oxc-project#16570) (camc314)
- 1a69b06 linter: Junit support for multiple files/errors/diagnostics
(oxc-project#16568) (Shrey Sudhir)
- a7d435b linter/sort-keys: Preserve multi-line formatting in autofix
(oxc-project#16563) (camc314)
- fd84dcc linter/plugins: `RuleTester` parser catch fatal errors
(oxc-project#16558) (overlookmotel)
- ab4deb0 linter/plugins: Improve safety of options merging (oxc-project#16549)
(overlookmotel)
- a58c76a linter: Fix the `react/jsx-fragments` rule config to take a
string argument (oxc-project#16175) (connorshea)
- f7751cc linter/plugins: Fix TS types for `RuleTester` (oxc-project#16546)
(overlookmotel)
- 6d33320 linter/plugins: Prevent user modifying the default config
(oxc-project#16545) (overlookmotel)
- b4483c5 linter/plugins: Add config support skeleton to `RuleTester`
(oxc-project#16537) (overlookmotel)
- 3a49158 linter/plugins: Improve TS types for tokens (oxc-project#16502)
(overlookmotel)
- 0c14531 oxlint/lsp: Revalidate all known files after internal restart
(oxc-project#16407) (Sysix)
- 2d3217e linter/plugins: Remove panics from `lint_file` and
`setup_configs` (oxc-project#16453) (overlookmotel)
- 655341b linter/oxc: Not emit error when the threshold is zero and we
haven't detected a barrel file (oxc-project#16455) (Said Atrahouch)
- b9f359f linter/no-var: Expand fix span to prevent conflicts with other
rules (oxc-project#16445) (camc314)
- c6778f3 linter: Preserve original quote style in no-hex-escape fixer
(oxc-project#16410) (camc314)
- 3ad913b linter: Improve rule docs page autofix description (oxc-project#16281)
(Hamir Mahal)
- 0b7e00c linter: Handle keyword unary expressions in yoda rule fix
(oxc-project#16402) (camc314)
- 5fd3096 lsp: Skip (un)registering file watcher when not dynamic
watchers are supported (oxc-project#16406) (Sysix)
- 804144f lsp: Respect `null` as invalid settings for
`workspace/didChangeConfiguration` (oxc-project#16361) (Sysix)
- 723a7e5 linter: Prevent invalid BigInt literal fix for exponential
notation (oxc-project#16401) (camc314)
- 2589fb1 linter: Fix prefer_expect_resolves fixer for member
expressions (oxc-project#16393) (camc314)
- 428c7cd linter: Wrap logical expressions in parentheses when fixing
no-extra-boolean-cast (oxc-project#16363) (camc314)
- 3903567 linter: Skip prefer-string-raw in type annotations and .d.ts
files (oxc-project#16382) (camc314)
- d490daa linter/func-names: Use centralized reserved keyword check and
fix ancestor traversal (oxc-project#16362) (camc314)
- d846c53 tsgolint: Use `expect` when sending diagnostics (oxc-project#16341)
(camc314)
- 114665d lsp: Watch for files when workspace folder is added &
`workspace/configuration` is not supported (oxc-project#16307) (Sysix)
- f5d0ebb linter/func-names: Avoid suggesting reserved keywords as
function names (oxc-project#16352) (camc314)
- d268135 linter/no-console-spaces: Preserve escape sequences in fixer
output (oxc-project#16349) (camc314)
- b02c21a linter/valid-title: Preserve escape sequences in fixer output
(oxc-project#16348) (camc314)
- 2373b76 linter/no-untyped-mock-factory: Fix fixer producing invalid
syntax when newline exists after opening paren (oxc-project#16351) (camc314)

### ⚡ Performance

- 67cfa58 lsp: Avoid some clones (oxc-project#16519) (Sysix)
- 2a09665 oxlint/lsp: Store only `LinterCodeAction` instead of the
complete `DiagnosticReport` (oxc-project#16516) (Sysix)
- 0ca9754 lsp: Avoid `Uri` to `String` and back to `Uri` conversion
(oxc-project#16470) (Sysix)
- 2736636 lsp: Avoid cloning when revalidating diagnostics (oxc-project#16469)
(Sysix)
- 793b989 linter/plugins: Move result-processing work off main JS thread
(oxc-project#16456) (overlookmotel)
- 44dff7b linter/plugins: Skip serialization overhead when no errors
(oxc-project#16443) (overlookmotel)
- 1aa2409 linter/plugins: Do not remove `messageId` field from
`DiagnosticReport` before sending to Rust (oxc-project#16442) (overlookmotel)
- 5017db8 linter/plugins: Reduce calls to `Path::to_string_lossy`
(oxc-project#16429) (overlookmotel)
- 194e357 linter: Use `SmallVec` for rule options (oxc-project#16400) (Copilot)
- e31b2bd linter: Only clone config if required (oxc-project#16350) (overlookmotel)
- 3026086 linter: Avoid cloning rule options (oxc-project#16338) (overlookmotel)

### 📚 Documentation

- fef77af linter: Fix `jsx-a11y/img-redundant-alt` configuration option
names. (oxc-project#16552) (connorshea)
- c0766df linter: Add config option docs for `unicorn/filename-case`
rule. (oxc-project#16280) (connorshea)
- e24aabd linter/plugins: Correct comment (oxc-project#16559) (overlookmotel)
- 514c724 linter: Fix the name of the IIFEs config option in
eslint/max-lines-per-function (oxc-project#16554) (connorshea)
- 4d94438 linter/rules: Correct arrow body style options in
documentation (oxc-project#16509) (GRK)
- 6bac4ec linter: Pull configuration struct doc comment when rendering
config docs (oxc-project#16288) (connorshea)
- 8c85e08 linter/plugins: Add TODO comment (oxc-project#16511) (overlookmotel)
- a9b9298 linter/plugins: Add JSDoc comments to `SourceCode` properties
(oxc-project#16497) (overlookmotel)
- 467cc1a linter/plugins: Improve comment on error branch (oxc-project#16464)
(overlookmotel)
- 041b119 linter: Add config option docs to `jest/consistent-test-it`
rule. (oxc-project#16286) (connorshea)

### 🛡️ Security

- d90ef9f deps: Update dependency rolldown to v1.0.0-beta.53 (oxc-project#16428)
(renovate[bot])
# Oxfmt
### 🚀 Features

- 3184f17 oxfmt: Pass filepath field to prettier formatting (oxc-project#16591)
(Yuji Sugiura)
- 7bb3304 oxfmt: Pass populated config to prettier formatting (oxc-project#16584)
(leaysgur)
- 69f84d2 oxfmt: Pass raw config to prettier formatting (oxc-project#16582)
(leaysgur)
- a83a2ec oxfmt: Expose `setupConfig(configJSON: string)` napi callback
(oxc-project#16579) (leaysgur)
- 930533f formatter: Convert single `\r` to `\n` in string and add a
debug assertion to ensure that there is no `\r` in the text (oxc-project#16531)
(Dunqing)
- af76b0e oxfmt: Support formatting HTML, YAML, GraphQL, Handlerbars,
Markdown, CSS files (oxc-project#16524) (leaysgur)
- 66b64ef oxfmt: Support formatting JSON files (oxc-project#16523) (leaysgur)
- 4767926 oxfmt: Prepare non-js/ts file support with prettier (oxc-project#16480)
(leaysgur)
- 2b4ce5d oxfmt: Use dedicated `format_by_xxx_formatter` method by
`SourceType` (oxc-project#16417) (leaysgur)
- 0867d2f oxfmt: Set up JS `formatFile()` function for Rust via napi
(oxc-project#16415) (leaysgur)
- b6feb66 oxfmt: Rename `embedded.ts` with preparing `formatFile()`
function (oxc-project#16414) (leaysgur)
- 80e6999 formatter: Add debug assertion to ensure that there is no
empty content is passed in (oxc-project#16475) (Dunqing)
- 7374856 formatter/sort-imports: Support `options.internalPattern`
(oxc-project#16372) (leaysgur)
- dd2cb62 oxfmt: Not error on explicit `--write` flag used (oxc-project#16376)
(leaysgur)

### 🐛 Bug Fixes

- 40b0134 formatter: Incorrect formatting of `useImperativeHandle` hook
(oxc-project#16533) (Dunqing)
- 75393e7 formatter: Incorrect handling of `CRLF` for multiline block
comment (oxc-project#16528) (Dunqing)
- ee0756b formatter: JSX text wrapping incorrect 2 (oxc-project#16320) (Dunqing)
- 36308b8 formatter: Fix indent for new expression with type cast
(oxc-project#16380) (leaysgur)

### ⚡ Performance

- 6f16a8f formatter: Avoid using an indent with a empty content (oxc-project#16474)
(Dunqing)
- 201c98f formatter: Early return when no comments need to be printed
(oxc-project#16432) (Dunqing)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
@lilnasy lilnasy deleted the globals-quick-dirty-and-inefficient branch December 16, 2025 19:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-cli Area - CLI 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.

3 participants