77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
|
/*
|
||
|
* 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);
|
||
|
};
|
||
|
});
|