diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-02-01 16:37:05 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-01 16:37:05 -0500 |
commit | dc854e83a4bd7c1726532502595948f604f0edc1 (patch) | |
tree | 1299eace805b8b66e389c6fb626a2acd44faff97 | |
parent | f6f76a76b2b06c6546bb00117e61f4c743d1eba6 (diff) |
fix(repl): handle @types/node not being cached in the repl (#17617)
Closes #17599
-rw-r--r-- | cli/tests/integration/repl_tests.rs | 25 | ||||
-rw-r--r-- | cli/tools/repl/session.rs | 27 |
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(()) } |