import { curseforgeClient } from "@/services/clients"; import { uploadFile, getGameVersions } from "@/lib/curseforge"; import { resolveVersionName, buildJarPath } from "@/lib/utils/format"; import { readAsFile } from "@/lib/utils/file"; import type { UploadMetadata } from "@/types"; import type { PlatformContext } from "./types"; export async function publishCurseForgeVersion( ctx: PlatformContext, mcVersion: string, ): Promise { const { input, config } = ctx; const displayName = resolveVersionName( config.curseforge.version_name, { filename_format: config.filename_format }, { version: input.version, mc_version: mcVersion }, ); const primaryPath = buildJarPath( config.project_dir, config.filename_format, input.version, mcVersion, ); const primaryFile = await readAsFile(primaryPath); const gameVersions = await getGameVersions(curseforgeClient); const resolveId = (name: string): number => { const found = gameVersions.find((v) => v.name === name); if (!found) throw new Error(`Game version "${name}" not found in CurseForge`); return found.id; }; const metadata: UploadMetadata = { changelog: input.changelog, changelogType: "markdown", displayName, releaseType: input.versionType, gameVersions: [ resolveId(mcVersion), ...config.curseforge.loaders.map(resolveId), ...config.curseforge.environment.map(resolveId), ], relations: config.curseforge.relations, }; await uploadFile( curseforgeClient, config.curseforge.project_id, metadata, primaryFile, ); }