mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-01 08:32:01 +00:00
26f5d40819
- Replace Webpack with Vite for faster client bundling and HMR. - Migrate tests from Jest to Vitest and update configuration. - Update Web Worker instantiation to standard ESM syntax. - Implement Env utility in `src/core` for safe, hybrid environment variable access (Vite vs Node). - Refactor configuration loaders to remove direct `process.env` dependencies in shared code. - Update TypeScript environment definitions and project scripts for the new toolchain. - Remove the [depracated usage of the husky](https://github.com/typicode/husky/releases/tag/v9.0.1). ## Description: migrate build system to Vite and test runner to Vitest & Remove depracated husky usage ## Please complete the following: - [X] I have added screenshots for all UI updates - [X] I process any text displayed to the user through translateText() and I've added it to the en.json file - [ ] I have added relevant tests to the test directory - [X] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: wraith4081 --------- Co-authored-by: evanpelle <evanpelle@gmail.com>
74 lines
1.9 KiB
TypeScript
74 lines
1.9 KiB
TypeScript
import { GameMapType } from "./Game";
|
|
import { GameMapLoader, MapData } from "./GameMapLoader";
|
|
|
|
export class FetchGameMapLoader implements GameMapLoader {
|
|
private maps: Map<GameMapType, MapData>;
|
|
|
|
public constructor(
|
|
private readonly prefix: string,
|
|
private readonly cacheBuster?: string,
|
|
) {
|
|
this.maps = new Map<GameMapType, MapData>();
|
|
}
|
|
|
|
public getMapData(map: GameMapType): MapData {
|
|
const cachedMap = this.maps.get(map);
|
|
if (cachedMap) {
|
|
return cachedMap;
|
|
}
|
|
|
|
const key = Object.keys(GameMapType).find(
|
|
(k) => GameMapType[k as keyof typeof GameMapType] === map,
|
|
);
|
|
const fileName = key?.toLowerCase();
|
|
|
|
if (!fileName) {
|
|
throw new Error(`Unknown map: ${map}`);
|
|
}
|
|
|
|
const mapData = {
|
|
mapBin: () => this.loadBinaryFromUrl(this.url(fileName, "map.bin")),
|
|
map4xBin: () => this.loadBinaryFromUrl(this.url(fileName, "map4x.bin")),
|
|
map16xBin: () => this.loadBinaryFromUrl(this.url(fileName, "map16x.bin")),
|
|
manifest: () => this.loadJsonFromUrl(this.url(fileName, "manifest.json")),
|
|
webpPath: async () => this.url(fileName, "thumbnail.webp"),
|
|
} satisfies MapData;
|
|
|
|
this.maps.set(map, mapData);
|
|
return mapData;
|
|
}
|
|
|
|
private url(map: string, path: string) {
|
|
let url = `${this.prefix}/${map}/${path}`;
|
|
|
|
if (this.cacheBuster) {
|
|
url += `${url.includes("?") ? "&" : "?"}v=${encodeURIComponent(
|
|
this.cacheBuster.trim(),
|
|
)}`;
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
private async loadBinaryFromUrl(url: string) {
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to load ${url}: ${response.statusText}`);
|
|
}
|
|
|
|
const data = await response.arrayBuffer();
|
|
return new Uint8Array(data);
|
|
}
|
|
|
|
private async loadJsonFromUrl(url: string) {
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to load ${url}: ${response.statusText}`);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
}
|