From 83d1b778ef577fae9d19e0b88c6095ef928d352c Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Sun, 5 Apr 2026 18:18:47 +0100 Subject: [PATCH 01/12] feat(linter): preset --- .changeset/huge-walls-float.md | 53 ++ crates/biome_analyze/src/lib.rs | 4 +- crates/biome_analyze/src/rule.rs | 32 + crates/biome_cli/tests/cases/mod.rs | 1 + crates/biome_cli/tests/cases/preset.rs | 585 ++++++++++++++++++ .../should_migrate_aws_config.snap | 2 +- .../should_migrate_nested_config.snap | 21 +- .../should_successfully_migrate_ariakit.snap | 2 +- .../should_successfully_migrate_knip.snap | 2 +- .../should_successfully_migrate_sentry.snap | 2 +- .../group_preset_all_with_rule_off.snap | 32 + ...roup_preset_none_disables_group_rules.snap | 31 + .../group_preset_none_with_rule_enabled.snap | 60 ++ ...reset_recommended_enables_group_rules.snap | 31 + ...sery_preset_all_does_not_enable_rules.snap | 35 ++ .../nursery_rule_enabled_individually.snap | 66 ++ ...set_all_does_not_enable_nursery_rules.snap | 76 +++ .../preset_all_enables_all_rules.snap | 104 ++++ .../preset_none_disables_all_rules.snap | 28 + ...mmended_does_not_enable_nursery_rules.snap | 56 ++ ...recommended_enables_recommended_rules.snap | 28 + ..._recommended_same_as_recommended_true.snap | 31 + ...ed_true_does_not_enable_nursery_rules.snap | 56 ++ .../creates_config_file.snap | 2 +- ...n_biome_installed_via_package_manager.snap | 2 +- .../creates_config_jsonc_file.snap | 2 +- .../enables_vcs_and_ignore_dist.snap | 2 +- ...shows_the_default_severity_of_rule_on.snap | 1 + .../incorrect_rule_name.snap | 2 + .../src/analyzer/assist/actions.rs | 22 +- .../src/analyzer/linter/mod.rs | 31 + .../src/analyzer/linter/rules.rs | 67 +- .../biome_configuration/src/analyzer/mod.rs | 12 +- .../src/analyzer/presets.rs | 107 ++++ crates/biome_configuration/src/lib.rs | 3 +- .../tests/invalid/preset.json | 8 + .../tests/invalid/preset.json.snap | 40 ++ .../src/group_struct.rs | 119 +++- crates/biome_migrate/src/analyzers.rs | 4 + .../src/analyzers/recommended.rs | 99 +++ crates/biome_service/src/settings.rs | 20 +- .../@biomejs/backend-jsonrpc/src/workspace.ts | 49 ++ .../@biomejs/biome/configuration_schema.json | 65 ++ xtask/codegen/src/generate_configuration.rs | 58 +- 44 files changed, 1954 insertions(+), 99 deletions(-) create mode 100644 .changeset/huge-walls-float.md create mode 100644 crates/biome_cli/tests/cases/preset.rs create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_all_with_rule_off.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_none_disables_group_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_none_with_rule_enabled.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_recommended_enables_group_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/nursery_preset_all_does_not_enable_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/nursery_rule_enabled_individually.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_all_does_not_enable_nursery_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_all_enables_all_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_none_disables_all_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_recommended_does_not_enable_nursery_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_recommended_enables_recommended_rules.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/preset_recommended_same_as_recommended_true.snap create mode 100644 crates/biome_cli/tests/snapshots/main_cases_preset/recommended_true_does_not_enable_nursery_rules.snap create mode 100644 crates/biome_configuration/src/analyzer/presets.rs create mode 100644 crates/biome_configuration/tests/invalid/preset.json create mode 100644 crates/biome_configuration/tests/invalid/preset.json.snap create mode 100644 crates/biome_migrate/src/analyzers/recommended.rs diff --git a/.changeset/huge-walls-float.md b/.changeset/huge-walls-float.md new file mode 100644 index 000000000000..9a8d73184fb3 --- /dev/null +++ b/.changeset/huge-walls-float.md @@ -0,0 +1,53 @@ +--- +"@biomejs/biome": minor +--- + +Added a new linter configuration called `preset`. With the new option, users can enable different kinds of rules at once. + +The following presets are available: +- `"recommended"`: it enables all Biome-recommended rules, or recommended rules of a group; +- `"all"`: it enables all Biome rules, or enables all rules of a group; +- `"none"`: it disables all Biome rules, or disable all rules of a group. + +You can enable recommended rules: + +```json +{ + "linter": { + "rules": { + "preset": "recommended" + } + } +} +``` + +You can enable **all rules** at once: + +```json5 +{ + "linter": { + "rules": { + "preset": "all" // enables all rules + } + } +} +``` + +Or enable all rules for a group: +```json5 +{ + "linter": { + "rules": { + "style": { + "preset": "all" // enables all rules in the style group + }, + } + } +} +``` + +This new option, however, doesn't affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature. + +This new option is meant to replace `recommended`, so make sure to run the `migrate` command. + + diff --git a/crates/biome_analyze/src/lib.rs b/crates/biome_analyze/src/lib.rs index 5b3576343a22..67eb9236543a 100644 --- a/crates/biome_analyze/src/lib.rs +++ b/crates/biome_analyze/src/lib.rs @@ -49,8 +49,8 @@ pub use crate::registry::{ }; pub use crate::rule::{ CategoryLanguage, FixKind, GroupCategory, GroupLanguage, Rule, RuleAction, RuleDiagnostic, - RuleDomain, RuleGroup, RuleMeta, RuleMetadata, RuleSource, RuleSourceKind, RuleSourceWithKind, - SuppressAction, + RuleDomain, RuleGroup, RuleMeta, RuleMetadata, RulePreset, RuleSource, RuleSourceKind, + RuleSourceWithKind, SuppressAction, }; pub use crate::services::{ ExtendedConfigurationProvider, FromServices, ServiceBag, ServicesDiagnostic, diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs index 32d60306ff10..8f0f361c00d0 100644 --- a/crates/biome_analyze/src/rule.rs +++ b/crates/biome_analyze/src/rule.rs @@ -48,6 +48,8 @@ pub struct RuleMetadata { /// Use this field to tag the rule as being worked, which means the rule is still far from being completed. /// Possible bugs should be reported in that issue. pub issue_number: Option<&'static str>, + /// A preset this rule belongs to. + pub rule_presets: &'static [RulePreset], } #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] @@ -814,6 +816,7 @@ impl RuleMetadata { severity: Severity::Information, domains: &[], issue_number: None, + rule_presets: &[], } } @@ -1760,3 +1763,32 @@ pub struct SuppressAction { pub message: MarkupBuf, pub mutation: BatchMutation, } + +#[cfg_attr( + feature = "serde", + derive( + serde::Serialize, + serde::Deserialize, + biome_deserialize_macros::Deserializable, + biome_deserialize_macros::Merge + ) +)] +#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +/// The set of rules that will be executed by the linter. +pub enum RulePreset { + /// A set of rules that are enabled by default. + Recommended, +} + +impl FromStr for RulePreset { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + match s { + "recommended" => Ok(Self::Recommended), + _ => Err("Invalid rule preset."), + } + } +} diff --git a/crates/biome_cli/tests/cases/mod.rs b/crates/biome_cli/tests/cases/mod.rs index d1728203c801..4c26bbb41665 100644 --- a/crates/biome_cli/tests/cases/mod.rs +++ b/crates/biome_cli/tests/cases/mod.rs @@ -31,6 +31,7 @@ mod overrides_formatter; mod overrides_linter; mod overrides_max_file_size; mod overrides_organize_imports; +mod preset; mod protected_files; mod regression_tests; mod reporter_checkstyle; diff --git a/crates/biome_cli/tests/cases/preset.rs b/crates/biome_cli/tests/cases/preset.rs new file mode 100644 index 000000000000..962817f331be --- /dev/null +++ b/crates/biome_cli/tests/cases/preset.rs @@ -0,0 +1,585 @@ +use crate::run_cli; +use crate::snap_test::{SnapshotPayload, assert_cli_snapshot, assert_file_contents}; +use biome_console::BufferConsole; +use biome_fs::MemoryFileSystem; +use bpaf::Args; +use camino::Utf8Path; + +const DEBUGGER_BEFORE: &str = "debugger;\n"; +const DEBUGGER_AFTER: &str = "\n"; + +// --- preset: "recommended" at the top-level rules --- + +#[test] +fn preset_recommended_enables_recommended_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "recommended" + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", "--write", "--unsafe", test.as_str()].as_slice()), + ); + + assert!(result.is_ok(), "run_cli returned {result:?}"); + // noDebugger is recommended → debugger statement should be removed + assert_file_contents(&fs, test, DEBUGGER_AFTER); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_recommended_enables_recommended_rules", + fs, + console, + result, + )); +} + +#[test] +fn preset_recommended_does_not_enable_nursery_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "recommended" + } + } +}"# + .as_bytes(), + ); + + // `continue` triggers nursery/noContinue if enabled + let test = Utf8Path::new("test.js"); + fs.insert( + test.into(), + r#"for (let i = 0; i < 10; i++) { + if (i === 5) { + continue; + } +} +"# + .as_bytes(), + ); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // No nursery errors → should pass cleanly + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_recommended_does_not_enable_nursery_rules", + fs, + console, + result, + )); +} + +#[test] +fn preset_none_disables_all_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "none" + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset: "none" disables everything → no lint errors + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_none_disables_all_rules", + fs, + console, + result, + )); +} + +#[test] +fn preset_all_enables_all_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "all" + } + } +}"# + .as_bytes(), + ); + + // noNegationElse is a non-recommended rule in style. + // It should only trigger when "all" rules are enabled. + let test = Utf8Path::new("test.js"); + fs.insert( + test.into(), + b"if (!cond) { f(); } else { g(); }\n", + ); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset: "all" enables all rules including non-recommended → errors expected + assert!(result.is_err(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_all_enables_all_rules", + fs, + console, + result, + )); +} + +#[test] +fn preset_all_does_not_enable_nursery_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "all" + } + } +}"# + .as_bytes(), + ); + + // noContinue is a nursery rule — should NOT be triggered by top-level preset: "all" + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), NURSERY_CONTINUE_CODE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset: "all" at top level should not enable nursery rules + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_all_does_not_enable_nursery_rules", + fs, + console, + result, + )); +} + +// --- preset at the group level --- + +#[test] +fn group_preset_recommended_enables_group_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "recommended": false, + "suspicious": { + "preset": "recommended" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", "--write", "--unsafe", test.as_str()].as_slice()), + ); + + assert!(result.is_ok(), "run_cli returned {result:?}"); + // Only suspicious recommended rules should fire → noDebugger removes debugger + assert_file_contents(&fs, test, DEBUGGER_AFTER); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "group_preset_recommended_enables_group_rules", + fs, + console, + result, + )); +} + +#[test] +fn group_preset_none_disables_group_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "recommended": true, + "suspicious": { + "preset": "none" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // suspicious preset is "none" → noDebugger should NOT fire, debugger stays + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "group_preset_none_disables_group_rules", + fs, + console, + result, + )); +} + +// --- preset with individual rule overrides --- + +#[test] +fn group_preset_none_with_rule_enabled() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "recommended": false, + "suspicious": { + "preset": "none", + "noDebugger": "error" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset is "none" but noDebugger is explicitly enabled → should see diagnostic + assert!(result.is_err(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "group_preset_none_with_rule_enabled", + fs, + console, + result, + )); +} + +#[test] +fn group_preset_all_with_rule_off() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "recommended": false, + "suspicious": { + "preset": "all", + "noDebugger": "off" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset is "all" but noDebugger is explicitly off → no diagnostic for noDebugger + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "group_preset_all_with_rule_off", + fs, + console, + result, + )); +} + +// --- preset and recommended interaction --- + +#[test] +fn preset_recommended_same_as_recommended_true() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + // Use preset: "recommended" (equivalent to recommended: true) + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "preset": "recommended", + "suspicious": { + "noDebugger": "off" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), DEBUGGER_BEFORE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // preset is recommended but noDebugger is explicitly off → no error + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "preset_recommended_same_as_recommended_true", + fs, + console, + result, + )); +} + +// --- nursery rules and presets --- + +const NURSERY_CONTINUE_CODE: &str = r#"for (let i = 0; i < 10; i++) { + if (i >= 5) { + continue; + } + console.log(i); +} +"#; + +#[test] +fn nursery_preset_all_does_not_enable_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "nursery": { + "preset": "all" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), NURSERY_CONTINUE_CODE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // nursery preset "all" should NOT enable rules — nursery rules must be enabled individually + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "nursery_preset_all_does_not_enable_rules", + fs, + console, + result, + )); +} + +#[test] +fn nursery_rule_enabled_individually() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "nursery": { + "noContinue": "error" + } + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert(test.into(), NURSERY_CONTINUE_CODE.as_bytes()); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // noContinue explicitly enabled → should see diagnostic + assert!(result.is_err(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "nursery_rule_enabled_individually", + fs, + console, + result, + )); +} + +// --- nursery is never enabled by preset: "recommended" at top level --- + +#[test] +fn recommended_true_does_not_enable_nursery_rules() { + let mut console = BufferConsole::default(); + let fs = MemoryFileSystem::default(); + + let config = Utf8Path::new("biome.json"); + fs.insert( + config.into(), + r#"{ + "linter": { + "rules": { + "recommended": true + } + } +}"# + .as_bytes(), + ); + + let test = Utf8Path::new("test.js"); + fs.insert( + test.into(), + r#"for (let i = 0; i < 10; i++) { + if (i === 5) { + continue; + } +} +"# + .as_bytes(), + ); + + let (fs, result) = run_cli( + fs, + &mut console, + Args::from(["lint", test.as_str()].as_slice()), + ); + + // recommended: true should NOT enable nursery rules + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "recommended_true_does_not_enable_nursery_rules", + fs, + console, + result, + )); +} diff --git a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_aws_config.snap b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_aws_config.snap index d38f5a6da356..2ae1e3acf915 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_aws_config.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_aws_config.snap @@ -19,7 +19,7 @@ expression: redactor(content) }, "linter": { "rules": { - "recommended": true, + "preset": "recommended", "complexity": { "noForEach": "off" }, diff --git a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_nested_config.snap b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_nested_config.snap index 3061236deef8..eab7fb869434 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_nested_config.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_migrate_nested_config.snap @@ -27,13 +27,21 @@ expression: redactor(content) i Configuration file can be updated. - 1 │ {·"root":·false,"linter":·{·"rules":·{·"recommended":·true·}·}·} - │ ++++++++++++++ + - {·"linter":·{·"rules":·{·"recommended":·true·}·}·} + + {·"root":·false,"linter":·{·"rules":·{·"preset"·:"none"·}·}·} + ``` ```block -Your configuration file is up to date. +/should_migrate_nested_config/biome.json migrate ━━━━━━━━━━━━━━━━━━━━ + + i Configuration file can be updated. + + - {·"linter":·{·"rules":·{·"recommended":·true·}·}·} + + {·"linter":·{·"rules":·{·"preset"·:"none"·}·}·} + + ``` ```block @@ -41,8 +49,9 @@ Your configuration file is up to date. i Configuration file can be updated. - 1 │ {·"root":·false,"linter":·{·"rules":·{·"recommended":·true·}·}·} - │ ++++++++++++++ + - {·"linter":·{·"rules":·{·"recommended":·true·}·}·} + + {·"root":·false,"linter":·{·"rules":·{·"preset"·:"none"·}·}·} + ``` @@ -52,7 +61,7 @@ configuration ━━━━━━━━━━━━━━━━━━━━━━ i Migration results: - /should_migrate_nested_config/bar/biome.json: configuration needs migration. - - /should_migrate_nested_config/biome.json: no migration needed. + - /should_migrate_nested_config/biome.json: configuration needs migration. - /should_migrate_nested_config/foo/biome.json: configuration needs migration. i Use --write to apply the changes. diff --git a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_ariakit.snap b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_ariakit.snap index fb713f4b976b..6afbb5fa2b7d 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_ariakit.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_ariakit.snap @@ -30,7 +30,7 @@ expression: redactor(content) "linter": { "enabled": true, "rules": { - "recommended": true, + "preset": "recommended", "security": { "noDangerouslySetInnerHtml": "off" }, diff --git a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_knip.snap b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_knip.snap index ee63540adb99..9d8c80e3bead 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_knip.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_knip.snap @@ -22,7 +22,7 @@ expression: redactor(content) "linter": { "enabled": true, "rules": { - "recommended": true, + "preset": "recommended", "correctness": { "noUnusedVariables": "error", "noUnusedImports": "error" diff --git a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_sentry.snap b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_sentry.snap index 4330abd2e7ea..f045f4304519 100644 --- a/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_sentry.snap +++ b/crates/biome_cli/tests/snapshots/main_cases_migrate_v2/should_successfully_migrate_sentry.snap @@ -18,7 +18,7 @@ expression: redactor(content) "linter": { "enabled": true, "rules": { - "recommended": false, + "preset": "none", "a11y": {}, "correctness": { "noGlobalObjectCalls": "error", diff --git a/crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_all_with_rule_off.snap b/crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_all_with_rule_off.snap new file mode 100644 index 000000000000..6b597334a949 --- /dev/null +++ b/crates/biome_cli/tests/snapshots/main_cases_preset/group_preset_all_with_rule_off.snap @@ -0,0 +1,32 @@ +--- +source: crates/biome_cli/tests/snap_test.rs +expression: redactor(content) +--- +## `biome.json` + +```json +{ + "linter": { + "rules": { + "recommended": false, + "suspicious": { + "preset": "all", + "noDebugger": "off" + } + } + } +} +``` + +## `test.js` + +```js +debugger; + +``` + +# Emitted Messages + +```block +Checked 1 file in