主题
镜像源切换
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]}"`)
);
}
});
}