@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
303 lines • 11.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkForLatestVersion = checkForLatestVersion;
const commander_1 = require("commander");
const runtime_1 = require("../core/game/launch/runtime");
const common_1 = require("../core/utils/common");
const compare_versions_1 = __importDefault(require("compare-versions"));
const chalk_1 = __importDefault(require("chalk"));
const inquirer_1 = __importDefault(require("inquirer"));
const node_fetch_1 = __importDefault(require("node-fetch"));
const java_1 = __importDefault(require("../java"));
const install_1 = require("../core/game/install/packs/install");
const handler_1 = require("../core/game/launch/handler");
const account_1 = require("../core/game/account");
const create_1 = require("../core/game/account/auth_types/create");
const program = new commander_1.Command();
const runtime = new runtime_1.Runtime();
program
.name('origami')
.description('✨ Lightweight Minecraft CLI Launcher')
.version(runtime.version);
program
.command('menu')
.description('Start the full interactive menu UI')
.action(() => {
runtime.start();
});
program
.command('modrinth')
.description('Install mods, shaders, and resource packs from Modrinth')
.action(async () => {
const profile = runtime.handler.profiles.getSelectedProfile();
if (!profile) {
console.log(chalk_1.default.red('❌ No profile selected.'));
process.exit(1);
}
const installer = new install_1.ModInstaller(handler_1.logger);
await installer.install_modrinth_content(profile);
process.exit(0);
});
program
.command('java')
.description('Download or select a Temurin JDK')
.option('-i, --install', 'Download and install a Temurin JDK')
.option('-s, --select', 'Choose and set the current JDK')
.option('-d, --delete', 'Delete installed Java')
.action(async (options) => {
if (options.install && options.select) {
console.error('❌ Please choose either --install or --select, not both.');
process.exit(1);
}
try {
if (options.install) {
await java_1.default.download();
}
else if (options.select) {
const java = await java_1.default.select(true);
console.log('✅ Java set to:', java.version, java.path);
}
else if (options.delete) {
await java_1.default.delete();
}
else {
program.commands.find(c => c.name() === 'java').help();
}
}
catch (err) {
console.error('😿', err.message);
process.exit(1);
}
});
program
.command('manage')
.description('Manage installed mods, shaders, and resource packs')
.action(async () => {
const profile = runtime.handler.profiles.getSelectedProfile();
if (!profile) {
console.log(chalk_1.default.red('❌ No profile selected.'));
process.exit(1);
}
await runtime['manageInstallationsMenu'](profile);
process.exit(0);
});
program
.command('launch')
.description('Launch Minecraft using current profile')
.action(async () => {
await runtime['launch']();
process.exit(0);
});
function valid_profile(input) {
const raw = (0, common_1.parse_input)(input);
if (!(0, common_1.valid_string)(raw)) {
throw new Error('❌ Invalid profile format: Must be a non-empty string.');
}
const list = runtime.handler.profiles.listProfiles();
if (!list.includes(raw)) {
throw new Error(`❌ Profile "${raw}" not found.\n\nTip: Run "origami profile --list" to see all profiles.`);
}
return raw;
}
;
program
.command('profile')
.description('Open Minecraft Profile Manager')
.option('-s, --select <profile>', 'Select a specific profile', valid_profile)
.option('-d, --delete', 'Opens the Profile Deletion Menu')
.option('-i, --install', 'Install a version')
.option('-l, --list', 'List all profiles')
.action(async (options) => {
const hasOptions = Object.keys(options).length > 0;
if (!hasOptions) {
await runtime['handler'].choose_profile();
}
if (options.install) {
await runtime.handler.install_version();
}
if (options.delete) {
await runtime.handler.delete_profile();
}
if (options.list) {
const profiles = runtime.handler.profiles.listProfiles();
if (!profiles.length) {
console.log('⚠️ No profiles found.');
}
else {
console.log('📂 Available profiles:\n');
for (const name of profiles) {
console.log(` - ${name}`);
}
}
process.exit(0);
}
if (options.select) {
const selected = options.select;
runtime.handler.profiles.selectProfile(selected);
console.log(`✅ Profile set to: ${selected}`);
process.exit(0);
}
process.exit(1);
});
program
.command('authprovider')
.description('User added Authentication Provider manager')
.option('-c, --create', 'Add a Custom Yggdrasil Server')
.option('-d, --delete', 'Delete a Custom Yggdrasil Server')
.action(async (options) => {
const hasOptions = Object.keys(options).length > 0;
if (!hasOptions) {
await runtime['authenticatorMenu']();
}
else {
if (options.create) {
await (0, create_1.createProvider)();
}
if (options.delete) {
await (0, create_1.deleteProvider)();
}
}
process.exit(0);
});
program
.command('auth')
.description('Open Minecraft Authenticator')
.option('-l, --login <provider>', 'Login to a provider (e.g. microsoft, littleskin)')
.option('-r, --remove <account>', 'Remove a specific account')
.option('-c, --choose', 'Choose an account')
.action(async (options) => {
const providers = await (0, account_1.getAuthProviders)();
const hasOptions = Object.keys(options).length > 0;
if (!hasOptions) {
await runtime['authenticatorMenu']();
}
else {
const handler = runtime['handler'];
if (options.login) {
const provider = options.login.trim().toLowerCase();
if (!Object.keys(providers).includes(provider)) {
console.log(chalk_1.default.red(`❌ Invalid auth provider: "${provider}"`));
console.log(`Available providers: ${Object.keys(providers).join(', ')}`);
process.exit(1);
}
let credentials = { email: '', password: '' };
if (provider !== 'microsoft') {
credentials = await inquirer_1.default.prompt([
{
type: 'input',
name: 'email',
message: 'Email or Username:',
},
{
type: 'password',
name: 'password',
message: 'Password:',
mask: '*'
},
]);
}
const result = await handler.login(credentials, provider);
if (result) {
console.log(chalk_1.default.green(`✅ Logged in as ${result.name}`));
}
else {
console.log(chalk_1.default.redBright('❌ Login failed.'));
}
}
if (options.remove) {
const id = options.remove.trim();
const account = await handler.accounts.getAccount(id);
if (!account) {
console.log(chalk_1.default.red(`❌ Account with ID "${id}" not found.`));
}
else {
const confirm = await inquirer_1.default.prompt([
{
type: 'confirm',
name: 'confirm',
message: chalk_1.default.red(`Are you sure you want to remove account "${account.name}" (${id})?`),
default: false
}
]);
if (confirm.confirm) {
const removed = await handler.accounts.deleteAccount(id);
if (removed) {
console.log(chalk_1.default.green(`🗑️ Removed account "${account.name}" successfully.`));
}
else {
console.log(chalk_1.default.red(`❌ Failed to remove account "${account.name}".`));
}
}
else {
console.log(chalk_1.default.gray('❎ Account removal cancelled.'));
}
}
}
if (options.choose) {
await handler.choose_account();
}
}
process.exit(0);
});
program
.command('clean')
.description('Reset Origami and/or Minecraft data directories')
.option('--minecraft', 'Reset the .minecraft directory')
.option('--origami', 'Reset Origami config/data (e.g. profiles, accounts)')
.option('--all', 'Reset everything (same as --minecraft + --origami)')
.action(async (options) => {
const doMinecraft = options.all || options.minecraft;
const doOrigami = options.all || options.origami;
if (!doMinecraft && !doOrigami) {
console.log(chalk_1.default.red('❌ Please specify what to reset: --minecraft, --origami, or --all'));
process.exit(1);
}
if (doMinecraft) {
await runtime.resetMinecraft();
}
if (doOrigami) {
await runtime.resetOrigami();
}
console.log(chalk_1.default.green('✅ Done!'));
process.exit(0);
});
async function checkForLatestVersion(currentVersion) {
const stableURL = 'https://registry.npmjs.org/@origami-minecraft/stable';
const devURL = 'https://registry.npmjs.org/@origami-minecraft/devbuilds';
try {
const [stableRes, devRes] = await Promise.all([
(0, node_fetch_1.default)(stableURL),
(0, node_fetch_1.default)(devURL)
]);
if (!stableRes.ok || !devRes.ok)
return;
const stableData = await stableRes.json();
const devData = await devRes.json();
const latestStable = stableData['dist-tags']?.latest ?? '';
const latestDev = devData['dist-tags']?.latest ?? devData['dist-tags']?.dev ?? '';
const isCurrentDev = currentVersion.includes('-dev');
const cmpStable = compare_versions_1.default.compareVersions(latestStable, currentVersion);
const cmpDev = compare_versions_1.default.compareVersions(latestDev, currentVersion);
if (!isCurrentDev && cmpStable > 0) {
console.log(chalk_1.default.yellow(`⚠️ A new stable version is available: ${latestStable}\nRun:`), chalk_1.default.cyan(`npm install -g @origami-minecraft/stable@${latestStable}`));
}
else if (isCurrentDev && cmpStable > 0) {
console.log(chalk_1.default.yellow(`⚠️ You're on a dev build (${currentVersion}), but a new stable version is available: ${latestStable}\nRun:`), chalk_1.default.cyan(`npm install -g @origami-minecraft/stable@${latestStable}`));
}
else if (isCurrentDev && cmpDev > 0) {
console.log(chalk_1.default.yellow(`⚠️ A new dev build is available: ${latestDev}\nRun:`), chalk_1.default.cyan(`npm install -g @origami-minecraft/devbuilds@${latestDev}`));
}
}
catch {
// Silent fail
}
}
checkForLatestVersion(runtime.version).then(() => program.parse(process.argv));
if (!process.argv.slice(2).length) {
program.outputHelp();
}
//# sourceMappingURL=origami.js.map