summaryrefslogtreecommitdiff
path: root/cli/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/main.rs')
-rw-r--r--cli/main.rs439
1 files changed, 2 insertions, 437 deletions
diff --git a/cli/main.rs b/cli/main.rs
index e535b70bd..b24c61a9b 100644
--- a/cli/main.rs
+++ b/cli/main.rs
@@ -1,440 +1,5 @@
-// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-#[macro_use]
-extern crate lazy_static;
-#[macro_use]
-extern crate log;
-#[macro_use]
-extern crate futures;
-#[macro_use]
-extern crate serde_json;
-extern crate clap;
-extern crate deno;
-extern crate deno_cli_snapshots;
-extern crate indexmap;
-#[cfg(unix)]
-extern crate nix;
-extern crate rand;
-extern crate serde;
-extern crate serde_derive;
-extern crate url;
-
-#[cfg(test)]
-mod integration_tests;
-
-mod colors;
-pub mod compilers;
-pub mod deno_dir;
-pub mod deno_error;
-pub mod diagnostics;
-mod disk_cache;
-mod file_fetcher;
-pub mod flags;
-pub mod fmt_errors;
-mod fs;
-mod global_timer;
-mod http_body;
-mod http_util;
-mod import_map;
-pub mod msg;
-pub mod ops;
-pub mod permissions;
-mod progress;
-mod repl;
-pub mod resolve_addr;
-pub mod resources;
-mod shell;
-mod signal;
-pub mod source_maps;
-mod startup_data;
-pub mod state;
-mod tokio_read;
-mod tokio_util;
-mod tokio_write;
-pub mod version;
-pub mod worker;
-
-use crate::progress::Progress;
-use crate::state::ThreadSafeState;
-use crate::worker::Worker;
-use deno::v8_set_flags;
-use deno::ErrBox;
-use deno::ModuleSpecifier;
-use flags::DenoFlags;
-use flags::DenoSubcommand;
-use futures::lazy;
-use futures::Future;
-use log::Level;
-use log::Metadata;
-use log::Record;
-use std::env;
-
-static LOGGER: Logger = Logger;
-
-struct Logger;
-
-impl log::Log for Logger {
- fn enabled(&self, metadata: &Metadata) -> bool {
- metadata.level() <= log::max_level()
- }
-
- fn log(&self, record: &Record) {
- if self.enabled(record.metadata()) {
- let mut target = record.target().to_string();
-
- if let Some(line_no) = record.line() {
- target.push_str(":");
- target.push_str(&line_no.to_string());
- }
-
- println!("{} RS - {} - {}", record.level(), target, record.args());
- }
- }
- fn flush(&self) {}
-}
-
-fn print_err_and_exit(err: ErrBox) {
- eprintln!("{}", err.to_string());
- std::process::exit(1);
-}
-
-fn js_check(r: Result<(), ErrBox>) {
- if let Err(err) = r {
- print_err_and_exit(err);
- }
-}
-
-fn create_worker_and_state(
- flags: DenoFlags,
- argv: Vec<String>,
-) -> (Worker, ThreadSafeState) {
- use crate::shell::Shell;
- use std::sync::Arc;
- use std::sync::Mutex;
- let shell = Arc::new(Mutex::new(Shell::new()));
- let progress = Progress::new();
- progress.set_callback(move |_done, _completed, _total, status, msg| {
- if !status.is_empty() {
- let mut s = shell.lock().unwrap();
- s.status(status, msg).expect("shell problem");
- }
- });
- // TODO(kevinkassimo): maybe make include_deno_namespace also configurable?
- let state = ThreadSafeState::new(flags, argv, progress, true)
- .map_err(print_err_and_exit)
- .unwrap();
- let worker = Worker::new(
- "main".to_string(),
- startup_data::deno_isolate_init(),
- state.clone(),
- );
-
- (worker, state)
-}
-
-fn types_command() {
- let content = deno_cli_snapshots::get_asset("lib.deno_runtime.d.ts").unwrap();
- println!("{}", content);
-}
-
-fn print_cache_info(worker: Worker) {
- let state = worker.state;
-
- println!(
- "{} {:?}",
- colors::bold("DENO_DIR location:".to_string()),
- state.dir.root
- );
- println!(
- "{} {:?}",
- colors::bold("Remote modules cache:".to_string()),
- state.dir.deps_cache.location
- );
- println!(
- "{} {:?}",
- colors::bold("TypeScript compiler cache:".to_string()),
- state.dir.gen_cache.location
- );
-}
-
-pub fn print_file_info(
- worker: Worker,
- module_specifier: &ModuleSpecifier,
-) -> impl Future<Item = Worker, Error = ()> {
- let state_ = worker.state.clone();
- let module_specifier_ = module_specifier.clone();
-
- state_
- .file_fetcher
- .fetch_source_file_async(&module_specifier)
- .map_err(|err| println!("{}", err))
- .and_then(|out| {
- println!(
- "{} {}",
- colors::bold("local:".to_string()),
- out.filename.to_str().unwrap()
- );
-
- println!(
- "{} {}",
- colors::bold("type:".to_string()),
- msg::enum_name_media_type(out.media_type)
- );
-
- state_
- .clone()
- .fetch_compiled_module(&module_specifier_)
- .map_err(|e| {
- debug!("compiler error exiting!");
- eprintln!("\n{}", e.to_string());
- std::process::exit(1);
- })
- .and_then(move |compiled| {
- if out.media_type == msg::MediaType::TypeScript
- || (out.media_type == msg::MediaType::JavaScript
- && state_.ts_compiler.compile_js)
- {
- let compiled_source_file = state_
- .ts_compiler
- .get_compiled_source_file(&out.url)
- .unwrap();
-
- println!(
- "{} {}",
- colors::bold("compiled:".to_string()),
- compiled_source_file.filename.to_str().unwrap(),
- );
- }
-
- if let Ok(source_map) = state_
- .clone()
- .ts_compiler
- .get_source_map_file(&module_specifier_)
- {
- println!(
- "{} {}",
- colors::bold("map:".to_string()),
- source_map.filename.to_str().unwrap()
- );
- }
-
- if let Some(deps) =
- worker.state.modules.lock().unwrap().deps(&compiled.name)
- {
- println!("{}{}", colors::bold("deps:\n".to_string()), deps.name);
- if let Some(ref depsdeps) = deps.deps {
- for d in depsdeps {
- println!("{}", d);
- }
- }
- } else {
- println!(
- "{} cannot retrieve full dependency graph",
- colors::bold("deps:".to_string()),
- );
- }
- Ok(worker)
- })
- })
-}
-
-fn info_command(flags: DenoFlags, argv: Vec<String>) {
- let (mut worker, state) = create_worker_and_state(flags, argv.clone());
-
- // If it was just "deno info" print location of caches and exit
- if argv.len() == 1 {
- return print_cache_info(worker);
- }
-
- let main_module = state.main_module().unwrap();
- let main_future = lazy(move || {
- // Setup runtime.
- js_check(worker.execute("denoMain()"));
- debug!("main_module {}", main_module);
-
- worker
- .execute_mod_async(&main_module, true)
- .map_err(print_err_and_exit)
- .and_then(move |()| print_file_info(worker, &main_module))
- .and_then(|worker| {
- worker.then(|result| {
- js_check(result);
- Ok(())
- })
- })
- });
- tokio_util::run(main_future);
-}
-
-fn fetch_command(flags: DenoFlags, argv: Vec<String>) {
- let (mut worker, state) = create_worker_and_state(flags, argv.clone());
-
- let main_module = state.main_module().unwrap();
- let main_future = lazy(move || {
- // Setup runtime.
- js_check(worker.execute("denoMain()"));
- debug!("main_module {}", main_module);
-
- worker.execute_mod_async(&main_module, true).then(|result| {
- js_check(result);
- Ok(())
- })
- });
- tokio_util::run(main_future);
-}
-
-fn eval_command(flags: DenoFlags, argv: Vec<String>) {
- let (mut worker, state) = create_worker_and_state(flags, argv);
- // Wrap provided script in async function so asynchronous methods
- // work. This is required until top-level await is not supported.
- let js_source = format!(
- "async function _topLevelWrapper(){{
- {}
- }}
- _topLevelWrapper();
- ",
- &state.argv[1]
- );
-
- let main_future = lazy(move || {
- js_check(worker.execute("denoMain()"));
- // ATM imports in `deno eval` are not allowed
- // TODO Support ES modules once Worker supports evaluating anonymous modules.
- js_check(worker.execute(&js_source));
- worker.then(|result| {
- js_check(result);
- Ok(())
- })
- });
- tokio_util::run(main_future);
-}
-
-fn xeval_command(flags: DenoFlags, argv: Vec<String>) {
- let xeval_replvar = flags.xeval_replvar.clone().unwrap();
- let (mut worker, state) = create_worker_and_state(flags, argv);
- let xeval_source = format!(
- "window._xevalWrapper = async function ({}){{
- {}
- }}",
- &xeval_replvar, &state.argv[1]
- );
-
- let main_future = lazy(move || {
- // Setup runtime.
- js_check(worker.execute(&xeval_source));
- js_check(worker.execute("denoMain()"));
- worker
- .then(|result| {
- js_check(result);
- Ok(())
- })
- .map_err(print_err_and_exit)
- });
- tokio_util::run(main_future);
-}
-
-fn bundle_command(flags: DenoFlags, argv: Vec<String>) {
- let (mut _worker, state) = create_worker_and_state(flags, argv);
-
- let main_module = state.main_module().unwrap();
- assert!(state.argv.len() >= 3);
- let out_file = state.argv[2].clone();
- debug!(">>>>> bundle_async START");
- let bundle_future = state
- .ts_compiler
- .bundle_async(state.clone(), main_module.to_string(), out_file)
- .map_err(|err| {
- debug!("diagnostics returned, exiting!");
- eprintln!("");
- print_err_and_exit(err);
- })
- .and_then(move |_| {
- debug!(">>>>> bundle_async END");
- Ok(())
- });
- tokio_util::run(bundle_future);
-}
-
-fn run_repl(flags: DenoFlags, argv: Vec<String>) {
- let (mut worker, _state) = create_worker_and_state(flags, argv);
-
- // REPL situation.
- let main_future = lazy(move || {
- // Setup runtime.
- js_check(worker.execute("denoMain()"));
- worker
- .then(|result| {
- js_check(result);
- Ok(())
- })
- .map_err(|(err, _worker): (ErrBox, Worker)| print_err_and_exit(err))
- });
- tokio_util::run(main_future);
-}
-
-fn run_script(flags: DenoFlags, argv: Vec<String>) {
- let use_current_thread = flags.current_thread;
- let (mut worker, state) = create_worker_and_state(flags, argv);
-
- let main_module = state.main_module().unwrap();
- // Normal situation of executing a module.
- let main_future = lazy(move || {
- // Setup runtime.
- js_check(worker.execute("denoMain()"));
- debug!("main_module {}", main_module);
-
- worker
- .execute_mod_async(&main_module, false)
- .and_then(move |()| {
- js_check(worker.execute("window.dispatchEvent(new Event('load'))"));
- worker.then(|result| {
- js_check(result);
- Ok(())
- })
- })
- .map_err(print_err_and_exit)
- });
-
- if use_current_thread {
- tokio_util::run_on_current_thread(main_future);
- } else {
- tokio_util::run(main_future);
- }
-}
-
-fn version_command() {
- println!("deno: {}", version::DENO);
- println!("v8: {}", version::v8());
- println!("typescript: {}", version::TYPESCRIPT);
-}
+extern crate deno_cli;
fn main() {
- #[cfg(windows)]
- ansi_term::enable_ansi_support().ok(); // For Windows 10
-
- log::set_logger(&LOGGER).unwrap();
- let args: Vec<String> = env::args().collect();
- let (flags, subcommand, argv) = flags::flags_from_vec(args);
-
- if let Some(ref v8_flags) = flags.v8_flags {
- v8_set_flags(v8_flags.clone());
- }
-
- let log_level = match flags.log_level {
- Some(level) => level,
- None => Level::Warn,
- };
- log::set_max_level(log_level.to_level_filter());
-
- match subcommand {
- DenoSubcommand::Bundle => bundle_command(flags, argv),
- DenoSubcommand::Completions => {}
- DenoSubcommand::Eval => eval_command(flags, argv),
- DenoSubcommand::Fetch => fetch_command(flags, argv),
- DenoSubcommand::Info => info_command(flags, argv),
- DenoSubcommand::Repl => run_repl(flags, argv),
- DenoSubcommand::Run => run_script(flags, argv),
- DenoSubcommand::Types => types_command(),
- DenoSubcommand::Version => version_command(),
- DenoSubcommand::Xeval => xeval_command(flags, argv),
- }
+ deno_cli::main();
}