UNPKG

prm-cli

Version:

Registry Manager for Package Management Tools

219 lines 8.29 kB
"use strict"; 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