You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.3 KiB
76 lines
2.3 KiB
/* |
|
* matchdep |
|
* https://github.com/tkellen/node-matchdep |
|
* |
|
* Copyright (c) 2012 Tyler Kellen |
|
* Licensed under the MIT license. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var micromatch = require('micromatch'); |
|
var findup = require('findup-sync'); |
|
var resolve = require('resolve').sync; |
|
var stackTrace = require('stack-trace'); |
|
var path = require('path'); |
|
|
|
// export object |
|
var matchdep = module.exports = {}; |
|
|
|
// Ensure configuration has the correct properties. |
|
function loadConfig(config, props) { |
|
// The calling module's path. Unfortunately, because modules are cached, |
|
// module.parent is the FIRST calling module parent, not necessarily the |
|
// current one. |
|
var callerPath = path.dirname(stackTrace.get(loadConfig)[1].getFileName()); |
|
|
|
// If no config defined, resolve to nearest package.json to the calling lib. If not found, throw an error. |
|
if (config == null) { |
|
config = findup('package.json', {cwd: callerPath}); |
|
if (config == null) { |
|
throw new Error('No package.json found.'); |
|
} |
|
} |
|
// If filename was specified with no path parts, make the path absolute so |
|
// that resolve doesn't look in node_module directories for it. |
|
else if (typeof config === 'string' && !/[\\\/]/.test(config)) { |
|
config = path.join(callerPath, config); |
|
} |
|
|
|
// If package is a string, try to require it. |
|
if (typeof config === 'string') { |
|
config = require(resolve(config, {basedir: callerPath})); |
|
} |
|
|
|
// If config is not an object yet, something is amiss. |
|
if (typeof config !== 'object') { |
|
throw new Error('Invalid configuration specified.'); |
|
} |
|
|
|
// For all specified props, populate result object. |
|
var result = {}; |
|
props.forEach(function(prop) { |
|
result[prop] = config[prop] ? Object.keys(config[prop]) : []; |
|
}); |
|
return result; |
|
} |
|
|
|
// What config properties should each method search? |
|
var methods = { |
|
filter: ['dependencies'], |
|
filterDev: ['devDependencies'], |
|
filterPeer: ['peerDependencies'], |
|
filterAll: ['dependencies', 'devDependencies', 'peerDependencies'], |
|
}; |
|
|
|
// Dynamically generate methods. |
|
Object.keys(methods).forEach(function(method) { |
|
var props = methods[method]; |
|
matchdep[method] = function(pattern, config) { |
|
config = loadConfig(config, props); |
|
var search = props.reduce(function(result, prop) { |
|
return result.concat(config[prop]); |
|
}, []); |
|
return micromatch(search, pattern); |
|
}; |
|
});
|
|
|