summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-11-28 17:48:56 -0500
committerGitHub <noreply@github.com>2022-11-28 17:48:56 -0500
commitd3299c2d6c036d3f016ef1abbe9c06e9b1656fd0 (patch)
tree3dfc98c52907465a20fe490b8e648d3180cfc4ba
parent2d4c46c975eb916dc622cc729a1a8d397582a76f (diff)
fix(npm): don't resolve JS files when resolving types (#16854)
Closes #16851
-rw-r--r--cli/node/mod.rs14
-rw-r--r--cli/tests/npm_tests.rs82
-rw-r--r--cli/tests/testdata/npm/no_types_cjs/main.ts7
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js6
-rw-r--r--cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json5
-rw-r--r--ext/node/resolution.rs18
6 files changed, 83 insertions, 49 deletions
diff --git a/cli/node/mod.rs b/cli/node/mod.rs
index fa6f0bdda..60b46a445 100644
--- a/cli/node/mod.rs
+++ b/cli/node/mod.rs
@@ -492,7 +492,10 @@ pub fn node_resolve(
let path = url.to_file_path().unwrap();
// todo(16370): the module kind is not correct here. I think we need
// typescript to tell us if the referrer is esm or cjs
- let path = path_to_declaration_path(path, NodeModuleKind::Esm);
+ let path = match path_to_declaration_path(path, NodeModuleKind::Esm) {
+ Some(path) => path,
+ None => return Ok(None),
+ };
ModuleSpecifier::from_file_path(path).unwrap()
}
};
@@ -532,7 +535,10 @@ pub fn node_resolve_npm_reference(
let resolved_path = match mode {
NodeResolutionMode::Execution => resolved_path,
NodeResolutionMode::Types => {
- path_to_declaration_path(resolved_path, node_module_kind)
+ match path_to_declaration_path(resolved_path, node_module_kind) {
+ Some(path) => path,
+ None => return Ok(None),
+ }
}
};
let url = ModuleSpecifier::from_file_path(resolved_path).unwrap();
@@ -794,7 +800,9 @@ fn module_resolve(
// should use the value provided by typescript instead
let declaration_path =
path_to_declaration_path(file_path, NodeModuleKind::Esm);
- Some(ModuleSpecifier::from_file_path(declaration_path).unwrap())
+ declaration_path.map(|declaration_path| {
+ ModuleSpecifier::from_file_path(declaration_path).unwrap()
+ })
} else {
Some(resolved_specifier)
}
diff --git a/cli/tests/npm_tests.rs b/cli/tests/npm_tests.rs
index 9c53fdeac..99f11ba28 100644
--- a/cli/tests/npm_tests.rs
+++ b/cli/tests/npm_tests.rs
@@ -190,19 +190,19 @@ mod npm {
});
itest!(import_map {
- args: "run --allow-read --allow-env --import-map npm/import_map/import_map.json npm/import_map/main.js",
- output: "npm/import_map/main.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
+ args: "run --allow-read --allow-env --import-map npm/import_map/import_map.json npm/import_map/main.js",
+ output: "npm/import_map/main.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ });
itest!(lock_file {
- args: "run --allow-read --allow-env --lock npm/lock_file/lock.json npm/lock_file/main.js",
- output: "npm/lock_file/main.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
- exit_code: 10,
-});
+ args: "run --allow-read --allow-env --lock npm/lock_file/lock.json npm/lock_file/main.js",
+ output: "npm/lock_file/main.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ exit_code: 10,
+ });
itest!(sub_paths {
args: "run -A --quiet npm/sub_paths/main.jsx",
@@ -296,12 +296,20 @@ mod npm {
});
itest!(types_ambient_module_import_map {
- args: "check --quiet --import-map=npm/types_ambient_module/import_map.json npm/types_ambient_module/main_import_map.ts",
- output: "npm/types_ambient_module/main_import_map.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
- exit_code: 1,
-});
+ args: "check --quiet --import-map=npm/types_ambient_module/import_map.json npm/types_ambient_module/main_import_map.ts",
+ output: "npm/types_ambient_module/main_import_map.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ exit_code: 1,
+ });
+
+ itest!(no_types_cjs {
+ args: "check --quiet npm/no_types_cjs/main.ts",
+ output_str: Some(""),
+ exit_code: 0,
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ });
itest!(no_types_in_conditional_exports {
args: "run --check --unstable npm/no_types_in_conditional_exports/main.ts",
@@ -791,20 +799,20 @@ mod npm {
}
itest!(compile_errors {
- args: "compile -A --quiet npm/cached_only/main.ts",
- output_str: Some("error: npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: npm:chalk@5\n"),
- exit_code: 1,
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
+ args: "compile -A --quiet npm/cached_only/main.ts",
+ output_str: Some("error: npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: npm:chalk@5\n"),
+ exit_code: 1,
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ });
itest!(bundle_errors {
- args: "bundle --quiet npm/esm/main.js",
- output_str: Some("error: npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: npm:chalk@5\n"),
- exit_code: 1,
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
+ args: "bundle --quiet npm/esm/main.js",
+ output_str: Some("error: npm specifiers have not yet been implemented for this sub command (https://github.com/denoland/deno/issues/15960). Found: npm:chalk@5\n"),
+ exit_code: 1,
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ });
itest!(info_chalk_display {
args: "info --quiet npm/cjs_with_deps/main.js",
@@ -832,14 +840,14 @@ mod npm {
});
itest!(info_chalk_json_node_modules_dir {
- args:
- "info --quiet --node-modules-dir --json $TESTDATA/npm/cjs_with_deps/main.js",
- output: "npm/cjs_with_deps/main_info_json.out",
- exit_code: 0,
- envs: env_vars_for_npm_tests(),
- http_server: true,
- temp_cwd: true,
-});
+ args:
+ "info --quiet --node-modules-dir --json $TESTDATA/npm/cjs_with_deps/main.js",
+ output: "npm/cjs_with_deps/main_info_json.out",
+ exit_code: 0,
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+ temp_cwd: true,
+ });
itest!(info_cli_chalk_display {
args: "info --quiet npm:chalk@4",
diff --git a/cli/tests/testdata/npm/no_types_cjs/main.ts b/cli/tests/testdata/npm/no_types_cjs/main.ts
new file mode 100644
index 000000000..32458e839
--- /dev/null
+++ b/cli/tests/testdata/npm/no_types_cjs/main.ts
@@ -0,0 +1,7 @@
+import mod from "npm:@denotest/no-types-cjs";
+
+// it actually returns a `number` and has that in its
+// jsdocs, but the jsdocs should not have been resolved so
+// this should type check just fine
+const value: string = mod();
+console.log(value);
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js b/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js
new file mode 100644
index 000000000..bb6cbdb02
--- /dev/null
+++ b/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js
@@ -0,0 +1,6 @@
+/**
+ * @return {number}
+ */
+ module.exports = function () {
+ return 5;
+};
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json b/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json
new file mode 100644
index 000000000..60b8a0285
--- /dev/null
+++ b/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "@denotest/no-types-cjs",
+ "version": "1.0.0",
+ "main": "./main.js"
+}
diff --git a/ext/node/resolution.rs b/ext/node/resolution.rs
index 6f61ebff2..f2bf2ca6f 100644
--- a/ext/node/resolution.rs
+++ b/ext/node/resolution.rs
@@ -31,7 +31,7 @@ pub enum NodeModuleKind {
pub fn path_to_declaration_path(
path: PathBuf,
referrer_kind: NodeModuleKind,
-) -> PathBuf {
+) -> Option<PathBuf> {
fn probe_extensions(
path: &Path,
referrer_kind: NodeModuleKind,
@@ -56,17 +56,17 @@ pub fn path_to_declaration_path(
|| lowercase_path.ends_with(".d.cts")
|| lowercase_path.ends_with(".d.ts")
{
- return path;
+ return Some(path);
}
if let Some(path) = probe_extensions(&path, referrer_kind) {
- return path;
+ return Some(path);
}
if path.is_dir() {
if let Some(path) = probe_extensions(&path.join("index"), referrer_kind) {
- return path;
+ return Some(path);
}
}
- path
+ None
}
/// Alternate `PathBuf::with_extension` that will handle known extensions
@@ -743,8 +743,9 @@ pub fn package_resolve(
let file_path = package_json.path.parent().unwrap().join(&package_subpath);
if conditions == TYPES_CONDITIONS {
- let declaration_path = path_to_declaration_path(file_path, referrer_kind);
- Ok(Some(declaration_path))
+ let maybe_declaration_path =
+ path_to_declaration_path(file_path, referrer_kind);
+ Ok(maybe_declaration_path)
} else {
Ok(Some(file_path))
}
@@ -813,8 +814,7 @@ pub fn legacy_main_resolve(
// a corresponding declaration file
if let Some(main) = package_json.main(referrer_kind) {
let main = package_json.path.parent().unwrap().join(main).clean();
- let path = path_to_declaration_path(main, referrer_kind);
- if path.exists() {
+ if let Some(path) = path_to_declaration_path(main, referrer_kind) {
return Ok(Some(path));
}
}