mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-15 23:24:52 +09:00
Replace ESLint, typescript-eslint, eslint-plugin-node and the flat config helpers with vite-plus, which runs Oxlint for vp lint. The rules are carried over from eslint.config.mjs by @oxlint/migrate into the lint section of the root vite.config.ts. The formatting rules ESLint deprecated run as @stylistic rules through Oxlint's JS plugin support, and disable comments naming them are updated to the @stylistic names. @stylistic understands TypeScript syntax that the core rules skipped, so the autofix adds missing semicolons and spaces in type literals and aliases. Leading | and & in multiline types stay where they were. Oxlint's node/no-sync also reports identifiers ending in Sync that are not calls. The test helper techSync is renamed and the two other names are ignored. Refs #1127 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import { Static, Type } from "@sinclair/typebox";
|
|
import { FullVersion, FullVersionSchema } from "../data/version.js";
|
|
|
|
const LATEST_RELEASES_URL = "https://factorio.com/api/latest-releases";
|
|
|
|
/**
|
|
* The set of builds (e.g. alpha, demo, headless, expansion) and their version
|
|
* for a single release channel.
|
|
*/
|
|
export const LatestReleaseBuildsSchema = Type.Record(Type.String(), FullVersionSchema);
|
|
|
|
/**
|
|
* The latest released version of each build, keyed by release channel name
|
|
* (e.g. "stable" and "experimental").
|
|
*/
|
|
export const LatestReleasesSchema = Type.Record(Type.String(), LatestReleaseBuildsSchema);
|
|
|
|
export type LatestReleases = Static<typeof LatestReleasesSchema>;
|
|
|
|
/**
|
|
* Fetch the latest stable and experimental factorio releases
|
|
*
|
|
* @returns The latest version of each build keyed by release channel
|
|
* @throws Network errors and non-ok status responses
|
|
*/
|
|
export async function fetchLatestReleases(): Promise<LatestReleases> {
|
|
let res;
|
|
|
|
try {
|
|
res = await fetch(LATEST_RELEASES_URL);
|
|
} catch (err) {
|
|
throw new Error(`Failed to fetch Factorio releases from ${LATEST_RELEASES_URL}: ${err}`);
|
|
}
|
|
|
|
if (!res.ok) {
|
|
throw new Error(
|
|
`Failed to fetch Factorio releases from ${LATEST_RELEASES_URL}: HTTP ${res.status} ${res.statusText}`
|
|
);
|
|
}
|
|
|
|
return await res.json() as LatestReleases;
|
|
}
|
|
|
|
/**
|
|
* Resolve a release channel to a concrete factorio version
|
|
*
|
|
* @param releases Releases data as returned by {@link fetchLatestReleases}
|
|
* @param channel Release channel name, e.g. "stable" or "experimental"
|
|
* @param build Build to read the version of, defaults to the headless build
|
|
* @returns The version for the channel, or undefined if it cannot be resolved
|
|
*/
|
|
export function resolveReleaseChannel(
|
|
releases: LatestReleases,
|
|
channel: string,
|
|
build = "headless",
|
|
): FullVersion | undefined {
|
|
const builds = releases[channel];
|
|
if (!builds) {
|
|
return undefined;
|
|
}
|
|
return (builds[build] ?? Object.values(builds)[0]) as FullVersion | undefined;
|
|
}
|