PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/depcheck/dist/special
Просмотр файла: karma.js
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = parseKarma;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _resolve = _interopRequireDefault(require("resolve"));
var _lodash = _interopRequireDefault(require("lodash"));
var _es = _interopRequireWildcard(require("../parser/es7"));
var _parser = _interopRequireDefault(require("../utils/parser"));
var _utils = require("../utils");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const supportedConfNames = ['karma.conf.js', 'karma.conf.ts', '.config/karma.conf.js', '.config/karma.conf.ts'];
function parsePluginModuleExports(node) {
// node.left must be assigning to module.export and node.right must be an object literal
if (node && node.type === 'AssignmentExpression' && node.left.type === 'MemberExpression' && node.left.object && node.left.object.type === 'Identifier' && node.left.object.name === 'module' && node.left.property && node.left.property.type === 'Identifier' && node.left.property.name === 'exports' && node.right.type === 'ObjectExpression') {
// only need to return the object keys
return node.right.properties.map(p => p.key.value);
}
return [];
}
function parseConfigModuleExports(node) {
const supportedConfigProperties = ['frameworks', 'browsers', 'preprocessors', 'reporters', 'plugins'];
// node.left must be assigning to module.exports
if (node && node.type === 'AssignmentExpression' && node.left.type === 'MemberExpression' && node.left.object && node.left.object.type === 'Identifier' && node.left.object.name === 'module' && node.left.property && node.left.property.type === 'Identifier' && node.left.property.name === 'exports') {
// module.exports = function(config) {...};
if (node.right.type === 'FunctionExpression' && node.right.params.length === 1 && node.right.body && node.right.body.type === 'BlockStatement' && node.right.body.body.length === 1 && node.right.body.body[0].type === 'ExpressionStatement') {
const functionExprNode = node.right;
const configParam = functionExprNode.params[0].name;
const bodyExprNode = functionExprNode.body.body[0].expression;
// config.set(...)
if (bodyExprNode.type === 'CallExpression' && bodyExprNode.callee.type === 'MemberExpression' && bodyExprNode.callee.object.name === configParam && bodyExprNode.callee.property.name === 'set') {
// assume the call to the function will pass an object literal too
const arg = bodyExprNode.arguments[0];
if (arg.type === 'ObjectExpression') {
// collect literal keys and values for:
// - frameworks {String[]}
// - browsers {String[]}
// - preprocessors {Object} - string (glob expressions) to {string|string[]}
// - reporters {String[]}
// - plugins {Object[]} - possible strings or inline plugin definitions
const config = {};
arg.properties.filter(prop => supportedConfigProperties.includes(prop.key.name)).forEach(prop => {
if (prop.value.type === 'ArrayExpression') {
const vals = [];
prop.value.elements.filter(e => e.type === 'StringLiteral').forEach(e => vals.push(e.value));
config[prop.key.name] = vals;
} else if (prop.value.type === 'ObjectExpression') {
const map = {};
prop.value.properties.filter(p => p.value.type === 'StringLiteral').forEach(p => {
map[p.key.name] = p.value.value;
});
config[prop.key.name] = map;
}
});
return config;
}
// TODO handle other expression types
}
// TODO handle CallExpression
}
}
return null;
}
async function parseConfig(filename) {
const ast = await (0, _es.default)(filename);
return (0, _lodash.default)((0, _parser.default)(ast)).map(node => parseConfigModuleExports(node)).flatten().filter(val => val != null).uniq().first();
}
function collectInstalledPluginInfo(karmaPluginsInstalled, rootDir) {
const pluginInfo = {};
karmaPluginsInstalled.forEach(plugin => {
const packageMain = _resolve.default.sync(plugin, {
basedir: rootDir
});
const packageContents = _fs.default.readFileSync(packageMain, {
encoding: 'utf8'
});
// don't evaluate the contents, since it probably has module requirements we can't load
const ast = (0, _es.parseES7Content)(packageContents);
const p = (0, _lodash.default)((0, _parser.default)(ast)).map(node => parsePluginModuleExports(node)).flatten().uniq().value();
p.forEach(k => {
pluginInfo[k] = plugin;
});
});
return pluginInfo;
}
function collectInstalledPluginOfType(type, pluginInfo) {
const pluginMapping = {};
const prefix = `${type}:`;
Object.keys(pluginInfo).filter(k => k.startsWith(prefix)).forEach(k => {
const pluginName = k.replace(prefix, '');
pluginMapping[pluginName] = pluginInfo[k];
});
return pluginMapping;
}
function collectFrameworks(config, pluginInfo) {
// karma-x plugins define frameworks using the structure { 'framework:<name>': ['factory', f] }
// generate a lookup map { '<name>': 'karma-x', ... }
const frameworkMapping = collectInstalledPluginOfType('framework', pluginInfo);
const installedFrameworks = Object.keys(frameworkMapping);
// config defines a property frameworks: ['<name>',...]
return (0, _utils.wrapToArray)(config.frameworks).filter(name => installedFrameworks.includes(name)).map(name => frameworkMapping[name]);
}
function collectBrowsers(config, pluginInfo) {
// karma-x-launcher plugins define browsers using the structure
// { 'launcher:<name>': ['type', f], ... }
// generate a lookup map { '<name>': 'karma-x-launcher', ... }
const launcherMapping = collectInstalledPluginOfType('launcher', pluginInfo);
const installedBrowsers = Object.keys(launcherMapping);
// config defines a property browsers: ['<name>',...]
return [...new Set((0, _utils.wrapToArray)(config.browsers).filter(name => installedBrowsers.includes(name)).map(name => launcherMapping[name]))];
}
function collectReporters(config, pluginInfo) {
// some reporters are added by frameworks, so don't filter on only '-reporter' plugins
// generate a lookup map { '<name>': 'karma-x', ... }
const reporterMapping = collectInstalledPluginOfType('reporter', pluginInfo);
const installedReporters = Object.keys(reporterMapping);
// config defines a property reporters: ['<name>', ...]
return (0, _utils.wrapToArray)(config.reporters).filter(name => installedReporters.includes(name)).map(name => reporterMapping[name]);
}
function collectPreprocessors(config, pluginInfo) {
// karma-x plugins define preprocessors using the structure
// { 'preprocessor:<name>': ['type', f], ... }
// generate a lookup map { '<name>': 'karma-x', ... }
const preprocessorMapping = collectInstalledPluginOfType('preprocessor', pluginInfo);
const installedPreprocessors = Object.keys(preprocessorMapping);
// config defines a property preprocessors: {'<file-glob>': '<name>'}, ... }
const preprocessors = (0, _utils.wrapToMap)(config.preprocessors);
return [...new Set(Object.keys(preprocessors).map(k => preprocessors[k]).filter(name => installedPreprocessors.includes(name)).map(name => preprocessorMapping[name]))];
}
function collectExplicitPlugins(config) {
// config defines a property frameworks: [x,...] where x is either
// a string name, or an inline plugin
// any inline plugin definitions don't matter here - their require/
// import statements will be handled through other code
return (0, _utils.wrapToArray)(config.plugins).filter(pluginDef => typeof pluginDef === 'string');
}
function collectUsages(config, karmaPluginsInstalled, rootDir) {
const pluginInfo = collectInstalledPluginInfo(karmaPluginsInstalled, rootDir);
return [].concat(collectFrameworks(config, pluginInfo)).concat(collectBrowsers(config, pluginInfo))
// TODO add support for Express middleware plugins
// .concat(collectMiddleware(config, pluginInfo))
.concat(collectPreprocessors(config, pluginInfo)).concat(collectReporters(config, pluginInfo));
}
async function parseKarma(filename, deps, rootDir) {
const resolvedConfigPaths = supportedConfNames.map(name => _path.default.resolve(rootDir, name));
if (!resolvedConfigPaths.includes(filename)) {
return [];
}
const config = await parseConfig(filename);
// possibly unused plugins
const karmaPluginsInstalled = deps.filter(dep => dep.startsWith('karma-')).concat(collectExplicitPlugins(config));
return collectUsages(config, karmaPluginsInstalled, rootDir);
}
module.exports = exports.default;Выполнить команду
Для локальной разработки. Не используйте в интернете!