@@ -2,6 +2,7 @@ use clap::Parser;
22use std:: fs;
33use std:: path:: PathBuf ;
44use tauri_typegen:: analysis:: CommandAnalyzer ;
5+ use tauri_typegen:: build:: GenerationCache ;
56use tauri_typegen:: generators:: create_generator;
67use tauri_typegen:: interface:: {
78 print_dependency_visualization_info, print_usage_info, CargoCli , CargoSubcommands ,
@@ -34,6 +35,7 @@ fn main() {
3435 verbose,
3536 visualize_deps,
3637 config_file,
38+ force,
3739 } => {
3840 if let Err ( e) = run_generate (
3941 project_path,
@@ -42,6 +44,7 @@ fn main() {
4244 verbose,
4345 visualize_deps,
4446 config_file,
47+ force,
4548 ) {
4649 eprintln ! ( "Error: {}" , e) ;
4750 std:: process:: exit ( 1 ) ;
@@ -81,6 +84,7 @@ fn run_generate(
8184 verbose : bool ,
8285 visualize_deps : bool ,
8386 config_file : Option < PathBuf > ,
87+ force : bool ,
8488) -> Result < ( ) , Box < dyn std:: error:: Error > > {
8589 let logger = Logger :: new ( verbose, false ) ;
8690 let mut reporter = ProgressReporter :: new ( logger, 4 ) ;
@@ -144,6 +148,10 @@ fn run_generate(
144148 if visualize_deps {
145149 config. visualize_deps = Some ( true ) ;
146150 }
151+ // CLI --force flag overrides config
152+ if force {
153+ config. force = Some ( true ) ;
154+ }
147155
148156 reporter. complete_step ( Some ( & format ! (
149157 "Using {} validation" ,
@@ -205,6 +213,35 @@ fn run_generate(
205213 return Ok ( ( ) ) ;
206214 }
207215
216+ // Check cache to see if regeneration is needed (unless force is set)
217+ let discovered_structs = analyzer. get_discovered_structs ( ) ;
218+ let needs_regeneration = if config. should_force ( ) {
219+ if config. is_verbose ( ) {
220+ println ! ( "🔄 Force flag set, regenerating bindings" ) ;
221+ }
222+ true
223+ } else {
224+ GenerationCache :: needs_regeneration (
225+ & config. output_path ,
226+ & commands,
227+ discovered_structs,
228+ & config,
229+ )
230+ . unwrap_or ( true ) // On error, assume regeneration is needed
231+ } ;
232+
233+ if !needs_regeneration {
234+ if config. is_verbose ( ) {
235+ println ! ( "✨ Cache hit - no changes detected, skipping generation" ) ;
236+ }
237+ println ! ( "✅ TypeScript bindings are up to date" ) ;
238+ return Ok ( ( ) ) ;
239+ }
240+
241+ if config. is_verbose ( ) && !config. should_force ( ) {
242+ println ! ( "🔄 Changes detected, regenerating bindings" ) ;
243+ }
244+
208245 // Generate bindings
209246 reporter. start_step ( "Generating TypeScript bindings" ) ;
210247 let validation = match config. validation_library . as_str ( ) {
@@ -215,7 +252,7 @@ fn run_generate(
215252 let mut generator = create_generator ( validation) ;
216253 let generated_files = generator. generate_models (
217254 & commands,
218- analyzer . get_discovered_structs ( ) ,
255+ discovered_structs ,
219256 & config. output_path ,
220257 & analyzer,
221258 & config,
@@ -235,6 +272,12 @@ fn run_generate(
235272 print_dependency_visualization_info ( & config. output_path ) ;
236273 }
237274
275+ // Save cache after successful generation
276+ let cache = GenerationCache :: new ( & commands, discovered_structs, & config) ?;
277+ if let Err ( e) = cache. save ( & config. output_path ) {
278+ eprintln ! ( "Warning: Failed to save generation cache: {}" , e) ;
279+ }
280+
238281 // Print summary
239282 reporter. finish ( "Generation complete" ) ;
240283 print_usage_info ( & config. output_path , & generated_files, commands. len ( ) ) ;
@@ -344,7 +387,8 @@ fn run_init(
344387 Some ( config. validation_library . clone ( ) ) ,
345388 verbose,
346389 visualize_deps,
347- None , // No config file since we just created one
390+ None , // No config file since we just created one
391+ false , // Respect cache behavior
348392 ) ?;
349393
350394 logger. info ( "" ) ;
0 commit comments