UNPKG

nmdk

Version:

CLI tool for downloading and setting up Minecraft mod development kits (MDK) for Forge, Fabric, and NeoForge

103 lines (84 loc) 3.07 kB
const axios = require('axios'); const fs = require('fs-extra'); const path = require('path'); const ora = require('ora'); const chalk = require('chalk'); async function downloadFileFromUrl(url, filePath) { const spinner = ora(`Downloading file from ${url}`).start(); try { const response = await axios({ method: 'GET', url: url, responseType: 'stream' }); const writer = fs.createWriteStream(filePath); response.data.pipe(writer); return new Promise((resolve, reject) => { writer.on('finish', () => { spinner.succeed(chalk.green('Download completed')); resolve(); }); writer.on('error', (error) => { spinner.fail('Download failed'); reject(error); }); }); } catch (error) { spinner.fail('Download failed'); throw new Error(`Failed to download file: ${error.message}`); } } async function retrieveLatestLoaderVersion(loader, mcVersion) { const spinner = ora(chalk.blue.bold(`Retrieving latest ${loader} version for MC ${mcVersion}`)).start(); try { let version; switch (loader) { case 'forge': version = await fetchLatestForgeVersion(mcVersion); break; case 'fabric': version = await fetchLatestFabricVersion(mcVersion); break; case 'neoforge': version = await fetchLatestNeoForgeVersion(mcVersion); break; default: throw new Error(`Unsupported loader: ${loader}`); } spinner.succeed(chalk.green(`Latest ${loader} version: ${chalk.cyan(version)}`)); return version; } catch (error) { spinner.fail(`Failed to get latest version: ${error.message}`); throw error; } } async function fetchLatestForgeVersion(mcVersion) { const response = await axios.get('https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json'); const promotions = response.data; if (promotions.promos && promotions.promos[`${mcVersion}-latest`]) { return promotions.promos[`${mcVersion}-latest`]; } throw new Error(`No Forge version found for MC ${mcVersion}`); } async function fetchLatestFabricVersion(mcVersion) { const response = await axios.get('https://meta.fabricmc.net/v2/versions/loader'); const loaders = response.data; const latestLoader = loaders.find(loader => loader.stable); if (!latestLoader) { throw new Error(`No stable Fabric loader found for MC ${mcVersion}`); } return latestLoader.version; } async function fetchLatestNeoForgeVersion(mcVersion) { const response = await axios.get('https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml'); const xml = response.data; const versionMatch = xml.match(/<latest>([^<]+)<\/latest>/); if (!versionMatch) { throw new Error(`No NeoForge version found for MC ${mcVersion}`); } return versionMatch[1]; } module.exports = { downloadFileFromUrl, retrieveLatestLoaderVersion };