diff --git a/crates/oxc_resolver/src/lib.rs b/crates/oxc_resolver/src/lib.rs index 0a04f36a9..d3ec9bb9d 100644 --- a/crates/oxc_resolver/src/lib.rs +++ b/crates/oxc_resolver/src/lib.rs @@ -46,7 +46,7 @@ use crate::{ pub use crate::{ error::{JSONError, ResolveError}, file_system::{FileMetadata, FileSystem}, - options::{Alias, AliasValue, ResolveOptions, Restriction}, + options::{Alias, AliasValue, EnforceExtension, ResolveOptions, Restriction}, resolution::Resolution, }; @@ -394,7 +394,7 @@ impl ResolverGeneric { for main_file in &self.options.main_files { let main_path = cached_path.path().join(main_file); let cached_path = self.cache.value(&main_path); - if self.options.enforce_extension == Some(false) { + if self.options.enforce_extension.is_disabled() { if let Some(path) = self.load_alias_or_file(&cached_path, ctx)? { return Ok(Some(path)); } diff --git a/crates/oxc_resolver/src/options.rs b/crates/oxc_resolver/src/options.rs index 5aa4d0461..caa4c6a46 100644 --- a/crates/oxc_resolver/src/options.rs +++ b/crates/oxc_resolver/src/options.rs @@ -38,7 +38,7 @@ pub struct ResolveOptions { /// See /// /// Default None, which is the same as `Some(false)` when the above empty rule is not applied. - pub enforce_extension: Option, + pub enforce_extension: EnforceExtension, /// An object which maps extension to extension aliases. /// @@ -108,6 +108,27 @@ pub struct ResolveOptions { pub symlinks: bool, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum EnforceExtension { + Auto, + Enabled, + Disabled, +} + +impl EnforceExtension { + pub fn is_auto(&self) -> bool { + *self == Self::Auto + } + + pub fn is_enabled(&self) -> bool { + *self == Self::Enabled + } + + pub fn is_disabled(&self) -> bool { + *self == Self::Disabled + } +} + /// Alias for [ResolveOptions::alias] and [ResolveOptions::fallback]. pub type Alias = Vec<(String, Vec)>; @@ -134,7 +155,7 @@ impl Default for ResolveOptions { alias_fields: vec![], condition_names: vec![], description_files: vec!["package.json".into()], - enforce_extension: None, + enforce_extension: EnforceExtension::Auto, extension_alias: vec![], extensions: vec![".js".into(), ".json".into(), ".node".into()], fallback: vec![], @@ -153,12 +174,12 @@ impl Default for ResolveOptions { impl ResolveOptions { pub(crate) fn sanitize(mut self) -> Self { - if self.enforce_extension.is_none() { - self.enforce_extension = Some(false); + if self.enforce_extension == EnforceExtension::Auto { + self.enforce_extension = EnforceExtension::Disabled; // Set `enforceExtension` to `true` when [ResolveOptions::extensions] contains an empty string. // See if self.extensions.iter().any(String::is_empty) { - self.enforce_extension = Some(true); + self.enforce_extension = EnforceExtension::Enabled; self.extensions.retain(String::is_empty); } } diff --git a/crates/oxc_resolver/src/tests/extensions.rs b/crates/oxc_resolver/src/tests/extensions.rs index a5d19686d..45803b698 100644 --- a/crates/oxc_resolver/src/tests/extensions.rs +++ b/crates/oxc_resolver/src/tests/extensions.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; -use crate::{Resolution, ResolveError, ResolveOptions, Resolver}; +use crate::{EnforceExtension, Resolution, ResolveError, ResolveOptions, Resolver}; fn fixture() -> PathBuf { super::fixture().join("extensions") @@ -65,7 +65,7 @@ fn respect_enforce_extension() { let f = fixture(); let resolved = Resolver::new(ResolveOptions { - enforce_extension: Some(false), + enforce_extension: EnforceExtension::Disabled, extensions: vec![".ts".into(), String::new(), ".js".into()], ..ResolveOptions::default() })