Skip to content

Library usage

Every public capability hangs off a single facade class:

ts
import { MinecraftKit } from "@loontail/minecraft-kit";

const kit = new MinecraftKit();
SurfaceMethods
kit.versions.{minecraft,fabric,forge,runtime}list, resolve, and (minecraft-only) latest / get
kit.targetscreate, resolve, list
kit.installplan, run, runtime.{plan,run,standalonePlan}
kit.updateplan, run
kit.verify.{minecraft,fabric,forge,runtime}run
kit.repair.{minecraft,fabric,forge,runtime}plan, run
kit.launchcompose, run
kit.cacheget, set, delete, clear

Constructor options

ts
new MinecraftKit({
  httpClient,  // optional — defaults to FetchHttpClient (node fetch)
  cache,       // optional — defaults to createMemoryCache() (LRU, 5-min TTL)
  logger,      // optional — defaults to silentLogger
  system,      // optional — defaults to detectSystem()
  spawner,     // optional — defaults to ChildProcessSpawner
});

Every dependency is replaceable.

Symmetric versions API

ts
import { MinecraftChannels, VersionPreference } from "@loontail/minecraft-kit";

await kit.versions.minecraft.list({ channel: MinecraftChannels.RELEASE });
await kit.versions.minecraft.resolve({ version: "1.20.1" });

await kit.versions.fabric.list({ minecraftVersion: "1.20.1" });
await kit.versions.fabric.resolve({
  minecraftVersion: "1.20.1",
  preference: VersionPreference.LATEST,
});

await kit.versions.forge.list({ minecraftVersion: "1.20.1" });
await kit.versions.forge.resolve({
  minecraftVersion: "1.20.1",
  preference: VersionPreference.RECOMMENDED,
});

await kit.versions.runtime.list({ system: kit.targets.system });
await kit.versions.runtime.resolve({
  system: kit.targets.system,
  component: "java-runtime-gamma",
});

Standalone helpers

Every method on MinecraftKit has a standalone counterpart you can import directly if you do not want the facade:

ts
import {
  verifyMinecraft,
  planMinecraftRepair,
  runRepair,
  planRuntimeInstall,
  FetchHttpClient,
  createMemoryCache,
} from "@loontail/minecraft-kit";

The facade just composes these with the injected dependencies for you.

Serialising a target

kit.targets.resolve returns a fully self-contained Target. To remember it across processes, JSON-stringify the result; to use it later, pass kit.targets.resolve(...) the same id / directory / minecraft / loader inputs (the only thing that needs to be fetched again is upstream metadata). There is no other persisted state.

MIT License