Skip to content

feat(linter/config): allow aliasing plugin names to allow names the same as builtin plugins#15569

Merged
overlookmotel merged 6 commits intomainfrom
c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization
Dec 17, 2025
Merged

feat(linter/config): allow aliasing plugin names to allow names the same as builtin plugins#15569
overlookmotel merged 6 commits intomainfrom
c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization

Conversation

@camc314
Copy link
Contributor

@camc314 camc314 commented Nov 10, 2025

fixes #15413

@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI labels Nov 10, 2025
Copy link
Contributor Author

camc314 commented Nov 10, 2025


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.

@github-actions github-actions bot added the C-enhancement Category - New feature or request label Nov 10, 2025
@codspeed-hq
Copy link

codspeed-hq bot commented Nov 10, 2025

CodSpeed Performance Report

Merging #15569 will not alter performance

Comparing c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization (16e2e62) with main (f8abd56)

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.

@camc314 camc314 force-pushed the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch 6 times, most recently from a847775 to f3d3b76 Compare November 10, 2025 23:00
@camc314 camc314 marked this pull request as ready for review November 10, 2025 23:05
Copilot AI review requested due to automatic review settings November 10, 2025 23:05
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 enhances external plugin support by allowing plugins to be specified with optional custom aliases. Previously, plugins could only be specified as strings; now they can be strings or objects with name and specifier fields. The changes include improved serialization/deserialization logic and refactoring to use a dedicated ExternalPluginEntry struct.

  • Introduced ExternalPluginEntry struct to represent plugin configurations with optional aliases
  • Updated JSON schemas to support both string and object formats for plugin entries
  • Refactored serialization/deserialization to handle the new plugin entry format

Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
npm/oxlint/configuration_schema.json Updated schema to use ExternalPluginEntry definition supporting both string and object formats, removed uniqueItems constraint
crates/oxc_linter/src/snapshots/schema_json.snap Snapshot update matching the schema changes
crates/oxc_linter/src/config/oxlintrc.rs Updated to use new ExternalPluginEntry type and moved serialization functions to dedicated module
crates/oxc_linter/src/config/overrides.rs Updated to use shared ExternalPluginEntry type and removed duplicate serialization functions
crates/oxc_linter/src/config/mod.rs Added external_plugins module
crates/oxc_linter/src/config/external_plugins.rs New module containing ExternalPluginEntry struct, schema, and serialization/deserialization logic
crates/oxc_linter/src/config/config_builder.rs Updated plugin loading to support custom aliases from ExternalPluginEntry
apps/oxlint/test/fixtures/custom_plugin_name_alias/* New test fixture demonstrating custom plugin alias functionality

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

@camc314 camc314 changed the title feat(config): enhance external plugins support with optional aliases and improve serialization feat(linter/config): allow aliasing plugin names to allow names the same as builtin plugins Nov 10, 2025
@camc314 camc314 force-pushed the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch from f3d3b76 to 3037a22 Compare November 10, 2025 23:32
@camc314 camc314 changed the base branch from main to graphite-base/15569 November 10, 2025 23:38
@camc314 camc314 force-pushed the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch from 3037a22 to f85fc97 Compare November 10, 2025 23:38
@camc314 camc314 changed the base branch from graphite-base/15569 to c/11-10-feat_docs_improve_rendering_of_oxlintrc_schema_markdown November 10, 2025 23:38
@camc314 camc314 force-pushed the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch 2 times, most recently from 1b1119a to ab0efa0 Compare November 10, 2025 23:51
@camc314 camc314 marked this pull request as draft November 10, 2025 23:52
@graphite-app graphite-app bot changed the base branch from c/11-10-feat_docs_improve_rendering_of_oxlintrc_schema_markdown to graphite-base/15569 November 11, 2025 15:47
@overlookmotel overlookmotel force-pushed the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch from 64c0b4e to 16e2e62 Compare December 17, 2025 19:08
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.

Great. I've pushed a few commits, purely code style / refactor. I hate the way robots put use statements all over the place inside functions.

Will follow up with a couple more substantive changes in separate PRs.

@overlookmotel overlookmotel merged commit a0f74a0 into main Dec 17, 2025
20 checks passed
@overlookmotel overlookmotel deleted the c/11-10-feat_config_enhance_external_plugins_support_with_optional_aliases_and_improve_serialization branch December 17, 2025 19:17
graphite-app bot pushed a commit that referenced this pull request Dec 17, 2025
Follow-on after #15569. Just improve indentation in error message when user tries to use a reserved plugin name.
graphite-app bot pushed a commit that referenced this pull request Dec 17, 2025
…#17019)

Follow-on after #15569. Simplify serialization/deserialization of `ExternalPluginEntry`. Since we now have a type for this, there's no need for `deserialize_external_plugins` any more.
overlookmotel added a commit that referenced this pull request Dec 18, 2025
Follow-on after #15569. This fixture is to test that illegal *aliases*
produce an error. So make the plugin name defined in the plugin a legal
name, to make sure the test tests what it's meant to.
graphite-app bot pushed a commit that referenced this pull request Dec 18, 2025
Follow-on after #15569. Rename test fixtures. Remove the `custom_plugin_` prefix on fixture names, and standardize naming of one other.
@thernstig
Copy link

thernstig commented Dec 18, 2025

Sorry for the late comment.

What happens if there is a duplicate here?

{
  "jsPlugins": [
    { "name": "jsPluginJsDoc", "specifier": "./plugin.ts" },
    { "name": "jsPluginJsDoc", "specifier": "./plugin2.ts" }
  ],
}

I assume it should fail, and be a test for it?

Hence I wonder if this would not have been better. It naturally disallows duplicates.

{
  "jsPlugins": {
    "jsPluginJsDoc": "./plugin.ts",
    "someOtherPlugin": "./some-other-plugin.ts"
  }
}

graphite-app bot pushed a commit that referenced this pull request Dec 18, 2025
…7071)

#15569 introduced ability to define JS plugins with aliased names.

Check that that alias name is valid - i.e does not start with `eslint-plugin-*` etc.

We could allow this, but it seems like a recipe for bugs. It's a weird thing to do anyway, so just outlaw it.
overlookmotel added a commit that referenced this pull request Dec 19, 2025
# Oxlint
### 🚀 Features

- 6cc3fdf linter/no-inferrable-types: Implement fixer (#17090) (camc314)
- 2067997 linter/no-negation-in-equality-check: Implement suggestion
(#17084) (camc314)
- 552f9ef vscode: Auto-generate VSCode README configuration from
package.json (#16970) (Copilot)
- 9190c4b linter/no-unnecessary-array-flat-depth: Implement fixer
(#17057) (camc314)
- ed789de linter/misrefactored-assign-op: Implement fixer (#17056)
(camc314)
- a0f74a0 linter/config: Allow aliasing plugin names to allow names the
same as builtin plugins (#15569) (Cameron)
- a43d251 linter/plugins: `RuleTester` support `languageOptions.globals`
(#17009) (overlookmotel)
- 35070d9 linter/bad-bitwise-operator: Implement fixer (#17006)
(camc314)
- 322d995 linter/prefer-enum-initializers: Implement fixer (#17004)
(camc314)
- ae1e5bc vscode: Add support for tsgolint binary configuration (#16921)
(ColemanDunn)
- 3bfe31e linter/eslint-plugin-vitest: Add prefer-called-with as vitest
compatible jest rule (#16993) (Said Atrahouch)
- 0cd075f linter/eslint-plugin-jest: Add fix capabilities to
prefer-called-with rule (#16987) (Said Atrahouch)
- 357564b linter: Add options for
`typescript/require-array-sort-compare` rule. (#16980) (connorshea)
- 2b0ffba linter: Add options for
`typescript/no-meaningless-void-operator` rule. (#16981) (connorshea)
- 8bc4287 linter/plugins: Validate options against schema (#16974)
(overlookmotel)
- fdc7d08 linter: Implement eslint/capitalized-comments (#16896) (Tu
Shaokun)
- f8b6561 linter: Add support for `test.for` in vitest (#16925)
(camchenry)
- 7ee0379 linter/eslint-plugin-vitest: Implement prefer-spy-on (#16426)
(Said Atrahouch)
- fc96ee0 linter: Implement jest/prefer-to-have-been-called-times
(#16938) (秦宇航)
- 291b57b ast_tools: Generate TS declaration files for deserializer and
walk files (#16912) (camc314)
- e31da2a linter: Implement jest/perfer-to-have-been-called (#16899)
(秦宇航)
- 1a31306 linter/eslint-plugin-vitest: Add require-hook as vitest
compatible jest rule (#16880) (Said Atrahouch)
- cd3db21 linter: Add ignoredTypeNames option to no-base-to-string rule
(#16898) (camc314)
- 763b25a linter: Implement eslint/no-inline-comments (#16885) (Tu
Shaokun)

### 🐛 Bug Fixes

- fb9e193 linter: OOM problems with custom plugins (#17082)
(overlookmotel)
- 005ec25 linter: Permit `$schema` `.oxlintrc.json` struct (#17060)
(Copilot)
- fd03131 linter/plugins: Handle plugin names containing slashes
(#17073) (overlookmotel)
- b2a4fac linter/plugins: Error if plugin name alias is not normalized
(#17071) (overlookmotel)
- e046c4e linter/no-misused-spread: Add rule options support (#17054)
(camc314)
- 5c1a9e0 linter/no-deprecated: Add rule options support (#17053)
(camc314)
- 8c9cafe linter: `import/consistent-type-specifier-style`: add support
for declaration files (#16979) (camchenry)
- dab4780 linter/no-empty-pattern: Misleading help message for arrays
(#17039) (Copilot)
- 67f8c5d linter/plugins: Get correct plugin name in all cases (#17033)
(overlookmotel)
- 674dab9 linter/plugins: Fix indentation in error message (#17018)
(overlookmotel)
- 6524f72 linter/plugins: Add `@types/node` dev dependency to `oxlint`
package (#17016) (overlookmotel)
- 7a35513 linter/plugins: Better error for `null` in `globals` in
`RuleTester` (#17011) (overlookmotel)
- 42603ba linter/plugins: Always define `languageOptions.globals`
(#17008) (overlookmotel)
- 4cdc2f8 linter: Fix VITEST override rule list and add test for
alphabetizing the two lists (#16975) (Connor Shea)
- e466562 linter/consistent-type-definitions: Handle parenthesized types
in rule (#16998) (camc314)
- fce267c linter: Correct vitest plugin source to be
`@vitest/eslint-plugin` (#16976) (connorshea)
- 477bb57 linter: Fix `vitest/no-restricted-vi-methods` and add tests
for it. (#16971) (connorshea)
- 7d6974d linter: Ignore oxlint directive comments in
capitalized-comments (#16989) (Tu Shaokun)
- 23ac6b1 linter/plugins: Apply defaults from `meta.schema` to options
(#16930) (overlookmotel)
- 2f946cf linter/plugins: Error if `defaultOptions` is not
JSON-serializable (#16959) (overlookmotel)
- d8b8a57 linter/plugins: Freeze whole of merged options (#16958)
(overlookmotel)
- d446c43 linter: Prevent extra fields from being present on oxlint
config file (#16874) (connorshea)
- b845871 linter/plugins: Correctly handle object with `__proto__` keys
in options merging (#16928) (overlookmotel)
- c897794 linter: Fix eslint/sort-imports allowSeparatedGroups not
working with single empty line (#16012) (Duc Nghiem Xuan)
- 0c347a1 linter/array-type: Handle satisfies expression (#16903)
(camc314)

### ⚡ Performance

- 70d853c linter: Avoid cloning source text when cloning AST into
fixed-size allocator (#17088) (overlookmotel)
- 4d389f7 linter: Less bounds checks in `normalize_plugin_name` (#17030)
(overlookmotel)
- fd8e9c6 linter/plugins: Speed up cloning JSON objects (#16997)
(overlookmotel)
- d77e22d linter/plugins: Use `DEFAULT_OPTIONS` for rules with empty
array as default options (#16913) (overlookmotel)

### 📚 Documentation

- 6d053b4 linter: Fix typo in doc comment (#17091) (overlookmotel)
- b5f3c91 linter: Document intentional exclusion of ignoreCase option in
jsx-no-duplicate-props (#17046) (Copilot)
- a0bf5d8 linter: Fix the config option docs for no-inline-comments
rule. (#16983) (connorshea)
- ca26a11 linter/plugins: Fix typo in doc comment (#16966)
(overlookmotel)
- 3183bf8 linter/plugins: Fix typo in JSDoc comment (#16900)
(overlookmotel)
# Oxfmt
### 🚀 Features

- 15dfb55 oxfmt: Respect single nearest `.editorconfig` (#17043)
(leaysgur)
- 8c33ff4 oxfmt: Expose Node.js API: `format(fileName, sourceText,
options?)` (#16939) (leaysgur)

### 🐛 Bug Fixes

- d340c87 oxfmt: Update api `FormatOptions` type with `& Record<string,
unknown>` (#17036) (leaysgur)
- 827a256 oxfmt: Place ignorePatterns at bottom of JSON in --migrate
prettier (#16926) (Boshen)

Co-authored-by: overlookmotel <[email protected]>
qinyuhang pushed a commit to qinyuhang/oxc that referenced this pull request Jan 22, 2026
…ame as builtin plugins (oxc-project#15569)

fixes oxc-project#15413

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: overlookmotel <[email protected]>
qinyuhang pushed a commit to qinyuhang/oxc that referenced this pull request Jan 22, 2026
)

Follow-on after oxc-project#15569. Just improve indentation in error message when user tries to use a reserved plugin name.
qinyuhang pushed a commit to qinyuhang/oxc that referenced this pull request Jan 22, 2026
…oxc-project#17019)

Follow-on after oxc-project#15569. Simplify serialization/deserialization of `ExternalPluginEntry`. Since we now have a type for this, there's no need for `deserialize_external_plugins` any more.
qinyuhang pushed a commit to qinyuhang/oxc that referenced this pull request Jan 22, 2026
)

Follow-on after oxc-project#15569. This fixture is to test that illegal *aliases*
produce an error. So make the plugin name defined in the plugin a legal
name, to make sure the test tests what it's meant to.
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.

linter(plugins): Improve the error message/config schema for "reserved" plugin names

4 participants

Comments