PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/depcheck/dist

Просмотр файла: check.js

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
var _debug = _interopRequireDefault(require("debug"));
var _isCoreModule = _interopRequireDefault(require("is-core-module"));
var _lodash = _interopRequireDefault(require("lodash"));
var _readdirp = _interopRequireDefault(require("readdirp"));
var _minimatch = _interopRequireDefault(require("minimatch"));
var _requirePackageName = _interopRequireDefault(require("require-package-name"));
var _utils = require("./utils");
var _parser = _interopRequireDefault(require("./utils/parser"));
var _typescript = require("./utils/typescript");
var _constants = require("./constants");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function isModule(dir) {
  try {
    (0, _utils.readJSON)(_path.default.resolve(dir, 'package.json'));
    return true;
  } catch (error) {
    return false;
  }
}
function mergeBuckets(object1, object2) {
  return _lodash.default.mergeWith(object1, object2, (value1, value2) => {
    const array1 = value1 || [];
    const array2 = value2 || [];
    return array1.concat(array2);
  });
}
function detect(detectors, node, deps) {
  return (0, _lodash.default)(detectors).map(detector => {
    try {
      return detector(node, deps);
    } catch (error) {
      return [];
    }
  }).flatten().value();
}

// Apply imports map from package.json to a discovered dependency.  If the
// dependency starts with '#' and we have a matching entry in "imports" in
// the package.json we'll substitute the possible mapped imports in place of
// that dependency.
//
// Conditions can be well-known ones implemented by node, TypeScript, or webpack like
// "import", "browser", "types", or "require".  They can also be custom ones as configurable
// in webpack configuration or using the enhanced-resolve package.
//
// See also:
//   - https://nodejs.org/api/packages.html#subpath-imports
//   - https://www.typescriptlang.org/docs/handbook/esm-node.html
//   - https://webpack.js.org/configuration/resolve/#resolveconditionnames
function applyImportsMap(importsMap, dep) {
  const resolvedDeps = [];
  function accumulateDeps(v, wildcardMatch) {
    if (v) {
      if (typeof v === 'string') {
        resolvedDeps.push(wildcardMatch && v.includes('*') ? v.replaceAll('*', wildcardMatch) : v);
      } else if (typeof v === 'object') {
        Object.values(v).forEach(vv => accumulateDeps(vv, wildcardMatch));
      }
    }
  }

  // Match input against the path pattern; if it matches, and there was a wildcard in the patten,
  // return the part of the input that matched the wildcard.  If there was no wildcard, return
  // an empty string.
  function matchPathPattern(pattern, input) {
    if (pattern.includes('*')) {
      const escapedPattern = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
      const regexPattern = escapedPattern.replace(/\\\*/g, '.*');
      (0, _debug.default)('depcheck:applyImportsMap:matchPathPattern:regexPattern')(pattern, input, regexPattern);
      const regex = new RegExp(`^${regexPattern}$`);
      const match = input.match(regex);
      if (match) {
        return match[0];
      }
    } else if (pattern === input) {
      return '';
    }
    return null;
  }
  if (dep.startsWith('#')) {
    Object.entries(importsMap).forEach(m => {
      const match = matchPathPattern(m[0], dep);
      if (match !== null) {
        accumulateDeps(m[1], match);
      }
    });
    if (resolvedDeps.length) {
      (0, _debug.default)('depcheck:applyImportsMap:resolved')(dep, resolvedDeps);
      return resolvedDeps;
    }
    (0, _debug.default)('depcheck:applyImportsMap:unresolved')(dep);
  }
  return [dep];
}
function discoverPropertyDep(rootDir, deps, property, depName) {
  const {
    metadata
  } = (0, _utils.loadModuleData)(depName, rootDir);
  if (!metadata) return [];
  const propertyDeps = Object.keys(metadata[property] || {});
  return _lodash.default.intersection(deps, propertyDeps);
}
async function getDependencies({
  deps,
  dir,
  filename,
  detectors,
  importsMap,
  parser
}) {
  const result = await parser(filename, deps, dir);

  // when parser returns string array, skip detector step and treat them as dependencies.
  const dependencies = _lodash.default.isArray(result) && result.every(_lodash.default.isString) ? result : (0, _lodash.default)((0, _parser.default)(result)).map(node => detect(detectors, node, deps)).flatten().uniq().flatMap(_lodash.default.partial(applyImportsMap, importsMap)).map(_requirePackageName.default).thru(_dependencies => parser === _constants.availableParsers.typescript ?
  // If this is a typescript file, importing foo would also use @types/foo, but
  // only if @types/foo is already a specified dependency.
  (0, _lodash.default)(_dependencies).map(dependency => {
    const atTypesName = (0, _typescript.getAtTypesName)(dependency);
    return deps.includes(atTypesName) ? [dependency, atTypesName] : [dependency];
  }).flatten().value() : _dependencies).value();
  const discover = _lodash.default.partial(discoverPropertyDep, dir, deps);
  const discoverPeerDeps = _lodash.default.partial(discover, 'peerDependencies');
  const discoverOptionalDeps = _lodash.default.partial(discover, 'optionalDependencies');
  const peerDeps = (0, _lodash.default)(dependencies).map(discoverPeerDeps).flatten().value();
  const optionalDeps = (0, _lodash.default)(dependencies).map(discoverOptionalDeps).flatten().value();
  return (0, _lodash.default)(dependencies).concat(peerDeps).concat(optionalDeps).filter(dep => dep && dep !== '.' && dep !== '..') // TODO why need check?
  .filter(dep => !(0, _isCoreModule.default)(dep)).uniq().value();
}
function checkFile({
  deps,
  detectors,
  dir,
  filename,
  importsMap,
  parsers
}) {
  (0, _debug.default)('depcheck:checkFile')(filename);
  const targets = (0, _lodash.default)(parsers).keys().filter(glob => (0, _minimatch.default)(filename, glob, {
    dot: true
  })).map(key => parsers[key]).flatten().value();
  return targets.map(parser => getDependencies({
    deps,
    detectors,
    dir,
    filename,
    importsMap,
    parser
  }).then(using => {
    if (using.length) {
      (0, _debug.default)('depcheck:checkFile:using')(filename, parser, using);
    }
    return {
      using: {
        [filename]: using
      }
    };
  }, error => {
    (0, _debug.default)('depcheck:checkFile:error')(filename, parser, error);
    return {
      invalidFiles: {
        [filename]: error
      }
    };
  }));
}
function checkDirectory({
  dir,
  rootDir,
  ignorer,
  importsMap,
  deps,
  parsers,
  detectors
}) {
  (0, _debug.default)('depcheck:checkDirectory')(dir);
  return new Promise(resolve => {
    const promises = [];
    const finder = (0, _readdirp.default)(dir, {
      fileFilter: entry => !ignorer.ignores(entry.path),
      directoryFilter: entry => !ignorer.ignores(entry.path) && !isModule(entry.fullPath)
    });
    finder.on('data', entry => {
      promises.push(...checkFile({
        deps,
        detectors,
        dir: rootDir,
        filename: entry.fullPath,
        importsMap,
        parsers
      }));
    });
    finder.on('warn', error => {
      (0, _debug.default)('depcheck:checkDirectory:error')(dir, error);
      promises.push(Promise.resolve({
        invalidDirs: {
          [error.path]: error
        }
      }));
    });
    finder.on('end', () => {
      resolve(Promise.all(promises).then(results => results.reduce((obj, current) => ({
        using: mergeBuckets(obj.using, current.using || {}),
        invalidFiles: _extends(obj.invalidFiles, current.invalidFiles),
        invalidDirs: _extends(obj.invalidDirs, current.invalidDirs)
      }), {
        using: {},
        invalidFiles: {},
        invalidDirs: {}
      })));
    });
  });
}
function buildResult({
  result,
  deps,
  devDeps,
  peerDeps,
  optionalDeps,
  skipMissing
}) {
  const usingDepsLookup = (0, _lodash.default)(result.using)
  // { f1:[d1,d2,d3], f2:[d2,d3,d4] }
  .toPairs()
  // [ [f1,[d1,d2,d3]], [f2,[d2,d3,d4]] ]
  .map(([file, dep]) => [dep, _lodash.default.times(dep.length, () => file)])
  // [ [ [d1,d2,d3],[f1,f1,f1] ], [ [d2,d3,d4],[f2,f2,f2] ] ]
  .map(pairs => _lodash.default.zip(...pairs))
  // [ [ [d1,f1],[d2,f1],[d3,f1] ], [ [d2,f2],[d3,f2],[d4,f2]] ]
  .flatten()
  // [ [d1,f1], [d2,f1], [d3,f1], [d2,f2], [d3,f2], [d4,f2] ]
  .groupBy(([dep]) => dep)
  // { d1:[ [d1,f1] ], d2:[ [d2,f1],[d2,f2] ], d3:[ [d3,f1],[d3,f2] ], d4:[ [d4,f2] ] }
  .mapValues(pairs => pairs.map(_lodash.default.last))
  // { d1:[ f1 ], d2:[ f1,f2 ], d3:[ f1,f2 ], d4:[ f2 ] }
  .value();
  const usingDeps = Object.keys(usingDepsLookup);
  const missingDepsLookup = skipMissing ? [] : (() => {
    const allDeps = deps.concat(devDeps).concat(peerDeps).concat(optionalDeps);
    const missingDeps = _lodash.default.difference(usingDeps, allDeps);
    return (0, _lodash.default)(missingDeps).map(missingDep => [missingDep, usingDepsLookup[missingDep]]).fromPairs().value();
  })();
  return {
    dependencies: _lodash.default.difference(deps, usingDeps),
    devDependencies: _lodash.default.difference(devDeps, usingDeps),
    missing: missingDepsLookup,
    using: usingDepsLookup,
    invalidFiles: result.invalidFiles,
    invalidDirs: result.invalidDirs
  };
}
var _default = ({
  rootDir,
  ignorer,
  importsMap,
  skipMissing,
  deps,
  devDeps,
  peerDeps,
  optionalDeps,
  parsers,
  detectors
}) => {
  const allDeps = _lodash.default.union(deps, devDeps);
  return checkDirectory({
    dir: rootDir,
    rootDir,
    ignorer,
    importsMap,
    deps: allDeps,
    parsers,
    detectors
  }).then(result => buildResult({
    result,
    deps,
    devDeps,
    peerDeps,
    optionalDeps,
    skipMissing
  }));
};
exports.default = _default;
module.exports = exports.default;

Выполнить команду


Для локальной разработки. Не используйте в интернете!