Skip to content

Commit 7c6e7c5

Browse files
committed
feat(linter): load custom JS plugins
1 parent b09422c commit 7c6e7c5

File tree

15 files changed

+403
-186
lines changed

15 files changed

+403
-186
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/oxlint/src/command/lint.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::path::PathBuf;
22

33
use bpaf::Bpaf;
4-
use oxc_linter::{AllowWarnDeny, FixKind, LintPlugins};
4+
use oxc_linter::{AllowWarnDeny, BuiltinLintPlugins, FixKind, LintPlugins};
55

66
use crate::output_formatter::OutputFormat;
77

@@ -328,23 +328,25 @@ impl OverrideToggle {
328328

329329
impl EnablePlugins {
330330
pub fn apply_overrides(&self, plugins: &mut LintPlugins) {
331-
self.react_plugin.inspect(|yes| plugins.set(LintPlugins::REACT, yes));
332-
self.unicorn_plugin.inspect(|yes| plugins.set(LintPlugins::UNICORN, yes));
333-
self.oxc_plugin.inspect(|yes| plugins.set(LintPlugins::OXC, yes));
334-
self.typescript_plugin.inspect(|yes| plugins.set(LintPlugins::TYPESCRIPT, yes));
335-
self.import_plugin.inspect(|yes| plugins.set(LintPlugins::IMPORT, yes));
336-
self.jsdoc_plugin.inspect(|yes| plugins.set(LintPlugins::JSDOC, yes));
337-
self.jest_plugin.inspect(|yes| plugins.set(LintPlugins::JEST, yes));
338-
self.vitest_plugin.inspect(|yes| plugins.set(LintPlugins::VITEST, yes));
339-
self.jsx_a11y_plugin.inspect(|yes| plugins.set(LintPlugins::JSX_A11Y, yes));
340-
self.nextjs_plugin.inspect(|yes| plugins.set(LintPlugins::NEXTJS, yes));
341-
self.react_perf_plugin.inspect(|yes| plugins.set(LintPlugins::REACT_PERF, yes));
342-
self.promise_plugin.inspect(|yes| plugins.set(LintPlugins::PROMISE, yes));
343-
self.node_plugin.inspect(|yes| plugins.set(LintPlugins::NODE, yes));
331+
self.react_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::REACT, yes));
332+
self.unicorn_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::UNICORN, yes));
333+
self.oxc_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::OXC, yes));
334+
self.typescript_plugin
335+
.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::TYPESCRIPT, yes));
336+
self.import_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::IMPORT, yes));
337+
self.jsdoc_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::JSDOC, yes));
338+
self.jest_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::JEST, yes));
339+
self.vitest_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::VITEST, yes));
340+
self.jsx_a11y_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::JSX_A11Y, yes));
341+
self.nextjs_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::NEXTJS, yes));
342+
self.react_perf_plugin
343+
.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::REACT_PERF, yes));
344+
self.promise_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::PROMISE, yes));
345+
self.node_plugin.inspect(|yes| plugins.builtin.set(BuiltinLintPlugins::NODE, yes));
344346

345347
// Without this, jest plugins adapted to vitest will not be enabled.
346348
if self.vitest_plugin.is_enabled() && self.jest_plugin.is_not_set() {
347-
plugins.set(LintPlugins::JEST, true);
349+
plugins.builtin.set(BuiltinLintPlugins::JEST, true);
348350
}
349351
}
350352
}

apps/oxlint/src/lint.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use ignore::{gitignore::Gitignore, overrides::OverrideBuilder};
1313
use oxc_allocator::AllocatorPool;
1414
use oxc_diagnostics::{DiagnosticService, GraphicalReportHandler, OxcDiagnostic};
1515
use oxc_linter::{
16-
AllowWarnDeny, Config, ConfigStore, ConfigStoreBuilder, ExternalLinter, InvalidFilterKind,
17-
LintFilter, LintOptions, LintService, LintServiceOptions, Linter, Oxlintrc,
16+
AllowWarnDeny, Config, ConfigBuilderError, ConfigStore, ConfigStoreBuilder, ExternalLinter,
17+
InvalidFilterKind, LintFilter, LintOptions, LintService, LintServiceOptions, Linter, Oxlintrc,
1818
};
1919
use rustc_hash::{FxHashMap, FxHashSet};
2020
use serde_json::Value;
@@ -64,7 +64,7 @@ impl Runner for LintRunner {
6464
enable_plugins,
6565
misc_options,
6666
disable_nested_config,
67-
inline_config_options,
67+
ref inline_config_options,
6868
..
6969
} = self.options;
7070

@@ -203,11 +203,16 @@ impl Runner for LintRunner {
203203
match ConfigStoreBuilder::from_oxlintrc(false, oxlintrc, external_linter) {
204204
Ok(builder) => builder,
205205
Err(e) => {
206+
let err = if let ConfigBuilderError::OxcDiagnostic(e) = e {
207+
e
208+
} else {
209+
OxcDiagnostic::error(e.to_string())
210+
};
206211
print_and_flush_stdout(
207212
stdout,
208213
&format!(
209214
"Failed to parse configuration file.\n{}\n",
210-
render_report(&handler, &OxcDiagnostic::error(e.to_string()))
215+
render_report(&handler, &err)
211216
),
212217
);
213218
return CliRunResult::InvalidOptionConfig;
@@ -397,6 +402,7 @@ impl LintRunner {
397402
paths: &Vec<Arc<OsStr>>,
398403
external_linter: Option<&ExternalLinter>,
399404
) -> Result<FxHashMap<PathBuf, Config>, CliRunResult> {
405+
println!("LintRunner::get_nested_configs");
400406
// TODO(perf): benchmark whether or not it is worth it to store the configurations on a
401407
// per-file or per-directory basis, to avoid calling `.parent()` on every path.
402408
let mut nested_oxlintrc = FxHashMap::<&Path, Oxlintrc>::default();
@@ -430,11 +436,16 @@ impl LintRunner {
430436
{
431437
Ok(builder) => builder,
432438
Err(e) => {
439+
let err = if let ConfigBuilderError::OxcDiagnostic(e) = e {
440+
e
441+
} else {
442+
OxcDiagnostic::error(e.to_string())
443+
};
433444
print_and_flush_stdout(
434445
stdout,
435446
&format!(
436447
"Failed to parse configuration file.\n{}\n",
437-
render_report(handler, &OxcDiagnostic::error(e.to_string()))
448+
render_report(handler, &err)
438449
),
439450
);
440451

crates/oxc_linter/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ description.workspace = true
1515

1616
[features]
1717
default = []
18-
ruledocs = ["oxc_macros/ruledocs"] # Enables the `ruledocs` feature for conditional compilation
19-
language_server = ["oxc_data_structures/rope"] # For the Runtime to support needed information for the language server
18+
ruledocs = [
19+
"oxc_macros/ruledocs",
20+
] # Enables the `ruledocs` feature for conditional compilation
21+
language_server = [
22+
"oxc_data_structures/rope",
23+
] # For the Runtime to support needed information for the language server
2024

2125
[lints]
2226
workspace = true
@@ -48,6 +52,7 @@ constcat = { workspace = true }
4852
convert_case = { workspace = true }
4953
cow-utils = { workspace = true }
5054
fast-glob = { workspace = true }
55+
futures = { workspace = true }
5156
globset = { workspace = true }
5257
indexmap = { workspace = true, features = ["rayon"] }
5358
itertools = { workspace = true }
@@ -70,6 +75,7 @@ serde = { workspace = true, features = ["derive"] }
7075
serde_json = { workspace = true }
7176
simdutf8 = { workspace = true }
7277
smallvec = { workspace = true }
78+
tokio = { workspace = true }
7379
unicode-segmentation = { workspace = true }
7480

7581
[dev-dependencies]

0 commit comments

Comments
 (0)