@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
102 lines (82 loc) • 3.49 kB
text/typescript
import axios from 'axios';
import inquirer from 'inquirer';
import ora from 'ora';
import path from 'path';
import fs from 'fs';
import { askForVersion, fetchMinecraftVersionManifest } from '../../utils/minecraft_versions';
import { downloader } from '../../utils/download';
import { cleanDir, ensureDir, minecraft_dir } from '../../utils/common';
import { ClientJar } from '../../../types/client';
import LauncherProfileManager from '../../tools/launcher';
import { logger } from '../launch/handler';
const metadata = {
name: 'Vanilla',
description: 'Pure, unmodded Minecraft client.',
author: 'Mojang'
};
export async function installVanillaViaExecutor(): Promise<ClientJar | null> {
const spinner = ora('🌱 Preparing Vanilla installation...').start();
try {
const manifest = await fetchMinecraftVersionManifest();
const latestMC = manifest.latest.release;
spinner.stop();
const minecraftVersion = await askForVersion(manifest.versions, latestMC);
const versionMeta = manifest.versions.find(v => v.id === minecraftVersion);
if (!versionMeta) throw new Error('Version metadata not found.');
spinner.start('🔍 Fetching version metadata...');
const res = await axios.get(versionMeta.url);
const versionData = res.data;
let versionFolder = path.join(minecraft_dir(), 'versions', minecraftVersion);
versionFolder = ensureVersionDir(versionFolder);
const jarUrl = versionData.downloads.client.url;
const jarPath = path.join(versionFolder, `${minecraftVersion}.jar`);
const jsonPath = path.join(versionFolder, `${minecraftVersion}.json`);
spinner.text = '📥 Downloading client JAR...';
spinner.stop();
await downloader(jarUrl, jarPath);
spinner.text = '📥 Downloading version JSON...';
const versionJson = JSON.stringify(versionData, null, 2);
fs.writeFileSync(jsonPath, versionJson);
spinner.text = '🧩 Creating launcher profile...';
const profileManager = new LauncherProfileManager();
const name = path.basename(versionFolder);
profileManager.addProfile(name, minecraftVersion, name, metadata, name, 'Grass');
spinner.succeed(`🎉 Vanilla ${minecraftVersion} installed successfully!`);
return {
name: metadata.name,
version: minecraftVersion,
url: jarUrl,
client: {
dir: versionFolder,
jar: `${minecraftVersion}.jar`
}
};
} catch (err: any) {
spinner.fail('❌ Failed to install Vanilla.');
logger.error(err.message || err);
return null;
}
}
// Run if invoked directly
if (require.main === module) {
installVanillaViaExecutor();
}
export default {
metadata,
get: installVanillaViaExecutor,
};
function ensureVersionDir(dir: string, i: number = 1): string {
if (fs.existsSync(dir)) {
const contents = fs.readdirSync(dir);
if (contents.length === 0 || !contents.find(v => v.endsWith('.json')) || contents.find(v => v.endsWith('.jar'))) {
cleanDir(dir);
return ensureVersionDir(dir, i);
}
const baseName = path.basename(dir);
const parentDir = path.dirname(dir);
const newDir = path.join(parentDir, `${baseName} (${i})`);
return ensureVersionDir(newDir, i + 1);
}
ensureDir(dir);
return dir;
};