use crate::{
ResolveError, ResolveOptions, Resolver, TsconfigDiscovery, TsconfigOptions, TsconfigReferences,
};
#[test]
fn auto() {
let f = super::fixture_root().join("tsconfig/cases/project-references");
let resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.join("app"),
references: TsconfigReferences::Auto,
})),
..ResolveOptions::default()
});
#[rustfmt::skip]
let pass = [
(f.join("app/index.ts"), "@/index.ts", f.join("app/aliased/index.ts")),
(f.join("app/index.ts"), "@/../index.ts", f.join("app/index.ts")),
(f.join("project-a/index.ts"), "@/index.ts", f.join("project-a/aliased/index.ts")),
(f.join("project-b/src/aliased/index.ts"), "@/index.ts", f.join("project-b/src/aliased/index.ts")),
(f.join("project-a/index.ts"), "./index.ts", f.join("project-a/index.ts")),
(f.join("project-c/index.ts"), "./index.ts", f.join("project-c/index.ts")),
{
let file = f.parent().unwrap().join("paths-template-variable/src/foo.js");
(file.clone(), "foo", file)
}
];
for (path, request, expected) in pass {
let resolved_path = resolver.resolve_file(&path, request).map(|f| f.full_path());
assert_eq!(resolved_path, Ok(expected), "{request} {path:?}");
}
let no_paths_resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.join("app/tsconfig.nopaths.json"),
references: TsconfigReferences::Auto,
})),
..ResolveOptions::default()
});
#[rustfmt::skip]
let pass = [
(f.join("app"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
(f.join("app"), "@/../index.ts", Ok(f.join("app/index.ts"))),
(f.join("project-a"), "@/index.ts", Ok(f.join("project-a/aliased/index.ts"))),
(f.join("project-b/src"), "@/index.ts", Ok(f.join("project-b/src/aliased/index.ts"))),
(f.join("project-a"), "./index.ts", Ok(f.join("project-a/index.ts"))),
(f.join("project-c"), "./index.ts", Ok(f.join("project-c/index.ts"))),
{
let dir = f.parent().unwrap().join("paths-template-variable");
(dir.clone(), "foo", Ok(dir.join("src/foo.js")))
}
];
for (path, request, expected) in pass {
let resolved_path = no_paths_resolver.resolve(&path, request).map(|f| f.full_path());
assert_eq!(resolved_path, expected, "{request} {path:?}");
}
}
#[test]
fn disabled() {
let f = super::fixture_root().join("tsconfig/cases/project-references");
let resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.join("app"),
references: TsconfigReferences::Disabled,
})),
..ResolveOptions::default()
});
let no_paths_resolver = Resolver::new(ResolveOptions {
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.join("app/tsconfig.nopaths.json"),
references: TsconfigReferences::Disabled,
})),
..ResolveOptions::default()
});
#[rustfmt::skip]
let pass = [
(f.join("app"), "@/index.ts", Ok(f.join("app/aliased/index.ts"))),
(f.join("app"), "@/../index.ts", Ok(f.join("app/index.ts"))),
(f.join("project-a"), "@/index.ts", Ok(f.join("app/aliased/index.ts"))),
(f.join("project-b/src"), "@/index.ts", Ok(f.join("app/aliased/index.ts"))),
(f.join("project-a"), "./index.ts", Ok(f.join("project-a/index.ts"))),
(f.join("project-c"), "./index.ts", Ok(f.join("project-c/index.ts"))),
];
for (path, request, expected) in pass {
let resolved_path = resolver.resolve(&path, request).map(|f| f.full_path());
assert_eq!(resolved_path, expected, "{request} {path:?}");
}
#[rustfmt::skip]
let pass = [
(f.join("app"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
(f.join("app"), "#/../index.ts", Ok(f.join("app/index.ts"))), (f.join("project-a"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
(f.join("project-b/src"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
(f.join("project-a"), "./index.ts", Ok(f.join("project-a/index.ts"))),
(f.join("project-c"), "./index.ts", Ok(f.join("project-c/index.ts"))),
];
for (path, request, expected) in pass {
let resolved_path = no_paths_resolver.resolve(&path, request).map(|f| f.full_path());
assert_eq!(resolved_path, expected, "{request} {path:?}");
}
}
#[test]
fn references_with_extends() {
let f = super::fixture_root().join("tsconfig/cases/project-references/extends");
let resolver = Resolver::new(ResolveOptions {
extensions: vec![".ts".into(), ".tsx".into()],
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
config_file: f.clone(),
references: TsconfigReferences::Auto,
})),
..ResolveOptions::default()
});
let file = f.join("src").join("src").join("index.tsx");
let resolved_path = resolver.resolve_file(file, "@/pages").map(|f| f.full_path());
assert_eq!(resolved_path, Ok(f.join("src/pages/index.tsx")));
}