From 6b42a31eaad80e0e4501d098090247adccaf55a1 Mon Sep 17 00:00:00 2001
From: scamiv <6170744+scamiv@users.noreply.github.com>
Date: Sun, 22 Mar 2026 02:03:23 +0100
Subject: [PATCH] Migrate runtime asset references to versioned URLs
---
src/client/AccountModal.ts | 3 +-
src/client/FlagInput.ts | 10 ++-
src/client/FlagInputModal.ts | 5 +-
src/client/HelpModal.ts | 81 ++++++++++---------
src/client/LangSelector.ts | 7 +-
src/client/LanguageModal.ts | 3 +-
src/client/NewsModal.ts | 2 +-
src/client/SinglePlayerModal.ts | 3 +-
src/client/components/Footer.ts | 5 +-
.../baseComponents/ranking/PlayerRow.ts | 17 ++--
src/client/components/map/MapDisplay.ts | 4 +-
src/client/graphics/layers/NameLayer.ts | 3 +-
.../graphics/layers/PlayerInfoOverlay.ts | 3 +-
src/client/graphics/layers/PlayerPanel.ts | 3 +-
src/core/CustomFlag.ts | 3 +-
15 files changed, 88 insertions(+), 64 deletions(-)
diff --git a/src/client/AccountModal.ts b/src/client/AccountModal.ts
index 0268d21d2..0536c0a58 100644
--- a/src/client/AccountModal.ts
+++ b/src/client/AccountModal.ts
@@ -5,6 +5,7 @@ import {
PlayerStatsTree,
UserMeResponse,
} from "../core/ApiSchemas";
+import { assetUrl } from "../core/AssetUrls";
import { getServerConfigFromClient } from "../core/configuration/ConfigLoader";
import { fetchPlayerById, getUserMe } from "./Api";
import { discordLogin, logOut, sendMagicLink } from "./Auth";
@@ -274,7 +275,7 @@ export class AccountModal extends BaseModal {
class="w-full px-6 py-4 text-white bg-[#5865F2] hover:bg-[#4752C4] border border-transparent rounded-xl focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[#5865F2] transition-colors duration-200 flex items-center justify-center gap-3 group relative overflow-hidden shadow-lg hover:shadow-[#5865F2]/20"
>
diff --git a/src/client/FlagInput.ts b/src/client/FlagInput.ts
index 0622937cf..d363f186e 100644
--- a/src/client/FlagInput.ts
+++ b/src/client/FlagInput.ts
@@ -1,5 +1,6 @@
import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
+import { assetUrl } from "../core/AssetUrls";
import { renderPlayerFlag } from "../core/CustomFlag";
import { FlagSchema } from "../core/Schemas";
import { translateText } from "./Utils";
@@ -120,12 +121,15 @@ export class FlagInput extends LitElement {
renderPlayerFlag(this.flag, preview);
} else {
const img = document.createElement("img");
- img.src = this.flag ? `/flags/${this.flag}.svg` : `/flags/xx.svg`;
+ const fallbackFlagUrl = assetUrl("flags/xx.svg");
+ img.src = this.flag
+ ? assetUrl(`flags/${this.flag}.svg`)
+ : fallbackFlagUrl;
img.className = "w-full h-full object-cover pointer-events-none";
img.draggable = false;
img.onerror = () => {
- if (!img.src.endsWith("/flags/xx.svg")) {
- img.src = "/flags/xx.svg";
+ if (!img.src.endsWith(fallbackFlagUrl)) {
+ img.src = fallbackFlagUrl;
}
};
preview.appendChild(img);
diff --git a/src/client/FlagInputModal.ts b/src/client/FlagInputModal.ts
index 8451b4e5d..217d17da8 100644
--- a/src/client/FlagInputModal.ts
+++ b/src/client/FlagInputModal.ts
@@ -1,6 +1,7 @@
import { html } from "lit";
import { customElement, query, state } from "lit/decorators.js";
import Countries from "resources/countries.json" with { type: "json" };
+import { assetUrl } from "../core/AssetUrls";
import { translateText } from "./Utils";
import { BaseModal } from "./components/BaseModal";
import { modalHeader } from "./components/ui/ModalHeader";
@@ -61,11 +62,11 @@ export class FlagInputModal extends BaseModal {
{
const img = e.currentTarget as HTMLImageElement;
- const fallback = "/flags/xx.svg";
+ const fallback = assetUrl("flags/xx.svg");
if (img.src && !img.src.endsWith(fallback)) {
img.src = fallback;
}
diff --git a/src/client/HelpModal.ts b/src/client/HelpModal.ts
index b66336d9d..f791d13f1 100644
--- a/src/client/HelpModal.ts
+++ b/src/client/HelpModal.ts
@@ -1,6 +1,7 @@
import { html } from "lit";
import { customElement, query, state } from "lit/decorators.js";
import { translateText, TUTORIAL_VIDEO_URL } from "../client/Utils";
+import { assetUrl } from "../core/AssetUrls";
import { BaseModal } from "./components/BaseModal";
import "./components/Difficulties";
import { modalHeader } from "./components/ui/ModalHeader";
@@ -527,7 +528,7 @@ export class HelpModal extends BaseModal {
>${translateText("help_modal.ui_leaderboard")}
${translateText("help_modal.ui_control")}
${translateText("help_modal.ui_options")}
${translateText("help_modal.ui_playeroverlay")}
diff --git a/src/client/LanguageModal.ts b/src/client/LanguageModal.ts
index 7e6023648..4fd2651e4 100644
--- a/src/client/LanguageModal.ts
+++ b/src/client/LanguageModal.ts
@@ -1,6 +1,7 @@
import { html } from "lit";
import { customElement, property } from "lit/decorators.js";
import { translateText } from "../client/Utils";
+import { assetUrl } from "../core/AssetUrls";
import "./components/baseComponents/Modal";
import { BaseModal } from "./components/BaseModal";
import { modalHeader } from "./components/ui/ModalHeader";
@@ -69,7 +70,7 @@ export class LanguageModal extends BaseModal {
@click=${() => this.selectLanguage(lang.code)}
>