UNPKG

@origami-minecraft/devbuilds

Version:

Origami is a terminal-first Minecraft launcher that supports authentication, installation, and launching of Minecraft versions โ€” with built-in support for Microsoft accounts, mod loaders, profile management, and more. Designed for power users, modders, an

113 lines (92 loc) โ€ข 4.14 kB
import axios from 'axios'; import inquirer from 'inquirer'; import ora from 'ora'; import path from 'path'; import { askForVersion, fetchMinecraftVersionManifest } from '../../../utils/minecraft_versions'; import { downloader } from '../../../utils/download'; import { ensureDir, cleanDir, localpath, minecraft_dir, waitForFolder } from '../../../utils/common'; import { run as executeJar } from '../../../tools/executor'; import { ClientJar } from '../../../../types/client'; import LauncherProfileManager from '../../../tools/launcher'; import { logger } from '../../launch/handler'; const metadata = { name: 'Quilt', description: 'A modular, community-driven mod loader for Minecraft.', author: 'QuiltMC' }; const INSTALLER_BASE = 'https://maven.quiltmc.org/repository/release'; const INSTALLER_DIR = path.join(localpath(true), 'quilt-client'); async function getLatestInstallerVersion(): Promise<string> { const res = await axios.get(`${INSTALLER_BASE}/org/quiltmc/quilt-installer/maven-metadata.xml`); const match = res.data.match(/<latest>(.+?)<\/latest>/); if (!match) throw new Error('Failed to parse latest Quilt installer version'); return match[1]; } async function getAllLoaderVersions(): Promise<string[]> { const url = `${INSTALLER_BASE}/org/quiltmc/quilt-loader/maven-metadata.xml`; const res = await axios.get(url); const versionsMatch = res.data.match(/<versions>([\s\S]*?)<\/versions>/); if (!versionsMatch) throw new Error('Failed to locate versions element'); const versionTags = versionsMatch[1].match(/<version>(.+?)<\/version>/g) || []; return versionTags.map((v: any) => v.replace(/<\/?version>/g, '').trim()); } function getInstallerJarUrl(version: string): string { return `${INSTALLER_BASE}/org/quiltmc/quilt-installer/${version}/quilt-installer-${version}.jar`; } export async function installQuiltViaExecutor(): Promise<ClientJar | null> { const spinner = ora('๐Ÿงต Preparing Quilt installation...').start(); try { const manifest = await fetchMinecraftVersionManifest(); const latestMC = manifest.latest.release; spinner.stop(); const minecraftVersion = await askForVersion(manifest.versions, latestMC); const installerVersion = await getLatestInstallerVersion(); const loaderVersions = await getAllLoaderVersions(); const { loaderVersion } = await inquirer.prompt([ { type: 'list', name: 'loaderVersion', message: '๐Ÿงท Select Quilt Loader version:', choices: loaderVersions.reverse(), } ]); const jarUrl = getInstallerJarUrl(installerVersion); const jarName = `quilt-installer-${installerVersion}.jar`; const jarPath = path.join(INSTALLER_DIR, jarName); cleanDir(INSTALLER_DIR); ensureDir(INSTALLER_DIR); spinner.text = '๐Ÿ“ฆ Downloading Quilt installer...'; spinner.stop(); await downloader(jarUrl, jarPath); waitForFolder(metadata, minecraftVersion).then(versionFolder => { const profileManager = new LauncherProfileManager(); const versionId = path.basename(versionFolder); profileManager.addProfile(versionId, minecraftVersion, versionId, metadata, versionId, metadata.name); }) spinner.text = '๐Ÿš€ Executing Quilt installer...'; spinner.stop(); await executeJar(jarPath, [ 'install', 'client', minecraftVersion, loaderVersion, `--install-dir=${minecraft_dir()}` ]); spinner.succeed('๐ŸŽ‰ Quilt installed successfully!'); return { name: metadata.name, version: minecraftVersion, url: jarUrl, client: { dir: INSTALLER_DIR, jar: jarName } }; } catch (err: any) { spinner.fail('โŒ Failed to install Quilt.'); logger.error(err.message || err); return null; } } // Run if invoked directly if (require.main === module) { installQuiltViaExecutor(); } export default { metadata, get: installQuiltViaExecutor, };