torch-it 2.4.2 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -183,6 +183,24 @@ Use `--test` to preview what `torch-it` would do without deleting directories, c
183
183
  ```bash
184
184
  torch-it --test
185
185
  ```
186
+
187
+ ### Configuration (`--config`)
188
+
189
+ Use `--config` to display the current torch-it configuration, including all files and directories that will be targeted for deletion during a torch-it run. This is useful for verifying your setup before performing actual cleanup operations.
190
+
191
+ ```bash
192
+ torch-it --config
193
+ ```
194
+
195
+ The configuration display shows:
196
+ - Current settings from `torchrc.json` (if present) or defaults
197
+ - All built-in cleanup targets
198
+ - Custom paths that will be removed
199
+ - Protected paths that will be preserved
200
+ - Docker and rebuild operation settings
201
+
202
+ This helps you understand exactly what will be affected before running torch-it, making it easier to verify your configuration is correct.
203
+
186
204
  ---
187
205
  ## Customization
188
206
 
@@ -217,13 +235,18 @@ torch-it --dockerMode=false --rebuild=false --customPaths=["temp/","logs/"]
217
235
  All configuration options can be overridden using `--optionName=value` syntax. For arrays and objects, use JSON syntax:
218
236
 
219
237
  - `--help` - Show help message and available options
238
+ - `--version, -v` - Show version information and exit
239
+ - `--config` - Show current configuration and exit
220
240
  - `--test` - Run in dry-run mode (preview changes without executing)
221
241
  - `--customPaths=["path1","path2"]`
222
242
  - `--dockerMode=false`
223
243
  - `--rebuild=false`
224
244
  - `--logfile=true`
225
245
 
226
- Command line flags take precedence over `torchrc.json` settings.
246
+ Command line flags take precedence over `torchrc.json` settings.
247
+
248
+ The config option `--config` will show all current settings including those from command line flags and a list of all files and directories that will be cleaned in the current project.
249
+
227
250
 
228
251
 
229
252
  ## Logging
package/dist/torch-it.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var ae=Object.create;var U=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty;var pe=(e,n,s,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of de(n))!fe.call(e,r)&&r!==s&&U(e,r,{get:()=>n[r],enumerable:!(a=le(n,r))||a.enumerable});return e};var C=(e,n,s)=>(s=e!=null?ae(ue(e)):{},pe(n||!e||!e.__esModule?U(s,"default",{value:e,enumerable:!0}):s,e));var O=C(require("fs"));var k=(e,n)=>s=>`\x1B[${e}m${s}\x1B[${n}m`,i={BOLD:k("1","22"),CYAN:k("36","39"),GREEN:k("32","39"),RED:k("31","39"),YELLOW:k("33","39"),PURPLE:k("35","39"),RESET:e=>`\x1B[0m${e}`},t={INFO:"\u{1F525}",SUCCESS:"\u2705",FAIL:"\u274C",EXCLAMATION:"\u2757",WARN:"\u26A0\uFE0F",ROCKET:"\u{1F525}",CLEAN:"\u{1F525}",PHOENIX:"\u{1F525}",BUILD:"\u{1F528}",TARGET:"\u{1F525}",CELEBRATE:"\u{1F525}",STARS:"\u2728",BOX:"\u{1F4E6}",CLIPBOARD:"\u{1F4CB}",DOCKER:"\u{1F433}"};var w=C(require("fs")),v=!0;function me(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"")}var M=e=>{v=e},B=()=>{v&&w.default.writeFileSync("torch-it.log","")},D=e=>{if(!v)return;let n=me(e).replace(/^\n/,""),s=new Date().toISOString();w.default.appendFileSync("torch-it.log",`[${s}] ${n}
3
- `)};function o(e,n){let s;switch(n){case"info":s=`${i.CYAN(t.INFO)} ${i.BOLD(e)}${i.RESET("")}`;break;case"success":s=`${i.GREEN(t.SUCCESS)} ${e}${i.RESET("")}`;break;case"warn":s=`${i.YELLOW(t.WARN)} ${e}${i.RESET("")}`;break;case"fail":s=`${i.RED(t.FAIL)} ${e}${i.RESET("")}`;break;case"step":s=`
4
- ${i.PURPLE("\u25B6")} ${i.BOLD(e)}${i.RESET("")}`;break;default:s=e}console.log(s),D(s)}function H(){_([` ${t.TARGET} TORCH LIT ${t.ROCKET}`],i.PURPLE);let e=`
2
+ "use strict";var ue=Object.create;var W=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var ge=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var ke=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var Ce=(e,n,t,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of me(n))!he.call(e,a)&&a!==t&&W(e,a,{get:()=>n[a],enumerable:!(c=pe(n,a))||c.enumerable});return e};var D=(e,n,t)=>(t=e!=null?ue(ge(e)):{},Ce(n||!e||!e.__esModule?W(t,"default",{value:e,enumerable:!0}):t,e));var fe=ke((to,De)=>{De.exports={name:"torch-it",version:"2.5.1",description:"CLI to reset, clean, and rebuild Node.js project environments.",keywords:["cleanup","cli","docker","node"],homepage:"https://github.com/piyook/torch-it#readme",bugs:{url:"https://github.com/piyook/torch-it/issues"},license:"ISC",author:"",repository:{type:"git",url:"git+https://github.com/piyook/torch-it.git"},bin:{"torch-it":"dist/torch-it.js"},files:["dist","README.md"],type:"commonjs",main:"dist/torch-it.js",scripts:{build:'esbuild src/torch.ts --bundle --outfile=dist/torch-it.js --platform=node --format=cjs --minify --banner:js="#!/usr/bin/env node"',"torch-it":"npm run build && node dist/torch-it.js","torch-it:ts":"ts-node src/torch.ts",lint:"oxlint .","lint:fix":"oxlint . --fix",format:"prettier --check src/**/*.{ts,js,json} package.json package-lock.json .commitlintrc.json","format:write":"prettier --write src/**/*.{ts,js,json} package.json package-lock.json .commitlintrc.json",quality:"npm run lint && npm run format && npm test","validate-branch-name":"validate-branch-name",prepare:"husky",prepublishOnly:"npm run build",test:"tsc --noEmit && vitest run","test:watch":"vitest"},dependencies:{},devDependencies:{"@commitlint/cli":"^20.5.0","@commitlint/config-conventional":"^20.5.0","@types/node":"^25.6.0",esbuild:"^0.28.0",husky:"^9.1.7","lint-staged":"^16.4.0",oxlint:"^1.59.0",prettier:"^3.8.2","ts-node":"^10.9.2",typescript:"^6.0.2","validate-branch-name":"^1.3.2",vitest:"^4.1.4"},"lint-staged":{"*.{ts,tsx,js,jsx,mjs,cjs,json}":["oxlint --fix","prettier --write"]},"validate-branch-name":{pattern:"^(main|dev){1}$|^(feat|fix|hotfix|release|chore)/.+$",errorMsg:"INVALID BRANCH NAME: use format 'feat|fix|hotfix|release|core/your-branch-name'"}}});var j=D(require("fs"));var E=(e,n)=>t=>`\x1B[${e}m${t}\x1B[${n}m`,f={BOLD:E("1","22"),CYAN:E("36","39"),GREEN:E("32","39"),RED:E("31","39"),YELLOW:E("33","39"),PURPLE:E("35","39"),RESET:e=>`\x1B[0m${e}`},i={INFO:"\u{1F525}",SUCCESS:"\u2705",FAIL:"\u274C",EXCLAMATION:"\u2757",WARN:"\u26A0\uFE0F",ROCKET:"\u{1F525}",CLEAN:"\u{1F525}",PHOENIX:"\u{1F525}",BUILD:"\u{1F528}",TARGET:"\u{1F525}",CELEBRATE:"\u{1F525}",STARS:"\u2728",BOX:"\u{1F4E6}",CLIPBOARD:"\u{1F4CB}",DOCKER:"\u{1F433}"};var H=D(require("fs")),K=!0;function ye(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"")}var X=e=>{K=e},q=()=>{K&&H.default.writeFileSync("torch-it.log","")},x=e=>{if(!K)return;let n=ye(e).replace(/^\n/,""),t=new Date().toISOString();H.default.appendFileSync("torch-it.log",`[${t}] ${n}
3
+ `)};function o(e,n){let t;switch(n){case"info":t=`${f.CYAN(i.INFO)} ${f.BOLD(e)}${f.RESET("")}`;break;case"success":t=`${f.GREEN(i.SUCCESS)} ${e}${f.RESET("")}`;break;case"warn":t=`${f.YELLOW(i.WARN)} ${e}${f.RESET("")}`;break;case"fail":t=`${f.RED(i.FAIL)} ${e}${f.RESET("")}`;break;case"step":t=`
4
+ ${f.PURPLE("\u25B6")} ${f.BOLD(e)}${f.RESET("")}`;break;default:t=e}console.log(t),x(t)}function z(){w([` ${i.TARGET} TORCH LIT ${i.ROCKET}`],f.PURPLE);let e=`
5
5
  ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
6
6
  (( (( (( (( (( (( (( (( (( (( (( (( (( ((
7
7
  ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
@@ -12,7 +12,7 @@ ${i.PURPLE("\u25B6")} ${i.BOLD(e)}${i.RESET("")}`;break;default:s=e}console.log(
12
12
  | _ \\| | | | |_) | \\| || || \\| | | _
13
13
  | |_) | |_| | _ <| |\\ || || |\\ | |_| |
14
14
  |____/ \\___/|_| \\_\\_| \\_|___|_| \\_|\\____|
15
- `;console.log(e),D(e)}function j(){console.log(""),_([` ${t.PHOENIX} RISING FROM THE ASHES ${t.PHOENIX}`],i.PURPLE)}function K(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"").length}function _(e,n=i.GREEN){let s=Math.max(56,...e.map(r=>K(r))),a=n("\u2550".repeat(s));console.log(n("\u2554"+a+"\u2557")),e.forEach(r=>{if(D(r),r.trim()==="")console.log(n("\u2551"+" ".repeat(s)+"\u2551"));else{let m=s-K(r);console.log(n("\u2551"+r+" ".repeat(m)+"\u2551"))}}),console.log(n("\u255A"+a+"\u255D"))}var E=require("child_process"),Y=C(require("os"));function c(e,n={}){try{return(0,E.execSync)(e,{stdio:n.silent?"pipe":"inherit"}),!0}catch{return n.silent||o(`Command failed: ${e}`,"fail"),!1}}function u(e){try{return Y.platform()==="win32"?(0,E.execSync)(`where ${e}`,{stdio:"ignore"}):(0,E.execSync)(`command -v ${e}`,{stdio:"ignore"}),!0}catch{return!1}}var d=C(require("fs")),J=C(require("path"));var G=["node_modules","dist","build",".svelte-kit",".svelte",".next",".nuxt","out",".output",".vercel",".netlify",".astro",".angular",".angular/cache",".solid",".docusaurus",".vite",".cache",".parcel-cache",".webpack",".rollup.cache",".rpt2_cache",".swc",".eslintcache",".stylelintcache",".sass-cache",".tmp","tmp","temp","coverage",".nyc_output","storybook-static",".storybook-out",".turbo",".rush",".firebase",".serverless","android/.gradle","android/build","android/app/build","ios/Pods","ios/build",".expo",".expo-shared","lib","es","cjs","umd",".remix",".qwik",".nitro",".wrangler",".amplify",".sst",".babel-cache",".cache-loader","jspm_packages",".typings"],W=["*.log","*.tgz","*.tar.gz","tsconfig.tsbuildinfo"],X=[".pnpm-store",".pnpm-debug.log",".yarn/cache",".yarn/unplugged",".yarn/install-state.gz",".yarn/build-state.yml",".npm","node_modules/.cache",".yalc",".lerna",".nx/cache",".vite/deps",".turbo","tsconfig.tsbuildinfo",".hardhat",".foundry",".anchor"],q=[];var g={customPaths:[],customDirs:[],customFiles:[],protectedPaths:[],dockerMode:!0,logfile:!1,rebuild:!0};var ge=e=>{let n={};for(let s of e){if(!s.startsWith("--"))continue;let[a,r]=s.slice(2).split("=",2);if(!(!a||!r))try{let m=JSON.parse(r);n[a]=m}catch{r==="true"?n[a]=!0:r==="false"?n[a]=!1:n[a]=r}}return n},he=()=>{let e="torchrc.json";if(!d.existsSync(e))return{};try{return JSON.parse(d.readFileSync(e,"utf8"))}catch{return o("Invalid torchrc.json (must be valid JSON) - skipping custom config","warn"),{}}},N=()=>{let e=he();return{customPaths:e.customPaths??g.customPaths,customDirs:e.customDirs??g.customDirs,customFiles:e.customFiles??g.customFiles,protectedPaths:e.protectedPaths??g.protectedPaths,dockerMode:e.dockerMode??g.dockerMode,logfile:e.logfile??g.logfile,rebuild:e.rebuild??g.rebuild}},R=(e=[])=>{let n=N(),s=ge(e);return{...n,...s}},Ce=()=>{let e=N();return[...e.customPaths,...e.customDirs,...e.customFiles].filter(s=>typeof s=="string").map(s=>s.trim()).filter(s=>s.length>0)},z=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=0,s=N(),a=Ce(),r=s.protectedPaths,m=[...new Set([...G,...X,...q])],I=[...new Set(a)],ie=[...W],P=m.filter(l=>!r.some(h=>l===h||l.startsWith(h+"/"))),S=I.filter(l=>!r.some(h=>l===h||l.startsWith(h+"/"))),$=l=>{if(d.existsSync(l)){o(`${e?"Would remove":"Removing"} ${l}...`,"step");try{e||d.rmSync(l,{recursive:!0,force:!0}),o(`${l} ${e?"marked for removal (dry-run)":"removed"}`,"success"),n++}catch{o(`Failed to remove ${l}`,"fail")}}},ce=()=>{for(let l of ie)if(l.includes("*"))try{let L=d.readdirSync(".",{withFileTypes:!0}).filter(y=>y.name.match(l.replace("*",".*"))).map(y=>y.name);for(let y of L){let p=J.join(".",y);if(d.existsSync(p)&&d.statSync(p).isFile()&&!r.some(F=>p===F||p.startsWith(F+"/"))){o(`${e?"Would remove":"Removing"} ${p}...`,"step");try{e||d.unlinkSync(p),o(`${p} ${e?"marked for removal (dry-run)":"removed"}`,"success"),n++}catch{o(`Failed to remove ${p}`,"fail")}}}}catch(L){o(`Failed to process pattern ${l}: ${L}`,"warn")}else d.existsSync(l)&&$(l)};o("Scanning for build artifacts and cache directories...","step"),P.forEach($),o("Scanning for log files and temporary files...","step"),ce(),S.length>0&&(o("Deleting user defined custom directories and files","step"),S.forEach($));let x=m.length-P.length+(I.length-S.length);return x>0&&o(`Skipped ${x} protected path(s) from torchrc.json`,"info"),n===0?(o("No build artifacts or cache directories found (project already clean)","info"),!1):(o(`Removed ${n} build/cache directories`,"success"),!0)},V=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return u("npm")&&(e||c("npm cache clean --force"))&&(o(e?"Dry-run: would clean npm cache":"npm cache cleaned","success"),n=!0),u("yarn")&&(e||c("yarn cache clean"))&&(o(e?"Dry-run: would clean yarn cache":"yarn cache cleaned","success"),n=!0),u("pnpm")&&(e||c("pnpm store prune"))&&(o(e?"Dry-run: would clean pnpm store":"pnpm store cleaned","success"),n=!0),n||o("No package manager caches cleaned (tools not available)","info"),n};function Q(){return O.existsSync("Dockerfile")||O.existsSync("docker-compose.yml")||O.existsSync("docker-compose.yaml")}function Z(){if(R().dockerMode===!1)return o("Docker mode disabled in torchrc.json - skipping Docker operations","info"),"NO_DOCKER";let n=process.env.TORCH_DRY_RUN==="1";return Q()?(o("Stopping Docker services and removing all resources...","info"),u("docker")?c("docker info",{silent:!0})?c("docker compose ps",{silent:!0})?n?(o("Dry-run: would run 'docker compose down --rmi all --volumes'","info"),"OK"):c("docker compose down --rmi all --volumes")?(o("Docker services stopped and resources cleaned","success"),"OK"):(o("Docker cleanup encountered issues","warn"),o("Continuing with the rest of the script...","info"),"DOCKER_FAIL"):(o("No Docker Compose services found - skipping Docker cleanup","warn"),o("This is normal if no services were previously running","info"),"DOCKER_FAIL"):(o("Docker daemon is not running - skipping Docker cleanup","warn"),o("You may need to start Docker manually and run cleanup later","info"),"NO_DOCKER"):(o("Docker is not installed - skipping Docker cleanup","warn"),"NO_DOCKER")):(o("No Docker configuration found - skipping Docker operations","info"),"NO_DOCKER")}function ee(){let e=R();if(e.dockerMode===!1)return!1;if(e.rebuild===!1)return o("Rebuild disabled in torchrc.json - skipping Docker rebuild","info"),!1;let n=process.env.TORCH_DRY_RUN==="1";return Q()?u("docker")?c("docker info",{silent:!0})?(o("Building Docker resources (this may take a while...)...","step"),console.log(` ${i.YELLOW("\u23F3 Please be patient - pulling fresh images and building...")}`),n?(o("Dry-run: would run 'docker-compose build --pull --no-cache'","info"),!0):c("docker-compose build --pull --no-cache")?!0:(o("Docker build encountered issues - check torch-it.log for details","fail"),!1)):(o("Docker daemon is not running - skipping Docker rebuild","warn"),o("Start Docker manually and run 'docker-compose build --pull --no-cache' later","info"),!1):(o("Docker is not installed - skipping Docker rebuild","warn"),!1):!1}function oe(){if(R().dockerMode===!1)return!1;let n=process.env.TORCH_DRY_RUN==="1";return o("Starting Docker services in detached mode...","step"),n?(o("Dry-run: would run 'docker compose up -d'","info"),!0):c("docker compose up -d")?!0:(o("Failed to start Docker services - check torch-it.log for details","fail"),!1)}var T=C(require("fs"));var ne=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return o("Detecting package manager and installing dependencies...","step"),T.existsSync("pnpm-lock.yaml")&&u("pnpm")?(o("Using pnpm (detected pnpm-lock.yaml)...","step"),e||c("pnpm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),n=!0):o("pnpm install failed","fail")):T.existsSync("yarn.lock")&&u("yarn")?(o("Using yarn (detected yarn.lock)...","step"),e||c("yarn install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),n=!0):o("yarn install failed","fail")):T.existsSync("package-lock.json")&&u("npm")?(o("Using npm (detected package-lock.json)...","step"),e||c("npm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),n=!0):o("npm install failed","fail")):u("npm")?(o("Using npm (fallback)...","info"),e||c("npm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),n=!0):o("npm install failed","fail")):u("yarn")?(o("Using yarn (fallback)...","info"),e||c("yarn install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),n=!0):o("yarn install failed","")):u("pnpm")?(o("Using pnpm (fallback)...","info"),e||c("pnpm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),n=!0):o("pnpm install failed","fail")):o("No package manager found (npm/yarn/pnpm). Please install dependencies manually.","fail"),n};var se=e=>{let n="",s="",a="";e.dockerClean==="NO_DOCKER"?n=`${t.DOCKER} No Docker containers found`:e.dockerClean==="DOCKER_FAIL"&&(n=`${t.FAIL} Failed to remove Docker containers`),e.dockerClean==="OK"&&(e.dockerRebuild?s=`${t.DOCKER} Docker containers rebuilt from scratch`:s=`${t.FAIL} Failed to rebuild Docker containers`,e.dockerLaunch&&e.dockerRebuild?a=`${t.ROCKET} Services running in detached mode`:a=`${t.FAIL} Failed to start Docker containers`);let r=e.buildAndCacheClean&&e.packageManagerClean?`${t.CLEAN} All build artifacts & caches removed`:`${t.FAIL} Build artifacts or cache directories not found`,m=e.dependencyInstall?`${t.BOX} Dependencies freshly installed`:`${t.FAIL} Failed to install dependencies`;console.log(""),_(["\u{1F525} PROJECT SUCCESSFULLY TORCHED! \u{1F525}","",`${r}`,`${m}`,`${n}`,`${s}`,`${a}`,"",e.logfile===!1?`${t.CLIPBOARD} Logging to torch-it.log is disabled; set "logfile": true in torchrc.json to enable it`:`${t.CLIPBOARD} Check torch-it.log for detailed logs`])};var te=()=>{o(`
15
+ `;console.log(e),x(e)}function V(){console.log(""),w([` ${i.PHOENIX} RISING FROM THE ASHES ${i.PHOENIX}`],f.PURPLE)}function J(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"").length}function w(e,n=f.GREEN){let t=Math.max(56,...e.map(a=>J(a))),c=n("\u2550".repeat(t));console.log(n("\u2554"+c+"\u2557")),e.forEach(a=>{if(x(a),a.trim()==="")console.log(n("\u2551"+" ".repeat(t)+"\u2551"));else{let h=t-J(a);console.log(n("\u2551"+a+" ".repeat(h)+"\u2551"))}}),console.log(n("\u255A"+c+"\u255D"))}var N=require("child_process"),Q=D(require("os"));function d(e,n={}){try{return(0,N.execSync)(e,{stdio:n.silent?"pipe":"inherit"}),!0}catch{return n.silent||o(`Command failed: ${e}`,"fail"),!1}}function l(e){try{return Q.platform()==="win32"?(0,N.execSync)(`where ${e}`,{stdio:"ignore"}):(0,N.execSync)(`command -v ${e}`,{stdio:"ignore"}),!0}catch{return!1}}var m=D(require("fs")),Z=D(require("path"));var A=["node_modules","dist","build",".svelte-kit",".svelte",".next",".nuxt","out",".output",".vercel",".netlify",".astro",".angular",".angular/cache",".solid",".docusaurus",".vite",".cache",".parcel-cache",".webpack",".rollup.cache",".rpt2_cache",".swc",".eslintcache",".stylelintcache",".sass-cache",".tmp","tmp","temp","coverage",".nyc_output","storybook-static",".storybook-out",".turbo",".rush",".firebase",".serverless","android/.gradle","android/build","android/app/build","ios/Pods","ios/build",".expo",".expo-shared","lib","es","cjs","umd",".remix",".qwik",".nitro",".wrangler",".amplify",".sst",".babel-cache",".cache-loader","jspm_packages",".typings"],P=["*.log","*.tgz","*.tar.gz","tsconfig.tsbuildinfo"],F=[".pnpm-store",".pnpm-debug.log",".yarn/cache",".yarn/unplugged",".yarn/install-state.gz",".yarn/build-state.yml",".npm","node_modules/.cache",".yalc",".lerna",".nx/cache",".vite/deps",".turbo","tsconfig.tsbuildinfo",".hardhat",".foundry",".anchor"],U=[];var y={customPaths:[],customDirs:[],customFiles:[],protectedPaths:[],dockerMode:!0,logfile:!1,rebuild:!0};var Re=e=>{let n={};for(let t of e){if(!t.startsWith("--"))continue;let[c,a]=t.slice(2).split("=",2);if(!(!c||!a))try{let h=JSON.parse(a);n[c]=h}catch{a==="true"?n[c]=!0:a==="false"?n[c]=!1:n[c]=a}}return n},be=()=>{let e="torchrc.json";if(!m.existsSync(e))return{};try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return o("Invalid torchrc.json (must be valid JSON) - skipping custom config","warn"),{}}},I=()=>{let e=be();return{customPaths:e.customPaths??y.customPaths,customDirs:e.customDirs??y.customDirs,customFiles:e.customFiles??y.customFiles,protectedPaths:e.protectedPaths??y.protectedPaths,dockerMode:e.dockerMode??y.dockerMode,logfile:e.logfile??y.logfile,rebuild:e.rebuild??y.rebuild}};var T=(e=[])=>{let n=I(),t=Re(e);return{...n,...t}},G=()=>{let e=I();return[...e.customPaths,...e.customDirs,...e.customFiles].filter(t=>typeof t=="string").map(t=>t.trim()).filter(t=>t.length>0)},ee=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=0,t=I(),c=G(),a=t.protectedPaths,h=[...new Set([...A,...F,...U])],B=[...new Set(c)],v=[...P],L=h.filter(r=>!a.some(u=>r===u||r.startsWith(u+"/"))),R=B.filter(r=>!a.some(u=>r===u||r.startsWith(u+"/"))),b=r=>{if(m.existsSync(r)){o(`${e?"Would remove":"Removing"} ${r}...`,"step");try{e||m.rmSync(r,{recursive:!0,force:!0}),o(`${r} ${e?"marked for removal (dry-run)":"removed"}`,"success"),n++}catch{o(`Failed to remove ${r}`,"fail")}}},O=()=>{for(let r of v)if(r.includes("*"))try{let C=m.readdirSync(".",{withFileTypes:!0}).filter($=>$.name.match(r.replace("*",".*"))).map($=>$.name);for(let $ of C){let k=Z.join(".",$);if(m.existsSync(k)&&m.statSync(k).isFile()&&!a.some(Y=>k===Y||k.startsWith(Y+"/"))){o(`${e?"Would remove":"Removing"} ${k}...`,"step");try{e||m.unlinkSync(k),o(`${k} ${e?"marked for removal (dry-run)":"removed"}`,"success"),n++}catch{o(`Failed to remove ${k}`,"fail")}}}}catch(C){o(`Failed to process pattern ${r}: ${C}`,"warn")}else m.existsSync(r)&&b(r)};o("Scanning for build artifacts and cache directories...","step"),L.forEach(b),o("Scanning for log files and temporary files...","step"),O(),R.length>0&&(o("Deleting user defined custom directories and files","step"),R.forEach(b));let s=h.length-L.length+(B.length-R.length);return s>0&&o(`Skipped ${s} protected path(s) from torchrc.json`,"info"),n===0?(o("No build artifacts or cache directories found (project already clean)","info"),!1):(o(`Removed ${n} build/cache directories`,"success"),!0)},oe=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return l("npm")&&(e||d("npm cache clean --force"))&&(o(e?"Dry-run: would clean npm cache":"npm cache cleaned","success"),n=!0),l("yarn")&&(e||d("yarn cache clean"))&&(o(e?"Dry-run: would clean yarn cache":"yarn cache cleaned","success"),n=!0),l("pnpm")&&(e||d("pnpm store prune"))&&(o(e?"Dry-run: would clean pnpm store":"pnpm store cleaned","success"),n=!0),n||o("No package manager caches cleaned (tools not available)","info"),n};function ne(){return j.existsSync("Dockerfile")||j.existsSync("docker-compose.yml")||j.existsSync("docker-compose.yaml")}function te(){if(T().dockerMode===!1)return o("Docker mode disabled in torchrc.json - skipping Docker operations","info"),"NO_DOCKER";let n=process.env.TORCH_DRY_RUN==="1";return ne()?(o("Stopping Docker services and removing all resources...","info"),l("docker")?d("docker info",{silent:!0})?d("docker compose ps",{silent:!0})?n?(o("Dry-run: would run 'docker compose down --rmi all --volumes'","info"),"OK"):d("docker compose down --rmi all --volumes")?(o("Docker services stopped and resources cleaned","success"),"OK"):(o("Docker cleanup encountered issues","warn"),o("Continuing with the rest of the script...","info"),"DOCKER_FAIL"):(o("No Docker Compose services found - skipping Docker cleanup","warn"),o("This is normal if no services were previously running","info"),"DOCKER_FAIL"):(o("Docker daemon is not running - skipping Docker cleanup","warn"),o("You may need to start Docker manually and run cleanup later","info"),"NO_DOCKER"):(o("Docker is not installed - skipping Docker cleanup","warn"),"NO_DOCKER")):(o("No Docker configuration found - skipping Docker operations","info"),"NO_DOCKER")}function se(){let e=T();if(e.dockerMode===!1)return!1;if(e.rebuild===!1)return o("Rebuild disabled in torchrc.json - skipping Docker rebuild","info"),!1;let n=process.env.TORCH_DRY_RUN==="1";return ne()?l("docker")?d("docker info",{silent:!0})?(o("Building Docker resources (this may take a while...)...","step"),console.log(` ${f.YELLOW("\u23F3 Please be patient - pulling fresh images and building...")}`),n?(o("Dry-run: would run 'docker-compose build --pull --no-cache'","info"),!0):d("docker-compose build --pull --no-cache")?!0:(o("Docker build encountered issues - check torch-it.log for details","fail"),!1)):(o("Docker daemon is not running - skipping Docker rebuild","warn"),o("Start Docker manually and run 'docker-compose build --pull --no-cache' later","info"),!1):(o("Docker is not installed - skipping Docker rebuild","warn"),!1):!1}function re(){if(T().dockerMode===!1)return!1;let n=process.env.TORCH_DRY_RUN==="1";return o("Starting Docker services in detached mode...","step"),n?(o("Dry-run: would run 'docker compose up -d'","info"),!0):d("docker compose up -d")?!0:(o("Failed to start Docker services - check torch-it.log for details","fail"),!1)}var M=D(require("fs"));var ie=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return o("Detecting package manager and installing dependencies...","step"),M.existsSync("pnpm-lock.yaml")&&l("pnpm")?(o("Using pnpm (detected pnpm-lock.yaml)...","step"),e||d("pnpm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),n=!0):o("pnpm install failed","fail")):M.existsSync("yarn.lock")&&l("yarn")?(o("Using yarn (detected yarn.lock)...","step"),e||d("yarn install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),n=!0):o("yarn install failed","fail")):M.existsSync("package-lock.json")&&l("npm")?(o("Using npm (detected package-lock.json)...","step"),e||d("npm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),n=!0):o("npm install failed","fail")):l("npm")?(o("Using npm (fallback)...","info"),e||d("npm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),n=!0):o("npm install failed","fail")):l("yarn")?(o("Using yarn (fallback)...","info"),e||d("yarn install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),n=!0):o("yarn install failed","")):l("pnpm")?(o("Using pnpm (fallback)...","info"),e||d("pnpm install")?(o(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),n=!0):o("pnpm install failed","fail")):o("No package manager found (npm/yarn/pnpm). Please install dependencies manually.","fail"),n};var ce=e=>{let n="",t="",c="";e.dockerClean==="NO_DOCKER"?n=`${i.DOCKER} No Docker containers found`:e.dockerClean==="DOCKER_FAIL"&&(n=`${i.FAIL} Failed to remove Docker containers`),e.dockerClean==="OK"&&(e.dockerRebuild?t=`${i.DOCKER} Docker containers rebuilt from scratch`:t=`${i.FAIL} Failed to rebuild Docker containers`,e.dockerLaunch&&e.dockerRebuild?c=`${i.ROCKET} Services running in detached mode`:c=`${i.FAIL} Failed to start Docker containers`);let a=e.buildAndCacheClean&&e.packageManagerClean?`${i.CLEAN} All build artifacts & caches removed`:`${i.FAIL} Build artifacts or cache directories not found`,h=e.dependencyInstall?`${i.BOX} Dependencies freshly installed`:`${i.FAIL} Failed to install dependencies`;console.log(""),w(["\u{1F525} PROJECT SUCCESSFULLY TORCHED! \u{1F525}","",`${a}`,`${h}`,`${n}`,`${t}`,`${c}`,"",e.logfile===!1?`${i.CLIPBOARD} Logging to torch-it.log is disabled; set "logfile": true in torchrc.json to enable it`:`${i.CLIPBOARD} Check torch-it.log for detailed logs`])};var ae=()=>{o(`
16
16
  \u{1F525} Torch It - Project Environment Reset Tool
17
17
 
18
18
  USAGE:
@@ -20,6 +20,8 @@ USAGE:
20
20
 
21
21
  OPTIONS:
22
22
  --help Show this help message and exit
23
+ --version, -v Show version information and exit
24
+ --config Show current configuration and exit
23
25
  --test Run in dry-run mode (preview changes without executing)
24
26
  --dockerMode=<bool> Enable/disable Docker operations (default: true)
25
27
  --rebuild=<bool> Enable/disable rebuild operations (default: true)
@@ -29,6 +31,8 @@ OPTIONS:
29
31
 
30
32
  EXAMPLES:
31
33
  torch-it # Run with default settings
34
+ torch-it --version # Show version information
35
+ torch-it --config # Show current configuration
32
36
  torch-it --test # Preview what would be done
33
37
  torch-it --rebuild=false # Clean only, don't rebuild
34
38
  torch-it --dockerMode=false # Skip Docker operations
@@ -47,4 +51,12 @@ CONFIGURATION:
47
51
  }
48
52
 
49
53
  For more information, visit: https://github.com/piyook/torch-it
50
- `.trim(),"info")};var A=process.argv.slice(2);A.includes("--help")&&(te(),process.exit(0));var re=A.includes("--test");re&&(process.env.TORCH_DRY_RUN="1");var b=R(A.filter(e=>e!=="--test"&&e!=="--help"));M(b.logfile);b.logfile&&B();H();re&&o("Running in --test dry-run mode (no files or services will be changed)","warn");var f={dockerClean:"NO_DOCKER",buildAndCacheClean:!1,packageManagerClean:!1,dependencyInstall:!1,dockerRebuild:!1,dockerLaunch:!1,logfile:b.logfile};o(`${t.CLEAN} DOCKER CLEANUP`,"step");f.dockerClean=Z();o(`${t.CLEAN} BUILD ARTIFACTS & CACHE CLEANUP`,"step");f.buildAndCacheClean=z();o("Cleaning package manager caches...","step");f.packageManagerClean=V();b.rebuild!==!1?(j(),o(`${t.BUILD} DEPENDENCY INSTALLATION`,"step"),f.dependencyInstall=ne()):(o("Rebuild disabled - skipping dependency installation","info"),f.dependencyInstall=!1);f.dockerClean!=="NO_DOCKER"&&b.rebuild!==!1?(o(`${t.BUILD} DOCKER REBUILD`,"step"),f.dockerRebuild=ee()):f.dockerClean!=="NO_DOCKER"&&b.rebuild===!1&&(o("Rebuild disabled - skipping Docker rebuild","info"),f.dockerRebuild=!1);f.dockerRebuild&&(f.dockerLaunch=oe(),o(`${t.ROCKET} LAUNCH`,"step"));se(f);
54
+ `.trim(),"info")};var p=D(require("fs"));var le=()=>{let e=I(),n=G(),t=e.protectedPaths;o("=".repeat(60),"info"),o("TORCH-IT CONFIGURATION","info"),o("=".repeat(60),"info"),o(`
55
+ BASIC SETTINGS:`,"info"),o(` Docker Mode: ${e.dockerMode}`,"info"),o(` Rebuild: ${e.rebuild}`,"info"),o(` Logfile: ${e.logfile}`,"info"),o(`
56
+ PACKAGE MANAGER DETECTION:`,"info");let c=[];p.existsSync("package-lock.json")&&l("npm")?c.push("npm (package-lock.json)"):l("npm")&&c.push("npm (fallback)"),p.existsSync("yarn.lock")&&l("yarn")?c.push("yarn (yarn.lock)"):l("yarn")&&c.push("yarn (fallback)"),p.existsSync("pnpm-lock.yaml")&&l("pnpm")?c.push("pnpm (pnpm-lock.yaml)"):l("pnpm")&&c.push("pnpm (fallback)"),c.length>0?c.forEach(s=>o(` ${s}`,"info")):o(" No package manager detected","warn"),o(`
57
+ DOCKER DETECTION:`,"info");let h=["Dockerfile","docker-compose.yml","docker-compose.yaml"].filter(s=>p.existsSync(s));h.length>0?h.forEach(s=>o(` ${s}`,"info")):o(" No Docker configuration found","info"),o(`
58
+ FILES/DIRECTORIES THAT WILL BE DELETED:`,"info");let v=[...new Set([...A,...F,...U,...P])].filter(s=>!t.some(r=>s===r||s.startsWith(r+"/"))),L=n.filter(s=>!t.some(r=>s===r||s.startsWith(r+"/"))),R=v.filter(s=>!s.includes("*")&&p.existsSync(s)),b=v.filter(s=>s.includes("*")),O=L.filter(s=>p.existsSync(s));R.length>0&&(o(" Default targets:","info"),R.forEach(s=>{let r=p.statSync(s).isDirectory()?"DIR":"FILE";o(` ${s} (${r})`,"info")})),b.length>0&&(o(" Glob patterns:","info"),b.forEach(s=>{try{let r=p.readdirSync(".",{withFileTypes:!0}).filter(u=>u.name.match(s.replace("*",".*"))).map(u=>u.name);r.length>0?(o(` ${s} (matches ${r.length} file${r.length===1?"":"s"}):`,"info"),r.forEach(u=>{o(` ${u} (FILE)`,"info")})):o(` ${s} (no matches)`,"info")}catch(r){o(` ${s} (error: ${r})`,"warn")}})),O.length>0&&(o(" Custom targets:","info"),O.forEach(s=>{let r=p.statSync(s).isDirectory()?"DIR":"FILE";o(` ${s} (${r})`,"info")})),R.length===0&&b.length===0&&O.length===0&&o(" No targets found (nothing to delete)","info"),t.length>0?(o(`
59
+ PROTECTED PATHS (will NOT be deleted):`,"info"),t.forEach(s=>{let r=p.existsSync(s),u=r&&p.statSync(s).isDirectory()?"DIR":"FILE",C=r?`(${u})`:"(not found)";o(` ${s} ${C}`,"info")})):o(`
60
+ PROTECTED PATHS: None`,"info"),n.length>0&&(o(`
61
+ CUSTOM PATHS FROM torchrc.json:`,"info"),n.forEach(s=>{let r=p.existsSync(s),u=r&&p.statSync(s).isDirectory()?"DIR":"FILE",C=r?`(${u})`:"(not found)";o(` ${s} ${C}`,"info")})),o(`
62
+ `+"=".repeat(60),"info"),o("Use 'torch-it --help' for available options","info"),o("=".repeat(60),"info")};var S=process.argv.slice(2);S.includes("--help")&&(ae(),process.exit(0));if(S.includes("--version")||S.includes("-v")){let e=fe();o(`torch-it v${e.version}`,"info"),process.exit(0)}S.includes("--config")&&(le(),process.exit(0));var de=S.includes("--test");de&&(process.env.TORCH_DRY_RUN="1");var _=T(S.filter(e=>e!=="--test"&&e!=="--help"&&e!=="--version"&&e!=="-v"&&e!=="--config"));X(_.logfile);_.logfile&&q();z();de&&o("Running in --test dry-run mode (no files or services will be changed)","warn");var g={dockerClean:"NO_DOCKER",buildAndCacheClean:!1,packageManagerClean:!1,dependencyInstall:!1,dockerRebuild:!1,dockerLaunch:!1,logfile:_.logfile};o(`${i.CLEAN} DOCKER CLEANUP`,"step");g.dockerClean=te();o(`${i.CLEAN} BUILD ARTIFACTS & CACHE CLEANUP`,"step");g.buildAndCacheClean=ee();o("Cleaning package manager caches...","step");g.packageManagerClean=oe();_.rebuild!==!1?(V(),o(`${i.BUILD} DEPENDENCY INSTALLATION`,"step"),g.dependencyInstall=ie()):(o("Rebuild disabled - skipping dependency installation","info"),g.dependencyInstall=!1);g.dockerClean!=="NO_DOCKER"&&_.rebuild!==!1?(o(`${i.BUILD} DOCKER REBUILD`,"step"),g.dockerRebuild=se()):g.dockerClean!=="NO_DOCKER"&&_.rebuild===!1&&(o("Rebuild disabled - skipping Docker rebuild","info"),g.dockerRebuild=!1);g.dockerRebuild&&(g.dockerLaunch=re(),o(`${i.ROCKET} LAUNCH`,"step"));ce(g);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "torch-it",
3
- "version": "2.4.2",
3
+ "version": "2.5.1",
4
4
  "description": "CLI to reset, clean, and rebuild Node.js project environments.",
5
5
  "keywords": [
6
6
  "cleanup",