bunvm 1.0.1 → 1.0.3

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
@@ -19,11 +19,11 @@
19
19
 
20
20
  ## 🖥️ Platform Support
21
21
 
22
- | Platform | Status | Tested |
23
- |----------|--------|---------|
24
- | Linux | ✅ Supported | ✅ Tested on Ubuntu/Debian |
25
- | macOS | ⚠️ Should work | Not tested yet |
26
- | Windows | ❓ Unknown | ❓ Not tested yet |
22
+ | Platform | Status | Tested |
23
+ | -------- | ------------ | ------------------------------- |
24
+ | Linux | ✅ Supported | ✅ Tested on Ubuntu/Debian |
25
+ | macOS | Supported | Tested on M2 (Apple Silicon) |
26
+ | Windows | ❓ Unknown | ❓ Not tested yet |
27
27
 
28
28
  **Note**: BVM has been tested and works on Linux systems. macOS support should work but hasn't been tested yet. Windows support is planned but not implemented.
29
29
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  ## 📦 Installation
33
33
 
34
- ### Install from npm
34
+ ### Install from npm
35
35
 
36
36
  ```bash
37
37
  # With npm
@@ -67,8 +67,10 @@ Once installed, you can use `bvm` from anywhere in your terminal:
67
67
 
68
68
  ```bash
69
69
  bvm install <version> # Install a specific Bun version (alias: i)
70
+ bvm install latest # Install the latest Bun version
70
71
  bvm use <version> # Set a specific Bun version as active
71
72
  bvm uninstall <version> # Remove an installed version (alias: u)
73
+ bvm current # Display currently activated version of Bun
72
74
  bvm list # List installed Bun versions (alias: ls)
73
75
  bvm remote # List available remote Bun versions (alias: r)
74
76
  bvm --help # Show help information
@@ -80,6 +82,9 @@ bvm --help # Show help information
80
82
 
81
83
  ```bash
82
84
  # Install the latest Bun version
85
+ bvm install latest
86
+
87
+ # Install a specific Bun version
83
88
  bvm install 1.0.12
84
89
  # or use alias
85
90
  bvm i 1.0.12
@@ -106,7 +111,7 @@ bvm u 1.0.11 # or use alias
106
111
 
107
112
  ### Prerequisites
108
113
 
109
- - Node.js 18+
114
+ - Node.js 18+
110
115
  - pnpm (recommended) or npm
111
116
 
112
117
  ### Setup
@@ -174,4 +179,4 @@ If you encounter any issues or have questions:
174
179
  2. Create a new issue with details about your environment
175
180
  3. Include your platform, shell, and any error messages
176
181
 
177
- **Happy Bunning! 🥖✨**
182
+ **Happy Bunning! 🥖✨**
package/dist/bvm.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import{Command as Oe}from"commander";import{mkdirSync as Ve,existsSync as L}from"fs";import{join as Z}from"path";import U from"chalk";import{homedir as k}from"os";import{join as f}from"path";var S=f(k(),".bun"),y=f(S,"bin"),s=f(y,"bun"),x=f(y,"bunx"),ce=f(k(),".bvm"),p=f(ce,"versions"),le="https://api.github.com",H=`${le}/repos/oven-sh/bun/releases`,N=f(S,"_bun"),$=f(k(),".config","fish","config.fish");import w from"chalk";var n={log:e=>console.log(e),info:e=>console.log(`${w.blue("i")} ${e}`),success:e=>console.log(`${w.green("\u2705")} ${e}`),warn:e=>console.warn(`${w.yellow("\u26A0\uFE0F")} ${w.yellow(e)}`),error:e=>console.error(`${w.red("\u274C")} ${w.red(e)}`)};import{execSync as we}from"child_process";import{createReadStream as O,existsSync as ve,readdirSync as Se}from"fs";import l from"chalk";import{dirname as $e,join as j}from"path";import be from"axios";import{pipeline as xe}from"stream/promises";import Ne from"unzipper";import{chmod as Ie}from"fs/promises";import{createWriteStream as ue,existsSync as T,lstatSync as me,mkdirSync as pe,rmSync as fe,symlinkSync as de}from"fs";import{rm as ge,stat as he,unlink as Be}from"fs/promises";async function C(e,r){let t=ue(r);await new Promise((o,a)=>{t.on("finish",o),t.on("error",a),e.pipe(t)})}async function g(e){try{return await he(e),!0}catch{return!1}}async function b(e,r=!1){try{await g(e)&&(r?await ge(e,{recursive:!0,force:!0}):await Be(e))}catch(t){t.code!=="ENOENT"&&n.warn(`Failed to clean path: ${e}`)}}function I(e){let r=["B","KB","MB","GB"];if(e===0)return"0 B";let t=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,t)).toFixed(1)} ${r[t]}`}function _(e){T(e)||pe(e,{recursive:!0})}function ye(e){if(T(e)){let r=me(e).isSymbolicLink();try{fe(e,{force:!0}),r||n.warn(`Replaced non-symlink file at ${e}`)}catch(t){n.warn(`Couldn't remove existing file at ${e}: ${t.message}`)}}}function M(e,r){T(e)&&(ye(r),de(e,r))}import z from"cli-progress";function V(){try{return we("bun --version",{encoding:"utf8",stdio:["pipe"]}).trim()||null}catch{return null}}function D(){return ve(p)?Se(p):[]}function F(e,r,t){let o=r===e,a=t.has(e);return o?`${l.magenta("v"+e)} ${l.yellow("\u2B50 (current)")}`:a?`${l.magenta("v"+e)} ${l.green("\u2713 (installed)")}`:`${l.magenta("v"+e)} ${l.red("\u2717 (not installed)")}`}function _e(){return`${process.platform}-${process.arch}`}function Ee(e){async function r(){console.log(l.red(`
3
- Download interrupted. Cleaning up...`)),await b(e,!0),process.exit(1)}return process.once("SIGINT",r),()=>process.removeListener("SIGINT",r)}async function G(e,r){let t=_e(),o=`https://github.com/oven-sh/bun/releases/download/bun-v${e}/bun-${t}.zip`,a=`${r}.zip`,i=$e(r),c=j(i,`bun-${t}`),u=j(c,"bun"),v=Ee(i);try{let m=await be.get(o,{responseType:"stream"});if(m.status!==200)throw new Error(`Failed to download ZIP file. Status: ${m.status}`);let B=Number(m.headers["content-length"])||0,P=0,R=new z.SingleBar({format:`${l.magenta("Downloading")} {bar} {percentage}% | {downloaded}/{totalSize}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:!0},z.Presets.shades_classic);if(B&&R.start(B,0,{downloaded:"0 B",totalSize:I(B)}),m.data.on("data",ae=>{P+=ae.length,B&&R.update(P,{downloaded:I(P),totalSize:I(B)})}),await C(m.data,a),B&&R.stop(),n.log(l.yellow("\u{1F4E6} Extracting...")),await xe(O(a),Ne.Extract({path:i})),!await g(u))throw new Error(`Expected binary not found at ${u}`);await C(O(u),r),await Ie(r,493),await b(c,!0),await b(a),n.success(`Downloaded Bun ${l.bold(`v${e}`)}`)}catch(m){n.error(`Failed to install Bun: ${m instanceof Error?m.message:m}`),await b(i,!0),process.exit(1)}finally{v()}}import{join as Te}from"path";import{existsSync as Ce}from"fs";import Me from"chalk";import{homedir as Le}from"os";import{join as d}from"path";import{readFile as K,writeFile as Y}from"fs/promises";import{execSync as Ue}from"child_process";async function J(){if(!await g(s)){n.error(`Bun binary not found at ${s}, skipping completions`);return}let e=X();if(!e){n.warn("Unknown shell. Please manually set up Bun completions.");return}try{Ue(`${s} completions`,{env:{...process.env,IS_BUN_AUTO_UPDATE:"true",SHELL:e},stdio:"ignore"})}catch(r){n.error(`Failed to set up ${e} completions: ${r}`)}}function X(){let e=process.env.SHELL??"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}function Pe(e){let r=Le();switch(e){case"bash":{let t=process.env.XDG_CONFIG_HOME;return[d(r,".bashrc"),d(r,".bash_profile"),...t?[d(t,".bashrc"),d(t,".bash_profile"),d(t,"bashrc"),d(t,"bash_profile")]:[]]}case"zsh":return[d(r,".zshrc")];case"fish":return[d(r,".config","fish","config.fish")];default:return[]}}async function Re(){let e=[`set --export BUN_INSTALL "${S}"`,'set --export PATH "$BUN_INSTALL/bin" $PATH'];if(await g($))try{let r=await K($,"utf8"),t=e.filter(o=>!r.includes(o));if(t.length>0){let o=r+`
2
+ import{Command as zr}from"commander";import{mkdirSync as Fr,existsSync as P}from"fs";import{join as Q}from"path";import R from"chalk";import{homedir as k}from"os";import{join as f}from"path";var S=f(k(),".bun"),v=f(S,"bin"),s=f(v,"bun"),x=f(v,"bunx"),mr=f(k(),".bvm"),p=f(mr,"versions"),pr="https://api.github.com",N=`${pr}/repos/oven-sh/bun/releases`,I=f(S,"_bun"),$=f(k(),".config","fish","config.fish");import w from"chalk";var n={log:r=>console.log(r),info:r=>console.log(`${w.blue("i")} ${r}`),success:r=>console.log(`${w.green("\u2705")} ${r}`),warn:r=>console.warn(`${w.yellow("\u26A0\uFE0F")} ${w.yellow(r)}`),error:r=>console.error(`${w.red("\u274C")} ${w.red(r)}`)};import{execSync as $r}from"child_process";import{createReadStream as O,existsSync as br,readdirSync as xr}from"fs";import l from"chalk";import{dirname as Nr,join as j}from"path";import G from"axios";import{pipeline as Ir}from"stream/promises";import _r from"unzipper";import{chmod as Er}from"fs/promises";import{createWriteStream as fr,existsSync as C,lstatSync as dr,mkdirSync as gr,rmSync as hr,symlinkSync as Br}from"fs";import{rm as vr,stat as wr,unlink as yr}from"fs/promises";async function D(r,e){let t=fr(e);await new Promise((o,a)=>{t.on("finish",o),t.on("error",a),r.pipe(t)})}async function h(r){try{return await wr(r),!0}catch{return!1}}async function b(r,e=!1){try{await h(r)&&(e?await vr(r,{recursive:!0,force:!0}):await yr(r))}catch(t){t.code!=="ENOENT"&&n.warn(`Failed to clean path: ${r}`)}}function _(r){let e=["B","KB","MB","GB"];if(r===0)return"0 B";let t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/Math.pow(1024,t)).toFixed(1)} ${e[t]}`}function E(r){C(r)||gr(r,{recursive:!0})}function Sr(r){if(C(r)){let e=dr(r).isSymbolicLink();try{hr(r,{force:!0}),e||n.warn(`Replaced non-symlink file at ${r}`)}catch(t){n.warn(`Couldn't remove existing file at ${r}: ${t.message}`)}}}function M(r,e){C(r)&&(Sr(e),Br(r,e))}import z from"cli-progress";function L(){try{return $r("bun --version",{encoding:"utf8",stdio:["pipe"]}).trim()||null}catch{return null}}function F(){return br(p)?xr(p):[]}async function K(){try{let{data:r}=await G.get(N);return r.length===0?(n.warn("No Bun versions found."),null):r[0].tag_name.replace(/^bun-v/,"")}catch{n.error("Error fetching latest Bun version."),process.exit(1)}}function A(r,e,t){let o=e===r,a=t.has(r);return o?`${l.magenta("v"+r)} ${l.yellow("\u2B50 (current)")}`:a?`${l.magenta("v"+r)} ${l.green("\u2713 (installed)")}`:`${l.magenta("v"+r)} ${l.red("\u2717 (not installed)")}`}function Lr(){let r=`${process.platform}-${process.arch}`;switch(r){case"darwin-arm64":return"darwin-aarch64";default:return r}}function Ur(r){async function e(){console.log(l.red(`
3
+ Download interrupted. Cleaning up...`)),await b(r,!0),process.exit(1)}return process.once("SIGINT",e),()=>process.removeListener("SIGINT",e)}async function Y(r,e){let t=Lr(),o=`https://github.com/oven-sh/bun/releases/download/bun-v${r}/bun-${t}.zip`,a=`${e}.zip`,i=Nr(e),c=j(i,`bun-${t}`),u=j(c,"bun"),y=Ur(i);try{let m=await G.get(o,{responseType:"stream"});if(m.status!==200)throw new Error(`Failed to download ZIP file. Status: ${m.status}`);let B=Number(m.headers["content-length"])||0,V=0,T=new z.SingleBar({format:`${l.magenta("Downloading")} {bar} {percentage}% | {downloaded}/{totalSize}`,barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:!0},z.Presets.shades_classic);if(B&&T.start(B,0,{downloaded:"0 B",totalSize:_(B)}),m.data.on("data",ur=>{V+=ur.length,B&&T.update(V,{downloaded:_(V),totalSize:_(B)})}),await D(m.data,a),B&&T.stop(),n.log(l.yellow("\u{1F4E6} Extracting...")),await Ir(O(a),_r.Extract({path:i})),!await h(u))throw new Error(`Expected binary not found at ${u}`);await D(O(u),e),await Er(e,493),await b(c,!0),await b(a),n.success(`Downloaded Bun ${l.bold(`v${r}`)}`)}catch(m){n.error(`Failed to install Bun: ${m instanceof Error?m.message:m}`),await b(i,!0),process.exit(1)}finally{y()}}import{join as Cr}from"path";import{existsSync as Dr}from"fs";import Mr from"chalk";import{homedir as Pr}from"os";import{join as d}from"path";import{readFile as J,writeFile as X}from"fs/promises";import{execSync as Rr}from"child_process";async function W(){if(!await h(s)){n.error(`Bun binary not found at ${s}, skipping completions`);return}let r=Z();if(!r){n.warn("Unknown shell. Please manually set up Bun completions.");return}try{Rr(`${s} completions`,{env:{...process.env,IS_BUN_AUTO_UPDATE:"true",SHELL:r},stdio:"ignore"})}catch(e){n.error(`Failed to set up ${r} completions: ${e}`)}}function Z(){let r=process.env.SHELL??"";return r.includes("bash")?"bash":r.includes("zsh")?"zsh":r.includes("fish")?"fish":null}function Vr(r){let e=Pr();switch(r){case"bash":{let t=process.env.XDG_CONFIG_HOME;return[d(e,".bashrc"),d(e,".bash_profile"),...t?[d(t,".bashrc"),d(t,".bash_profile"),d(t,"bashrc"),d(t,"bash_profile")]:[]]}case"zsh":return[d(e,".zshrc")];case"fish":return[d(e,".config","fish","config.fish")];default:return[]}}async function Tr(){let r=[`set --export BUN_INSTALL "${S}"`,'set --export PATH "$BUN_INSTALL/bin" $PATH'];if(await h($))try{let e=await J($,"utf8"),t=r.filter(o=>!e.includes(o));if(t.length>0){let o=e+`
4
4
  # bun
5
5
  ${t.join(`
6
6
  `)}
7
- `;await Y($,o),n.success(`Updated ${$} with Bun configuration`)}}catch(r){let t=r instanceof Error?r.message:String(r);n.warn(`Could not update Fish config: ${t}`)}else n.warn("Fish config file not found. Please add Bun configuration manually.")}async function ke(e){if(!e){n.warn("Invalid shell provided");return}if(e==="fish"){await Re();return}let r=`export BUN_INSTALL="${S}"
7
+ `;await X($,o),n.success(`Updated ${$} with Bun configuration`)}}catch(e){let t=e instanceof Error?e.message:String(e);n.warn(`Could not update Fish config: ${t}`)}else n.warn("Fish config file not found. Please add Bun configuration manually.")}async function kr(r){if(!r){n.warn("Invalid shell provided");return}if(r==="fish"){await Tr();return}let e=`export BUN_INSTALL="${S}"
8
8
  `,t=`export PATH="$BUN_INSTALL/bin:$PATH"
9
- `,o=`[ -s "${N}" ] && source "${N}"
10
- `,a=Pe(e);for(let i of a)if(await g(i))try{let c=await K(i,"utf8"),u=!1,v=c;c.includes("BUN_INSTALL")||(v+=`
9
+ `,o=`[ -s "${I}" ] && source "${I}"
10
+ `,a=Vr(r);for(let i of a)if(await h(i))try{let c=await J(i,"utf8"),u=!1,y=c;c.includes("BUN_INSTALL")||(y+=`
11
11
  # bun
12
- ${r}${t}`,u=!0),c.includes(N)||(v+=`
12
+ ${e}${t}`,u=!0),c.includes(I)||(y+=`
13
13
  # bun completions
14
- ${o}`,u=!0),u&&(await Y(i,v),n.success(`Updated ${i} with Bun configuration`));return}catch(c){let u=c instanceof Error?c.message:String(c);n.warn(`Could not update ${i}: ${u}`)}n.warn(`No writable ${e} config file found. Please add manually.`)}async function W(){let e=X();if(!e){n.warn("Unknown shell. Please manually add Bun to your shell config.");return}await ke(e)}async function E(e){let r=Te(p,e,"bun");if(!Ce(r)){n.error(`Bun version ${e} is not installed.`),n.info(`Run ${Me.cyan(`bvm install ${e}`)} to install it.`);return}try{_(y),M(r,s),M(r,x),await J(),n.success(`Now using Bun ${e}`)}catch(t){n.error(`Failed to switch Bun version: ${t.message}`)}}async function q(e){let r=Z(p,e),t=Z(r,"bun");if(L(r)&&L(t)){n.warn(`Bun ${U.green(`v${e}`)} is already installed.`);return}if(Ve(r,{recursive:!0}),n.log(`${U.cyan("\u{1F4E5} Installing")} Bun ${U.green(`v${e}`)}...`),await G(e,t),!L(s)||!L(x)){n.warn("No previously installed Bun versions found. Setting up environment..."),_(y);try{await W()}catch(o){n.error(`Failed to configure shell: ${o.message}. Please set up completions manually.`)}await E(e);return}n.success(`Installed Bun ${U.bold(`v${e}`)}`)}import Q from"chalk";import De from"axios";function ee(){try{let e=V();n.log(`Current Bun version: ${e??"none"}`);let r=D();if(r.length===0){n.warn("No Bun versions installed yet.");return}n.log(Q.green(`\u{1F680} Installed Bun versions:
15
- `)),r.forEach(t=>{n.log(F(t,e,new Set(r)))})}catch{n.error("No Bun versions installed yet.")}}async function re(){try{let{data:e}=await De.get(H),r=e.map(({tag_name:i})=>i.replace(/^bun-v/,""));if(r.length===0){n.warn("No Bun versions found remotely.");return}let t=D(),o=new Set(t),a=V();n.log(Q.green(`\u{1F680} Available Bun versions:
16
- `)),r.forEach(i=>{n.log(F(i,a,o))})}catch(e){n.error(`Error fetching remote versions: ${e instanceof Error?e.message:e}`)}}import{join as ne,resolve as te}from"path";import{existsSync as A,readlinkSync as Fe,rmSync as oe}from"fs";import Ae from"chalk";function ie(e){let r=ne(p,e),t=ne(r,"bun");if(!A(r)||!A(t)){n.warn(`Bun version ${e} is not installed.`);return}if(A(s))try{te(Fe(s))===te(t)&&(oe(s,{force:!0}),n.log(`\u{1F517} Removed active symlink for Bun ${e}.`))}catch{}try{oe(r,{recursive:!0,force:!0}),n.log(Ae.green(`\u{1F5D1}\uFE0F Bun ${e} has been uninstalled.`))}catch(o){n.error(`Failed to uninstall Bun ${e}: ${o.message}`)}}var se="1.0.1";var h=new Oe;h.name("bvm").description("Bun Version Manager - Manage multiple Bun versions").version(se);h.command("install <version>").alias("i").description("Install a specific Bun version").action(q);h.command("use <version>").description("Use a specific Bun version").action(E);h.command("uninstall <version>").alias("u").description("Uninstall a specific Bun version").action(ie);h.command("list").alias("ls").description("List installed Bun versions").action(ee);h.command("remote").alias("r").description("List remote Bun versions").action(re);h.parse();
14
+ ${o}`,u=!0),u&&(await X(i,y),n.success(`Updated ${i} with Bun configuration`));return}catch(c){let u=c instanceof Error?c.message:String(c);n.warn(`Could not update ${i}: ${u}`)}n.warn(`No writable ${r} config file found. Please add manually.`)}async function q(){let r=Z();if(!r){n.warn("Unknown shell. Please manually add Bun to your shell config.");return}await kr(r)}async function U(r){let e=Cr(p,r,"bun");if(!Dr(e)){n.error(`Bun version ${r} is not installed.`),n.info(`Run ${Mr.cyan(`bvm install ${r}`)} to install it.`);return}try{E(v),M(e,s),M(e,x),await W(),n.success(`Now using Bun ${r}`)}catch(t){n.error(`Failed to switch Bun version: ${t.message}`)}}async function rr(r){if(r==="latest"){let o=await K();if(!o)return;r=o}let e=Q(p,r),t=Q(e,"bun");if(P(e)&&P(t)){n.warn(`Bun ${R.green(`v${r}`)} is already installed.`);return}if(Fr(e,{recursive:!0}),n.log(`${R.cyan("\u{1F4E5} Installing")} Bun ${R.green(`v${r}`)}...`),await Y(r,t),!P(s)||!P(x)){n.warn("No previously installed Bun versions found. Setting up environment..."),E(v);try{await q()}catch(o){n.error(`Failed to configure shell: ${o.message}. Please set up completions manually.`)}await U(r);return}n.success(`Installed Bun ${R.bold(`v${r}`)}`)}import er from"chalk";import Ar from"axios";function nr(){try{let r=L();n.log(`Current Bun version: ${r?`v${r}`:"none"}`);let e=F();if(e.length===0){n.warn("No Bun versions installed yet.");return}n.log(er.green(`\u{1F680} Installed Bun versions:
15
+ `)),e.forEach(t=>{n.log(A(t,r,new Set(e)))})}catch{n.error("No Bun versions installed yet.")}}async function tr(){try{let{data:r}=await Ar.get(N),e=r.map(({tag_name:i})=>i.replace(/^bun-v/,""));if(e.length===0){n.warn("No Bun versions found remotely.");return}let t=F(),o=new Set(t),a=L();n.log(er.green(`\u{1F680} Available Bun versions:
16
+ `)),e.forEach(i=>{n.log(A(i,a,o))})}catch(r){n.error(`Error fetching remote versions: ${r instanceof Error?r.message:r}`)}}function or(){let r=L();if(r===null){n.error("No Bun version is currently active. Install one with: bvm install <version>");return}n.log(`Current Bun version: v${r}`)}import{join as ir,resolve as sr}from"path";import{existsSync as H,readlinkSync as Hr,rmSync as ar}from"fs";import Or from"chalk";function cr(r){let e=ir(p,r),t=ir(e,"bun");if(!H(e)||!H(t)){n.warn(`Bun version ${r} is not installed.`);return}if(H(s))try{sr(Hr(s))===sr(t)&&(ar(s,{force:!0}),n.log(`\u{1F517} Removed active symlink for Bun ${r}.`))}catch{}try{ar(e,{recursive:!0,force:!0}),n.log(Or.green(`\u{1F5D1}\uFE0F Bun ${r} has been uninstalled.`))}catch(o){n.error(`Failed to uninstall Bun ${r}: ${o.message}`)}}var lr="1.0.3";var g=new zr;g.name("bvm").description("Bun Version Manager - Manage multiple Bun versions").version(lr);g.command("install <version>").alias("i").description("Install a specific Bun version").action(rr);g.command("use <version>").description("Use a specific Bun version").action(U);g.command("uninstall <version>").alias("u").description("Uninstall a specific Bun version").action(cr);g.command("current").description("Display currently activated version of Bun").action(or);g.command("list").alias("ls").description("List installed Bun versions").action(nr);g.command("remote").alias("r").description("List remote Bun versions").action(tr);g.parse();
17
17
  //# sourceMappingURL=bvm.js.map
package/dist/bvm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bvm.ts","../src/commands/install.ts","../src/lib/constants.ts","../src/lib/logger.ts","../src/lib/utils.ts","../src/lib/file.ts","../src/commands/use.ts","../src/lib/shell.ts","../src/commands/versions.ts","../src/commands/uninstall.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { installBun } from './commands/install'\nimport { useVersion } from './commands/use'\nimport { listRemoteVersions, listVersions } from './commands/versions'\nimport { uninstallBun } from './commands/uninstall'\nimport { version } from '../package.json'\n\nconst program = new Command()\n\nprogram\n .name('bvm')\n .description('Bun Version Manager - Manage multiple Bun versions')\n .version(version)\n\nprogram\n .command('install <version>')\n .alias('i')\n .description('Install a specific Bun version')\n .action(installBun)\n\nprogram\n .command('use <version>')\n .description('Use a specific Bun version')\n .action(useVersion)\n\nprogram\n .command('uninstall <version>')\n .alias('u')\n .description('Uninstall a specific Bun version')\n .action(uninstallBun)\n\nprogram\n .command('list')\n .alias('ls')\n .description('List installed Bun versions')\n .action(listVersions)\n\nprogram\n .command('remote')\n .alias('r')\n .description('List remote Bun versions')\n .action(listRemoteVersions)\n\nprogram.parse()\n","import { mkdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport chalk from 'chalk'\nimport {\n BUN_VERSIONS_DIR,\n BUN_BIN_DIR,\n BUNX_SYMLINK,\n BUN_SYMLINK,\n} from '../lib/constants'\nimport { log } from '../lib/logger'\nimport { downloadBun } from '../lib/utils'\nimport { ensureDirectoryExists } from '../lib/file'\nimport { useVersion } from './use'\nimport { autoConfigureShell } from '../lib/shell'\n\nexport async function installBun(version: string): Promise<void> {\n const versionDir = join(BUN_VERSIONS_DIR, version)\n const bunBinaryPath = join(versionDir, 'bun')\n\n if (existsSync(versionDir) && existsSync(bunBinaryPath)) {\n log.warn(`Bun ${chalk.green(`v${version}`)} is already installed.`)\n return\n }\n\n mkdirSync(versionDir, { recursive: true })\n\n log.log(`${chalk.cyan('📥 Installing')} Bun ${chalk.green(`v${version}`)}...`)\n\n await downloadBun(version, bunBinaryPath)\n\n if (!existsSync(BUN_SYMLINK) || !existsSync(BUNX_SYMLINK)) {\n log.warn(\n `No previously installed Bun versions found. Setting up environment...`,\n )\n\n ensureDirectoryExists(BUN_BIN_DIR)\n\n try {\n await autoConfigureShell()\n } catch (err) {\n log.error(\n `Failed to configure shell: ${(err as Error).message}. Please set up completions manually.`,\n )\n }\n\n await useVersion(version)\n return\n }\n\n log.success(`Installed Bun ${chalk.bold(`v${version}`)}`)\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport const BUN_DIR = join(homedir(), '.bun')\n\nexport const BUN_BIN_DIR = join(BUN_DIR, 'bin')\n\nexport const BUN_SYMLINK = join(BUN_BIN_DIR, 'bun')\n\nexport const BUNX_SYMLINK = join(BUN_BIN_DIR, 'bunx')\n\nexport const BVM_DIR = join(homedir(), '.bvm')\n\nexport const BUN_VERSIONS_DIR = join(BVM_DIR, 'versions')\n\nexport const GITHUB_API_URL = 'https://api.github.com'\n\nexport const GITHUB_RELEASES_URL = `${GITHUB_API_URL}/repos/oven-sh/bun/releases`\n\nexport const BUN_COMPLETION_FILE = join(BUN_DIR, '_bun')\n\nexport const FISH_CONFIG_PATH = join(\n homedir(),\n '.config',\n 'fish',\n 'config.fish',\n)\n","import chalk from 'chalk'\n\nexport const log = {\n log: (msg: string) => console.log(msg),\n info: (msg: string) => console.log(`${chalk.blue('i')} ${msg}`),\n success: (msg: string) => console.log(`${chalk.green('✅')} ${msg}`),\n warn: (msg: string) =>\n console.warn(`${chalk.yellow('⚠️')} ${chalk.yellow(msg)}`),\n error: (msg: string) => console.error(`${chalk.red('❌')} ${chalk.red(msg)}`),\n}\n","import { execSync } from 'node:child_process'\nimport { createReadStream, existsSync, readdirSync } from 'node:fs'\nimport { BUN_VERSIONS_DIR } from './constants'\nimport chalk from 'chalk'\nimport { dirname, join } from 'node:path'\nimport axios from 'axios'\nimport { log } from './logger'\nimport { pipeline } from 'node:stream/promises'\nimport unzipper from 'unzipper'\nimport { chmod } from 'node:fs/promises'\nimport { cleanPath, exists, formatBytes, streamToFile } from './file'\nimport cliProgress from 'cli-progress'\n\nexport function getCurrentBunVersion(): string | null {\n try {\n const output = execSync('bun --version', {\n encoding: 'utf8',\n stdio: ['pipe'],\n }).trim()\n return output || null\n } catch {\n return null\n }\n}\n\nexport function getInstalledBunVersions(): string[] {\n return existsSync(BUN_VERSIONS_DIR) ? readdirSync(BUN_VERSIONS_DIR) : []\n}\n\nexport function formatVersionInfo(\n version: string,\n currentVersion: string | null,\n installedVersions: Set<string>,\n): string {\n const isActive = currentVersion === version\n const isInstalled = installedVersions.has(version)\n\n if (isActive) {\n return `${chalk.magenta('v' + version)} ${chalk.yellow('⭐ (current)')}`\n }\n\n if (isInstalled) {\n return `${chalk.magenta('v' + version)} ${chalk.green('✓ (installed)')}`\n }\n\n return `${chalk.magenta('v' + version)} ${chalk.red('✗ (not installed)')}`\n}\n\nfunction getPlatformTarget(): string {\n return `${process.platform}-${process.arch}`\n}\n\nfunction registerCleanup(dir: string): () => void {\n async function cleanup() {\n console.log(chalk.red('\\nDownload interrupted. Cleaning up...'))\n await cleanPath(dir, true)\n process.exit(1)\n }\n\n process.once('SIGINT', cleanup)\n return () => process.removeListener('SIGINT', cleanup)\n}\n\nexport async function downloadBun(\n version: string,\n destPath: string,\n): Promise<void> {\n const target = getPlatformTarget()\n const url = `https://github.com/oven-sh/bun/releases/download/bun-v${version}/bun-${target}.zip`\n const zipPath = `${destPath}.zip`\n const destDir = dirname(destPath)\n const extractedDir = join(destDir, `bun-${target}`)\n const extractedBunPath = join(extractedDir, 'bun')\n\n const removeCleanupListener = registerCleanup(destDir)\n\n try {\n const response = await axios.get<NodeJS.ReadableStream>(url, {\n responseType: 'stream',\n })\n\n if (response.status !== 200) {\n throw new Error(`Failed to download ZIP file. Status: ${response.status}`)\n }\n\n const total = Number(response.headers['content-length']) || 0\n let downloaded = 0\n const progress = new cliProgress.SingleBar(\n {\n format: `${chalk.magenta('Downloading')} {bar} {percentage}% | {downloaded}/{totalSize}`,\n barCompleteChar: '█',\n barIncompleteChar: '░',\n hideCursor: true,\n },\n cliProgress.Presets.shades_classic,\n )\n\n if (total) {\n progress.start(total, 0, {\n downloaded: '0 B',\n totalSize: formatBytes(total),\n })\n }\n\n response.data.on('data', (chunk: Buffer) => {\n downloaded += chunk.length\n if (total) {\n progress.update(downloaded, {\n downloaded: formatBytes(downloaded),\n totalSize: formatBytes(total),\n })\n }\n })\n\n await streamToFile(response.data, zipPath)\n if (total) progress.stop()\n\n log.log(chalk.yellow('📦 Extracting...'))\n\n await pipeline(\n createReadStream(zipPath),\n unzipper.Extract({ path: destDir }),\n )\n\n if (!(await exists(extractedBunPath))) {\n throw new Error(`Expected binary not found at ${extractedBunPath}`)\n }\n\n await streamToFile(createReadStream(extractedBunPath), destPath)\n await chmod(destPath, 0o755)\n\n await cleanPath(extractedDir, true)\n await cleanPath(zipPath)\n\n log.success(`Downloaded Bun ${chalk.bold(`v${version}`)}`)\n } catch (error) {\n log.error(\n `Failed to install Bun: ${error instanceof Error ? error.message : error}`,\n )\n await cleanPath(destDir, true)\n process.exit(1)\n } finally {\n removeCleanupListener()\n }\n}\n","import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n symlinkSync,\n} from 'node:fs'\nimport { rm, stat, unlink } from 'node:fs/promises'\nimport { log } from './logger'\n\nexport async function streamToFile(\n readable: NodeJS.ReadableStream,\n path: string,\n): Promise<void> {\n const writer = createWriteStream(path)\n await new Promise<void>((resolve, reject) => {\n writer.on('finish', resolve)\n writer.on('error', reject)\n readable.pipe(writer)\n })\n}\n\nexport async function exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function cleanPath(\n path: string,\n isDirectory = false,\n): Promise<void> {\n try {\n if (await exists(path)) {\n if (isDirectory) {\n await rm(path, { recursive: true, force: true })\n } else {\n await unlink(path)\n }\n }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n if (err.code !== 'ENOENT') {\n log.warn(`Failed to clean path: ${path}`)\n }\n }\n}\n\nexport function formatBytes(bytes: number): string {\n const sizes = ['B', 'KB', 'MB', 'GB']\n if (bytes === 0) return '0 B'\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`\n}\n\nexport function ensureDirectoryExists(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\nexport function removeExistingLink(path: string): void {\n if (existsSync(path)) {\n const isSymlink = lstatSync(path).isSymbolicLink()\n try {\n rmSync(path, { force: true })\n if (!isSymlink) {\n log.warn(`Replaced non-symlink file at ${path}`)\n }\n } catch (error) {\n log.warn(\n `Couldn't remove existing file at ${path}: ${(error as Error).message}`,\n )\n }\n }\n}\n\nexport function createSymlink(src: string, dest: string): void {\n if (existsSync(src)) {\n removeExistingLink(dest)\n symlinkSync(src, dest)\n }\n}\n","import { join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport chalk from 'chalk'\nimport { log } from '../lib/logger'\nimport {\n BUN_BIN_DIR,\n BUN_SYMLINK,\n BUN_VERSIONS_DIR,\n BUNX_SYMLINK,\n} from '../lib/constants'\nimport { createSymlink, ensureDirectoryExists } from '../lib/file'\nimport { setupCompletions } from '../lib/shell'\n\nexport async function useVersion(version: string): Promise<void> {\n const versionBin = join(BUN_VERSIONS_DIR, version, 'bun')\n\n if (!existsSync(versionBin)) {\n log.error(`Bun version ${version} is not installed.`)\n log.info(`Run ${chalk.cyan(`bvm install ${version}`)} to install it.`)\n return\n }\n\n try {\n ensureDirectoryExists(BUN_BIN_DIR)\n createSymlink(versionBin, BUN_SYMLINK)\n createSymlink(versionBin, BUNX_SYMLINK)\n await setupCompletions()\n\n log.success(`Now using Bun ${version}`)\n } catch (err) {\n log.error(`Failed to switch Bun version: ${(err as Error).message}`)\n }\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { log } from './logger'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport {\n BUN_COMPLETION_FILE,\n BUN_DIR,\n BUN_SYMLINK,\n FISH_CONFIG_PATH,\n} from './constants'\nimport { exists } from './file'\nimport { execSync } from 'node:child_process'\nimport { Shell } from './types'\n\nexport async function setupCompletions(): Promise<void> {\n if (!(await exists(BUN_SYMLINK))) {\n log.error(`Bun binary not found at ${BUN_SYMLINK}, skipping completions`)\n return\n }\n\n const shell = getShell()\n\n if (!shell) {\n log.warn('Unknown shell. Please manually set up Bun completions.')\n return\n }\n\n try {\n execSync(`${BUN_SYMLINK} completions`, {\n env: {\n ...process.env,\n IS_BUN_AUTO_UPDATE: 'true',\n SHELL: shell,\n },\n stdio: 'ignore',\n })\n } catch (error) {\n log.error(`Failed to set up ${shell} completions: ${error}`)\n }\n}\n\nfunction getShell(): Shell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.includes('bash')) return 'bash'\n if (shellPath.includes('zsh')) return 'zsh'\n if (shellPath.includes('fish')) return 'fish'\n return null\n}\n\nexport function getShellConfigPath(shell: Shell): string[] {\n const home = homedir()\n switch (shell) {\n case 'bash': {\n const xdg = process.env.XDG_CONFIG_HOME\n return [\n join(home, '.bashrc'),\n join(home, '.bash_profile'),\n ...(xdg\n ? [\n join(xdg, '.bashrc'),\n join(xdg, '.bash_profile'),\n join(xdg, 'bashrc'),\n join(xdg, 'bash_profile'),\n ]\n : []),\n ]\n }\n case 'zsh':\n return [join(home, '.zshrc')]\n case 'fish':\n return [join(home, '.config', 'fish', 'config.fish')]\n default:\n return []\n }\n}\n\nasync function configureFish(): Promise<void> {\n const fishLines = [\n `set --export BUN_INSTALL \"${BUN_DIR}\"`,\n `set --export PATH \"$BUN_INSTALL/bin\" $PATH`,\n ]\n\n if (await exists(FISH_CONFIG_PATH)) {\n try {\n const content = await readFile(FISH_CONFIG_PATH, 'utf8')\n const missingLines = fishLines.filter((line) => !content.includes(line))\n\n if (missingLines.length > 0) {\n const newContent = content + `\\n# bun\\n${missingLines.join('\\n')}\\n`\n await writeFile(FISH_CONFIG_PATH, newContent)\n log.success(`Updated ${FISH_CONFIG_PATH} with Bun configuration`)\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn(`Could not update Fish config: ${message}`)\n }\n } else {\n log.warn(\n 'Fish config file not found. Please add Bun configuration manually.',\n )\n }\n}\n\nasync function configureShell(shell: Shell): Promise<void> {\n if (!shell) {\n log.warn('Invalid shell provided')\n return\n }\n\n if (shell === 'fish') {\n await configureFish()\n return\n }\n\n const bunInstallLine = `export BUN_INSTALL=\"${BUN_DIR}\"\\n`\n const pathLine = `export PATH=\"$BUN_INSTALL/bin:$PATH\"\\n`\n const completionLine = `[ -s \"${BUN_COMPLETION_FILE}\" ] && source \"${BUN_COMPLETION_FILE}\"\\n`\n\n const configPaths = getShellConfigPath(shell)\n\n for (const configPath of configPaths) {\n if (await exists(configPath)) {\n try {\n const content = await readFile(configPath, 'utf8')\n let updated = false\n let newContent = content\n\n if (!content.includes('BUN_INSTALL')) {\n newContent += `\\n# bun\\n${bunInstallLine}${pathLine}`\n updated = true\n }\n\n if (!content.includes(BUN_COMPLETION_FILE)) {\n newContent += `\\n# bun completions\\n${completionLine}`\n updated = true\n }\n\n if (updated) {\n await writeFile(configPath, newContent)\n log.success(`Updated ${configPath} with Bun configuration`)\n }\n return\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn(`Could not update ${configPath}: ${message}`)\n }\n }\n }\n\n log.warn(`No writable ${shell} config file found. Please add manually.`)\n}\n\nexport async function autoConfigureShell(): Promise<void> {\n const shell = getShell()\n if (!shell) {\n log.warn('Unknown shell. Please manually add Bun to your shell config.')\n return\n }\n\n await configureShell(shell)\n}\n","import {\n formatVersionInfo,\n getCurrentBunVersion,\n getInstalledBunVersions,\n} from '../lib/utils'\nimport { GITHUB_RELEASES_URL } from '../lib/constants'\nimport { log } from '../lib/logger'\nimport chalk from 'chalk'\nimport axios from 'axios'\n\ntype Release = { tag_name: string }\n\nexport function listVersions(): void {\n try {\n const currentVersion = getCurrentBunVersion()\n log.log(`Current Bun version: ${currentVersion ?? 'none'}`)\n\n const versions = getInstalledBunVersions()\n\n if (versions.length === 0) {\n log.warn('No Bun versions installed yet.')\n return\n }\n\n log.log(chalk.green('🚀 Installed Bun versions:\\n'))\n versions.forEach((version) => {\n log.log(formatVersionInfo(version, currentVersion, new Set(versions)))\n })\n } catch {\n log.error('No Bun versions installed yet.')\n }\n}\n\nexport async function listRemoteVersions(): Promise<void> {\n try {\n const { data } = await axios.get<Release[]>(GITHUB_RELEASES_URL)\n const versions = data.map(({ tag_name }) => tag_name.replace(/^bun-v/, ''))\n\n if (versions.length === 0) {\n log.warn('No Bun versions found remotely.')\n return\n }\n\n const installedVersions = getInstalledBunVersions()\n const installedVersionsSet = new Set(installedVersions)\n const activeVersion = getCurrentBunVersion()\n\n log.log(chalk.green('🚀 Available Bun versions:\\n'))\n versions.forEach((version) => {\n log.log(formatVersionInfo(version, activeVersion, installedVersionsSet))\n })\n } catch (err) {\n log.error(\n `Error fetching remote versions: ${err instanceof Error ? err.message : err}`,\n )\n }\n}\n","import { join, resolve } from 'node:path'\nimport { existsSync, readlinkSync, rmSync } from 'node:fs'\nimport { log } from '../lib/logger'\nimport { BUN_SYMLINK, BUN_VERSIONS_DIR } from '../lib/constants'\nimport chalk from 'chalk'\n\nexport function uninstallBun(version: string): void {\n const versionDir = join(BUN_VERSIONS_DIR, version)\n const bunBinaryPath = join(versionDir, 'bun')\n\n if (!existsSync(versionDir) || !existsSync(bunBinaryPath)) {\n log.warn(`Bun version ${version} is not installed.`)\n return\n }\n\n // If the version is in use, remove the symlink.\n if (existsSync(BUN_SYMLINK)) {\n try {\n const target = resolve(readlinkSync(BUN_SYMLINK))\n if (target === resolve(bunBinaryPath)) {\n rmSync(BUN_SYMLINK, { force: true })\n log.log(`🔗 Removed active symlink for Bun ${version}.`)\n }\n } catch {\n // Ignore readlinkSync errors.\n }\n }\n\n try {\n rmSync(versionDir, { recursive: true, force: true })\n log.log(chalk.green(`🗑️ Bun ${version} has been uninstalled.`))\n } catch (err) {\n log.error(`Failed to uninstall Bun ${version}: ${(err as Error).message}`)\n }\n}\n","{\n \"name\": \"bunvm\",\n \"version\": \"1.0.1\",\n \"description\": \"Bun Version Manager - Switch between different versions of Bun easily\",\n \"bin\": {\n \"bvm\": \"./dist/bvm.js\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsx src/bvm.ts\",\n \"clean\": \"rm -rf dist\",\n \"prepublishOnly\": \"pnpm run clean && pnpm run build\",\n \"start\": \"node dist/bvm.js\",\n \"format\": \"prettier --write --ignore-path .gitignore --cache .\",\n \"lint\": \"eslint --ext .ts src --cache\",\n \"lint:fix\": \"eslint --ext .ts src --cache --fix\"\n },\n \"keywords\": [\n \"bun\",\n \"version\",\n \"manager\",\n \"version-manager\",\n \"bun version manager\",\n \"cli\",\n \"javascript\",\n \"typescript\",\n \"nodejs\"\n ],\n \"author\": \"Tarun Joshi\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/MrHacker26/bvm#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/MrHacker26/bvm.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/MrHacker26/bvm/issues\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.11.0\",\n \"dependencies\": {\n \"axios\": \"^1.9.0\",\n \"chalk\": \"^5.4.1\",\n \"cli-progress\": \"^3.12.0\",\n \"commander\": \"^13.1.0\",\n \"unzipper\": \"^0.12.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.27.0\",\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/node\": \"^22.15.18\",\n \"@types/unzipper\": \"^0.10.11\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.1\",\n \"@typescript-eslint/parser\": \"^8.32.1\",\n \"eslint\": \"^9.27.0\",\n \"globals\": \"^16.1.0\",\n \"prettier\": \"^3.5.3\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.19.4\",\n \"typescript\": \"^5.0.0\",\n \"typescript-eslint\": \"^8.32.1\"\n }\n}\n"],"mappings":"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","names":["Command","mkdirSync","existsSync","join","chalk","homedir","join","BUN_DIR","BUN_BIN_DIR","BUN_SYMLINK","BUNX_SYMLINK","BVM_DIR","BUN_VERSIONS_DIR","GITHUB_API_URL","GITHUB_RELEASES_URL","BUN_COMPLETION_FILE","FISH_CONFIG_PATH","chalk","log","msg","execSync","createReadStream","existsSync","readdirSync","chalk","dirname","join","axios","pipeline","unzipper","chmod","createWriteStream","existsSync","lstatSync","mkdirSync","rmSync","symlinkSync","rm","stat","unlink","streamToFile","readable","path","writer","createWriteStream","resolve","reject","exists","stat","cleanPath","isDirectory","rm","unlink","error","log","formatBytes","bytes","sizes","i","ensureDirectoryExists","dir","existsSync","mkdirSync","removeExistingLink","isSymlink","lstatSync","rmSync","createSymlink","src","dest","symlinkSync","cliProgress","getCurrentBunVersion","execSync","getInstalledBunVersions","existsSync","BUN_VERSIONS_DIR","readdirSync","formatVersionInfo","version","currentVersion","installedVersions","isActive","isInstalled","chalk","getPlatformTarget","registerCleanup","dir","cleanup","cleanPath","downloadBun","destPath","target","url","zipPath","destDir","dirname","extractedDir","join","extractedBunPath","removeCleanupListener","response","axios","total","downloaded","progress","formatBytes","chunk","streamToFile","log","pipeline","createReadStream","unzipper","exists","chmod","error","join","existsSync","chalk","homedir","join","readFile","writeFile","execSync","setupCompletions","exists","BUN_SYMLINK","log","shell","getShell","error","shellPath","getShellConfigPath","home","homedir","xdg","join","configureFish","fishLines","BUN_DIR","FISH_CONFIG_PATH","content","readFile","missingLines","line","newContent","writeFile","message","configureShell","bunInstallLine","pathLine","completionLine","BUN_COMPLETION_FILE","configPaths","configPath","updated","autoConfigureShell","useVersion","version","versionBin","join","BUN_VERSIONS_DIR","existsSync","log","chalk","ensureDirectoryExists","BUN_BIN_DIR","createSymlink","BUN_SYMLINK","BUNX_SYMLINK","setupCompletions","err","installBun","version","versionDir","join","BUN_VERSIONS_DIR","bunBinaryPath","existsSync","log","chalk","mkdirSync","downloadBun","BUN_SYMLINK","BUNX_SYMLINK","ensureDirectoryExists","BUN_BIN_DIR","autoConfigureShell","err","useVersion","chalk","axios","listVersions","currentVersion","getCurrentBunVersion","log","versions","getInstalledBunVersions","version","formatVersionInfo","listRemoteVersions","data","GITHUB_RELEASES_URL","tag_name","installedVersions","installedVersionsSet","activeVersion","err","join","resolve","existsSync","readlinkSync","rmSync","chalk","uninstallBun","version","versionDir","join","BUN_VERSIONS_DIR","bunBinaryPath","existsSync","log","BUN_SYMLINK","resolve","readlinkSync","rmSync","err","version","program","Command","version","installBun","useVersion","uninstallBun","listVersions","listRemoteVersions"]}
1
+ {"version":3,"sources":["../src/bvm.ts","../src/commands/install.ts","../src/lib/constants.ts","../src/lib/logger.ts","../src/lib/utils.ts","../src/lib/file.ts","../src/commands/use.ts","../src/lib/shell.ts","../src/commands/versions.ts","../src/commands/uninstall.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { installBun } from './commands/install'\nimport { useVersion } from './commands/use'\nimport {\n listRemoteVersions,\n listVersions,\n currentVersion,\n} from './commands/versions'\nimport { uninstallBun } from './commands/uninstall'\nimport { version } from '../package.json'\n\nconst program = new Command()\n\nprogram\n .name('bvm')\n .description('Bun Version Manager - Manage multiple Bun versions')\n .version(version)\n\nprogram\n .command('install <version>')\n .alias('i')\n .description('Install a specific Bun version')\n .action(installBun)\n\nprogram\n .command('use <version>')\n .description('Use a specific Bun version')\n .action(useVersion)\n\nprogram\n .command('uninstall <version>')\n .alias('u')\n .description('Uninstall a specific Bun version')\n .action(uninstallBun)\n\nprogram\n .command('current')\n .description('Display currently activated version of Bun')\n .action(currentVersion)\n\nprogram\n .command('list')\n .alias('ls')\n .description('List installed Bun versions')\n .action(listVersions)\n\nprogram\n .command('remote')\n .alias('r')\n .description('List remote Bun versions')\n .action(listRemoteVersions)\n\nprogram.parse()\n","import { mkdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport chalk from 'chalk'\nimport {\n BUN_VERSIONS_DIR,\n BUN_BIN_DIR,\n BUNX_SYMLINK,\n BUN_SYMLINK,\n} from '../lib/constants'\nimport { log } from '../lib/logger'\nimport { downloadBun, getLatestBunVersion } from '../lib/utils'\nimport { ensureDirectoryExists } from '../lib/file'\nimport { useVersion } from './use'\nimport { autoConfigureShell } from '../lib/shell'\n\nexport async function installBun(version: string): Promise<void> {\n if (version === 'latest') {\n const latestVersion = await getLatestBunVersion()\n\n if (!latestVersion) {\n return\n }\n\n version = latestVersion\n }\n\n const versionDir = join(BUN_VERSIONS_DIR, version)\n const bunBinaryPath = join(versionDir, 'bun')\n\n if (existsSync(versionDir) && existsSync(bunBinaryPath)) {\n log.warn(`Bun ${chalk.green(`v${version}`)} is already installed.`)\n return\n }\n\n mkdirSync(versionDir, { recursive: true })\n\n log.log(`${chalk.cyan('📥 Installing')} Bun ${chalk.green(`v${version}`)}...`)\n\n await downloadBun(version, bunBinaryPath)\n\n if (!existsSync(BUN_SYMLINK) || !existsSync(BUNX_SYMLINK)) {\n log.warn(\n `No previously installed Bun versions found. Setting up environment...`,\n )\n\n ensureDirectoryExists(BUN_BIN_DIR)\n\n try {\n await autoConfigureShell()\n } catch (err) {\n log.error(\n `Failed to configure shell: ${(err as Error).message}. Please set up completions manually.`,\n )\n }\n\n await useVersion(version)\n return\n }\n\n log.success(`Installed Bun ${chalk.bold(`v${version}`)}`)\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport const BUN_DIR = join(homedir(), '.bun')\n\nexport const BUN_BIN_DIR = join(BUN_DIR, 'bin')\n\nexport const BUN_SYMLINK = join(BUN_BIN_DIR, 'bun')\n\nexport const BUNX_SYMLINK = join(BUN_BIN_DIR, 'bunx')\n\nexport const BVM_DIR = join(homedir(), '.bvm')\n\nexport const BUN_VERSIONS_DIR = join(BVM_DIR, 'versions')\n\nexport const GITHUB_API_URL = 'https://api.github.com'\n\nexport const GITHUB_RELEASES_URL = `${GITHUB_API_URL}/repos/oven-sh/bun/releases`\n\nexport const BUN_COMPLETION_FILE = join(BUN_DIR, '_bun')\n\nexport const FISH_CONFIG_PATH = join(\n homedir(),\n '.config',\n 'fish',\n 'config.fish',\n)\n","import chalk from 'chalk'\n\nexport const log = {\n log: (msg: string) => console.log(msg),\n info: (msg: string) => console.log(`${chalk.blue('i')} ${msg}`),\n success: (msg: string) => console.log(`${chalk.green('✅')} ${msg}`),\n warn: (msg: string) =>\n console.warn(`${chalk.yellow('⚠️')} ${chalk.yellow(msg)}`),\n error: (msg: string) => console.error(`${chalk.red('❌')} ${chalk.red(msg)}`),\n}\n","import { execSync } from 'node:child_process'\nimport { createReadStream, existsSync, readdirSync } from 'node:fs'\nimport { BUN_VERSIONS_DIR, GITHUB_RELEASES_URL } from './constants'\nimport chalk from 'chalk'\nimport { dirname, join } from 'node:path'\nimport axios from 'axios'\nimport { log } from './logger'\nimport { pipeline } from 'node:stream/promises'\nimport unzipper from 'unzipper'\nimport { chmod } from 'node:fs/promises'\nimport { cleanPath, exists, formatBytes, streamToFile } from './file'\nimport cliProgress from 'cli-progress'\nimport { Release } from './types'\n\nexport function getCurrentBunVersion(): string | null {\n try {\n const output = execSync('bun --version', {\n encoding: 'utf8',\n stdio: ['pipe'],\n }).trim()\n return output || null\n } catch {\n return null\n }\n}\n\nexport function getInstalledBunVersions(): string[] {\n return existsSync(BUN_VERSIONS_DIR) ? readdirSync(BUN_VERSIONS_DIR) : []\n}\n\nexport async function getLatestBunVersion(): Promise<string | null> {\n try {\n const { data } = await axios.get<Release[]>(GITHUB_RELEASES_URL)\n\n if (data.length === 0) {\n log.warn('No Bun versions found.')\n return null\n }\n\n const latestVersion = data[0].tag_name.replace(/^bun-v/, '')\n\n return latestVersion\n } catch {\n log.error('Error fetching latest Bun version.')\n process.exit(1)\n }\n}\n\nexport function formatVersionInfo(\n version: string,\n currentVersion: string | null,\n installedVersions: Set<string>,\n): string {\n const isActive = currentVersion === version\n const isInstalled = installedVersions.has(version)\n\n if (isActive) {\n return `${chalk.magenta('v' + version)} ${chalk.yellow('⭐ (current)')}`\n }\n\n if (isInstalled) {\n return `${chalk.magenta('v' + version)} ${chalk.green('✓ (installed)')}`\n }\n\n return `${chalk.magenta('v' + version)} ${chalk.red('✗ (not installed)')}`\n}\n\nfunction getPlatformTarget(): string {\n const targetPlatform = `${process.platform}-${process.arch}`\n\n switch (targetPlatform) {\n case 'darwin-arm64': {\n return 'darwin-aarch64'\n }\n default: {\n return targetPlatform\n }\n }\n}\n\nfunction registerCleanup(dir: string): () => void {\n async function cleanup() {\n console.log(chalk.red('\\nDownload interrupted. Cleaning up...'))\n await cleanPath(dir, true)\n process.exit(1)\n }\n\n process.once('SIGINT', cleanup)\n return () => process.removeListener('SIGINT', cleanup)\n}\n\nexport async function downloadBun(\n version: string,\n destPath: string,\n): Promise<void> {\n const target = getPlatformTarget()\n const url = `https://github.com/oven-sh/bun/releases/download/bun-v${version}/bun-${target}.zip`\n const zipPath = `${destPath}.zip`\n const destDir = dirname(destPath)\n const extractedDir = join(destDir, `bun-${target}`)\n const extractedBunPath = join(extractedDir, 'bun')\n\n const removeCleanupListener = registerCleanup(destDir)\n\n try {\n const response = await axios.get<NodeJS.ReadableStream>(url, {\n responseType: 'stream',\n })\n\n if (response.status !== 200) {\n throw new Error(`Failed to download ZIP file. Status: ${response.status}`)\n }\n\n const total = Number(response.headers['content-length']) || 0\n let downloaded = 0\n const progress = new cliProgress.SingleBar(\n {\n format: `${chalk.magenta('Downloading')} {bar} {percentage}% | {downloaded}/{totalSize}`,\n barCompleteChar: '█',\n barIncompleteChar: '░',\n hideCursor: true,\n },\n cliProgress.Presets.shades_classic,\n )\n\n if (total) {\n progress.start(total, 0, {\n downloaded: '0 B',\n totalSize: formatBytes(total),\n })\n }\n\n response.data.on('data', (chunk: Buffer) => {\n downloaded += chunk.length\n if (total) {\n progress.update(downloaded, {\n downloaded: formatBytes(downloaded),\n totalSize: formatBytes(total),\n })\n }\n })\n\n await streamToFile(response.data, zipPath)\n if (total) progress.stop()\n\n log.log(chalk.yellow('📦 Extracting...'))\n\n await pipeline(\n createReadStream(zipPath),\n unzipper.Extract({ path: destDir }),\n )\n\n if (!(await exists(extractedBunPath))) {\n throw new Error(`Expected binary not found at ${extractedBunPath}`)\n }\n\n await streamToFile(createReadStream(extractedBunPath), destPath)\n await chmod(destPath, 0o755)\n\n await cleanPath(extractedDir, true)\n await cleanPath(zipPath)\n\n log.success(`Downloaded Bun ${chalk.bold(`v${version}`)}`)\n } catch (error) {\n log.error(\n `Failed to install Bun: ${error instanceof Error ? error.message : error}`,\n )\n await cleanPath(destDir, true)\n process.exit(1)\n } finally {\n removeCleanupListener()\n }\n}\n","import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n symlinkSync,\n} from 'node:fs'\nimport { rm, stat, unlink } from 'node:fs/promises'\nimport { log } from './logger'\n\nexport async function streamToFile(\n readable: NodeJS.ReadableStream,\n path: string,\n): Promise<void> {\n const writer = createWriteStream(path)\n await new Promise<void>((resolve, reject) => {\n writer.on('finish', resolve)\n writer.on('error', reject)\n readable.pipe(writer)\n })\n}\n\nexport async function exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function cleanPath(\n path: string,\n isDirectory = false,\n): Promise<void> {\n try {\n if (await exists(path)) {\n if (isDirectory) {\n await rm(path, { recursive: true, force: true })\n } else {\n await unlink(path)\n }\n }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n if (err.code !== 'ENOENT') {\n log.warn(`Failed to clean path: ${path}`)\n }\n }\n}\n\nexport function formatBytes(bytes: number): string {\n const sizes = ['B', 'KB', 'MB', 'GB']\n if (bytes === 0) return '0 B'\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`\n}\n\nexport function ensureDirectoryExists(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\nexport function removeExistingLink(path: string): void {\n if (existsSync(path)) {\n const isSymlink = lstatSync(path).isSymbolicLink()\n try {\n rmSync(path, { force: true })\n if (!isSymlink) {\n log.warn(`Replaced non-symlink file at ${path}`)\n }\n } catch (error) {\n log.warn(\n `Couldn't remove existing file at ${path}: ${(error as Error).message}`,\n )\n }\n }\n}\n\nexport function createSymlink(src: string, dest: string): void {\n if (existsSync(src)) {\n removeExistingLink(dest)\n symlinkSync(src, dest)\n }\n}\n","import { join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport chalk from 'chalk'\nimport { log } from '../lib/logger'\nimport {\n BUN_BIN_DIR,\n BUN_SYMLINK,\n BUN_VERSIONS_DIR,\n BUNX_SYMLINK,\n} from '../lib/constants'\nimport { createSymlink, ensureDirectoryExists } from '../lib/file'\nimport { setupCompletions } from '../lib/shell'\n\nexport async function useVersion(version: string): Promise<void> {\n const versionBin = join(BUN_VERSIONS_DIR, version, 'bun')\n\n if (!existsSync(versionBin)) {\n log.error(`Bun version ${version} is not installed.`)\n log.info(`Run ${chalk.cyan(`bvm install ${version}`)} to install it.`)\n return\n }\n\n try {\n ensureDirectoryExists(BUN_BIN_DIR)\n createSymlink(versionBin, BUN_SYMLINK)\n createSymlink(versionBin, BUNX_SYMLINK)\n await setupCompletions()\n\n log.success(`Now using Bun ${version}`)\n } catch (err) {\n log.error(`Failed to switch Bun version: ${(err as Error).message}`)\n }\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { log } from './logger'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport {\n BUN_COMPLETION_FILE,\n BUN_DIR,\n BUN_SYMLINK,\n FISH_CONFIG_PATH,\n} from './constants'\nimport { exists } from './file'\nimport { execSync } from 'node:child_process'\nimport { Shell } from './types'\n\nexport async function setupCompletions(): Promise<void> {\n if (!(await exists(BUN_SYMLINK))) {\n log.error(`Bun binary not found at ${BUN_SYMLINK}, skipping completions`)\n return\n }\n\n const shell = getShell()\n\n if (!shell) {\n log.warn('Unknown shell. Please manually set up Bun completions.')\n return\n }\n\n try {\n execSync(`${BUN_SYMLINK} completions`, {\n env: {\n ...process.env,\n IS_BUN_AUTO_UPDATE: 'true',\n SHELL: shell,\n },\n stdio: 'ignore',\n })\n } catch (error) {\n log.error(`Failed to set up ${shell} completions: ${error}`)\n }\n}\n\nfunction getShell(): Shell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.includes('bash')) return 'bash'\n if (shellPath.includes('zsh')) return 'zsh'\n if (shellPath.includes('fish')) return 'fish'\n return null\n}\n\nexport function getShellConfigPath(shell: Shell): string[] {\n const home = homedir()\n switch (shell) {\n case 'bash': {\n const xdg = process.env.XDG_CONFIG_HOME\n return [\n join(home, '.bashrc'),\n join(home, '.bash_profile'),\n ...(xdg\n ? [\n join(xdg, '.bashrc'),\n join(xdg, '.bash_profile'),\n join(xdg, 'bashrc'),\n join(xdg, 'bash_profile'),\n ]\n : []),\n ]\n }\n case 'zsh':\n return [join(home, '.zshrc')]\n case 'fish':\n return [join(home, '.config', 'fish', 'config.fish')]\n default:\n return []\n }\n}\n\nasync function configureFish(): Promise<void> {\n const fishLines = [\n `set --export BUN_INSTALL \"${BUN_DIR}\"`,\n `set --export PATH \"$BUN_INSTALL/bin\" $PATH`,\n ]\n\n if (await exists(FISH_CONFIG_PATH)) {\n try {\n const content = await readFile(FISH_CONFIG_PATH, 'utf8')\n const missingLines = fishLines.filter((line) => !content.includes(line))\n\n if (missingLines.length > 0) {\n const newContent = content + `\\n# bun\\n${missingLines.join('\\n')}\\n`\n await writeFile(FISH_CONFIG_PATH, newContent)\n log.success(`Updated ${FISH_CONFIG_PATH} with Bun configuration`)\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn(`Could not update Fish config: ${message}`)\n }\n } else {\n log.warn(\n 'Fish config file not found. Please add Bun configuration manually.',\n )\n }\n}\n\nasync function configureShell(shell: Shell): Promise<void> {\n if (!shell) {\n log.warn('Invalid shell provided')\n return\n }\n\n if (shell === 'fish') {\n await configureFish()\n return\n }\n\n const bunInstallLine = `export BUN_INSTALL=\"${BUN_DIR}\"\\n`\n const pathLine = `export PATH=\"$BUN_INSTALL/bin:$PATH\"\\n`\n const completionLine = `[ -s \"${BUN_COMPLETION_FILE}\" ] && source \"${BUN_COMPLETION_FILE}\"\\n`\n\n const configPaths = getShellConfigPath(shell)\n\n for (const configPath of configPaths) {\n if (await exists(configPath)) {\n try {\n const content = await readFile(configPath, 'utf8')\n let updated = false\n let newContent = content\n\n if (!content.includes('BUN_INSTALL')) {\n newContent += `\\n# bun\\n${bunInstallLine}${pathLine}`\n updated = true\n }\n\n if (!content.includes(BUN_COMPLETION_FILE)) {\n newContent += `\\n# bun completions\\n${completionLine}`\n updated = true\n }\n\n if (updated) {\n await writeFile(configPath, newContent)\n log.success(`Updated ${configPath} with Bun configuration`)\n }\n return\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn(`Could not update ${configPath}: ${message}`)\n }\n }\n }\n\n log.warn(`No writable ${shell} config file found. Please add manually.`)\n}\n\nexport async function autoConfigureShell(): Promise<void> {\n const shell = getShell()\n if (!shell) {\n log.warn('Unknown shell. Please manually add Bun to your shell config.')\n return\n }\n\n await configureShell(shell)\n}\n","import {\n formatVersionInfo,\n getCurrentBunVersion,\n getInstalledBunVersions,\n} from '../lib/utils'\nimport { GITHUB_RELEASES_URL } from '../lib/constants'\nimport { log } from '../lib/logger'\nimport chalk from 'chalk'\nimport axios from 'axios'\nimport { Release } from '../lib/types'\n\nexport function listVersions(): void {\n try {\n const currentVersion = getCurrentBunVersion()\n log.log(\n `Current Bun version: ${currentVersion ? `v${currentVersion}` : 'none'}`,\n )\n\n const versions = getInstalledBunVersions()\n\n if (versions.length === 0) {\n log.warn('No Bun versions installed yet.')\n return\n }\n\n log.log(chalk.green('🚀 Installed Bun versions:\\n'))\n versions.forEach((version) => {\n log.log(formatVersionInfo(version, currentVersion, new Set(versions)))\n })\n } catch {\n log.error('No Bun versions installed yet.')\n }\n}\n\nexport async function listRemoteVersions(): Promise<void> {\n try {\n const { data } = await axios.get<Release[]>(GITHUB_RELEASES_URL)\n const versions = data.map(({ tag_name }) => tag_name.replace(/^bun-v/, ''))\n\n if (versions.length === 0) {\n log.warn('No Bun versions found remotely.')\n return\n }\n\n const installedVersions = getInstalledBunVersions()\n const installedVersionsSet = new Set(installedVersions)\n const activeVersion = getCurrentBunVersion()\n\n log.log(chalk.green('🚀 Available Bun versions:\\n'))\n versions.forEach((version) => {\n log.log(formatVersionInfo(version, activeVersion, installedVersionsSet))\n })\n } catch (err) {\n log.error(\n `Error fetching remote versions: ${err instanceof Error ? err.message : err}`,\n )\n }\n}\n\nexport function currentVersion(): void {\n const version = getCurrentBunVersion()\n\n if (version === null) {\n log.error(\n 'No Bun version is currently active. Install one with: bvm install <version>',\n )\n return\n }\n\n log.log(`Current Bun version: v${version}`)\n}\n","import { join, resolve } from 'node:path'\nimport { existsSync, readlinkSync, rmSync } from 'node:fs'\nimport { log } from '../lib/logger'\nimport { BUN_SYMLINK, BUN_VERSIONS_DIR } from '../lib/constants'\nimport chalk from 'chalk'\n\nexport function uninstallBun(version: string): void {\n const versionDir = join(BUN_VERSIONS_DIR, version)\n const bunBinaryPath = join(versionDir, 'bun')\n\n if (!existsSync(versionDir) || !existsSync(bunBinaryPath)) {\n log.warn(`Bun version ${version} is not installed.`)\n return\n }\n\n // If the version is in use, remove the symlink.\n if (existsSync(BUN_SYMLINK)) {\n try {\n const target = resolve(readlinkSync(BUN_SYMLINK))\n if (target === resolve(bunBinaryPath)) {\n rmSync(BUN_SYMLINK, { force: true })\n log.log(`🔗 Removed active symlink for Bun ${version}.`)\n }\n } catch {\n // Ignore readlinkSync errors.\n }\n }\n\n try {\n rmSync(versionDir, { recursive: true, force: true })\n log.log(chalk.green(`🗑️ Bun ${version} has been uninstalled.`))\n } catch (err) {\n log.error(`Failed to uninstall Bun ${version}: ${(err as Error).message}`)\n }\n}\n","{\n \"name\": \"bunvm\",\n \"version\": \"1.0.3\",\n \"description\": \"Bun Version Manager - Switch between different versions of Bun easily\",\n \"bin\": {\n \"bvm\": \"./dist/bvm.js\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsx src/bvm.ts\",\n \"clean\": \"rm -rf dist\",\n \"prepublishOnly\": \"pnpm run clean && pnpm run build\",\n \"start\": \"node dist/bvm.js\",\n \"format\": \"prettier --write --ignore-path .gitignore --cache .\",\n \"lint\": \"eslint --ext .ts src --cache\",\n \"lint:fix\": \"eslint --ext .ts src --cache --fix\"\n },\n \"keywords\": [\n \"bun\",\n \"version\",\n \"manager\",\n \"version-manager\",\n \"bun version manager\",\n \"cli\",\n \"javascript\",\n \"typescript\",\n \"nodejs\"\n ],\n \"author\": \"Tarun Joshi\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/MrHacker26/bvm#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/MrHacker26/bvm.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/MrHacker26/bvm/issues\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.11.0\",\n \"dependencies\": {\n \"axios\": \"^1.9.0\",\n \"chalk\": \"^5.4.1\",\n \"cli-progress\": \"^3.12.0\",\n \"commander\": \"^13.1.0\",\n \"unzipper\": \"^0.12.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.27.0\",\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/node\": \"^22.15.18\",\n \"@types/unzipper\": \"^0.10.11\",\n \"@typescript-eslint/eslint-plugin\": \"^8.32.1\",\n \"@typescript-eslint/parser\": \"^8.32.1\",\n \"eslint\": \"^9.27.0\",\n \"globals\": \"^16.1.0\",\n \"prettier\": \"^3.5.3\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.19.4\",\n \"typescript\": \"^5.0.0\",\n \"typescript-eslint\": \"^8.32.1\"\n }\n}\n"],"mappings":"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","names":["Command","mkdirSync","existsSync","join","chalk","homedir","join","BUN_DIR","BUN_BIN_DIR","BUN_SYMLINK","BUNX_SYMLINK","BVM_DIR","BUN_VERSIONS_DIR","GITHUB_API_URL","GITHUB_RELEASES_URL","BUN_COMPLETION_FILE","FISH_CONFIG_PATH","chalk","log","msg","execSync","createReadStream","existsSync","readdirSync","chalk","dirname","join","axios","pipeline","unzipper","chmod","createWriteStream","existsSync","lstatSync","mkdirSync","rmSync","symlinkSync","rm","stat","unlink","streamToFile","readable","path","writer","createWriteStream","resolve","reject","exists","stat","cleanPath","isDirectory","rm","unlink","error","log","formatBytes","bytes","sizes","i","ensureDirectoryExists","dir","existsSync","mkdirSync","removeExistingLink","isSymlink","lstatSync","rmSync","createSymlink","src","dest","symlinkSync","cliProgress","getCurrentBunVersion","execSync","getInstalledBunVersions","existsSync","BUN_VERSIONS_DIR","readdirSync","getLatestBunVersion","data","axios","GITHUB_RELEASES_URL","log","formatVersionInfo","version","currentVersion","installedVersions","isActive","isInstalled","chalk","getPlatformTarget","targetPlatform","registerCleanup","dir","cleanup","cleanPath","downloadBun","destPath","target","url","zipPath","destDir","dirname","extractedDir","join","extractedBunPath","removeCleanupListener","response","total","downloaded","progress","formatBytes","chunk","streamToFile","pipeline","createReadStream","unzipper","exists","chmod","error","join","existsSync","chalk","homedir","join","readFile","writeFile","execSync","setupCompletions","exists","BUN_SYMLINK","log","shell","getShell","error","shellPath","getShellConfigPath","home","homedir","xdg","join","configureFish","fishLines","BUN_DIR","FISH_CONFIG_PATH","content","readFile","missingLines","line","newContent","writeFile","message","configureShell","bunInstallLine","pathLine","completionLine","BUN_COMPLETION_FILE","configPaths","configPath","updated","autoConfigureShell","useVersion","version","versionBin","join","BUN_VERSIONS_DIR","existsSync","log","chalk","ensureDirectoryExists","BUN_BIN_DIR","createSymlink","BUN_SYMLINK","BUNX_SYMLINK","setupCompletions","err","installBun","version","latestVersion","getLatestBunVersion","versionDir","join","BUN_VERSIONS_DIR","bunBinaryPath","existsSync","log","chalk","mkdirSync","downloadBun","BUN_SYMLINK","BUNX_SYMLINK","ensureDirectoryExists","BUN_BIN_DIR","autoConfigureShell","err","useVersion","chalk","axios","listVersions","currentVersion","getCurrentBunVersion","log","versions","getInstalledBunVersions","version","formatVersionInfo","listRemoteVersions","data","GITHUB_RELEASES_URL","tag_name","installedVersions","installedVersionsSet","activeVersion","err","join","resolve","existsSync","readlinkSync","rmSync","chalk","uninstallBun","version","versionDir","join","BUN_VERSIONS_DIR","bunBinaryPath","existsSync","log","BUN_SYMLINK","resolve","readlinkSync","rmSync","err","version","program","Command","version","installBun","useVersion","uninstallBun","currentVersion","listVersions","listRemoteVersions"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunvm",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Bun Version Manager - Switch between different versions of Bun easily",
5
5
  "bin": {
6
6
  "bvm": "./dist/bvm.js"