summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/lsp/documents.rs4
-rw-r--r--cli/node/mod.rs46
-rw-r--r--cli/npm/resolvers/common.rs3
-rw-r--r--cli/npm/resolvers/global.rs6
-rw-r--r--cli/npm/resolvers/local.rs8
-rw-r--r--cli/npm/resolvers/mod.rs9
-rw-r--r--cli/proc_state.rs5
-rw-r--r--cli/tests/npm_tests.rs8
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts1
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs3
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json10
-rw-r--r--cli/tests/testdata/npm/types_exports_import_types/main.out4
-rw-r--r--cli/tests/testdata/npm/types_exports_import_types/main.ts4
-rw-r--r--cli/tsc/mod.rs4
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()