diff options
-rw-r--r-- | cli/flags.rs | 82 | ||||
-rw-r--r-- | cli/main.rs | 32 | ||||
-rw-r--r-- | tests/029_eval.out | 1 | ||||
-rw-r--r-- | tests/029_eval.test | 2 | ||||
-rw-r--r-- | website/manual.md | 1 |
5 files changed, 75 insertions, 43 deletions
diff --git a/cli/flags.rs b/cli/flags.rs index 9f6a978b2..3fd3f91fb 100644 --- a/cli/flags.rs +++ b/cli/flags.rs @@ -25,6 +25,7 @@ pub struct DenoFlags { pub prefetch: bool, pub info: bool, pub fmt: bool, + pub eval: bool, } impl<'a> From<ArgMatches<'a>> for DenoFlags { @@ -82,28 +83,26 @@ impl<'a> From<ArgMatches<'a>> for DenoFlags { if matches.is_present("fmt") { flags.fmt = true; } + if matches.is_present("eval") { + flags.eval = true; + } flags } } -#[cfg_attr(feature = "cargo-clippy", allow(stutter))] -pub fn set_flags( - args: Vec<String>, -) -> Result<(DenoFlags, Vec<String>), String> { - let app_settings: Vec<AppSettings> = vec![ - AppSettings::AllowExternalSubcommands, - AppSettings::DisableHelpSubcommand, - ]; - - let env_variables_help = "ENVIRONMENT VARIABLES: +static ENV_VARIABLES_HELP: &str = "ENVIRONMENT VARIABLES: DENO_DIR Set deno's base directory NO_COLOR Set to disable color"; - let clap_app = App::new("deno") +fn create_cli_app<'a, 'b>() -> App<'a, 'b> { + let cli_app = App::new("deno") + .bin_name("deno") .global_settings(&[AppSettings::ColorNever]) - .settings(&app_settings[..]) - .after_help(env_variables_help) + .settings(&[ + AppSettings::AllowExternalSubcommands, + AppSettings::DisableHelpSubcommand, + ]).after_help(ENV_VARIABLES_HELP) .arg( Arg::with_name("version") .short("v") @@ -171,18 +170,25 @@ pub fn set_flags( .long("prefetch") .help("Prefetch the dependencies"), ).subcommand( - // TODO(bartlomieju): version is not handled properly SubCommand::with_name("info") + .setting(AppSettings::DisableVersion) .about("Show source file related info") .arg(Arg::with_name("file").takes_value(true).required(true)), ).subcommand( - // TODO(bartlomieju): version is not handled properly - SubCommand::with_name("fmt").about("Format files").arg( - Arg::with_name("files") - .takes_value(true) - .multiple(true) - .required(true), - ), + SubCommand::with_name("eval") + .setting(AppSettings::DisableVersion) + .about("Eval script") + .arg(Arg::with_name("code").takes_value(true).required(true)), + ).subcommand( + SubCommand::with_name("fmt") + .setting(AppSettings::DisableVersion) + .about("Format files") + .arg( + Arg::with_name("files") + .takes_value(true) + .multiple(true) + .required(true), + ), ).subcommand( // this is a fake subcommand - it's used in conjunction with // AppSettings:AllowExternalSubcommand to treat it as an @@ -190,43 +196,49 @@ pub fn set_flags( SubCommand::with_name("<script>").about("Script to run"), ); - let matches = clap_app.get_matches_from(args); + cli_app +} - // TODO(bartomieju): compatibility with old "opts" approach - to be refactored - let mut rest: Vec<String> = vec![String::from("deno")]; +#[cfg_attr(feature = "cargo-clippy", allow(stutter))] +pub fn set_flags( + args: Vec<String>, +) -> Result<(DenoFlags, Vec<String>), String> { + let mut rest_argv: Vec<String> = vec!["deno".to_string()]; + let cli_app = create_cli_app(); + let matches = cli_app.get_matches_from(args); match matches.subcommand() { + ("eval", Some(info_match)) => { + let code: &str = info_match.value_of("code").unwrap(); + rest_argv.extend(vec![code.to_string()]); + } ("info", Some(info_match)) => { - // TODO(bartlomieju): it still relies on `is_present("info")` check - // in `set_recognized_flags` let file: &str = info_match.value_of("file").unwrap(); - rest.extend(vec![file.to_string()]); + rest_argv.extend(vec![file.to_string()]); } ("fmt", Some(fmt_match)) => { - // TODO(bartlomieju): it still relies on `is_present("fmt")` check - // in `set_recognized_flags` let files: Vec<String> = fmt_match .values_of("files") .unwrap() .map(String::from) .collect(); - rest.extend(files); + rest_argv.extend(files); } (script, Some(script_match)) => { - rest.extend(vec![script.to_string()]); - // check if there are any extra arguments + rest_argv.extend(vec![script.to_string()]); + // check if there are any extra arguments that should + // be passed to script if script_match.is_present("") { let script_args: Vec<String> = script_match .values_of("") .unwrap() .map(String::from) .collect(); - rest.extend(script_args); + rest_argv.extend(script_args); } } _ => {} } - // TODO: end if matches.is_present("v8-options") { // display v8 help and exit @@ -246,7 +258,7 @@ pub fn set_flags( } let flags = DenoFlags::from(matches); - Ok((flags, rest)) + Ok((flags, rest_argv)) } #[test] diff --git a/cli/main.rs b/cli/main.rs index 5314e4149..dc2099595 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -112,14 +112,30 @@ fn main() { // Setup runtime. js_check(main_worker.execute("denoMain()")); - // Execute main module. - if let Some(main_module) = state.main_module() { - debug!("main_module {}", main_module); - js_check(main_worker.execute_mod(&main_module, should_prefetch)); - if should_display_info { - // Display file info and exit. Do not run file - main_worker.print_file_info(&main_module); - std::process::exit(0); + if state.flags.eval { + // 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] + ); + // ATM imports in `deno eval` are not allowed + // TODO Support ES modules once Worker supports evaluating anonymous modules. + js_check(main_worker.execute(&js_source)); + } else { + // Execute main module. + if let Some(main_module) = state.main_module() { + debug!("main_module {}", main_module); + js_check(main_worker.execute_mod(&main_module, should_prefetch)); + if should_display_info { + // Display file info and exit. Do not run file + main_worker.print_file_info(&main_module); + std::process::exit(0); + } } } diff --git a/tests/029_eval.out b/tests/029_eval.out new file mode 100644 index 000000000..ce0136250 --- /dev/null +++ b/tests/029_eval.out @@ -0,0 +1 @@ +hello diff --git a/tests/029_eval.test b/tests/029_eval.test new file mode 100644 index 000000000..3b3eb029e --- /dev/null +++ b/tests/029_eval.test @@ -0,0 +1,2 @@ +args: eval console.log("hello") +output: tests/029_eval.out diff --git a/website/manual.md b/website/manual.md index 5f3f740f2..ad6a83aa3 100644 --- a/website/manual.md +++ b/website/manual.md @@ -562,6 +562,7 @@ OPTIONS: SUBCOMMANDS: <script> Script to run + eval Eval script fmt Format files info Show source file related info |