diff --git a/examples/resolver.rs b/examples/resolver.rs index c53fd3b7..186219e6 100644 --- a/examples/resolver.rs +++ b/examples/resolver.rs @@ -2,7 +2,9 @@ use std::path::PathBuf; -use oxc_resolver::{AliasValue, ResolveOptions, Resolver, TsconfigOptions, TsconfigReferences}; +use oxc_resolver::{ + AliasValue, ResolveOptions, Resolver, TsconfigDiscovery, TsconfigOptions, TsconfigReferences, +}; use pico_args::Arguments; fn main() { @@ -30,10 +32,15 @@ fn main() { condition_names: vec!["node".into(), "import".into()], // CJS // condition_names: vec!["node".into(), "require".into()], - tsconfig: tsconfig_path.map(|config_file| TsconfigOptions { - config_file, - references: TsconfigReferences::Auto, - }), + tsconfig: Some(tsconfig_path.map_or_else( + || TsconfigDiscovery::Auto, + |config_file| { + TsconfigDiscovery::Manual(TsconfigOptions { + config_file, + references: TsconfigReferences::Auto, + }) + }, + )), ..ResolveOptions::default() }; @@ -45,7 +52,7 @@ fn main() { println!("Resolution: {}", resolution.full_path().to_string_lossy()); println!("Module Type: {:?}", resolution.module_type()); println!( - "package json: {:?}", + "package.json: {:?}", resolution.package_json().map(|p| p.path.to_string_lossy()) ); } diff --git a/napi/index.d.ts b/napi/index.d.ts index 26dbd099..a3c7b764 100644 --- a/napi/index.d.ts +++ b/napi/index.d.ts @@ -52,11 +52,11 @@ export declare const enum ModuleType { */ export interface NapiResolveOptions { /** - * Path to TypeScript configuration file. + * Discover tsconfig automatically or use the specified tsconfig.json path. * * Default `None` */ - tsconfig?: TsconfigOptions + tsconfig?: 'auto' | TsconfigOptions /** * Alias for [ResolveOptions::alias] and [ResolveOptions::fallback]. * diff --git a/napi/src/lib.rs b/napi/src/lib.rs index 0b9b3189..93fef16b 100644 --- a/napi/src/lib.rs +++ b/napi/src/lib.rs @@ -10,9 +10,9 @@ use std::{ sync::Arc, }; -use napi::{Task, bindgen_prelude::AsyncTask}; +use napi::{Either, Task, bindgen_prelude::AsyncTask}; use napi_derive::napi; -use oxc_resolver::{ResolveError, ResolveOptions, Resolver}; +use oxc_resolver::{ResolveError, ResolveOptions, Resolver, TsconfigDiscovery, TsconfigOptions}; use self::options::{NapiResolveOptions, StrOrStrList}; @@ -190,7 +190,10 @@ impl ResolverFactory { // merging options ResolveOptions { cwd: None, - tsconfig: op.tsconfig.map(|tsconfig| tsconfig.into()), + tsconfig: op.tsconfig.map(|value| match value { + Either::A(_) => TsconfigDiscovery::Auto, + Either::B(options) => TsconfigDiscovery::Manual(TsconfigOptions::from(options)), + }), alias: op .alias .map(|alias| { diff --git a/napi/src/options.rs b/napi/src/options.rs index 4c024fc4..31b2f3a2 100644 --- a/napi/src/options.rs +++ b/napi/src/options.rs @@ -12,10 +12,11 @@ use napi_derive::napi; #[derive(Debug, Clone)] #[napi(object)] pub struct NapiResolveOptions { - /// Path to TypeScript configuration file. + /// Discover tsconfig automatically or use the specified tsconfig.json path. /// /// Default `None` - pub tsconfig: Option, + #[napi(ts_type = "'auto' | TsconfigOptions")] + pub tsconfig: Option>, /// Alias for [ResolveOptions::alias] and [ResolveOptions::fallback]. /// diff --git a/src/cache/cached_path.rs b/src/cache/cached_path.rs index 75799078..1ff11f5e 100644 --- a/src/cache/cached_path.rs +++ b/src/cache/cached_path.rs @@ -13,7 +13,7 @@ use once_cell::sync::OnceCell as OnceLock; use super::cache_impl::Cache; use super::thread_local::SCRATCH_PATH; use crate::{ - FileMetadata, FileSystem, PackageJson, ResolveError, ResolveOptions, + FileMetadata, FileSystem, PackageJson, ResolveError, ResolveOptions, TsConfig, context::ResolveContext as Ctx, }; @@ -31,6 +31,7 @@ pub struct CachedPathImpl { pub canonicalizing: AtomicU64, pub node_modules: OnceLock>>, pub package_json: OnceLock>>, + pub tsconfig: OnceLock>>, } impl CachedPathImpl { @@ -52,6 +53,7 @@ impl CachedPathImpl { canonicalizing: AtomicU64::new(0), node_modules: OnceLock::new(), package_json: OnceLock::new(), + tsconfig: OnceLock::new(), } } } diff --git a/src/lib.rs b/src/lib.rs index b41d8742..1fa056a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -70,8 +70,8 @@ pub use crate::{ error::{JSONError, ResolveError, SpecifierError}, file_system::{FileMetadata, FileSystem, FileSystemOs}, options::{ - Alias, AliasValue, EnforceExtension, ResolveOptions, Restriction, TsconfigOptions, - TsconfigReferences, + Alias, AliasValue, EnforceExtension, ResolveOptions, Restriction, TsconfigDiscovery, + TsconfigOptions, TsconfigReferences, }, package_json::{ ImportsExportsArray, ImportsExportsEntry, ImportsExportsKind, ImportsExportsMap, @@ -281,6 +281,7 @@ impl ResolverGeneric { debug_assert!(path.starts_with(package_json.directory())); } let module_type = self.esm_file_format(&cached_path, ctx)?; + Ok(Resolution { path, query: ctx.query.take(), @@ -1456,21 +1457,78 @@ impl ResolverGeneric { if cached_path.inside_node_modules() { return Ok(None); } - let Some(tsconfig_options) = &self.options.tsconfig else { - return Ok(None); + let tsconfig = match &self.options.tsconfig { + None => return Ok(None), + Some(TsconfigDiscovery::Manual(tsconfig_options)) => { + let tsconfig = self.load_tsconfig( + /* root */ true, + &tsconfig_options.config_file, + &tsconfig_options.references, + &mut TsconfigResolveContext::default(), + )?; + // Cache the loaded tsconfig in the path's directory + let tsconfig_dir = self.cache.value(tsconfig.directory()); + _ = tsconfig_dir.tsconfig.get_or_init(|| Some(Arc::clone(&tsconfig))); + tsconfig + } + Some(TsconfigDiscovery::Auto) => { + let Some(tsconfig) = self.find_tsconfig(cached_path, ctx)? else { + return Ok(None); + }; + tsconfig + } }; - let tsconfig = self.load_tsconfig( - /* root */ true, - &tsconfig_options.config_file, - &tsconfig_options.references, - &mut TsconfigResolveContext::default(), - )?; + let paths = tsconfig.resolve(cached_path.path(), specifier); for path in paths { - let cached_path = self.cache.value(&path); - if let Some(path) = self.load_as_file_or_directory(&cached_path, ".", ctx)? { - return Ok(Some(path)); + let resolved_path = self.cache.value(&path); + if let Some(resolution) = self.load_as_file_or_directory(&resolved_path, ".", ctx)? { + // Cache the tsconfig in the resolved path + _ = resolved_path.tsconfig.get_or_init(|| Some(Arc::clone(&tsconfig))); + return Ok(Some(resolution)); + } + } + Ok(None) + } + + /// Find tsconfig.json of a path by traversing parent directories. + /// + /// # Errors + /// + /// * [ResolveError::Json] + pub(crate) fn find_tsconfig( + &self, + cached_path: &CachedPath, + ctx: &mut Ctx, + ) -> Result>, ResolveError> { + // Don't discover tsconfig for paths inside node_modules + if cached_path.inside_node_modules() { + return Ok(None); + } + + let mut cache_value = cached_path.clone(); + // Go up directories when the querying path is not a directory + while !self.cache.is_dir(&cache_value, ctx) { + if let Some(cv) = cache_value.parent() { + cache_value = cv; + } else { + break; + } + } + let mut cache_value = Some(cache_value); + while let Some(cv) = cache_value { + if let Some(tsconfig) = cv.tsconfig.get_or_try_init(|| { + let tsconfig_path = cv.path.join("tsconfig.json"); + let tsconfig_path = self.cache.value(&tsconfig_path); + if self.cache.is_file(&tsconfig_path, ctx) { + self.resolve_tsconfig(tsconfig_path.path()).map(Some) + } else { + Ok(None) + } + })? { + return Ok(Some(Arc::clone(tsconfig))); } + cache_value = cv.parent(); } Ok(None) } @@ -1487,6 +1545,7 @@ impl ResolverGeneric { Some(b'.') => Ok(tsconfig.directory().normalize_with(specifier)), _ => self .clone_with_options(ResolveOptions { + tsconfig: None, extensions: vec![".json".into()], main_files: vec!["tsconfig.json".into()], #[cfg(feature = "yarn_pnp")] diff --git a/src/options.rs b/src/options.rs index 809d67da..6b807098 100644 --- a/src/options.rs +++ b/src/options.rs @@ -15,10 +15,10 @@ pub struct ResolveOptions { /// Current working directory, used for testing purposes. pub cwd: Option, - /// Path to TypeScript configuration file. + /// Discover tsconfig automatically or use the specified tsconfig.json path. /// /// Default `None` - pub tsconfig: Option, + pub tsconfig: Option, /// Create aliases to import or require certain modules more easily. /// @@ -472,6 +472,12 @@ impl std::fmt::Debug for Restriction { } } +#[derive(Debug, Clone)] +pub enum TsconfigDiscovery { + Auto, + Manual(TsconfigOptions), +} + /// Tsconfig Options for [ResolveOptions::tsconfig] /// /// Derived from [tsconfig-paths-webpack-plugin](https://github.com/dividab/tsconfig-paths-webpack-plugin#options) @@ -612,8 +618,8 @@ mod test { use std::path::PathBuf; use super::{ - AliasValue, EnforceExtension, ResolveOptions, Restriction, TsconfigOptions, - TsconfigReferences, + AliasValue, EnforceExtension, ResolveOptions, Restriction, TsconfigDiscovery, + TsconfigOptions, TsconfigReferences, }; #[test] @@ -634,10 +640,10 @@ mod test { #[test] fn display() { let options = ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: PathBuf::from("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), alias: vec![("a".into(), vec![AliasValue::Ignore])], alias_fields: vec![vec!["browser".into()]], condition_names: vec!["require".into()], @@ -657,7 +663,7 @@ mod test { ..ResolveOptions::default() }; - let expected = r#"tsconfig:TsconfigOptions { config_file: "tsconfig.json", references: Auto },alias:[("a", [Ignore])],alias_fields:[["browser"]],condition_names:["require"],enforce_extension:Enabled,exports_fields:[["exports"]],imports_fields:[["imports"]],extension_alias:[(".js", [".ts"])],extensions:[".js", ".json", ".node"],fallback:[("fallback", [Ignore])],fully_specified:true,main_fields:["main"],main_files:["index"],modules:["node_modules"],resolve_to_context:true,prefer_relative:true,prefer_absolute:true,restrictions:[Path("restrictions")],roots:["roots"],symlinks:true,builtin_modules:true,allow_package_exports_in_directory_resolve:true,"#; + let expected = r#"tsconfig:Manual(TsconfigOptions { config_file: "tsconfig.json", references: Auto }),alias:[("a", [Ignore])],alias_fields:[["browser"]],condition_names:["require"],enforce_extension:Enabled,exports_fields:[["exports"]],imports_fields:[["imports"]],extension_alias:[(".js", [".ts"])],extensions:[".js", ".json", ".node"],fallback:[("fallback", [Ignore])],fully_specified:true,main_fields:["main"],main_files:["index"],modules:["node_modules"],resolve_to_context:true,prefer_relative:true,prefer_absolute:true,restrictions:[Path("restrictions")],roots:["roots"],symlinks:true,builtin_modules:true,allow_package_exports_in_directory_resolve:true,"#; assert_eq!(format!("{options}"), expected); let options = ResolveOptions { diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 437e9ac3..68054156 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -24,6 +24,7 @@ mod roots; mod scoped_packages; mod simple; mod symlink; +mod tsconfig_discovery; mod tsconfig_extends; mod tsconfig_paths; mod tsconfig_project_references; diff --git a/src/tests/tsconfig_discovery.rs b/src/tests/tsconfig_discovery.rs new file mode 100644 index 00000000..19d85339 --- /dev/null +++ b/src/tests/tsconfig_discovery.rs @@ -0,0 +1,8 @@ +//! Tests for tsconfig discovery +//! +//! Tests that tsconfig.json can be auto-discovered when no explicit tsconfig option is provided. + +#[test] +fn tsconfig_discovery() { + super::tsconfig_paths::tsconfig_resolve_impl(/* tsconfig_discovery */ true); +} diff --git a/src/tests/tsconfig_extends.rs b/src/tests/tsconfig_extends.rs index a6d224da..71cf56b9 100644 --- a/src/tests/tsconfig_extends.rs +++ b/src/tests/tsconfig_extends.rs @@ -5,17 +5,19 @@ use std::path::Path; -use crate::{ResolveOptions, Resolver, TsConfig, TsconfigOptions, TsconfigReferences}; +use crate::{ + ResolveOptions, Resolver, TsConfig, TsconfigDiscovery, TsconfigOptions, TsconfigReferences, +}; #[test] fn test_extend_tsconfig() { let f = super::fixture_root().join("tsconfig/cases/extends"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -44,10 +46,10 @@ fn test_extend_tsconfig_paths() { let f = super::fixture_root().join("tsconfig/cases/extends-paths-inheritance"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), extensions: vec![".ts".into(), ".js".into()], ..ResolveOptions::default() }); @@ -62,10 +64,10 @@ fn test_extend_tsconfig_override_behavior() { let f = super::fixture_root().join("tsconfig/cases/extends-override"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -82,10 +84,10 @@ fn test_extend_tsconfig_template_variables() { let f = super::fixture_root().join("tsconfig/cases/extends-template-vars"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), extensions: vec![".ts".into(), ".js".into()], ..ResolveOptions::default() }); @@ -102,10 +104,10 @@ fn test_extend_tsconfig_missing_file() { let f = super::fixture_root().join("tsconfig/cases"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("nonexistent-tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -118,10 +120,10 @@ fn test_extend_tsconfig_multiple_inheritance() { let f = super::fixture_root().join("tsconfig/cases/extends-chain"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -139,10 +141,10 @@ fn test_extend_tsconfig_preserves_child_settings() { let f = super::fixture_root().join("tsconfig/cases/extends-preserve-child"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); diff --git a/src/tests/tsconfig_paths.rs b/src/tests/tsconfig_paths.rs index 8d2c202c..57818878 100644 --- a/src/tests/tsconfig_paths.rs +++ b/src/tests/tsconfig_paths.rs @@ -5,13 +5,12 @@ use std::path::{Path, PathBuf}; use crate::{ - JSONError, ResolveError, ResolveOptions, Resolver, TsConfig, TsconfigOptions, - TsconfigReferences, + JSONError, ResolveError, ResolveOptions, Resolver, TsConfig, TsconfigDiscovery, + TsconfigOptions, TsconfigReferences, }; // -#[test] -fn tsconfig_resolve() { +pub fn tsconfig_resolve_impl(tsconfig_discovery: bool) { let f = super::fixture_root().join("tsconfig"); #[rustfmt::skip] @@ -31,9 +30,13 @@ fn tsconfig_resolve() { for (dir, subdir, request, expected) in pass { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { - config_file: dir.join("tsconfig.json"), - references: TsconfigReferences::Auto, + tsconfig: Some(if tsconfig_discovery { + TsconfigDiscovery::Auto + } else { + TsconfigDiscovery::Manual(TsconfigOptions { + config_file: dir.join("tsconfig.json"), + references: TsconfigReferences::Auto, + }) }), extension_alias: vec![(".js".into(), vec![".js".into(), ".ts".into(), ".tsx".into()])], ..ResolveOptions::default() @@ -53,18 +56,22 @@ fn tsconfig_resolve() { ( f.join("cases/extends-not-found"), "ts-path", - f.join("cases").join("extends-not-found").join("tsconfig_json.json"), + f.join("cases").join("extends-not-found").join("tsconfig.json"), Err(ResolveError::TsconfigNotFound( - f.join("cases").join("extends-not-found").join("tsconfig_json.json"), + f.join("cases").join("extends-not-found").join("not-found"), )), ), ]; for (path, request, tsconfig, expected) in data { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { - config_file: tsconfig, - references: TsconfigReferences::Auto, + tsconfig: Some(if tsconfig_discovery { + TsconfigDiscovery::Auto + } else { + TsconfigDiscovery::Manual(TsconfigOptions { + config_file: tsconfig, + references: TsconfigReferences::Auto, + }) }), ..ResolveOptions::default() }); @@ -73,15 +80,20 @@ fn tsconfig_resolve() { } } +#[test] +pub fn tsconfig_resolve() { + tsconfig_resolve_impl(/* tsconfig_discovery */ false); +} + #[test] fn tsconfig_fallthrough() { let f = super::fixture_root().join("tsconfig"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -94,10 +106,10 @@ fn json_with_comments() { let f = super::fixture_root().join("tsconfig/cases/trailing-comma"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -110,10 +122,10 @@ fn with_bom() { let f = super::fixture_root().join("tsconfig/cases/with-bom"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -126,10 +138,10 @@ fn broken() { let f = super::fixture_root().join("tsconfig"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig_broken.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -148,10 +160,10 @@ fn empty() { let f = super::fixture_root().join("tsconfig/cases/empty"); let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -307,10 +319,10 @@ fn test_template_variable() { for (dir, tsconfig, request, expected) in pass { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: dir.join(tsconfig), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); let resolved_path = resolver.resolve(&dir, request).map(|f| f.full_path()); @@ -331,10 +343,10 @@ fn test_paths_nested_base() { for (dir, tsconfig, request, expected) in pass { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: dir.parent().unwrap().join(tsconfig), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default().with_extension(String::from(".ts")) }); let resolved_path = resolver.resolve(&dir, request).map(|f| f.full_path()); @@ -355,10 +367,10 @@ fn test_parent_base_url() { for (dir, tsconfig, request, expected) in pass { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: dir.parent().unwrap().join(tsconfig), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default().with_extension(String::from(".ts")) }); let resolved_path = resolver.resolve(&dir, request).map(|f| f.full_path()); @@ -372,7 +384,8 @@ mod windows_test { use super::super::memory_fs::MemoryFS; use crate::{ - ResolveError, ResolveOptions, ResolverGeneric, TsconfigOptions, TsconfigReferences, + ResolveError, ResolveOptions, ResolverGeneric, TsconfigDiscovery, TsconfigOptions, + TsconfigReferences, }; struct OneTest { @@ -428,10 +441,10 @@ mod windows_test { let mut options = ResolveOptions { extensions: self.extensions.clone(), - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: root.join("tsconfig.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }; if let Some(main_fields) = &self.main_fields { diff --git a/src/tests/tsconfig_project_references.rs b/src/tests/tsconfig_project_references.rs index fdf34f25..23b86a8a 100644 --- a/src/tests/tsconfig_project_references.rs +++ b/src/tests/tsconfig_project_references.rs @@ -1,6 +1,8 @@ //! Tests for tsconfig project references -use crate::{ResolveError, ResolveOptions, Resolver, TsconfigOptions, TsconfigReferences}; +use crate::{ + ResolveError, ResolveOptions, Resolver, TsconfigDiscovery, TsconfigOptions, TsconfigReferences, +}; #[test] fn auto() { @@ -9,19 +11,19 @@ fn auto() { // The following resolver's `config_file` has defined it's own paths alias which has higher priority // some cases will work without references let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); // The following resolver's `config_file` has no `paths` alias with `references` enabled let no_paths_resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app/tsconfig.nopaths.json"), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() }); @@ -79,19 +81,19 @@ fn disabled() { // The following resolver's `config_file` has defined it's own paths alias which has higher priority // some cases will work without references let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app"), references: TsconfigReferences::Disabled, - }), + })), ..ResolveOptions::default() }); // The following resolver's `config_file` has no `paths` alias with `references` enabled let no_paths_resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app/tsconfig.nopaths.json"), references: TsconfigReferences::Disabled, - }), + })), ..ResolveOptions::default() }); @@ -139,19 +141,19 @@ fn manual() { // The following resolver's `config_file` has defined it's own paths alias which has higher priority // some cases will work without references let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app"), references: TsconfigReferences::Paths(vec!["../project_a/conf.json".into()]), - }), + })), ..ResolveOptions::default() }); // The following resolver's `config_file` has no `paths` alias with `references` enabled let no_paths_resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.join("app/tsconfig.nopaths.json"), references: TsconfigReferences::Paths(vec!["../project_a/conf.json".into()]), - }), + })), ..ResolveOptions::default() }); @@ -207,10 +209,10 @@ fn self_reference() { for (config_file, reference_paths) in pass { let resolver = Resolver::new(ResolveOptions { - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: config_file.clone(), references: TsconfigReferences::Paths(reference_paths.clone()), - }), + })), ..ResolveOptions::default() }); let path = f.join("app"); @@ -229,10 +231,10 @@ fn references_with_extends() { let resolver = Resolver::new(ResolveOptions { extensions: vec![".ts".into(), ".tsx".into()], - tsconfig: Some(TsconfigOptions { + tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions { config_file: f.clone(), references: TsconfigReferences::Auto, - }), + })), ..ResolveOptions::default() });