Skip to content

镜像源切换

javascript
import inquirer from "inquirer";
import { execa } from "execa";
import chalk from "chalk";
import { Command } from "commander";

// 脚本切换

/* 
  1. 多选,选择需要切换哪些包工具的镜像源
  2. 单选,选择要切换的目标源
  3. 打印是否执行成功了
*/

const registryMap = {
  npm: "https://registry.npmjs.org/",
  cnpm: "https://registry.npm.taobao.org/",
  yarn: "https://registry.yarnpkg.com/",
};
const registryList = ["npm", "cnpm", "yarn", "aa"];

const program = new Command();
program.name("xx").usage("<command> [options]");

program
  .command("log")
  .description("log all registry")
  .action((AppName, version) => {
    logRegistry();
  });

program
  .command("set")
  .description("set chooses registry")
  .action(() => {
    setRegistry();
  });

program.parse(process.argv);

async function setRegistry() {
  console.clear();
  const { targets, registry } = await inquirer.prompt([
    {
      // 选择列表--多选
      type: "checkbox",
      name: "targets",
      message: chalk.yellow("请选择要切换的列表"),
      choices: registryList,
      default: ["npm"],
      loop: true,
    },
    {
      // 选择列表--单选
      type: "list",
      name: "registry",
      message: chalk.yellow("请选择要切换到的镜像源"),
      choices: Object.keys(registryMap),
      default: 1,
      loop: true,
    },
  ]);

  console.clear();
  const res = await Promise.allSettled(
    targets.map((target) => {
      return execa(target, [
        "config",
        "set",
        "registry",
        registryMap[registry],
      ]).then(
        () => target,
        () => {
          throw target;
        }
      );
    })
  );

  res.forEach(({ status, value, reason }) => {
    console.log(
      status === "fulfilled"
        ? chalk.green(
            `${value.padEnd(4, " ")} set registry "${
              registryMap[registry]
            }" success`
          )
        : chalk.red(
            `${reason.padEnd(4, " ")} set registry "${
              registryMap[registry] ?? ""
            }" failed"`
          )
    );
  });
}

async function logRegistry() {
  console.clear();
  const res = await Promise.allSettled(
    registryList.map((target) => {
      return execa(target, ["config", "get", "registry"]).then((res) => [
        target,
        res.stdout,
      ]);
    })
  );

  res.forEach((item) => {
    if (item.status === "fulfilled") {
      console.log(
        chalk.green(`${item.value[0]} registry is "${item.value[1]}"`)
      );
    }
  });
}