Skip to content
This repository has been archived by the owner on Aug 11, 2021. It is now read-only.

Commit

Permalink
Merge e007bb4 into d0f69ed
Browse files Browse the repository at this point in the history
  • Loading branch information
othiym23 committed Feb 12, 2016
2 parents d0f69ed + e007bb4 commit 8f17e31
Show file tree
Hide file tree
Showing 8 changed files with 318 additions and 300 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
.DS_Store
node_modules
.nyc_output/
coverage/
7 changes: 6 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
language: node_js
sudo: false
before_install: npm -g install npm
node_js:
- "0.11"
- "0.10"
- "0.12"
- "iojs"
- "4"
- "5"
100 changes: 50 additions & 50 deletions bin/npm-remote-ls.js
Original file line number Diff line number Diff line change
@@ -1,64 +1,64 @@
#!/usr/bin/env node

var yargs = require('yargs')
.options('n', {
alias: 'name',
description: 'package name'
})
.options('v', {
alias: 'version',
description: 'package version',
default: 'latest'
})
.options('e', {
alias: 'verbose',
description: 'enable verbose logging',
default: false,
boolean: true
})
.options('d', {
alias: 'development',
description: 'show development dependencies',
default: true,
boolean: true
})
.options('o', {
alias: 'optional',
description: 'show optional dependencies',
default: true,
boolean: true
})
.options('r', {
alias: 'registry',
description: 'set an alternative registry url',
default: require('registry-url')
})
.options('f', {
alias: 'flatten',
description: 'return flat representation of dependencies',
default: false,
boolean: true
}),
ls = require('../lib').ls,
treeify = require('treeify'),
spinner = require("char-spinner");
.options('n', {
alias: 'name',
description: 'package name'
})
.options('v', {
alias: 'version',
description: 'package version',
default: 'latest'
})
.options('e', {
alias: 'verbose',
description: 'enable verbose logging',
default: false,
boolean: true
})
.options('d', {
alias: 'development',
description: 'show development dependencies',
default: true,
boolean: true
})
.options('o', {
alias: 'optional',
description: 'show optional dependencies',
default: true,
boolean: true
})
.options('r', {
alias: 'registry',
description: 'set an alternative registry url',
default: require('registry-url')
})
.options('f', {
alias: 'flatten',
description: 'return flat representation of dependencies',
default: false,
boolean: true
})
var ls = require('../lib').ls
var treeify = require('treeify')
var spinner = require('char-spinner')

require('../lib').config({
verbose: yargs.argv.verbose,
development: yargs.argv.development,
optional: yargs.argv.optional,
registry: yargs.argv.registry
});
})

var name = yargs.argv.name || yargs.argv._[0] || '',
version = name.split('@')[1] || yargs.argv.version;
var name = yargs.argv.name || yargs.argv._[0] || ''
var version = name.split('@')[1] || yargs.argv.version

if (yargs.argv.help || !name) {
console.log(yargs.help());
console.log(yargs.help())
} else {
spinner();
ls(name.split('@')[0], version, yargs.argv.flatten, function(obj) {
if (Array.isArray(obj)) console.log(obj);
else console.log(treeify.asTree(obj));
});
spinner()
ls(name.split('@')[0], version, yargs.argv.flatten, function (obj) {
if (Array.isArray(obj)) console.log(obj)
else console.log(treeify.asTree(obj))
})
}
15 changes: 8 additions & 7 deletions lib/config.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
var config = null;
var config = null

module.exports = function(opts) {
if (!opts && config) return config;
else {
config = opts;
return config;
module.exports = function (opts) {
if (!opts && config) {
return config
} else {
config = opts
return config
}
};
}
30 changes: 15 additions & 15 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
exports.RemoteLS = require('./remote-ls');
exports.RemoteLS = require('./remote-ls')

exports.config = function(opts) {
return require('./config')(opts);
};
exports.config = function (opts) {
return require('./config')(opts)
}

exports.ls = function(name, version, flatten, cb) {
var ls = new exports.RemoteLS();
exports.ls = function (name, version, flatten, cb) {
var ls = new exports.RemoteLS()

if (typeof version === 'function') {
cb = version;
version = 'latest';
cb = version
version = 'latest'
}

if (typeof flatten === 'function') {
cb = flatten;
flatten = false;
cb = flatten
flatten = false
}

ls.ls(name, version, function() {
if (flatten) cb(Object.keys(ls.flat));
else cb(ls.tree);
});
};
ls.ls(name, version, function () {
if (flatten) cb(Object.keys(ls.flat))
else cb(ls.tree)
})
}
116 changes: 58 additions & 58 deletions lib/remote-ls.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
var _ = require('lodash'),
async = require('async'),
semver = require('semver'),
request = require('request');
var _ = require('lodash')
var async = require('async')
var semver = require('semver')
var request = require('request')

// perform a recursive walk of a remote
// npm package and determine its dependency
// tree.
function RemoteLS(opts) {
var _this = this;
function RemoteLS (opts) {
var _this = this

_.extend(this, {
logger: console,
Expand All @@ -16,87 +16,87 @@ function RemoteLS(opts) {
verbose: false,
registry: require('registry-url'), // URL of registry to ls.
queue: async.queue(function (task, done) {
_this._loadPackageJson(task, done);
_this._loadPackageJson(task, done)
}, 8),
tree: {},
flat: {}
}, require('./config')(), opts);
}, require('./config')(), opts)

this.queue.pause();
this.queue.pause()
}

RemoteLS.prototype._loadPackageJson = function(task, done) {
var _this = this;
RemoteLS.prototype._loadPackageJson = function (task, done) {
var _this = this

request.get(this.registry.replace(/\/$/, '') + '/' + task.name, {json: true}, function(err, res, obj) {
request.get(this.registry.replace(/\/$/, '') + '/' + task.name, {json: true}, function (err, res, obj) {
if (err || (res.statusCode < 200 || res.statusCode >= 400)) {
var message = res ? 'status = ' + res.statusCode : 'error = ' + err.message;
var message = res ? 'status = ' + res.statusCode : 'error = ' + err.message
_this.logger.log(
'could not load ' + task.name + '@' + task.version + ' ' + message
);
return done();
)
return done()
}

try {
if (_this.verbose) console.log('loading:', task.name + '@' + task.version);
_this._walkDependencies(task, obj, done);
if (_this.verbose) console.log('loading:', task.name + '@' + task.version)
_this._walkDependencies(task, obj, done)
} catch (e) {
_this.logger.log(e.message);
done();
_this.logger.log(e.message)
done()
}
});
};

RemoteLS.prototype._walkDependencies = function(task, packageJson, done) {
var _this = this,
version = this._guessVersion(task.version, packageJson),
dependencies = _.extend(
{},
packageJson.versions[version].dependencies,
this.optional ? packageJson.versions[version].optionalDependencies : {},
// show development dependencies if we're at the root, and deevelopment flag is true.
(task.parent === this.tree && this.development) ? packageJson.versions[version].devDependencies : {}
),
fullName = packageJson.name + '@' + version,
parent = task.parent[fullName] = {};

if (_this.flat[fullName]) return done();
else _this.flat[fullName] = true;

Object.keys(dependencies).forEach(function(name) {
})
}

RemoteLS.prototype._walkDependencies = function (task, packageJson, done) {
var _this = this
var version = this._guessVersion(task.version, packageJson)
var dependencies = _.extend(
{},
packageJson.versions[version].dependencies,
this.optional ? packageJson.versions[version].optionalDependencies : {},
// show development dependencies if we're at the root, and deevelopment flag is true.
(task.parent === this.tree && this.development) ? packageJson.versions[version].devDependencies : {}
)
var fullName = packageJson.name + '@' + version
var parent = task.parent[fullName] = {}

if (_this.flat[fullName]) return done()
else _this.flat[fullName] = true

Object.keys(dependencies).forEach(function (name) {
_this.queue.push({
name: name,
version: dependencies[name],
parent: parent
});
});
})
})

done();
};
done()
}

RemoteLS.prototype._guessVersion = function(versionString, packageJson) {
if (versionString === 'latest') versionString = '*';
RemoteLS.prototype._guessVersion = function (versionString, packageJson) {
if (versionString === 'latest') versionString = '*'

var version = semver.maxSatisfying(Object.keys(packageJson.versions), versionString, true);
var version = semver.maxSatisfying(Object.keys(packageJson.versions), versionString, true)

if (!version) throw Error('could not find a satisfactory version for string ' + versionString);
else return version;
};
if (!version) throw Error('could not find a satisfactory version for string ' + versionString)
else return version
}

RemoteLS.prototype.ls = function(name, version, callback) {
var _this = this;
RemoteLS.prototype.ls = function (name, version, callback) {
var _this = this

this.queue.push({
name: name,
version: version,
parent: this.tree
});
})

this.queue.drain = function() {
callback(_this.tree);
};
this.queue.drain = function () {
callback(_this.tree)
}

this.queue.resume();
};
this.queue.resume()
}

module.exports = RemoteLS;
module.exports = RemoteLS
17 changes: 9 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"npm-remote-ls": "./bin/npm-remote-ls.js"
},
"scripts": {
"test": "lab -c --timeout 2000"
"test": "standard && tap --coverage test"
},
"repository": {
"type": "git",
Expand All @@ -26,17 +26,18 @@
},
"homepage": "https://github.com/npm/npm-remote-ls",
"devDependencies": {
"lab": "^4.6.2",
"nock": "^0.48.1"
"nock": "^3.3.2",
"standard": "^5.4.1",
"tap": "^2.3.1"
},
"dependencies": {
"async": "^0.9.0",
"async": "^1.5.0",
"char-spinner": "^1.0.1",
"lodash": "^2.4.1",
"registry-url": "^2.0.0",
"lodash": "^3.10.1",
"registry-url": "^3.0.3",
"request": "^2.37.0",
"semver": "^4.1.0",
"semver": "^5.1.0",
"treeify": "^1.0.1",
"yargs": "^1.2.6"
"yargs": "^3.30.0"
}
}

0 comments on commit 8f17e31

Please sign in to comment.