From 1a3f37713e14721aa7fd1192b9c291a98011143e Mon Sep 17 00:00:00 2001 From: unvalley Date: Sat, 23 Aug 2025 18:03:41 +0900 Subject: [PATCH 1/6] fix(lint/useReadonlyClassProperties): skip rule for JavaScript files The useReadonlyClassProperties rule was attempting to add TypeScript-only `readonly` modifiers to JavaScript files, which would result in syntax errors. This change adds a check to ensure the rule only runs on TypeScript files, consistent with other TypeScript-only rules in the codebase. --- .../src/lint/style/use_readonly_class_properties.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs index 86ee5c45ab75..b4e467ff9ce0 100644 --- a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs +++ b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs @@ -10,8 +10,8 @@ use biome_js_syntax::{ JsArrowFunctionExpression, JsAssignmentExpression, JsAwaitExpression, JsBlockStatement, JsCallArgumentList, JsCallArguments, JsCallExpression, JsClassDeclaration, JsClassMemberList, JsConditionalExpression, JsConstructorClassMember, JsElseClause, JsExpressionStatement, - JsFunctionBody, JsFunctionExpression, JsGetterClassMember, JsGetterObjectMember, JsIfStatement, - JsInitializerClause, JsLanguage, JsMethodClassMember, JsMethodObjectMember, + JsFileSource, JsFunctionBody, JsFunctionExpression, JsGetterClassMember, JsGetterObjectMember, + JsIfStatement, JsInitializerClause, JsLanguage, JsMethodClassMember, JsMethodObjectMember, JsObjectAssignmentPattern, JsObjectExpression, JsObjectMemberList, JsParenthesizedExpression, JsPostUpdateExpression, JsPreUpdateExpression, JsPropertyClassMember, JsReturnStatement, JsSetterClassMember, JsSetterObjectMember, JsStatementList, JsStaticMemberAssignment, @@ -139,6 +139,12 @@ impl Rule for UseReadonlyClassProperties { type Options = UseReadonlyClassPropertiesOptions; fn run(ctx: &RuleContext) -> Self::Signals { + // Only run this rule on TypeScript files since `readonly` is a TypeScript feature + let source_type = ctx.source_type::().language(); + if !source_type.is_typescript() { + return Box::new([]); + } + let root = ctx.query(); let members = root.members(); let private_only = !ctx.options().check_all_properties; From ea19359dbc15d9d81559f871ddc3d7388a32c105 Mon Sep 17 00:00:00 2001 From: unvalley Date: Sat, 23 Aug 2025 18:21:15 +0900 Subject: [PATCH 2/6] fix: useReadonlyClassProperties should report ts only --- .../lint/style/use_readonly_class_properties.rs | 1 - .../style/useReadonlyClassProperties/valid.js | 7 +++++++ .../useReadonlyClassProperties/valid.js.snap | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js create mode 100644 crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js.snap diff --git a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs index b4e467ff9ce0..908d6ed4f00c 100644 --- a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs +++ b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs @@ -139,7 +139,6 @@ impl Rule for UseReadonlyClassProperties { type Options = UseReadonlyClassPropertiesOptions; fn run(ctx: &RuleContext) -> Self::Signals { - // Only run this rule on TypeScript files since `readonly` is a TypeScript feature let source_type = ctx.source_type::().language(); if !source_type.is_typescript() { return Box::new([]); diff --git a/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js b/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js new file mode 100644 index 000000000000..b6fc027f1f69 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js @@ -0,0 +1,7 @@ +// should not generate diagnostics + +// should skip because of JavaScript +class MyClass { + foo = 34; + #bar = 33; +} diff --git a/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js.snap b/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js.snap new file mode 100644 index 000000000000..533337cec364 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/style/useReadonlyClassProperties/valid.js.snap @@ -0,0 +1,15 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +expression: valid.js +--- +# Input +```js +// should not generate diagnostics + +// should skip because of JavaScript +class MyClass { + foo = 34; + #bar = 33; +} + +``` From 46af4b79adb197aa8153e1cb0a1aeeb21f08860e Mon Sep 17 00:00:00 2001 From: unvalley Date: Sat, 23 Aug 2025 18:23:47 +0900 Subject: [PATCH 3/6] chore: changeset --- .changeset/grumpy-monkeys-tap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/grumpy-monkeys-tap.md diff --git a/.changeset/grumpy-monkeys-tap.md b/.changeset/grumpy-monkeys-tap.md new file mode 100644 index 000000000000..061161d84a44 --- /dev/null +++ b/.changeset/grumpy-monkeys-tap.md @@ -0,0 +1,5 @@ +--- +"@biomejs/biome": patch +--- + +Fixed [#7301](https://github.com/biomejs/biome/issues/7301): [`useReadonlyClassPropertes`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now correctly skips JavaScript files. \ No newline at end of file From a59573351c10e07426358d3e55d9159bbc6314aa Mon Sep 17 00:00:00 2001 From: unvalley Date: Sat, 23 Aug 2025 18:27:29 +0900 Subject: [PATCH 4/6] chore: lint --- .changeset/grumpy-monkeys-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/grumpy-monkeys-tap.md b/.changeset/grumpy-monkeys-tap.md index 061161d84a44..c87d1155c432 100644 --- a/.changeset/grumpy-monkeys-tap.md +++ b/.changeset/grumpy-monkeys-tap.md @@ -2,4 +2,4 @@ "@biomejs/biome": patch --- -Fixed [#7301](https://github.com/biomejs/biome/issues/7301): [`useReadonlyClassPropertes`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now correctly skips JavaScript files. \ No newline at end of file +Fixed [#7301](https://github.com/biomejs/biome/issues/7301): [`useReadonlyClassPropertes`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now correctly skips JavaScript files. From 9f1c84b5caa5cfb56e9a2f9b9edda5d79fbb1056 Mon Sep 17 00:00:00 2001 From: unvalley Date: Sat, 23 Aug 2025 18:36:05 +0900 Subject: [PATCH 5/6] chore: typo --- .changeset/grumpy-monkeys-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/grumpy-monkeys-tap.md b/.changeset/grumpy-monkeys-tap.md index c87d1155c432..dd2a3fbf444b 100644 --- a/.changeset/grumpy-monkeys-tap.md +++ b/.changeset/grumpy-monkeys-tap.md @@ -2,4 +2,4 @@ "@biomejs/biome": patch --- -Fixed [#7301](https://github.com/biomejs/biome/issues/7301): [`useReadonlyClassPropertes`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now correctly skips JavaScript files. +Fixed [#7301](https://github.com/biomejs/biome/issues/7301): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now correctly skips JavaScript files. From 72a82b7f8bdfc34cab8ce8462e180e5aebbbc811 Mon Sep 17 00:00:00 2001 From: unvalley Date: Sun, 24 Aug 2025 01:36:37 +0900 Subject: [PATCH 6/6] refactor: use Box::default --- .../src/lint/style/use_readonly_class_properties.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs index 908d6ed4f00c..34f26bc557de 100644 --- a/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs +++ b/crates/biome_js_analyze/src/lint/style/use_readonly_class_properties.rs @@ -141,7 +141,7 @@ impl Rule for UseReadonlyClassProperties { fn run(ctx: &RuleContext) -> Self::Signals { let source_type = ctx.source_type::().language(); if !source_type.is_typescript() { - return Box::new([]); + return Box::default(); } let root = ctx.query();