├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── bin └── npmbrew.js ├── lib ├── cli.js ├── config.js ├── index.js └── modules │ ├── clean.js │ ├── help.js │ ├── install.js │ ├── ls.js │ ├── lsRemote.js │ ├── npm.js │ ├── uninstall.js │ └── use.js ├── package.json └── test ├── 00-clean.js ├── 01-install-v2.6.1.js ├── 02-install-v2.7.0.js ├── 03-use-v2.7.0.js ├── 04-uninstall-v2.6.1.js └── 99-clean.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 25 | node_modules 26 | 27 | # Users Environment Variables 28 | .lock-wscript 29 | 30 | # npmbrew 31 | src 32 | npm 33 | current 34 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "5" 4 | - "4" 5 | - iojs 6 | - "0.12" 7 | - "0.10" 8 | env: 9 | - NODE_ENV=development 10 | script: "npm test" 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Daijiro Wachi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # npmbrew -- a npm version manager 2 | 3 | [![Build Status](https://api.travis-ci.org/watilde/npmbrew.svg)](https://travis-ci.org/watilde/npmbrew) 4 | [![NPM Downloads](http://img.shields.io/npm/dm/npmbrew.svg)](https://www.npmjs.org/package/npmbrew) 5 | 6 | ## Why npmbrew? 7 | npm is flooded with [issue reports](https://github.com/npm/npm/issues) on a daily basis. Sometimes I spent just too much time juggling around different npm versions trying to reproduce the error. 8 | 9 | I created npmbrew to make it easy to switch versions. See also: [#14](https://github.com/watilde/npmbrew/issues/14) 10 | 11 | ## Install 12 | Using npm. 13 | 14 | ``` 15 | npm install -g npmbrew 16 | ``` 17 | 18 | ## Usage 19 | ``` 20 | Usage: npmbrew 21 | 22 | Commands: 23 | clean Delete all installed sources 24 | help Output help information 25 | install Install the version passed 26 | ls List versions currently installed 27 | ls-remote List registry versions 28 | npm An alias of npm 29 | uninstall Delete the install for 30 | use Use 31 | ``` 32 | 33 | ## Example 34 | Install 35 | ``` 36 | npmbrew install v2.6.0 37 | installed 38 | ``` 39 | 40 | Switch version with `use`: 41 | ``` 42 | npmbrew use v2.6.0 43 | Using v2.6.0 44 | ``` 45 | 46 | Use npm 47 | ``` 48 | npmbrew npm help 49 | Usage: npm blah blah... 50 | ``` 51 | 52 | ## Add `npmbrew npm` to PATH 53 | Add the following line to the end of your .bashrc or .zshrc. 54 | ``` 55 | # npmbrew 56 | export PATH=$HOME/.npmbrew/current/bin:$PATH 57 | ``` 58 | 59 | Reload config. 60 | ``` 61 | source ~/.zshrc 62 | ``` 63 | 64 | Test. 65 | ``` 66 | npm help 67 | Usage: npm blah blah... 68 | ``` 69 | 70 | ## One more thing 71 | npmbrew uses [update-notifier](https://github.com/yeoman/update-notifier/), to let users know when there is a new version available for download. 72 | ``` 73 | npm whoami 74 | watilde 75 | 76 | 77 | ┌──────────────────────────────────────────┐ 78 | │ Update available: 2.7.0 (current: 2.6.0) │ 79 | │ Run npmbrew install 2.7.0 to update. │ 80 | └──────────────────────────────────────────┘ 81 | 82 | 83 | ``` 84 | 85 | ## LICENSE 86 | The MIT License (MIT) 87 | 88 | Copyright (c) 2015 Daijiro Wachi 89 | 90 | See also: [LICENSE](/LICENSE). 91 | -------------------------------------------------------------------------------- /bin/npmbrew.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require(require('path').resolve(__dirname, '../lib/cli')) 3 | -------------------------------------------------------------------------------- /lib/cli.js: -------------------------------------------------------------------------------- 1 | var updateNotifier = require('update-notifier') 2 | var pkg = require('./config').pkg 3 | var npmbrew = require('./') 4 | var argv = process.argv.slice(2) 5 | 6 | updateNotifier({ 7 | packageName: pkg.name, 8 | packageVersion: pkg.version 9 | }).notify() 10 | 11 | switch (argv[0]) { 12 | case 'help': 13 | if (argv.length === 1) { 14 | npmbrew.help() 15 | break 16 | } 17 | /* falls through */ 18 | case 'uninstall': 19 | if (argv.length === 2) { 20 | npmbrew.uninstall(argv[1]) 21 | break 22 | } 23 | /* falls through */ 24 | case 'clean': 25 | if (argv.length === 1) { 26 | npmbrew.clean() 27 | break 28 | } 29 | /* falls through */ 30 | case 'install': 31 | if (argv.length === 2) { 32 | npmbrew.install(argv[1]) 33 | break 34 | } 35 | /* falls through */ 36 | case 'ls': 37 | if (argv.length === 1) { 38 | npmbrew.ls() 39 | break 40 | } 41 | /* falls through */ 42 | case 'ls-remote': 43 | if (argv.length === 1) { 44 | npmbrew.lsRemote() 45 | break 46 | } 47 | /* falls through */ 48 | case 'use': 49 | if (argv.length === 2) { 50 | npmbrew.use(argv[1]) 51 | break 52 | } 53 | /* falls through */ 54 | case 'npm': 55 | npmbrew.npm(argv.slice(1)) 56 | break 57 | default: 58 | var message = '' 59 | if (argv.length > 0) { 60 | message += 'Unrecognized command line argument: ' 61 | message += argv.join(' ') 62 | message += ' ( See: \'npmbrew help\' )' 63 | console.log(message) 64 | } else { 65 | npmbrew.help() 66 | } 67 | break 68 | } 69 | -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var home = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'] 3 | var env = process.env.NODE_ENV || 'production' 4 | var dirname = (env === 'development') 5 | ? path.join(__dirname, '../') 6 | : path.join(home, '.npmbrew') 7 | 8 | module.exports = { 9 | env: env, 10 | url: 'https://registry.npmjs.org/npm/', 11 | pkg: require(path.join(__dirname, '../package.json')), 12 | dirname: { 13 | current: { 14 | dir: path.join(dirname, 'current'), 15 | npm: path.join(dirname, 'current/npm'), 16 | bindir: path.join(dirname, 'current/bin'), 17 | bin: path.join(dirname, 'current/bin/npm') 18 | }, 19 | src: path.join(dirname, 'src'), 20 | npm: path.join(dirname, 'npm') 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | module.exports.clean = require('./modules/clean') 2 | module.exports.ls = require('./modules/ls') 3 | module.exports.lsRemote = require('./modules/lsRemote') 4 | module.exports.help = require('./modules/help') 5 | module.exports.install = require('./modules/install') 6 | module.exports.use = require('./modules/use') 7 | module.exports.uninstall = require('./modules/uninstall') 8 | module.exports.npm = require('./modules/npm') 9 | -------------------------------------------------------------------------------- /lib/modules/clean.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var dirname = require('../config').dirname 3 | var rimraf = require('rimraf') 4 | 5 | module.exports = function (cb) { 6 | cb = typeof cb === 'function' ? cb : false 7 | rimraf.sync(dirname.src) 8 | rimraf.sync(dirname.npm) 9 | var lstat 10 | try { 11 | lstat = fs.lstatSync(dirname.current.dir) 12 | if (lstat.isSymbolicLink()) fs.unlinkSync(dirname.current.dir) 13 | lstat = fs.lstatSync(dirname.current.npm) 14 | if (lstat.isSymbolicLink()) fs.unlinkSync(dirname.current.npm) 15 | lstat = fs.lstatSync(dirname.current.bin) 16 | if (lstat.isSymbolicLink()) fs.unlinkSync(dirname.current.bin) 17 | } catch (Exception) {} 18 | if (cb) { 19 | cb(null) 20 | } else { 21 | console.log('\nDone') 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/modules/help.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var table = require('text-table') 3 | var pkg = require('../config').pkg 4 | 5 | module.exports = function () { 6 | var message = '' 7 | var cmds = [] 8 | message += '\n' 9 | message += 'Usage: npmbrew \n' 10 | cmds.push(['clean', 'Delete all installed sources']) 11 | cmds.push(['help', 'Output help information']) 12 | cmds.push(['install ', 'Install the version passed']) 13 | cmds.push(['ls', 'List versions currently installed']) 14 | cmds.push(['ls-remote', 'List registry versions']) 15 | cmds.push(['npm', 'An alias of npm ']) 16 | cmds.push(['uninstall ', 'Delete the install for ']) 17 | cmds.push(['use ', 'Use ']) 18 | 19 | console.log(message) 20 | console.log('Commands:\n' + table(cmds) + '\n') 21 | console.log('npmbrew@' + pkg.version + ' ' + path.join(__dirname, '../..')) 22 | } 23 | -------------------------------------------------------------------------------- /lib/modules/install.js: -------------------------------------------------------------------------------- 1 | var exec = require('child_process').exec 2 | var fs = require('fs') 3 | var https = require('https') 4 | var path = require('path') 5 | var shasum = require('crypto').createHash('sha1') 6 | var mkdirp = require('mkdirp') 7 | var url = require('../config').url 8 | var dirname = require('../config').dirname 9 | 10 | module.exports = function (version, cb) { 11 | cb = typeof cb === 'function' ? cb : false 12 | var body = '' 13 | if (version.substring(0, 1) !== 'v') version = 'v' + version 14 | var exists = fs.existsSync(path.join(dirname.src, version)) 15 | if (exists) { 16 | console.log(version + ' is already installed.\n') 17 | } 18 | version = version.substr(1) 19 | 20 | https.get(url, function (res) { 21 | if (res.statusCode !== 200) { 22 | var message = 'Error: Server responsed status code ' 23 | message += res.statusCode 24 | console.error(message) 25 | } 26 | res.on('data', function (chunk) { body += chunk }) 27 | 28 | res.on('end', function () { 29 | body = JSON.parse(body) 30 | var versions = Object.keys(body.versions) 31 | if (versions.indexOf(version) === -1) { 32 | console.log('Unknown version: ' + version) 33 | return 34 | } 35 | var dist = body.versions[version].dist 36 | var buffer = [] 37 | var buffersize = 0 38 | https.get(dist.tarball, function (res) { 39 | res.on('data', function (chunk) { 40 | buffer.push(chunk) 41 | buffersize += chunk.length 42 | }) 43 | res.on('end', function () { 44 | var data = Buffer.concat(buffer, buffersize) 45 | shasum.update(data) 46 | if (shasum.digest('hex') !== dist.shasum) { 47 | console.error('Error: Download data is broken') 48 | return 49 | } 50 | var exists = fs.existsSync(dirname.src) 51 | if (!exists) mkdirp.sync(dirname.src) 52 | var file = dirname.src + '/npm-' + version + '/npm-' 53 | file += version + '.tgz' 54 | mkdirp.sync(dirname.src + '/npm-' + version) 55 | fs.openSync(file, 'w+') 56 | var writeStream = fs.createWriteStream(file) 57 | writeStream.on('error', function (e) { 58 | console.error(e.message) 59 | }) 60 | writeStream.write(data, 'binary') 61 | writeStream.end() 62 | writeStream.on('close', function () { 63 | var command = 'tar -zxf ' + file 64 | command += ' -C ' + dirname.src + '/npm-' + version 65 | exec(command, {encoding: 'utf8'}, function () { 66 | var oldPath = dirname.src + '/npm-' + version + '/package' 67 | var newPath = dirname.npm + '/v' + version 68 | var exists = fs.existsSync(dirname.npm) 69 | if (!exists) mkdirp.sync(dirname.npm) 70 | exists = fs.existsSync(newPath) 71 | if (!exists) fs.renameSync(oldPath, newPath) 72 | exec( 73 | 'cd ' + newPath + ' npm install', 74 | {encoding: 'utf8'}, 75 | function (error) { 76 | if (cb) { 77 | cb(null) 78 | } else if (error) { 79 | console.log(error) 80 | } else { 81 | console.log('installed') 82 | } 83 | } 84 | ) 85 | }) 86 | }) 87 | }) 88 | }).on('error', function (e) { 89 | console.error(e.message) 90 | }) 91 | }) 92 | }).on('error', function (e) { 93 | console.error(e.message) 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /lib/modules/ls.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var mkdirp = require('mkdirp') 3 | var dirname = require('../config').dirname 4 | 5 | module.exports = function () { 6 | var list = '' 7 | var files = [] 8 | var exists = fs.existsSync(dirname.npm) 9 | if (!exists) mkdirp.sync(dirname.npm) 10 | files = fs.readdirSync(dirname.npm) 11 | files = files.filter(function (item) { 12 | return (item.match(/^\./) === null) 13 | }) 14 | list = files.join('\n') 15 | 16 | exists = fs.existsSync(dirname.current.npm) 17 | if (exists) { 18 | var current = 'v' + require(dirname.current.npm + '/package.json').version 19 | list += '\n\n' 20 | list += '\u001b[35m' 21 | list += 'current: ' + current 22 | list += '\u001b[0m' 23 | } 24 | if (list === '') list = 'List is empty now.' 25 | 26 | console.log(list) 27 | } 28 | -------------------------------------------------------------------------------- /lib/modules/lsRemote.js: -------------------------------------------------------------------------------- 1 | var https = require('https') 2 | var table = require('text-table') 3 | var url = require('../config').url 4 | 5 | module.exports = function () { 6 | var message = '' 7 | var body = '' 8 | var versions = [] 9 | var stdout = [] 10 | 11 | https.get(url, function (res) { 12 | if (res.statusCode !== 200) { 13 | message = 'Error: Server responsed status code ' 14 | message += res.statusCode 15 | console.error(message) 16 | } 17 | 18 | res.on('data', function (chunk) { body += chunk }) 19 | 20 | res.on('end', function () { 21 | body = JSON.parse(body) 22 | versions = Object.keys(body.versions) 23 | versions = versions.map(function (version) { 24 | return 'v' + version 25 | }) 26 | versions.forEach(function (version, index) { 27 | var key = Math.floor(index / 8) 28 | if (!Array.isArray(stdout[key])) stdout[key] = [] 29 | stdout[key].push(version) 30 | }) 31 | message = table(stdout) 32 | 33 | console.log('remote:') 34 | console.log(message) 35 | }) 36 | }).on('error', function (e) { 37 | console.error(e.message) 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /lib/modules/npm.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var path = require('path') 3 | var spawn = require('child_process').spawn 4 | var dirname = require('../config').dirname 5 | var chalk = require('chalk') 6 | var updateNotifier = require('update-notifier') 7 | var stringLength = require('string-length') 8 | var fill = function (str, count) { 9 | return Array(count + 1).join(str) 10 | } 11 | 12 | module.exports = function (argv, cb) { 13 | cb = typeof cb === 'function' ? cb : false 14 | argv = typeof argv === 'object' ? argv : [] 15 | var exists = fs.existsSync(dirname.current.dir) 16 | if (!exists) { 17 | console.log('npmbrew use ') 18 | return 19 | } 20 | var pkg = require(path.join(dirname.current.npm, 'package.json')) 21 | var cmd = spawn(dirname.current.bin, argv) 22 | cmd.stdout.on('data', function (stdout) { 23 | process.stdout.write(stdout) 24 | }) 25 | cmd.on('exit', function (code) { 26 | var update = updateNotifier({ 27 | pkg: pkg 28 | }).update 29 | if (update) updateCheck(update) 30 | if (cb) cb(code) 31 | }) 32 | } 33 | 34 | // Based on https://github.com/yeoman/update-notifier/ 35 | function updateCheck (update) { 36 | var line1 = ' Update available: ' + chalk.green.bold(update.latest) + 37 | chalk.dim(' (current: ' + update.current + ')') + ' ' 38 | var line2 = ' Run ' + chalk.magenta('npmbrew install ' + update.latest) + 39 | ' to update. ' 40 | var contentWidth = Math.max(stringLength(line1), stringLength(line2)) 41 | var line1rest = contentWidth - stringLength(line1) 42 | var line2rest = contentWidth - stringLength(line2) 43 | var top = chalk.green('┌' + fill('─', contentWidth) + '┐') 44 | var bottom = chalk.green('└' + fill('─', contentWidth) + '┘') 45 | var side = chalk.green('│') 46 | 47 | var message = 48 | '\n\n' + 49 | top + '\n' + 50 | side + line1 + fill(' ', line1rest) + side + '\n' + 51 | side + line2 + fill(' ', line2rest) + side + '\n' + 52 | bottom + '\n' 53 | console.error(message) 54 | } 55 | -------------------------------------------------------------------------------- /lib/modules/uninstall.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var path = require('path') 3 | var dirname = require('../config').dirname 4 | var rimraf = require('rimraf') 5 | 6 | module.exports = function (version) { 7 | if (version.substring(0, 1) !== 'v') version = 'v' + version 8 | var exists = fs.existsSync(dirname.current.npm) 9 | if (exists) { 10 | var current = 'v' + require(dirname.current.npm + '/package.json').version 11 | if (version === current) { 12 | fs.unlinkSync(dirname.current.npm) 13 | fs.unlinkSync(dirname.current.bin) 14 | } 15 | } 16 | rimraf.sync(path.join(dirname.npm, version)) 17 | console.log(version + ' uninstalled') 18 | } 19 | -------------------------------------------------------------------------------- /lib/modules/use.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var mkdirp = require('mkdirp') 3 | var dirname = require('../config').dirname 4 | 5 | module.exports = function (version) { 6 | var exists = fs.existsSync(dirname.npm) 7 | var files = [] 8 | 9 | if (version.substring(0, 1) !== 'v') version = 'v' + version 10 | if (!exists) mkdirp.sync(dirname.npm) 11 | 12 | files = fs.readdirSync(dirname.npm) 13 | files = files.filter(function (item) { 14 | return (item.match(/^\./) === null) 15 | }) 16 | var has = files.indexOf(version) 17 | if (has === -1) { 18 | console.log('Version: ' + version + ' has not found') 19 | return 20 | } 21 | var lstat 22 | try { 23 | exists = fs.existsSync(dirname.current.bindir) 24 | if (!exists) mkdirp.sync(dirname.current.bindir) 25 | lstat = fs.lstatSync(dirname.current.npm) 26 | if (lstat.isSymbolicLink()) fs.unlinkSync(dirname.current.npm) 27 | lstat = fs.lstatSync(dirname.current.bin) 28 | if (lstat.isSymbolicLink()) fs.unlinkSync(dirname.current.bin) 29 | } catch (Exception) {} 30 | fs.symlinkSync(dirname.npm + '/' + version, dirname.current.npm) 31 | fs.symlinkSync(dirname.current.npm + '/bin/npm-cli.js', dirname.current.bin) 32 | console.log('Using ' + version) 33 | } 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npmbrew", 3 | "version": "1.5.3", 4 | "description": "a npm version manager", 5 | "main": "index.js", 6 | "bin": { 7 | "npmbrew": "./bin/npmbrew.js" 8 | }, 9 | "scripts": { 10 | "preversion": "npm test", 11 | "lint": "standard", 12 | "tap": "NODE_ENV=development tap test/*.js", 13 | "test": "npm run lint && npm run tap" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/watilde/npmbrew.git" 18 | }, 19 | "keywords": [ 20 | "npm" 21 | ], 22 | "author": "Daijiro Wachi", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/watilde/npmbrew/issues" 26 | }, 27 | "homepage": "https://github.com/watilde/npmbrew", 28 | "dependencies": { 29 | "chalk": "^1.1.0", 30 | "mkdirp": "^0.5.1", 31 | "rimraf": "^2.3.4", 32 | "string-length": "^1.0.1", 33 | "text-table": "^0.2.0", 34 | "update-notifier": "^0.7.0" 35 | }, 36 | "devDependencies": { 37 | "standard": "^7.1.0", 38 | "tap": "^5.4.2" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /test/00-clean.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var versions = ['2.6.1', '2.7.0'] 6 | 7 | test('init: npmbrew clean', function (t) { 8 | npmbrew.clean(function () { 9 | versions.forEach(function (version) { 10 | var srcFile = dirname.src + '/npm-' + version 11 | var npmFile = dirname.src + '/v' + version 12 | t.notOk(fs.existsSync(srcFile), 'v' + version + ' src file has cleaned') 13 | t.notOk(fs.existsSync(npmFile), 'v' + version + ' src file has cleaned') 14 | }) 15 | t.end() 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /test/01-install-v2.6.1.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var version = '2.6.1' 6 | 7 | test('npmbrew install v2.6.1', function (t) { 8 | npmbrew.install(version, function () { 9 | var srcFile = dirname.src + '/npm-' + version 10 | var npmFile = dirname.npm + '/v' + version 11 | t.ok(fs.existsSync(srcFile), 'v' + version + ' src file exists') 12 | t.ok(fs.existsSync(npmFile), 'v' + version + ' npm file exists') 13 | t.end() 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /test/02-install-v2.7.0.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var version = '2.7.0' 6 | 7 | test('npmbrew install v2.7.0', function (t) { 8 | npmbrew.install(version, function () { 9 | var srcFile = dirname.src + '/npm-' + version 10 | var npmFile = dirname.npm + '/v' + version 11 | t.ok(fs.existsSync(srcFile), 'v' + version + ' src file exists') 12 | t.ok(fs.existsSync(npmFile), 'v' + version + ' npm file exists') 13 | t.end() 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /test/03-use-v2.7.0.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var version = '2.7.0' 6 | 7 | test('npmbrew use v2.7.0', function (t) { 8 | npmbrew.use(version) 9 | var lstat = fs.lstatSync(dirname.current.npm) 10 | t.ok(lstat.isSymbolicLink(), 'npmbrew has current package') 11 | t.end() 12 | }) 13 | -------------------------------------------------------------------------------- /test/04-uninstall-v2.6.1.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var version = '2.6.1' 6 | 7 | test('npmbrew uninstall v2.6.1', function (t) { 8 | npmbrew.uninstall(version) 9 | var npmFile = dirname.src + '/v' + version 10 | t.notOk(fs.existsSync(npmFile), 'v' + version + ' src file has uninstalled') 11 | t.end() 12 | }) 13 | -------------------------------------------------------------------------------- /test/99-clean.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var test = require('tap').test 3 | var npmbrew = require('../lib/') 4 | var dirname = require('../lib/config').dirname 5 | var versions = ['2.6.1', '2.7.0'] 6 | 7 | test('last: npmbrew clean', function (t) { 8 | npmbrew.clean(function () { 9 | versions.forEach(function (version) { 10 | var srcFile = dirname.src + '/npm-' + version 11 | var npmFile = dirname.src + '/v' + version 12 | t.notOk(fs.existsSync(srcFile), 'v' + version + ' src file has cleaned') 13 | t.notOk(fs.existsSync(npmFile), 'v' + version + ' src file has cleaned') 14 | }) 15 | t.end() 16 | }) 17 | }) 18 | --------------------------------------------------------------------------------