wishthis/node_modules/matchdep/lib/matchdep.js
2022-01-21 09:28:41 +01:00

76 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);
};
});