use clap::{Parser, Subcommand};
use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(
name = "amber",
about = "High-performance JavaScript/TypeScript runtime (faster than Bun)",
version = "0.1.1",
author = "Henry Zhang"
)]
pub struct CliApp {
#[arg(short, long)]
pub verbose: bool,
#[arg(short, long)]
pub config: Option<PathBuf>,
#[arg(short = 'e', long)]
pub env: Option<PathBuf>,
#[command(subcommand)]
pub command: Option<SubCommand>,
}
#[derive(Subcommand, Debug)]
pub enum SubCommand {
Run(RunCommand),
Test(TestCommand),
Repl(ReplCommand),
Bundle(BundleCommand),
Profile(ProfileCommand),
Debug {
file: Option<PathBuf>,
#[arg(short, long)]
break_at: Option<u32>,
#[arg(short, long, default_value = "9229")]
port: u16,
#[arg(short, long)]
web: bool,
#[arg(short, long)]
pid: Option<u32>,
},
#[command(alias = "wasm")]
Wasm {
#[command(subcommand)]
command: super::wasm_commands::WasmSubCommand,
},
Init(InitCommand),
Info(InfoCommandArgs),
Doctor(DoctorCommandArgs),
Upgrade(UpgradeCommand),
Version,
}
#[derive(Parser, Debug)]
pub struct RunCommand {
pub script: PathBuf,
pub args: Vec<String>,
#[arg(short, long)]
pub watch: bool,
#[arg(short, long)]
pub transpile: bool,
#[arg(short = 'H', long)]
pub hot: bool,
}
#[derive(Parser, Debug)]
pub struct TestCommand {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(short, long, default_value = "**/*.{test,spec}.{js,ts}")]
pub pattern: String,
#[arg(short = 'r', long, value_enum, default_value = "spec")]
pub reporter: TestReporter,
#[arg(short, long)]
pub watch: bool,
#[arg(short = 'o', long)]
pub run_once: bool,
#[arg(short, long)]
pub coverage: bool,
#[arg(short, long, default_value = "30")]
pub timeout: u64,
}
#[derive(Parser, Debug)]
pub struct ReplCommand {
#[arg(short, long)]
pub load: Option<PathBuf>,
#[arg(short, long)]
pub eval: Option<String>,
#[arg(short, long)]
pub save: Option<PathBuf>,
#[arg(short, long)]
pub typescript: bool,
}
#[derive(Parser, Debug)]
pub struct BundleCommand {
pub entry: PathBuf,
#[arg(short, long)]
pub outfile: Option<PathBuf>,
#[arg(short, long)]
pub minify: bool,
#[arg(short, long)]
pub sourcemap: bool,
#[arg(short = 't', long, value_enum, default_value = "browser")]
pub target: BundleTarget,
#[arg(short, long)]
pub external: Option<Vec<String>>,
#[arg(short = 'T', long)]
pub tree_shake: bool,
}
#[derive(clap::ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum TestReporter {
Spec,
Json,
Dot,
Tap,
}
#[derive(clap::ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum BundleTarget {
Browser,
Node,
Bun,
Neutral,
}
impl Default for TestReporter {
fn default() -> Self {
TestReporter::Spec
}
}
impl Default for BundleTarget {
fn default() -> Self {
BundleTarget::Browser
}
}
#[derive(Parser, Debug)]
pub struct ProfileCommand {
pub script: PathBuf,
pub args: Vec<String>,
#[arg(short = 'v', long)]
pub detailed: bool,
#[arg(short, long)]
pub interactive: bool,
#[arg(long = "format", default_value = "text")]
pub output_format: String,
#[arg(short = 'd', long = "dir")]
pub output_dir: Option<PathBuf>,
#[arg(short = 't', long, default_value = "10")]
pub duration: u64,
#[arg(short = 'r', long, default_value = "100")]
pub sampling_rate: u32,
}
#[derive(Parser, Debug)]
pub struct InitCommand {
#[arg(default_value = ".")]
pub dir: PathBuf,
#[arg(short, long, value_enum, default_value = "basic")]
pub template: ProjectTemplateArg,
#[arg(long)]
pub no_git: bool,
#[arg(short, long)]
pub interactive: bool,
#[arg(short, long)]
pub name: Option<String>,
}
#[derive(clap::ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProjectTemplateArg {
Basic,
Typescript,
WebApi,
CliTool,
}
impl Default for ProjectTemplateArg {
fn default() -> Self {
ProjectTemplateArg::Basic
}
}
#[derive(Parser, Debug)]
pub struct InfoCommandArgs {
#[arg(long, default_value = "text")]
pub format: String,
}
#[derive(Parser, Debug)]
pub struct DoctorCommandArgs {
#[arg(short, long)]
pub full: bool,
#[arg(long)]
pub fix: bool,
}
#[derive(Parser, Debug)]
pub struct UpgradeCommand {
#[arg(short, long)]
pub version: Option<String>,
#[arg(short, long)]
pub force: bool,
#[arg(long)]
pub check: bool,
}