Skip to content

fix(noShadow): make sure it doesn't shadow types#10083

Merged
ematipico merged 7 commits into
mainfrom
fix/now-shadow-type
Apr 24, 2026
Merged

fix(noShadow): make sure it doesn't shadow types#10083
ematipico merged 7 commits into
mainfrom
fix/now-shadow-type

Conversation

@ematipico
Copy link
Copy Markdown
Member

@ematipico ematipico commented Apr 22, 2026

Summary

Closes #9482
Closes #7812

Implemented with a coding Agent.

Both changes require a patch and the change in behaviour should be fine since the rule is still in nursery.

Test Plan

Added new tests, and updated the existing ones.

Docs

Updated to account the new options

@ematipico ematipico requested review from a team April 22, 2026 08:24
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 22, 2026

🦋 Changeset detected

Latest commit: 400e60a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@biomejs/biome Patch
@biomejs/cli-win32-x64 Patch
@biomejs/cli-win32-arm64 Patch
@biomejs/cli-darwin-x64 Patch
@biomejs/cli-darwin-arm64 Patch
@biomejs/cli-linux-x64 Patch
@biomejs/cli-linux-arm64 Patch
@biomejs/cli-linux-x64-musl Patch
@biomejs/cli-linux-arm64-musl Patch
@biomejs/wasm-web Patch
@biomejs/wasm-bundler Patch
@biomejs/wasm-nodejs Patch
@biomejs/backend-jsonrpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added A-Linter Area: linter L-JavaScript Language: JavaScript and super languages labels Apr 22, 2026
@ematipico ematipico marked this pull request as draft April 22, 2026 08:25
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds two boolean options to the nursery noShadow rule—ignoreTypeValueShadow and ignoreFunctionTypeParameterNameValueShadow (both default true)—and propagates them through the lint implementation, rule option type, ESLint deserialization/migration, and tests. Shadow detection now conditionally suppresses reports when the conflict is between type-only and value namespaces or when the inner binding is a parameter inside a function-type/signature. Refactors overload parameter-parent lookup into a shared helper. Adds/updates multiple test fixtures and ESLint→Biome migration specs.

Possibly related PRs

  • test: infra for custom rule migrators #9836 — Overlapping changes to the ESLint→Biome migration and migration test infrastructure that touch migrator code and specs relevant to adding @typescript-eslint/no-shadow.

Suggested reviewers

  • dyc3
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix(noShadow): make sure it doesn't shadow types' directly addresses the main change—adding options to prevent the noShadow rule from treating type-only names as shadowing.
Description check ✅ Passed The PR description references the related issues (#9482 and #7812) and outlines the key changes: new options for noShadow, tests added/updated, and documentation updates.
Linked Issues check ✅ Passed The PR implements both issues [#9482, #7812]: adding ignoreFunctionTypeParameterNameValueShadow and ignoreTypeValueShadow options, introducing tests for function-type and type-value shadowing scenarios, and supporting ESLint migration.
Out of Scope Changes check ✅ Passed All changes are within scope: noShadow rule enhancements, new test cases, ESLint migration logic, and option definitions directly support the linked issue requirements.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/now-shadow-type

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-func-type-param.ts (1)

18-24: Optional: Consider adding a setter signature test case.

The implementation handles TsSetterSignatureTypeMember, but there's no explicit test for it. Not critical, but could be a nice addition for completeness.

🧪 Suggested test case
 interface Handler {
     handle(data: string): void;
     (data: number): boolean;
     new (data: object): Handler;
+    set value(data: string);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-func-type-param.ts`
around lines 18 - 24, Add a test case that exercises TsSetterSignatureTypeMember
by including a setter signature in the specimen file (either extend the existing
interface Handler with a setter or add a new interface like HandlerWithSetter) —
e.g. include a line declaring a setter signature (set <name>(value: <type>):
void) so the parser sees TsSetterSignatureTypeMember and the test covers setter
handling alongside the existing handle, call and construct signatures.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-func-type-param.ts`:
- Around line 18-24: Add a test case that exercises TsSetterSignatureTypeMember
by including a setter signature in the specimen file (either extend the existing
interface Handler with a setter or add a new interface like HandlerWithSetter) —
e.g. include a line declaring a setter signature (set <name>(value: <type>):
void) so the parser sees TsSetterSignatureTypeMember and the test covers setter
handling alongside the existing handle, call and construct signatures.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 77efa690-ddc5-417b-9907-be1059f8ffc1

📥 Commits

Reviewing files that changed from the base of the PR and between bc05a24 and 73ce37f.

⛔ Files ignored due to path filters (5)
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/invalid-06.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/invalid-07.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-05.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-06.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-func-type-param.ts.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (5)
  • .changeset/tasty-experts-fail.md
  • crates/biome_js_analyze/src/lint/nursery/no_shadow.rs
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-05.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-06.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-func-type-param.ts

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 22, 2026

Merging this PR will not alter performance

✅ 58 untouched benchmarks
⏩ 196 skipped benchmarks1


Comparing fix/now-shadow-type (400e60a) with main (f74b63a)

Open in CodSpeed

Footnotes

  1. 196 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@github-actions github-actions Bot added the A-CLI Area: CLI label Apr 22, 2026
@ematipico ematipico marked this pull request as ready for review April 22, 2026 09:39
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_cli/src/execute/migrate/eslint_to_biome.rs`:
- Around line 802-822: The TypeScriptNoShadow handler configures rules.nursery
when opts.include_nursery is true but never records the migration in results;
update the eslint_eslint::Rule::TypeScriptNoShadow branch so that after
inserting or updating group.no_shadow (inside the if let
SeverityOrGroup::Group(group) { ... } block) you call results.add(&name,
RuleMigrationResult::Migrated) to track the migrated rule, ensuring the results
tally matches other handlers that call migrate_eslint_any_rule.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 31cab987-4567-4718-896c-e742cced7113

📥 Commits

Reviewing files that changed from the base of the PR and between 73ce37f and d61f6e4.

⛔ Files ignored due to path filters (31)
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/severity_only.jsonc.snap is excluded by !**/*.snap and included by **
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/with_options.jsonc.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/noLabelWithoutControl/all/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/noLabelWithoutControl/inputComponents/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/noLabelWithoutControl/labelAttributes/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/noLabelWithoutControl/labelComponents/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/useButtonType/valid/withBinding.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/complexity/noUselessStringConcat/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/useExhaustiveDependencies/issue9744.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noDrizzleDeleteWithoutWhere/valid/delete.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noDrizzleUpdateWithoutWhere/valid/update.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/20_invalid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreFuncTypeParam/invalid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreTypeValueShadow/invalid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/invalid-05.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-07.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-type-value-shadow.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noUnnecessaryTemplateExpression/invalid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noUselessTypeConversion/valid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useDomNodeTextContent/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useNullishCoalescing/ignoreTernaryTestsEnabled.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useNullishCoalescing/ternaryCommentTrivia.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReduceTypeParameter/valid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useUnicodeRegex/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useVarsOnTop/invalid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useVarsOnTop/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/performance/noDelete/valid.jsonc.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/source/organizeImports/unorganized-bare-export-specifiers.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/style/noNegationElse/issue9629.js.snap is excluded by !**/*.snap and included by **
  • packages/@biomejs/backend-jsonrpc/src/workspace.ts is excluded by !**/backend-jsonrpc/src/workspace.ts and included by **
  • packages/@biomejs/biome/configuration_schema.json is excluded by !**/configuration_schema.json and included by **
📒 Files selected for processing (15)
  • .changeset/tasty-experts-fail.md
  • crates/biome_cli/src/execute/migrate/eslint_eslint.rs
  • crates/biome_cli/src/execute/migrate/eslint_to_biome.rs
  • crates/biome_cli/src/execute/migrate/eslint_typescript.rs
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/severity_only.jsonc
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/with_options.jsonc
  • crates/biome_js_analyze/src/lint/nursery/no_shadow.rs
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreFuncTypeParam/invalid.options.json
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreFuncTypeParam/invalid.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreTypeValueShadow/invalid.options.json
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreTypeValueShadow/invalid.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/invalid-05.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-07.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-type-value-shadow.ts
  • crates/biome_rule_options/src/no_shadow.rs
💤 Files with no reviewable changes (1)
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/invalid-05.ts
✅ Files skipped from review due to trivial changes (9)
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreTypeValueShadow/invalid.options.json
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/severity_only.jsonc
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/typescript-eslint/valid-07.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreFuncTypeParam/invalid.options.json
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreFuncTypeParam/invalid.ts
  • crates/biome_cli/tests/specs/migrate_eslint/typescriptNoShadow/with_options.jsonc
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/valid-type-value-shadow.ts
  • crates/biome_js_analyze/tests/specs/nursery/noShadow/invalidNoIgnoreTypeValueShadow/invalid.ts
  • .changeset/tasty-experts-fail.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/biome_js_analyze/src/lint/nursery/no_shadow.rs

Comment thread crates/biome_cli/src/execute/migrate/eslint_to_biome.rs
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
crates/biome_cli/src/execute/migrate/eslint_to_biome.rs (1)

802-821: ⚠️ Potential issue | 🟠 Major

Record the migrated result here as well.

When opts.include_nursery is true, this branch updates rules.nursery.no_shadow but never records the rule as migrated. The config lands fine; the CLI summary just forgets to count it. Tiny omission, surprisingly loud downstream.

🐛 Proposed fix
         eslint_eslint::Rule::TypeScriptNoShadow(conf) => {
             if !opts.include_nursery {
                 results.add(&name, RuleMigrationResult::Nursery);
             } else {
                 let group = rules.nursery.get_or_insert_with(Default::default);
                 if let SeverityOrGroup::Group(group) = group {
                     if let eslint_eslint::RuleConf::Option(severity, rule_options) = conf {
                         group.no_shadow = Some(biome_config::RuleConfiguration::WithOptions(
                             biome_config::RuleWithOptions {
                                 level: severity.into(),
                                 options: rule_options.into(),
                             },
                         ));
                     } else {
                         let rule = group.no_shadow.get_or_insert(Default::default());
                         rule.set_level(rule.level().max(conf.severity().into()));
                     }
+                    results.add(&name, RuleMigrationResult::Migrated);
                 }
             }
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_cli/src/execute/migrate/eslint_to_biome.rs` around lines 802 -
821, In the eslint_eslint::Rule::TypeScriptNoShadow(conf) match arm, when
opts.include_nursery is true you update rules.nursery.no_shadow but never record
the migration; add a call to results.add(&name, RuleMigrationResult::Migrated)
after the code that sets group.no_shadow (and likewise after the branch that
updates rule.set_level) so the migrated rule is counted in the CLI summary.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@crates/biome_cli/src/execute/migrate/eslint_to_biome.rs`:
- Around line 802-821: In the eslint_eslint::Rule::TypeScriptNoShadow(conf)
match arm, when opts.include_nursery is true you update rules.nursery.no_shadow
but never record the migration; add a call to results.add(&name,
RuleMigrationResult::Migrated) after the code that sets group.no_shadow (and
likewise after the branch that updates rule.set_level) so the migrated rule is
counted in the CLI summary.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: eb871772-3cf4-4f88-9a87-3f8bbe36ca86

📥 Commits

Reviewing files that changed from the base of the PR and between d61f6e4 and 2035bf0.

📒 Files selected for processing (1)
  • crates/biome_cli/src/execute/migrate/eslint_to_biome.rs

@ematipico ematipico force-pushed the fix/now-shadow-type branch from 2035bf0 to c848aa6 Compare April 23, 2026 07:27
Comment on lines +6 to +25
pub struct NoShadowOptions {
/// Ignore cases where a type and a value share the same name.
///
/// Types and values live in separate namespaces in TypeScript, so a
/// variable named `Foo` and a `type Foo` cannot collide at runtime.
///
/// Defaults to `true`.
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_type_value_shadow: Option<bool>,

/// Ignore parameter names in function type annotations.
///
/// Function type parameters (e.g. `(x: string) => void`) only create
/// bindings within the type scope and rarely cause confusion.
///
/// Defaults to `true`.
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_function_type_parameter_name_value_shadow: Option<bool>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new options, needs to go against next

Copy link
Copy Markdown
Member Author

@ematipico ematipico Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For this one, no. It's a nursery rule :) in fact this PR changes the behaviour too, but it's fine because the rule is still in incubation

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that hasn't been our policy in the past. iirc you have given me feedback in other prs for rules in nursery that new options need to go on next.

Copy link
Copy Markdown
Member Author

@ematipico ematipico Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For nursery rules? My bad 😞 I must have made a mistake

We should be allowed to change nursery rules in patches, options too.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah, well good to know then.

@ematipico ematipico merged commit 4a664c1 into main Apr 24, 2026
31 checks passed
@ematipico ematipico deleted the fix/now-shadow-type branch April 24, 2026 11:25
@github-actions github-actions Bot mentioned this pull request Apr 24, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Apr 27, 2026
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Client that referenced this pull request May 4, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.13` -> `2.4.14`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.13/2.4.14) |

---

### Release Notes

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

### [`v2.4.14`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2414)

[Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14)

##### Patch Changes

- [#&#8203;9393](biomejs/biome#9393) [`491b171`](biomejs/biome@491b171) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.

- [#&#8203;10157](biomejs/biome#10157) [`eefc5ab`](biomejs/biome@eefc5ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;7882](biomejs/biome#7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.

- [#&#8203;10054](biomejs/biome#10054) [`0e9f569`](biomejs/biome@0e9f569) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.

  A function annotated `: object` returning an object literal:

  ```ts
  function f(): object {
    return { retry: true };
  }
  ```

- [#&#8203;10116](biomejs/biome#10116) [`53269eb`](biomejs/biome@53269eb) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;6201](biomejs/biome#6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.

- [#&#8203;10092](biomejs/biome#10092) [`33d8543`](biomejs/biome@33d8543) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;9097](biomejs/biome#9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.

  Given the following `organizeImports` options:

  ```json
  {
    "groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
  }
  ```

  The following code...

  ```js
  // Comment
  import "package";
  import "./file.js";
  ```

  ...was organized as:

  ```diff
  +
    // Comment
    import "package";
  +
    import "./file.js";
  ```

  A blank line was added even though the group ':NODE:' doesn't match any imports here.
  `:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
  The code is now organized as:

  ```diff
    // Comment
    import "package";
  +
    import "./file.js";
  ```

- [#&#8203;10138](biomejs/biome#10138) [`a10b6c1`](biomejs/biome@a10b6c1) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.

- [#&#8203;9922](biomejs/biome#9922) [`7acf1e0`](biomejs/biome@7acf1e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.

  Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.

- [#&#8203;10010](biomejs/biome#10010) [`f3e76ab`](biomejs/biome@f3e76ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.

- [#&#8203;10176](biomejs/biome#10176) [`8a40ef8`](biomejs/biome@8a40ef8) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10011](biomejs/biome#10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.

- [#&#8203;10163](biomejs/biome#10163) [`6867e96`](biomejs/biome@6867e96) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9884](biomejs/biome#9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.

- [#&#8203;10079](biomejs/biome#10079) [`d29dd19`](biomejs/biome@d29dd19) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@&#8203;const}` blocks. Assignments in `{@&#8203;const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.

- [#&#8203;10080](biomejs/biome#10080) [`5d8fdac`](biomejs/biome@5d8fdac) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.

  For example, the following snippets are now parsed correctly:

  ```svelte
  {#each numbers as number, index (number.toString())}
    <p>{number}</p>
  {/each}

  {#each numbers as number (key(number))}
    <p>{number}</p>
  {/each}
  ```

- [#&#8203;10140](biomejs/biome#10140) [`e7024b9`](biomejs/biome@e7024b9) Thanks [@&#8203;solithcy](https://github.com/solithcy)! - Fixed [#&#8203;10135](biomejs/biome#10135): Biome no longer crashes on missing Svelte template expressions.

  The following code snippet longer panics:

  ```svelte
  {#if }
   <p>^ this would previously crash</p>
  {/if}
  {@&#8203;const }
  <p>    ^ this would also crash</p>
  ```

- [#&#8203;10111](biomejs/biome#10111) [`7818009`](biomejs/biome@7818009) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9997](biomejs/biome#9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.

  The following snippet is no longer flagged as a duplicate:

  ```css
  .Example {
    padding: 0;
  }

  @&#8203;scope (.theme-dark) {
    .Example {
      color: white;
    }
  }
  ```

- [#&#8203;9926](biomejs/biome#9926) [`d62b331`](biomejs/biome@d62b331) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.

  For example, this code:

  ```js
  const min = a < b ? a : b;
  ```

  is much more readable when rewritten as:

  ```js
  const min = Math.min(a, b);
  ```

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.

- [#&#8203;10125](biomejs/biome#10125) [`a55a0b6`](biomejs/biome@a55a0b6) Thanks [@&#8203;bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.

- [#&#8203;10117](biomejs/biome#10117) [`895e809`](biomejs/biome@895e809) Thanks [@&#8203;denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.

  New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.

  New known value functions: `superellipse()`, `squircle()`.

- [#&#8203;8620](biomejs/biome#8620) [`8df8f73`](biomejs/biome@8df8f73) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;8062](biomejs/biome#8062): Added support for parsing Vue `v-for` directives more accurately.

- [#&#8203;10191](biomejs/biome#10191) [`aa055cd`](biomejs/biome@aa055cd) Thanks [@&#8203;guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9099](biomejs/biome#9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.

  For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:

  ```svelte
  <div>
    {name}<!-- comment -->
  </div>
  ```

  Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:

  ```html
  <div>
    <span>text</span>
  </div>
  ```

- [#&#8203;10105](biomejs/biome#10105) [`e7c1a6d`](biomejs/biome@e7c1a6d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10039](biomejs/biome#10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.

  The following patterns are now correctly flagged:

  ```ts
  const AnonClass = class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  };

  export default class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  }
  ```

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10178](biomejs/biome#10178) [`7b05a89`](biomejs/biome@7b05a89) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10177](biomejs/biome#10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.

- [#&#8203;10155](biomejs/biome#10155) [`0d4595d`](biomejs/biome@0d4595d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10045](biomejs/biome#10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
  The following snippet is now correctly formatted, matching Prettier.

  ```css
  input:not(
    :where(
      [type="submit"],
      [type="checkbox"],
      [type="radio"],
      [type="button"],
      [type="reset"]
    )
  ) {
    inline-size: 100%;
  }
  ```

- [#&#8203;10112](biomejs/biome#10112) [`6f0251e`](biomejs/biome@6f0251e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10110](biomejs/biome#10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10083](biomejs/biome#10083) [`4a664c1`](biomejs/biome@4a664c1) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.

  Fixed [#&#8203;9482](biomejs/biome#9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.

  Fixed [#&#8203;7812](biomejs/biome#7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.

- [#&#8203;9286](biomejs/biome#9286) [`52695cf`](biomejs/biome@52695cf) Thanks [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#&#8203;6316](biomejs/biome#6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.

- [#&#8203;10188](biomejs/biome#10188) [`ae659dd`](biomejs/biome@ae659dd) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9450](biomejs/biome#9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.

  ```diff
   <template>
     <UModal>
  -    <template #body> <p>content</p> </template>
  +    <template #body>
  +      <p>content</p>
  +    </template>
     </UModal>
   </template>
  ```

- [#&#8203;10118](biomejs/biome#10118) [`c6edcb4`](biomejs/biome@c6edcb4) Thanks [@&#8203;Netail](https://github.com/Netail)! - Fixed [#&#8203;10024](biomejs/biome#10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/2
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request May 5, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.13` -> `2.4.14`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.13/2.4.14) |

---

### Release Notes

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

### [`v2.4.14`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2414)

[Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14)

##### Patch Changes

- [#&#8203;9393](biomejs/biome#9393) [`491b171`](biomejs/biome@491b171) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.

- [#&#8203;10157](biomejs/biome#10157) [`eefc5ab`](biomejs/biome@eefc5ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;7882](biomejs/biome#7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.

- [#&#8203;10054](biomejs/biome#10054) [`0e9f569`](biomejs/biome@0e9f569) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.

  A function annotated `: object` returning an object literal:

  ```ts
  function f(): object {
    return { retry: true };
  }
  ```

- [#&#8203;10116](biomejs/biome#10116) [`53269eb`](biomejs/biome@53269eb) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;6201](biomejs/biome#6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.

- [#&#8203;10092](biomejs/biome#10092) [`33d8543`](biomejs/biome@33d8543) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;9097](biomejs/biome#9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.

  Given the following `organizeImports` options:

  ```json
  {
    "groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
  }
  ```

  The following code...

  ```js
  // Comment
  import "package";
  import "./file.js";
  ```

  ...was organized as:

  ```diff
  +
    // Comment
    import "package";
  +
    import "./file.js";
  ```

  A blank line was added even though the group ':NODE:' doesn't match any imports here.
  `:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
  The code is now organized as:

  ```diff
    // Comment
    import "package";
  +
    import "./file.js";
  ```

- [#&#8203;10138](biomejs/biome#10138) [`a10b6c1`](biomejs/biome@a10b6c1) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.

- [#&#8203;9922](biomejs/biome#9922) [`7acf1e0`](biomejs/biome@7acf1e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.

  Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.

- [#&#8203;10010](biomejs/biome#10010) [`f3e76ab`](biomejs/biome@f3e76ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.

- [#&#8203;10176](biomejs/biome#10176) [`8a40ef8`](biomejs/biome@8a40ef8) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10011](biomejs/biome#10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.

- [#&#8203;10163](biomejs/biome#10163) [`6867e96`](biomejs/biome@6867e96) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9884](biomejs/biome#9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.

- [#&#8203;10079](biomejs/biome#10079) [`d29dd19`](biomejs/biome@d29dd19) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@&#8203;const}` blocks. Assignments in `{@&#8203;const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.

- [#&#8203;10080](biomejs/biome#10080) [`5d8fdac`](biomejs/biome@5d8fdac) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.

  For example, the following snippets are now parsed correctly:

  ```svelte
  {#each numbers as number, index (number.toString())}
    <p>{number}</p>
  {/each}

  {#each numbers as number (key(number))}
    <p>{number}</p>
  {/each}
  ```

- [#&#8203;10140](biomejs/biome#10140) [`e7024b9`](biomejs/biome@e7024b9) Thanks [@&#8203;solithcy](https://github.com/solithcy)! - Fixed [#&#8203;10135](biomejs/biome#10135): Biome no longer crashes on missing Svelte template expressions.

  The following code snippet longer panics:

  ```svelte
  {#if }
   <p>^ this would previously crash</p>
  {/if}
  {@&#8203;const }
  <p>    ^ this would also crash</p>
  ```

- [#&#8203;10111](biomejs/biome#10111) [`7818009`](biomejs/biome@7818009) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9997](biomejs/biome#9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.

  The following snippet is no longer flagged as a duplicate:

  ```css
  .Example {
    padding: 0;
  }

  @&#8203;scope (.theme-dark) {
    .Example {
      color: white;
    }
  }
  ```

- [#&#8203;9926](biomejs/biome#9926) [`d62b331`](biomejs/biome@d62b331) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.

  For example, this code:

  ```js
  const min = a < b ? a : b;
  ```

  is much more readable when rewritten as:

  ```js
  const min = Math.min(a, b);
  ```

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.

- [#&#8203;10125](biomejs/biome#10125) [`a55a0b6`](biomejs/biome@a55a0b6) Thanks [@&#8203;bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.

- [#&#8203;10117](biomejs/biome#10117) [`895e809`](biomejs/biome@895e809) Thanks [@&#8203;denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.

  New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.

  New known value functions: `superellipse()`, `squircle()`.

- [#&#8203;8620](biomejs/biome#8620) [`8df8f73`](biomejs/biome@8df8f73) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;8062](biomejs/biome#8062): Added support for parsing Vue `v-for` directives more accurately.

- [#&#8203;10191](biomejs/biome#10191) [`aa055cd`](biomejs/biome@aa055cd) Thanks [@&#8203;guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9099](biomejs/biome#9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.

  For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:

  ```svelte
  <div>
    {name}<!-- comment -->
  </div>
  ```

  Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:

  ```html
  <div>
    <span>text</span>
  </div>
  ```

- [#&#8203;10105](biomejs/biome#10105) [`e7c1a6d`](biomejs/biome@e7c1a6d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10039](biomejs/biome#10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.

  The following patterns are now correctly flagged:

  ```ts
  const AnonClass = class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  };

  export default class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  }
  ```

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10178](biomejs/biome#10178) [`7b05a89`](biomejs/biome@7b05a89) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10177](biomejs/biome#10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.

- [#&#8203;10155](biomejs/biome#10155) [`0d4595d`](biomejs/biome@0d4595d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10045](biomejs/biome#10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
  The following snippet is now correctly formatted, matching Prettier.

  ```css
  input:not(
    :where(
      [type="submit"],
      [type="checkbox"],
      [type="radio"],
      [type="button"],
      [type="reset"]
    )
  ) {
    inline-size: 100%;
  }
  ```

- [#&#8203;10112](biomejs/biome#10112) [`6f0251e`](biomejs/biome@6f0251e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10110](biomejs/biome#10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10083](biomejs/biome#10083) [`4a664c1`](biomejs/biome@4a664c1) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.

  Fixed [#&#8203;9482](biomejs/biome#9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.

  Fixed [#&#8203;7812](biomejs/biome#7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.

- [#&#8203;9286](biomejs/biome#9286) [`52695cf`](biomejs/biome@52695cf) Thanks [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#&#8203;6316](biomejs/biome#6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.

- [#&#8203;10188](biomejs/biome#10188) [`ae659dd`](biomejs/biome@ae659dd) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9450](biomejs/biome#9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.

  ```diff
   <template>
     <UModal>
  -    <template #body> <p>content</p> </template>
  +    <template #body>
  +      <p>content</p>
  +    </template>
     </UModal>
   </template>
  ```

- [#&#8203;10118](biomejs/biome#10118) [`c6edcb4`](biomejs/biome@c6edcb4) Thanks [@&#8203;Netail](https://github.com/Netail)! - Fixed [#&#8203;10024](biomejs/biome#10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CLI Area: CLI A-Linter Area: linter L-JavaScript Language: JavaScript and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

💅 nusery/noShadow should not flag parameter names of function types 💅 nursery/noShadow: implement ignoreTypeValueShadow option from source rule

2 participants