| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | /* * 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 objectvar 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);  };});
 |