'use strict' const fs = require('graceful-fs') const path = require('path') const helper = require('./helper') const log = require('./logger').create('plugin') const IGNORED_PACKAGES = ['karma-cli', 'karma-runner.github.com'] function resolve (plugins, emitter) { const modules = [] function requirePlugin (name) { log.debug(`Loading plugin ${name}.`) try { modules.push(require(name)) } catch (e) { if (e.code === 'MODULE_NOT_FOUND' && e.message.includes(name)) { log.error(`Cannot find plugin "${name}".\n Did you forget to install it?\n npm install ${name} --save-dev`) } else { log.error(`Error during loading "${name}" plugin:\n ${e.message}`) } emitter.emit('load_error', 'plug_in', name) } } plugins.forEach(function (plugin) { if (helper.isString(plugin)) { if (!plugin.includes('*')) { requirePlugin(plugin) return } const pluginDirectory = path.normalize(path.join(__dirname, '/../..')) const regexp = new RegExp(`^${plugin.replace('*', '.*')}`) log.debug(`Loading ${plugin} from ${pluginDirectory}`) fs.readdirSync(pluginDirectory) .filter((pluginName) => !IGNORED_PACKAGES.includes(pluginName) && regexp.test(pluginName)) .forEach((pluginName) => requirePlugin(`${pluginDirectory}/${pluginName}`)) } else if (helper.isObject(plugin)) { log.debug(`Loading inlined plugin (defining ${Object.keys(plugin).join(', ')}).`) modules.push(plugin) } else { log.error(`Invalid plugin ${plugin}`) emitter.emit('load_error', 'plug_in', plugin) } }) return modules } exports.resolve = resolve