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
JavaScript
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
};