PHP WebShell

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

Просмотр файла: check-package-dependencies.ts

const fs = require('fs');
const path = require('path');
const depcheck = require('depcheck');

const {
  promises: { readdir },
} = fs;

const options = {
  ignoreBinPackage: false,
  skipMissing: false,
  ignorePatterns: ['dist', 'example', 'examples'],
  ignoreMatches: [
    '@components/**',
    // Required for opengpg types
    '@openpgp/web-stream-tools',
    '@types/**',
    'blake2b',
    // Required for sdk-coin-eth
    '@ethereumjs/util',
    'express-serve-static-core',
    // Required for sdk-coin-ada
    '@emurgo/cardano-serialization-lib-browser',
    // Required for sdk-coin-celo inner dependencies
    '@celo/contractkit',
    // Webpack - not detected by depcheck
    '@testing-library/cypress',
    'css-loader',
    'file-loader',
    'postcss',
    'postcss-loader',
    'postcss-preset-env',
    'sass',
    'sass-loader',
    'style-loader',
    'ts-loader',
  ],
  specials: [
    depcheck.special.babel,
    depcheck.special.bin,
    depcheck.special.eslint,
    depcheck.special.jest,
    depcheck.special['lint-staged'],
    depcheck.special.mocha,
    depcheck.special.tslint,
    depcheck.special.ttypescript,
    depcheck.special.webpack,
  ],
  detectors: [
    depcheck.detector.exportDeclaration,
    depcheck.detector.exportNamedDeclaration,
    depcheck.detector.extract,
    depcheck.detector.gruntLoadTaskCallExpression,
    depcheck.detector.importCallExpression,
    depcheck.detector.importDeclaration,
    depcheck.detector.requireCallExpression,
    depcheck.detector.requireResolveCallExpression,
    depcheck.detector.typescriptImportEqualsDeclaration,
    depcheck.detector.typescriptImportType,
  ],
};

async function getPackages(source) {
  return (await readdir(source, { withFileTypes: true }))
    .filter((dirent) => dirent.isDirectory())
    .map((dirent) => dirent.name);
}

async function main() {
  const rootPath = path.resolve(__dirname, '../');
  const rootPackageJson = JSON.parse(fs.readFileSync(`${rootPath}/package.json`, { encoding: 'utf8', flag: 'r' }));
  const rootDependencies = rootPackageJson.dependencies ? Object.keys(rootPackageJson.dependencies) : [];
  const rootDevDependencies = rootPackageJson.devDependencies ? Object.keys(rootPackageJson.devDependencies) : [];

  const modulePath = path.resolve(__dirname, '../modules');
  const packages = await getPackages(modulePath);
  const promises = packages.map(async (name) => {
    const data = await depcheck(`${modulePath}/${name}`, options);
    return {
      name,
      data,
    };
  });

  const results = await Promise.all(promises);
  let exitCode = 0;

  results.forEach((pkg: any) => {
    let showDepWarnings = false;
    const depWarningModules: string[] = [];
    if (pkg.data.dependencies.length) {
      pkg.data.dependencies.forEach((module) => {
        const index = rootDependencies.findIndex((x) => x === module);
        if (index === -1) {
          showDepWarnings = true;
          depWarningModules.push(`\x1b[34m - ${module} \x1b[0m`);
        }
      });
    }

    if (showDepWarnings && depWarningModules.length) {
      exitCode = 1;
      console.warn(`\x1b[31m Warning: dependencies declared but not detected in code - ${pkg.name} \x1b[0m`);
      depWarningModules.forEach((x) => console.log(x));
    }

    let showDevDepWarnings = false;
    const devDepWarningModules: string[] = [];
    if (pkg.data.devDependencies.length) {
      pkg.data.devDependencies.forEach((module) => {
        const index = rootDevDependencies.findIndex((x) => x === module);
        if (index === -1) {
          showDevDepWarnings = true;
          devDepWarningModules.push(`\x1b[34m - ${module} \x1b[0m`);
        }
      });
    }

    if (showDevDepWarnings && devDepWarningModules.length) {
      exitCode = 1;
      console.warn(`\x1b[31m Warning: devDependencies declared but not detected in code - ${pkg.name} \x1b[0m`);
      devDepWarningModules.forEach((x) => console.log(x));
    }

    const pkgWarningModules: string[] = [];
    const missing = Object.keys(pkg.data.missing);

    if (missing.length) {
      missing.forEach((module) => {
        const indexDep = rootDependencies.findIndex((x) => x === module);
        const indexDevDep = rootDevDependencies.findIndex((x) => x === module);
        if (indexDep === -1 && indexDevDep === -1) {
          exitCode = 1;
          pkgWarningModules.push(`\x1b[34m - ${module} \x1b[0m`);
        }
      });
    }

    if (exitCode && pkgWarningModules.length) {
      console.error(`\x1b[31m Error: packages used but missing in package.json of ${pkg.name} \x1b[0m:`);
      pkgWarningModules.forEach((x) => console.log(x));
    }
  });

  return exitCode;
}

main()
  .then(process.exit)
  .catch((e) => {
    console.error(e);
    process.exit(1);
  });

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


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