From 341c678b2f96f8c0988bfaf1fabf04b850c99aeb Mon Sep 17 00:00:00 2001 From: Boshen Date: Wed, 9 Aug 2023 18:31:17 +0800 Subject: [PATCH] fix(resolver): fix a case with multi-dot file extensions (#704) --- crates/oxc_resolver/src/lib.rs | 7 +++++++ crates/oxc_resolver/src/tests/extensions.rs | 22 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/crates/oxc_resolver/src/lib.rs b/crates/oxc_resolver/src/lib.rs index d3ec9bb9d..c02caebbc 100644 --- a/crates/oxc_resolver/src/lib.rs +++ b/crates/oxc_resolver/src/lib.rs @@ -350,6 +350,13 @@ impl ResolverGeneric { if let Some(path) = self.load_alias_or_file(&cached_path, ctx)? { return Ok(Some(path)); } + + // `std::path::PathBuf::set_extension` only removes 1 dot. + // This removes multi-dot extensions such as `.d.ts`. + let num_dots = extension.chars().filter(|c| *c == '.').count(); + for _ in 0..num_dots { + path_with_extension.set_extension(""); + } } Ok(None) } diff --git a/crates/oxc_resolver/src/tests/extensions.rs b/crates/oxc_resolver/src/tests/extensions.rs index 45803b698..85ed958fa 100644 --- a/crates/oxc_resolver/src/tests/extensions.rs +++ b/crates/oxc_resolver/src/tests/extensions.rs @@ -73,3 +73,25 @@ fn respect_enforce_extension() { assert_eq!(resolved.map(Resolution::into_path_buf), Ok(f.join("foo.ts"))); // TODO: need to match missingDependencies returned from the resolve function } + +// Test for `.d.ts`, not part of enhanced-resolve. +#[test] +fn multi_dot_extension() { + let f = fixture(); + + let resolver = Resolver::new(ResolveOptions { + extensions: vec![".a.b.c".into(), ".d.ts".into(), ".ts".into(), ".js".into()], + ..ResolveOptions::default() + }); + + #[rustfmt::skip] + let pass = [ + ("should resolve according to order of provided extensions", "./foo", "foo.ts"), + ]; + + for (comment, request, expected_path) in pass { + let resolved_path = resolver.resolve(&f, request).map(|r| r.full_path()); + let expected = f.join(expected_path); + assert_eq!(resolved_path, Ok(expected), "{comment} {request} {expected_path}"); + } +}