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
167 changes: 139 additions & 28 deletions crates/oxc_linter/src/rules/typescript/prefer_as_const.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ fn test() {
"let foo = { bar: 1 as const };",
"let foo = { bar: 'baz' };",
"let foo = { bar: 2 };",
// "let foo = <bar>'bar';",
// "let foo = <string>'bar';",
"let foo = 'bar' as string;",
"let foo = `bar` as `bar`;",
"let foo = `bar` as `foo`;",
Expand All @@ -171,43 +173,152 @@ fn test() {
"let foo: 'bar';",
"let foo = { bar };",
"let foo: 'baz' = 'baz' as const;",
"class foo { bar = 'baz'; }",
"class foo { bar: 'baz'; }",
"class foo { bar; }",
"class foo { bar: string = 'baz'; }",
"class foo { bar: number = 1; }",
"class foo { bar = 'baz' as const; }",
"class foo { bar = 2 as const; }",
"class foo { get bar(): 'bar' {} set bar(bar: 'bar') {} }",
"class foo { bar = () => 'bar' as const; }",
"type BazFunction = () => 'baz'; class foo { bar: BazFunction = () => 'bar'; }",
"class foo { bar(): void {} }",
// NOTE: OXC does not parse these format yet.
// "let foo = <bar>'bar';",
// "let foo = <string>'bar';",
// "class foo { bar = <baz>'baz'; }",
"
class foo {
bar = 'baz';
}
",
"
class foo {
bar: 'baz';
}
",
"
class foo {
bar;
}
",
// "
// class foo {
// bar = <baz>'baz';
// }
// ",
"
class foo {
bar: string = 'baz';
}
",
"
class foo {
bar: number = 1;
}
",
"
class foo {
bar = 'baz' as const;
}
",
"
class foo {
bar = 2 as const;
}
",
"
class foo {
get bar(): 'bar' {}
set bar(bar: 'bar') {}
}
",
"
class foo {
bar = () => 'bar' as const;
}
",
"
type BazFunction = () => 'baz';
class foo {
bar: BazFunction = () => 'bar';
}
",
"
class foo {
bar(): void {}
}
",
];

let fail = vec![
"let foo = { bar: 'baz' as 'baz' };",
"let foo = { bar: 1 as 1 };",
"let []: 'bar' = 'bar';",
"let foo: 'bar' = 'bar';",
"let foo: 2 = 2;",
"class foo { bar: 'baz' = 'baz';}",
"class foo { bar: 2 = 2;}",
"let foo: 'bar' = 'bar' as 'bar';",
"let foo = <'bar'>'bar';",
"let foo = <4>4;",
"let foo = 'bar' as 'bar';",
"let foo = 5 as 5;",
"
class foo {
bar: 'baz' = 'baz';
}
",
"
class foo {
bar: 2 = 2;
}
",
"
class foo {
foo = <'bar'>'bar';
}
",
"
class foo {
foo = 'bar' as 'bar';
}
",
"
class foo {
foo = 5 as 5;
}
",
];

let fix = vec![
("let foo = { bar: 'baz' as 'baz' };", "let foo = { bar: 'baz' as const };", None),
("let foo = { bar: 1 as 1 };", "let foo = { bar: 1 as const };", None),
("let foo: 'bar' = 'bar' as 'bar';", "let foo: 'bar' = 'bar' as const;", None),
("let foo = 'bar' as 'bar';", "let foo = 'bar' as const;", None),
("let foo = 5 as 5;", "let foo = 5 as const;", None),
("class foo { foo = 'bar' as 'bar'; }", "class foo { foo = 'bar' as const; }", None),
("class foo { foo = 5 as 5; }", "class foo { foo = 5 as const; }", None),
// NOTE: OXC does not parse these format yet.
// ("let foo = <4>4;", "let foo = <const>4;", None),
// ("let foo = <'bar'>'bar';", "let foo = <const>'bar';", None),
// ("class foo { foo = <'bar'>'bar'; }", "class foo { foo = <const>'bar'; }", None),
("let foo = { bar: 'baz' as 'baz' };", "let foo = { bar: 'baz' as const };"),
("let foo = { bar: 1 as 1 };", "let foo = { bar: 1 as const };"),
("let foo: 'bar' = 'bar' as 'bar';", "let foo: 'bar' = 'bar' as const;"),
// ("let foo = <'bar'>'bar';", "let foo = <const>'bar';"),
// ("let foo = <4>4;", "let foo = <const>4;"),
("let foo = 'bar' as 'bar';", "let foo = 'bar' as const;"),
("let foo = 5 as 5;", "let foo = 5 as const;"),
// (
// "
// class foo {
// foo = <'bar'>'bar';
// }
// ",
// "
// class foo {
// foo = <const>'bar';
// }
// ",
// ),
(
"
class foo {
foo = 'bar' as 'bar';
}
",
"
class foo {
foo = 'bar' as const;
}
",
),
(
"
class foo {
foo = 5 as 5;
}
",
"
class foo {
foo = 5 as const;
}
",
),
];

Tester::new(PreferAsConst::NAME, PreferAsConst::PLUGIN, pass, fail)
Expand Down
89 changes: 83 additions & 6 deletions crates/oxc_linter/src/snapshots/typescript_prefer_as_const.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@
source: crates/oxc_linter/src/tester.rs
---

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:27]
1 │ let foo = { bar: 'baz' as 'baz' };
· ─────
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:23]
1 │ let foo = { bar: 1 as 1 };
· ─
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:9]
1 │ let []: 'bar' = 'bar';
Expand All @@ -24,15 +38,78 @@ source: crates/oxc_linter/src/tester.rs
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:18]
1 │ class foo { bar: 'baz' = 'baz';}
· ─────
╭─[prefer_as_const.tsx:1:27]
1 │ let foo: 'bar' = 'bar' as 'bar';
· ─────
╰────
help: You should use `as const` instead of type annotation.

× Unexpected token
╭─[prefer_as_const.tsx:1:12]
1 │ let foo = <'bar'>'bar';
· ─────
╰────

× Unexpected token
╭─[prefer_as_const.tsx:1:12]
1 │ let foo = <4>4;
· ─
╰────

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:20]
1 │ let foo = 'bar' as 'bar';
· ─────
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:16]
1 │ let foo = 5 as 5;
· ─
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:3:20]
2 │ class foo {
3 │ bar: 'baz' = 'baz';
· ─────
4 │ }
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:3:20]
2 │ class foo {
3 │ bar: 2 = 2;
· ─
4 │ }
╰────
help: You should use `as const` instead of type annotation.

× Unexpected token
╭─[prefer_as_const.tsx:3:22]
2 │ class foo {
3 │ foo = <'bar'>'bar';
· ─────
4 │ }
╰────

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:3:30]
2 │ class foo {
3 │ foo = 'bar' as 'bar';
· ─────
4 │ }
╰────
help: You should use `as const` instead of type annotation.

⚠ typescript-eslint(prefer-as-const): Expected a `const` assertion instead of a literal type annotation.
╭─[prefer_as_const.tsx:1:18]
1 │ class foo { bar: 2 = 2;}
· ─
╭─[prefer_as_const.tsx:3:26]
2 │ class foo {
3 │ foo = 5 as 5;
· ─
4 │ }
╰────
help: You should use `as const` instead of type annotation.
Loading