torch-it 2.1.2 → 2.3.0

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
@@ -4,7 +4,7 @@
4
4
  [![tests workflow](https://github.com/piyook/torch-it/actions/workflows/tests.yaml/badge.svg)](https://github.com/piyook/torch-it/actions/workflows/tests.yaml)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
 
7
- A powerful, all-in-one, fully customizable tool to **reset, clean, and rebuild** your Node.js (and optionally Dockerized) project environments with a single command.
7
+ A powerful, all-in-one, zero-dependency, fully customizable tool to **reset, clean, and rebuild** your Node.js (and optionally Dockerized) project environments with a single command.
8
8
 
9
9
  ---
10
10
 
@@ -27,6 +27,8 @@ It's surprising how often this just fixes things. 🤞
27
27
  - **One command** to clear all local caches, delete `node_modules`, and reinstall dependencies
28
28
  - **Fully customizable** — specify any directories or files to delete
29
29
  - **Docker support** — removes containers, images, and volumes and rebuilds from scratch 🐳
30
+ - **Cross-platform** — works on Windows, Linux, and macOS
31
+ - **Zero-dependency** — no additional packages required
30
32
 
31
33
  ## Supported Frameworks
32
34
 
@@ -104,20 +106,22 @@ For project-level customization (recommended), create `torchrc.json` in your pro
104
106
  {
105
107
  "customPaths": ["apps/web/.next", "services/api/tmp", ".turbo/cache", "coverage-final.json"],
106
108
  "protectedPaths": ["important-data/", "config/production.json"],
107
- "dockerMode": true
109
+ "dockerMode": true,
110
+ "logfile": false
108
111
  }
109
112
  ```
110
113
 
111
114
  - `customPaths`: Array of additional directories and files to remove during cleanup. Supports both directories and files. torch-it will remove these in the same cleanup pass as the built-in targets.
112
115
  - `protectedPaths`: Array of directories and files to skip during cleanup. These paths will be preserved even if they match built-in or custom cleanup targets.
113
116
  - `dockerMode`: Boolean flag to enable/disable Docker operations. Set to `false` to skip all Docker cleanup, rebuild, and launch steps. Defaults to `true`.
117
+ - `logfile`: Boolean flag to enable or disable writing runtime output to `torch-it.log`. Set to `false` to disable file logging. Defaults to `true`.
114
118
 
115
119
  **Note**: The `torchrc.json` file is completely optional. torch-it works with sensible defaults out of the box. Only create this file if you need to customize the behavior.
116
120
 
117
121
 
118
122
  ## Logging
119
123
 
120
- `torch-it` outputs information to the console and writes logs to `torch-it.log` in your project root so you can troubleshoot any issues and see what was removed and reinstalled.
124
+ `torch-it` outputs information to the console and writes logs to `torch-it.log` in your project root by default so you can troubleshoot any issues and see what was removed and reinstalled. If you set `logfile` to `false` in `torchrc.json`, no log file will be written.
121
125
 
122
126
  This file should be ignored by git to avoid accidental commits. Add this to your `.gitignore`:
123
127
 
package/dist/torch-it.js CHANGED
@@ -1,11 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var be=Object.create;var H=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty;var Ee=(e,o,r,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of ke(o))!Te.call(e,s)&&s!==r&&H(e,s,{get:()=>o[s],enumerable:!(n=Oe(o,s))||n.enumerable});return e};var R=(e,o,r)=>(r=e!=null?be(ye(e)):{},Ee(o||!e||!e.__esModule?H(r,"default",{value:e,enumerable:!0}):r,e));var $=R(require("fs"));var W=(e=0)=>o=>`\x1B[${o+e}m`,V=(e=0)=>o=>`\x1B[${38+e};5;${o}m`,X=(e=0)=>(o,r,n)=>`\x1B[${38+e};2;${o};${r};${n}m`,l={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Ge=Object.keys(l.modifier),_e=Object.keys(l.color),De=Object.keys(l.bgColor),He=[..._e,...De];function Ae(){let e=new Map;for(let[o,r]of Object.entries(l)){for(let[n,s]of Object.entries(r))l[n]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},r[n]=l[n],e.set(s[0],s[1]);Object.defineProperty(l,o,{value:r,enumerable:!1})}return Object.defineProperty(l,"codes",{value:e,enumerable:!1}),l.color.close="\x1B[39m",l.bgColor.close="\x1B[49m",l.color.ansi=W(),l.color.ansi256=V(),l.color.ansi16m=X(),l.bgColor.ansi=W(10),l.bgColor.ansi256=V(10),l.bgColor.ansi16m=X(10),Object.defineProperties(l,{rgbToAnsi256:{value(o,r,n){return o===r&&r===n?o<8?16:o>248?231:Math.round((o-8)/247*24)+232:16+36*Math.round(o/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(o){let r=/[a-f\d]{6}|[a-f\d]{3}/i.exec(o.toString(16));if(!r)return[0,0,0];let[n]=r;n.length===3&&(n=[...n].map(i=>i+i).join(""));let s=Number.parseInt(n,16);return[s>>16&255,s>>8&255,s&255]},enumerable:!1},hexToAnsi256:{value:o=>l.rgbToAnsi256(...l.hexToRgb(o)),enumerable:!1},ansi256ToAnsi:{value(o){if(o<8)return 30+o;if(o<16)return 90+(o-8);let r,n,s;if(o>=232)r=((o-232)*10+8)/255,n=r,s=r;else{o-=16;let _=o%36;r=Math.floor(o/36)/5,n=Math.floor(_/6)/5,s=_%6/5}let i=Math.max(r,n,s)*2;if(i===0)return 30;let u=30+(Math.round(s)<<2|Math.round(n)<<1|Math.round(r));return i===2&&(u+=60),u},enumerable:!1},rgbToAnsi:{value:(o,r,n)=>l.ansi256ToAnsi(l.rgbToAnsi256(o,r,n)),enumerable:!1},hexToAnsi:{value:o=>l.ansi256ToAnsi(l.hexToAnsi256(o)),enumerable:!1}}),l}var Ne=Ae(),g=Ne;var I=R(require("node:process"),1),q=R(require("node:os"),1),M=R(require("node:tty"),1);function m(e,o=globalThis.Deno?globalThis.Deno.args:I.default.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",n=o.indexOf(r+e),s=o.indexOf("--");return n!==-1&&(s===-1||n<s)}var{env:a}=I.default,S;m("no-color")||m("no-colors")||m("color=false")||m("color=never")?S=0:(m("color")||m("colors")||m("color=true")||m("color=always"))&&(S=1);function Se(){if("FORCE_COLOR"in a)return a.FORCE_COLOR==="true"?1:a.FORCE_COLOR==="false"?0:a.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(a.FORCE_COLOR,10),3)}function Ie(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function ve(e,{streamIsTTY:o,sniffFlags:r=!0}={}){let n=Se();n!==void 0&&(S=n);let s=r?S:n;if(s===0)return 0;if(r){if(m("color=16m")||m("color=full")||m("color=truecolor"))return 3;if(m("color=256"))return 2}if("TF_BUILD"in a&&"AGENT_NAME"in a)return 1;if(e&&!o&&s===void 0)return 0;let i=s||0;if(a.TERM==="dumb")return i;if(I.default.platform==="win32"){let u=q.default.release().split(".");return Number(u[0])>=10&&Number(u[2])>=10586?Number(u[2])>=14931?3:2:1}if("CI"in a)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(u=>u in a)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(u=>u in a)||a.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in a)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(a.TEAMCITY_VERSION)?1:0;if(a.COLORTERM==="truecolor"||a.TERM==="xterm-kitty"||a.TERM==="xterm-ghostty"||a.TERM==="wezterm")return 3;if("TERM_PROGRAM"in a){let u=Number.parseInt((a.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(a.TERM_PROGRAM){case"iTerm.app":return u>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(a.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(a.TERM)||"COLORTERM"in a?1:i}function J(e,o={}){let r=ve(e,{streamIsTTY:e&&e.isTTY,...o});return Ie(r)}var Le={stdout:J({isTTY:M.default.isatty(1)}),stderr:J({isTTY:M.default.isatty(2)})},z=Le;function Q(e,o,r){let n=e.indexOf(o);if(n===-1)return e;let s=o.length,i=0,u="";do u+=e.slice(i,n)+o+r,i=n+s,n=e.indexOf(o,i);while(n!==-1);return u+=e.slice(i),u}function Z(e,o,r,n){let s=0,i="";do{let u=e[n-1]==="\r";i+=e.slice(s,u?n-1:n)+o+(u?`\r
3
- `:`
4
- `)+r,s=n+1,n=e.indexOf(`
5
- `,s)}while(n!==-1);return i+=e.slice(s),i}var{stdout:ee,stderr:oe}=z,P=Symbol("GENERATOR"),k=Symbol("STYLER"),A=Symbol("IS_EMPTY"),re=["ansi","ansi","ansi256","ansi16m"],y=Object.create(null),xe=(e,o={})=>{if(o.level&&!(Number.isInteger(o.level)&&o.level>=0&&o.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=ee?ee.level:0;e.level=o.level===void 0?r:o.level};var we=e=>{let o=(...r)=>r.join(" ");return xe(o,e),Object.setPrototypeOf(o,N.prototype),o};function N(e){return we(e)}Object.setPrototypeOf(N.prototype,Function.prototype);for(let[e,o]of Object.entries(g))y[e]={get(){let r=v(this,K(o.open,o.close,this[k]),this[A]);return Object.defineProperty(this,e,{value:r}),r}};y.visible={get(){let e=v(this,this[k],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var U=(e,o,r,...n)=>e==="rgb"?o==="ansi16m"?g[r].ansi16m(...n):o==="ansi256"?g[r].ansi256(g.rgbToAnsi256(...n)):g[r].ansi(g.rgbToAnsi(...n)):e==="hex"?U("rgb",o,r,...g.hexToRgb(...n)):g[r][e](...n),$e=["rgb","hex","ansi256"];for(let e of $e){y[e]={get(){let{level:r}=this;return function(...n){let s=K(U(e,re[r],"color",...n),g.color.close,this[k]);return v(this,s,this[A])}}};let o="bg"+e[0].toUpperCase()+e.slice(1);y[o]={get(){let{level:r}=this;return function(...n){let s=K(U(e,re[r],"bgColor",...n),g.bgColor.close,this[k]);return v(this,s,this[A])}}}}var Fe=Object.defineProperties(()=>{},{...y,level:{enumerable:!0,get(){return this[P].level},set(e){this[P].level=e}}}),K=(e,o,r)=>{let n,s;return r===void 0?(n=e,s=o):(n=r.openAll+e,s=o+r.closeAll),{open:e,close:o,openAll:n,closeAll:s,parent:r}},v=(e,o,r)=>{let n=(...s)=>Be(n,s.length===1?""+s[0]:s.join(" "));return Object.setPrototypeOf(n,Fe),n[P]=e,n[k]=o,n[A]=r,n},Be=(e,o)=>{if(e.level<=0||!o)return e[A]?"":o;let r=e[k];if(r===void 0)return o;let{openAll:n,closeAll:s}=r;if(o.includes("\x1B"))for(;r!==void 0;)o=Q(o,r.close,r.open),r=r.parent;let i=o.indexOf(`
6
- `);return i!==-1&&(o=Z(o,s,n,i)),n+o+s};Object.defineProperties(N.prototype,y);var Me=N(),Qe=N({level:oe?oe.level:0});var b=Me;var d={BOLD:b.bold,CYAN:b.cyan,GREEN:b.green,RED:b.red,YELLOW:b.yellow,PURPLE:b.magenta,RESET:b.reset},c={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 j=R(require("fs"));function Pe(e){return e.replace(/\u001b\[[0-9;]*m/g,"")}var ne=()=>{j.default.writeFileSync("torch-it.log","")},L=e=>{let o=Pe(e).replace(/^\n/,""),r=new Date().toISOString();j.default.appendFileSync("torch-it.log",`[${r}] ${o}
7
- `)};function t(e,o){let r;switch(o){case"info":r=`${d.CYAN(c.INFO)} ${d.BOLD(e)}${d.RESET("")}`;break;case"success":r=`${d.GREEN(c.SUCCESS)} ${e}${d.RESET("")}`;break;case"warn":r=`${d.YELLOW(c.WARN)} ${e}${d.RESET("")}`;break;case"fail":r=`${d.RED(c.FAIL)} ${e}${d.RESET("")}`;break;case"step":r=`
8
- ${d.PURPLE("\u25B6")} ${d.BOLD(e)}${d.RESET("")}`;break;default:r=e}console.log(r),L(r)}function te(){x([` ${c.TARGET} TORCH LIT ${c.ROCKET}`],d.PURPLE);let e=`
2
+ "use strict";var V=Object.create;var I=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ne=(e,n,s,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of Z(n))!oe.call(e,i)&&i!==s&&I(e,i,{get:()=>n[i],enumerable:!(l=Q(n,i))||l.enumerable});return e};var R=(e,n,s)=>(s=e!=null?V(ee(e)):{},ne(n||!e||!e.__esModule?I(s,"default",{value:e,enumerable:!0}):s,e));var y=R(require("fs"));var h=(e,n)=>s=>`\x1B[${e}m${s}\x1B[${n}m`,t={BOLD:h("1","22"),CYAN:h("36","39"),GREEN:h("32","39"),RED:h("31","39"),YELLOW:h("33","39"),PURPLE:h("35","39"),RESET:e=>`\x1B[0m${e}`},r={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 O=R(require("fs")),L=!0;function se(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"")}var w=e=>{L=e},v=()=>{L&&O.default.writeFileSync("torch-it.log","")},k=e=>{if(!L)return;let n=se(e).replace(/^\n/,""),s=new Date().toISOString();O.default.appendFileSync("torch-it.log",`[${s}] ${n}
3
+ `)};function o(e,n){let s;switch(n){case"info":s=`${t.CYAN(r.INFO)} ${t.BOLD(e)}${t.RESET("")}`;break;case"success":s=`${t.GREEN(r.SUCCESS)} ${e}${t.RESET("")}`;break;case"warn":s=`${t.YELLOW(r.WARN)} ${e}${t.RESET("")}`;break;case"fail":s=`${t.RED(r.FAIL)} ${e}${t.RESET("")}`;break;case"step":s=`
4
+ ${t.PURPLE("\u25B6")} ${t.BOLD(e)}${t.RESET("")}`;break;default:s=e}console.log(s),k(s)}function P(){D([` ${r.TARGET} TORCH LIT ${r.ROCKET}`],t.PURPLE);let e=`
9
5
  ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
10
6
  (( (( (( (( (( (( (( (( (( (( (( (( (( ((
11
7
  ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
@@ -16,4 +12,4 @@ ${d.PURPLE("\u25B6")} ${d.BOLD(e)}${d.RESET("")}`;break;default:r=e}console.log(
16
12
  | _ \\| | | | |_) | \\| || || \\| | | _
17
13
  | |_) | |_| | _ <| |\\ || || |\\ | |_| |
18
14
  |____/ \\___/|_| \\_\\_| \\_|___|_| \\_|\\____|
19
- `;console.log(e),L(e)}function se(){console.log(""),x([` ${c.PHOENIX} RISING FROM THE ASHES ${c.PHOENIX}`],d.PURPLE)}function x(e,o=d.GREEN){let n=o("\u2550".repeat(56));console.log(o("\u2554"+n+"\u2557")),e.forEach(s=>{if(L(s),s.trim()==="")console.log(o("\u2551"+" ".repeat(56)+"\u2551"));else{let i=56-s.length;console.log(o("\u2551"+s+" ".repeat(i)+"\u2551"))}}),console.log(o("\u255A"+n+"\u255D"))}var w=require("child_process"),ie=R(require("os"));function f(e,o={}){try{return(0,w.execSync)(e,{stdio:o.silent?"pipe":"inherit"}),!0}catch{return o.silent||t(`Command failed: ${e}`,"fail"),!1}}function p(e){try{return ie.platform()==="win32"?(0,w.execSync)(`where ${e}`,{stdio:"ignore"}):(0,w.execSync)(`command -v ${e}`,{stdio:"ignore"}),!0}catch{return!1}}var O=R(require("fs"));var ce=["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"],le=[".pnpm-store",".pnpm-debug.log",".yarn/cache",".yarn/unplugged",".yarn/install-state.gz",".yarn/build-state.yml",".npm","node_modules/.cache"],ae=[];var T={customPaths:[],customDirs:[],customFiles:[],protectedPaths:[],dockerMode:!0};var Ue=()=>{let e="torchrc.json";if(!O.existsSync(e))return{};try{return JSON.parse(O.readFileSync(e,"utf8"))}catch{return t("Invalid torchrc.json (must be valid JSON) - skipping custom config","warn"),{}}},E=()=>{let e=Ue();return{customPaths:e.customPaths??T.customPaths,customDirs:e.customDirs??T.customDirs,customFiles:e.customFiles??T.customFiles,protectedPaths:e.protectedPaths??T.protectedPaths,dockerMode:e.dockerMode??T.dockerMode}},Ke=()=>{let e=E();return[...e.customPaths,...e.customDirs,...e.customFiles].filter(r=>typeof r=="string").map(r=>r.trim()).filter(r=>r.length>0)},ue=()=>{let e=process.env.TORCH_DRY_RUN==="1",o=0,r=E(),n=Ke(),s=r.protectedPaths,i=[...new Set([...ce,...le,...ae])],u=[...new Set(n)],_=i.filter(h=>!s.some(D=>h===D||h.startsWith(D+"/"))),B=u.filter(h=>!s.some(D=>h===D||h.startsWith(D+"/"))),Y=h=>{if(O.existsSync(h)){t(`${e?"Would remove":"Removing"} ${h}...`,"step");try{e||O.rmSync(h,{recursive:!0,force:!0}),t(`${h} ${e?"marked for removal (dry-run)":"removed"}`,"success"),o++}catch{t(`Failed to remove ${h}`,"fail")}}};t("Scanning for build artifacts and cache directories...","step"),_.forEach(Y),B.length>0&&(t("Deleting user defined custom directories and files","step"),B.forEach(Y));let G=i.length-_.length+(u.length-B.length);return G>0&&t(`Skipped ${G} protected path(s) from torchrc.json`,"info"),o===0?(t("No build artifacts or cache directories found (project already clean)","info"),!1):(t(`Removed ${o} build/cache directories`,"success"),!0)},de=()=>{let e=process.env.TORCH_DRY_RUN==="1",o=!1;return p("npm")&&(e||f("npm cache clean --force"))&&(t(e?"Dry-run: would clean npm cache":"npm cache cleaned","success"),o=!0),p("yarn")&&(e||f("yarn cache clean"))&&(t(e?"Dry-run: would clean yarn cache":"yarn cache cleaned","success"),o=!0),p("pnpm")&&(e||f("pnpm store prune"))&&(t(e?"Dry-run: would clean pnpm store":"pnpm store cleaned","success"),o=!0),o||t("No package manager caches cleaned (tools not available)","info"),o};function fe(){return $.existsSync("Dockerfile")||$.existsSync("docker-compose.yml")||$.existsSync("docker-compose.yaml")}function pe(){if(E().dockerMode===!1)return t("Docker mode disabled in torchrc.json - skipping Docker operations","info"),"NO_DOCKER";let o=process.env.TORCH_DRY_RUN==="1";return fe()?(t("Stopping Docker services and removing all resources...","info"),p("docker")?f("docker info",{silent:!0})?f("docker compose ps",{silent:!0})?o?(t("Dry-run: would run 'docker compose down --rmi all --volumes'","info"),"OK"):f("docker compose down --rmi all --volumes")?(t("Docker services stopped and resources cleaned","success"),"OK"):(t("Docker cleanup encountered issues","warn"),t("Continuing with the rest of the script...","info"),"DOCKER_FAIL"):(t("No Docker Compose services found - skipping Docker cleanup","warn"),t("This is normal if no services were previously running","info"),"DOCKER_FAIL"):(t("Docker daemon is not running - skipping Docker cleanup","warn"),t("You may need to start Docker manually and run cleanup later","info"),"NO_DOCKER"):(t("Docker is not installed - skipping Docker cleanup","warn"),"NO_DOCKER")):(t("No Docker configuration found - skipping Docker operations","info"),"NO_DOCKER")}function me(){if(E().dockerMode===!1)return!1;let o=process.env.TORCH_DRY_RUN==="1";return fe()?p("docker")?f("docker info",{silent:!0})?(t("Building Docker resources (this may take a while...)...","step"),console.log(` ${d.YELLOW("\u23F3 Please be patient - pulling fresh images and building...")}`),o?(t("Dry-run: would run 'docker-compose build --pull --no-cache'","info"),!0):f("docker-compose build --pull --no-cache")?!0:(t("Docker build encountered issues - check torch-it.log for details","fail"),!1)):(t("Docker daemon is not running - skipping Docker rebuild","warn"),t("Start Docker manually and run 'docker-compose build --pull --no-cache' later","info"),!1):(t("Docker is not installed - skipping Docker rebuild","warn"),!1):!1}function he(){if(E().dockerMode===!1)return!1;let o=process.env.TORCH_DRY_RUN==="1";return t("Starting Docker services in detached mode...","step"),o?(t("Dry-run: would run 'docker compose up -d'","info"),!0):f("docker compose up -d")?!0:(t("Failed to start Docker services - check torch-it.log for details","fail"),!1)}var F=R(require("fs"));var ge=()=>{let e=process.env.TORCH_DRY_RUN==="1",o=!1;return t("Detecting package manager and installing dependencies...","step"),F.existsSync("pnpm-lock.yaml")&&p("pnpm")?(t("Using pnpm (detected pnpm-lock.yaml)...","step"),e||f("pnpm install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),o=!0):t("pnpm install failed","fail")):F.existsSync("yarn.lock")&&p("yarn")?(t("Using yarn (detected yarn.lock)...","step"),e||f("yarn install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),o=!0):t("yarn install failed","fail")):F.existsSync("package-lock.json")&&p("npm")?(t("Using npm (detected package-lock.json)...","step"),e||f("npm install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),o=!0):t("npm install failed","fail")):p("npm")?(t("Using npm (fallback)...","info"),e||f("npm install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with npm`,"success"),o=!0):t("npm install failed","fail")):p("yarn")?(t("Using yarn (fallback)...","info"),e||f("yarn install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with yarn`,"success"),o=!0):t("yarn install failed","")):p("pnpm")?(t("Using pnpm (fallback)...","info"),e||f("pnpm install")?(t(`Dependencies ${e?"would be installed":"installed successfully"} with pnpm`,"success"),o=!0):t("pnpm install failed","fail")):t("No package manager found (npm/yarn/pnpm). Please install dependencies manually.","fail"),o};var Ce=e=>{let o="",r="",n="";e.dockerClean==="NO_DOCKER"?o=`${c.DOCKER} No Docker containers found`:e.dockerClean==="DOCKER_FAIL"&&(o=`${c.FAIL} Failed to remove Docker containers`),e.dockerClean==="OK"&&(e.dockerRebuild?r=`${c.DOCKER} Docker containers rebuilt from scratch`:r=`${c.FAIL} Failed to rebuild Docker containers`,e.dockerLaunch&&e.dockerRebuild?n=`${c.ROCKET} Services running in detached mode`:n=`${c.FAIL} Failed to start Docker containers`);let s=e.buildAndCacheClean&&e.packageManagerClean?`${c.CLEAN} All build artifacts & caches removed`:`${c.FAIL} Build artifacts or cache directories not found`,i=e.dependencyInstall?`${c.BOX} Dependencies freshly installed`:`${c.FAIL} Failed to install dependencies`;console.log(""),x(["\u{1F525} PROJECT SUCCESSFULLY TORCHED! \u{1F525}","",`${s}`,`${i}`,`${o}`,`${r}`,`${n}`,"",`${c.CLIPBOARD} Check torch-it.log for detailed logs`])};var je=process.argv.slice(2),Re=je.includes("--test");Re&&(process.env.TORCH_DRY_RUN="1");ne();te();Re&&t("Running in --test dry-run mode (no files or services will be changed)","warn");var C={dockerClean:"NO_DOCKER",buildAndCacheClean:!1,packageManagerClean:!1,dependencyInstall:!1,dockerRebuild:!1,dockerLaunch:!1};t(`${c.CLEAN} DOCKER CLEANUP`,"step");C.dockerClean=pe();t(`${c.CLEAN} BUILD ARTIFACTS & CACHE CLEANUP`,"step");C.buildAndCacheClean=ue();t("Cleaning package manager caches...","step");C.packageManagerClean=de();se();t(`${c.BUILD} DEPENDENCY INSTALLATION`,"step");C.dependencyInstall=ge();C.dockerClean&&(t(`${c.BUILD} DOCKER REBUILD`,"step"),C.dockerRebuild=me());C.dockerRebuild&&(C.dockerLaunch=he(),t(`${c.ROCKET} LAUNCH`,"step"));Ce(C);
15
+ `;console.log(e),k(e)}function F(){console.log(""),D([` ${r.PHOENIX} RISING FROM THE ASHES ${r.PHOENIX}`],t.PURPLE)}function x(e){let n=new RegExp("\x1B\\[[0-9;]*m","g");return e.replace(n,"").length}function D(e,n=t.GREEN){let s=Math.max(56,...e.map(i=>x(i))),l=n("\u2550".repeat(s));console.log(n("\u2554"+l+"\u2557")),e.forEach(i=>{if(k(i),i.trim()==="")console.log(n("\u2551"+" ".repeat(s)+"\u2551"));else{let g=s-x(i);console.log(n("\u2551"+i+" ".repeat(g)+"\u2551"))}}),console.log(n("\u255A"+l+"\u255D"))}var _=require("child_process"),U=R(require("os"));function c(e,n={}){try{return(0,_.execSync)(e,{stdio:n.silent?"pipe":"inherit"}),!0}catch{return n.silent||o(`Command failed: ${e}`,"fail"),!1}}function a(e){try{return U.platform()==="win32"?(0,_.execSync)(`where ${e}`,{stdio:"ignore"}):(0,_.execSync)(`command -v ${e}`,{stdio:"ignore"}),!0}catch{return!1}}var m=R(require("fs"));var B=["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"],K=[".pnpm-store",".pnpm-debug.log",".yarn/cache",".yarn/unplugged",".yarn/install-state.gz",".yarn/build-state.yml",".npm","node_modules/.cache"],M=[];var f={customPaths:[],customDirs:[],customFiles:[],protectedPaths:[],dockerMode:!0,logfile:!0};var re=()=>{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"),{}}},p=()=>{let e=re();return{customPaths:e.customPaths??f.customPaths,customDirs:e.customDirs??f.customDirs,customFiles:e.customFiles??f.customFiles,protectedPaths:e.protectedPaths??f.protectedPaths,dockerMode:e.dockerMode??f.dockerMode,logfile:e.logfile??f.logfile}},te=()=>{let e=p();return[...e.customPaths,...e.customDirs,...e.customFiles].filter(s=>typeof s=="string").map(s=>s.trim()).filter(s=>s.length>0)},H=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=0,s=p(),l=te(),i=s.protectedPaths,g=[...new Set([...B,...K,...M])],S=[...new Set(l)],$=g.filter(u=>!i.some(C=>u===C||u.startsWith(C+"/"))),b=S.filter(u=>!i.some(C=>u===C||u.startsWith(C+"/"))),A=u=>{if(m.existsSync(u)){o(`${e?"Would remove":"Removing"} ${u}...`,"step");try{e||m.rmSync(u,{recursive:!0,force:!0}),o(`${u} ${e?"marked for removal (dry-run)":"removed"}`,"success"),n++}catch{o(`Failed to remove ${u}`,"fail")}}};o("Scanning for build artifacts and cache directories...","step"),$.forEach(A),b.length>0&&(o("Deleting user defined custom directories and files","step"),b.forEach(A));let N=g.length-$.length+(S.length-b.length);return N>0&&o(`Skipped ${N} 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)},Y=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return a("npm")&&(e||c("npm cache clean --force"))&&(o(e?"Dry-run: would clean npm cache":"npm cache cleaned","success"),n=!0),a("yarn")&&(e||c("yarn cache clean"))&&(o(e?"Dry-run: would clean yarn cache":"yarn cache cleaned","success"),n=!0),a("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 j(){return y.existsSync("Dockerfile")||y.existsSync("docker-compose.yml")||y.existsSync("docker-compose.yaml")}function G(){if(p().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 j()?(o("Stopping Docker services and removing all resources...","info"),a("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 W(){if(p().dockerMode===!1)return!1;let n=process.env.TORCH_DRY_RUN==="1";return j()?a("docker")?c("docker info",{silent:!0})?(o("Building Docker resources (this may take a while...)...","step"),console.log(` ${t.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 X(){if(p().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 E=R(require("fs"));var J=()=>{let e=process.env.TORCH_DRY_RUN==="1",n=!1;return o("Detecting package manager and installing dependencies...","step"),E.existsSync("pnpm-lock.yaml")&&a("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")):E.existsSync("yarn.lock")&&a("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")):E.existsSync("package-lock.json")&&a("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")):a("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")):a("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","")):a("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 q=e=>{let n="",s="",l="";e.dockerClean==="NO_DOCKER"?n=`${r.DOCKER} No Docker containers found`:e.dockerClean==="DOCKER_FAIL"&&(n=`${r.FAIL} Failed to remove Docker containers`),e.dockerClean==="OK"&&(e.dockerRebuild?s=`${r.DOCKER} Docker containers rebuilt from scratch`:s=`${r.FAIL} Failed to rebuild Docker containers`,e.dockerLaunch&&e.dockerRebuild?l=`${r.ROCKET} Services running in detached mode`:l=`${r.FAIL} Failed to start Docker containers`);let i=e.buildAndCacheClean&&e.packageManagerClean?`${r.CLEAN} All build artifacts & caches removed`:`${r.FAIL} Build artifacts or cache directories not found`,g=e.dependencyInstall?`${r.BOX} Dependencies freshly installed`:`${r.FAIL} Failed to install dependencies`;console.log(""),D(["\u{1F525} PROJECT SUCCESSFULLY TORCHED! \u{1F525}","",`${i}`,`${g}`,`${n}`,`${s}`,`${l}`,"",e.logfile===!1?`${r.CLIPBOARD} Logging to torch-it.log is disabled; set "logfile": true in torchrc.json to enable it`:`${r.CLIPBOARD} Check torch-it.log for detailed logs`])};var ce=process.argv.slice(2),z=ce.includes("--test");z&&(process.env.TORCH_DRY_RUN="1");var T=p();w(T.logfile);T.logfile&&v();P();z&&o("Running in --test dry-run mode (no files or services will be changed)","warn");var d={dockerClean:"NO_DOCKER",buildAndCacheClean:!1,packageManagerClean:!1,dependencyInstall:!1,dockerRebuild:!1,dockerLaunch:!1,logfile:T.logfile};o(`${r.CLEAN} DOCKER CLEANUP`,"step");d.dockerClean=G();o(`${r.CLEAN} BUILD ARTIFACTS & CACHE CLEANUP`,"step");d.buildAndCacheClean=H();o("Cleaning package manager caches...","step");d.packageManagerClean=Y();F();o(`${r.BUILD} DEPENDENCY INSTALLATION`,"step");d.dependencyInstall=J();d.dockerClean&&(o(`${r.BUILD} DOCKER REBUILD`,"step"),d.dockerRebuild=W());d.dockerRebuild&&(d.dockerLaunch=X(),o(`${r.ROCKET} LAUNCH`,"step"));q(d);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "torch-it",
3
- "version": "2.1.2",
3
+ "version": "2.3.0",
4
4
  "description": "CLI to reset, clean, and rebuild Node.js project environments.",
5
5
  "keywords": [
6
6
  "cleanup",
@@ -42,9 +42,7 @@
42
42
  "test": "tsc --noEmit && vitest run",
43
43
  "test:watch": "vitest"
44
44
  },
45
- "dependencies": {
46
- "chalk": "^5.6.2"
47
- },
45
+ "dependencies": {},
48
46
  "devDependencies": {
49
47
  "@commitlint/cli": "^20.5.0",
50
48
  "@commitlint/config-conventional": "^20.5.0",