diff --git a/.gitattributes b/.gitattributes index 009f423..1fa68fe 100644 --- a/.gitattributes +++ b/.gitattributes @@ -46,6 +46,7 @@ Dockerfile text eol=lf *.jpeg binary *.gif binary *.ico binary +*.webp binary *.pdf binary *.zip binary *.tar binary diff --git a/README.md b/README.md index c2862fd..9ea05e0 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ Then open http://localhost:8080 | `npm test` | Unit tests (Vitest + jsdom, no browser needed) | | `npm run lint` | ESLint over `src/**/*.ts` and `src/**/*.html` | | `npm run i18n:check` | Verifies `en.json` and `de.json` share the exact same keys | +| `npm run assets:check` | Verifies every asset path referenced in `src/` exists (also runs in `npm run lint`) | --- @@ -102,7 +103,7 @@ Triggered on every push to `main` and on pull requests targeting `main`. **Job 1 — `quality-check`** (runs on both pushes and PRs): -1. Lint & type check — `npm run lint` +1. Lint & type check — `npm run lint` (includes `npm run assets:check`) 2. i18n key sync — `npm run i18n:check` 3. Unit tests — `npm test` 4. Production build — `npx ng build --configuration production` diff --git a/package.json b/package.json index 9265369..c385292 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test --watch=false", - "lint": "ng lint", - "i18n:check": "node scripts/check-i18n.mjs" + "lint": "ng lint && npm run assets:check", + "i18n:check": "node scripts/check-i18n.mjs", + "assets:check": "node scripts/check-assets.mjs" }, "private": true, "dependencies": { diff --git a/scripts/check-assets.mjs b/scripts/check-assets.mjs new file mode 100644 index 0000000..d29202f --- /dev/null +++ b/scripts/check-assets.mjs @@ -0,0 +1,37 @@ +#!/usr/bin/env node +// Verifies that every asset path in AssetsConstants.ts and index.html exists. +// A wrong path builds fine and only 404s at runtime. + +import { existsSync, readFileSync, readdirSync } from 'node:fs'; +import { join, dirname, extname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const srcDir = join(dirname(fileURLToPath(import.meta.url)), '..', 'src'); +const EXTENSIONS = new Set(['.ts', '.html', '.scss', '.json']); + +function* walk(dir) { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const path = join(dir, entry.name); + if (entry.isDirectory()) { + yield* walk(path); + } else if (EXTENSIONS.has(extname(path)) && !path.endsWith('.spec.ts')) { + yield path; + } + } +} + +const missing = []; +for (const file of walk(srcDir)) { + const content = readFileSync(file, 'utf8'); + for (const [, path] of content.matchAll(/\b(assets\/[\w./-]+)/g)) { + if (!existsSync(join(srcDir, path))) { + missing.push(`${file}: ${path}`); + } + } +} + +if (missing.length > 0) { + console.error(`Missing assets:\n${missing.join('\n')}`); + process.exit(1); +} +console.log('All referenced assets exist.'); diff --git a/src/app/constants/AssetsConstants.ts b/src/app/constants/AssetsConstants.ts index af1d2ee..a2d2170 100644 --- a/src/app/constants/AssetsConstants.ts +++ b/src/app/constants/AssetsConstants.ts @@ -1,44 +1,44 @@ export class AssetsConstants { static readonly ME = '/assets/me.webp'; - static readonly LOGO = '/assets/logos/logo-wolf.png'; + static readonly LOGO = '/assets/logos/logo-wolf.webp'; static readonly FLAG_DE = '/assets/flags/de.svg'; static readonly FLAG_EN = '/assets/flags/gb.svg'; //logos static readonly CHAMAELEON_LOGO = '/assets/logos/logo_chamaeleon.svg'; static readonly TH_BINGEN_LOGO = '/assets/logos/bingen-logo-white.svg'; - static readonly ASSYST_LOGO = '/assets/logos/assyst_gmbh_logo.jpg'; - static readonly COLORDIGITAL_LOGO = '/assets/logos/dmixcloud_logo.jpg'; - static readonly TERAPORT_LOGO = '/assets/logos/teraport_gmbh_logo.jpg'; + static readonly ASSYST_LOGO = '/assets/logos/assyst_gmbh_logo.webp'; + static readonly COLORDIGITAL_LOGO = '/assets/logos/dmixcloud_logo.webp'; + static readonly TERAPORT_LOGO = '/assets/logos/teraport_gmbh_logo.webp'; static readonly DIPLOMA = '/assets/projects/diploma/Dahm2010-Diplomarbeit.pdf'; //project images static readonly PLAYGROUND_IMAGES = [ - '/assets/projects/playground/1.png' + '/assets/projects/playground/1.webp' ]; static readonly EL_MUCHO_IMAGES = [ - '/assets/projects/el-mucho/1.jpg', - '/assets/projects/el-mucho/2.jpg', - '/assets/projects/el-mucho/3.jpg', - '/assets/projects/el-mucho/4.jpg' + '/assets/projects/el-mucho/1.webp', + '/assets/projects/el-mucho/2.webp', + '/assets/projects/el-mucho/3.webp', + '/assets/projects/el-mucho/4.webp' ]; static readonly GAME_JAMS_IMAGES = [ - '/assets/projects/game-jams/1.png', - '/assets/projects/game-jams/2.png', - '/assets/projects/game-jams/3.png' + '/assets/projects/game-jams/1.webp', + '/assets/projects/game-jams/2.webp', + '/assets/projects/game-jams/3.webp' ]; static readonly DIPLOMA_IMAGES = [ - '/assets/projects/diploma/1.jpg', - '/assets/projects/diploma/2.jpg', - '/assets/projects/diploma/3.jpg', - '/assets/projects/diploma/4.jpg', - '/assets/projects/diploma/5.jpg', - '/assets/projects/diploma/6.jpg' + '/assets/projects/diploma/1.webp', + '/assets/projects/diploma/2.webp', + '/assets/projects/diploma/3.webp', + '/assets/projects/diploma/4.webp', + '/assets/projects/diploma/5.webp', + '/assets/projects/diploma/6.webp' ]; static readonly CLAUDE_BOX_IMAGES = [ @@ -46,16 +46,16 @@ export class AssetsConstants { ]; static readonly TRIBBLE_IMAGES = [ - '/assets/projects/tribble-the-homeserver/1.png', - '/assets/projects/tribble-the-homeserver/2.png', - '/assets/projects/tribble-the-homeserver/3.png', - '/assets/projects/tribble-the-homeserver/4.png' + '/assets/projects/tribble-the-homeserver/1.webp', + '/assets/projects/tribble-the-homeserver/2.webp', + '/assets/projects/tribble-the-homeserver/3.webp', + '/assets/projects/tribble-the-homeserver/4.webp' ]; static readonly TBP_IMAGES = [ - '/assets/projects/to-be-played/1.png', - '/assets/projects/to-be-played/2.png', - '/assets/projects/to-be-played/3.png', - '/assets/projects/to-be-played/4.png' + '/assets/projects/to-be-played/1.webp', + '/assets/projects/to-be-played/2.webp', + '/assets/projects/to-be-played/3.webp', + '/assets/projects/to-be-played/4.webp' ]; } diff --git a/src/app/layout/topbar/topbar.component.html b/src/app/layout/topbar/topbar.component.html index 8d6c6d5..705d763 100644 --- a/src/app/layout/topbar/topbar.component.html +++ b/src/app/layout/topbar/topbar.component.html @@ -1,6 +1,6 @@ - {{ 'APP.TITLE' | translate }} diff --git a/src/app/layout/topbar/topbar.component.ts b/src/app/layout/topbar/topbar.component.ts index 863f619..c1ee1dd 100644 --- a/src/app/layout/topbar/topbar.component.ts +++ b/src/app/layout/topbar/topbar.component.ts @@ -5,6 +5,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { NgOptimizedImage } from '@angular/common'; import { TranslatePipe } from '@ngx-translate/core'; import { ThemeService } from '../../service/theme.service'; import { LanguageService } from '../../service/language.service'; @@ -17,7 +18,7 @@ import {RouterConstants} from '../../constants/RouterConstants'; imports: [ RouterLink, RouterLinkActive, MatToolbarModule, MatIconModule, MatButtonModule, MatMenuModule, MatTooltipModule, - TranslatePipe, MatDivider + TranslatePipe, MatDivider, NgOptimizedImage ], templateUrl: './topbar.component.html', changeDetection: ChangeDetectionStrategy.Eager, diff --git a/src/assets/logos/assyst_gmbh_logo.jpg b/src/assets/logos/assyst_gmbh_logo.jpg deleted file mode 100644 index 97f27d4..0000000 Binary files a/src/assets/logos/assyst_gmbh_logo.jpg and /dev/null differ diff --git a/src/assets/logos/assyst_gmbh_logo.webp b/src/assets/logos/assyst_gmbh_logo.webp new file mode 100644 index 0000000..3c26d61 Binary files /dev/null and b/src/assets/logos/assyst_gmbh_logo.webp differ diff --git a/src/assets/logos/dmixcloud_logo.jpg b/src/assets/logos/dmixcloud_logo.jpg deleted file mode 100644 index c868b0a..0000000 Binary files a/src/assets/logos/dmixcloud_logo.jpg and /dev/null differ diff --git a/src/assets/logos/dmixcloud_logo.webp b/src/assets/logos/dmixcloud_logo.webp new file mode 100644 index 0000000..280098a Binary files /dev/null and b/src/assets/logos/dmixcloud_logo.webp differ diff --git a/src/assets/logos/logo-wolf.png b/src/assets/logos/logo-wolf.png deleted file mode 100644 index f500685..0000000 Binary files a/src/assets/logos/logo-wolf.png and /dev/null differ diff --git a/src/assets/logos/logo-wolf.webp b/src/assets/logos/logo-wolf.webp new file mode 100644 index 0000000..7f33790 Binary files /dev/null and b/src/assets/logos/logo-wolf.webp differ diff --git a/src/assets/logos/teraport_gmbh_logo.jpg b/src/assets/logos/teraport_gmbh_logo.jpg deleted file mode 100644 index 509c6d3..0000000 Binary files a/src/assets/logos/teraport_gmbh_logo.jpg and /dev/null differ diff --git a/src/assets/logos/teraport_gmbh_logo.webp b/src/assets/logos/teraport_gmbh_logo.webp new file mode 100644 index 0000000..f9b1cdb Binary files /dev/null and b/src/assets/logos/teraport_gmbh_logo.webp differ diff --git a/src/assets/me.jpg b/src/assets/me.jpg new file mode 100644 index 0000000..45a6d33 Binary files /dev/null and b/src/assets/me.jpg differ diff --git a/src/assets/me.webp b/src/assets/me.webp index 13c274d..f553819 100644 Binary files a/src/assets/me.webp and b/src/assets/me.webp differ diff --git a/src/assets/projects/diploma/1.jpg b/src/assets/projects/diploma/1.jpg deleted file mode 100644 index 23f1839..0000000 Binary files a/src/assets/projects/diploma/1.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/1.webp b/src/assets/projects/diploma/1.webp new file mode 100644 index 0000000..0fc36c4 Binary files /dev/null and b/src/assets/projects/diploma/1.webp differ diff --git a/src/assets/projects/diploma/2.jpg b/src/assets/projects/diploma/2.jpg deleted file mode 100644 index a99c2e6..0000000 Binary files a/src/assets/projects/diploma/2.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/2.webp b/src/assets/projects/diploma/2.webp new file mode 100644 index 0000000..949b513 Binary files /dev/null and b/src/assets/projects/diploma/2.webp differ diff --git a/src/assets/projects/diploma/3.jpg b/src/assets/projects/diploma/3.jpg deleted file mode 100644 index d2ae4ea..0000000 Binary files a/src/assets/projects/diploma/3.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/3.webp b/src/assets/projects/diploma/3.webp new file mode 100644 index 0000000..3822c30 Binary files /dev/null and b/src/assets/projects/diploma/3.webp differ diff --git a/src/assets/projects/diploma/4.jpg b/src/assets/projects/diploma/4.jpg deleted file mode 100644 index 3b79b09..0000000 Binary files a/src/assets/projects/diploma/4.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/4.webp b/src/assets/projects/diploma/4.webp new file mode 100644 index 0000000..8e24aa1 Binary files /dev/null and b/src/assets/projects/diploma/4.webp differ diff --git a/src/assets/projects/diploma/5.jpg b/src/assets/projects/diploma/5.jpg deleted file mode 100644 index c349ffa..0000000 Binary files a/src/assets/projects/diploma/5.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/5.webp b/src/assets/projects/diploma/5.webp new file mode 100644 index 0000000..1ed4b09 Binary files /dev/null and b/src/assets/projects/diploma/5.webp differ diff --git a/src/assets/projects/diploma/6.jpg b/src/assets/projects/diploma/6.jpg deleted file mode 100644 index 9ed8a60..0000000 Binary files a/src/assets/projects/diploma/6.jpg and /dev/null differ diff --git a/src/assets/projects/diploma/6.webp b/src/assets/projects/diploma/6.webp new file mode 100644 index 0000000..83a47ea Binary files /dev/null and b/src/assets/projects/diploma/6.webp differ diff --git a/src/assets/projects/el-mucho/1.jpg b/src/assets/projects/el-mucho/1.jpg deleted file mode 100644 index cf5c335..0000000 Binary files a/src/assets/projects/el-mucho/1.jpg and /dev/null differ diff --git a/src/assets/projects/el-mucho/1.webp b/src/assets/projects/el-mucho/1.webp new file mode 100644 index 0000000..f390c0f Binary files /dev/null and b/src/assets/projects/el-mucho/1.webp differ diff --git a/src/assets/projects/el-mucho/2.jpg b/src/assets/projects/el-mucho/2.jpg deleted file mode 100644 index cc39bdf..0000000 Binary files a/src/assets/projects/el-mucho/2.jpg and /dev/null differ diff --git a/src/assets/projects/el-mucho/2.webp b/src/assets/projects/el-mucho/2.webp new file mode 100644 index 0000000..838ac32 Binary files /dev/null and b/src/assets/projects/el-mucho/2.webp differ diff --git a/src/assets/projects/el-mucho/3.jpg b/src/assets/projects/el-mucho/3.jpg deleted file mode 100644 index 49d0e9a..0000000 Binary files a/src/assets/projects/el-mucho/3.jpg and /dev/null differ diff --git a/src/assets/projects/el-mucho/3.webp b/src/assets/projects/el-mucho/3.webp new file mode 100644 index 0000000..6710fe7 Binary files /dev/null and b/src/assets/projects/el-mucho/3.webp differ diff --git a/src/assets/projects/el-mucho/4.jpg b/src/assets/projects/el-mucho/4.jpg deleted file mode 100644 index f44814c..0000000 Binary files a/src/assets/projects/el-mucho/4.jpg and /dev/null differ diff --git a/src/assets/projects/el-mucho/4.webp b/src/assets/projects/el-mucho/4.webp new file mode 100644 index 0000000..73240b6 Binary files /dev/null and b/src/assets/projects/el-mucho/4.webp differ diff --git a/src/assets/projects/game-jams/1.png b/src/assets/projects/game-jams/1.png deleted file mode 100644 index fa67099..0000000 Binary files a/src/assets/projects/game-jams/1.png and /dev/null differ diff --git a/src/assets/projects/game-jams/1.webp b/src/assets/projects/game-jams/1.webp new file mode 100644 index 0000000..8966337 Binary files /dev/null and b/src/assets/projects/game-jams/1.webp differ diff --git a/src/assets/projects/game-jams/2.png b/src/assets/projects/game-jams/2.png deleted file mode 100644 index cbc4e1e..0000000 Binary files a/src/assets/projects/game-jams/2.png and /dev/null differ diff --git a/src/assets/projects/game-jams/2.webp b/src/assets/projects/game-jams/2.webp new file mode 100644 index 0000000..585027f Binary files /dev/null and b/src/assets/projects/game-jams/2.webp differ diff --git a/src/assets/projects/game-jams/3.png b/src/assets/projects/game-jams/3.png deleted file mode 100644 index 29ee336..0000000 Binary files a/src/assets/projects/game-jams/3.png and /dev/null differ diff --git a/src/assets/projects/game-jams/3.webp b/src/assets/projects/game-jams/3.webp new file mode 100644 index 0000000..156e9a1 Binary files /dev/null and b/src/assets/projects/game-jams/3.webp differ diff --git a/src/assets/projects/playground/1.png b/src/assets/projects/playground/1.png deleted file mode 100644 index e584f62..0000000 Binary files a/src/assets/projects/playground/1.png and /dev/null differ diff --git a/src/assets/projects/playground/1.webp b/src/assets/projects/playground/1.webp new file mode 100644 index 0000000..ec3c323 Binary files /dev/null and b/src/assets/projects/playground/1.webp differ diff --git a/src/assets/projects/to-be-played/1.png b/src/assets/projects/to-be-played/1.png deleted file mode 100644 index 4d43c75..0000000 Binary files a/src/assets/projects/to-be-played/1.png and /dev/null differ diff --git a/src/assets/projects/to-be-played/1.webp b/src/assets/projects/to-be-played/1.webp new file mode 100644 index 0000000..88ac549 Binary files /dev/null and b/src/assets/projects/to-be-played/1.webp differ diff --git a/src/assets/projects/to-be-played/2.png b/src/assets/projects/to-be-played/2.png deleted file mode 100644 index e94de47..0000000 Binary files a/src/assets/projects/to-be-played/2.png and /dev/null differ diff --git a/src/assets/projects/to-be-played/2.webp b/src/assets/projects/to-be-played/2.webp new file mode 100644 index 0000000..7064844 Binary files /dev/null and b/src/assets/projects/to-be-played/2.webp differ diff --git a/src/assets/projects/to-be-played/3.png b/src/assets/projects/to-be-played/3.png deleted file mode 100644 index 1012c29..0000000 Binary files a/src/assets/projects/to-be-played/3.png and /dev/null differ diff --git a/src/assets/projects/to-be-played/3.webp b/src/assets/projects/to-be-played/3.webp new file mode 100644 index 0000000..3bc59c6 Binary files /dev/null and b/src/assets/projects/to-be-played/3.webp differ diff --git a/src/assets/projects/to-be-played/4.png b/src/assets/projects/to-be-played/4.png deleted file mode 100644 index 336163c..0000000 Binary files a/src/assets/projects/to-be-played/4.png and /dev/null differ diff --git a/src/assets/projects/to-be-played/4.webp b/src/assets/projects/to-be-played/4.webp new file mode 100644 index 0000000..7fff880 Binary files /dev/null and b/src/assets/projects/to-be-played/4.webp differ diff --git a/src/assets/projects/tribble-the-homeserver/1.png b/src/assets/projects/tribble-the-homeserver/1.png deleted file mode 100644 index 19cc83d..0000000 Binary files a/src/assets/projects/tribble-the-homeserver/1.png and /dev/null differ diff --git a/src/assets/projects/tribble-the-homeserver/1.webp b/src/assets/projects/tribble-the-homeserver/1.webp new file mode 100644 index 0000000..28acbcd Binary files /dev/null and b/src/assets/projects/tribble-the-homeserver/1.webp differ diff --git a/src/assets/projects/tribble-the-homeserver/2.png b/src/assets/projects/tribble-the-homeserver/2.png deleted file mode 100644 index aeadd22..0000000 Binary files a/src/assets/projects/tribble-the-homeserver/2.png and /dev/null differ diff --git a/src/assets/projects/tribble-the-homeserver/2.webp b/src/assets/projects/tribble-the-homeserver/2.webp new file mode 100644 index 0000000..c4dfd02 Binary files /dev/null and b/src/assets/projects/tribble-the-homeserver/2.webp differ diff --git a/src/assets/projects/tribble-the-homeserver/3.png b/src/assets/projects/tribble-the-homeserver/3.png deleted file mode 100644 index 8577c1f..0000000 Binary files a/src/assets/projects/tribble-the-homeserver/3.png and /dev/null differ diff --git a/src/assets/projects/tribble-the-homeserver/3.webp b/src/assets/projects/tribble-the-homeserver/3.webp new file mode 100644 index 0000000..886c381 Binary files /dev/null and b/src/assets/projects/tribble-the-homeserver/3.webp differ diff --git a/src/assets/projects/tribble-the-homeserver/4.png b/src/assets/projects/tribble-the-homeserver/4.png deleted file mode 100644 index f965daf..0000000 Binary files a/src/assets/projects/tribble-the-homeserver/4.png and /dev/null differ diff --git a/src/assets/projects/tribble-the-homeserver/4.webp b/src/assets/projects/tribble-the-homeserver/4.webp new file mode 100644 index 0000000..c841f69 Binary files /dev/null and b/src/assets/projects/tribble-the-homeserver/4.webp differ diff --git a/src/index.html b/src/index.html index 7b36a05..8cef26c 100644 --- a/src/index.html +++ b/src/index.html @@ -19,12 +19,12 @@ - + - +