| 'use strict'; |
| const path = require('path'); |
| const pkgUp = require('pkg-up'); |
| const multimatch = require('multimatch'); |
| const arrify = require('arrify'); |
| const resolvePkg = require('resolve-pkg'); |
| |
| module.exports = (grunt, options = {}) => { |
| const pattern = arrify(options.pattern || ['grunt-*', '@*/grunt-*']); |
| const scope = arrify(options.scope || ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']); |
| |
| let cwd = process.cwd(); |
| let config = options.config || pkgUp.sync(); |
| if (typeof config === 'string') { |
| const configPath = path.resolve(config); |
| cwd = path.dirname(configPath); |
| config = require(configPath); |
| } |
| |
| pattern.push('!grunt', '!grunt-cli'); |
| |
| const names = scope.reduce((result, property) => { |
| const dependencies = config[property] || []; |
| return result.concat(Array.isArray(dependencies) ? dependencies : Object.keys(dependencies)); |
| }, []); |
| |
| for (const packageName of multimatch(names, pattern)) { |
| if (options.requireResolution === true) { |
| try { |
| grunt.loadTasks(resolvePkg(path.join(packageName, 'tasks'), {cwd})); |
| } catch (_) { |
| grunt.log.error(`npm package \`${packageName}\` not found. Is it installed?`); |
| } |
| } else { |
| grunt.loadNpmTasks(packageName); |
| } |
| } |
| }; |