// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use clap::{App, AppSettings, Arg, ArgMatches, SubCommand}; // Creates vector of strings, Vec macro_rules! svec { ($($x:expr),*) => (vec![$($x.to_string()),*]); } #[cfg_attr(feature = "cargo-clippy", allow(stutter))] #[derive(Clone, Debug, PartialEq, Default)] pub struct DenoFlags { pub log_debug: bool, pub version: bool, pub reload: bool, /// When the `--config`/`-c` flag is used to pass the name, this will be set /// the path passed on the command line, otherwise `None`. pub config_path: Option, pub allow_read: bool, pub allow_write: bool, pub allow_net: bool, pub allow_env: bool, pub allow_run: bool, pub allow_high_precision: bool, pub no_prompts: bool, pub no_fetch: bool, pub v8_flags: Option>, pub xeval_replvar: Option, pub xeval_delim: Option, } static ENV_VARIABLES_HELP: &str = "ENVIRONMENT VARIABLES: DENO_DIR Set deno's base directory NO_COLOR Set to disable color"; pub fn create_cli_app<'a, 'b>() -> App<'a, 'b> { App::new("deno") .bin_name("deno") .global_settings(&[AppSettings::ColorNever]) .settings(&[ AppSettings::AllowExternalSubcommands, AppSettings::DisableVersion, ]).after_help(ENV_VARIABLES_HELP) .arg( Arg::with_name("allow-read") .long("allow-read") .help("Allow file system read access"), ).arg( Arg::with_name("allow-write") .long("allow-write") .help("Allow file system write access"), ).arg( Arg::with_name("allow-net") .long("allow-net") .help("Allow network access"), ).arg( Arg::with_name("allow-env") .long("allow-env") .help("Allow environment access"), ).arg( Arg::with_name("allow-run") .long("allow-run") .help("Allow running subprocesses"), ).arg( Arg::with_name("allow-high-precision") .long("allow-high-precision") .help("Allow high precision time measurement"), ).arg( Arg::with_name("allow-all") .short("A") .long("allow-all") .help("Allow all permissions"), ).arg( Arg::with_name("no-prompt") .long("no-prompt") .help("Do not use prompts"), ).arg( Arg::with_name("no-fetch") .long("no-fetch") .help("Do not download remote modules"), ).arg( Arg::with_name("log-debug") .short("D") .long("log-debug") .help("Log debug output"), ).arg( Arg::with_name("reload") .short("r") .long("reload") .help("Reload source code cache (recompile TypeScript)"), ).arg( Arg::with_name("config") .short("c") .long("config") .value_name("FILE") .help("Load compiler configuration file") .takes_value(true), ).arg( Arg::with_name("v8-options") .long("v8-options") .help("Print V8 command line options"), ).arg( Arg::with_name("v8-flags") .long("v8-flags") .takes_value(true) .use_delimiter(true) .require_equals(true) .help("Set V8 command line options"), ).subcommand( SubCommand::with_name("version") .setting(AppSettings::DisableVersion) .about("Print the version") .long_about( " Print current version of Deno. Includes versions of Deno, V8 JavaScript Engine, and the TypeScript compiler. ", ), ).subcommand( SubCommand::with_name("fetch") .setting(AppSettings::DisableVersion) .about("Fetch the dependencies") .long_about( " Fetch and compile remote dependencies recursively. Downloads all statically imported scripts and save them in local cache, without running the code. No future import network requests would be made unless --reload is specified. # Downloads all dependencies deno fetch https://deno.land/std/http/file_server.ts # Once cached, static imports no longer send network requests deno https://deno.land/std/http/file_server.ts ", ).arg(Arg::with_name("file").takes_value(true).required(true)), ).subcommand( SubCommand::with_name("types") .setting(AppSettings::DisableVersion) .about("Print runtime TypeScript declarations") .long_about( " Print runtime TypeScript declarations. The declaration file could be saved and used for typing information. deno types > lib.deno_runtime.d.ts ", ), ).subcommand( SubCommand::with_name("info") .setting(AppSettings::DisableVersion) .about("Show source file related info") .long_about( " Show source file related info. The following information is shown: local: local path of the file. type: type of script (e.g. JavaScript/TypeScript/JSON) compiled: (TypeScript only) shown local path of compiled source code. map: (TypeScript only) shown local path of source map. deps: dependency tree of the source file. deno info myfile.ts ", ).arg(Arg::with_name("file").takes_value(true).required(true)), ).subcommand( SubCommand::with_name("eval") .setting(AppSettings::DisableVersion) .about("Eval script") .long_about( " Evaluate provided script. deno eval 'console.log(\"hello world\")' ", ).arg(Arg::with_name("code").takes_value(true).required(true)), ).subcommand( SubCommand::with_name("fmt") .setting(AppSettings::DisableVersion) .about("Format files") .long_about( " Format given list of files using Prettier. Automatically downloads Prettier dependencies on first run. deno fmt myfile1.ts myfile2.ts ", ).arg( Arg::with_name("files") .takes_value(true) .multiple(true) .required(true), ), ).subcommand( SubCommand::with_name("xeval") .setting(AppSettings::DisableVersion) .about("Eval a script on text segments from stdin") .long_about( " Eval a script on lines (or chunks split under delimiter) from stdin. Read from standard input and eval code on each whitespace-delimited string chunks. -I/--replvar optionally set variable name for input to be used in eval. Otherwise '$' will be used as default variable name. cat /etc/passwd | deno xeval \"a = $.split(':'); if (a) console.log(a[0])\" git branch | deno xeval -I 'line' \"if (line.startsWith('*')) console.log(line.slice(2))\" cat LICENSE | deno xeval -d ' ' \"if ($ === 'MIT') console.log('MIT licensed')\" ", ).arg( Arg::with_name("replvar") .long("replvar") .short("I") .help("Set variable name to be used in eval, defaults to $") .takes_value(true), ).arg( Arg::with_name("delim") .long("delim") .short("d") .help("Set delimiter, defaults to newline") .takes_value(true), ).arg(Arg::with_name("code").takes_value(true).required(true)), ).subcommand( // this is a fake subcommand - it's used in conjunction with // AppSettings:AllowExternalSubcommand to treat it as an // entry point script SubCommand::with_name("