Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/smooth-sites-sip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Improved the summary provided by `biome migrate eslint` to be clearer on why rules were not migrated. Biome now specifies a reason when a rule is not migrated, such as being incompatible with the formatter or not implemented yet. This helps users make more informed decisions when migrating their ESLint configurations to Biome.
277 changes: 162 additions & 115 deletions crates/biome_analyze/src/rule.rs

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions crates/biome_cli/src/execute/migrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ mod eslint_unicorn;
mod ignorefile;
mod node;
mod prettier;
mod unsupported_rules;

pub(crate) struct MigratePayload<'a> {
pub(crate) session: CliSession<'a>,
Expand Down
395 changes: 263 additions & 132 deletions crates/biome_cli/src/execute/migrate/eslint_to_biome.rs

Large diffs are not rendered by default.

368 changes: 368 additions & 0 deletions crates/biome_cli/src/execute/migrate/unsupported_rules.rs

Large diffs are not rendered by default.

31 changes: 31 additions & 0 deletions crates/biome_cli/tests/commands/migrate_eslint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -712,3 +712,34 @@ fn migrate_merge_with_overrides() {
result,
));
}

#[test]
fn migrate_rules_covered_by_formatter() {
let biomejson = r#"{ "linter": { "enabled": true } }"#;
let eslintrc = r#"{
"rules": {
"eol-last": "error",
"indent": ["error", 2],
},
}"#;

let fs = MemoryFileSystem::default();
fs.insert(Utf8Path::new("biome.json").into(), biomejson.as_bytes());
fs.insert(Utf8Path::new(".eslintrc").into(), eslintrc.as_bytes());

let mut console = BufferConsole::default();
let (fs, result) = run_cli(
fs,
&mut console,
Args::from(["migrate", "eslint"].as_slice()),
);

assert!(result.is_ok(), "run_cli returned {result:?}");
assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
"migrate_rules_covered_by_formatter",
fs,
console,
result,
));
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (6/6) of the rules can be migrated.
i 6 ESLint rules found
- 6 can be migrated to Biome's rules (run with --write to migrate)
- 100% (6) of your ESLint rules are fully covered by Biome
- 100% (6) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (6/6) of the rules can be migrated.
i 6 ESLint rules found
- 6 can be migrated to Biome's rules (run with --write to migrate)
- 100% (6) of your ESLint rules are fully covered by Biome
- 100% (6) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,17 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 0 can be migrated to Biome's rules (run with --write to migrate)
- +1 with --include-inspired
- 100% (1) of your ESLint rules are fully covered by Biome
- 0% (0) via direct migration to Biome rules


i Rules that can be migrated to an inspired rule using --include-inspired:

- no-else-return

i Rules that can be migrated to a nursery rule using --include-nursery:


```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (4/4) of the rules can be migrated.
i 4 ESLint rules found
- 4 can be migrated to Biome's rules (run with --write to migrate)
- 100% (4) of your ESLint rules are fully covered by Biome
- 100% (4) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,11 @@ expression: redactor(content)
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (6/6) of the rules have been migrated.
i 6 ESLint rules found
- 6 have been migrated to Biome's rules
- 100% (6) of your ESLint rules are fully covered by Biome
- 100% (6) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (6/6) of the rules can be migrated.
i 6 ESLint rules found
- 6 can be migrated to Biome's rules (run with --write to migrate)
- 100% (6) of your ESLint rules are fully covered by Biome
- 100% (6) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,11 @@ expression: redactor(content)
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (6/6) of the rules have been migrated.
i 6 ESLint rules found
- 6 have been migrated to Biome's rules
- 100% (6) of your ESLint rules are fully covered by Biome
- 100% (6) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,11 @@ biome.json migrate ━━━━━━━━━━━━━━━━━━━━
```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 100% (1/1) of the rules can be migrated.
i 1 ESLint rules found
- 1 can be migrated to Biome's rules (run with --write to migrate)
- 100% (1) of your ESLint rules are fully covered by Biome
- 100% (1) via direct migration to Biome rules



```
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
source: crates/biome_cli/tests/snap_test.rs
expression: redactor(content)
---
## `biome.json`

```json
{ "linter": { "enabled": true } }
```

## `.eslintrc`

```eslintrc
{
"rules": {
"eol-last": "error",
"indent": ["error", 2],
},
}
```

# Emitted Messages

```block
biome.json migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i Configuration file can be updated.

1 │ - {·"linter":·{·"enabled":·true·}·}
1 │ + {·"linter":·{·"enabled":·true,·"rules":·{·"recommended":·false·}·}·}
2 │ +


```

```block
migrate ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i 2 ESLint rules found
- 2 are obsolete because of Biome's formatter
- 0 can be migrated to Biome's rules (run with --write to migrate)
- 100% (2) of your ESLint rules are fully covered by Biome
- 0% (0) via direct migration to Biome rules


i Unsupported rules (0 incompatible with formatter, 1 made obsolete by the formatter, 1 covered by a formatter option, 0 not yet implemented, 0 unknown source):

i These rules enforce behavior completely covered by the formatter (so you don't lose the functionality):

- eol-last

i These rules are covered by formatter options, but they require manual migration:

- indent - Covered by Biome's indentWidth formatter option.


```

```block
configuration ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

i Migration results:

- biome.json: configuration needs migration.

i Use --write to apply the changes.

$ biome migrate --write


```