Skip to content

Commit 5b1ae7f

Browse files
committed
feat: add resolve_file API for tsconfig auto discovery to work (#860)
Add a new API to make tsconfig paths work with the auto-discovered tsconfig. ```rust /// Resolve `specifier` for an absolute path to a file. /// /// NOTE: [TsconfigDiscovery::Auto] only work for this API, use `ResolverGeneric::resolve_file` instead. /// /// # Errors /// /// * See [ResolveError] /// /// # Panics /// /// * If the provided path is not a file. pub fn resolve_file<P: AsRef<Path>>( &self, file: P, specifier: &str, ) -> Result<Resolution, ResolveError> { ``` --- New concept: Given an input file: * There is always a tsconfig associated with this file, we call it the resolved tsconfig, or tsconfig solution (in tsconfck) * When resolving path aliases, always use the resolved tsconfig.
1 parent feafed8 commit 5b1ae7f

16 files changed

+335
-168
lines changed

src/lib.rs

Lines changed: 186 additions & 65 deletions
Large diffs are not rendered by default.

src/tests/alias.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ fn alias_is_full_path() {
219219
];
220220

221221
for specifier in specifiers {
222-
let resolution = resolver.resolve_with_context(&f, &specifier, &mut ctx);
222+
let resolution = resolver.resolve_with_context(&f, &specifier, None, &mut ctx);
223223
assert_eq!(resolution.map(|r| r.full_path()), Ok(dir.join("index.js")));
224224
}
225225

src/tests/dependencies.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ mod test {
9393
let mut ctx = ResolveContext::default();
9494
let path = PathBuf::from(context);
9595
let resolved_path =
96-
resolver.resolve_with_context(path, request, &mut ctx).map(|r| r.full_path());
96+
resolver.resolve_with_context(path, request, None, &mut ctx).map(|r| r.full_path());
9797
assert_eq!(resolved_path, Ok(PathBuf::from(result)));
9898
let file_dependencies = file_dependencies.iter().map(PathBuf::from).collect();
9999
let missing_dependencies = missing_dependencies.iter().map(PathBuf::from).collect();

src/tests/exports_field.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2554,6 +2554,7 @@ fn test_cases() {
25542554
&cached_path,
25552555
case.request,
25562556
&case.exports_field,
2557+
None,
25572558
&mut Ctx::default(),
25582559
)
25592560
.map(|p| p.map(|p| p.to_path_buf()));

src/tests/extensions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn default_enforce_extension() {
5151
extensions: vec![".ts".into(), String::new(), ".js".into()],
5252
..ResolveOptions::default()
5353
})
54-
.resolve_with_context(&f, "./foo", &mut ctx);
54+
.resolve_with_context(&f, "./foo", None, &mut ctx);
5555

5656
assert_eq!(resolved.map(Resolution::into_path_buf), Ok(f.join("foo.ts")));
5757
assert_eq!(
@@ -72,7 +72,7 @@ fn respect_enforce_extension() {
7272
extensions: vec![".ts".into(), String::new(), ".js".into()],
7373
..ResolveOptions::default()
7474
})
75-
.resolve_with_context(&f, "./foo", &mut ctx);
75+
.resolve_with_context(&f, "./foo", None, &mut ctx);
7676

7777
assert_eq!(resolved.map(Resolution::into_path_buf), Ok(f.join("foo.ts")));
7878
assert_eq!(

src/tests/imports_field.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,7 @@ fn test_cases() {
13251325
&cached_path,
13261326
true,
13271327
&case.condition_names.iter().map(ToString::to_string).collect::<Vec<_>>(),
1328+
None,
13281329
&mut Ctx::default(),
13291330
)
13301331
.map(|p| p.map(|p| p.to_path_buf()));

src/tests/incorrect_description_file.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn incorrect_description_file_1() {
1010
let f = super::fixture().join("incorrect-package");
1111
let mut ctx = ResolveContext::default();
1212
let error =
13-
Resolver::default().resolve_with_context(f.join("pack1"), ".", &mut ctx).unwrap_err();
13+
Resolver::default().resolve_with_context(f.join("pack1"), ".", None, &mut ctx).unwrap_err();
1414
match error {
1515
ResolveError::Json(e) => {
1616
assert_eq!(e.path, f.join("pack1/package.json"));

src/tests/missing.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn test() {
4949

5050
for (specifier, missing_dependencies) in data {
5151
let mut ctx = ResolveContext::default();
52-
let _ = resolver.resolve_with_context(&f, specifier, &mut ctx);
52+
let _ = resolver.resolve_with_context(&f, specifier, None, &mut ctx);
5353

5454
for path in ctx.file_dependencies {
5555
assert_eq!(path, path.normalize(), "{path:?}");
@@ -87,8 +87,8 @@ fn alias_and_extensions() {
8787
});
8888

8989
let mut ctx = ResolveContext::default();
90-
let _ = resolver.resolve_with_context(&f, "@scope-js/package-name/dir/router", &mut ctx);
91-
let _ = resolver.resolve_with_context(&f, "react-dom/client", &mut ctx);
90+
let _ = resolver.resolve_with_context(&f, "@scope-js/package-name/dir/router", None, &mut ctx);
91+
let _ = resolver.resolve_with_context(&f, "react-dom/client", None, &mut ctx);
9292

9393
for path in ctx.file_dependencies {
9494
assert_eq!(path, path.normalize(), "{path:?}");

src/tests/tsconfck.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::path::PathBuf;
22

33
use walkdir::WalkDir;
44

5-
use crate::Resolver;
5+
use crate::{ResolveOptions, Resolver, TsconfigDiscovery};
66

77
fn walk(dir: &PathBuf) -> Vec<PathBuf> {
88
WalkDir::new(dir)
@@ -84,7 +84,10 @@ fn part_of_solution() {
8484
("referenced-exclude", "src/bar.ts", "tsconfig.bar.json"),
8585
];
8686

87-
let resolver = Resolver::default();
87+
let resolver = Resolver::new(ResolveOptions {
88+
tsconfig: Some(TsconfigDiscovery::Auto),
89+
..ResolveOptions::default()
90+
});
8891
for (dir, specifier, expected) in pass {
8992
let dir = root.join(dir);
9093
let tsconfig = resolver.find_tsconfig(dir.join(specifier)).unwrap().unwrap();
@@ -96,7 +99,10 @@ fn part_of_solution() {
9699
#[test]
97100
fn find() {
98101
let dir = super::fixture_root().join("tsconfck").join("find").join("a");
99-
let resolver = Resolver::default();
102+
let resolver = Resolver::new(ResolveOptions {
103+
tsconfig: Some(TsconfigDiscovery::Auto),
104+
..ResolveOptions::default()
105+
});
100106

101107
let result = resolver.find_tsconfig(dir.join("foo.ts"));
102108
let path = result.map(|tsconfig| tsconfig.unwrap().path().to_path_buf());

src/tests/tsconfig_discovery.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ fn tsconfig_discovery_virtual_file_importer() {
2020
});
2121

2222
let resolved_path =
23-
resolver.resolve("\0virtual-module", "random-import").map(|f| f.full_path());
23+
resolver.resolve_file("\0virtual-module/foo.js", "random-import").map(|f| f.full_path());
2424
assert_eq!(resolved_path, Err(ResolveError::NotFound("random-import".into())));
2525
}

0 commit comments

Comments
 (0)