use crate::{
ResolveError, ResolveOptions, Resolver, TsconfigDiscovery, TsconfigOptions, TsconfigReferences,
};
#[test]
fn test() {
let f = super::fixture_root().join("tsconfig/cases");
#[rustfmt::skip]
let pass = [
(f.join("root-dirs"), "src/index.ts", "./foo", f.join("root-dirs/generated/foo.ts")),
(f.join("root-dirs-multiple"), "src/index.ts", "./bar", f.join("root-dirs-multiple/generated/bar.ts")),
(f.join("root-dirs-multiple"), "src/index.ts", "./baz", f.join("root-dirs-multiple/lib/baz.ts")),
(f.join("root-dirs-nested"), "src/sub/index.ts", "./foo", f.join("root-dirs-nested/src/sub/foo.ts")),
(f.join("root-dirs"), ".", "./src/index", f.join("root-dirs/src/index.ts")),
(f.join("root-dirs-parent-nav"), "generated/folder2/file3.ts", "../folder1/file1", f.join("root-dirs-parent-nav/folder1/file1.ts")),
(f.join("root-dirs-parent-dir"), "generated/folder2/file3.ts", "../folder1/file1_1", f.join("root-dirs-parent-dir/folder1/file1_1/index.ts")),
(f.join("root-dirs-single"), "src/index.ts", "./foo", f.join("root-dirs-single/src/foo.ts")),
(f.join("root-dirs-trailing-slash"), "src/index.ts", "./foo", f.join("root-dirs-trailing-slash/generated/foo.ts")),
];
for (dir, from_path, request, expected) in pass {
let resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: dir.join("tsconfig.json"),
references: TsconfigReferences::Auto,
})),
extensions: vec![".ts".into()],
..ResolveOptions::default()
});
let path = dir.join(from_path);
let resolved_path = resolver.resolve(&path, request).map(|f| f.full_path());
assert_eq!(resolved_path, Ok(expected), "from {path:?} resolve {request}");
}
#[rustfmt::skip]
let fail = [
(f.join("index"), "src/index.ts", "./foo"),
(f.join("root-dirs-all-fail"), "src/index.ts", "./nonexistent"),
(f.join("root-dirs-nested"), ".", "./nonexistent"),
];
for (dir, from_path, request) in fail {
let resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: dir.join("tsconfig.json"),
references: TsconfigReferences::Auto,
})),
extensions: vec![".ts".into()],
..ResolveOptions::default()
});
let path = dir.join(from_path);
let resolved_path = resolver.resolve(&path, request);
assert!(
matches!(resolved_path, Err(ResolveError::NotFound(_))),
"expected NotFound error from {path:?} resolve {request}, got {resolved_path:?}"
);
}
}
#[test]
fn test_root_dirs_via_extends() {
let f = super::fixture_root().join("tsconfig/cases/root-dirs-extends");
let resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.join("tsconfig.json"),
references: TsconfigReferences::Disabled,
})),
extensions: vec![".ts".into(), ".d.ts".into()],
..ResolveOptions::default()
});
let from = f.join("src/routes/+page.ts");
let path = resolver.resolve(&from, "./$types").map(|r| r.full_path());
let expected = f.join(".svelte-kit/types/src/routes/$types.d.ts");
assert_eq!(path, Ok(expected), "from {from:?} resolve ./$types");
}