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