diff --git a/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs b/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs index 94bcdcc780514..f760dd17f7b7b 100644 --- a/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs +++ b/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs @@ -160,6 +160,8 @@ fn test() { "let foo = { bar: 1 as const };", "let foo = { bar: 'baz' };", "let foo = { bar: 2 };", + // "let foo = 'bar';", + // "let foo = 'bar';", "let foo = 'bar' as string;", "let foo = `bar` as `bar`;", "let foo = `bar` as `foo`;", @@ -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';", - // "let foo = 'bar';", - // "class foo { bar = 'baz'; }", + " + class foo { + bar = 'baz'; + } + ", + " + class foo { + bar: 'baz'; + } + ", + " + class foo { + bar; + } + ", + // " + // class foo { + // bar = '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 = 4;", None), - // ("let foo = <'bar'>'bar';", "let foo = 'bar';", None), - // ("class foo { foo = <'bar'>'bar'; }", "class foo { foo = '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 = 'bar';"), + // ("let foo = <4>4;", "let foo = 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 = '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) diff --git a/crates/oxc_linter/src/snapshots/typescript_prefer_as_const.snap b/crates/oxc_linter/src/snapshots/typescript_prefer_as_const.snap index b3f2ad76cd0f2..b39cfc838b350 100644 --- a/crates/oxc_linter/src/snapshots/typescript_prefer_as_const.snap +++ b/crates/oxc_linter/src/snapshots/typescript_prefer_as_const.snap @@ -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'; @@ -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.