Skip to main content

zynk_gen_ts/
lib.rs

1//! Plain TypeScript generator for Zynk API graphs.
2
3pub mod lowering;
4pub mod naming;
5pub mod printer;
6pub mod runtime;
7
8use std::path::PathBuf;
9
10use zynk_codegen::{GeneratedFile, GenerationContext, GenerationResult, Generator};
11use zynk_schema::ApiGraph;
12
13/// Generate plain TypeScript client files in memory for the provided API graph.
14pub fn generate(graph: &ApiGraph) -> GenerationResult {
15    let api = printer::print_api(graph);
16    GenerationResult::new(vec![
17        GeneratedFile::new(PathBuf::from("api.ts"), api),
18        GeneratedFile::new(PathBuf::from("_internal.ts"), runtime::internal_ts()),
19    ])
20}
21
22/// Concrete generator implementation for the plain TypeScript target.
23#[derive(Debug, Default, Clone, Copy)]
24pub struct TypeScriptGenerator;
25
26impl TypeScriptGenerator {
27    /// Create a TypeScript generator.
28    pub fn new() -> Self {
29        Self
30    }
31}
32
33impl Generator for TypeScriptGenerator {
34    fn generate(&self, ctx: &GenerationContext) -> GenerationResult {
35        generate(ctx.graph)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use std::path::PathBuf;
42
43    use zynk_schema::ApiGraph;
44
45    #[test]
46    fn generate_returns_api_and_embedded_runtime_files() {
47        let result = super::generate(&ApiGraph::new());
48
49        assert_eq!(result.files.len(), 2);
50        assert_eq!(result.files[0].path, PathBuf::from("api.ts"));
51        assert_eq!(result.files[1].path, PathBuf::from("_internal.ts"));
52        assert!(result.files[0]
53            .contents
54            .contains("Generated by zynk-gen-ts"));
55        assert!(result.files[1]
56            .contents
57            .contains("export function initBridge"));
58    }
59}