cvm-cli
Version:
A unified CLI tool for managing PHP, Node.js, and Python versions with virtual environment and dependency management support.
64 lines (54 loc) • 2.01 kB
JavaScript
const BaseVersionManager = require('./baseVersionManager');
const fetch = require('node-fetch');
const fs = require('fs-extra');
const chalk = require('chalk');
class NodeVersionManager extends BaseVersionManager {
constructor() {
super('node');
}
async getAvailableVersions() {
try {
const response = await fetch('https://nodejs.org/dist/index.json');
if (!response.ok) {
throw new Error('Failed to fetch Node.js version list');
}
const versions = await response.json();
return versions.map(v => v.version.replace('v', ''));
} catch (error) {
console.error('Error fetching available versions:', error.message);
return [];
}
}
async install(version) {
if (await this.isVersionInstalled(version)) {
console.log(`Node.js ${version} is already installed.`);
return;
}
const platform = this.getPlatform();
const arch = this.getArch();
const versionStr = `v${version}`;
const tarballName =
platform === 'win32'
? `node-${versionStr}-win-${arch}.zip`
: `node-${versionStr}-${platform}-${arch}.tar.xz`;
const url = `https://nodejs.org/dist/${versionStr}/${tarballName}`;
console.log(`Downloading Node.js ${version}...`);
const downloadDir = `${this.languageDir}/downloads`; // Temp download directory
const downloadPath = `${downloadDir}/${tarballName}`;
try {
await this.downloadFile(url, downloadPath);
const versionDir = `${this.languageDir}/${version}`;
if (platform === 'win32') {
throw new Error('Windows support not implemented yet');
} else {
await this.extractTarXz(downloadPath, versionDir);
}
console.log(`Node.js ${version} installed successfully.`);
} catch (error) {
console.error(`Failed to install Node.js ${version}:`, error.message);
} finally {
await fs.remove(downloadDir); // Clean up downloaded files
}
}
}
module.exports = NodeVersionManager;