+
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/damned-definitions-differ.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#6829](https://github.com/biomejs/biome/issues/6829): Fixed a false positive reported by `useImportExtensions` when importing a `.js` file that had a matching `.d.ts` file in the same folder.
Original file line number Diff line number Diff line change
Expand Up @@ -215,19 +215,22 @@ fn get_extensionless_import(
return None;
}

// In cases like `./foo.css` -> `./foo.css.ts`
let resolved_path_has_sub_extension = resolved_path
.file_stem()
.is_some_and(|stem| stem.contains('.'));
let existing_extension = path.extension();
let resolved_stem = resolved_path.file_stem();
let resolved_extension = resolved_path.extension();
let resolved_path_sub_extension =
resolved_stem.and_then(|stem| stem.rfind('.').map(|pos| &stem[pos + 1..]));

if resolved_path_has_sub_extension && path.file_name()?.starts_with(resolved_path.file_name()?)
{
return None;
}
let existing_extension = path.extension();

if !resolved_path_has_sub_extension && existing_extension.is_some() {
return None;
match (resolved_path_sub_extension, existing_extension) {
(Some("d"), Some("js")) if resolved_extension.is_some_and(|ext| ext == "ts") => {
return None; // We resolved a `.d.ts` file, but imported the `.js` file: OK.
}
(Some(_), _) if path.file_name()?.starts_with(resolved_path.file_name()?) => {
return None; // For cases like `./foo.css` -> `./foo.css.ts`
}
(None, Some(_)) => return None,
_ => {}
}

let last_component = path_components.next_back().unwrap_or(first_component);
Expand All @@ -244,12 +247,10 @@ fn get_extensionless_import(
let extension = if force_js_extensions {
"js"
} else {
resolved_path.extension()?
resolved_extension?
};

let is_index_file = resolved_path
.file_stem()
.is_some_and(|stem| stem == "index");
let is_index_file = resolved_stem.is_some_and(|stem| stem == "index");

let new_path = if is_index_file {
let mut path_parts = path.as_str().split('/');
Expand All @@ -274,7 +275,7 @@ fn get_extensionless_import(
new_path
} else {
let mut new_path = path.to_path_buf();
let sub_extension = if resolved_path_has_sub_extension {
let sub_extension = if resolved_path_sub_extension.is_some() {
existing_extension
} else {
None
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,5 @@ import "./sub/component.svg.svelte.ts?query=string&query2#hash";
import './sub/baz';
import './sub/baz.css';
import './sub/baz.css.com';

import "./sub/generated/index.js";
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ import './sub/baz';
import './sub/baz.css';
import './sub/baz.css.com';

import "./sub/generated/index.js";

```
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载