summaryrefslogtreecommitdiff
path: root/cli/tools
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools')
-rw-r--r--cli/tools/bench.rs48
-rw-r--r--cli/tools/repl/mod.rs42
-rw-r--r--cli/tools/repl/session.rs36
-rw-r--r--cli/tools/run.rs38
-rw-r--r--cli/tools/test.rs93
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?;