Skip to content

Commit 98c19ba

Browse files
committed
Initial commit
0 parents  commit 98c19ba

18 files changed

Lines changed: 398 additions & 0 deletions

.editorconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
# editorconfig.org
3+
root = true
4+
5+
[*]
6+
indent_style = space
7+
indent_size = 2
8+
end_of_line = lf
9+
charset = utf-8
10+
trim_trailing_whitespace = true
11+
insert_final_newline = true
12+
13+
[*.md]
14+
trim_trailing_whitespace = false

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.jshintrc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"camelcase": true,
3+
"curly": true,
4+
"eqeqeq": true,
5+
"freeze": true,
6+
"indent": 2,
7+
"newcap": false,
8+
"quotmark": "single",
9+
"maxdepth": 3,
10+
"maxstatements": 50,
11+
"maxlen": 100,
12+
"eqnull": true,
13+
"funcscope": true,
14+
"strict": true,
15+
"globalstrict": true,
16+
"undef": true,
17+
"unused": true,
18+
"node": true,
19+
"mocha" : true,
20+
"laxbreak": true
21+
}

.travis.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
language: node_js
2+
node_js:
3+
- "0.11"
4+
- "0.10"
5+
notifications:
6+
email: true

gulpfile.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
var which = require('./.');
4+
5+
which('which', function(err, gulp_){
6+
console.log(gulp_);
7+
});

index.js

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
'use strict';
2+
3+
var npm = require('npm');
4+
var path = require('path');
5+
var which = require('which');
6+
var findup = require('findup');
7+
var type = require('utils-type');
8+
9+
exports = module.exports = whichBlib;
10+
exports.sync = syncWhichBlib;
11+
exports.packageFields = ['version'];
12+
13+
var argv = process.argv;
14+
var main = process.mainModule;
15+
16+
function whichBlib(cmd_, cb){
17+
var cmd = check(cmd_);
18+
19+
which(cmd.name, function(err, whichName){
20+
if(err){ throw cb(err); }
21+
cmd.extension = cmd.extension || '.js';
22+
cmd.which = whichName;
23+
cmd.runFromBin = cmd.which === argv[1];
24+
cmd.configFile = cmd.configFile || cmd.name + 'file';
25+
if( !path.extname(cmd.configFile) ){ cmd.configFile += cmd.extension; }
26+
npm.load(function(cli, npm_){
27+
findup(process.cwd(), cmd.configFile, function(err, configDir){
28+
cmd.mainDir = npm_.dir;
29+
cmd.globalDir = npm_.globalDir;
30+
31+
if( !err ){ cmd.configFile = path.join(configDir, cmd.configFile); }
32+
else { cmd.configFile = err; }
33+
34+
var cliPackage; cmd.cliPackage = { };
35+
var modulePackage; cmd.modulePackage = { };
36+
var pack = path.join(cmd.name, 'package');
37+
try { modulePackage = require(path.join(cmd.mainDir, pack)); }
38+
catch(err){
39+
cmd.modulePackage = err;
40+
return cb(err, cmd);
41+
}
42+
try { cliPackage = require(path.join(cmd.globalDir, pack)); }
43+
catch(err){
44+
cmd.cliPackage = err;
45+
copyFields(cmd, modulePackage);
46+
return cb(err, cmd);
47+
}
48+
49+
copyFields(cmd, modulePackage, cliPackage);
50+
cb(err || null, cmd);
51+
});
52+
});
53+
});
54+
}
55+
56+
function syncWhichBlib(cmd_){
57+
var cmd = check(cmd_);
58+
cmd.cwd = process.cwd();
59+
cmd.extension = cmd.extension || '.js';
60+
cmd.configFile = cmd.configFile || cmd.name + 'file';
61+
if( !path.extname(cmd.configFile) ){ cmd.configFile += cmd.extension; }
62+
63+
var which = require('which');
64+
var findup = require('findup-sync');
65+
66+
cmd.which = which.sync(cmd.name);
67+
cmd.runFromBin = cmd.which === argv[1];
68+
cmd.configFile = findup(cmd.configFile, { cwd : cmd.cwd });
69+
70+
cmd.mainDir = main.paths[0];
71+
cmd.globalDir = null;
72+
if( cmd.which ){
73+
// TODO: find a non hacky way to do this
74+
cmd.globalDir = path.resolve(cmd.which || '.', '..', '..', 'lib', 'node_modules');
75+
}
76+
77+
var cliPackage; cmd.cliPackage = { };
78+
var modulePackage; cmd.modulePackage = { };
79+
var pack = path.join(cmd.name, 'package');
80+
try { modulePackage = require(path.join(cmd.mainDir, pack)); }
81+
catch(err){
82+
cmd.modulePackage = err;
83+
return cmd;
84+
}
85+
try { cliPackage = require(path.join(cmd.globalDir, pack)); }
86+
catch(err){
87+
cmd.cliPackage = err;
88+
copyFields(cmd, modulePackage);
89+
return cmd;
90+
}
91+
92+
copyFields(cmd, modulePackage, cliPackage);
93+
return cmd;
94+
}
95+
96+
97+
98+
function check(cmd){
99+
var cmdIs = type(cmd);
100+
var typeError = !cmdIs.match(/string|plainObject/);
101+
if( typeError ){ throw new TypeError('`cmd` should be string or object'); }
102+
cmd = cmdIs.plainObject || { name : cmdIs.string };
103+
if( !cmd.name ){ throw new Error('give a name to search'); }
104+
cmd.name = cmd.name.toLowerCase();
105+
return cmd;
106+
}
107+
108+
function copyFields(cmd, modulePackage, cliPackage){
109+
if( !exports.packageFields.length ){ return ; }
110+
exports.packageFields.forEach(function(field){
111+
if( cliPackage && cliPackage[field] ){
112+
cmd.cliPackage[field] = cliPackage[field];
113+
}
114+
if( modulePackage && modulePackage[field] ){
115+
cmd.modulePackage[field] = modulePackage[field];
116+
}
117+
});
118+
}

package.json

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"name": "which-blib",
3+
"main": "index.js",
4+
"version": "0.5.0",
5+
"engines": {
6+
"node": ">= 0.10.0"
7+
},
8+
"devDependencies": {
9+
"mocha": "*",
10+
"should": "*",
11+
"jshint-stylish": "*"
12+
},
13+
"author": "Javier Carrillo",
14+
"description": "from which bin to lib directory and configuration file",
15+
"repository": "stringparser/which-blib",
16+
"homepage": "https://github.com/stringparser/which-blib",
17+
"keywords": [
18+
"utils",
19+
"require",
20+
"module",
21+
"directory",
22+
"files",
23+
"filter",
24+
"regexp",
25+
"regex",
26+
"small"
27+
],
28+
"license": "MIT",
29+
"bugs": {
30+
"url": "https://github.com/stringparser/which-blib/issues"
31+
},
32+
"scripts": {
33+
"lint": "jshint index.js --reporter node_modules/jshint-stylish/stylish.js --exclude node_modules",
34+
"test": "mocha --reporter spec test/_main.js"
35+
},
36+
"dependencies": {
37+
"findup": "^0.1.5",
38+
"findup-sync": "^0.1.3",
39+
"graceful-fs": "^3.0.4",
40+
"utils-type": "^0.8.10",
41+
"which": "^1.0.5"
42+
}
43+
}

readme.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# which-blib [<img alt="progressed.io" src="http://progressed.io/bar/50" align="right"/>](https://github.com/fehmicansaglam/progressed.io)
2+
3+
[<img alt="build" src="http://img.shields.io/travis/stringparser/which-blib/master.svg?style=flat-square" align="left"/>](https://travis-ci.org/stringparser/which-blib/builds)
4+
[<img alt="NPM version" src="http://img.shields.io/npm/v/which-blib.svg?style=flat-square" align="right"/>](http://www.npmjs.org/package/which-blib)
5+
6+
Was the script run from bin?
7+
What is the main `node_modules`directory?
8+
There is some config file asociated to it?
9+
What is the global `node_modules` directory?
10+
11+
## install
12+
13+
$ npm install --save which-blib
14+
15+
## usage
16+
17+
```javascript
18+
var wlb = require('which-blib');
19+
20+
wlb.packageFields = ['version'];
21+
22+
wlb('which', function(err, config){
23+
if(err) throw err;
24+
console.log(config);
25+
// =>
26+
// { name: 'which',
27+
// extension: '.js',
28+
// which: '/usr/bin/which',
29+
// runFromBin: false,
30+
// configFile: [Error: not found],
31+
// mainDir: '/home/jcm/code/which-blib/node_modules',
32+
// globalDir: '/home/jcm/npm/lib/node_modules',
33+
// cliPackage: { [Error: Cannot find module] code: 'MODULE_NOT_FOUND' },
34+
// modulePackage: { version: '1.0.5' } }
35+
});
36+
```
37+
38+
### test
39+
40+
$ npm test
41+
42+
### license
43+
44+
[<img alt="LICENSE" src="http://img.shields.io/npm/l/which-blib.svg?style=flat-square"/>](http://opensource.org/licenses/MIT)

test/_main.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
3+
var path = require('path');
4+
var packageName = require('../package').name;
5+
var pack = require('../');
6+
7+
var util = require('./_util.js');
8+
9+
describe(packageName, function(){
10+
11+
util.testSuite().forEach(function(file){
12+
var suite = path.basename(file, path.extname(file));
13+
describe(suite, function(){
14+
// the actual suite code
15+
require('./'+file)(pack, util);
16+
});
17+
});
18+
});

test/_util.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
var fs = require('fs');
4+
5+
module.exports = {
6+
testSuite : function(){
7+
var testSuite = fs.readdirSync(__dirname);
8+
// in case there is priority
9+
var testFirst = [];
10+
var exclude = [
11+
'_main.js',
12+
'_util.js',
13+
'modules'
14+
];
15+
16+
// use it also to omit _main & _util files
17+
testFirst.concat(exclude).forEach(function(file){
18+
testSuite.splice(testSuite.indexOf(file), 1);
19+
});
20+
testSuite.unshift.apply(testSuite, testFirst);
21+
return testSuite;
22+
}
23+
};

0 commit comments

Comments
 (0)