Skip to content

Instantly share code, notes, and snippets.

@MasterGordon
Created November 1, 2021 22:41
Show Gist options
  • Save MasterGordon/285e0e2e8d6b6ad190be86924830aabf to your computer and use it in GitHub Desktop.
Save MasterGordon/285e0e2e8d6b6ad190be86924830aabf to your computer and use it in GitHub Desktop.
Minecraft Version Listings for building a custom launcher (Vanilla, forge and fabric)
const constants = {
minecraftVersionManifest:
"https://launchermeta.mojang.com/mc/game/version_manifest_v2.json",
forgeVersionMeta:
"https://maven.minecraftforge.net/net/minecraftforge/forge/maven-metadata.xml",
fabricLoaderVersions: "https://meta.fabricmc.net/v2/versions/loader",
fabricSupportedVersions: "https://meta.fabricmc.net/v2/versions/game",
};
export default constants;
import axios from "axios";
import constants from "../constants";
import convert from "xml-js";
interface ForgeVersionResponse {
metadata: {
versioning: {
latest: {
_text: string;
};
release: {
_text: string;
};
versions: {
version: {
_text: `${string}-${string}`;
}[];
};
};
};
}
export interface ForgeVersions {
release: {
minecraftVersion: string;
version: string;
};
versions: {
[minecraftVersion: string]: string[];
};
}
export const getForgeVersions = async () => {
const forgeVersionsData = (await axios.get(constants.forgeVersionMeta)).data;
const forgeVersionsObject = convert.xml2js(forgeVersionsData, {
compact: true,
}) as ForgeVersionResponse;
const forgeVersions: ForgeVersions = {
release: {
minecraftVersion:
forgeVersionsObject.metadata.versioning.release._text.split("-")[0],
version:
forgeVersionsObject.metadata.versioning.release._text.split("-")[1],
},
versions: {},
};
forgeVersionsObject.metadata.versioning.versions.version.forEach(
(version) => {
const minecraftVersion = version._text.split("-")[0];
const forgeVersion = version._text.split("-")[1];
forgeVersions.versions[minecraftVersion] ||= [];
forgeVersions.versions[minecraftVersion].push(forgeVersion);
}
);
return forgeVersions;
};
export interface MinecraftVersion {
id: string;
releaseTime: string;
type: "release" | "snapshot" | "old_beta" | "old_alpha";
}
interface MinecraftVersions {
latest: {
release: string;
snapshot: string;
};
versions: MinecraftVersion[];
}
export const getMinecraftVersions = async () => {
const minecraftVersionsData = (
await axios.get(constants.minecraftVersionManifest)
).data;
const minecraftVersions: MinecraftVersions = {
...minecraftVersionsData,
};
return minecraftVersions;
};
type FabricLoaderVersionsResponse = Array<{
version: string;
stable: boolean;
}>;
type FabricSupportedVersionsResponse = Array<{
version: string;
}>;
export const getFabricLoaderVersions = async () => {
const fabricLoaderVersionsResponse: FabricLoaderVersionsResponse = (
await axios.get(constants.fabricLoaderVersions)
).data;
return {
latest: fabricLoaderVersionsResponse.find((version) => version.stable)
?.version as string,
versions: fabricLoaderVersionsResponse.map((version) => version.version),
};
};
export const getFabricSupportedVersions = async () => {
const fabricSupportedVersionsResponse: FabricSupportedVersionsResponse = (
await axios.get(constants.fabricSupportedVersions)
).data;
return fabricSupportedVersionsResponse.map((version) => version.version);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment