Archived: This project is no longer maintained. Kindness now generates an OpenAPI Spec using Okapi and Schemars. Archived for nostalgia and reference for what ChatGPT code generation looked like in late 2023. 🤖
rocket-ts generates TypeScript interfaces directly from Rocket route handlers. Using generated types on your frontend ensures it remains in sync with every 🚀 endpoint, enabling you to quickly find errors and add additional safety to your frontend.
Inspired by TypeShare, it aims to bring kindness to frontend engineers working with Rocket. 🤗
- Generates TypeScript interfaces directly from Rocket routes and handlers
- Supports exclusion of parameters created via Rocket request guards
- Flexible command-line interface
- Fast and efficient generation
Imagine an email service with a /thread
API endpoint containing various routes, such as get_thread
:
#[get("/thread/<kid_or_ticket_mask>", format = "json")]
async fn get_thread(kid_or_ticket_mask: &str, service: AgentService) -> K7Response<Thread> {
service.get_thread(kid_or_ticket_mask).await.into()
}
This and similar routes can be found in example-handlers/thread.rs
. Assume that AgentService
implements FromRequest, enabling Rocket to create it automatically, so we exclude it during generation:
cargo run generate -i example-handlers -e ./example-handlers/exclude.txt
/*
* Generated by rocket-ts 0.1.0 🚀 🌎
*/
export interface k7 {
// thread.rs
// handler "/thread/<kid_or_ticket_mask>"
get_thread: (kid_or_ticket_mask:string) => Thread;
// handler "/debug/thread/<kid>"
get_thread_debug: (kid:string) => ThreadDebug;
// handler "/thread/<thread_id>/comments"
get_thread_comments: (thread_id:number) => Comment[];
// handler "/thread/<thread_id>/insights"
get_thread_insights: (thread_id:number) => MessageInsights;
// handler "/thread/escalate"
escalate_thread: (ThreadEscalation) => any;
}
-
Ensure Rust is installed on your system. If not, download and install it from the official Rust website: Rust Installation Guide.
-
Clone this repository:
git clone https://github.com/Kindness-Works/rocket-ts.git
- Navigate to the project directory:
cd rocket-ts
- Build the project:
cargo build --release
The binary will be available in the target/release
directory.
To generate TypeScript interfaces, utilize the generate
subcommand:
Usage: rocket-ts generate [OPTIONS] --input <INPUT>
Options:
-i, --input <INPUT> Input directory or file to parse for interface generation.
-o, --output <OUTPUT> Optional output file. STDOUT if not provided.
-e, --exclude-type <EXCLUDE> File listing parameters to exclude (e.g., Request Guards).
Suppose you have a Rocket project structured as follows:
my-rocket-project/
├── src/
│ ├── main.rs
│ ├── routes/
│ │ ├── users.rs
│ │ └── posts.rs
│ └── guards/
│ └── auth.rs
└── exclude.txt
To generate TypeScript interfaces for the users
and posts
modules, excluding parameters specified in exclude.txt
, run:
rocket-ts generate -i src/routes -o server-api.ts -e exclude.txt
This command generates a server-api.ts
file containing TypeScript interfaces for each request handler in users.rs
and posts.rs
, excluding parameters specified in exclude.txt
(e.g., the auth
guard).
Contributions are welcomed! Feel free to open an issue or submit a pull request.
This project is licensed under the MIT License.