refactor(resolver): add a EnforceExtension tri state

This commit is contained in:
Boshen 2023-08-09 16:49:34 +08:00
parent 7c5ff9e27d
commit 09761b4f8b
No known key found for this signature in database
GPG key ID: 234DA6A7079C6801
3 changed files with 30 additions and 9 deletions

View file

@ -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<Fs: FileSystem> ResolverGeneric<Fs> {
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));
}

View file

@ -38,7 +38,7 @@ pub struct ResolveOptions {
/// See <https://github.com/webpack/enhanced-resolve/pull/285>
///
/// Default None, which is the same as `Some(false)` when the above empty rule is not applied.
pub enforce_extension: Option<bool>,
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<AliasValue>)>;
@ -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 <https://github.com/webpack/enhanced-resolve/pull/285>
if self.extensions.iter().any(String::is_empty) {
self.enforce_extension = Some(true);
self.enforce_extension = EnforceExtension::Enabled;
self.extensions.retain(String::is_empty);
}
}

View file

@ -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()
})