From 7a7db5bc0a282f69155d7ca8e8d944d7f5698c24 Mon Sep 17 00:00:00 2001 From: FlorianMilcendeau Date: Thu, 18 Nov 2021 00:04:14 +0100 Subject: [PATCH] cli: Add `types` setting to Anchor.toml workspace (#1032) --- cli/src/config.rs | 2 ++ cli/src/lib.rs | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/cli/src/config.rs b/cli/src/config.rs index 4dc49b37c..ea69b074a 100644 --- a/cli/src/config.rs +++ b/cli/src/config.rs @@ -264,6 +264,8 @@ pub struct WorkspaceConfig { pub members: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub exclude: Vec, + #[serde(default, skip_serializing_if = "String::is_empty")] + pub types: String, } impl Config { diff --git a/cli/src/lib.rs b/cli/src/lib.rs index f053e079d..aff677a62 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -569,6 +569,10 @@ pub fn build( }; fs::create_dir_all(idl_ts_out.as_ref().unwrap())?; + if !&cfg.workspace.types.is_empty() { + fs::create_dir_all(cfg_parent.join(&cfg.workspace.types))?; + }; + let solana_version = match solana_version.is_some() { true => solana_version, false => cfg.solana_version.clone(), @@ -672,7 +676,7 @@ fn build_cwd( Some(p) => std::env::set_current_dir(&p)?, }; match verifiable { - false => _build_cwd(idl_out, idl_ts_out, cargo_args), + false => _build_cwd(cfg, idl_out, idl_ts_out, cargo_args), true => build_cwd_verifiable(cfg, cargo_toml, solana_version, stdout, stderr), } } @@ -691,6 +695,9 @@ fn build_cwd_verifiable( fs::create_dir_all(workspace_dir.join("target/verifiable"))?; fs::create_dir_all(workspace_dir.join("target/idl"))?; fs::create_dir_all(workspace_dir.join("target/types"))?; + if !&cfg.workspace.types.is_empty() { + fs::create_dir_all(workspace_dir.join(&cfg.workspace.types))?; + } let container_name = "anchor-program"; @@ -747,6 +754,17 @@ fn build_cwd_verifiable( println!("Writing the .ts file"); let ts_file = workspace_dir.join(format!("target/types/{}.ts", idl.name)); fs::write(&ts_file, template::idl_ts(&idl)?)?; + + // Copy out the TypeScript type. + if !&cfg.workspace.types.is_empty() { + fs::copy( + ts_file, + workspace_dir + .join(&cfg.workspace.types) + .join(idl.name) + .with_extension("ts"), + )?; + } } println!("Build success"); @@ -911,6 +929,7 @@ fn docker_build( } fn _build_cwd( + cfg: &WithPath, idl_out: Option, idl_ts_out: Option, cargo_args: Vec, @@ -941,9 +960,19 @@ fn _build_cwd( // Write out the JSON file. write_idl(&idl, OutFile::File(out))?; - // Write out the TypeScript type. - fs::write(ts_out, template::idl_ts(&idl)?)?; + fs::write(&ts_out, template::idl_ts(&idl)?)?; + // Copy out the TypeScript type. + let cfg_parent = cfg.path().parent().expect("Invalid Anchor.toml"); + if !&cfg.workspace.types.is_empty() { + fs::copy( + &ts_out, + cfg_parent + .join(&cfg.workspace.types) + .join(&idl.name) + .with_extension("ts"), + )?; + } } Ok(())