refactor: make import and require conditions an override in ConditionResolver (#29622)
Some checks are pending
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / build wasm32 (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions

This commit is contained in:
David Sherret 2025-06-05 12:18:03 -04:00 committed by GitHub
parent 22a615c7eb
commit 512a0072b1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 65 additions and 63 deletions

View file

@ -54,8 +54,7 @@ use deno_runtime::permissions::RuntimePermissionDescriptorParser;
use deno_runtime::FeatureChecker; use deno_runtime::FeatureChecker;
use node_resolver::analyze::NodeCodeTranslator; use node_resolver::analyze::NodeCodeTranslator;
use node_resolver::cache::NodeResolutionThreadLocalCache; use node_resolver::cache::NodeResolutionThreadLocalCache;
use node_resolver::ConditionResolver; use node_resolver::NodeConditionOptions;
use node_resolver::ConditionResolverOptions;
use node_resolver::NodeResolverOptions; use node_resolver::NodeResolverOptions;
use once_cell::sync::OnceCell; use once_cell::sync::OnceCell;
use sys_traits::EnvCurrentDir; use sys_traits::EnvCurrentDir;
@ -1212,16 +1211,15 @@ impl CliFactory {
IsCjsResolutionMode::Disabled IsCjsResolutionMode::Disabled
}, },
node_resolver_options: NodeResolverOptions { node_resolver_options: NodeResolverOptions {
condition_resolver: ConditionResolver::new( conditions: NodeConditionOptions {
ConditionResolverOptions { conditions: options
conditions: options .node_conditions()
.node_conditions() .iter()
.iter() .map(|c| Cow::Owned(c.clone()))
.map(|c| Cow::Owned(c.clone())) .collect(),
.collect(), import_conditions_override: None,
..Default::default() require_conditions_override: None,
}, },
),
typescript_version: Some( typescript_version: Some(
deno_semver::Version::parse_standard( deno_semver::Version::parse_standard(
deno_lib::version::DENO_VERSION_INFO.typescript, deno_lib::version::DENO_VERSION_INFO.typescript,

View file

@ -1113,7 +1113,7 @@ impl<'a> ResolverFactory<'a> {
self.pkg_json_resolver.clone(), self.pkg_json_resolver.clone(),
self.node_resolution_sys.clone(), self.node_resolution_sys.clone(),
NodeResolverOptions { NodeResolverOptions {
condition_resolver: Default::default(), conditions: Default::default(),
typescript_version: Some( typescript_version: Some(
deno_semver::Version::parse_standard( deno_semver::Version::parse_standard(
deno_lib::version::DENO_VERSION_INFO.typescript, deno_lib::version::DENO_VERSION_INFO.typescript,

View file

@ -20,7 +20,7 @@ use deno_config::workspace::WorkspaceDirectoryEmptyOptions;
use deno_config::workspace::WorkspaceDiscoverError; use deno_config::workspace::WorkspaceDiscoverError;
use deno_config::workspace::WorkspaceDiscoverOptions; use deno_config::workspace::WorkspaceDiscoverOptions;
use deno_config::workspace::WorkspaceDiscoverStart; use deno_config::workspace::WorkspaceDiscoverStart;
use deno_npm::NpmSystemInfo; pub use deno_npm::NpmSystemInfo;
use deno_path_util::fs::canonicalize_path_maybe_not_exists; use deno_path_util::fs::canonicalize_path_maybe_not_exists;
use deno_path_util::normalize_path; use deno_path_util::normalize_path;
use futures::future::FutureExt; use futures::future::FutureExt;

View file

@ -32,8 +32,7 @@ pub use path::UrlOrPathRef;
pub use resolution::parse_npm_pkg_name; pub use resolution::parse_npm_pkg_name;
pub use resolution::resolve_specifier_into_node_modules; pub use resolution::resolve_specifier_into_node_modules;
pub use resolution::types_package_name; pub use resolution::types_package_name;
pub use resolution::ConditionResolver; pub use resolution::NodeConditionOptions;
pub use resolution::ConditionResolverOptions;
pub use resolution::NodeResolution; pub use resolution::NodeResolution;
pub use resolution::NodeResolutionKind; pub use resolution::NodeResolutionKind;
pub use resolution::NodeResolver; pub use resolution::NodeResolver;
@ -41,5 +40,5 @@ pub use resolution::NodeResolverOptions;
pub use resolution::NodeResolverRc; pub use resolution::NodeResolverRc;
pub use resolution::NodeResolverSys; pub use resolution::NodeResolverSys;
pub use resolution::ResolutionMode; pub use resolution::ResolutionMode;
pub use resolution::DEFAULT_CONDITIONS; pub use resolution::IMPORT_CONDITIONS;
pub use resolution::REQUIRE_CONDITIONS; pub use resolution::REQUIRE_CONDITIONS;

View file

@ -61,7 +61,7 @@ use crate::NpmPackageFolderResolver;
use crate::PackageJsonResolverRc; use crate::PackageJsonResolverRc;
use crate::PathClean; use crate::PathClean;
pub static DEFAULT_CONDITIONS: &[Cow<'static, str>] = &[ pub static IMPORT_CONDITIONS: &[Cow<'static, str>] = &[
Cow::Borrowed("deno"), Cow::Borrowed("deno"),
Cow::Borrowed("node"), Cow::Borrowed("node"),
Cow::Borrowed("import"), Cow::Borrowed("import"),
@ -70,57 +70,62 @@ pub static REQUIRE_CONDITIONS: &[Cow<'static, str>] =
&[Cow::Borrowed("require"), Cow::Borrowed("node")]; &[Cow::Borrowed("require"), Cow::Borrowed("node")];
static TYPES_ONLY_CONDITIONS: &[Cow<'static, str>] = &[Cow::Borrowed("types")]; static TYPES_ONLY_CONDITIONS: &[Cow<'static, str>] = &[Cow::Borrowed("types")];
#[derive(Debug, Clone)] #[derive(Debug, Default, Clone)]
pub struct ConditionResolverOptions { pub struct NodeConditionOptions {
pub conditions: Vec<Cow<'static, str>>, pub conditions: Vec<Cow<'static, str>>,
pub default_import_conditions: Vec<Cow<'static, str>>, /// Provide a value to override the default import conditions.
pub default_require_conditions: Vec<Cow<'static, str>>, ///
} /// Defaults to `["deno", "node", "import"]`
pub import_conditions_override: Option<Vec<Cow<'static, str>>>,
impl Default for ConditionResolverOptions { /// Provide a value to override the default require conditions.
fn default() -> Self { ///
Self { /// Defaults to `["require", "node"]`
conditions: Vec::new(), pub require_conditions_override: Option<Vec<Cow<'static, str>>>,
default_import_conditions: DEFAULT_CONDITIONS.to_vec(),
default_require_conditions: REQUIRE_CONDITIONS.to_vec(),
}
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct ConditionResolver { struct ConditionResolver {
import_conditions: Vec<Cow<'static, str>>, import_conditions: Cow<'static, [Cow<'static, str>]>,
require_conditions: Vec<Cow<'static, str>>, require_conditions: Cow<'static, [Cow<'static, str>]>,
}
impl Default for ConditionResolver {
fn default() -> Self {
Self::new(Default::default())
}
} }
impl ConditionResolver { impl ConditionResolver {
pub fn new(options: ConditionResolverOptions) -> Self { pub fn new(options: NodeConditionOptions) -> Self {
if options.conditions.is_empty() { fn combine_conditions(
// Fast path for no custom conditions. user_conditions: Cow<'_, [Cow<'static, str>]>,
return Self { override_default: Option<Vec<Cow<'static, str>>>,
import_conditions: options.default_import_conditions, default_conditions: &'static [Cow<'static, str>],
require_conditions: options.default_require_conditions, ) -> Cow<'static, [Cow<'static, str>]> {
}; if user_conditions.is_empty() {
Cow::Borrowed(default_conditions)
} else {
let default_conditions = override_default
.map(Cow::Owned)
.unwrap_or(Cow::Borrowed(default_conditions));
let mut new =
Vec::with_capacity(user_conditions.len() + default_conditions.len());
let mut append =
|conditions: Cow<'_, [Cow<'static, str>]>| match conditions {
Cow::Borrowed(conditions) => new.extend(conditions.iter().cloned()),
Cow::Owned(conditions) => new.extend(conditions),
};
append(user_conditions);
append(default_conditions);
Cow::Owned(new)
}
} }
Self { Self {
import_conditions: options import_conditions: combine_conditions(
.conditions Cow::Borrowed(&options.conditions),
.iter() options.import_conditions_override,
.chain(&options.default_import_conditions) IMPORT_CONDITIONS,
.cloned() ),
.collect(), require_conditions: combine_conditions(
require_conditions: options Cow::Owned(options.conditions),
.conditions options.require_conditions_override,
.iter() REQUIRE_CONDITIONS,
.chain(&options.default_require_conditions) ),
.cloned()
.collect(),
} }
} }
@ -144,7 +149,7 @@ pub enum ResolutionMode {
impl ResolutionMode { impl ResolutionMode {
pub fn default_conditions(&self) -> &'static [Cow<'static, str>] { pub fn default_conditions(&self) -> &'static [Cow<'static, str>] {
match self { match self {
ResolutionMode::Import => DEFAULT_CONDITIONS, ResolutionMode::Import => IMPORT_CONDITIONS,
ResolutionMode::Require => REQUIRE_CONDITIONS, ResolutionMode::Require => REQUIRE_CONDITIONS,
} }
} }
@ -234,7 +239,7 @@ enum ResolvedMethod {
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone)]
pub struct NodeResolverOptions { pub struct NodeResolverOptions {
pub condition_resolver: ConditionResolver, pub conditions: NodeConditionOptions,
/// TypeScript version to use for typesVersions resolution and /// TypeScript version to use for typesVersions resolution and
/// `types@req` exports resolution. /// `types@req` exports resolution.
pub typescript_version: Option<Version>, pub typescript_version: Option<Version>,
@ -302,7 +307,7 @@ impl<
npm_pkg_folder_resolver, npm_pkg_folder_resolver,
pkg_json_resolver, pkg_json_resolver,
sys, sys,
condition_resolver: options.condition_resolver, condition_resolver: ConditionResolver::new(options.conditions),
typescript_version: options.typescript_version, typescript_version: options.typescript_version,
package_resolution_lookup_cache: None, package_resolution_lookup_cache: None,
} }