bunvm 1.0.0 → 1.0.2

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
@@ -2,8 +2,6 @@
2
2
 
3
3
  **BVM** is a simple and fast CLI tool to manage multiple versions of [Bun](https://bun.sh), the all-in-one JavaScript runtime. Inspired by tools like `nvm` and `rvm`, BVM lets you easily install, switch, and manage different Bun versions.
4
4
 
5
- > ⚠️ Currently in active development – contributions and feedback are welcome!
6
-
7
5
  ---
8
6
 
9
7
  ## 🚀 Features
@@ -24,7 +22,7 @@
24
22
  | Platform | Status | Tested |
25
23
  |----------|--------|---------|
26
24
  | Linux | ✅ Supported | ✅ Tested on Ubuntu/Debian |
27
- | macOS | ⚠️ Should work | Not tested yet |
25
+ | macOS | Supported | Tested on M2 (Apple Silicon) |
28
26
  | Windows | ❓ Unknown | ❓ Not tested yet |
29
27
 
30
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.
@@ -33,22 +31,24 @@
33
31
 
34
32
  ## 📦 Installation
35
33
 
36
- ### Install from npm (Coming Soon)
34
+ ### Install from npm
37
35
 
38
36
  ```bash
39
37
  # With npm
40
- npm install -g bvm
38
+ npm install -g bunvm
41
39
 
42
40
  # With pnpm (recommended)
43
- pnpm add -g bvm
41
+ pnpm add -g bunvm
44
42
 
45
43
  # With yarn
46
- yarn global add bvm
44
+ yarn global add bunvm
47
45
 
48
- # Bun
49
- bun add -g bvm
46
+ # With Bun
47
+ bun add -g bunvm
50
48
  ```
51
49
 
50
+ After installation, you can use the `bvm` command from anywhere in your terminal.
51
+
52
52
  ### Install from source
53
53
 
54
54
  ```bash
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 Or}from"commander";import{mkdirSync as Vr,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"),w=f(S,"bin"),s=f(w,"bun"),x=f(w,"bunx"),cr=f(k(),".bvm"),p=f(cr,"versions"),lr="https://api.github.com",H=`${lr}/repos/oven-sh/bun/releases`,N=f(S,"_bun"),$=f(k(),".config","fish","config.fish");import y from"chalk";var n={log:r=>console.log(r),info:r=>console.log(`${y.blue("i")} ${r}`),success:r=>console.log(`${y.green("\u2705")} ${r}`),warn:r=>console.warn(`${y.yellow("\u26A0\uFE0F")} ${y.yellow(r)}`),error:r=>console.error(`${y.red("\u274C")} ${y.red(r)}`)};import{execSync as yr}from"child_process";import{createReadStream as O,existsSync as vr,readdirSync as Sr}from"fs";import l from"chalk";import{dirname as $r,join as j}from"path";import br from"axios";import{pipeline as xr}from"stream/promises";import Nr from"unzipper";import{chmod as Ir}from"fs/promises";import{createWriteStream as ur,existsSync as T,lstatSync as mr,mkdirSync as pr,rmSync as fr,symlinkSync as dr}from"fs";import{rm as gr,stat as hr,unlink as Br}from"fs/promises";async function C(r,e){let t=ur(e);await new Promise((o,a)=>{t.on("finish",o),t.on("error",a),r.pipe(t)})}async function g(r){try{return await hr(r),!0}catch{return!1}}async function b(r,e=!1){try{await g(r)&&(e?await gr(r,{recursive:!0,force:!0}):await Br(r))}catch(t){t.code!=="ENOENT"&&n.warn(`Failed to clean path: ${r}`)}}function I(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 _(r){T(r)||pr(r,{recursive:!0})}function wr(r){if(T(r)){let e=mr(r).isSymbolicLink();try{fr(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){T(r)&&(wr(e),dr(r,e))}import z from"cli-progress";function V(){try{return yr("bun --version",{encoding:"utf8",stdio:["pipe"]}).trim()||null}catch{return null}}function D(){return vr(p)?Sr(p):[]}function F(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 _r(){let r=`${process.platform}-${process.arch}`;switch(r){case"darwin-arm64":return"darwin-aarch64";default:return r}}function Er(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 G(r,e){let t=_r(),o=`https://github.com/oven-sh/bun/releases/download/bun-v${r}/bun-${t}.zip`,a=`${e}.zip`,i=$r(e),c=j(i,`bun-${t}`),u=j(c,"bun"),v=Er(i);try{let m=await br.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",ar=>{P+=ar.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 xr(O(a),Nr.Extract({path:i})),!await g(u))throw new Error(`Expected binary not found at ${u}`);await C(O(u),e),await Ir(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{v()}}import{join as Tr}from"path";import{existsSync as Cr}from"fs";import Mr from"chalk";import{homedir as Lr}from"os";import{join as d}from"path";import{readFile as K,writeFile as Y}from"fs/promises";import{execSync as Ur}from"child_process";async function J(){if(!await g(s)){n.error(`Bun binary not found at ${s}, skipping completions`);return}let r=X();if(!r){n.warn("Unknown shell. Please manually set up Bun completions.");return}try{Ur(`${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 X(){let r=process.env.SHELL??"";return r.includes("bash")?"bash":r.includes("zsh")?"zsh":r.includes("fish")?"fish":null}function Pr(r){let e=Lr();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 Rr(){let r=[`set --export BUN_INSTALL "${S}"`,'set --export PATH "$BUN_INSTALL/bin" $PATH'];if(await g($))try{let e=await K($,"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 Y($,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 Rr();return}let e=`export BUN_INSTALL="${S}"
8
8
  `,t=`export PATH="$BUN_INSTALL/bin:$PATH"
9
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+=`
10
+ `,a=Pr(r);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+=`
11
11
  # bun
12
- ${r}${t}`,u=!0),c.includes(N)||(v+=`
12
+ ${e}${t}`,u=!0),c.includes(N)||(v+=`
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.0";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 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 ${r} config file found. Please add manually.`)}async function W(){let r=X();if(!r){n.warn("Unknown shell. Please manually add Bun to your shell config.");return}await kr(r)}async function E(r){let e=Tr(p,r,"bun");if(!Cr(e)){n.error(`Bun version ${r} is not installed.`),n.info(`Run ${Mr.cyan(`bvm install ${r}`)} to install it.`);return}try{_(w),M(e,s),M(e,x),await J(),n.success(`Now using Bun ${r}`)}catch(t){n.error(`Failed to switch Bun version: ${t.message}`)}}async function q(r){let e=Z(p,r),t=Z(e,"bun");if(L(e)&&L(t)){n.warn(`Bun ${U.green(`v${r}`)} is already installed.`);return}if(Vr(e,{recursive:!0}),n.log(`${U.cyan("\u{1F4E5} Installing")} Bun ${U.green(`v${r}`)}...`),await G(r,t),!L(s)||!L(x)){n.warn("No previously installed Bun versions found. Setting up environment..."),_(w);try{await W()}catch(o){n.error(`Failed to configure shell: ${o.message}. Please set up completions manually.`)}await E(r);return}n.success(`Installed Bun ${U.bold(`v${r}`)}`)}import Q from"chalk";import Dr from"axios";function rr(){try{let r=V();n.log(`Current Bun version: ${r??"none"}`);let e=D();if(e.length===0){n.warn("No Bun versions installed yet.");return}n.log(Q.green(`\u{1F680} Installed Bun versions:
15
+ `)),e.forEach(t=>{n.log(F(t,r,new Set(e)))})}catch{n.error("No Bun versions installed yet.")}}async function er(){try{let{data:r}=await Dr.get(H),e=r.map(({tag_name:i})=>i.replace(/^bun-v/,""));if(e.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
+ `)),e.forEach(i=>{n.log(F(i,a,o))})}catch(r){n.error(`Error fetching remote versions: ${r instanceof Error?r.message:r}`)}}import{join as nr,resolve as tr}from"path";import{existsSync as A,readlinkSync as Fr,rmSync as or}from"fs";import Ar from"chalk";function ir(r){let e=nr(p,r),t=nr(e,"bun");if(!A(e)||!A(t)){n.warn(`Bun version ${r} is not installed.`);return}if(A(s))try{tr(Fr(s))===tr(t)&&(or(s,{force:!0}),n.log(`\u{1F517} Removed active symlink for Bun ${r}.`))}catch{}try{or(e,{recursive:!0,force:!0}),n.log(Ar.green(`\u{1F5D1}\uFE0F Bun ${r} has been uninstalled.`))}catch(o){n.error(`Failed to uninstall Bun ${r}: ${o.message}`)}}var sr="1.0.2";var h=new Or;h.name("bvm").description("Bun Version Manager - Manage multiple Bun versions").version(sr);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(ir);h.command("list").alias("ls").description("List installed Bun versions").action(rr);h.command("remote").alias("r").description("List remote Bun versions").action(er);h.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.0\",\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 { 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 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'\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.2\",\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","targetPlatform","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunvm",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Bun Version Manager - Switch between different versions of Bun easily",
5
5
  "bin": {
6
6
  "bvm": "./dist/bvm.js"