summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-02-01 16:37:05 -0500
committerGitHub <noreply@github.com>2023-02-01 16:37:05 -0500
commitdc854e83a4bd7c1726532502595948f604f0edc1 (patch)
tree1299eace805b8b66e389c6fb626a2acd44faff97
parentf6f76a76b2b06c6546bb00117e61f4c743d1eba6 (diff)
fix(repl): handle @types/node not being cached in the repl (#17617)
Closes #17599
-rw-r--r--cli/tests/integration/repl_tests.rs25
-rw-r--r--cli/tools/repl/session.rs27
2 files changed, 45 insertions, 7 deletions
diff --git a/cli/tests/integration/repl_tests.rs b/cli/tests/integration/repl_tests.rs
index 30d91bc1c..f69f71398 100644
--- a/cli/tests/integration/repl_tests.rs
+++ b/cli/tests/integration/repl_tests.rs
@@ -4,6 +4,7 @@ use test_util as util;
use test_util::assert_contains;
use test_util::assert_ends_with;
use test_util::assert_not_contains;
+use util::TempDir;
#[test]
fn pty_multiline() {
@@ -146,7 +147,6 @@ fn pty_complete_expression() {
console.write_line("close();");
let output = console.read_all_output();
assert_contains!(output, "Display all");
- assert_contains!(output, "core");
assert_contains!(output, "args");
assert_contains!(output, "exit");
assert_contains!(output, "symlink");
@@ -895,6 +895,11 @@ fn repl_with_quiet_flag() {
fn npm_packages() {
let mut env_vars = util::env_vars_for_npm_tests();
env_vars.push(("NO_COLOR".to_owned(), "1".to_owned()));
+ let temp_dir = TempDir::new();
+ env_vars.push((
+ "DENO_DIR".to_string(),
+ temp_dir.path().to_string_lossy().to_string(),
+ ));
{
let (out, err) = util::run_and_collect_output_with_args(
@@ -947,7 +952,7 @@ fn npm_packages() {
true,
vec!["repl", "--quiet", "--allow-read", "--allow-env"],
Some(vec![r#"import foo from "npm:asdfawe52345asdf""#]),
- Some(env_vars),
+ Some(env_vars.clone()),
true,
);
@@ -957,4 +962,20 @@ fn npm_packages() {
);
assert!(err.is_empty());
}
+
+ {
+ let (out, err) = util::run_and_collect_output_with_args(
+ true,
+ vec!["repl", "--quiet", "--allow-read", "--allow-env"],
+ Some(vec![
+ "import path from 'node:path';",
+ "path.isGlob('asdf') ? 'yes' : 'no'",
+ ]),
+ Some(env_vars.clone()),
+ true,
+ );
+
+ assert_contains!(out, "no");
+ assert!(err.is_empty());
+ }
}
diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs
index e288ab0e6..0e40a1e32 100644
--- a/cli/tools/repl/session.rs
+++ b/cli/tools/repl/session.rs
@@ -398,7 +398,9 @@ impl ReplSession {
scope_analysis: false,
})?;
- self.check_for_npm_imports(&parsed_module.program()).await?;
+ self
+ .check_for_npm_or_node_imports(&parsed_module.program())
+ .await?;
let transpiled_src = parsed_module
.transpile(&deno_ast::EmitOptions {
@@ -428,14 +430,14 @@ impl ReplSession {
})
}
- async fn check_for_npm_imports(
+ async fn check_for_npm_or_node_imports(
&mut self,
program: &swc_ast::Program,
) -> Result<(), AnyError> {
let mut collector = ImportCollector::new();
program.visit_with(&mut collector);
- let npm_imports = collector
+ let resolved_imports = collector
.imports
.iter()
.flat_map(|i| {
@@ -445,11 +447,17 @@ impl ReplSession {
.as_ref()
.and_then(|resolver| resolver.resolve(i, &self.referrer).ok())
.or_else(|| ModuleSpecifier::parse(i).ok())
- .and_then(|url| NpmPackageReference::from_specifier(&url).ok())
})
+ .collect::<Vec<_>>();
+
+ let npm_imports = resolved_imports
+ .iter()
+ .flat_map(|url| NpmPackageReference::from_specifier(url).ok())
.map(|r| r.req)
.collect::<Vec<_>>();
- if !npm_imports.is_empty() {
+ let has_node_specifier =
+ resolved_imports.iter().any(|url| url.scheme() == "node");
+ if !npm_imports.is_empty() || has_node_specifier {
if !self.has_initialized_node_runtime {
self.proc_state.prepare_node_std_graph().await?;
crate::node::initialize_runtime(
@@ -465,6 +473,15 @@ impl ReplSession {
.npm_resolver
.add_package_reqs(npm_imports)
.await?;
+
+ // prevent messages in the repl about @types/node not being cached
+ if has_node_specifier {
+ self
+ .proc_state
+ .npm_resolver
+ .inject_synthetic_types_node_package()
+ .await?;
+ }
}
Ok(())
}