mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
refactor(resolver): add a EnforceExtension tri state
This commit is contained in:
parent
7c5ff9e27d
commit
09761b4f8b
3 changed files with 30 additions and 9 deletions
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
})
|
||||
|
|
|
|||
Loading…
Reference in a new issue