diff options
Diffstat (limited to 'cli/tools')
-rw-r--r-- | cli/tools/bench.rs | 48 | ||||
-rw-r--r-- | cli/tools/repl/mod.rs | 42 | ||||
-rw-r--r-- | cli/tools/repl/session.rs | 36 | ||||
-rw-r--r-- | cli/tools/run.rs | 38 | ||||
-rw-r--r-- | cli/tools/test.rs | 93 |
5 files changed, 153 insertions, 104 deletions
diff --git a/cli/tools/bench.rs b/cli/tools/bench.rs index 5f467bc6e..88e19dd70 100644 --- a/cli/tools/bench.rs +++ b/cli/tools/bench.rs @@ -15,7 +15,7 @@ use crate::util::file_watcher::ResolutionResult; use crate::util::fs::collect_specifiers; use crate::util::path::is_supported_ext; use crate::version::get_user_agent; -use crate::worker::create_custom_worker; +use crate::worker::CliMainWorkerFactory; use deno_core::error::generic_error; use deno_core::error::AnyError; @@ -48,6 +48,7 @@ use tokio::sync::mpsc::UnboundedSender; struct BenchSpecifierOptions { filter: TestFilter, json: bool, + log_level: Option<log::Level>, } #[derive(Debug, Clone, Eq, PartialEq, Deserialize)] @@ -434,20 +435,20 @@ async fn check_specifiers( /// Run a single specifier as an executable bench module. async fn bench_specifier( - ps: ProcState, + worker_factory: &CliMainWorkerFactory, permissions: Permissions, specifier: ModuleSpecifier, sender: UnboundedSender<BenchEvent>, filter: TestFilter, ) -> Result<(), AnyError> { - let mut worker = create_custom_worker( - &ps, - specifier.clone(), - PermissionsContainer::new(permissions), - vec![ops::bench::deno_bench::init_ops(sender.clone())], - Default::default(), - ) - .await?; + let mut worker = worker_factory + .create_custom_worker( + specifier.clone(), + PermissionsContainer::new(permissions), + vec![ops::bench::deno_bench::init_ops(sender.clone())], + Default::default(), + ) + .await?; // We execute the main module as a side module so that import.meta.main is not set. worker.execute_side_module_possibly_with_npm().await?; @@ -508,26 +509,29 @@ async fn bench_specifier( /// Test a collection of specifiers with test modes concurrently. async fn bench_specifiers( - ps: &ProcState, + worker_factory: Arc<CliMainWorkerFactory>, permissions: &Permissions, specifiers: Vec<ModuleSpecifier>, options: BenchSpecifierOptions, ) -> Result<(), AnyError> { - let log_level = ps.options.log_level(); - let (sender, mut receiver) = unbounded_channel::<BenchEvent>(); - + let log_level = options.log_level; let option_for_handles = options.clone(); let join_handles = specifiers.into_iter().map(move |specifier| { - let ps = ps.clone(); + let worker_factory = worker_factory.clone(); let permissions = permissions.clone(); let specifier = specifier; let sender = sender.clone(); let options = option_for_handles.clone(); tokio::task::spawn_blocking(move || { - let future = - bench_specifier(ps, permissions, specifier, sender, options.filter); + let future = bench_specifier( + &worker_factory, + permissions, + specifier, + sender, + options.filter, + ); run_local(future) }) }); @@ -650,13 +654,16 @@ pub async fn run_benchmarks( return Ok(()); } + let log_level = ps.options.log_level(); + let worker_factory = Arc::new(ps.into_cli_main_worker_factory()); bench_specifiers( - &ps, + worker_factory, &permissions, specifiers, BenchSpecifierOptions { filter: TestFilter::from_flag(&bench_options.filter), json: bench_options.json, + log_level, }, ) .await?; @@ -809,13 +816,16 @@ pub async fn run_benchmarks_with_watch( return Ok(()); } + let log_level = ps.options.log_level(); + let worker_factory = Arc::new(ps.into_cli_main_worker_factory()); bench_specifiers( - &ps, + worker_factory, permissions, specifiers, BenchSpecifierOptions { filter: TestFilter::from_flag(&bench_options.filter), json: bench_options.json, + log_level, }, ) .await?; diff --git a/cli/tools/repl/mod.rs b/cli/tools/repl/mod.rs index a6cc71637..bfba62752 100644 --- a/cli/tools/repl/mod.rs +++ b/cli/tools/repl/mod.rs @@ -1,10 +1,11 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use crate::args::CliOptions; use crate::args::Flags; use crate::args::ReplFlags; use crate::colors; +use crate::file_fetcher::FileFetcher; use crate::proc_state::ProcState; -use crate::worker::create_main_worker; use deno_core::error::AnyError; use deno_runtime::permissions::Permissions; use deno_runtime::permissions::PermissionsContainer; @@ -65,14 +66,14 @@ async fn read_line_and_poll( } async fn read_eval_file( - ps: &ProcState, + cli_options: &CliOptions, + file_fetcher: &FileFetcher, eval_file: &str, ) -> Result<String, AnyError> { let specifier = - deno_core::resolve_url_or_path(eval_file, ps.options.initial_cwd())?; + deno_core::resolve_url_or_path(eval_file, cli_options.initial_cwd())?; - let file = ps - .file_fetcher + let file = file_fetcher .fetch(&specifier, PermissionsContainer::allow_all()) .await?; @@ -82,17 +83,24 @@ async fn read_eval_file( pub async fn run(flags: Flags, repl_flags: ReplFlags) -> Result<i32, AnyError> { let ps = ProcState::from_flags(flags).await?; let main_module = ps.options.resolve_main_module()?; - let mut worker = create_main_worker( - &ps, - main_module, - PermissionsContainer::new(Permissions::from_options( - &ps.options.permissions_options(), - )?), - ) - .await?; + let permissions = PermissionsContainer::new(Permissions::from_options( + &ps.options.permissions_options(), + )?); + let cli_options = ps.options.clone(); + let npm_resolver = ps.npm_resolver.clone(); + let resolver = ps.resolver.clone(); + let dir = ps.dir.clone(); + let file_fetcher = ps.file_fetcher.clone(); + let worker_factory = ps.into_cli_main_worker_factory(); + + let mut worker = worker_factory + .create_main_worker(main_module, permissions) + .await?; worker.setup_repl().await?; let worker = worker.into_main_worker(); - let mut repl_session = ReplSession::initialize(ps.clone(), worker).await?; + let mut repl_session = + ReplSession::initialize(&cli_options, npm_resolver, resolver, worker) + .await?; let mut rustyline_channel = rustyline_channel(); let helper = EditorHelper { @@ -100,12 +108,12 @@ pub async fn run(flags: Flags, repl_flags: ReplFlags) -> Result<i32, AnyError> { sync_sender: rustyline_channel.0, }; - let history_file_path = ps.dir.repl_history_file_path(); + let history_file_path = dir.repl_history_file_path(); let editor = ReplEditor::new(helper, history_file_path)?; if let Some(eval_files) = repl_flags.eval_files { for eval_file in eval_files { - match read_eval_file(&ps, &eval_file).await { + match read_eval_file(&cli_options, &file_fetcher, &eval_file).await { Ok(eval_source) => { let output = repl_session .evaluate_line_and_get_output(&eval_source) @@ -132,7 +140,7 @@ pub async fn run(flags: Flags, repl_flags: ReplFlags) -> Result<i32, AnyError> { // Doing this manually, instead of using `log::info!` because these messages // are supposed to go to stdout, not stderr. - if !ps.options.is_quiet() { + if !cli_options.is_quiet() { println!("Deno {}", crate::version::deno()); println!("exit using ctrl+d, ctrl+c, or close()"); if repl_flags.is_default_command { diff --git a/cli/tools/repl/session.rs b/cli/tools/repl/session.rs index 7fc251362..b2645097c 100644 --- a/cli/tools/repl/session.rs +++ b/cli/tools/repl/session.rs @@ -1,8 +1,12 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use std::sync::Arc; + +use crate::args::CliOptions; use crate::colors; use crate::lsp::ReplLanguageServer; -use crate::ProcState; +use crate::npm::CliNpmResolver; +use crate::resolver::CliGraphResolver; use deno_ast::swc::ast as swc_ast; use deno_ast::swc::visit::noop_visit_type; @@ -117,7 +121,9 @@ struct TsEvaluateResponse { } pub struct ReplSession { - proc_state: ProcState, + has_node_modules_dir: bool, + npm_resolver: Arc<CliNpmResolver>, + resolver: Arc<CliGraphResolver>, pub worker: MainWorker, session: LocalInspectorSession, pub context_id: u64, @@ -132,7 +138,9 @@ pub struct ReplSession { impl ReplSession { pub async fn initialize( - proc_state: ProcState, + cli_options: &CliOptions, + npm_resolver: Arc<CliNpmResolver>, + resolver: Arc<CliGraphResolver>, mut worker: MainWorker, ) -> Result<Self, AnyError> { let language_server = ReplLanguageServer::new_initialized().await?; @@ -171,14 +179,14 @@ impl ReplSession { } assert_ne!(context_id, 0); - let referrer = deno_core::resolve_path( - "./$deno$repl.ts", - proc_state.options.initial_cwd(), - ) - .unwrap(); + let referrer = + deno_core::resolve_path("./$deno$repl.ts", cli_options.initial_cwd()) + .unwrap(); let mut repl_session = ReplSession { - proc_state, + has_node_modules_dir: cli_options.has_node_modules_dir(), + npm_resolver, + resolver, worker, session, context_id, @@ -487,7 +495,6 @@ impl ReplSession { .iter() .flat_map(|i| { self - .proc_state .resolver .resolve(i, &self.referrer) .ok() @@ -506,22 +513,17 @@ impl ReplSession { if !self.has_initialized_node_runtime { deno_node::initialize_runtime( &mut self.worker.js_runtime, - self.proc_state.options.has_node_modules_dir(), + self.has_node_modules_dir, None, )?; self.has_initialized_node_runtime = true; } - self - .proc_state - .npm_resolver - .add_package_reqs(npm_imports) - .await?; + self.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?; diff --git a/cli/tools/run.rs b/cli/tools/run.rs index 7f4b5c8f7..6515ebde6 100644 --- a/cli/tools/run.rs +++ b/cli/tools/run.rs @@ -13,7 +13,6 @@ use crate::args::Flags; use crate::file_fetcher::File; use crate::proc_state::ProcState; use crate::util; -use crate::worker::create_main_worker; pub async fn run_script(flags: Flags) -> Result<i32, AnyError> { if !flags.has_permission() && flags.has_permission_in_argv() { @@ -48,7 +47,10 @@ To grant permissions, set them before the script argument. For example: let permissions = PermissionsContainer::new(Permissions::from_options( &ps.options.permissions_options(), )?); - let mut worker = create_main_worker(&ps, main_module, permissions).await?; + let worker_factory = ps.into_cli_main_worker_factory(); + let mut worker = worker_factory + .create_main_worker(main_module, permissions) + .await?; let exit_code = worker.run().await?; Ok(exit_code) @@ -58,15 +60,9 @@ pub async fn run_from_stdin(flags: Flags) -> Result<i32, AnyError> { let ps = ProcState::from_flags(flags).await?; let main_module = ps.options.resolve_main_module()?; - let mut worker = create_main_worker( - &ps, - main_module.clone(), - PermissionsContainer::new(Permissions::from_options( - &ps.options.permissions_options(), - )?), - ) - .await?; - + let permissions = PermissionsContainer::new(Permissions::from_options( + &ps.options.permissions_options(), + )?); let mut source = Vec::new(); std::io::stdin().read_to_end(&mut source)?; // Create a dummy source file. @@ -75,13 +71,17 @@ pub async fn run_from_stdin(flags: Flags) -> Result<i32, AnyError> { maybe_types: None, media_type: MediaType::TypeScript, source: String::from_utf8(source)?.into(), - specifier: main_module, + specifier: main_module.clone(), maybe_headers: None, }; // Save our fake file into file fetcher cache // to allow module access by TS compiler ps.file_fetcher.insert_cached(source_file); + let worker_factory = ps.into_cli_main_worker_factory(); + let mut worker = worker_factory + .create_main_worker(main_module, permissions) + .await?; let exit_code = worker.run().await?; Ok(exit_code) } @@ -102,7 +102,10 @@ async fn run_with_watch(flags: Flags) -> Result<i32, AnyError> { let permissions = PermissionsContainer::new(Permissions::from_options( &ps.options.permissions_options(), )?); - let worker = create_main_worker(&ps, main_module, permissions).await?; + let worker_factory = ps.into_cli_main_worker_factory(); + let worker = worker_factory + .create_main_worker(main_module, permissions) + .await?; worker.run_for_watcher().await?; Ok(()) @@ -132,8 +135,6 @@ pub async fn eval_command( let permissions = PermissionsContainer::new(Permissions::from_options( &ps.options.permissions_options(), )?); - let mut worker = - create_main_worker(&ps, main_module.clone(), permissions).await?; // Create a dummy source file. let source_code = if eval_flags.print { format!("console.log({})", eval_flags.code) @@ -147,13 +148,18 @@ pub async fn eval_command( maybe_types: None, media_type: MediaType::Unknown, source: String::from_utf8(source_code)?.into(), - specifier: main_module, + specifier: main_module.clone(), maybe_headers: None, }; // Save our fake file into file fetcher cache // to allow module access by TS compiler. ps.file_fetcher.insert_cached(file); + + let mut worker = ps + .into_cli_main_worker_factory() + .create_main_worker(main_module, permissions) + .await?; let exit_code = worker.run().await?; Ok(exit_code) } diff --git a/cli/tools/test.rs b/cli/tools/test.rs index 62a104733..3bc0e79aa 100644 --- a/cli/tools/test.rs +++ b/cli/tools/test.rs @@ -17,7 +17,7 @@ use crate::util::fs::collect_specifiers; use crate::util::path::get_extension; use crate::util::path::is_supported_ext; use crate::util::path::mapped_specifier_for_tsc; -use crate::worker::create_custom_worker; +use crate::worker::CliMainWorkerFactory; use deno_ast::swc::common::comments::CommentKind; use deno_ast::MediaType; @@ -336,10 +336,18 @@ pub struct TestSummary { } #[derive(Debug, Clone)] -struct TestSpecifierOptions { +struct TestSpecifiersOptions { concurrent_jobs: NonZeroUsize, fail_fast: Option<NonZeroUsize>, - filter: TestFilter, + log_level: Option<log::Level>, + specifier: TestSpecifierOptions, +} + +#[derive(Debug, Clone)] +pub struct TestSpecifierOptions { + pub shuffle: Option<u64>, + pub filter: TestFilter, + pub trace_ops: bool, } impl TestSummary { @@ -907,30 +915,30 @@ pub fn format_test_error(js_error: &JsError) -> String { /// Test a single specifier as documentation containing test programs, an executable test module or /// both. pub async fn test_specifier( - ps: &ProcState, + worker_factory: &CliMainWorkerFactory, permissions: Permissions, specifier: ModuleSpecifier, mut sender: TestEventSender, fail_fast_tracker: FailFastTracker, - filter: TestFilter, + options: &TestSpecifierOptions, ) -> Result<(), AnyError> { if fail_fast_tracker.should_stop() { return Ok(()); } let stdout = StdioPipe::File(sender.stdout()); let stderr = StdioPipe::File(sender.stderr()); - let mut worker = create_custom_worker( - ps, - specifier.clone(), - PermissionsContainer::new(permissions), - vec![ops::testing::deno_test::init_ops(sender.clone())], - Stdio { - stdin: StdioPipe::Inherit, - stdout, - stderr, - }, - ) - .await?; + let mut worker = worker_factory + .create_custom_worker( + specifier.clone(), + PermissionsContainer::new(permissions), + vec![ops::testing::deno_test::init_ops(sender.clone())], + Stdio { + stdin: StdioPipe::Inherit, + stdout, + stderr, + }, + ) + .await?; let mut coverage_collector = worker.maybe_setup_coverage_collector().await?; @@ -951,7 +959,7 @@ pub async fn test_specifier( } let mut worker = worker.into_main_worker(); - if ps.options.trace_ops() { + if options.trace_ops { worker.js_runtime.execute_script_static( located_script_name!(), "Deno[Deno.internal].enableOpCallTracing();", @@ -971,9 +979,9 @@ pub async fn test_specifier( let tests = if used_only { only } else { no_only }; let mut tests = tests .into_iter() - .filter(|(d, _)| filter.includes(&d.name)) + .filter(|(d, _)| options.filter.includes(&d.name)) .collect::<Vec<_>>(); - if let Some(seed) = ps.options.shuffle_tests() { + if let Some(seed) = options.shuffle { tests.shuffle(&mut SmallRng::seed_from_u64(seed)); } sender.send(TestEvent::Plan(TestPlan { @@ -1288,13 +1296,12 @@ static HAS_TEST_RUN_SIGINT_HANDLER: AtomicBool = AtomicBool::new(false); /// Test a collection of specifiers with test modes concurrently. async fn test_specifiers( - ps: &ProcState, + worker_factory: Arc<CliMainWorkerFactory>, permissions: &Permissions, specifiers: Vec<ModuleSpecifier>, - options: TestSpecifierOptions, + options: TestSpecifiersOptions, ) -> Result<(), AnyError> { - let log_level = ps.options.log_level(); - let specifiers = if let Some(seed) = ps.options.shuffle_tests() { + let specifiers = if let Some(seed) = options.specifier.shuffle { let mut rng = SmallRng::seed_from_u64(seed); let mut specifiers = specifiers; specifiers.sort(); @@ -1316,19 +1323,19 @@ async fn test_specifiers( HAS_TEST_RUN_SIGINT_HANDLER.store(true, Ordering::Relaxed); let join_handles = specifiers.into_iter().map(move |specifier| { - let ps = ps.clone(); + let worker_factory = worker_factory.clone(); let permissions = permissions.clone(); let sender = sender.clone(); - let options = options.clone(); let fail_fast_tracker = FailFastTracker::new(options.fail_fast); + let specifier_options = options.specifier.clone(); tokio::task::spawn_blocking(move || { run_local(test_specifier( - &ps, + &worker_factory, permissions, specifier, sender.clone(), fail_fast_tracker, - options.filter, + &specifier_options, )) }) }); @@ -1339,7 +1346,7 @@ async fn test_specifiers( let mut reporter = Box::new(PrettyTestReporter::new( concurrent_jobs.get() > 1, - log_level != Some(Level::Error), + options.log_level != Some(Level::Error), )); let handler = { @@ -1626,6 +1633,7 @@ pub async fn run_tests( // file would have impact on other files, which is undesirable. let permissions = Permissions::from_options(&ps.options.permissions_options())?; + let log_level = ps.options.log_level(); let specifiers_with_mode = fetch_specifiers_with_test_mode( &ps, @@ -1644,8 +1652,10 @@ pub async fn run_tests( return Ok(()); } + let worker_factory = Arc::new(ps.into_cli_main_worker_factory()); + test_specifiers( - &ps, + worker_factory, &permissions, specifiers_with_mode .into_iter() @@ -1654,10 +1664,15 @@ pub async fn run_tests( _ => Some(s), }) .collect(), - TestSpecifierOptions { + TestSpecifiersOptions { concurrent_jobs: test_options.concurrent_jobs, fail_fast: test_options.fail_fast, - filter: TestFilter::from_flag(&test_options.filter), + log_level, + specifier: TestSpecifierOptions { + filter: TestFilter::from_flag(&test_options.filter), + shuffle: test_options.shuffle, + trace_ops: test_options.trace_ops, + }, }, ) .await?; @@ -1676,6 +1691,7 @@ pub async fn run_tests_with_watch( let permissions = Permissions::from_options(&ps.options.permissions_options())?; let no_check = ps.options.type_check_mode() == TypeCheckMode::None; + let log_level = ps.options.log_level(); let ps = RefCell::new(ps); @@ -1816,8 +1832,10 @@ pub async fn run_tests_with_watch( return Ok(()); } + let worker_factory = Arc::new(ps.into_cli_main_worker_factory()); + test_specifiers( - &ps, + worker_factory, permissions, specifiers_with_mode .into_iter() @@ -1826,10 +1844,15 @@ pub async fn run_tests_with_watch( _ => Some(s), }) .collect(), - TestSpecifierOptions { + TestSpecifiersOptions { concurrent_jobs: test_options.concurrent_jobs, fail_fast: test_options.fail_fast, - filter: TestFilter::from_flag(&test_options.filter), + log_level, + specifier: TestSpecifierOptions { + filter: TestFilter::from_flag(&test_options.filter), + shuffle: test_options.shuffle, + trace_ops: test_options.trace_ops, + }, }, ) .await?; |