@@ -12,7 +12,7 @@ const LOGO = `
1212\x1b[35m 🚀 Created by codingstark.com\x1b[0m
1313` ;
1414
15- const CURRENT_VERSION = "1.0.1 " ;
15+ const CURRENT_VERSION = "1.0.2 " ;
1616const PACKAGE_NAME = "bunkill" ;
1717
1818const colors = {
@@ -57,6 +57,7 @@ class BunKill {
5757 private sortBy : "size" | "lastModified" | "path" = "size" ;
5858 private latestVersion : string | null = null ;
5959 private hasUpdate = false ;
60+ private lastSearchTime = 0 ;
6061
6162 async scan ( options : ScanOptions ) : Promise < NodeModule [ ] > {
6263 await this . checkDailyUpdate ( ) ;
@@ -212,10 +213,11 @@ class BunKill {
212213 clearInterval ( progressInterval ) ;
213214
214215 const endTime = performance . now ( ) ;
216+ const elapsedMs = endTime - startTime ;
217+ this . lastSearchTime = elapsedMs ;
218+ const formattedTime = this . formatElapsedTime ( elapsedMs ) ;
215219 console . log (
216- `\n${ colors . green } \x1b[1m✅\x1b[0m Scan completed in ${
217- ( endTime - startTime ) . toFixed ( 2 )
218- } ms${ colors . reset } `,
220+ `\n${ colors . green } \x1b[1m✅\x1b[0m Scan completed in ${ formattedTime } ${ colors . reset } ` ,
219221 ) ;
220222 console . log (
221223 `${ colors . blue } \x1b[1m📊\x1b[0m Found ${ foundNodeModules } node_modules directories${ colors . reset } ` ,
@@ -353,8 +355,11 @@ class BunKill {
353355 const render = ( ) => {
354356 console . clear ( ) ;
355357 console . log ( LOGO ) ;
358+ const searchTime = this . lastSearchTime > 0
359+ ? this . formatElapsedTime ( this . lastSearchTime )
360+ : "N/A" ;
356361 console . log (
357- `${ colors . bold } ${ colors . blue } Found ${ this . nodeModules . length } node_modules directories${ colors . reset } ` ,
362+ `${ colors . bold } ${ colors . blue } Found ${ this . nodeModules . length } node_modules directories${ colors . reset } ${ colors . gray } (search took ${ searchTime } ) ${ colors . reset } ` ,
358363 ) ;
359364 console . log (
360365 `${ colors . cyan } BunKill v${ CURRENT_VERSION } ${ colors . reset } | ${ colors . gray } Use ↑/↓ to navigate, SPACE to select, ENTER to delete, q to quit${ colors . reset } ` ,
@@ -584,6 +589,7 @@ class BunKill {
584589 `${ colors . blue } \n🗑️ Deleting selected directories...${ colors . reset } ` ,
585590 ) ;
586591
592+ const deleteStartTime = performance . now ( ) ;
587593 let deletedCount = 0 ;
588594 let freedSize = 0 ;
589595
@@ -611,6 +617,10 @@ class BunKill {
611617 this . nodeModules = this . nodeModules . filter ( ( m ) => ! toDelete . includes ( m ) ) ;
612618 this . selectedIndices . clear ( ) ;
613619
620+ const deleteEndTime = performance . now ( ) ;
621+ const deleteElapsedMs = deleteEndTime - deleteStartTime ;
622+ const deleteTime = this . formatElapsedTime ( deleteElapsedMs ) ;
623+
614624 console . log (
615625 `${ colors . bold } ${ colors . green } \n🎉 Cleanup complete!${ colors . reset } ` ,
616626 ) ;
@@ -620,6 +630,9 @@ class BunKill {
620630 console . log (
621631 `${ colors . green } Freed: ${ filesize ( freedSize ) } ${ colors . reset } ` ,
622632 ) ;
633+ console . log (
634+ `${ colors . green } Time taken: ${ deleteTime } ${ colors . reset } ` ,
635+ ) ;
623636 console . log (
624637 `${ colors . blue } Remaining: ${ this . nodeModules . length } directories (${ this . getTotalSize ( ) } )${ colors . reset } ` ,
625638 ) ;
@@ -670,10 +683,8 @@ class BunKill {
670683
671684 private shouldSkipDirectory ( dirPath : string ) : boolean {
672685 const skipPatterns = [
673- ".bun" ,
674686 "/System" ,
675687 "/Library/Application Support" ,
676- "/Library/Caches" ,
677688 "/Library/Frameworks" ,
678689 "/Applications" ,
679690 "/private" ,
@@ -683,7 +694,6 @@ class BunKill {
683694 "/tmp" ,
684695 "/var/tmp" ,
685696 "/var/log" ,
686- "/var/cache" ,
687697 "/usr/bin" ,
688698 "/usr/sbin" ,
689699 "/usr/lib" ,
@@ -701,18 +711,34 @@ class BunKill {
701711 "Photo Booth Library" ,
702712 ".app" ,
703713 ".framework" ,
714+ ] ;
715+
716+ const allowCachePatterns = [
717+ ".bun" ,
718+ ".npm" ,
704719 ".vscode" ,
705- ".idea" ,
706- ".atom" ,
707- ".emacs.d" ,
708- ".yarn" ,
720+ ".vscode-insiders" ,
709721 ".cache" ,
710722 ".config" ,
711- ".Trash" ,
712- ".Trash-" ,
713- ".DS_Store" ,
723+ ".yarn" ,
714724 ] ;
715725
726+ const skipCacheSubdirs = [
727+ "/Library/Caches/com.apple" ,
728+ "/Library/Caches/CloudKit" ,
729+ "/Library/Caches/Google" ,
730+ "/Library/Caches/Microsoft" ,
731+ ] ;
732+
733+ const isAllowedCache = allowCachePatterns . some ( ( pattern ) =>
734+ dirPath . includes ( pattern ) &&
735+ ! skipCacheSubdirs . some ( ( skip ) => dirPath . includes ( skip ) )
736+ ) ;
737+
738+ if ( isAllowedCache ) {
739+ return false ;
740+ }
741+
716742 if ( dirPath . includes ( ".npm/_npx" ) ) {
717743 return false ;
718744 }
@@ -735,6 +761,18 @@ class BunKill {
735761 return this . nodeModules ;
736762 }
737763
764+ formatElapsedTime ( ms : number ) : string {
765+ if ( ms < 1000 ) {
766+ return `${ ms . toFixed ( 0 ) } ms` ;
767+ } else if ( ms < 60000 ) {
768+ return `${ ( ms / 1000 ) . toFixed ( 2 ) } s` ;
769+ } else {
770+ const minutes = Math . floor ( ms / 60000 ) ;
771+ const seconds = ( ( ms % 60000 ) / 1000 ) . toFixed ( 1 ) ;
772+ return `${ minutes } m ${ seconds } s` ;
773+ }
774+ }
775+
738776 private async checkDailyUpdate ( ) {
739777 try {
740778 const updateCheckFile = join (
@@ -855,14 +893,23 @@ program
855893 console . log (
856894 `${ colors . red } \x1b[1mDeleting all ${ modules . length } node_modules...${ colors . reset } ` ,
857895 ) ;
896+
897+ const deleteStartTime = performance . now ( ) ;
858898 await Promise . allSettled (
859899 modules . map ( ( module ) =>
860900 rm ( module . path , { recursive : true , force : true } )
861901 ) ,
862902 ) ;
903+ const deleteEndTime = performance . now ( ) ;
904+ const deleteElapsedMs = deleteEndTime - deleteStartTime ;
905+ const deleteTime = bunkill . formatElapsedTime ( deleteElapsedMs ) ;
906+
863907 console . log (
864908 `${ colors . green } \x1b[1m✅ Deleted ${ modules . length } node_modules${ colors . reset } ` ,
865909 ) ;
910+ console . log (
911+ `${ colors . green } Time taken: ${ deleteTime } ${ colors . reset } ` ,
912+ ) ;
866913 } else if ( options . dryRun ) {
867914 console . log (
868915 `${ colors . blue } \x1b[1mDRY RUN - No files will be deleted\x1b[0m${ colors . reset } ` ,
0 commit comments