From 9e455f7a50d90b9732da4c572fefc07d9903f902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Ku=C5=9B?= Date: Fri, 5 Sep 2025 17:19:49 +0200 Subject: [PATCH] Theme Switcher --- .../main/{welcome.png => welcome.jpg} | Bin packages/paths/Paths.ts | 1 + packages/paths/WarmUpImages.ts | 58 +++++++++++++----- 3 files changed, 42 insertions(+), 17 deletions(-) rename apps/kopama.com.pl/assets/pictures/main/{welcome.png => welcome.jpg} (100%) diff --git a/apps/kopama.com.pl/assets/pictures/main/welcome.png b/apps/kopama.com.pl/assets/pictures/main/welcome.jpg similarity index 100% rename from apps/kopama.com.pl/assets/pictures/main/welcome.png rename to apps/kopama.com.pl/assets/pictures/main/welcome.jpg diff --git a/packages/paths/Paths.ts b/packages/paths/Paths.ts index 25bde7e8..a7ecb259 100644 --- a/packages/paths/Paths.ts +++ b/packages/paths/Paths.ts @@ -65,6 +65,7 @@ export class Paths { resolvePublicGeneratedPath(domain: string = this.domainName): string { return `${SERVICE_DATA}/${PUBLIC_GENERATED}/${domain}`; } + getStorageDir(): string { return `${SERVICE_DATA}/${PUBLIC_GENERATED}/${STORAGE}/${this.domainName}`; } diff --git a/packages/paths/WarmUpImages.ts b/packages/paths/WarmUpImages.ts index e18c992c..b174e540 100644 --- a/packages/paths/WarmUpImages.ts +++ b/packages/paths/WarmUpImages.ts @@ -98,7 +98,13 @@ class ImageWarmUp { const outputDir = generatedDir; return limit(async () => { - if (await this.isAlreadyProcessed(outputDir, entry.name)) { + if ( + await this.isAlreadyProcessed( + outputDir, + entry.name, + fullPath, + ) + ) { if (verbose) console.log( `⏩ Already processed: ${newRelativePath}`, @@ -151,29 +157,47 @@ class ImageWarmUp { } /** 🔍 Sprawdza czy plik już został przetworzony */ + /** 🔍 Sprawdza czy plik już został przetworzony i czy nie jest nowszy */ private async isAlreadyProcessed( outputDir: string, filename: string, + sourcePath: string, // dodajemy pełną ścieżkę do oryginału ): Promise { const base = path.parse(filename).name; - // Dla generowanych obrazów sprawdzamy, czy pliki webp i avif istnieją - if (this.pictureType === PictureType.generated) { - const webpPath = path.join(outputDir, `${base}.webp`); - const avifPath = path.join(outputDir, `${base}.avif`); - try { - await fs.access(webpPath); - await fs.access(avifPath); - return true; - } catch { - return false; - } - } - - // Dla skompresowanych obrazów, wystarczy sprawdzić dowolny plik z tą samą nazwą try { - const files = await fs.readdir(outputDir); - return files.some((f) => path.parse(f).name === base); + const sourceStat = await fs.stat(sourcePath); + + if (this.pictureType === PictureType.generated) { + const webpPath = path.join(outputDir, `${base}.webp`); + const avifPath = path.join(outputDir, `${base}.avif`); + + const webpStat = await fs.stat(webpPath).catch(() => null); + const avifStat = await fs.stat(avifPath).catch(() => null); + + if (!webpStat || !avifStat) return false; + + // jeśli oryginał jest nowszy -> trzeba przetworzyć + return ( + webpStat.mtime >= sourceStat.mtime && + avifStat.mtime >= sourceStat.mtime + ); + } else { + const files = await fs.readdir(outputDir).catch(() => []); + const candidate = files.find( + (f) => path.parse(f).name === base, + ); + + if (!candidate) return false; + + const compressedStat = await fs + .stat(path.join(outputDir, candidate)) + .catch(() => null); + + return ( + !!compressedStat && compressedStat.mtime >= sourceStat.mtime + ); + } } catch { return false; }