lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

commit b370029e749bc872870c2d10ae0ce58cefaf3616
parent 2f542e0a48b6fafb35684db16416665367da6e32
Author: triesap <tyson@radroots.org>
Date:   Fri, 20 Feb 2026 23:37:41 +0000

build: add ts constants export command

Diffstat:
Mcrates/xtask/src/export_ts.rs | 45+++++++++++++++++++++++++++++++++++++++++++--
Mcrates/xtask/src/main.rs | 10++++++++++
2 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/crates/xtask/src/export_ts.rs b/crates/xtask/src/export_ts.rs @@ -5,7 +5,9 @@ use std::fs; use std::path::{Path, PathBuf}; fn to_package_dir(base: &Path, package_name: &str) -> PathBuf { - let stripped = package_name.strip_prefix("@radroots/").unwrap_or(package_name); + let stripped = package_name + .strip_prefix("@radroots/") + .unwrap_or(package_name); base.join(stripped) } @@ -30,7 +32,10 @@ pub fn export_ts_models(workspace_root: &Path, out_dir: &Path) -> Result<(), Str .ok_or_else(|| "missing ts export mapping".to_string())?; let source_root = workspace_root.join("target").join("ts-rs"); if !source_root.exists() { - return Err(format!("missing ts-rs source root {}", source_root.display())); + return Err(format!( + "missing ts-rs source root {}", + source_root.display() + )); } let ts_out_root = out_dir.join("ts").join("packages"); let mut copied = 0usize; @@ -50,3 +55,39 @@ pub fn export_ts_models(workspace_root: &Path, out_dir: &Path) -> Result<(), Str } Ok(()) } + +pub fn export_ts_constants(workspace_root: &Path, out_dir: &Path) -> Result<(), String> { + let bundle = contract::load_contract_bundle(workspace_root)?; + contract::validate_contract_bundle(&bundle)?; + let ts_export = bundle + .exports + .iter() + .find(|mapping| mapping.language.id == "ts") + .ok_or_else(|| "missing ts export mapping".to_string())?; + let ts_out_root = out_dir.join("ts").join("packages"); + for (crate_name, package_name) in &ts_export.packages { + let crate_dir = crate_name.strip_prefix("radroots-").unwrap_or(crate_name); + let crate_root = workspace_root.join("crates").join(crate_dir); + for filename in ["constants.ts", "kinds.ts"] { + let candidates = [ + crate_root.join("bindings").join(filename), + crate_root + .join("bindings") + .join("ts") + .join("src") + .join(filename), + ]; + let src = candidates + .iter() + .find(|path| path.exists()) + .cloned() + .unwrap_or_else(|| candidates[0].clone()); + let dst = to_package_dir(&ts_out_root, package_name) + .join("src") + .join("generated") + .join(filename); + copy_if_exists(&src, &dst)?; + } + } + Ok(()) +} diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs @@ -10,6 +10,7 @@ use std::process::ExitCode; fn usage() { eprintln!("usage:"); eprintln!(" cargo xtask sdk export-ts-models [--out <dir>]"); + eprintln!(" cargo xtask sdk export-ts-constants [--out <dir>]"); eprintln!(" cargo xtask sdk validate"); } @@ -42,6 +43,14 @@ fn export_ts_models(args: &[String]) -> Result<(), String> { Ok(()) } +fn export_ts_constants(args: &[String]) -> Result<(), String> { + let root = workspace_root()?; + let out_dir = parse_out_dir(args, &root)?; + export_ts::export_ts_constants(&root, &out_dir)?; + eprintln!("exported ts constants to {}", out_dir.display()); + Ok(()) +} + fn validate_contract() -> Result<(), String> { let root = workspace_root()?; let bundle = contract::load_contract_bundle(&root)?; @@ -57,6 +66,7 @@ fn validate_contract() -> Result<(), String> { fn run_sdk(args: &[String]) -> Result<(), String> { match args.first().map(String::as_str) { Some("export-ts-models") => export_ts_models(&args[1..]), + Some("export-ts-constants") => export_ts_constants(&args[1..]), Some("validate") => validate_contract(), _ => Err("unknown sdk subcommand".to_string()), }