PHP WebShell

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

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

#!/usr/bin/env node

// Check versions of in-repo packages to make sure they match with the package.json version.
// This is to prevent inadvertent updates of dependency versions for packages which are symlinked
// by lerna. The dependency versions of these packages should only ever be updated in the release branch.

const execa = require('execa');
const path = require('path');

/**
 * Create a function which can run lerna commands
 * @param lernaPath {string} path to lerna binary
 * @returns {function(string, string[], Object.<string, string>): Promise<string>}
 */
function getLernaRunner(lernaPath) {
  return async (command, args = [], options = {}) => {
    const { stdout } = await execa(lernaPath, [command, ...args], options);
    return stdout;
  };
}

/**
 * Get information on the modules in this repo that are managed by lerna.
 * @param lerna {function}
 * @returns {Promise<{path: *, name: *, deps: *, version: *}[]>}
 */
async function getLernaManagedModules(lerna) {
  const depGraph = JSON.parse(await lerna('list', ['--loglevel', 'silent', '--graph', '--all']));
  const managedModules = JSON.parse(await lerna('list', ['--loglevel', 'silent', '--json', '--all']));
  const managedModuleNames = managedModules.map(({ name }) => name);
  return Object.entries(depGraph).map(([name, deps]) => {
    const mod = managedModules.find((mod) => mod.name === name);
    return {
      name,
      deps: deps.filter((d) => managedModuleNames.includes(d)),
      path: mod.location,
      version: mod.version,
    };
  });
}

/**
 * Build a dictionary from package name to the expected version of that package.
 * @param modules
 * @returns {Object.<string, string>}
 */
function getExpectedVersions(modules) {
  return Object.values(modules).reduce((acc, mod) => {
    return Object.assign(acc, { [mod.name]: mod.version });
  }, {});
}

/**
 * For the module at `modPath`, get the version of the dependency `depName`.
 * If the version is prefixed with a carat or tilde, it will be stripped.
 * @param modPath {string}
 * @param depName {string}
 * @returns {string | undefined}
 */
function getDependencyVersion(modPath, depName) {
  const packageJsonPath = path.join(modPath, 'package.json');
  const {
    dependencies = {},
    devDependencies = {},
    optionalDependencies = {},
    peerDependencies = {},
  } = require(packageJsonPath);

  const deps = { ...dependencies, ...devDependencies, ...optionalDependencies, ...peerDependencies };
  if (deps[depName]) {
    const matches = deps[depName].match(/^([^~])?(.*)$/);
    return matches[matches.length - 1];
  }
}

async function main() {
  const { stdout: lernaBinary } = await execa('yarn', ['bin', 'lerna'], { cwd: process.cwd() });

  const lerna = getLernaRunner(lernaBinary);

  const modules = await getLernaManagedModules(lerna);
  const expectedVersions = getExpectedVersions(modules);

  let exitCode = 0;

  for (const mod of modules) {
    for (const dep of mod.deps) {
      const depVersion = getDependencyVersion(mod.path, dep);
      if (depVersion && depVersion !== expectedVersions[dep]) {
        // Handle pre-release versions by checking if the base version matches
        const baseDepVersion = depVersion.split('-')[0];
        const baseExpectedVersion = expectedVersions[dep].split('-')[0];

        if (baseDepVersion !== baseExpectedVersion) {
          console.log(
            `error: expected lerna-managed module ${mod.name} to depend on package ${dep} using version ${expectedVersions[dep]}, but found version ${depVersion} instead`
          );
          exitCode = 1;
        }
      }
    }
  }

  return exitCode;
}

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

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


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