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:
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()),
}