use anyhow::{anyhow, Result};
use std::fs;
use std::path::Path;
pub const BUILTIN_TYPE_DEFINITIONS: &str = include_str!("../types/amberjs.d.ts");
pub fn get_type_definitions() -> &'static str {
BUILTIN_TYPE_DEFINITIONS
}
pub fn export_types(output_path: Option<&Path>) -> Result<()> {
match output_path {
Some(path) => {
if let Some(parent) = path.parent() {
if !parent.exists() {
fs::create_dir_all(parent).map_err(|e| {
anyhow!("Failed to create directory {}: {}", parent.display(), e)
})?;
}
}
fs::write(path, BUILTIN_TYPE_DEFINITIONS)
.map_err(|e| anyhow!("Failed to write types to {}: {}", path.display(), e))?;
println!("✅ Type definitions written to {}", path.display());
}
None => {
print!("{}", BUILTIN_TYPE_DEFINITIONS);
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn test_types_definitions_available() {
let types = get_type_definitions();
assert!(types.contains("declare module \"amber:ai\""));
assert!(types.contains("declare module \"amber:db\""));
assert!(types.contains("declare module \"amber:vector\""));
assert!(types.contains("declare module \"amber:std\""));
assert!(types.contains("declare module \"amber:mcp\""));
assert!(types.contains("declare module \"amber:vfs\""));
assert!(types.contains("declare module \"amber:ffi\""));
assert!(types.contains("declare module \"amber:pool\""));
assert!(types.contains("declare module \"amber:wasm\""));
assert!(types.contains("declare module \"amber:replay\""));
assert!(types.contains("declare module \"amber:weights\""));
assert!(types.contains("declare module \"amber:security\""));
assert!(types.contains("declare module \"amber:permissions\""));
assert!(types.contains("declare module \"amber:kv\""));
assert!(types.contains("declare module \"amber:tools\""));
assert!(types.contains("declare module \"amber:sandbox\""));
assert!(types.contains("declare module \"amber:bus\""));
assert!(types.contains("declare module \"amber:grammar\""));
assert!(types.contains("declare module \"amber:checkpoint\""));
assert!(types.contains("declare module \"amber:sockets\""));
assert!(types.contains("class DOMException"));
assert!(types.contains("class URLPattern"));
assert!(types.contains("class MessageBus"));
assert!(types.contains("parsePartialJSON"));
assert!(types.contains("class CheckpointManager"));
assert!(types.contains("class Tensor"));
assert!(types.contains("class Database"));
assert!(types.contains("class VectorDB"));
assert!(types.contains("class LLM"));
assert!(types.contains("class IsolatePool"));
assert!(types.contains("class MemoryView"));
assert!(types.contains("function dlopen"));
assert!(types.contains("function copyMemory"));
assert!(types.contains("class McpServer"));
assert!(types.contains("class McpClient"));
assert!(types.contains("embedBatch"));
assert!(types.contains("declare namespace amber"));
}
#[test]
fn test_export_types_to_file() {
let dir = tempdir().expect("tempdir");
let file_path = dir.path().join("amber.d.ts");
export_types(Some(&file_path)).expect("export should succeed");
let content = fs::read_to_string(&file_path).expect("read");
assert!(content.contains("declare module \"amber:ai\""));
}
}