prm-cli
Version:
Registry Manager for Package Management Tools
219 lines • 8.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.onDelete = exports.onAdd = exports.onList = exports.onUse = exports.onTest = void 0;
const chalk = require('chalk');
const request = require('request');
const fs = require('fs');
const path = require('path');
const registryList = require('./registryList').default;
const spawn = require('cross-spawn');
function getConfigPath() {
const userHome = require('os').homedir();
return path.join(userHome, '.prm-config.json');
}
function loadUserConfig() {
const configPath = getConfigPath();
try {
if (fs.existsSync(configPath)) {
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
return config.customRegistries || [];
}
}
catch (error) {
console.warn(chalk.yellow('读取用户配置失败,将使用默认配置'));
}
return [];
}
function saveUserConfig(customRegistries) {
const configPath = getConfigPath();
const config = { customRegistries };
try {
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
}
catch (error) {
console.error(chalk.red('保存配置失败:'), error);
}
}
function getAllRegistries() {
const userRegistries = loadUserConfig();
return [...registryList, ...userRegistries];
}
function getRegistry(name) {
const allRegistries = getAllRegistries();
return allRegistries.find((item) => item.name === name);
}
function onTest(name) {
const registry = getRegistry(name);
const registries = registry ? [registry] : getAllRegistries();
registries.forEach((item) => {
const { registry, home, name } = item;
const start = Date.now();
request({
url: registry,
timeout: 5000,
}, (error, response, body) => {
const end = Date.now();
const success = !error && response.statusCode === 200;
const time = end - start;
const color = success ? 'green' : 'red';
const symbol = success ? '🟢' : '💩';
console.log(chalk[color](`${symbol} ${name.padEnd(12, ' ')} (${(time + 'ms').padEnd(6, ' ')}) - ${error || response.statusCode}`));
});
});
}
exports.onTest = onTest;
function onUse(name) {
const registry = getRegistry(name);
if (registry === undefined) {
return console.error(chalk.red(`${name} does not exist!`));
}
else {
const npm = spawn('npm', ['config', 'set', 'registry', registry.registry, '--no-workspaces']);
npm.stderr.on('data', (data) => {
console.error(chalk.red(data.toString()));
});
npm.on('close', (code) => {
if (code === 0) {
const npm = spawn('npm', ['config', 'get', 'registry', '--no-workspaces']);
npm.stdout.on('data', (data) => {
const current = data.toString().trim();
console.log(chalk.green(`\n🎉🎉🎉 Succeed!`), chalk.blue(`\n------ ${registry.name} (${current}) \n`));
});
}
else {
console.log(chalk.red('npm config set 命令执行失败'));
}
});
}
}
exports.onUse = onUse;
function onList() {
const npm = spawn('npm', ['config', 'get', 'registry', '--no-workspaces']);
npm.stdout.on('data', (data) => {
console.log('\n');
const current = data.toString().trim();
const allRegistries = getAllRegistries();
console.log(chalk.gray('📦 默认镜像源列表:'));
registryList.forEach((item) => {
const str = `${(item.name + ' ').padEnd(14, ' ')} ${item.home.padEnd(32, ' ')} ${item.registry}`;
console.log(item.registry === current ? chalk.blue(`🚀 ${str}`) : ` ${str}`);
});
const userRegistries = loadUserConfig();
if (userRegistries.length > 0) {
console.log(chalk.gray('\n🔧 自定义镜像源列表:'));
userRegistries.forEach((item) => {
const str = `${(item.name + ' ').padEnd(14, ' ')} ${item.home.padEnd(32, ' ')} ${item.registry}`;
console.log(item.registry === current ? chalk.blue(`🚀 ${str}`) : ` ${str}`);
});
}
if (!allRegistries.some((item) => item.registry === current)) {
console.log(chalk.gray('\n💡 当前源:'));
const str = `${('custom' + ' ').padEnd(14, ' ')} ${current}`;
console.log(chalk.blue(`🚀 ${str} (in your .npmrc)`));
}
console.log('\n');
});
}
exports.onList = onList;
function onAdd(name, registry, home) {
const readline = require('readline');
if (name && registry) {
addRegistry(name, registry, home || '');
return;
}
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log(chalk.blue('\n📝 添加自定义镜像源\n'));
rl.question(chalk.green('请输入源名称: '), (inputName) => {
if (!inputName.trim()) {
console.log(chalk.red('❌ 源名称不能为空'));
rl.close();
return;
}
const existingRegistry = getRegistry(inputName.trim());
if (existingRegistry) {
console.log(chalk.red(`❌ 源名称 "${inputName.trim()}" 已存在`));
rl.close();
return;
}
rl.question(chalk.green('请输入镜像源地址: '), (inputRegistry) => {
if (!inputRegistry.trim()) {
console.log(chalk.red('❌ 镜像源地址不能为空'));
rl.close();
return;
}
try {
new URL(inputRegistry.trim());
}
catch (error) {
console.log(chalk.red('❌ 镜像源地址格式不正确'));
rl.close();
return;
}
rl.question(chalk.green('请输入主页地址 (可选): '), (inputHome) => {
addRegistry(inputName.trim(), inputRegistry.trim(), inputHome.trim() || inputRegistry.trim());
rl.close();
});
});
});
}
exports.onAdd = onAdd;
function addRegistry(name, registry, home) {
const userRegistries = loadUserConfig();
const existingRegistry = getRegistry(name);
if (existingRegistry) {
console.log(chalk.red(`❌ 源名称 "${name}" 已存在`));
return;
}
const allRegistries = getAllRegistries();
if (allRegistries.some(item => item.registry === registry)) {
console.log(chalk.red(`❌ 镜像源地址 "${registry}" 已存在`));
return;
}
const newRegistry = {
name,
registry: registry.endsWith('/') ? registry : registry + '/',
home: home || registry
};
userRegistries.push(newRegistry);
saveUserConfig(userRegistries);
console.log(chalk.green('\n✅ 镜像源添加成功!'));
console.log(chalk.blue(` 名称: ${name}`));
console.log(chalk.blue(` 地址: ${newRegistry.registry}`));
console.log(chalk.blue(` 主页: ${newRegistry.home}`));
console.log(chalk.gray(`\n💡 使用 'prm use ${name}' 切换到新添加的源\n`));
}
function onDelete(name) {
if (!name) {
console.log(chalk.red('❌ 请指定要删除的源名称'));
return;
}
const userRegistries = loadUserConfig();
const index = userRegistries.findIndex(item => item.name === name);
if (index === -1) {
const isDefaultRegistry = registryList.some((item) => item.name === name);
if (isDefaultRegistry) {
console.log(chalk.red(`❌ 不能删除默认源 "${name}"`));
}
else {
console.log(chalk.red(`❌ 源 "${name}" 不存在`));
}
return;
}
const deletedRegistry = userRegistries[index];
userRegistries.splice(index, 1);
saveUserConfig(userRegistries);
console.log(chalk.green(`✅ 成功删除源 "${deletedRegistry.name}"`));
console.log(chalk.gray(` 地址: ${deletedRegistry.registry}\n`));
}
exports.onDelete = onDelete;
exports.default = {
onUse,
onList,
onAdd,
onTest,
onDelete,
};
//# sourceMappingURL=main.js.map