{
  "version": 3,
  "sources": ["../fabric.ts", "../utils.ts", "../liteloader.ts", "../forge.ts", "../downloadTask.ts", "../minecraft.ts", "../zipValdiator.ts", "../profile.ts", "../neoForged.ts", "../optifine.ts", "../java.ts", "../java-runtime.ts", "../diagnose.ts", "../quilt.ts", "../unzip.ts", "../labymod.ts"],
  "sourcesContent": ["import { MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { writeFile } from 'fs/promises'\nimport { Dispatcher, request } from 'undici'\nimport { ensureFile, InstallOptions } from './utils'\n\nexport const YARN_MAVEN_URL = 'https://maven.fabricmc.net/net/fabricmc/yarn/maven-metadata.xml'\nexport const LOADER_MAVEN_URL = 'https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml'\n\nexport interface FabricArtifactVersion {\n  gameVersion?: string // \"20w10a\",\n  separator?: string\n  build?: number\n  maven: string // \"net.fabricmc:yarn:20w10a+build.7\",\n  version: string // \"20w10a+build.7\",\n  stable: boolean\n}\n\nexport interface FabricArtifacts {\n  mappings: FabricArtifactVersion[]\n  loader: FabricArtifactVersion[]\n}\n\nexport interface FabricLoaderArtifact {\n  loader: FabricArtifactVersion\n  intermediary: FabricArtifactVersion\n  launcherMeta: {\n    version: number\n    libraries: {\n      client: { name: string; url: string }[]\n      common: { name: string; url: string }[]\n      server: { name: string; url: string }[]\n    }\n    mainClass: {\n      client: string\n      server: string\n    }\n  }\n}\n\nexport interface FabricOptions {\n  dispatcher?: Dispatcher\n}\n\n/**\n * Get all the artifacts provided by fabric\n * @param remote The fabric API host\n * @beta\n */\nexport async function getFabricArtifacts(options?: FabricOptions): Promise<FabricArtifacts> {\n  const response = await request('https://meta.fabricmc.net/v2/versions', { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n/**\n * Get fabric-yarn artifact list\n * @param remote The fabric API host\n * @beta\n */\nexport async function getYarnArtifactList(options?: FabricOptions): Promise<FabricArtifactVersion[]> {\n  const response = await request('https://meta.fabricmc.net/v2/versions/yarn', { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n/**\n * Get fabric-yarn artifact list by Minecraft version\n * @param minecraft The Minecraft version\n * @param remote The fabric API host\n * @beta\n */\nexport async function getYarnArtifactListFor(minecraft: string, options?: FabricOptions): Promise<FabricArtifactVersion[]> {\n  const response = await request('https://meta.fabricmc.net/v2/versions/yarn/' + minecraft, { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n/**\n * Get fabric-loader artifact list\n * @param remote The fabric API host\n * @beta\n */\nexport async function getLoaderArtifactList(options?: FabricOptions): Promise<FabricArtifactVersion[]> {\n  const response = await request('https://meta.fabricmc.net/v2/versions/loader', { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n/**\n * Get fabric-loader artifact list by Minecraft version\n * @param minecraft The minecraft version\n * @param remote The fabric API host\n * @beta\n */\nexport async function getLoaderArtifactListFor(minecraft: string, options?: FabricOptions): Promise<FabricLoaderArtifact[]> {\n  const response = await request('https://meta.fabricmc.net/v2/versions/loader/' + minecraft, { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n/**\n * Get fabric-loader artifact list by Minecraft version\n * @param minecraft The minecraft version\n * @param loader The yarn-loader version\n * @param remote The fabric API host\n * @beta\n */\nexport async function getFabricLoaderArtifact(minecraft: string, loader: string, options?: FabricOptions): Promise<FabricLoaderArtifact> {\n  const response = await request('https://meta.fabricmc.net/v2/versions/loader/' + minecraft + '/' + loader, { throwOnError: true, dispatcher: options?.dispatcher })\n  const body = response.body.json() as any\n  return body\n}\n\n/**\n * Install the fabric to the client. Notice that this will only install the json.\n * You need to call `Installer.installDependencies` to get a full client.\n * @param yarnVersion The yarn version\n * @param loaderVersion The fabric loader version\n * @param minecraft The minecraft location\n * @returns The installed version id\n */\n// export async function installFabricYarnAndLoader(yarnVersion: string, loaderVersion: string, minecraft: MinecraftLocation, options: InstallOptions = {}) {\n//     const folder = MinecraftFolder.from(minecraft);\n//     const mcversion = yarnVersion.split(\"+\")[0];\n//     const id = options.versionId || `${mcversion}-fabric${yarnVersion}-${loaderVersion}`;\n\n//     const jsonFile = folder.getVersionJson(id);\n\n//     const body: Version = constr esponse = await request(`https://fabricmc.net/download/technic/?yarn=${encodeURIComponent(yarnVersion)}&loader=${encodeURIComponent(loaderVersion)}`, { throwOnError: true, dispatcher: options?.dispatcher });\n//     const body = response.body.json() as any;\n//     return body;\n//     body.id = id;\n//     if (typeof options.inheritsFrom === \"string\") {\n//         body.inheritsFrom = options.inheritsFrom;\n//     }\n//     await ensureFile(jsonFile);\n//     await writeFile(jsonFile, JSON.stringify(body));\n\n//     return id;\n// }\n\nexport interface FabricInstallOptions extends InstallOptions {\n  side?: 'client' | 'server'\n  yarnVersion?: string | FabricArtifactVersion\n}\n\n/**\n * Generate fabric version json to the disk according to yarn and loader\n * @param side Client or server\n * @param yarnVersion The yarn version string or artifact\n * @param loader The loader artifact\n * @param minecraft The Minecraft Location\n * @param options The options\n * @beta\n */\nexport async function installFabric(loader: FabricLoaderArtifact, minecraft: MinecraftLocation, options: FabricInstallOptions = {}) {\n  const folder = MinecraftFolder.from(minecraft)\n\n  let yarn: string | undefined\n  const side = options.side ?? 'client'\n  let id = options.versionId\n  let mcversion: string\n  if (options.yarnVersion) {\n    const yarnVersion = options.yarnVersion\n    if (typeof yarnVersion === 'string') {\n      yarn = yarnVersion\n      mcversion = yarn.split('+')[0]\n    } else {\n      yarn = yarnVersion.version\n      mcversion = yarnVersion.gameVersion || yarn.split('+')[0]\n    }\n  } else {\n    mcversion = loader.intermediary.version\n  }\n\n  if (!id) {\n    id = mcversion\n    if (yarn) {\n      id += `-fabric${yarn}-loader${loader.loader.version}`\n    } else {\n      id += `-fabric${loader.loader.version}`\n    }\n  }\n  const libraries = [\n    { name: loader.loader.maven, url: 'https://maven.fabricmc.net/' },\n    { name: loader.intermediary.maven, url: 'https://maven.fabricmc.net/' },\n    ...(options.yarnVersion\n      ? [{ name: `net.fabricmc:yarn:${yarn}`, url: 'https://maven.fabricmc.net/' }]\n      : []),\n    ...loader.launcherMeta.libraries.common,\n    ...loader.launcherMeta.libraries[side],\n  ]\n  const mainClass = loader.launcherMeta.mainClass[side]\n  const inheritsFrom = options.inheritsFrom || mcversion\n\n  const jsonFile = folder.getVersionJson(id)\n\n  await ensureFile(jsonFile)\n  await writeFile(jsonFile, JSON.stringify({\n    id,\n    inheritsFrom,\n    mainClass,\n    libraries,\n    arguments: {\n      game: [],\n      jvm: [],\n    },\n    releaseTime: new Date().toJSON(),\n    time: new Date().toJSON(),\n  }))\n\n  return id\n}\n", "import { ChildProcess, ExecOptions, spawn, SpawnOptions } from 'child_process'\nimport { access, mkdir, stat } from 'fs/promises'\nimport { dirname } from 'path'\n\nexport { checksum } from '@xmcl/core'\n\nexport function missing(target: string) {\n  return access(target).then(() => false, () => true)\n}\n\nexport async function ensureDir(target: string) {\n  try {\n    await mkdir(target)\n  } catch (err) {\n    const e: any = err\n    if (await stat(target).then((s) => s.isDirectory()).catch(() => false)) { return }\n    if (e.code === 'EEXIST') { return }\n    if (e.code === 'ENOENT') {\n      if (dirname(target) === target) {\n        throw e\n      }\n      try {\n        await ensureDir(dirname(target))\n        await mkdir(target)\n      } catch {\n        if (await stat(target).then((s) => s.isDirectory()).catch((e) => false)) { return }\n        throw e\n      }\n      return\n    }\n    throw e\n  }\n}\n\nexport interface SpawnJavaOptions {\n  /**\n     * The java exectable path. It will use `java` by default.\n     *\n     * @defaults \"java\"\n     */\n  java?: string\n\n  /**\n     * The spawn process function. Used for spawn the java process at the end.\n     *\n     * By default, it will be the spawn function from \"child_process\" module. You can use this option to change the 3rd party spawn like [cross-spawn](https://www.npmjs.com/package/cross-spawn)\n     */\n  spawn?: (command: string, args?: ReadonlyArray<string>, options?: SpawnOptions) => ChildProcess\n}\n\nexport function ensureFile(target: string) {\n  return ensureDir(dirname(target))\n}\nexport function normalizeArray<T>(arr: T | T[] = []): T[] {\n  return arr instanceof Array ? arr : [arr]\n}\nexport function spawnProcess(spawnJavaOptions: SpawnJavaOptions, args: string[], options?: ExecOptions) {\n  const process = (spawnJavaOptions?.spawn ?? spawn)(spawnJavaOptions.java ?? 'java', args, options)\n  return waitProcess(process)\n}\n\nexport function waitProcess(process: ChildProcess) {\n  return new Promise<void>((resolve, reject) => {\n    const errorMsg: string[] = []\n    process.on('error', (err) => {\n      reject(err)\n    })\n    process.on('close', (code) => {\n      if (code !== 0) { reject(errorMsg.join('')) } else { resolve() }\n    })\n    process.on('exit', (code) => {\n      if (code !== 0) { reject(errorMsg.join('')) } else { resolve() }\n    })\n    process.stdout?.setEncoding('utf-8')\n    process.stdout?.on('data', (buf) => { })\n    process.stderr?.setEncoding('utf-8')\n    process.stderr?.on('data', (buf) => { errorMsg.push(buf.toString()) })\n  })\n}\n\n/**\n * Join two urls\n */\nexport function joinUrl(a: string, b: string) {\n  if (a.endsWith('/') && b.startsWith('/')) {\n    return a + b.substring(1)\n  }\n  if (!a.endsWith('/') && !b.startsWith('/')) {\n    return a + '/' + b\n  }\n  return a + b\n}\n\nexport interface ParallelTaskOptions {\n  throwErrorImmediately?: boolean\n}\n/**\n * Shared install options\n */\nexport interface InstallOptions {\n  /**\n     * When you want to install a version over another one.\n     *\n     * Like, you want to install liteloader over a forge version.\n     * You should fill this with that forge version id.\n     */\n  inheritsFrom?: string\n\n  /**\n     * Override the newly installed version id.\n     *\n     * If this is absent, the installed version id will be either generated or provided by installer.\n     */\n  versionId?: string\n}\n\nexport function errorToString(e: any) {\n  if (e instanceof Error) {\n    return e.stack ? e.stack : e.message\n  }\n  return e.toString()\n}\n", "import { MinecraftFolder, MinecraftLocation } from '@xmcl/core'\nimport { Task, task } from '@xmcl/task'\nimport { readFile, writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { ensureDir, InstallOptions, missing } from './utils'\n\nexport const DEFAULT_VERSION_MANIFEST = 'http://dl.liteloader.com/versions/versions.json'\n/**\n * The liteloader version list. Containing the minecraft version -> liteloader version info mapping.\n */\nexport interface LiteloaderVersionList {\n  meta: {\n    description: string\n    authors: string\n    url: string\n    updated: string\n    updatedTime: number\n  }\n  versions: { [version: string]: { snapshot?: LiteloaderVersion; release?: LiteloaderVersion } }\n}\nfunction processLibraries(lib: { name: string; url?: string }) {\n  if (Object.keys(lib).length === 1 && lib.name) {\n    if (lib.name.startsWith('org.ow2.asm')) {\n      lib.url = 'https://files.minecraftforge.net/maven/'\n    }\n  }\n  return lib\n}\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace LiteloaderVersionList {\n  export function parse(content: string) {\n    const result = JSON.parse(content)\n    const metalist = { meta: result.meta, versions: {} }\n    for (const mcversion in result.versions) {\n      const versions: { release?: LiteloaderVersion; snapshot?: LiteloaderVersion } =\n                (metalist.versions as any)[mcversion] = {}\n      const snapshots = result.versions[mcversion].snapshots\n      const artifacts = result.versions[mcversion].artefacts // that's right, artefact\n      const url = result.versions[mcversion].repo.url\n      if (snapshots) {\n        const { stream, file, version, md5, timestamp, tweakClass, libraries } = snapshots['com.mumfrey:liteloader'].latest\n        const type = (stream === 'RELEASE' ? 'RELEASE' : 'SNAPSHOT')\n        versions.snapshot = {\n          url,\n          type,\n          file,\n          version,\n          md5,\n          timestamp,\n          mcversion,\n          tweakClass,\n          libraries: libraries.map(processLibraries),\n        }\n      }\n      if (artifacts) {\n        const { stream, file, version, md5, timestamp, tweakClass, libraries } = artifacts['com.mumfrey:liteloader'].latest\n        const type = (stream === 'RELEASE' ? 'RELEASE' : 'SNAPSHOT')\n        versions.release = {\n          url,\n          type,\n          file,\n          version,\n          md5,\n          timestamp,\n          mcversion,\n          tweakClass,\n          libraries: libraries.map(processLibraries),\n        }\n      }\n    }\n    return metalist\n  }\n}\n\n/**\n * A liteloader remote version information\n */\nexport interface LiteloaderVersion {\n  version: string\n  url: string\n  file: string\n  mcversion: string\n  type: 'RELEASE' | 'SNAPSHOT'\n  md5: string\n  timestamp: string\n  libraries: Array<{ name: string; url?: string }>\n  tweakClass: string\n}\n\nconst snapshotRoot = 'http://dl.liteloader.com/versions/'\nconst releaseRoot = 'http://repo.mumfrey.com/content/repositories/liteloader/'\n\n/**\n * This error is only thrown from liteloader install currently.\n */\nexport class MissingVersionJsonError extends Error {\n  constructor(public version: string,\n    /**\n         * The path of version json\n         */\n    public path: string) {\n    super()\n    this.name = 'MissingVersionJson'\n  }\n}\n/**\n * Get or update the LiteLoader version list.\n *\n * This will request liteloader offical json by default. You can replace the request by assigning the remote option.\n */\nexport async function getLiteloaderVersionList(options: {\n  /**\n     * The request dispatcher\n     */\n  dispatcher?: Dispatcher\n} = {}): Promise<LiteloaderVersionList> {\n  const response = await request(DEFAULT_VERSION_MANIFEST, { dispatcher: options.dispatcher, throwOnError: true })\n  const body = await response.body.text()\n  return LiteloaderVersionList.parse(body)\n}\n\n/**\n * Install the liteloader to specific minecraft location.\n *\n * This will install the liteloader amount on the corresponded Minecraft version by default.\n * If you want to install over the forge. You should first install forge and pass the installed forge version id to the third param,\n * like `1.12-forge-xxxx`\n *\n * @param versionMeta The liteloader version metadata.\n * @param location The minecraft location you want to install\n * @param version The real existed version id (under the the provided minecraft location) you want to installed liteloader inherit\n * @throws {@link MissingVersionJsonError}\n */\nexport function installLiteloader(versionMeta: LiteloaderVersion, location: MinecraftLocation, options?: InstallOptions) {\n  return installLiteloaderTask(versionMeta, location, options).startAndWait()\n}\n\nfunction buildVersionInfo(versionMeta: LiteloaderVersion, mountedJSON: any) {\n  const id = `${mountedJSON.id}-Liteloader${versionMeta.mcversion}-${versionMeta.version}`\n  const time = new Date(Number.parseInt(versionMeta.timestamp, 10) * 1000).toISOString()\n  const releaseTime = time\n  const type = versionMeta.type\n  const libraries = [\n    {\n      name: `com.mumfrey:liteloader:${versionMeta.version}`,\n      url: type === 'SNAPSHOT' ? snapshotRoot : releaseRoot,\n    },\n    ...versionMeta.libraries.map(processLibraries),\n  ]\n  const mainClass = 'net.minecraft.launchwrapper.Launch'\n  const inheritsFrom = mountedJSON.id\n  const jar = mountedJSON.jar || mountedJSON.id\n  const info: any = {\n    id, time, releaseTime, type, libraries, mainClass, inheritsFrom, jar,\n  }\n  if (mountedJSON.arguments) {\n    // liteloader not supported for version > 1.12...\n    // just write this for exception\n    info.arguments = {\n      game: ['--tweakClass', versionMeta.tweakClass],\n      jvm: [],\n    }\n  } else {\n    info.minecraftArguments = `--tweakClass ${versionMeta.tweakClass} ` + mountedJSON.minecraftArguments\n  }\n  return info\n}\n\n/**\n * Install the liteloader to specific minecraft location.\n *\n * This will install the liteloader amount on the corresponded Minecraft version by default.\n * If you want to install over the forge. You should first install forge and pass the installed forge version id to the third param,\n * like `1.12-forge-xxxx`\n *\n * @tasks installLiteloader, installLiteloader.resolveVersionJson installLiteloader.generateLiteloaderJson\n *\n * @param versionMeta The liteloader version metadata.\n * @param location The minecraft location you want to install\n * @param version The real existed version id (under the the provided minecraft location) you want to installed liteloader inherit\n */\nexport function installLiteloaderTask(versionMeta: LiteloaderVersion, location: MinecraftLocation, options: InstallOptions = {}): Task<string> {\n  return task('installLiteloader', async function installLiteloader() {\n    const mc: MinecraftFolder = MinecraftFolder.from(location)\n\n    const mountVersion = options.inheritsFrom || versionMeta.mcversion\n\n    const mountedJSON: any = await this.yield(task('resolveVersionJson', async function resolveVersionJson() {\n      if (await missing(mc.getVersionJson(mountVersion))) {\n        throw new MissingVersionJsonError(mountVersion, mc.getVersionJson(mountVersion))\n      }\n      return readFile(mc.getVersionJson(mountVersion)).then((b) => b.toString()).then(JSON.parse)\n    }))\n\n    const versionInf = await this.yield(task('generateLiteloaderJson', async function generateLiteloaderJson() {\n      const inf = buildVersionInfo(versionMeta, mountedJSON)\n\n      inf.id = options.versionId || inf.id\n      inf.inheritsFrom = options.inheritsFrom || inf.inheritsFrom\n\n      const versionPath = mc.getVersionRoot(inf.id)\n\n      await ensureDir(versionPath)\n      await writeFile(join(versionPath, inf.id + '.json'), JSON.stringify(inf, undefined, 4))\n\n      return inf\n    }))\n    return versionInf.id as string\n  })\n}\n", "import { LibraryInfo, MinecraftFolder, MinecraftLocation, Version as VersionJson } from '@xmcl/core'\nimport { parse as parseForge } from '@xmcl/forge-site-parser'\nimport { Task, task } from '@xmcl/task'\nimport { filterEntries, open, openEntryReadStream, readEntry } from '@xmcl/unzip'\nimport { createWriteStream } from 'fs'\nimport { writeFile } from 'fs/promises'\nimport { dirname, join } from 'path'\nimport { pipeline } from 'stream/promises'\nimport { Dispatcher, request } from 'undici'\nimport { Entry, ZipFile } from 'yauzl'\nimport { DownloadTask } from './downloadTask'\nimport { LibraryOptions, resolveLibraryDownloadUrls } from './minecraft'\nimport { installByProfileTask, InstallProfile, InstallProfileOption } from './profile'\nimport { ensureFile, InstallOptions as InstallOptionsBase, joinUrl, normalizeArray } from './utils'\nimport { ZipValidator } from './zipValdiator'\n\nexport interface ForgeVersionList {\n  mcversion: string\n  versions: ForgeVersion[]\n}\n/**\n * The forge version metadata to download a forge\n */\nexport interface ForgeVersion {\n  /**\n     * The installer info\n     */\n  installer: {\n    md5: string\n    sha1: string\n    /**\n         * The url path to concat with forge maven\n         */\n    path: string\n  }\n  universal: {\n    md5: string\n    sha1: string\n    /**\n         * The url path to concat with forge maven\n         */\n    path: string\n  }\n  /**\n     * The minecraft version\n     */\n  mcversion: string\n  /**\n     * The forge version (without minecraft version)\n     */\n  version: string\n\n  type: 'buggy' | 'recommended' | 'common' | 'latest'\n}\n\n/**\n * All the useful entries in forge installer jar\n */\nexport interface ForgeInstallerEntries {\n  /**\n     *  maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}.jar\n     */\n  forgeJar?: Entry\n  /**\n     *  maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-universal.jar\n     */\n  forgeUniversalJar?: Entry\n  /**\n     * data/client.lzma\n     */\n  clientLzma?: Entry\n  /**\n     * data/server.lzma\n     */\n  serverLzma?: Entry\n  /**\n     * install_profile.json\n     */\n  installProfileJson?: Entry\n  /**\n     * version.json\n     */\n  versionJson?: Entry\n  /**\n     * forge-${forgeVersion}-universal.jar\n     */\n  legacyUniversalJar?: Entry\n  /**\n     * data/run.sh\n     */\n  runSh?: Entry\n  /**\n     * data/run.bat\n     */\n  runBat?: Entry\n  /**\n     * data/unix_args.txt\n     */\n  unixArgs?: Entry\n  /**\n     * data/user_jvm_args.txt\n     */\n  userJvmArgs?: Entry\n  /**\n     * data/win_args.txt\n     */\n  winArgs?: Entry\n}\n\nexport type ForgeInstallerEntriesPattern = ForgeInstallerEntries & Required<Pick<ForgeInstallerEntries, 'versionJson' | 'installProfileJson'>>\nexport type ForgeLegacyInstallerEntriesPattern = Required<Pick<ForgeInstallerEntries, 'installProfileJson' | 'legacyUniversalJar'>>\n\ntype RequiredVersion = {\n  /**\n     * The installer info.\n     *\n     * If this is not presented, it will genreate from mcversion and forge version.\n     */\n  installer?: {\n    sha1?: string\n    /**\n     * The url path to concat with forge maven\n     */\n    path: string\n  }\n  /**\n   * The minecraft version\n   */\n  mcversion: string\n  /**\n   * The forge version (without minecraft version)\n   */\n  version: string\n}\n\nexport const DEFAULT_FORGE_MAVEN = 'http://files.minecraftforge.net/maven'\n\n/**\n * The options to install forge.\n */\nexport interface InstallForgeOptions extends LibraryOptions, InstallOptionsBase, InstallProfileOption {\n}\n\nexport class DownloadForgeInstallerTask extends DownloadTask {\n  readonly installJarPath: string\n\n  constructor(forgeVersion: string, installer: RequiredVersion['installer'], minecraft: MinecraftFolder, options: InstallForgeOptions) {\n    const path = installer ? installer.path : `net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-installer.jar`\n    let url: string\n    if (installer) {\n      try {\n        const parsedUrl = new URL(path)\n        url = parsedUrl.toString()\n      } catch (e) {\n        const forgeMavenPath = path.replace('/maven', '').replace('maven', '')\n        url = joinUrl(DEFAULT_FORGE_MAVEN, forgeMavenPath)\n      }\n    } else {\n      const forgeMavenPath = path.replace('/maven', '').replace('maven', '')\n      url = joinUrl(DEFAULT_FORGE_MAVEN, forgeMavenPath)\n    }\n\n    const library = VersionJson.resolveLibrary({\n      name: `net.minecraftforge:forge:${forgeVersion}:installer`,\n      downloads: {\n        artifact: {\n          url,\n          path: `net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-installer.jar`,\n          size: -1,\n          sha1: installer?.sha1 || '',\n        },\n      },\n    })!\n    const mavenHost = options.mavenHost ? normalizeArray(options.mavenHost) : []\n\n    if (mavenHost.indexOf(DEFAULT_FORGE_MAVEN) === -1) {\n      mavenHost.push(DEFAULT_FORGE_MAVEN)\n    }\n\n    const urls = resolveLibraryDownloadUrls(library, { ...options, mavenHost })\n\n    const installJarPath = minecraft.getLibraryByPath(library.path)\n\n    super({\n      url: urls,\n      destination: installJarPath,\n      validator: installer?.sha1\n        ? options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: installer?.sha1 }) || { algorithm: 'sha1', hash: installer?.sha1 }\n        : new ZipValidator(),\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.installJarPath = installJarPath\n    this.name = 'downloadInstaller'\n    this.param = { version: forgeVersion }\n  }\n}\n\nfunction getLibraryPathWithoutMaven(mc: MinecraftFolder, name: string) {\n  // remove the maven/ prefix\n  return mc.getLibraryByPath(name.substring(name.indexOf('/') + 1))\n}\nfunction extractEntryTo(zip: ZipFile, e: Entry, dest: string) {\n  return openEntryReadStream(zip, e).then((stream) => pipeline(stream, createWriteStream(dest)))\n}\n\nasync function installLegacyForgeFromZip(zip: ZipFile, entries: ForgeLegacyInstallerEntriesPattern, profile: InstallProfile, mc: MinecraftFolder, jarFilePath: string, options: InstallForgeOptions) {\n  const versionJson = profile.versionInfo\n  if (!versionJson) {\n    throw new Error(`Malform legacy installer json ${profile.version}`)\n  }\n\n  // apply override for inheritsFrom\n  versionJson.id = options.versionId || versionJson.id\n  versionJson.inheritsFrom = options.inheritsFrom || versionJson.inheritsFrom\n\n  const rootPath = mc.getVersionRoot(versionJson.id)\n  const versionJsonPath = join(rootPath, `${versionJson.id}.json`)\n  await ensureFile(versionJsonPath)\n\n  const forgeLib = versionJson.libraries.find((l) => l.name.startsWith('net.minecraftforge:forge') || l.name.startsWith('net.minecraftforge:minecraftforge'))\n  if (!forgeLib) {\n    throw new BadForgeInstallerJarError(jarFilePath)\n  }\n  const library = LibraryInfo.resolve(forgeLib)\n  const jarPath = mc.getLibraryByPath(library.path)\n  await ensureFile(jarPath)\n\n  await Promise.all([\n    writeFile(versionJsonPath, JSON.stringify(versionJson, undefined, 4)),\n    extractEntryTo(zip, entries.legacyUniversalJar, jarPath),\n  ])\n\n  return versionJson.id\n}\n\n/**\n * Unpack forge installer jar file content to the version library artifact directory.\n * @param zip The forge jar file\n * @param entries The entries\n * @param forgeVersion The expected version of forge\n * @param profile The forge install profile\n * @param mc The minecraft location\n * @returns The installed version id\n */\nexport async function unpackForgeInstaller(zip: ZipFile, entries: ForgeInstallerEntriesPattern, forgeVersion: string, profile: InstallProfile, mc: MinecraftFolder, jarPath: string, options: InstallForgeOptions) {\n  const versionJson: VersionJson = await readEntry(zip, entries.versionJson).then((b) => b.toString()).then(JSON.parse)\n\n  // apply override for inheritsFrom\n  versionJson.id = options.versionId || versionJson.id\n  versionJson.inheritsFrom = options.inheritsFrom || versionJson.inheritsFrom\n\n  // resolve all the required paths\n  const rootPath = mc.getVersionRoot(versionJson.id)\n\n  const versionJsonPath = join(rootPath, `${versionJson.id}.json`)\n  const installJsonPath = join(rootPath, 'install_profile.json')\n\n  const dataRoot = dirname(jarPath)\n\n  const unpackData = (entry: Entry) => {\n    promises.push(extractEntryTo(zip, entry, join(dataRoot, entry.fileName.substring('data/'.length))))\n  }\n\n  await ensureFile(versionJsonPath)\n\n  const promises: Promise<void>[] = []\n  if (entries.forgeUniversalJar) {\n    promises.push(extractEntryTo(zip, entries.forgeUniversalJar, getLibraryPathWithoutMaven(mc, entries.forgeUniversalJar.fileName)))\n  }\n\n  if (!profile.data) {\n    profile.data = {}\n  }\n\n  const installerMaven = `net.minecraftforge:forge:${forgeVersion}:installer`\n  profile.data.INSTALLER = {\n    client: `[${installerMaven}]`,\n    server: `[${installerMaven}]`,\n  }\n\n  if (entries.serverLzma) {\n    // forge version and mavens, compatible with twitch api\n    const serverMaven = `net.minecraftforge:forge:${forgeVersion}:serverdata@lzma`\n    // override forge bin patch location\n    profile.data.BINPATCH.server = `[${serverMaven}]`\n\n    const serverBinPath = mc.getLibraryByPath(LibraryInfo.resolve(serverMaven).path)\n    await ensureFile(serverBinPath)\n    promises.push(extractEntryTo(zip, entries.serverLzma, serverBinPath))\n  }\n\n  if (entries.clientLzma) {\n    // forge version and mavens, compatible with twitch api\n    const clientMaven = `net.minecraftforge:forge:${forgeVersion}:clientdata@lzma`\n    // override forge bin patch location\n    profile.data.BINPATCH.client = `[${clientMaven}]`\n\n    const clientBinPath = mc.getLibraryByPath(LibraryInfo.resolve(clientMaven).path)\n    await ensureFile(clientBinPath)\n    promises.push(extractEntryTo(zip, entries.clientLzma, clientBinPath))\n  }\n\n  if (entries.forgeJar) {\n    promises.push(extractEntryTo(zip, entries.forgeJar, getLibraryPathWithoutMaven(mc, entries.forgeJar.fileName)))\n  }\n  if (entries.runBat) { unpackData(entries.runBat) }\n  if (entries.runSh) { unpackData(entries.runSh) }\n  if (entries.winArgs) { unpackData(entries.winArgs) }\n  if (entries.unixArgs) { unpackData(entries.unixArgs) }\n  if (entries.userJvmArgs) { unpackData(entries.userJvmArgs) }\n\n  promises.push(\n    writeFile(installJsonPath, JSON.stringify(profile)),\n    writeFile(versionJsonPath, JSON.stringify(versionJson)),\n  )\n\n  await Promise.all(promises)\n\n  return versionJson.id\n}\n\nexport function isLegacyForgeInstallerEntries(entries: ForgeInstallerEntries): entries is ForgeLegacyInstallerEntriesPattern {\n  return !!entries.legacyUniversalJar && !!entries.installProfileJson\n}\n\nexport function isForgeInstallerEntries(entries: ForgeInstallerEntries): entries is ForgeInstallerEntriesPattern {\n  return !!entries.installProfileJson && !!entries.versionJson\n}\n\n/**\n * Walk the forge installer file to find key entries\n * @param zip THe forge instal\n * @param forgeVersion Forge version to install\n */\nexport async function walkForgeInstallerEntries(zip: ZipFile, forgeVersion: string): Promise<ForgeInstallerEntries> {\n  const [forgeJar, forgeUniversalJar, clientLzma, serverLzma, installProfileJson, versionJson, legacyUniversalJar, runSh, runBat, unixArgs, userJvmArgs, winArgs] = await filterEntries(zip, [\n    `maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}.jar`,\n    `maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-universal.jar`,\n    'data/client.lzma',\n    'data/server.lzma',\n    'install_profile.json',\n    'version.json',\n    (e) => e.fileName === `forge-${forgeVersion}-universal.jar` || (e.fileName.startsWith('forge-') && e.fileName.endsWith('-universal.jar')) || (e.fileName.startsWith('minecraftforge-universal-')), // legacy installer format\n    'data/run.sh',\n    'data/run.bat',\n    'data/unix_args.txt',\n    'data/user_jvm_args.txt',\n    'data/win_args.txt',\n  ])\n  return {\n    forgeJar,\n    forgeUniversalJar,\n    clientLzma,\n    serverLzma,\n    installProfileJson,\n    versionJson,\n    legacyUniversalJar,\n    runSh,\n    runBat,\n    unixArgs,\n    userJvmArgs,\n    winArgs,\n  }\n}\n\nexport class BadForgeInstallerJarError extends Error {\n  name = 'BadForgeInstallerJarError'\n\n  constructor(\n    public jarPath: string,\n    /**\n         * What entry in jar is missing\n         */\n    public entry?: string) {\n    super(entry ? `Missing entry ${entry} in forge installer jar: ${jarPath}` : `Bad forge installer: ${jarPath}`)\n  }\n}\n\nexport function installByInstallerTask(version: RequiredVersion, minecraft: MinecraftLocation, options: InstallForgeOptions) {\n  return task('installForge', async function () {\n    function getForgeArtifactVersion() {\n      const [_, minor] = version.mcversion.split('.')\n      const minorVersion = Number.parseInt(minor)\n      if (minorVersion >= 7 && minorVersion <= 8) {\n        return `${version.mcversion}-${version.version}-${version.mcversion}`\n      }\n      if (version.version.startsWith(version.mcversion)) {\n        return version.version\n      }\n      return `${version.mcversion}-${version.version}`\n    }\n    const forgeVersion = getForgeArtifactVersion()\n    const mc = MinecraftFolder.from(minecraft)\n    const jarPath = await this.yield(new DownloadForgeInstallerTask(forgeVersion, version.installer, mc, options)\n      .map(function () { return this.installJarPath }))\n\n    const zip = await open(jarPath, { lazyEntries: true, autoClose: false })\n    const entries = await walkForgeInstallerEntries(zip, forgeVersion)\n\n    if (!entries.installProfileJson) {\n      throw new BadForgeInstallerJarError(jarPath, 'install_profile.json')\n    }\n    const profile: InstallProfile = await readEntry(zip, entries.installProfileJson).then((b) => b.toString()).then(JSON.parse)\n    if (isForgeInstallerEntries(entries)) {\n      // new forge\n      const versionId = await unpackForgeInstaller(zip, entries, forgeVersion, profile, mc, jarPath, options)\n      await this.concat(installByProfileTask(profile, minecraft, options))\n      return versionId\n    } else if (isLegacyForgeInstallerEntries(entries)) {\n      // legacy forge\n      return installLegacyForgeFromZip(zip, entries, profile, mc, jarPath, options)\n    } else {\n      // bad forge\n      throw new BadForgeInstallerJarError(jarPath)\n    }\n  })\n}\n\n/**\n * Install forge to target location.\n * Installation task for forge with mcversion >= 1.13 requires java installed on your pc.\n * @param version The forge version meta\n * @returns The installed version name.\n * @throws {@link BadForgeInstallerJarError}\n */\nexport function installForge(version: RequiredVersion, minecraft: MinecraftLocation, options?: InstallForgeOptions) {\n  return installForgeTask(version, minecraft, options).startAndWait()\n}\n\n/**\n * Install forge to target location.\n * Installation task for forge with mcversion >= 1.13 requires java installed on your pc.\n * @param version The forge version meta\n * @returns The task to install the forge\n * @throws {@link BadForgeInstallerJarError}\n */\nexport function installForgeTask(version: RequiredVersion, minecraft: MinecraftLocation, options: InstallForgeOptions = {}): Task<string> {\n  return installByInstallerTask(version, minecraft, options)\n}\n\n/**\n * Query the webpage content from files.minecraftforge.net.\n *\n * You can put the last query result to the fallback option. It will check if your old result is up-to-date.\n * It will request a new page only when the fallback option is outdated.\n *\n * @param option The option can control querying minecraft version, and page caching.\n */\nexport async function getForgeVersionList(options: {\n  /**\n     * The minecraft version you are requesting\n     */\n  minecraft?: string\n  dispatcher?: Dispatcher\n} = {}): Promise<ForgeVersionList> {\n  const mcversion = options.minecraft || ''\n  const url = mcversion === '' ? 'http://files.minecraftforge.net/maven/net/minecraftforge/forge/index.html' : `http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_${mcversion}.html`\n  const response = await request(url, {\n    dispatcher: options.dispatcher,\n    maxRedirections: 3,\n  })\n  const body = parseForge(await response.body.text())\n  return body as any\n}\n", "import { AbortSignal, download, DownloadAbortError, DownloadOptions, ProgressController } from '@xmcl/file-transfer'\nimport { AbortableTask } from '@xmcl/task'\n\nexport class DownloadTask extends AbortableTask<void> implements ProgressController {\n  protected abort: (isCancelled: boolean) => void = () => { }\n\n  constructor(protected options: DownloadOptions) {\n    super()\n    this._from = options.url instanceof Array ? options.url[0] : options.url\n    this._to = options.destination\n  }\n\n  onProgress(url: URL, chunkSize: number, progress: number, total: number): void {\n    this._progress = progress\n    this._total = total\n    this._from = url.toString()\n    this.update(chunkSize)\n  }\n\n  protected process(): Promise<void> {\n    const listeners: Array<() => void> = []\n    const aborted = () => this.isCancelled || this.isPaused\n    const signal: AbortSignal = {\n      get aborted() { return aborted() },\n      addEventListener(event, listener) {\n        if (event !== 'abort') {\n          return this\n        }\n        listeners.push(listener)\n        return this\n      },\n      removeEventListener(event, listener) {\n        // noop as this will be auto gc\n        return this\n      },\n    }\n    this.abort = () => {\n      listeners.forEach((l) => l())\n    }\n    return download({\n      ...this.options,\n      progressController: this,\n      abortSignal: signal,\n    })\n  }\n\n  protected isAbortedError(e: any): boolean {\n    if (e instanceof DownloadAbortError) {\n      return true\n    }\n    return false\n  }\n}\n", "import { MinecraftFolder, MinecraftLocation, ResolvedLibrary, ResolvedVersion, Version, Version as VersionJson } from '@xmcl/core'\nimport { ChecksumNotMatchError, ChecksumValidatorOptions, DownloadBaseOptions, JsonValidator, Validator } from '@xmcl/file-transfer'\nimport { task, Task } from '@xmcl/task'\nimport { readFile, stat, writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadTask } from './downloadTask'\nimport { ensureDir, errorToString, joinUrl, normalizeArray, ParallelTaskOptions } from './utils'\nimport { ZipValidator } from './zipValdiator'\n\n/**\n * The function to swap library host.\n */\nexport type LibraryHost = (library: ResolvedLibrary) => string | string[] | undefined\n\nexport interface MinecraftVersionBaseInfo {\n  /**\n     * The version id, like 1.14.4\n     */\n  id: string\n  /**\n     * The version json download url\n     */\n  url: string\n}\n\n/**\n * The version metadata containing the version information, like download url\n */\nexport interface MinecraftVersion extends MinecraftVersionBaseInfo {\n  /**\n     * The version id, like 1.14.4\n     */\n  id: string\n  type: string\n  time: string\n  releaseTime: string\n  /**\n     * The version json download url\n     */\n  url: string\n}\n\nexport interface AssetInfo {\n  name: string\n  hash: string\n  size: number\n}\n\n/**\n * Minecraft version metadata list\n */\nexport interface MinecraftVersionList {\n  latest: {\n    /**\n         * Snapshot version id of the Minecraft\n         */\n    snapshot: string\n    /**\n         * Release version id of the Minecraft, like 1.14.2\n         */\n    release: string\n  }\n  /**\n     * All the vesrsion list\n     */\n  versions: MinecraftVersion[]\n}\n\n/**\n * Default minecraft version manifest url.\n */\nexport const DEFAULT_VERSION_MANIFEST_URL = 'https://launchermeta.mojang.com/mc/game/version_manifest.json'\n/**\n * Default resource/assets url root\n */\nexport const DEFAULT_RESOURCE_ROOT_URL = 'https://resources.download.minecraft.net'\n\n/**\n * Get and update the version list.\n * This try to send http GET request to offical Minecraft metadata endpoint by default.\n * You can swap the endpoint by passing url on `remote` in option.\n *\n * @returns The new list if there is\n */\nexport async function getVersionList(options: {\n  /**\n     * Request dispatcher\n     */\n  dispatcher?: Dispatcher\n} = {}): Promise<MinecraftVersionList> {\n  const response = await request(DEFAULT_VERSION_MANIFEST_URL, { dispatcher: options.dispatcher, throwOnError: true })\n  return await response.body.json() as any\n}\n\n/**\n * Change the library host url\n */\nexport interface LibraryOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n   * A more flexiable way to control library download url.\n   * @see mavenHost\n   */\n  libraryHost?: LibraryHost\n  /**\n   * The alterative maven host to download library. It will try to use these host from the `[0]` to the `[maven.length - 1]`\n   */\n  mavenHost?: string | string[]\n  /**\n   * Control how many libraries download task should run at the same time.\n   * It will override the `maxConcurrencyOption` if this is presented.\n   *\n   * This will be ignored if you have your own downloader assigned.\n   */\n  librariesDownloadConcurrency?: number\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n/**\n * Change the host url of assets download\n */\nexport interface AssetsOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n     * The alternative assets host to download asset. It will try to use these host from the `[0]` to the `[assetsHost.length - 1]`\n     */\n  assetsHost?: string | string[]\n  /**\n     * Control how many assets download task should run at the same time.\n     * It will override the `maxConcurrencyOption` if this is presented.\n     *\n     * This will be ignored if you have your own downloader assigned.\n     */\n  assetsDownloadConcurrency?: number\n\n  /**\n   * The assets index download or url replacement\n   */\n  assetsIndexUrl?: string | string[] | ((version: ResolvedVersion) => string | string[])\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n  /**\n   * Only precheck the size of the assets. Do not check the hash.\n   */\n  prevalidSizeOnly?: boolean\n}\n\nexport type InstallLibraryVersion = Pick<ResolvedVersion, 'libraries' | 'minecraftDirectory'>\n\nfunction resolveDownloadUrls<T>(original: string, version: T, option?: string | string[] | ((version: T) => string | string[])) {\n  const result = [] as string[]\n  if (typeof option === 'function') {\n    result.unshift(...normalizeArray(option(version)))\n  } else {\n    result.unshift(...normalizeArray(option))\n  }\n  if (result.indexOf(original) === -1) {\n    result.push(original)\n  }\n  return result\n}\n/**\n * Replace the minecraft client or server jar download\n */\nexport interface JarOption extends DownloadBaseOptions, ParallelTaskOptions, InstallSideOption {\n  /**\n   * The version json url replacement\n   */\n  json?: string | string[] | ((version: MinecraftVersionBaseInfo) => string | string[])\n  /**\n   * The client jar url replacement\n   */\n  client?: string | string[] | ((version: ResolvedVersion) => string | string[])\n  /**\n   * The server jar url replacement\n   */\n  server?: string | string[] | ((version: ResolvedVersion) => string | string[])\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n\nexport interface InstallSideOption {\n  /**\n     * The installation side\n     */\n  side?: 'client' | 'server'\n}\n\nexport type Options = DownloadBaseOptions & ParallelTaskOptions & AssetsOptions & JarOption & LibraryOptions & InstallSideOption\n\n/**\n * Install the Minecraft game to a location by version metadata.\n *\n * This will install version json, version jar, and all dependencies (assets, libraries)\n *\n * @param versionMeta The version metadata\n * @param minecraft The Minecraft location\n * @param option\n */\nexport async function install(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, option: Options = {}): Promise<ResolvedVersion> {\n  return installTask(versionMeta, minecraft, option).startAndWait()\n}\n\n/**\n * Only install the json/jar. Do not install dependencies.\n *\n * @param versionMeta the version metadata; get from updateVersionMeta\n * @param minecraft minecraft location\n */\nexport function installVersion(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: JarOption = {}): Promise<ResolvedVersion> {\n  return installVersionTask(versionMeta, minecraft, options).startAndWait()\n}\n\n/**\n * Install the completeness of the Minecraft game assets and libraries on a existed version.\n *\n * @param version The resolved version produced by Version.parse\n * @param minecraft The minecraft location\n */\nexport function installDependencies(version: ResolvedVersion, options?: Options): Promise<ResolvedVersion> {\n  return installDependenciesTask(version, options).startAndWait()\n}\n\n/**\n * Install or check the assets to resolved version\n *\n * @param version The target version\n * @param options The option to replace assets host url\n */\nexport function installAssets(version: ResolvedVersion, options: AssetsOptions = {}): Promise<ResolvedVersion> {\n  return installAssetsTask(version, options).startAndWait()\n}\n\n/**\n * Install all the libraries of providing version\n * @param version The target version\n * @param options The library host swap option\n */\nexport function installLibraries(version: ResolvedVersion, options: LibraryOptions = {}): Promise<void> {\n  return installLibrariesTask(version, options).startAndWait()\n}\n\n/**\n * Only install several resolved libraries\n * @param libraries The resolved libraries\n * @param minecraft The minecraft location\n * @param option The install option\n */\nexport async function installResolvedLibraries(libraries: ResolvedLibrary[], minecraft: MinecraftLocation, option?: LibraryOptions): Promise<void> {\n  await installLibrariesTask({ libraries, minecraftDirectory: typeof minecraft === 'string' ? minecraft : minecraft.root }, option).startAndWait()\n}\n\n/**\n * Install the Minecraft game to a location by version metadata.\n *\n * This will install version json, version jar, and all dependencies (assets, libraries)\n *\n * @param type The type of game, client or server\n * @param versionMeta The version metadata\n * @param minecraft The Minecraft location\n * @param options\n */\nexport function installTask(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: Options = {}): Task<ResolvedVersion> {\n  return task('install', async function () {\n    const version = await this.yield(installVersionTask(versionMeta, minecraft, options))\n    if (options.side !== 'server') {\n      await this.yield(installDependenciesTask(version, options))\n    }\n    return version\n  })\n}\n/**\n * Only install the json/jar. Do not install dependencies.\n *\n * @param type client or server\n * @param versionMeta the version metadata; get from updateVersionMeta\n * @param minecraft minecraft location\n */\nexport function installVersionTask(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: JarOption = {}): Task<ResolvedVersion> {\n  return task('version', async function () {\n    await this.yield(new InstallJsonTask(versionMeta, minecraft, options))\n    const version = await VersionJson.parse(minecraft, versionMeta.id)\n    if (version.downloads[options.side ?? 'client']) {\n      await this.yield(new InstallJarTask(version as any, minecraft, options))\n    }\n    return version\n  }, versionMeta)\n}\n\n/**\n * Install the completeness of the Minecraft game assets and libraries on a existed version.\n *\n * @param version The resolved version produced by Version.parse\n * @param minecraft The minecraft location\n */\nexport function installDependenciesTask(version: ResolvedVersion, options: Options = {}): Task<ResolvedVersion> {\n  return task('dependencies', async function () {\n    await Promise.all([\n      this.yield(installAssetsTask(version, options)),\n      this.yield(installLibrariesTask(version, options)),\n    ])\n    return version\n  })\n}\n\n/**\n * Install or check the assets to resolved version\n *\n * @param version The target version\n * @param options The option to replace assets host url\n */\nexport function installAssetsTask(version: ResolvedVersion, options: AssetsOptions = {}): Task<ResolvedVersion> {\n  return task('assets', async function () {\n    const folder = MinecraftFolder.from(version.minecraftDirectory)\n    if (version.logging?.client?.file) {\n      const file = version.logging.client.file\n\n      await this.yield(new DownloadTask({\n        url: file.url,\n        validator: {\n          algorithm: 'sha1',\n          hash: file.sha1,\n        },\n        destination: folder.getLogConfig(file.id),\n        agent: options.agent,\n        headers: options.headers,\n      }).setName('asset', { name: file.id, hash: file.sha1, size: file.size }))\n    }\n    const jsonPath = folder.getPath('assets', 'indexes', version.assets + '.json')\n\n    if (version.assetIndex) {\n      await this.yield(new InstallAssetIndexTask(version as any, options))\n    }\n\n    await ensureDir(folder.getPath('assets', 'objects'))\n    interface AssetIndex {\n      objects: {\n        [key: string]: {\n          hash: string\n          size: number\n        }\n      }\n    }\n\n    const getAssetIndexFallback = async () => {\n      const urls = resolveDownloadUrls(version.assetIndex!.url, version, options.assetsIndexUrl)\n      for (const url of urls) {\n        try {\n          const response = await request(url, { dispatcher: options.agent?.dispatcher })\n          const json = await response.body.json() as any\n          await writeFile(jsonPath, JSON.stringify(json))\n          return json\n        } catch {\n          // ignore\n        }\n      }\n    }\n\n    let objectArray: any[]\n    try {\n      const { objects } = JSON.parse(await readFile(jsonPath).then((b) => b.toString())) as AssetIndex\n      objectArray = Object.keys(objects).map((k) => ({ name: k, ...objects[k] }))\n    } catch (e) {\n      if ((e instanceof SyntaxError)) {\n        throw e\n      }\n      const { objects } = await getAssetIndexFallback()\n      objectArray = Object.keys(objects).map((k) => ({ name: k, ...objects[k] }))\n    }\n    await this.all(objectArray.map((o) => new InstallAssetTask(o, folder, options)), {\n      throwErrorImmediately: options.throwErrorImmediately ?? false,\n      getErrorMessage: (errs) => `Errors during install Minecraft ${version.id}'s assets at ${version.minecraftDirectory}: ${errs.map(errorToString).join('\\n')}`,\n    })\n\n    return version\n  })\n}\n\n/**\n * Install all the libraries of providing version\n * @param version The target version\n * @param options The library host swap option\n */\nexport function installLibrariesTask(version: InstallLibraryVersion, options: LibraryOptions = {}): Task<void> {\n  return task('libraries', async function () {\n    const folder = MinecraftFolder.from(version.minecraftDirectory)\n    await this.all(version.libraries.map((lib) => new InstallLibraryTask(lib, folder, options)), {\n      throwErrorImmediately: options.throwErrorImmediately ?? false,\n      getErrorMessage: (errs) => `Errors during install libraries at ${version.minecraftDirectory}: ${errs.map(errorToString).join('\\n')}`,\n    })\n  })\n}\n\n/**\n * Only install several resolved libraries\n * @param libraries The resolved libraries\n * @param minecraft The minecraft location\n * @param option The install option\n */\nexport function installResolvedLibrariesTask(libraries: ResolvedLibrary[], minecraft: MinecraftLocation, option?: LibraryOptions) {\n  return installLibrariesTask({ libraries, minecraftDirectory: typeof minecraft === 'string' ? minecraft : minecraft.root }, option)\n}\n\n/**\n * Only install several resolved assets.\n * @param assets The assets to install\n * @param folder The minecraft folder\n * @param options The asset option\n */\nexport function installResolvedAssetsTask(assets: AssetInfo[], folder: MinecraftFolder, options: AssetsOptions = {}) {\n  return task('assets', async function () {\n    await ensureDir(folder.getPath('assets', 'objects'))\n\n    // const sizes = assets.map((a) => a.size).map((a, b) => a + b, 0);\n\n    await this.all(assets.map((o) => new InstallAssetTask(o, folder, options)), {\n      throwErrorImmediately: false,\n      getErrorMessage: (errs) => `Errors during install assets at ${folder.root}:\\n${errs.map(errorToString).join('\\n')}`,\n    })\n  })\n}\n\nexport class InstallJsonTask extends DownloadTask {\n  constructor(version: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: Options) {\n    const folder = MinecraftFolder.from(minecraft)\n    const destination = folder.getVersionJson(version.id)\n    const expectSha1 = version.url.split('/')[5]\n    const urls = resolveDownloadUrls(version.url, version, options.json)\n\n    super({\n      url: urls,\n      headers: options.headers,\n      agent: options.agent,\n      validator: expectSha1 ? options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 } : new JsonValidator(),\n      destination,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.name = 'json'\n    this.param = version\n  }\n}\n\nexport class InstallJarTask extends DownloadTask {\n  constructor(version: ResolvedVersion & { downloads: Required<ResolvedVersion>['downloads'] }, minecraft: MinecraftLocation, options: Options) {\n    const folder = MinecraftFolder.from(minecraft)\n    const type = options.side ?? 'client'\n    const destination = join(folder.getVersionRoot(version.id),\n      type === 'client' ? version.id + '.jar' : version.id + '-' + type + '.jar')\n    const download = version.downloads[type]\n    if (!download) {\n      throw new Error(`Cannot find downloadable jar in ${type}`)\n    }\n    const urls = resolveDownloadUrls(download.url, version, options[type])\n    const expectSha1 = download.sha1\n\n    super({\n      url: urls,\n      validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n      destination,\n      headers: options.headers,\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.name = 'jar'\n    this.param = version\n  }\n}\n\nexport class InstallAssetIndexTask extends DownloadTask {\n  constructor(version: ResolvedVersion & { assetIndex: Version.AssetIndex }, options: AssetsOptions = {}) {\n    const folder = MinecraftFolder.from(version.minecraftDirectory)\n    const jsonPath = folder.getPath('assets', 'indexes', version.assets + '.json')\n    const expectSha1 = version.assetIndex.sha1\n\n    super({\n      url: resolveDownloadUrls(version.assetIndex.url, version, options.assetsIndexUrl),\n      destination: jsonPath,\n      validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n      headers: options.headers,\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.name = 'assetIndex'\n    this.param = version\n  }\n}\n\nexport class InstallLibraryTask extends DownloadTask {\n  constructor(lib: ResolvedLibrary, folder: MinecraftFolder, options: LibraryOptions) {\n    const libraryPath = lib.download.path\n    const destination = join(folder.libraries, libraryPath)\n    const urls: string[] = resolveLibraryDownloadUrls(lib, options)\n    const expectSha1 = lib.download.sha1\n\n    super({\n      url: urls,\n      validator: lib.download.sha1 === ''\n        ? new ZipValidator()\n        : options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n      destination,\n      headers: options.headers,\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.name = 'library'\n    this.param = lib\n  }\n}\n\nexport class InstallAssetTask extends DownloadTask {\n  constructor(asset: AssetInfo, folder: MinecraftFolder, options: AssetsOptions) {\n    const assetsHosts = normalizeArray(options.assetsHost || [])\n\n    if (assetsHosts.indexOf(DEFAULT_RESOURCE_ROOT_URL) === -1) {\n      assetsHosts.push(DEFAULT_RESOURCE_ROOT_URL)\n    }\n\n    const { hash, size, name } = asset\n\n    const head = hash.substring(0, 2)\n    const dir = folder.getPath('assets', 'objects', head)\n    const file = join(dir, hash)\n    const urls = assetsHosts.map((h) => `${h}/${head}/${hash}`)\n\n    super({\n      url: urls,\n      destination: file,\n      validator: options.prevalidSizeOnly\n        ? {\n          async validate(destination, url) {\n            const fstat = await stat(destination).catch(() => ({ size: -1 }))\n            if (fstat.size !== size) {\n              throw new ChecksumNotMatchError('size', size.toString(), fstat.size.toString(), destination, url)\n            }\n          },\n        }\n        : options.checksumValidatorResolver?.({ algorithm: 'sha1', hash }) || { algorithm: 'sha1', hash },\n      headers: options.headers,\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this._total = size\n    this.name = 'asset'\n    this.param = asset\n  }\n}\n\nconst DEFAULT_MAVENS = ['https://repo1.maven.org/maven2/']\n\n/**\n * Resolve a library download urls with fallback.\n *\n * @param library The resolved library\n * @param libraryOptions The library install options\n */\nexport function resolveLibraryDownloadUrls(library: ResolvedLibrary, libraryOptions: LibraryOptions): string[] {\n  const libraryHosts = libraryOptions.libraryHost?.(library) ?? []\n  const url = new URL(library.download.url)\n\n  return [...new Set([\n    // user defined alternative host to download\n    ...normalizeArray(libraryHosts),\n    ...normalizeArray(libraryOptions.mavenHost).map((m) => joinUrl(m, url.pathname)),\n    library.download.url,\n    ...normalizeArray(libraryOptions.mavenHost).map((m) => joinUrl(m, library.download.path)),\n    ...DEFAULT_MAVENS.map((m) => joinUrl(m, library.download.path)),\n  ])]\n}\n", "import { ValidationError, Validator } from '@xmcl/file-transfer'\nimport { open } from '@xmcl/unzip'\n\nexport class ZipValidator implements Validator {\n  async validate(destination: string, url: string): Promise<void> {\n    try {\n      const file = await open(destination, { autoClose: false, lazyEntries: true })\n      file.close()\n    } catch (e) {\n      throw new ValidationError('InvalidZipError', (e as any).message)\n    }\n  }\n}\n", "import { LibraryInfo, MinecraftFolder, MinecraftLocation, Version as VersionJson } from '@xmcl/core'\nimport { AbortableTask, CancelledError, task } from '@xmcl/task'\nimport { open, readEntry, walkEntriesGenerator } from '@xmcl/unzip'\nimport { spawn } from 'child_process'\nimport { readFile } from 'fs/promises'\nimport { delimiter, dirname } from 'path'\nimport { ZipFile } from 'yauzl'\nimport { InstallLibraryTask, InstallSideOption, LibraryOptions } from './minecraft'\nimport { checksum, errorToString, SpawnJavaOptions, waitProcess } from './utils'\n\nexport interface PostProcessor {\n  /**\n     * The executable jar path\n     */\n  jar: string\n  /**\n     * The classpath to run\n     */\n  classpath: string[]\n  args: string[]\n  outputs?: { [key: string]: string }\n  sides?: Array<'client' | 'server'>\n}\n\nexport interface InstallProfile {\n  spec?: number\n  /**\n   * The type of this installation, like \"forge\"\n   */\n  profile: string\n  /**\n   * The version of this installation\n   */\n  version: string\n  /**\n   * The version json path\n   */\n  json: string\n  /**\n   * The maven artifact name: <org>:<artifact-id>:<version>\n   */\n  path: string\n  /**\n   * The minecraft version\n   */\n  minecraft: string\n  /**\n   * The processor shared variables. The key is the name of variable to replace.\n   *\n   * The value of client/server is the value of the variable.\n   */\n  data?: { [key: string]: { client: string; server: string } }\n  /**\n     * The post processor. Which require java to run.\n     */\n  processors?: Array<PostProcessor>\n  /**\n   * The required install profile libraries\n   */\n  libraries: VersionJson.NormalLibrary[]\n  /**\n   * Legacy format\n   */\n  versionInfo?: VersionJson\n}\n\nexport interface InstallProfileOption extends LibraryOptions, InstallSideOption, SpawnJavaOptions {\n  /**\n     * New forge (>=1.13) require java to install. Can be a executor or java executable path.\n     */\n  java?: string\n}\n\n/**\n * Resolve processors in install profile\n */\nexport function resolveProcessors(side: 'client' | 'server', installProfile: InstallProfile, minecraft: MinecraftFolder) {\n  function normalizePath(val: string) {\n    if (val && val.match(/^\\[.+\\]$/g)) { // match sth like [net.minecraft:client:1.15.2:slim]\n      const name = val.substring(1, val.length - 1)\n      return minecraft.getLibraryByPath(LibraryInfo.resolve(name).path)\n    }\n    return val\n  }\n  function normalizeVariable(val: string) {\n    if (val && val.match(/^{.+}$/g)) { // match sth like {MAPPINGS}\n      const key = val.substring(1, val.length - 1)\n      return variables[key][side]\n    }\n    return val\n  }\n  // store the mapping of {VARIABLE_NAME} -> real path in disk\n  const variables: Record<string, { client: string; server: string }> = {\n    SIDE: {\n      client: 'client',\n      server: 'server',\n    },\n    MINECRAFT_JAR: {\n      client: minecraft.getVersionJar(installProfile.minecraft),\n      server: minecraft.getVersionJar(installProfile.minecraft, 'server'),\n    },\n  }\n  if (installProfile.data) {\n    for (const key in installProfile.data) {\n      const { client, server } = installProfile.data[key]\n      variables[key] = {\n        client: normalizePath(client),\n        server: normalizePath(server),\n      }\n    }\n  }\n  if (variables.INSTALLER) {\n    variables.ROOT = {\n      client: dirname(variables.INSTALLER.client),\n      server: dirname(variables.INSTALLER.server),\n    }\n  }\n\n  const resolveOutputs = (proc: PostProcessor, args: string[]) => {\n    const original = proc.outputs\n      ? Object.entries(proc.outputs).map(([k, v]) => ({ [normalizeVariable(k)]: normalizeVariable(v) })).reduce((a, b) => Object.assign(a, b), {})\n      : {}\n    for (const [key, val] of Object.entries(original)) {\n      original[key] = val.replace(/'/g, '')\n    }\n    const outputIndex = args.indexOf('--output') === -1 ? args.indexOf('--out-jar') : args.indexOf('--output')\n    const outputFile = outputIndex !== -1 ? args[outputIndex + 1] : undefined\n    if (outputFile && !original[outputFile]) {\n      original[outputFile] = ''\n    }\n    return original\n  }\n  const processors = (installProfile.processors || []).map((proc) => {\n    const args = proc.args.map(normalizePath).map(normalizeVariable)\n    return {\n      ...proc,\n      args,\n      outputs: resolveOutputs(proc, args),\n    }\n  }).filter((proc) => proc.sides ? proc.sides.indexOf(side) !== -1 : true)\n  return processors\n}\n\n/**\n * Post process the post processors from `InstallProfile`.\n *\n * @param processors The processor info\n * @param minecraft The minecraft location\n * @param java The java executable path\n * @throws {@link PostProcessError}\n */\nexport function postProcess(processors: PostProcessor[], minecraft: MinecraftFolder, javaOptions: SpawnJavaOptions) {\n  return new PostProcessingTask(processors, minecraft, javaOptions).startAndWait()\n}\n\n/**\n * Install by install profile. The install profile usually contains some preprocess should run before installing dependencies.\n *\n * @param installProfile The install profile\n * @param minecraft The minecraft location\n * @param options The options to install\n * @throws {@link PostProcessError}\n */\nexport function installByProfile(installProfile: InstallProfile, minecraft: MinecraftLocation, options: InstallProfileOption = {}) {\n  return installByProfileTask(installProfile, minecraft, options).startAndWait()\n}\n\n/**\n * Install by install profile. The install profile usually contains some preprocess should run before installing dependencies.\n *\n * @param installProfile The install profile\n * @param minecraft The minecraft location\n * @param options The options to install\n */\nexport function installByProfileTask(installProfile: InstallProfile, minecraft: MinecraftLocation, options: InstallProfileOption = {}) {\n  return task('installByProfile', async function () {\n    const minecraftFolder = MinecraftFolder.from(minecraft)\n\n    const processor = resolveProcessors(options.side || 'client', installProfile, minecraftFolder)\n\n    const versionJson: VersionJson = await readFile(minecraftFolder.getVersionJson(installProfile.version)).then((b) => b.toString()).then(JSON.parse)\n    const installRequiredLibs = VersionJson.resolveLibraries(installProfile.libraries)\n\n    await this.all(installRequiredLibs.map((lib) => new InstallLibraryTask(lib, minecraftFolder, options)), {\n      throwErrorImmediately: options.throwErrorImmediately ?? false,\n      getErrorMessage: (errs) => `Errors during install libraries at ${minecraftFolder.root}: ${errs.map(errorToString).join('\\n')}`,\n    })\n\n    await this.yield(new PostProcessingTask(processor, minecraftFolder, options))\n\n    const libraries = VersionJson.resolveLibraries(versionJson.libraries)\n    await this.all(libraries.map((lib) => new InstallLibraryTask(lib, minecraftFolder, options)), {\n      throwErrorImmediately: options.throwErrorImmediately ?? false,\n      getErrorMessage: (errs) => `Errors during install libraries at ${minecraftFolder.root}: ${errs.map(errorToString).join('\\n')}`,\n    })\n  })\n}\n\nexport class PostProcessBadJarError extends Error {\n  constructor(public jarPath: string, public causeBy: Error) {\n    super(`Fail to post process bad jar: ${jarPath}`)\n  }\n\n  name = 'PostProcessBadJarError'\n}\n\nexport class PostProcessNoMainClassError extends Error {\n  constructor(public jarPath: string) {\n    super(`Fail to post process bad jar without main class: ${jarPath}`)\n  }\n\n  name = 'PostProcessNoMainClassError'\n}\n\nexport class PostProcessFailedError extends Error {\n  constructor(public jarPath: string, public commands: string[], message: string) {\n    super(message)\n  }\n\n  name = 'PostProcessFailedError'\n}\n\nconst PAUSEED = Symbol('PAUSED')\n/**\n * Post process the post processors from `InstallProfile`.\n *\n * @param processors The processor info\n * @param minecraft The minecraft location\n * @param java The java executable path\n * @throws {@link PostProcessError}\n */\nexport class PostProcessingTask extends AbortableTask<void> {\n  readonly name: string = 'postProcessing'\n\n  private pointer = 0\n\n  private _abort = () => { }\n\n  constructor(private processors: PostProcessor[], private minecraft: MinecraftFolder, private java: SpawnJavaOptions) {\n    super()\n    this.param = processors\n    this._total = processors.length\n  }\n\n  protected async findMainClass(lib: string) {\n    let zip: ZipFile | undefined\n    let mainClass: string | undefined\n    try {\n      zip = await open(lib, { lazyEntries: true })\n      for await (const entry of walkEntriesGenerator(zip)) {\n        if (entry.fileName === 'META-INF/MANIFEST.MF') {\n          const content = await readEntry(zip, entry).then((b) => b.toString())\n          mainClass = content.split('\\n')\n            .map((l) => l.split(': '))\n            .find((arr) => arr[0] === 'Main-Class')?.[1].trim()\n          break\n        }\n      }\n    } catch (e) {\n      throw new PostProcessBadJarError(lib, e as any)\n    } finally {\n      zip?.close()\n    }\n    if (!mainClass) {\n      throw new PostProcessNoMainClassError(lib)\n    }\n    return mainClass\n  }\n\n  protected async isInvalid(outputs: Required<PostProcessor>['outputs']) {\n    for (const [file, expect] of Object.entries(outputs)) {\n      const sha1 = await checksum(file, 'sha1').catch((e) => '')\n      if (!sha1) return true // if file not exist, the file is not generated\n      if (!expect) return false // if expect is empty, we just need file exists\n      const expected = expect.replace(/'/g, '')\n      if (expected !== sha1) {\n        return true\n      }\n    }\n    return false\n  }\n\n  protected async postProcess(mc: MinecraftFolder, proc: PostProcessor, javaOptions: SpawnJavaOptions) {\n    const jarRealPath = mc.getLibraryByPath(LibraryInfo.resolve(proc.jar).path)\n    const mainClass = await this.findMainClass(jarRealPath)\n    this._to = proc.jar\n    const cp = [...proc.classpath, proc.jar].map(LibraryInfo.resolve).map((p) => mc.getLibraryByPath(p.path)).join(delimiter)\n    const cmd = ['-cp', cp, mainClass, ...proc.args]\n    try {\n      await new Promise((resolve, reject) => {\n        const process = (javaOptions?.spawn ?? spawn)(javaOptions.java ?? 'java', cmd)\n        waitProcess(process).then(resolve, reject)\n        this._abort = () => {\n          reject(PAUSEED)\n          process.kill(1)\n        }\n      })\n    } catch (e) {\n      if (typeof e === 'string') {\n        throw new PostProcessFailedError(proc.jar, [javaOptions.java ?? 'java', ...cmd], e)\n      }\n      throw e\n    }\n    if (proc.outputs && await this.isInvalid(proc.outputs)) {\n      throw new PostProcessFailedError(proc.jar, [javaOptions.java ?? 'java', ...cmd], 'Validate the output of process failed!')\n    }\n  }\n\n  protected async process(): Promise<void> {\n    for (; this.pointer < this.processors.length; this.pointer++) {\n      const proc = this.processors[this.pointer]\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      if (this.isPaused) {\n        throw PAUSEED\n      }\n      if (!proc.outputs || await this.isInvalid(proc.outputs)) {\n        await this.postProcess(this.minecraft, proc, this.java)\n      }\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      if (this.isPaused) {\n        throw PAUSEED\n      }\n      this._progress = this.pointer\n      this.update(1)\n    }\n  }\n\n  protected async abort(isCancelled: boolean): Promise<void> {\n    // this.activeProcess?.kill()\n    this._abort()\n  }\n\n  protected isAbortedError(e: any): boolean {\n    return e === PAUSEED\n  }\n}\n", "import { MinecraftFolder, MinecraftLocation, Version as VersionJson } from '@xmcl/core'\nimport { open, readEntry } from '@xmcl/unzip'\nimport { DownloadTask } from './downloadTask'\nimport { BadForgeInstallerJarError, InstallForgeOptions, isForgeInstallerEntries, unpackForgeInstaller, walkForgeInstallerEntries } from './forge'\nimport { resolveLibraryDownloadUrls } from './minecraft'\nimport { InstallProfile, installByProfileTask } from './profile'\nimport { normalizeArray } from './utils'\nimport { ZipValidator } from './zipValdiator'\nimport { Task, task } from '@xmcl/task'\n\nexport class DownloadNeoForgedInstallerTask extends DownloadTask {\n  readonly installJarPath: string\n\n  constructor(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftFolder, options: InstallForgeOptions) {\n    const url = `https://maven.neoforged.net/releases/net/neoforged/${project}/${version}/${project}-${version}-installer.jar`\n\n    const library = VersionJson.resolveLibrary({\n      name: `net.neoforged:${project}:${version}:installer`,\n      downloads: {\n        artifact: {\n          url,\n          path: `net/neoforged/${project}/${version}/${project}-${version}-installer.jar`,\n          size: -1,\n          sha1: '',\n        },\n      },\n    })!\n    const mavenHost = options.mavenHost ? normalizeArray(options.mavenHost) : []\n\n    const urls = resolveLibraryDownloadUrls(library, { ...options, mavenHost })\n\n    const installJarPath = minecraft.getLibraryByPath(library.path)\n\n    super({\n      url: urls,\n      destination: installJarPath,\n      validator: new ZipValidator(),\n      agent: options.agent,\n      skipPrevalidate: options.skipPrevalidate,\n      skipRevalidate: options.skipRevalidate,\n    })\n\n    this.installJarPath = installJarPath\n    this.name = 'downloadInstaller'\n    this.param = { version }\n  }\n}\n\nexport async function installNeoForged(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftLocation, options: InstallForgeOptions): Promise<string> {\n  return installNeoForgedTask(project, version, minecraft, options).startAndWait()\n}\n\nexport function installNeoForgedTask(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftLocation, options: InstallForgeOptions): Task<string> {\n  return task('installForge', async function () {\n    const [_, forgeVersion] = version.split('-')\n    const mc = MinecraftFolder.from(minecraft)\n    const jarPath = await this.yield(new DownloadNeoForgedInstallerTask(project, version, mc, options)\n      .map(function () { return this.installJarPath }))\n\n    const zip = await open(jarPath, { lazyEntries: true, autoClose: false })\n    const entries = await walkForgeInstallerEntries(zip, forgeVersion)\n\n    if (!entries.installProfileJson) {\n      throw new BadForgeInstallerJarError(jarPath, 'install_profile.json')\n    }\n    const profile: InstallProfile = await readEntry(zip, entries.installProfileJson).then((b) => b.toString()).then(JSON.parse)\n    if (isForgeInstallerEntries(entries)) {\n      // new forge\n      const versionId = await unpackForgeInstaller(zip, entries, forgeVersion, profile, mc, jarPath, options)\n      await this.concat(installByProfileTask(profile, minecraft, options))\n      return versionId\n    } else {\n      // bad forge\n      throw new BadForgeInstallerJarError(jarPath)\n    }\n  })\n}\n", "import { ClassReader, ClassVisitor, Opcodes } from '@xmcl/asm'\nimport { MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { task } from '@xmcl/task'\nimport { getEntriesRecord, open, readAllEntries, readEntry } from '@xmcl/unzip'\nimport { writeFile } from 'fs/promises'\nimport { ensureFile, InstallOptions, SpawnJavaOptions, spawnProcess } from './utils'\n\nexport interface InstallOptifineOptions extends InstallOptions, SpawnJavaOptions {\n  /**\n   * Use \"optifine.OptiFineForgeTweaker\" instead of \"optifine.OptiFineTweaker\" for tweakClass.\n   *\n   * If you want to install upon forge, you should use this.\n   */\n  useForgeTweaker?: boolean\n}\n\n/**\n * Generate the optifine version json from provided info.\n * @param editionRelease The edition + release with _\n * @param minecraftVersion The minecraft version\n * @param launchWrapperVersion The launch wrapper version\n * @param options The install options\n * @beta Might be changed and don't break the major version\n */\nexport function generateOptifineVersion(editionRelease: string, minecraftVersion: string, launchWrapperVersion?: string, options: InstallOptifineOptions = {}): Version {\n  const id = options.versionId ?? `${minecraftVersion}-Optifine_${editionRelease}`\n  const inheritsFrom = options.inheritsFrom ?? minecraftVersion\n  const mainClass = 'net.minecraft.launchwrapper.Launch'\n  const libraries = [{ name: `optifine:Optifine:${minecraftVersion}_${editionRelease}` }]\n  if (launchWrapperVersion) {\n    libraries.unshift({ name: `optifine:launchwrapper-of:${launchWrapperVersion}` })\n  } else {\n    libraries.unshift({ name: 'net.minecraft:launchwrapper:1.12' })\n  }\n  return {\n    id,\n    inheritsFrom,\n    arguments: {\n      game: ['--tweakClass', options.useForgeTweaker ? 'optifine.OptiFineForgeTweaker' : 'optifine.OptiFineTweaker'],\n      jvm: [],\n    },\n    releaseTime: new Date().toJSON(),\n    time: new Date().toJSON(),\n    type: 'release',\n    libraries,\n    mainClass,\n    minimumLauncherVersion: 21,\n  }\n}\n\n/**\n * Install optifine by optifine installer\n *\n * @param installer The installer jar file path\n * @param minecraft The minecraft location\n * @param options The option to install\n * @beta Might be changed and don't break the major version\n * @throws {@link BadOptifineJarError}\n */\nexport function installOptifine(installer: string, minecraft: MinecraftLocation, options?: InstallOptifineOptions) {\n  return installOptifineTask(installer, minecraft, options).startAndWait()\n}\n\nexport class BadOptifineJarError extends Error {\n  constructor(\n    public optifine: string,\n    /**\n         * What entry in jar is missing\n         */\n    public entry: string,\n  ) {\n    super(`Missing entry ${entry} in optifine installer: ${optifine}`)\n  }\n\n  error = 'BadOptifineJarError'\n}\n\n/**\n * Install optifine by optifine installer task\n *\n * @param installer The installer jar file path\n * @param minecraft The minecraft location\n * @param options The option to install\n * @beta Might be changed and don't break the major version\n * @throws {@link BadOptifineJarError}\n */\nexport function installOptifineTask(installer: string, minecraft: MinecraftLocation, options: InstallOptifineOptions = {}) {\n  return task('installOptifine', async function () {\n    const mc = MinecraftFolder.from(minecraft)\n\n    // context.update(0, 100);\n\n    const zip = await open(installer)\n    const entries = await readAllEntries(zip)\n    const record = getEntriesRecord(entries)\n    // context.update(10, 100);\n\n    const entry = record['net/optifine/Config.class'] ?? record['Config.class'] ?? record['notch/net/optifine/Config.class']\n    if (!entry) {\n      throw new BadOptifineJarError(installer, 'net/optifine/Config.class')\n    }\n\n    const launchWrapperVersionEntry = record['launchwrapper-of.txt']\n    const launchWrapperVersion = launchWrapperVersionEntry\n      ? await readEntry(zip, launchWrapperVersionEntry).then((b) => b.toString())\n      : undefined\n    // context.update(15, 100);\n\n    const buf = await readEntry(zip, entry)\n    const reader = new ClassReader(buf)\n    class OptifineVisitor extends ClassVisitor {\n      fields: Record<string, any> = {}\n      visitField(access: number, name: string, desc: string, signature: string, value: any) {\n        this.fields[name] = value\n        return null\n      }\n    }\n    const visitor = new OptifineVisitor(Opcodes.ASM5)\n    reader.accept(visitor)\n    const mcversion: string = visitor.fields.MC_VERSION // 1.14.4\n    const edition: string = visitor.fields.OF_EDITION // HD_U\n    const release: string = visitor.fields.OF_RELEASE // F5\n    const editionRelease = edition + '_' + release\n\n    const versionJSON = generateOptifineVersion(editionRelease, mcversion, launchWrapperVersion, options)\n    const versionJSONPath = mc.getVersionJson(versionJSON.id)\n\n    // context.update(20, 100);\n    // write version json\n    await this.yield(task('json', async () => {\n      await ensureFile(versionJSONPath)\n      await writeFile(versionJSONPath, JSON.stringify(versionJSON, null, 4))\n    }))\n\n    const launchWrapperEntry = record[`launchwrapper-of-${launchWrapperVersion}.jar`]\n    // write launch wrapper\n    if (launchWrapperEntry) {\n      await this.yield(task('library', async () => {\n        const wrapperDest = mc.getLibraryByPath(`optifine/launchwrapper-of/${launchWrapperVersion}/launchwrapper-of-${launchWrapperVersion}.jar`)\n        await ensureFile(wrapperDest)\n        await writeFile(wrapperDest, await readEntry(zip, launchWrapperEntry))\n      }))\n    }\n\n    // write the optifine\n    await this.yield(task('jar', async () => {\n      const dest = mc.getLibraryByPath(`optifine/Optifine/${mcversion}_${editionRelease}/Optifine-${mcversion}_${editionRelease}.jar`)\n      const mcJar = mc.getVersionJar(mcversion)\n\n      await ensureFile(dest)\n      await spawnProcess(options, ['-cp', installer, 'optifine.Patcher', mcJar, installer, dest])\n    }))\n\n    return versionJSON.id\n  })\n}\n", "import { getPlatform, Platform } from '@xmcl/core'\nimport { Task, task } from '@xmcl/task'\nimport { exec } from 'child_process'\nimport { unlink } from 'fs/promises'\nimport { arch, EOL, platform, tmpdir } from 'os'\nimport { basename, join, resolve } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadTask } from './downloadTask'\nimport { DownloadBaseOptions } from '@xmcl/file-transfer'\nimport { ensureDir, missing } from './utils'\n\nexport interface JavaInfo {\n  /**\n     * Full java executable path\n     */\n  path: string\n  /**\n     * Java version string\n     */\n  version: string\n  /**\n     * Major version of java\n     */\n  majorVersion: number\n}\n\nexport interface InstallJavaOptions extends DownloadBaseOptions {\n  /**\n     * The destination of this installation\n     */\n  destination: string\n  /**\n     * The cached directory which compressed java lzma will be download to.\n     * @default os.tempdir()\n     */\n  cacheDir?: string\n  /**\n     * The platform to install. It will be auto-resolved by default.\n     * @default currentPlatform\n     */\n  platform?: Platform\n  /**\n     * Unpack lzma function. It must present, else it will not be able to unpack mojang provided LZMA.\n     */\n  unpackLZMA: UnpackLZMAFunction\n  /**\n     * The dispatcher for API\n     */\n  dispatcher?: Dispatcher\n}\n\nexport type UnpackLZMAFunction =\n    ((src: string, dest: string) => Promise<void>) |\n    ((src: string, dest: string) => Task<void>)\n\nexport class DownloadJRETask extends DownloadTask {\n  constructor(jre: DownloadInfo, dir: string, options: InstallJavaOptions) {\n    const { sha1, url } = jre\n    const filename = basename(url)\n    const downloadDestination = resolve(dir, filename)\n\n    super({\n      url,\n      destination: downloadDestination,\n      validator: {\n        algorithm: 'sha1',\n        hash: sha1,\n      },\n      agent: options.agent,\n      headers: options.headers,\n    })\n\n    this.name = 'downloadJre'\n    this.param = jre\n  }\n}\n\ninterface DownloadInfo { sha1: string; url: string; version: string }\n\n/**\n * Install JRE from Mojang offical resource. It should install jdk 8.\n * @param options The install options\n */\nexport function installJreFromMojangTask(options: InstallJavaOptions) {\n  const {\n    destination,\n    unpackLZMA,\n    cacheDir = tmpdir(),\n    platform = getPlatform(),\n  } = options\n  return task('installJreFromMojang', async function () {\n    const info: { [system: string]: { [arch: string]: { jre: DownloadInfo } } } =\n            await this.yield(task('fetchInfo', async () => {\n              const response = await request('https://launchermeta.mojang.com/mc/launcher.json', { dispatcher: options.dispatcher, throwOnError: true })\n              return response.body.json() as any\n            }))\n    const system = platform.name\n    function resolveArch() {\n      switch (platform.arch) {\n        case 'x86':\n        case 'x32': return '32'\n        case 'x64': return '64'\n        default: return '32'\n      }\n    }\n    const currentArch = resolveArch()\n\n    if (!info[system] || !info[system][currentArch] || !info[system][currentArch].jre) {\n      throw new Error('No Java package available for your platform')\n    }\n    const lzmaPath = await this.yield(new DownloadJRETask(info[system][currentArch].jre, cacheDir, options).map(function () { return this.to! }))\n    const result = unpackLZMA(lzmaPath, destination)\n    await ensureDir(destination)\n    if (result instanceof Promise) {\n      await this.yield(task('decompress', () => result))\n    } else {\n      await this.yield(result)\n    }\n    await this.yield(task('cleanup', () => unlink(lzmaPath)))\n  })\n}\n\n/**\n * Install JRE from Mojang offical resource. It should install jdk 8.\n * @param options The install options\n */\nexport function installJreFromMojang(options: InstallJavaOptions) {\n  return installJreFromMojangTask(options).startAndWait()\n}\n\n/**\n * Try to resolve a java info at this path. This will call `java -version`\n * @param path The java exectuable path.\n */\nexport async function resolveJava(path: string): Promise<JavaInfo | undefined> {\n  if (await missing(path)) { return undefined }\n\n  return new Promise((resolve) => {\n    exec(`\"${path}\" -version`, (_err, _sout, serr) => {\n      if (serr) {\n        const ver = parseJavaVersion(serr)\n        if (ver) {\n          resolve({ path, ...ver })\n        } else {\n          resolve(undefined)\n        }\n      } else {\n        resolve(undefined)\n      }\n    })\n  })\n}\n\nexport class ParseJavaVersionError extends Error {\n  name = 'ParseJavaVersionError'\n\n  constructor(message: string) { super(message) }\n}\n\n/**\n * Parse version string and major version number from stderr of java process.\n *\n * @param versionText The stderr for `java -version`\n */\nexport function parseJavaVersion(versionText: string): { version: string; majorVersion: number; patch: number } | undefined {\n  const getVersion = (str?: string) => {\n    if (!str) { return undefined }\n    const match = /(\\d+)\\.(\\d)+\\.(\\d+)(_\\d+)?/.exec(str)\n    if (match === null) { return undefined }\n    if (match[1] === '1') {\n      return {\n        version: match[0],\n        majorVersion: Number.parseInt(match[2]),\n        patch: Number.parseInt(match[4].substring(1) ?? '-1'),\n      }\n    }\n    return {\n      version: match[0],\n      majorVersion: Number.parseInt(match[1]),\n      patch: Number.parseInt(match[3]),\n    }\n  }\n  try {\n    const javaVersion = getVersion(versionText)\n    if (!javaVersion) { return undefined }\n    return javaVersion\n  } catch (e) {\n    throw new ParseJavaVersionError(`Fail to parse java version [${versionText}]: ${(e as any).message}`)\n  }\n}\n\n/**\n * Get all potential java locations for Minecraft.\n *\n * On mac/linux, it will perform `which java`. On win32, it will perform `where java`\n *\n * @returns The absolute java locations path\n */\nexport async function getPotentialJavaLocations(): Promise<string[]> {\n  const unchecked = new Set<string>()\n  const currentPlatform = platform()\n  const javaFile = currentPlatform === 'win32' ? 'javaw.exe' : 'java'\n\n  if (process.env.JAVA_HOME) {\n    unchecked.add(join(process.env.JAVA_HOME, 'bin', javaFile))\n  }\n\n  const which = () => new Promise<string>((resolve) => {\n    exec('which java', (_error, stdout) => {\n      if (!_error) resolve(stdout.replace('\\n', ''))\n      else resolve('')\n    }).once('error', () => resolve(''))\n  })\n  const where = () => new Promise<string[]>((resolve) => {\n    exec('where java', (_error, stdout) => {\n      if (!_error) resolve(stdout.split('\\r\\n'))\n      else resolve([])\n    }).once('error', () => resolve([]))\n  })\n\n  if (currentPlatform === 'win32') {\n    const out = await new Promise<string[]>((resolve) => {\n      exec('REG QUERY HKEY_LOCAL_MACHINE\\\\Software\\\\JavaSoft\\\\ /s /v JavaHome', (_error, stdout) => {\n        if (!stdout) { resolve([]) }\n        resolve(stdout.split(EOL).map((item) => item.replace(/[\\r\\n]/g, ''))\n          .filter((item) => item != null && item !== undefined)\n          .filter((item) => item[0] === ' ')\n          .map((item) => `${item.split('    ')[3]}\\\\bin\\\\javaw.exe`))\n      })\n    })\n    for (const o of [...out, ...await where()]) {\n      unchecked.add(o)\n    }\n    const currentArch = arch()\n    unchecked.add('C:\\\\Program Files (x86)\\\\Minecraft Launcher\\\\runtime\\\\jre-x64/X86')\n    unchecked.add(`C:\\\\Program Files (x86)\\\\Minecraft Launcher\\\\runtime\\\\jre-legacy\\\\windows-${currentArch}\\\\jre-legacy`)\n  } else if (currentPlatform === 'darwin') {\n    unchecked.add('/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java')\n    unchecked.add(await which())\n  } else {\n    unchecked.add(await which())\n  }\n\n  const checkingList = Array.from(unchecked).filter((jPath) => typeof jPath === 'string').filter((p) => p !== '')\n\n  return checkingList\n}\n\n/**\n * Scan local java version on the disk.\n *\n * It will check if the passed `locations` are the home of java.\n * Notice that the locations should not be the executable, but the path of java installation, like JAVA_HOME.\n *\n * This will call `getPotentialJavaLocations` and then `resolveJava`\n *\n * @param locations The location (like java_home) want to check.\n * @returns All validate java info\n */\nexport async function scanLocalJava(locations: string[]): Promise<JavaInfo[]> {\n  const unchecked = new Set(locations)\n  const potential = await getPotentialJavaLocations()\n  potential.forEach((p) => unchecked.add(p))\n\n  const checkingList = [...unchecked].filter((jPath) => typeof jPath === 'string').filter((p) => p !== '')\n\n  const javas = await Promise.all(checkingList.map((jPath) => resolveJava(jPath)))\n  return javas.filter(((j) => j !== undefined) as (j?: JavaInfo) => j is JavaInfo)\n}\n", "import { getPlatform, Platform } from '@xmcl/core'\nimport { ChecksumValidatorOptions, DownloadBaseOptions, DownloadOptions, Validator } from '@xmcl/file-transfer'\nimport { Task, task } from '@xmcl/task'\nimport { link } from 'fs/promises'\nimport { dirname, join } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { URL } from 'url'\nimport { DownloadTask } from './downloadTask'\nimport { ensureDir, ParallelTaskOptions } from './utils'\n/**\n * Contain all java runtimes basic info\n */\nexport interface JavaRuntimes {\n  linux: JavaRuntimeTargets\n  'linux-i386': JavaRuntimeTargets\n  'mac-os': JavaRuntimeTargets\n  'windows-x64': JavaRuntimeTargets\n  'windows-x86': JavaRuntimeTargets\n}\n\nexport interface JavaRuntimeTargets {\n  'java-runtime-alpha': JavaRuntimeTarget[]\n  'java-runtime-beta': JavaRuntimeTarget[]\n  'jre-legacy': JavaRuntimeTarget[]\n  'minecraft-java-exe': JavaRuntimeTarget[]\n  [key: string]: JavaRuntimeTarget[]\n}\n\nexport enum JavaRuntimeTargetType {\n  /**\n     * The legacy java version\n     */\n  Legacy = 'jre-legacy',\n  /**\n     * The new java environment, which is the java 16\n     */\n  Alpha = 'java-runtime-alpha',\n  Beta = 'java-runtime-beta',\n  JavaExe = 'minecraft-java-exe',\n}\n\n/**\n * Represent a java runtime\n */\nexport interface JavaRuntimeTarget {\n  /**\n     * Guessing this is the flight of this java runtime\n     */\n  availability: {\n    group: number\n    progress: number\n  }\n  /**\n     * The manifest detail of the resource\n     */\n  manifest: DownloadInfo\n  /**\n     * The basic version info of the manifest\n     */\n  version: {\n    /**\n         * The name of the version. e.g. `8u51`, `12`, `16.0.1.9.1`\n         */\n    name: string\n    /**\n         * The date string (UTC)\n         */\n    released: string\n  }\n}\n\nexport interface Entry {\n  type: 'file' | 'link' | 'directory'\n}\n\nexport interface LinkEntry extends Entry {\n  type: 'link'\n  /**\n     * The link target\n     */\n  target: string\n}\n\nexport interface DirectoryEntry extends Entry {\n  type: 'directory'\n}\n\nexport interface DownloadInfo {\n  /**\n     * The sha info of the resource\n     */\n  sha1: string\n  /**\n     * The size of the resource\n     */\n  size: number\n  /**\n     * The url to download resource\n     */\n  url: string\n}\n\nexport interface FileEntry extends Entry {\n  type: 'file'\n  executable: boolean\n  downloads: {\n    /**\n         * The raw format of the file\n         */\n    raw: DownloadInfo\n    /**\n         * The lzma format of the file\n         */\n    lzma?: DownloadInfo\n  }\n}\n\nexport type AnyEntry = FileEntry | DirectoryEntry | LinkEntry\n\n/**\n * Contains info about every files in this java runtime\n */\nexport interface JavaRuntimeManifest {\n  target: JavaRuntimeTargetType | string\n  /**\n     * The files of the java runtime\n     */\n  files: Record<string, AnyEntry>\n\n  version: JavaRuntimeTarget['version']\n}\n\nexport const DEFAULT_RUNTIME_ALL_URL = 'https://launchermeta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json'\n\nfunction normalizeUrls(url: string, fileHost?: string | string[]): string[] {\n  if (!fileHost) {\n    return [url]\n  }\n  if (typeof fileHost === 'string') {\n    const u = new URL(url)\n    u.hostname = fileHost\n    const result = u.toString()\n    if (result !== url) {\n      return [result, url]\n    }\n    return [result]\n  }\n  const result = fileHost.map((host) => {\n    const u = new URL(url)\n    u.hostname = host\n    return u.toString()\n  })\n\n  if (result.indexOf(url) === -1) {\n    result.push(url)\n  }\n\n  return result\n}\n\nexport interface FetchJavaRuntimeManifestOptions extends DownloadBaseOptions {\n  /**\n     * The alternative download host for the file\n     */\n  apiHost?: string | string[]\n  /**\n     * The url of the all runtime json\n     */\n  url?: string\n  /**\n     * The platform to install. It will be auto-resolved by default.\n     * @default getPlatform()\n     */\n  platform?: Platform\n  /**\n     * The install java runtime type\n     * @default InstallJavaRuntimeTarget.Next\n     */\n  target?: JavaRuntimeTargetType | string\n  /**\n     * The index manifest of the java runtime. If this is not presented, it will fetch by platform and all platform url.\n     */\n  manifestIndex?: JavaRuntimes\n  /**\n     * The dispatcher to request API\n     */\n  dispatcher?: Dispatcher\n}\n\n/**\n * Fetch java runtime manifest. It should be able to resolve to your platform, or you can assign the platform.\n *\n * Also, you should assign the target to download, or it will use the latest java 16.\n * @param options The options of fetch runtime manifest\n */\nexport async function fetchJavaRuntimeManifest(options: FetchJavaRuntimeManifestOptions = {}): Promise<JavaRuntimeManifest> {\n  let manifestIndex = options.manifestIndex\n  if (!manifestIndex) {\n    const response = await request(normalizeUrls(options.url ?? DEFAULT_RUNTIME_ALL_URL, options.apiHost)[0], { dispatcher: options.dispatcher, throwOnError: true })\n    manifestIndex = await response.body.json() as JavaRuntimes\n  }\n  const manifest = manifestIndex\n  const platform = options.platform ?? getPlatform()\n  const runtimeTarget = options.target ?? JavaRuntimeTargetType.Beta\n  const resolveTarget = () => {\n    if (platform.name === 'windows') {\n      if (platform.arch === 'x64') {\n        return manifest['windows-x64']\n      }\n      if (platform.arch === 'x86' || platform.arch === 'x32') {\n        return manifest['windows-x86']\n      }\n    }\n    if (platform.name === 'osx') {\n      return manifest['mac-os']\n    }\n    if (platform.name === 'linux') {\n      if (platform.arch === 'x86' || platform.arch === 'x32') {\n        return manifest['linux-i386']\n      }\n      if (platform.arch === 'x64') {\n        return manifest.linux\n      }\n    }\n    throw new Error('Cannot resolve platform')\n  }\n  const targets = resolveTarget()[runtimeTarget]\n  if (targets && targets.length > 0) {\n    const target = targets[0]\n    const manifestUrl = normalizeUrls(target.manifest.url, options.apiHost)[0]\n    const response = await request(manifestUrl, { dispatcher: options.dispatcher, throwOnError: true })\n    const manifest: JavaRuntimeManifest = await response.body.json() as any\n    const result: JavaRuntimeManifest = {\n      files: manifest.files,\n      target: runtimeTarget,\n      version: target.version,\n    }\n    return result\n  } else {\n    throw new Error()\n  }\n}\n\nexport interface InstallJavaRuntimeOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n     * The alternative download host for the file\n     */\n  apiHost?: string | string[]\n  /**\n     * The destination of this installation\n     */\n  destination: string\n  /**\n     * The actual manfiest to install.\n     */\n  manifest: JavaRuntimeManifest\n  /**\n     * Download lzma compressed version instead of raw version.\n     * - If `true`, it will just download lzma file version, you need to decompress by youself!\n     * - If `Function`, it will use that function to decompress the file!\n     */\n  lzma?: boolean | ((compressedFilePath: string, targetPath: string) => Promise<void>)\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n\n/**\n * Install java runtime from java runtime manifest\n * @param options The options to install java runtime\n */\nexport function installJavaRuntimeTask(options: InstallJavaRuntimeOptions): Task<void> {\n  return task('installJavaRuntime', async function () {\n    const destination = options.destination\n    const manifest = options.manifest\n    const decompressFunction = typeof options.lzma === 'function' ? options.lzma : undefined\n    const downloadLzma = !!options.lzma\n    class DownloadAndDecompressTask extends DownloadTask {\n      constructor(options: DownloadOptions) {\n        super(options)\n      }\n\n      async runTask() {\n        const result = await super.runTask()\n        if (this._total === this._progress) {\n          const dest = this.options.destination.substring(0, this.options.destination.length - 5)\n          await decompressFunction!(this.options.destination, dest)\n        }\n        return result\n      }\n    }\n    await this.all(Object.entries(manifest.files)\n      .filter(([file, entry]) => entry.type === 'file')\n      .map(([file, entry]) => {\n        const fEntry = entry as FileEntry\n        const downloadInfo = (downloadLzma && fEntry.downloads.lzma) ? fEntry.downloads.lzma : fEntry.downloads.raw\n        const isLzma = downloadInfo === fEntry.downloads.lzma\n        const dest = isLzma ? (join(destination, file) + '.lzma') : join(destination, file)\n        const urls = normalizeUrls(downloadInfo.url, options.apiHost)\n        const hash = downloadInfo.sha1\n        const downloadOptions: DownloadOptions = {\n          url: urls,\n          validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash }) || { algorithm: 'sha1', hash },\n          destination: dest,\n          agent: options.agent,\n          headers: options.headers,\n        }\n        return isLzma && decompressFunction\n          ? new DownloadAndDecompressTask(downloadOptions).setName('download')\n          : new DownloadTask(downloadOptions).setName('download')\n      }), {\n      throwErrorImmediately: options.throwErrorImmediately,\n      getErrorMessage: (e) => `Fail to install java runtime ${manifest.version.name} on ${manifest.target}`,\n    })\n    await Promise.all(Object.entries(manifest.files)\n      .filter(([file, entry]) => entry.type !== 'file')\n      .map(async ([file, entry]) => {\n        const dest = join(destination, file)\n        if (entry.type === 'directory') {\n          await ensureDir(dest)\n        } else if (entry.type === 'link') {\n          await link(dest, join(dirname(dest), entry.target)).catch(() => { })\n        }\n      }))\n  })\n}\n", "import { diagnoseFile, Issue, LibraryIssue, MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { InstallProfile, resolveProcessors, PostProcessor } from './profile'\n\nexport type InstallIssues = ProcessorIssue | LibraryIssue\n\n/**\n * The processor issue\n */\nexport interface ProcessorIssue extends Issue {\n  role: 'processor'\n\n  /**\n     * The processor\n     */\n  processor: PostProcessor\n}\n\nexport interface InstallProfileIssueReport {\n  minecraftLocation: MinecraftFolder\n  installProfile: InstallProfile\n  issues: InstallIssues[]\n}\n\n/**\n * Diagnose a install profile status. Check if it processor output correctly processed.\n *\n * This can be used for check if forge correctly installed when minecraft >= 1.13\n * @beta\n *\n * @param installProfile The install profile.\n * @param minecraftLocation The minecraft location\n */\nexport async function diagnoseInstall(installProfile: InstallProfile, minecraftLocation: MinecraftLocation) {\n  const mc = MinecraftFolder.from(minecraftLocation)\n  const report: InstallProfileIssueReport = {\n    minecraftLocation: mc,\n    installProfile,\n    issues: [],\n  }\n  const issues = report.issues\n  const processors: PostProcessor[] = resolveProcessors('client', installProfile, mc)\n  await Promise.all(Version.resolveLibraries(installProfile.libraries).map(async (lib) => {\n    const libPath = mc.getLibraryByPath(lib.download.path)\n    const issue = await diagnoseFile({\n      role: 'library',\n      file: libPath,\n      expectedChecksum: lib.download.sha1,\n      hint: 'Problem on install_profile! Please consider to use Installer.installByProfile to fix.',\n    })\n    if (issue) {\n      issues.push(Object.assign(issue, { library: lib }))\n    }\n  }))\n  for (const proc of processors) {\n    if (proc.outputs) {\n      for (const [file, checksum] of Object.entries(proc.outputs)) {\n        const issue = await diagnoseFile({\n          role: 'processor',\n          file,\n          expectedChecksum: checksum.replace(/'/g, ''),\n          hint: 'Re-install this installer profile!',\n        })\n        if (issue) {\n          issues.push(Object.assign(issue, { processor: proc }))\n        }\n      }\n    }\n  }\n  return report\n}\n", "import { MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { writeFile } from 'fs/promises'\nimport { Dispatcher, request, CacheStorage } from 'undici'\nimport { ensureFile } from './utils'\n\nexport const DEFAULT_META_URL = 'https://meta.quiltmc.org'\n\nexport interface InstallQuiltVersionOptions {\n  minecraftVersion: string\n  version: string\n  minecraft: MinecraftLocation\n\n  dispatcher?: Dispatcher\n}\n\nexport async function installQuiltVersion(options: InstallQuiltVersionOptions) {\n  const url = `${DEFAULT_META_URL}/v3/versions/loader/${options.minecraftVersion}/${options.version}/profile/json`\n  const response = await request(url, { dispatcher: options.dispatcher })\n  const content: Version = await response.body.json() as any\n\n  const minecraft = MinecraftFolder.from(options.minecraft)\n  const versionName = content.id\n\n  const jsonPath = minecraft.getVersionJson(versionName)\n\n  const hashed = content.libraries.find((l) => l.name.startsWith('org.quiltmc:hashed'))\n  if (hashed) {\n    hashed.name = hashed.name.replace('org.quiltmc:hashed', 'net.fabricmc:intermediary')\n    if ('url' in hashed) {\n      hashed.url = 'https://maven.fabricmc.net/'\n    }\n  }\n\n  await ensureFile(jsonPath)\n  await writeFile(jsonPath, JSON.stringify(content))\n\n  return versionName\n}\n\nexport interface GetQuiltOptions {\n  dispatcher?: Dispatcher\n}\n\nexport interface QuiltArtifactVersion {\n  separator: string\n  build: number\n  /**\n   * e.g. \"org.quiltmc:quilt-loader:0.16.1\",\n   */\n  maven: string\n  version: string\n}\n\nexport async function getQuiltVersionsList(options?: GetQuiltOptions): Promise<QuiltArtifactVersion[]> {\n  const response = await request(`${DEFAULT_META_URL}/v3/versions/loader`, { dispatcher: options?.dispatcher, throwOnError: true })\n  const content: QuiltArtifactVersion[] = await response.body.json() as any\n  return content\n}\n", "import { BaseTask, CancelledError, TaskState } from '@xmcl/task'\nimport { openEntryReadStream } from '@xmcl/unzip'\nimport { createWriteStream } from 'fs'\nimport { join } from 'path'\nimport { Readable, Writable } from 'stream'\nimport { pipeline } from 'stream/promises'\nimport { Entry, ZipFile } from 'yauzl'\nimport { ensureFile } from './utils'\n\nexport interface EntryResolver {\n  (entry: Entry): Promise<string> | string\n}\n\nexport function getDefaultEntryResolver(): EntryResolver {\n  return (e) => e.fileName\n}\n\nexport class UnzipTask extends BaseTask<void> {\n  private streams: [Readable, Writable][] = []\n  private _onCancelled = () => { }\n\n  constructor(readonly zipFile: ZipFile, readonly entries: Entry[], destination: string, readonly resolver: EntryResolver = getDefaultEntryResolver(), readonly interpreter: (input: Readable, file: string) => void = () => { }) {\n    super()\n    this._to = destination\n  }\n\n  protected async handleEntry(entry: Entry, relativePath: string) {\n    const file = join(this.to!, relativePath)\n    if (this._state === TaskState.Cancelled) {\n      throw new CancelledError()\n    }\n\n    const readStream = await openEntryReadStream(this.zipFile, entry)\n    if (this.isCancelled) {\n      throw new CancelledError()\n    }\n    if (this._state === TaskState.Paused) {\n      readStream.pause()\n    }\n\n    await ensureFile(file)\n    this.interpreter(readStream, file)\n    const writeStream = createWriteStream(file)\n    readStream.on('data', (buf: Buffer) => {\n      this._progress += buf.length\n      this.update(buf.length)\n    })\n    this.streams.push([readStream, writeStream])\n    await pipeline(readStream, writeStream)\n  }\n\n  protected async runTask(): Promise<void> {\n    const promises: Promise<void>[] = []\n\n    for (const e of this.entries) {\n      const path = await this.resolver(e)\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      this._total += e.uncompressedSize\n      promises.push(this.handleEntry(e, path))\n    }\n\n    this.update(0)\n\n    try {\n      await Promise.all(promises)\n    } catch (e) {\n      if (e instanceof CancelledError) {\n        this._onCancelled()\n      }\n      throw e\n    }\n  }\n\n  protected cancelTask(): Promise<void> {\n    for (const [read, write] of this.streams) {\n      read.unpipe()\n      read.destroy(new CancelledError())\n      this.zipFile.close()\n      write.destroy(new CancelledError())\n    }\n    return new Promise((resolve) => {\n      this._onCancelled = resolve\n    })\n  }\n\n  protected async pauseTask(): Promise<void> {\n    const promise = Promise.all(this.streams.map(([read]) => new Promise((resolve) =>\n      read.once('pause', resolve))))\n    for (const [read] of this.streams) {\n      read.pause()\n    }\n    await promise\n  }\n\n  protected async resumeTask(): Promise<void> {\n    const promise = Promise.all(this.streams.map(([read]) => new Promise((resolve) =>\n      read.once('readable', resolve))))\n    for (const [read] of this.streams) {\n      read.resume()\n    }\n    await promise\n  }\n}\n", "import { MinecraftFolder, MinecraftLocation, LibraryInfo } from '@xmcl/core'\nimport { DownloadBaseOptions } from '@xmcl/file-transfer'\nimport { Task, task, AbortableTask, CancelledError } from '@xmcl/task'\nimport { writeFile } from 'fs/promises'\nimport { dirname } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadTask } from './downloadTask'\nimport { ensureDir } from './utils'\n\nexport interface LabyModManifest {\n  labyModVersion: string\n  commitReference: string\n  sha1: string\n  releaseTime: number\n  size: number\n\n  assets: {\n    shader: string\n    common: string\n    fonts: string\n    'vanilla-theme': string\n    'fancy-theme': string\n    i18n: string\n  }\n\n  minecraftVersions: MinecraftVersion[]\n}\n\ninterface MinecraftVersion {\n  tag: string\n  version: string\n  index: number\n  type: string\n  runtime: {\n    name: string\n    version: number\n  }\n  customManifestUrl: string\n}\n\nexport async function getLabyModManifest(env = 'production', options?: { dispatcher?: Dispatcher }): Promise<LabyModManifest> {\n  const url = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/manifest/${env}/latest.json`\n  const res = await request(url, options)\n  return await res.body.json() as any\n}\n\nexport interface InstallLabyModOptions extends DownloadBaseOptions {\n  dispatcher?: Dispatcher\n  environment?: string\n}\n\nclass JsonTask extends AbortableTask<string> {\n  private controller = new AbortController()\n\n  constructor(private manifest: LabyModManifest, private tag: string, private folder: MinecraftFolder, private environment: string, private dispatcher?: Dispatcher) {\n    super()\n    this.name = 'json'\n    this.param = { version: tag }\n  }\n\n  protected async process(): Promise<string> {\n    this.controller = new AbortController()\n    const librariesUrl = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/libraries/${this.environment}.json`\n    const versionInfo = this.manifest.minecraftVersions.find((v) => v.tag === this.tag)!\n\n    interface LibInfo {\n      name: string\n      url: string\n      minecraftVersion: string\n      sha1: string\n      size: number\n      natives: any[]\n      resolvedAt: number\n    }\n    // Get version json and merge with libraries\n    const libraries: LibInfo[] = await request(librariesUrl, { dispatcher: this.dispatcher, signal: this.controller.signal })\n      .then((res) => res.body.json() as any)\n      .then((res) => res.libraries as LibInfo[])\n      .then((libs) => libs.filter(lib => lib.minecraftVersion === 'all' || lib.minecraftVersion === this.tag))\n    const versionJson = await request(versionInfo.customManifestUrl, { dispatcher: this.dispatcher, signal: this.controller.signal }).then((res) => res.body.json() as any)\n\n    versionJson.libraries.push(...libraries.map((l) => ({\n      name: l.name,\n      downloads: {\n        artifact: {\n          path: LibraryInfo.resolve(l.name).path,\n          sha1: l.sha1,\n          size: l.size,\n          url: l.url,\n        },\n      },\n    })), {\n      name: `net.labymod:LabyMod:${this.manifest.labyModVersion}`,\n      downloads: {\n        artifact: {\n          path: `net/labymod/LabyMod/${this.manifest.labyModVersion}/LabyMod-${this.manifest.labyModVersion}.jar`,\n          sha1: this.manifest.sha1,\n          size: this.manifest.size,\n          url: `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/download/labymod4/${this.environment}/${this.manifest.commitReference}.jar`,\n        },\n      },\n    })\n    versionJson.id = `LabyMod-4-${this.tag}-${this.manifest.commitReference}`\n\n    // write json to file\n    const versionPath = this.folder.getPath('versions', versionJson.id, `${versionJson.id}.json`)\n    await ensureDir(dirname(versionPath))\n    await writeFile(versionPath, JSON.stringify(versionJson, null, 4))\n\n    return versionJson.id\n  }\n\n  protected abort(isCancelled: boolean): void {\n    this.controller.abort(new CancelledError())\n  }\n\n  protected isAbortedError(e: any): boolean {\n    return e instanceof CancelledError\n  }\n}\n\nexport function installLabyMod4Task(manifest: LabyModManifest, tag: string, minecraft: MinecraftLocation, options?: InstallLabyModOptions): Task<string> {\n  return task('installLabyMod', async function () {\n    const folder = MinecraftFolder.from(minecraft)\n    const environment = options?.environment ?? 'production'\n\n    const versionId = await this.yield(new JsonTask(manifest, tag, folder, environment, options?.dispatcher))\n\n    // Download assets\n    for (const [name, hash] of Object.entries(manifest.assets)) {\n      const url = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/download/assets/labymod4/${environment}/${manifest.commitReference}/${name}/${hash}.jar`\n      const destination = folder.getPath('labymod-neo', 'assets', `${name}.jar`)\n      await this.yield(new DownloadTask({\n        url,\n        destination,\n        validator: { algorithm: 'sha1', hash },\n        agent: options?.agent,\n        headers: options?.headers,\n      }).setName('asset', { name }))\n    }\n\n    return versionId\n  })\n}\n\nexport function installLaby4Mod(manifest: LabyModManifest, tag: string, minecraft: MinecraftLocation, options?: InstallLabyModOptions): Promise<string> {\n  return installLabyMod4Task(manifest, tag, minecraft, options).startAndWait()\n}\n"],
  "mappings": "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",
  "names": ["e", "process", "resolve", "MinecraftFolder", "writeFile", "request", "LiteloaderVersionList", "request", "installLiteloader", "MinecraftFolder", "writeFile", "LibraryInfo", "MinecraftFolder", "VersionJson", "task", "open", "readEntry", "writeFile", "dirname", "join", "request", "MinecraftFolder", "task", "readFile", "stat", "writeFile", "join", "request", "request", "task", "MinecraftFolder", "_a", "writeFile", "readFile", "join", "download", "stat", "MinecraftFolder", "VersionJson", "AbortableTask", "task", "open", "spawn", "readFile", "dirname", "dirname", "task", "MinecraftFolder", "readFile", "VersionJson", "AbortableTask", "open", "resolve", "process", "spawn", "VersionJson", "join", "LibraryInfo", "writeFile", "readEntry", "dirname", "task", "MinecraftFolder", "open", "request", "MinecraftFolder", "VersionJson", "open", "readEntry", "task", "VersionJson", "MinecraftFolder", "open", "readEntry", "MinecraftFolder", "task", "open", "readEntry", "writeFile", "task", "MinecraftFolder", "open", "readEntry", "access", "writeFile", "task", "join", "request", "platform", "task", "request", "resolve", "join", "getPlatform", "task", "dirname", "join", "request", "URL", "JavaRuntimeTargetType", "URL", "result", "request", "platform", "getPlatform", "manifest", "task", "options", "join", "dirname", "MinecraftFolder", "Version", "MinecraftFolder", "Version", "checksum", "MinecraftFolder", "writeFile", "request", "request", "MinecraftFolder", "writeFile", "CancelledError", "openEntryReadStream", "createWriteStream", "join", "pipeline", "join", "CancelledError", "openEntryReadStream", "createWriteStream", "pipeline", "resolve", "MinecraftFolder", "LibraryInfo", "task", "AbortableTask", "CancelledError", "writeFile", "dirname", "request", "request", "AbortableTask", "LibraryInfo", "dirname", "writeFile", "CancelledError", "task", "MinecraftFolder"]
}
