diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/lsp/documents.rs | 4 | ||||
-rw-r--r-- | cli/node/mod.rs | 46 | ||||
-rw-r--r-- | cli/npm/resolvers/common.rs | 3 | ||||
-rw-r--r-- | cli/npm/resolvers/global.rs | 6 | ||||
-rw-r--r-- | cli/npm/resolvers/local.rs | 8 | ||||
-rw-r--r-- | cli/npm/resolvers/mod.rs | 9 | ||||
-rw-r--r-- | cli/proc_state.rs | 5 | ||||
-rw-r--r-- | cli/tests/npm_tests.rs | 8 | ||||
-rw-r--r-- | cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts | 1 | ||||
-rw-r--r-- | cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs | 3 | ||||
-rw-r--r-- | cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json | 10 | ||||
-rw-r--r-- | cli/tests/testdata/npm/types_exports_import_types/main.out | 4 | ||||
-rw-r--r-- | cli/tests/testdata/npm/types_exports_import_types/main.ts | 4 | ||||
-rw-r--r-- | cli/tsc/mod.rs | 4 |
14 files changed, 74 insertions, 41 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index fb0540bcd..e922662ad 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -14,7 +14,6 @@ use crate::file_fetcher::SUPPORTED_SCHEMES; use crate::node; use crate::node::node_resolve_npm_reference; use crate::node::NodeResolution; -use crate::node::NodeResolutionMode; use crate::npm::NpmPackageReference; use crate::npm::NpmPackageReq; use crate::npm::NpmPackageResolver; @@ -33,6 +32,7 @@ use deno_core::url; use deno_core::ModuleSpecifier; use deno_graph::GraphImport; use deno_graph::Resolved; +use deno_runtime::deno_node::NodeResolutionMode; use once_cell::sync::Lazy; use std::collections::BTreeMap; use std::collections::HashMap; @@ -957,7 +957,7 @@ impl Documents { node::node_resolve( &specifier, referrer, - node::NodeResolutionMode::Types, + NodeResolutionMode::Types, npm_resolver, ) .ok() diff --git a/cli/node/mod.rs b/cli/node/mod.rs index 60b46a445..15e9a3702 100644 --- a/cli/node/mod.rs +++ b/cli/node/mod.rs @@ -27,12 +27,12 @@ use deno_runtime::deno_node::package_imports_resolve; use deno_runtime::deno_node::package_resolve; use deno_runtime::deno_node::path_to_declaration_path; use deno_runtime::deno_node::NodeModuleKind; +use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::PackageJson; use deno_runtime::deno_node::PathClean; use deno_runtime::deno_node::RequireNpmResolver; use deno_runtime::deno_node::DEFAULT_CONDITIONS; use deno_runtime::deno_node::NODE_GLOBAL_THIS_NAME; -use deno_runtime::deno_node::TYPES_CONDITIONS; use once_cell::sync::Lazy; use regex::Regex; @@ -108,12 +108,6 @@ impl NodeResolution { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum NodeResolutionMode { - Execution, - Types, -} - struct NodeModulePolyfill { /// Name of the module like "assert" or "timers/promises" name: &'static str, @@ -480,8 +474,13 @@ pub fn node_resolve( } } - let conditions = mode_conditions(mode); - let url = module_resolve(specifier, referrer, conditions, npm_resolver)?; + let url = module_resolve( + specifier, + referrer, + DEFAULT_CONDITIONS, + mode, + npm_resolver, + )?; let url = match url { Some(url) => url, None => return Ok(None), @@ -522,7 +521,8 @@ pub fn node_resolve_npm_reference( .unwrap_or_else(|| ".".to_string()), &package_folder, node_module_kind, - mode_conditions(mode), + DEFAULT_CONDITIONS, + mode, npm_resolver, ) .with_context(|| { @@ -548,13 +548,6 @@ pub fn node_resolve_npm_reference( Ok(Some(resolve_response)) } -fn mode_conditions(mode: NodeResolutionMode) -> &'static [&'static str] { - match mode { - NodeResolutionMode::Execution => DEFAULT_CONDITIONS, - NodeResolutionMode::Types => TYPES_CONDITIONS, - } -} - pub fn node_resolve_binary_export( pkg_req: &NpmPackageReq, bin_name: Option<&str>, @@ -669,6 +662,7 @@ fn package_config_resolve( package_dir: &Path, referrer_kind: NodeModuleKind, conditions: &[&str], + mode: NodeResolutionMode, npm_resolver: &dyn RequireNpmResolver, ) -> Result<Option<PathBuf>, AnyError> { let package_json_path = package_dir.join("package.json"); @@ -683,15 +677,15 @@ fn package_config_resolve( &referrer, referrer_kind, conditions, + mode, npm_resolver, ); match result { Ok(found) => return Ok(Some(found)), Err(exports_err) => { - let is_types = conditions == TYPES_CONDITIONS; - if is_types && package_subpath == "." { + if mode.is_types() && package_subpath == "." { if let Ok(Some(path)) = - legacy_main_resolve(&package_config, referrer_kind, conditions) + legacy_main_resolve(&package_config, referrer_kind, mode) { return Ok(Some(path)); } else { @@ -703,7 +697,7 @@ fn package_config_resolve( } } if package_subpath == "." { - return legacy_main_resolve(&package_config, referrer_kind, conditions); + return legacy_main_resolve(&package_config, referrer_kind, mode); } Ok(Some(package_dir.join(package_subpath))) @@ -789,12 +783,13 @@ fn module_resolve( specifier: &str, referrer: &ModuleSpecifier, conditions: &[&str], + mode: NodeResolutionMode, npm_resolver: &dyn RequireNpmResolver, ) -> Result<Option<ModuleSpecifier>, AnyError> { // note: if we're here, the referrer is an esm module let url = if should_be_treated_as_relative_or_absolute_path(specifier) { let resolved_specifier = referrer.join(specifier)?; - if conditions == TYPES_CONDITIONS { + if mode.is_types() { let file_path = to_file_path(&resolved_specifier); // todo(dsherret): the node module kind is not correct and we // should use the value provided by typescript instead @@ -813,6 +808,7 @@ fn module_resolve( referrer, NodeModuleKind::Esm, conditions, + mode, npm_resolver, ) .map(|p| ModuleSpecifier::from_file_path(p).unwrap())?, @@ -825,6 +821,7 @@ fn module_resolve( referrer, NodeModuleKind::Esm, conditions, + mode, npm_resolver, )? .map(|p| ModuleSpecifier::from_file_path(p).unwrap()) @@ -956,6 +953,7 @@ pub fn translate_cjs_to_esm( // FIXME(bartlomieju): check if these conditions are okay, probably // should be `deno-require`, because `deno` is already used in `esm_resolver.rs` &["deno", "require", "default"], + NodeResolutionMode::Execution, npm_resolver, )?; let reexport_specifier = @@ -1026,6 +1024,7 @@ fn resolve( specifier: &str, referrer: &ModuleSpecifier, conditions: &[&str], + mode: NodeResolutionMode, npm_resolver: &dyn RequireNpmResolver, ) -> Result<PathBuf, AnyError> { if specifier.starts_with('/') { @@ -1050,7 +1049,7 @@ fn resolve( let module_dir = npm_resolver.resolve_package_folder_from_package( package_specifier.as_str(), &referrer_path, - conditions, + mode, )?; let package_json_path = module_dir.join("package.json"); @@ -1066,6 +1065,7 @@ fn resolve( referrer, NodeModuleKind::Esm, conditions, + mode, npm_resolver, ); } diff --git a/cli/npm/resolvers/common.rs b/cli/npm/resolvers/common.rs index e3acef3f5..4f2a6d82a 100644 --- a/cli/npm/resolvers/common.rs +++ b/cli/npm/resolvers/common.rs @@ -10,6 +10,7 @@ use deno_core::error::AnyError; use deno_core::futures; use deno_core::futures::future::BoxFuture; use deno_core::url::Url; +use deno_runtime::deno_node::NodeResolutionMode; use crate::args::Lockfile; use crate::npm::cache::should_sync_download; @@ -29,7 +30,7 @@ pub trait InnerNpmPackageResolver: Send + Sync { &self, name: &str, referrer: &ModuleSpecifier, - conditions: &[&str], + mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError>; fn resolve_package_folder_from_specifier( diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs index 46cfec48f..07df80d30 100644 --- a/cli/npm/resolvers/global.rs +++ b/cli/npm/resolvers/global.rs @@ -12,8 +12,8 @@ use deno_core::error::AnyError; use deno_core::futures::future::BoxFuture; use deno_core::futures::FutureExt; use deno_core::url::Url; +use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::PackageJson; -use deno_runtime::deno_node::TYPES_CONDITIONS; use crate::args::Lockfile; use crate::npm::resolution::NpmResolution; @@ -76,7 +76,7 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver { &self, name: &str, referrer: &ModuleSpecifier, - conditions: &[&str], + mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError> { let referrer_pkg_id = self .cache @@ -84,7 +84,7 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver { let pkg_result = self .resolution .resolve_package_from_package(name, &referrer_pkg_id); - if conditions == TYPES_CONDITIONS && !name.starts_with("@types/") { + if mode.is_types() && !name.starts_with("@types/") { // When doing types resolution, the package must contain a "types" // entry, or else it will then search for a @types package if let Ok(pkg) = pkg_result { diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index 3a9e97433..69f275c70 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -19,8 +19,8 @@ use deno_core::futures::future::BoxFuture; use deno_core::futures::FutureExt; use deno_core::url::Url; use deno_runtime::deno_core::futures; +use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::PackageJson; -use deno_runtime::deno_node::TYPES_CONDITIONS; use tokio::task::JoinHandle; use crate::args::Lockfile; @@ -152,7 +152,7 @@ impl InnerNpmPackageResolver for LocalNpmPackageResolver { &self, name: &str, referrer: &ModuleSpecifier, - conditions: &[&str], + mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError> { let local_path = self.resolve_folder_for_specifier(referrer)?; let package_root_path = self.resolve_package_root(&local_path); @@ -162,7 +162,7 @@ impl InnerNpmPackageResolver for LocalNpmPackageResolver { let sub_dir = join_package_name(current_folder, name); if sub_dir.is_dir() { // if doing types resolution, only resolve the package if it specifies a types property - if conditions == TYPES_CONDITIONS && !name.starts_with("@types/") { + if mode.is_types() && !name.starts_with("@types/") { let package_json = PackageJson::load_skip_read_permission( sub_dir.join("package.json"), )?; @@ -175,7 +175,7 @@ impl InnerNpmPackageResolver for LocalNpmPackageResolver { } // if doing type resolution, check for the existance of a @types package - if conditions == TYPES_CONDITIONS && !name.starts_with("@types/") { + if mode.is_types() && !name.starts_with("@types/") { let sub_dir = join_package_name(current_folder, &types_package_name(name)); if sub_dir.is_dir() { diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs index 3cc695523..d30775dd4 100644 --- a/cli/npm/resolvers/mod.rs +++ b/cli/npm/resolvers/mod.rs @@ -11,6 +11,7 @@ use deno_core::error::custom_error; use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use deno_core::serde_json; +use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::PathClean; use deno_runtime::deno_node::RequireNpmResolver; use global::GlobalNpmPackageResolver; @@ -197,11 +198,11 @@ impl NpmPackageResolver { &self, name: &str, referrer: &ModuleSpecifier, - conditions: &[&str], + mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError> { let path = self .inner - .resolve_package_folder_from_package(name, referrer, conditions)?; + .resolve_package_folder_from_package(name, referrer, mode)?; log::debug!("Resolved {} from {} to {}", name, referrer, path.display()); Ok(path) } @@ -330,10 +331,10 @@ impl RequireNpmResolver for NpmPackageResolver { &self, specifier: &str, referrer: &std::path::Path, - conditions: &[&str], + mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError> { let referrer = path_to_specifier(referrer)?; - self.resolve_package_folder_from_package(specifier, &referrer, conditions) + self.resolve_package_folder_from_package(specifier, &referrer, mode) } fn resolve_package_folder_from_path( diff --git a/cli/proc_state.rs b/cli/proc_state.rs index 9fcac2fe0..4dce3cdba 100644 --- a/cli/proc_state.rs +++ b/cli/proc_state.rs @@ -53,6 +53,7 @@ use deno_graph::source::Resolver; use deno_graph::ModuleKind; use deno_graph::Resolved; use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel; +use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_tls::rustls::RootCertStore; use deno_runtime::deno_web::BlobStore; use deno_runtime::inspector_server::InspectorServer; @@ -514,7 +515,7 @@ impl ProcState { .handle_node_resolve_result(node::node_resolve( specifier, &referrer, - node::NodeResolutionMode::Execution, + NodeResolutionMode::Execution, &self.npm_resolver, )) .with_context(|| { @@ -547,7 +548,7 @@ impl ProcState { return self .handle_node_resolve_result(node::node_resolve_npm_reference( &reference, - node::NodeResolutionMode::Execution, + NodeResolutionMode::Execution, &self.npm_resolver, )) .with_context(|| format!("Could not resolve '{}'.", reference)); diff --git a/cli/tests/npm_tests.rs b/cli/tests/npm_tests.rs index c845f8f4a..39dd1d549 100644 --- a/cli/tests/npm_tests.rs +++ b/cli/tests/npm_tests.rs @@ -327,6 +327,14 @@ mod npm { exit_code: 0, }); + itest!(types_exports_import_types { + args: "run --check=all npm/types_exports_import_types/main.ts", + output: "npm/types_exports_import_types/main.out", + envs: env_vars_for_npm_tests(), + http_server: true, + exit_code: 0, + }); + itest!(types_no_types_entry { args: "run --check=all npm/types_no_types_entry/main.ts", output: "npm/types_no_types_entry/main.out", diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts new file mode 100644 index 000000000..2341a14f0 --- /dev/null +++ b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts @@ -0,0 +1 @@ +export function getValue(): 5; diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs new file mode 100644 index 000000000..358b4b09e --- /dev/null +++ b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs @@ -0,0 +1,3 @@ +export function getValue() { + return 5; +} diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json new file mode 100644 index 000000000..202a2c784 --- /dev/null +++ b/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json @@ -0,0 +1,10 @@ +{ + "name": "@denotest/types-exports-import-types", + "version": "1.0.0", + "exports": { + "node": { + "types": "./dist/main.d.ts", + "import": "./dist/main.mjs" + } + } +} diff --git a/cli/tests/testdata/npm/types_exports_import_types/main.out b/cli/tests/testdata/npm/types_exports_import_types/main.out new file mode 100644 index 000000000..6f6cb8366 --- /dev/null +++ b/cli/tests/testdata/npm/types_exports_import_types/main.out @@ -0,0 +1,4 @@ +Download http://localhost:4545/npm/registry/@denotest/types-exports-import-types +Download http://localhost:4545/npm/registry/@denotest/types-exports-import-types/1.0.0.tgz +Check file://[WILDCARD]/types_exports_import_types/main.ts +5 diff --git a/cli/tests/testdata/npm/types_exports_import_types/main.ts b/cli/tests/testdata/npm/types_exports_import_types/main.ts new file mode 100644 index 000000000..00b69c438 --- /dev/null +++ b/cli/tests/testdata/npm/types_exports_import_types/main.ts @@ -0,0 +1,4 @@ +import { getValue } from "npm:@denotest/types-exports-import-types"; + +const result: 5 = getValue(); +console.log(result); diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs index 38ec2d263..a8eb15c19 100644 --- a/cli/tsc/mod.rs +++ b/cli/tsc/mod.rs @@ -6,7 +6,6 @@ use crate::graph_util::ModuleEntry; use crate::node; use crate::node::node_resolve_npm_reference; use crate::node::NodeResolution; -use crate::node::NodeResolutionMode; use crate::npm::NpmPackageReference; use crate::npm::NpmPackageResolver; use crate::util::checksum; @@ -33,6 +32,7 @@ use deno_core::OpState; use deno_core::RuntimeOptions; use deno_core::Snapshot; use deno_graph::Resolved; +use deno_runtime::deno_node::NodeResolutionMode; use once_cell::sync::Lazy; use std::borrow::Cow; use std::collections::HashMap; @@ -619,7 +619,7 @@ fn op_resolve( node::node_resolve( specifier, &referrer, - node::NodeResolutionMode::Types, + NodeResolutionMode::Types, npm_resolver, ) .ok() |