+
+
+
Spiel Vorschau
Spiel Name
-
+
-
+
Spiel Vorschau
Spiel Name
-
+
-
+
Spiel Vorschau
Spiel Name
-
+
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index f1d8c73..ecb1a02 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -1 +1,10 @@
@import "tailwindcss";
+
+
+.btn-primary {
+ @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-gradient-to-r from-emerald-500 to-emerald-400 text-black hover:shadow-xl hover:shadow-emerald-500/20
+}
+.btn-secondary {
+ @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-white/10 text-white hover:bg-white/20
+}
+
--
2.47.2
From b010d49752cfc680fddee6025f7b73e0a8d9de1c Mon Sep 17 00:00:00 2001
From: Lea
Date: Wed, 12 Feb 2025 10:26:28 +0100
Subject: [PATCH 015/210] deleted sample request file
---
backend/SampleRequests.http | 0
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 backend/SampleRequests.http
diff --git a/backend/SampleRequests.http b/backend/SampleRequests.http
deleted file mode 100644
index e69de29..0000000
--
2.47.2
From 7d4cfe179415590485246c03f309b8b4143baea5 Mon Sep 17 00:00:00 2001
From: Lea
Date: Wed, 12 Feb 2025 10:31:12 +0100
Subject: [PATCH 016/210] removed not used stuff
---
.../homepage/homepage/homepage.component.css | 1 -
.../homepage/homepage/homepage.component.html | 4 ++--
.../homepage/homepage.component.spec.ts | 23 -------------------
.../homepage/homepage/homepage.component.ts | 8 -------
4 files changed, 2 insertions(+), 34 deletions(-)
delete mode 100644 frontend/src/app/homepage/homepage/homepage.component.css
delete mode 100644 frontend/src/app/homepage/homepage/homepage.component.spec.ts
diff --git a/frontend/src/app/homepage/homepage/homepage.component.css b/frontend/src/app/homepage/homepage/homepage.component.css
deleted file mode 100644
index 8b13789..0000000
--- a/frontend/src/app/homepage/homepage/homepage.component.css
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/frontend/src/app/homepage/homepage/homepage.component.html b/frontend/src/app/homepage/homepage/homepage.component.html
index 301581a..6377831 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.html
+++ b/frontend/src/app/homepage/homepage/homepage.component.html
@@ -3,12 +3,12 @@
-
-
+
Benutzer
diff --git a/frontend/src/app/homepage/homepage/homepage.component.spec.ts b/frontend/src/app/homepage/homepage/homepage.component.spec.ts
deleted file mode 100644
index 8d5e4db..0000000
--- a/frontend/src/app/homepage/homepage/homepage.component.spec.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { HomepageComponent } from './homepage.component';
-
-describe('HomepageComponent', () => {
- let component: HomepageComponent;
- let fixture: ComponentFixture
;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [HomepageComponent]
- })
- .compileComponents();
-
- fixture = TestBed.createComponent(HomepageComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/frontend/src/app/homepage/homepage/homepage.component.ts b/frontend/src/app/homepage/homepage/homepage.component.ts
index 0b720e5..e0a1147 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.ts
+++ b/frontend/src/app/homepage/homepage/homepage.component.ts
@@ -5,16 +5,8 @@ import {ChangeDetectionStrategy, Component} from '@angular/core';
standalone: true,
imports: [],
templateUrl: './homepage.component.html',
- styleUrl: './homepage.component.css',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class HomepageComponent {
- onLogout() {
- //TODO implement
- }
-
- openUserInfo() {
- //TODO implement
- }
}
--
2.47.2
From f31a959ec540e25676120f2c245bf75672ba5eac Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:45:42 +0100
Subject: [PATCH 017/210] build: add Gitea release workflow configuration
---
.gitea/workflows/release.yml | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 .gitea/workflows/release.yml
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
new file mode 100644
index 0000000..1e33a46
--- /dev/null
+++ b/.gitea/workflows/release.yml
@@ -0,0 +1,25 @@
+name: Release
+on:
+ push:
+
+env:
+ GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
+
+permissions:
+ contents: read # for checkout
+
+jobs:
+ release:
+ name: Release
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write # to be able to publish a GitHub release
+ issues: write # to be able to comment on released issues
+ pull-requests: write # to be able to comment on released pull requests
+ id-token: write # to enable use of OIDC for npm provenance
+ steps:
+ - name: Create Release
+ uses: https://git.kjan.de/actions/semantic-release@main
+ with:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
--
2.47.2
From ab9598950a4cb975b1625e46044c5b8604902a62 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:47:23 +0100
Subject: [PATCH 018/210] build: add release configuration for semantic release
---
.gitea/workflows/release.yml | 2 +-
release.config.cjs | 15 +++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 release.config.cjs
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 1e33a46..7246d23 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -22,4 +22,4 @@ jobs:
uses: https://git.kjan.de/actions/semantic-release@main
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
+ GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
\ No newline at end of file
diff --git a/release.config.cjs b/release.config.cjs
new file mode 100644
index 0000000..e09738f
--- /dev/null
+++ b/release.config.cjs
@@ -0,0 +1,15 @@
+module.exports = {
+
+ branches: ['main'],
+ plugins: [
+ '@semantic-release/commit-analyzer',
+ '@semantic-release/release-notes-generator',
+ '@semantic-release/changelog',
+ ["@saithodev/semantic-release-gitea", {
+ "giteaUrl": "https://git.simonis.lol"
+ }],
+ ],
+ };
+
+
+
\ No newline at end of file
--
2.47.2
From 25ff804b76c09ebbab1e0b25c59770b06660dcb6 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:49:45 +0100
Subject: [PATCH 019/210] ci: add master branch trigger for release workflow
---
.gitea/workflows/release.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 7246d23..1a4732d 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -1,6 +1,8 @@
name: Release
on:
push:
+ branches:
+ - "master"
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
--
2.47.2
From 774e55c6a6cc34eb55919e7456b5124d76123970 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:50:51 +0100
Subject: [PATCH 020/210] ci: change runner to remote in release workflow
---
.gitea/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 1a4732d..9d7d6a2 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -13,7 +13,7 @@ permissions:
jobs:
release:
name: Release
- runs-on: ubuntu-latest
+ runs-on: remote
permissions:
contents: write # to be able to publish a GitHub release
issues: write # to be able to comment on released issues
--
2.47.2
From f4541c5d865c8b778441b11ffb85b33041c0f1a3 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:51:57 +0100
Subject: [PATCH 021/210] ci: update branch name in release workflow config
---
.gitea/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 9d7d6a2..d449485 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -2,7 +2,7 @@ name: Release
on:
push:
branches:
- - "master"
+ - "main"
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
--
2.47.2
From 94ac9bd491268d8485243c984cdebd685365cfda Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 10:52:49 +0100
Subject: [PATCH 022/210] style(release.yml): format permissions section in
YAML
---
.gitea/workflows/release.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index d449485..51e555c 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -8,17 +8,17 @@ env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
permissions:
- contents: read # for checkout
+ contents: read
jobs:
release:
name: Release
runs-on: remote
permissions:
- contents: write # to be able to publish a GitHub release
- issues: write # to be able to comment on released issues
- pull-requests: write # to be able to comment on released pull requests
- id-token: write # to enable use of OIDC for npm provenance
+ contents: write
+ issues: write
+ pull-requests: write
+ id-token: write
steps:
- name: Create Release
uses: https://git.kjan.de/actions/semantic-release@main
--
2.47.2
From fa30fc330507e8342026b4c34334b915a4002012 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 09:00:18 +0100
Subject: [PATCH 023/210] Protect homepage with keycloak
---
frontend/src/app/app.routes.ts | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index ce6d45a..2dcf135 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -1,13 +1,17 @@
-import { Routes } from '@angular/router';
+import {Routes} from '@angular/router';
import {LandingPageComponent} from "./landing-page/landing-page.component";
import {HomepageComponent} from "./homepage/homepage/homepage.component";
+import {authGuard} from "./auth.guard";
export const routes: Routes = [
{
- path: 'home',
- component: HomepageComponent
+ path: '',
+ component: LandingPageComponent,
+ },
+ {
+ path: 'home',
+ component: HomepageComponent,
+ canActivate: [authGuard],
},
-
- { path: '', component: LandingPageComponent }
];
--
2.47.2
From f10de66c12ba017cd79e71c6377f613b4a1b77fc Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 09:22:20 +0100
Subject: [PATCH 024/210] Refactor auth guard
---
frontend/src/app/auth.guard.ts | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/frontend/src/app/auth.guard.ts b/frontend/src/app/auth.guard.ts
index dd78a48..0cd16be 100644
--- a/frontend/src/app/auth.guard.ts
+++ b/frontend/src/app/auth.guard.ts
@@ -1,16 +1,15 @@
-import { CanActivateFn } from '@angular/router';
-import { inject } from '@angular/core';
-import { KeycloakService } from 'keycloak-angular';
+import {CanActivateFn} from '@angular/router';
+import {inject} from '@angular/core';
+import {KeycloakService} from 'keycloak-angular';
-export const authGuard: CanActivateFn = async (route, state) => {
+export const authGuard: CanActivateFn = async () => {
const keycloakService = inject(KeycloakService);
-
const isLoggedIn = keycloakService.isLoggedIn();
if (isLoggedIn) {
return true;
- } else {
- keycloakService.login();
- return false;
}
+
+ keycloakService.login();
+ return false;
};
--
2.47.2
From 53f21a220f6bc75ab15535ecb7a05ff6b2fc8759 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 09:27:41 +0100
Subject: [PATCH 025/210] Add logout and login functionality
---
frontend/src/app/landing-page/landing-page.component.html | 1 +
frontend/src/app/landing-page/landing-page.component.ts | 7 ++++++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/landing-page/landing-page.component.html
index e69de29..06f5418 100644
--- a/frontend/src/app/landing-page/landing-page.component.html
+++ b/frontend/src/app/landing-page/landing-page.component.html
@@ -0,0 +1 @@
+Login
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index ed8aba1..7ea8521 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,4 +1,5 @@
-import { Component } from '@angular/core';
+import {Component, inject} from '@angular/core';
+import {KeycloakService} from "keycloak-angular";
@Component({
selector: 'app-landing-page',
@@ -7,5 +8,9 @@ import { Component } from '@angular/core';
templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
+ private keycloakService: KeycloakService = inject(KeycloakService);
+ login() {
+ this.keycloakService.login();
+ }
}
--
2.47.2
From dc993b287954a6e35e918b99eacf49eec9d1e00b Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 09:38:31 +0100
Subject: [PATCH 026/210] Add alerts
---
frontend/src/app/landing-page/landing-page.component.ts | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index 7ea8521..56b9183 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -11,6 +11,10 @@ export class LandingPageComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
login() {
- this.keycloakService.login();
+ this.keycloakService.login()
+ .catch(error => {
+ alert("Error: Unable to redirect to login page. Please try again later.");
+ console.error('Error redirecting to login:', error);
+ });
}
}
--
2.47.2
From c3f9ba7bcada69d2bb072ddfa16cb11529333ce9 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 09:41:05 +0100
Subject: [PATCH 027/210] Add nested route config for authentication
---
frontend/src/app/app.routes.ts | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 2dcf135..97623db 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -9,9 +9,14 @@ export const routes: Routes = [
component: LandingPageComponent,
},
{
- path: 'home',
- component: HomepageComponent,
+ path: '**',
canActivate: [authGuard],
- },
+ children: [
+ {
+ path: 'home',
+ component: HomepageComponent,
+ },
+ ]
+ }
];
--
2.47.2
From f6bcc1be11bc4b1de34d9a6e722a98c00d8e6b9b Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 10:46:48 +0100
Subject: [PATCH 028/210] Prettier and rebase
---
frontend/src/app/app.config.ts | 6 +++++-
frontend/src/app/app.routes.ts | 13 ++++++-------
frontend/src/app/auth.guard.ts | 6 +++---
.../app/homepage/homepage/homepage.component.html | 9 ++-------
.../src/app/homepage/homepage/homepage.component.ts | 9 +++++++--
.../app/landing-page/landing-page.component.html | 2 +-
.../src/app/landing-page/landing-page.component.ts | 10 +++-------
frontend/src/styles.css | 8 +++-----
8 files changed, 30 insertions(+), 33 deletions(-)
diff --git a/frontend/src/app/app.config.ts b/frontend/src/app/app.config.ts
index 6fd038e..e7761ba 100644
--- a/frontend/src/app/app.config.ts
+++ b/frontend/src/app/app.config.ts
@@ -1,4 +1,8 @@
-import { APP_INITIALIZER, ApplicationConfig, provideExperimentalZonelessChangeDetection } from '@angular/core';
+import {
+ APP_INITIALIZER,
+ ApplicationConfig,
+ provideExperimentalZonelessChangeDetection,
+} from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 97623db..132b0da 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -1,7 +1,7 @@
-import {Routes} from '@angular/router';
-import {LandingPageComponent} from "./landing-page/landing-page.component";
-import {HomepageComponent} from "./homepage/homepage/homepage.component";
-import {authGuard} from "./auth.guard";
+import { Routes } from '@angular/router';
+import { LandingPageComponent } from './landing-page/landing-page.component';
+import { HomepageComponent } from './homepage/homepage/homepage.component';
+import { authGuard } from './auth.guard';
export const routes: Routes = [
{
@@ -16,7 +16,6 @@ export const routes: Routes = [
path: 'home',
component: HomepageComponent,
},
- ]
- }
+ ],
+ },
];
-
diff --git a/frontend/src/app/auth.guard.ts b/frontend/src/app/auth.guard.ts
index 0cd16be..cb2cbe9 100644
--- a/frontend/src/app/auth.guard.ts
+++ b/frontend/src/app/auth.guard.ts
@@ -1,6 +1,6 @@
-import {CanActivateFn} from '@angular/router';
-import {inject} from '@angular/core';
-import {KeycloakService} from 'keycloak-angular';
+import { CanActivateFn } from '@angular/router';
+import { inject } from '@angular/core';
+import { KeycloakService } from 'keycloak-angular';
export const authGuard: CanActivateFn = async () => {
const keycloakService = inject(KeycloakService);
diff --git a/frontend/src/app/homepage/homepage/homepage.component.html b/frontend/src/app/homepage/homepage/homepage.component.html
index 6377831..6a710c5 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.html
+++ b/frontend/src/app/homepage/homepage/homepage.component.html
@@ -1,16 +1,11 @@
-
diff --git a/frontend/src/app/homepage/homepage/homepage.component.ts b/frontend/src/app/homepage/homepage/homepage.component.ts
index e0a1147..1f01382 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.ts
+++ b/frontend/src/app/homepage/homepage/homepage.component.ts
@@ -1,12 +1,17 @@
-import {ChangeDetectionStrategy, Component} from '@angular/core';
+import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
+import { KeycloakService } from 'keycloak-angular';
@Component({
selector: 'app-homepage',
standalone: true,
imports: [],
templateUrl: './homepage.component.html',
- changeDetection: ChangeDetectionStrategy.OnPush
+ changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HomepageComponent {
+ private keycloakService: KeycloakService = inject(KeycloakService);
+ logout() {
+ this.keycloakService.logout();
+ }
}
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/landing-page/landing-page.component.html
index 06f5418..f1cfa47 100644
--- a/frontend/src/app/landing-page/landing-page.component.html
+++ b/frontend/src/app/landing-page/landing-page.component.html
@@ -1 +1 @@
-Login
+Login
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index 56b9183..ff25911 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,5 +1,5 @@
-import {Component, inject} from '@angular/core';
-import {KeycloakService} from "keycloak-angular";
+import { Component, inject } from '@angular/core';
+import { KeycloakService } from 'keycloak-angular';
@Component({
selector: 'app-landing-page',
@@ -11,10 +11,6 @@ export class LandingPageComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
login() {
- this.keycloakService.login()
- .catch(error => {
- alert("Error: Unable to redirect to login page. Please try again later.");
- console.error('Error redirecting to login:', error);
- });
+ this.keycloakService.login();
}
}
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index ecb1a02..22329e3 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -1,10 +1,8 @@
-@import "tailwindcss";
-
+@import 'tailwindcss';
.btn-primary {
- @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-gradient-to-r from-emerald-500 to-emerald-400 text-black hover:shadow-xl hover:shadow-emerald-500/20
+ @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-gradient-to-r from-emerald-500 to-emerald-400 text-black hover:shadow-xl hover:shadow-emerald-500/20;
}
.btn-secondary {
- @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-white/10 text-white hover:bg-white/20
+ @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-white/10 text-white hover:bg-white/20;
}
-
--
2.47.2
From 4b9574ac965b6e428c1575359562e9d68d7f190b Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 10:54:47 +0100
Subject: [PATCH 029/210] fix: fix routing
---
frontend/src/app/app.routes.ts | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 132b0da..2d53d28 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -9,13 +9,8 @@ export const routes: Routes = [
component: LandingPageComponent,
},
{
- path: '**',
+ path: 'home',
+ component: HomepageComponent,
canActivate: [authGuard],
- children: [
- {
- path: 'home',
- component: HomepageComponent,
- },
- ],
- },
+ }
];
--
2.47.2
From 13769e0df5f536a45381789ae54c403fda964462 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 10:56:21 +0100
Subject: [PATCH 030/210] fix: Translate login to german
---
frontend/src/app/landing-page/landing-page.component.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/landing-page/landing-page.component.html
index f1cfa47..aa8bbd8 100644
--- a/frontend/src/app/landing-page/landing-page.component.html
+++ b/frontend/src/app/landing-page/landing-page.component.html
@@ -1 +1 @@
-Login
+Einloggen
--
2.47.2
From 3113eee4149ff735bfb44b72a35c5951758b39bc Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Wed, 12 Feb 2025 11:13:18 +0100
Subject: [PATCH 031/210] chore(deployment): add deployment for backend
---
backend/.docker/Dockerfile | 32 +++++++++++++++++++
backend/.dockerignore | 2 ++
.../src/main/resources/application.properties | 2 +-
3 files changed, 35 insertions(+), 1 deletion(-)
create mode 100644 backend/.docker/Dockerfile
create mode 100644 backend/.dockerignore
diff --git a/backend/.docker/Dockerfile b/backend/.docker/Dockerfile
new file mode 100644
index 0000000..1b2524c
--- /dev/null
+++ b/backend/.docker/Dockerfile
@@ -0,0 +1,32 @@
+# First stage: Build the application
+FROM gradle:jdk22 AS builder
+
+WORKDIR /app
+
+# Copy only Gradle wrapper and configuration files first (for caching efficiency)
+COPY gradlew build.gradle.kts settings.gradle.kts ./
+COPY gradle gradle
+
+# Give execute permissions to Gradle wrapper
+RUN chmod +x gradlew
+
+# Download dependencies first (improves caching)
+RUN ./gradlew dependencies
+
+# Copy the rest of the project files
+COPY src src
+
+# Build the application (skipping tests for faster build)
+RUN ./gradlew clean build -x test
+
+# Second stage: Run the application
+FROM openjdk:22-jdk-slim
+
+WORKDIR /app
+
+# Copy the built JAR from the first stage
+COPY --from=builder /app/build/libs/*.jar app.jar
+
+EXPOSE 8080
+
+ENTRYPOINT ["java", "-jar", "app.jar"]
diff --git a/backend/.dockerignore b/backend/.dockerignore
new file mode 100644
index 0000000..f06dfad
--- /dev/null
+++ b/backend/.dockerignore
@@ -0,0 +1,2 @@
+.gradle
+build
\ No newline at end of file
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 938ce25..8271ece 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:postgresql://localhost:5432/postgresdb
+spring.datasource.url=jdbc:postgresql://$DB_HOST}:5432/postgresdb
spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
--
2.47.2
From 9778a1e6d5935926463e28c1602a8b5f16028882 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Wed, 12 Feb 2025 11:15:00 +0100
Subject: [PATCH 032/210] refactor: Refactor dockerfile
---
backend/.docker/Dockerfile | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/backend/.docker/Dockerfile b/backend/.docker/Dockerfile
index 1b2524c..d6df4f7 100644
--- a/backend/.docker/Dockerfile
+++ b/backend/.docker/Dockerfile
@@ -1,32 +1,20 @@
-# First stage: Build the application
FROM gradle:jdk22 AS builder
-
WORKDIR /app
-# Copy only Gradle wrapper and configuration files first (for caching efficiency)
COPY gradlew build.gradle.kts settings.gradle.kts ./
COPY gradle gradle
-# Give execute permissions to Gradle wrapper
RUN chmod +x gradlew
-
-# Download dependencies first (improves caching)
RUN ./gradlew dependencies
-# Copy the rest of the project files
COPY src src
-# Build the application (skipping tests for faster build)
RUN ./gradlew clean build -x test
-# Second stage: Run the application
FROM openjdk:22-jdk-slim
-
WORKDIR /app
-# Copy the built JAR from the first stage
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
-
ENTRYPOINT ["java", "-jar", "app.jar"]
--
2.47.2
From fab3680c07ecf1c988783dfeda19770a04c6287f Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 11:15:27 +0100
Subject: [PATCH 033/210] feat: Add proper redirects to login and logout button
---
.../homepage/homepage/homepage.component.ts | 8 ++++---
.../landing-page/landing-page.component.ts | 22 ++++++++++---------
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/frontend/src/app/homepage/homepage/homepage.component.ts b/frontend/src/app/homepage/homepage/homepage.component.ts
index 1f01382..2b2dda8 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.ts
+++ b/frontend/src/app/homepage/homepage/homepage.component.ts
@@ -1,5 +1,5 @@
-import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
-import { KeycloakService } from 'keycloak-angular';
+import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
+import {KeycloakService} from 'keycloak-angular';
@Component({
selector: 'app-homepage',
@@ -12,6 +12,8 @@ export class HomepageComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
logout() {
- this.keycloakService.logout();
+ const baseUrl = window.location.origin;
+
+ this.keycloakService.logout(`${baseUrl}/`);
}
}
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index ff25911..eefe0d4 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,16 +1,18 @@
-import { Component, inject } from '@angular/core';
-import { KeycloakService } from 'keycloak-angular';
+import {Component, inject} from '@angular/core';
+import {KeycloakService} from 'keycloak-angular';
@Component({
- selector: 'app-landing-page',
- standalone: true,
- imports: [],
- templateUrl: './landing-page.component.html',
+ selector: 'app-landing-page',
+ standalone: true,
+ imports: [],
+ templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
- private keycloakService: KeycloakService = inject(KeycloakService);
+ private keycloakService: KeycloakService = inject(KeycloakService);
- login() {
- this.keycloakService.login();
- }
+ login() {
+ const baseUrl = window.location.origin;
+
+ this.keycloakService.login({redirectUri: `${baseUrl}/home`});
+ }
}
--
2.47.2
From a958d9f6ac91430fcf1316e253d1a835b1b95646 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Wed, 12 Feb 2025 11:15:33 +0100
Subject: [PATCH 034/210] refactor: Whoops
---
backend/src/main/resources/application.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 8271ece..713c7ff 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:postgresql://$DB_HOST}:5432/postgresdb
+spring.datasource.url=jdbc:postgresql://${DB_HOST}:5432/postgresdb
spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
--
2.47.2
From c64152b99fad46c310a8eb184731c4db7b373ca8 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 11:16:29 +0100
Subject: [PATCH 035/210] style: format code with prettier
---
frontend/src/app/app.routes.ts | 2 +-
.../homepage/homepage/homepage.component.ts | 4 ++--
.../landing-page/landing-page.component.ts | 22 +++++++++----------
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 2d53d28..02b958c 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -12,5 +12,5 @@ export const routes: Routes = [
path: 'home',
component: HomepageComponent,
canActivate: [authGuard],
- }
+ },
];
diff --git a/frontend/src/app/homepage/homepage/homepage.component.ts b/frontend/src/app/homepage/homepage/homepage.component.ts
index 2b2dda8..ff894dc 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.ts
+++ b/frontend/src/app/homepage/homepage/homepage.component.ts
@@ -1,5 +1,5 @@
-import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
-import {KeycloakService} from 'keycloak-angular';
+import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
+import { KeycloakService } from 'keycloak-angular';
@Component({
selector: 'app-homepage',
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index eefe0d4..f7509cf 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,18 +1,18 @@
-import {Component, inject} from '@angular/core';
-import {KeycloakService} from 'keycloak-angular';
+import { Component, inject } from '@angular/core';
+import { KeycloakService } from 'keycloak-angular';
@Component({
- selector: 'app-landing-page',
- standalone: true,
- imports: [],
- templateUrl: './landing-page.component.html',
+ selector: 'app-landing-page',
+ standalone: true,
+ imports: [],
+ templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
- private keycloakService: KeycloakService = inject(KeycloakService);
+ private keycloakService: KeycloakService = inject(KeycloakService);
- login() {
- const baseUrl = window.location.origin;
+ login() {
+ const baseUrl = window.location.origin;
- this.keycloakService.login({redirectUri: `${baseUrl}/home`});
- }
+ this.keycloakService.login({ redirectUri: `${baseUrl}/home` });
+ }
}
--
2.47.2
From 0836830df2be3d367856adacec40cb3296b38187 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Wed, 12 Feb 2025 11:35:57 +0100
Subject: [PATCH 036/210] refactor: Add default value to db host
---
backend/src/main/resources/application.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 713c7ff..d668f7a 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:postgresql://${DB_HOST}:5432/postgresdb
+spring.datasource.url=jdbc:postgresql://${DB_HOST:-localhost}:5432/postgresdb
spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
--
2.47.2
From e270b8abe5379be569e75f16efca7e36c0170a86 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:11:35 +0100
Subject: [PATCH 037/210] ci: add CI workflow configuration file
---
.gitea/workflows/ci.yml | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 .gitea/workflows/ci.yml
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
new file mode 100644
index 0000000..c32dab9
--- /dev/null
+++ b/.gitea/workflows/ci.yml
@@ -0,0 +1,21 @@
+name: CI
+
+on:
+ pull_request:
+
+jobs:
+ test-build:
+ name: test-build
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: oven-sh/setup-bun@v2
+ - uses: actions/cache@v4
+ with:
+ path: |
+ ~/.npm
+ key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
+ restore-keys: |
+ ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
+ - run: bun install
+ - run: bun run build
--
2.47.2
From d1aa0222a1167929a8177a144d8e6c24d252f12a Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:13:45 +0100
Subject: [PATCH 038/210] ci: change runner to remote in CI configuration
---
.gitea/workflows/ci.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index c32dab9..158e66a 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -6,7 +6,7 @@ on:
jobs:
test-build:
name: test-build
- runs-on: ubuntu-latest
+ runs-on: remote
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
--
2.47.2
From cb80b041a63f5e46c9228bec4978ea69ed062df1 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:16:48 +0100
Subject: [PATCH 039/210] ci: update CI workflow to use new container image
---
.gitea/workflows/ci.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 158e66a..6234d3a 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -7,6 +7,8 @@ jobs:
test-build:
name: test-build
runs-on: remote
+ container:
+ image: catthehacker/ubuntu:act-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
--
2.47.2
From f51d32ba5f315d191f55e7f74c06786b2c7505f0 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:20:51 +0100
Subject: [PATCH 040/210] ci: add cd command to frontend in CI workflow
---
.gitea/workflows/ci.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 6234d3a..0f1e330 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -19,5 +19,6 @@ jobs:
key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
+ - run: cd frontend
- run: bun install
- run: bun run build
--
2.47.2
From 3e1e42fa31874572da031d96c7b07cdab3dca4f5 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:21:56 +0100
Subject: [PATCH 041/210] ci: update CI script for better readability
---
.gitea/workflows/ci.yml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 0f1e330..4b95517 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -19,6 +19,7 @@ jobs:
key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
- - run: cd frontend
- - run: bun install
+ - run: |
+ cd frontend
+ bun install
- run: bun run build
--
2.47.2
From ac3c84106dbb27660a9d37da9c6e504341896fb5 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:23:38 +0100
Subject: [PATCH 042/210] ci: improve CI workflow with step names for clarity
---
.gitea/workflows/ci.yml | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 4b95517..269ef51 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -10,16 +10,23 @@ jobs:
container:
image: catthehacker/ubuntu:act-latest
steps:
- - uses: actions/checkout@v4
- - uses: oven-sh/setup-bun@v2
- - uses: actions/cache@v4
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ - name: Install bun
+ uses: oven-sh/setup-bun@v2
+ - name: Cache
+ uses: actions/cache@v4
with:
path: |
~/.npm
key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
- - run: |
+ - name: Install dependencies
+ run: |
cd frontend
bun install
- - run: bun run build
+ - name: Test build
+ run: |
+ cd frontend
+ bun run build
--
2.47.2
From 343704959bc5e61b6d5454f1c47d04ec8e408b15 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:31:32 +0100
Subject: [PATCH 043/210] ci: update runner from remote to vps-4 in workflows
---
.gitea/workflows/ci.yml | 2 +-
.gitea/workflows/release.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 269ef51..760e3f4 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -6,7 +6,7 @@ on:
jobs:
test-build:
name: test-build
- runs-on: remote
+ runs-on: vps-4
container:
image: catthehacker/ubuntu:act-latest
steps:
diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 51e555c..fa827f3 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -13,7 +13,7 @@ permissions:
jobs:
release:
name: Release
- runs-on: remote
+ runs-on: vps-4
permissions:
contents: write
issues: write
--
2.47.2
From dc1482c3206823a834a355f915c53446f8a0c6c3 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:33:32 +0100
Subject: [PATCH 044/210] ci: add prettier job to CI workflow
---
.gitea/workflows/ci.yml | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index 760e3f4..e537b78 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -4,6 +4,33 @@ on:
pull_request:
jobs:
+ prettier:
+ name: prettier
+ runs-on: vps-4
+ container:
+ image: catthehacker/ubuntu:act-latest
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ - name: Install bun
+ uses: oven-sh/setup-bun@v2
+ - name: Cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.npm
+ key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
+ restore-keys: |
+ ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
+ - name: Install dependencies
+ run: |
+ cd frontend
+ bun install
+ - name: Run prettier
+ run: |
+ cd frontend
+ bun run format:check
+
test-build:
name: test-build
runs-on: vps-4
--
2.47.2
From 2d955eed1afd621efe91fe229e8abc3d6abbb4dd Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Wed, 12 Feb 2025 11:36:45 +0100
Subject: [PATCH 045/210] ci: remove caching from CI workflow configuration
---
.gitea/workflows/ci.yml | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index e537b78..eaead1c 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -14,14 +14,6 @@ jobs:
uses: actions/checkout@v4
- name: Install bun
uses: oven-sh/setup-bun@v2
- - name: Cache
- uses: actions/cache@v4
- with:
- path: |
- ~/.npm
- key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
- restore-keys: |
- ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
- name: Install dependencies
run: |
cd frontend
@@ -41,14 +33,6 @@ jobs:
uses: actions/checkout@v4
- name: Install bun
uses: oven-sh/setup-bun@v2
- - name: Cache
- uses: actions/cache@v4
- with:
- path: |
- ~/.npm
- key: ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
- restore-keys: |
- ${{ runner.os }}-bun-${{ hashFiles('**/package-lock.json') }}-
- name: Install dependencies
run: |
cd frontend
--
2.47.2
From 21bdbab1cf878cf7afead5580764dd023612601c Mon Sep 17 00:00:00 2001
From: Jan-Marlon Leibl
Date: Wed, 12 Feb 2025 11:45:12 +0100
Subject: [PATCH 046/210] style: Update CSS formatting and add theme variables
---
frontend/src/styles.css | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index 22329e3..b1ddff1 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -1,8 +1,12 @@
-@import 'tailwindcss';
+@import "tailwindcss";
-.btn-primary {
- @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-gradient-to-r from-emerald-500 to-emerald-400 text-black hover:shadow-xl hover:shadow-emerald-500/20;
-}
-.btn-secondary {
- @apply px-4 py-2 cursor-pointer relative font-bold rounded-lg transition-all duration-300 ease-out transform-gpu hover:scale-105 will-change-transform bg-white/10 text-white hover:bg-white/20;
+@theme {
+ --color-deep-blue: #0F212E;
+ --color-deep-blue-light: #1A2C38;
+ --color-deep-blue-contrast: #1B2C3B;
+ --color-light-blue: #1475E1;
}
+
+body {
+ @apply bg-deep-blue text-gray-100;
+}
\ No newline at end of file
--
2.47.2
From aea34424b897d87a5f6414a59c296fb9d62f580f Mon Sep 17 00:00:00 2001
From: Jan-Marlon Leibl
Date: Wed, 12 Feb 2025 11:46:52 +0100
Subject: [PATCH 047/210] style: Update CSS syntax and fix color case
sensitivity
---
frontend/src/styles.css | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index b1ddff1..8de5d08 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -1,12 +1,12 @@
-@import "tailwindcss";
+@import 'tailwindcss';
@theme {
- --color-deep-blue: #0F212E;
- --color-deep-blue-light: #1A2C38;
- --color-deep-blue-contrast: #1B2C3B;
- --color-light-blue: #1475E1;
+ --color-deep-blue: #0f212e;
+ --color-deep-blue-light: #1a2c38;
+ --color-deep-blue-contrast: #1b2c3b;
+ --color-light-blue: #1475e1;
}
body {
- @apply bg-deep-blue text-gray-100;
-}
\ No newline at end of file
+ @apply bg-deep-blue text-gray-100;
+}
--
2.47.2
From 3a2b92b3ffc7dabeb57b27a06d9f642e2340c5c0 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 12:19:31 +0100
Subject: [PATCH 048/210] feat: Convert login button to hompage button when
user is authenticated
---
.../src/app/landing-page/landing-page.component.html | 6 +++++-
.../src/app/landing-page/landing-page.component.ts | 12 ++++++++++--
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/landing-page/landing-page.component.html
index aa8bbd8..944881c 100644
--- a/frontend/src/app/landing-page/landing-page.component.html
+++ b/frontend/src/app/landing-page/landing-page.component.html
@@ -1 +1,5 @@
-Einloggen
+@if (isLoggedIn) {
+ Zur Homepage
+} @else {
+ Einloggen
+}
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index f7509cf..f5fee0c 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,16 +1,24 @@
import { Component, inject } from '@angular/core';
import { KeycloakService } from 'keycloak-angular';
+import {RouterLink} from "@angular/router";
@Component({
selector: 'app-landing-page',
standalone: true,
- imports: [],
+ imports: [
+ RouterLink
+ ],
templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
+ public isLoggedIn = false;
private keycloakService: KeycloakService = inject(KeycloakService);
- login() {
+ private ngOnInit() {
+ this.isLoggedIn = this.keycloakService.isLoggedIn();
+ }
+
+ public login() {
const baseUrl = window.location.origin;
this.keycloakService.login({ redirectUri: `${baseUrl}/home` });
--
2.47.2
From 22086a88fae7a5806eb31106b30a4a4e1606c192 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 12:20:57 +0100
Subject: [PATCH 049/210] style: Run prettier
---
frontend/src/app/landing-page/landing-page.component.html | 4 ++--
frontend/src/app/landing-page/landing-page.component.ts | 6 ++----
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/landing-page/landing-page.component.html
index 944881c..80d5974 100644
--- a/frontend/src/app/landing-page/landing-page.component.html
+++ b/frontend/src/app/landing-page/landing-page.component.html
@@ -1,5 +1,5 @@
@if (isLoggedIn) {
- Zur Homepage
+ Zur Homepage
} @else {
- Einloggen
+ Einloggen
}
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index f5fee0c..3b6292b 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -1,13 +1,11 @@
import { Component, inject } from '@angular/core';
import { KeycloakService } from 'keycloak-angular';
-import {RouterLink} from "@angular/router";
+import { RouterLink } from '@angular/router';
@Component({
selector: 'app-landing-page',
standalone: true,
- imports: [
- RouterLink
- ],
+ imports: [RouterLink],
templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
--
2.47.2
From ab3bc5587eeed0197d4df7bb83410e196879be9f Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 12 Feb 2025 12:33:52 +0100
Subject: [PATCH 050/210] refactor: remove oninit
---
frontend/src/app/landing-page/landing-page.component.ts | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/landing-page/landing-page.component.ts
index 3b6292b..1291434 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/landing-page/landing-page.component.ts
@@ -9,12 +9,9 @@ import { RouterLink } from '@angular/router';
templateUrl: './landing-page.component.html',
})
export class LandingPageComponent {
- public isLoggedIn = false;
private keycloakService: KeycloakService = inject(KeycloakService);
- private ngOnInit() {
- this.isLoggedIn = this.keycloakService.isLoggedIn();
- }
+ public isLoggedIn = this.keycloakService.isLoggedIn();
public login() {
const baseUrl = window.location.origin;
--
2.47.2
From 177dd7859241e3d98349e5c45e807af0351a824f Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 09:42:42 +0100
Subject: [PATCH 051/210] wip
---
backend/build.gradle.kts | 1 +
.../casino/deposit/DepositController.java | 48 +++++++++++++++++++
.../de/szut/casino/deposit/dto/AmountDto.java | 21 ++++++++
.../szut/casino/deposit/dto/SessionIdDto.java | 21 ++++++++
.../src/main/resources/application.properties | 2 +-
frontend/bun.lock | 3 ++
frontend/package.json | 1 +
frontend/src/app/app.routes.ts | 6 +++
.../src/app/deposit/deposit.component.css | 0
.../src/app/deposit/deposit.component.html | 14 ++++++
frontend/src/app/deposit/deposit.component.ts | 32 +++++++++++++
11 files changed, 148 insertions(+), 1 deletion(-)
create mode 100644 backend/src/main/java/de/szut/casino/deposit/DepositController.java
create mode 100644 backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
create mode 100644 backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
create mode 100644 frontend/src/app/deposit/deposit.component.css
create mode 100644 frontend/src/app/deposit/deposit.component.html
create mode 100644 frontend/src/app/deposit/deposit.component.ts
diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts
index f10394a..565e524 100644
--- a/backend/build.gradle.kts
+++ b/backend/build.gradle.kts
@@ -24,6 +24,7 @@ repositories {
}
dependencies {
+ implementation("com.stripe:stripe-java:20.79.0")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
compileOnly("org.projectlombok:lombok")
diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
new file mode 100644
index 0000000..c7c85a8
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
@@ -0,0 +1,48 @@
+package de.szut.casino.deposit;
+
+import com.stripe.Stripe;
+import com.stripe.exception.StripeException;
+import com.stripe.model.checkout.Session;
+import com.stripe.param.InvoiceItemCreateParams;
+import com.stripe.param.PriceCreateParams;
+import com.stripe.param.checkout.SessionCreateParams;
+import de.szut.casino.deposit.dto.AmountDto;
+import de.szut.casino.deposit.dto.SessionIdDto;
+import org.springframework.boot.autoconfigure.cassandra.CassandraProperties;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class DepositController {
+ @PostMapping("/deposit/checkout")
+ public ResponseEntity extends Object> checkout(@RequestBody AmountDto amountDto) {
+ Stripe.apiKey = "sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I";
+ try {
+ SessionCreateParams params = SessionCreateParams.builder()
+ .addLineItem(SessionCreateParams.LineItem.builder()
+ .setPriceData(InvoiceItemCreateParams.PriceData.builder()
+ .setCurrency("EUR")
+ .setUnitAmount(1L)
+ .build()
+ )
+ .build())
+ .setSuccessUrl("http://localhost:8080/deposit/success")
+ .setMode(SessionCreateParams.Mode.PAYMENT)
+ .build();
+ try {
+ Session session = Session.create(params);
+
+ return ResponseEntity.ok(new SessionIdDto(session.getId()));
+ } catch (StripeException e) {
+ return ResponseEntity.ok(e);
+ }
+ } catch (Exception e) {
+ return ResponseEntity.ok(e);
+ }
+
+ }
+}
+
diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
new file mode 100644
index 0000000..7996d85
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
@@ -0,0 +1,21 @@
+package de.szut.casino.deposit.dto;
+
+public class AmountDto {
+ private double amount;
+
+ public AmountDto() {
+ }
+
+ public AmountDto(double amount) {
+ this.amount = amount;
+ }
+
+ public double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(double amount) {
+ this.amount = amount;
+ }
+}
+
diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
new file mode 100644
index 0000000..67ade61
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
@@ -0,0 +1,21 @@
+package de.szut.casino.deposit.dto;
+
+public class SessionIdDto {
+ private String sessionId;
+
+ public SessionIdDto() {
+ }
+
+ public SessionIdDto(String sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public String getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(String sessionId) {
+ this.sessionId = sessionId;
+ }
+}
+
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index d668f7a..938ce25 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:postgresql://${DB_HOST:-localhost}:5432/postgresdb
+spring.datasource.url=jdbc:postgresql://localhost:5432/postgresdb
spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
diff --git a/frontend/bun.lock b/frontend/bun.lock
index 5011117..d2559e9 100644
--- a/frontend/bun.lock
+++ b/frontend/bun.lock
@@ -12,6 +12,7 @@
"@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
+ "@stripe/stripe-js": "^5.6.0",
"@tailwindcss/postcss": "^4.0.3",
"keycloak-angular": "^16.0.1",
"keycloak-js": "^25.0.5",
@@ -489,6 +490,8 @@
"@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="],
+ "@stripe/stripe-js": ["@stripe/stripe-js@5.6.0", "", {}, "sha512-w8CEY73X/7tw2KKlL3iOk679V9bWseE4GzNz3zlaYxcTjmcmWOathRb0emgo/QQ3eoNzmq68+2Y2gxluAv3xGw=="],
+
"@tailwindcss/node": ["@tailwindcss/node@4.0.3", "", { "dependencies": { "enhanced-resolve": "^5.18.0", "jiti": "^2.4.2", "tailwindcss": "4.0.3" } }, "sha512-QsVJokOl0pJ4AbJV33D2npvLcHGPWi5MOSZtrtE0GT3tSx+3D0JE2lokLA8yHS1x3oCY/3IyRyy7XX6tmzid7A=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.3", "@tailwindcss/oxide-darwin-arm64": "4.0.3", "@tailwindcss/oxide-darwin-x64": "4.0.3", "@tailwindcss/oxide-freebsd-x64": "4.0.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.3", "@tailwindcss/oxide-linux-arm64-musl": "4.0.3", "@tailwindcss/oxide-linux-x64-gnu": "4.0.3", "@tailwindcss/oxide-linux-x64-musl": "4.0.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.3", "@tailwindcss/oxide-win32-x64-msvc": "4.0.3" } }, "sha512-FFcp3VNvRjjmFA39ORM27g2mbflMQljhvM7gxBAujHxUy4LXlKa6yMF9wbHdTbPqTONiCyyOYxccvJyVyI/XBg=="],
diff --git a/frontend/package.json b/frontend/package.json
index 962c3f0..4840fd1 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -20,6 +20,7 @@
"@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
+ "@stripe/stripe-js": "^5.6.0",
"@tailwindcss/postcss": "^4.0.3",
"keycloak-angular": "^16.0.1",
"keycloak-js": "^25.0.5",
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 02b958c..90b84b0 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
import { LandingPageComponent } from './landing-page/landing-page.component';
import { HomepageComponent } from './homepage/homepage/homepage.component';
import { authGuard } from './auth.guard';
+import { DepositComponent } from './deposit/deposit.component';
export const routes: Routes = [
{
@@ -13,4 +14,9 @@ export const routes: Routes = [
component: HomepageComponent,
canActivate: [authGuard],
},
+ {
+ path: 'deposit',
+ component: DepositComponent,
+ canActivate: [authGuard],
+ }
];
diff --git a/frontend/src/app/deposit/deposit.component.css b/frontend/src/app/deposit/deposit.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
new file mode 100644
index 0000000..f3bbbb2
--- /dev/null
+++ b/frontend/src/app/deposit/deposit.component.html
@@ -0,0 +1,14 @@
+
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
new file mode 100644
index 0000000..f28c694
--- /dev/null
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -0,0 +1,32 @@
+import { Component, OnInit } from '@angular/core';
+import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
+import { loadStripe, Stripe } from '@stripe/stripe-js';
+
+@Component({
+ selector: 'app-deposit',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ ],
+ templateUrl: './deposit.component.html',
+ styleUrl: './deposit.component.css'
+})
+export class DepositComponent implements OnInit{
+ protected form = new FormGroup({amount: new FormControl(50, [Validators.min(50)])});
+ private stripe: Stripe | null;
+
+ async ngOnInit() {
+ this.stripe = await loadStripe('pk_test_51');
+ }
+
+ submit() {
+ if (this.stripe) {
+ fetch('/backend/deposit/checkout', {
+ method: 'POST',
+ body: JSON.stringify(this.form.value),
+ }).then(response => response.json()).then(response => {
+ this.stripe?.redirectToCheckout({sessionId: response.sessionId});
+ });
+ }
+ }
+}
--
2.47.2
From 1d0162d250e132eaab746f5bc71222376b30aa48 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:22:33 +0100
Subject: [PATCH 052/210] feat: make stripe functional
---
.../casino/deposit/DepositController.java | 44 +++++++++----------
.../de/szut/casino/deposit/dto/AmountDto.java | 26 +++++------
.../src/main/resources/application.properties | 2 +-
.../src/app/deposit/deposit.component.html | 9 ----
frontend/src/app/deposit/deposit.component.ts | 16 +++----
frontend/src/app/service/deposit.service.ts | 15 +++++++
6 files changed, 56 insertions(+), 56 deletions(-)
create mode 100644 frontend/src/app/service/deposit.service.ts
diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
index c7c85a8..965946c 100644
--- a/backend/src/main/java/de/szut/casino/deposit/DepositController.java
+++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
@@ -8,6 +8,8 @@ import com.stripe.param.PriceCreateParams;
import com.stripe.param.checkout.SessionCreateParams;
import de.szut.casino.deposit.dto.AmountDto;
import de.szut.casino.deposit.dto.SessionIdDto;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.cassandra.CassandraProperties;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@@ -17,32 +19,28 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class DepositController {
+
+ @Value("${stripe.secret.key}")
+ private String stripeKey;
+
@PostMapping("/deposit/checkout")
- public ResponseEntity extends Object> checkout(@RequestBody AmountDto amountDto) {
- Stripe.apiKey = "sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I";
- try {
- SessionCreateParams params = SessionCreateParams.builder()
- .addLineItem(SessionCreateParams.LineItem.builder()
- .setPriceData(InvoiceItemCreateParams.PriceData.builder()
- .setCurrency("EUR")
- .setUnitAmount(1L)
- .build()
- )
- .build())
- .setSuccessUrl("http://localhost:8080/deposit/success")
- .setMode(SessionCreateParams.Mode.PAYMENT)
- .build();
- try {
- Session session = Session.create(params);
+ public ResponseEntity checkout(@RequestBody @Valid AmountDto amountDto) throws StripeException {
+ Stripe.apiKey = stripeKey;
- return ResponseEntity.ok(new SessionIdDto(session.getId()));
- } catch (StripeException e) {
- return ResponseEntity.ok(e);
- }
- } catch (Exception e) {
- return ResponseEntity.ok(e);
- }
+ SessionCreateParams params = SessionCreateParams.builder()
+ .addLineItem(SessionCreateParams.LineItem.builder()
+ .setAmount((long) amountDto.getAmount() * 100)
+ .setCurrency("EUR")
+ .setQuantity(1L)
+ .setName("Einzahlung")
+ .build())
+ .setSuccessUrl("http://localhost:8080/deposit/success")
+ .setMode(SessionCreateParams.Mode.PAYMENT)
+ .build();
+ Session session = Session.create(params);
+
+ return ResponseEntity.ok(new SessionIdDto(session.getId()));
}
}
diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
index 7996d85..1f1708e 100644
--- a/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
+++ b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java
@@ -1,21 +1,17 @@
package de.szut.casino.deposit.dto;
+import jakarta.validation.constraints.Min;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
public class AmountDto {
+ @Min(50)
private double amount;
-
- public AmountDto() {
- }
-
- public AmountDto(double amount) {
- this.amount = amount;
- }
-
- public double getAmount() {
- return amount;
- }
-
- public void setAmount(double amount) {
- this.amount = amount;
- }
}
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 938ce25..7f00727 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -3,7 +3,7 @@ spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
spring.jpa.hibernate.ddl-auto=create-drop
-
+stripe.secret.key=sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I
spring.application.name=lf12_starter
#client registration configuration
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
index f3bbbb2..7476f8e 100644
--- a/frontend/src/app/deposit/deposit.component.html
+++ b/frontend/src/app/deposit/deposit.component.html
@@ -1,14 +1,5 @@
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
index f28c694..6667dcd 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -1,6 +1,7 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, inject, OnInit } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { loadStripe, Stripe } from '@stripe/stripe-js';
+import { DepositService } from '../service/deposit.service';
@Component({
selector: 'app-deposit',
@@ -13,19 +14,18 @@ import { loadStripe, Stripe } from '@stripe/stripe-js';
})
export class DepositComponent implements OnInit{
protected form = new FormGroup({amount: new FormControl(50, [Validators.min(50)])});
- private stripe: Stripe | null;
+ private stripe: Stripe | null = null;
+ private service: DepositService = inject(DepositService);
async ngOnInit() {
- this.stripe = await loadStripe('pk_test_51');
+ this.stripe = await loadStripe('pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG');
}
submit() {
if (this.stripe) {
- fetch('/backend/deposit/checkout', {
- method: 'POST',
- body: JSON.stringify(this.form.value),
- }).then(response => response.json()).then(response => {
- this.stripe?.redirectToCheckout({sessionId: response.sessionId});
+ console.log(JSON.stringify(this.form.value.amount as number));
+ this.service.handleDeposit(this.form.value.amount as number).subscribe(({sessionId}) => {
+ this.stripe?.redirectToCheckout({sessionId});
});
}
}
diff --git a/frontend/src/app/service/deposit.service.ts b/frontend/src/app/service/deposit.service.ts
new file mode 100644
index 0000000..7dd8b78
--- /dev/null
+++ b/frontend/src/app/service/deposit.service.ts
@@ -0,0 +1,15 @@
+import { inject, Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+
+@Injectable({
+ providedIn: 'root'
+})
+export class DepositService {
+ private http: HttpClient = inject(HttpClient);
+
+ handleDeposit(amount: number): Observable<{ sessionId: string }> {
+ return this.http.post<{sessionId: string}>('/backend/deposit/checkout', {amount});
+ }
+}
--
2.47.2
From 6ba4937538b102a2e4b9cb2c730c3dbc7f4a1e11 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:29:08 +0100
Subject: [PATCH 053/210] feat: add form validation
---
.../src/app/deposit/deposit.component.html | 3 ++
frontend/src/app/deposit/deposit.component.ts | 39 ++++++++++++++-----
2 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
index 7476f8e..a24f3b3 100644
--- a/frontend/src/app/deposit/deposit.component.html
+++ b/frontend/src/app/deposit/deposit.component.html
@@ -1,4 +1,7 @@
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
index db6d41a..0da8395 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -7,9 +7,7 @@ import { debounceTime } from 'rxjs';
@Component({
selector: 'app-deposit',
standalone: true,
- imports: [
- ReactiveFormsModule,
- ],
+ imports: [ReactiveFormsModule],
templateUrl: './deposit.component.html',
styleUrl: './deposit.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -25,15 +23,15 @@ export class DepositComponent implements OnInit {
amount: new FormControl(50, [Validators.min(50)]),
});
- this.form.controls['amount'].valueChanges
- .pipe(debounceTime(1000))
- .subscribe((value) => {
- if (value < 50) {
- this.errorMsg = 'Minimum Einzahlungsbetrag ist 50€';
- }
- });
+ this.form.controls['amount'].valueChanges.pipe(debounceTime(1000)).subscribe((value) => {
+ if (value < 50) {
+ this.errorMsg = 'Minimum Einzahlungsbetrag ist 50€';
+ }
+ });
- this.stripe = await loadStripe('pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG');
+ this.stripe = await loadStripe(
+ 'pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG'
+ );
}
submit() {
diff --git a/frontend/src/app/service/deposit.service.ts b/frontend/src/app/service/deposit.service.ts
index 7dd8b78..02c8ea1 100644
--- a/frontend/src/app/service/deposit.service.ts
+++ b/frontend/src/app/service/deposit.service.ts
@@ -2,14 +2,13 @@ import { inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
-
@Injectable({
- providedIn: 'root'
+ providedIn: 'root',
})
export class DepositService {
private http: HttpClient = inject(HttpClient);
handleDeposit(amount: number): Observable<{ sessionId: string }> {
- return this.http.post<{sessionId: string}>('/backend/deposit/checkout', {amount});
+ return this.http.post<{ sessionId: string }>('/backend/deposit/checkout', { amount });
}
}
--
2.47.2
From 9a63954e4bd787615c3436646ae80dca16be5789 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Thu, 13 Feb 2025 10:30:46 +0100
Subject: [PATCH 055/210] build: update release configuration for plugins and
rules
---
release.config.cjs | 75 ++++++++++++++++++++++++++++++++++++++--------
1 file changed, 62 insertions(+), 13 deletions(-)
diff --git a/release.config.cjs b/release.config.cjs
index e09738f..b6f007d 100644
--- a/release.config.cjs
+++ b/release.config.cjs
@@ -1,15 +1,64 @@
module.exports = {
-
- branches: ['main'],
- plugins: [
- '@semantic-release/commit-analyzer',
- '@semantic-release/release-notes-generator',
- '@semantic-release/changelog',
- ["@saithodev/semantic-release-gitea", {
- "giteaUrl": "https://git.simonis.lol"
- }],
+ branches: ["main"],
+ plugins: [
+ [
+ "@semantic-release/commit-analyzer",
+ {
+ preset: "angular",
+ releaseRules: [
+ { type: "feat", release: "minor" },
+ { type: "fix", release: "patch" },
+ { type: "perf", release: "patch" },
+ { type: "docs", release: "patch" },
+ { type: "style", release: "patch" },
+ { type: "refactor", release: "patch" },
+ { type: "test", release: "patch" },
+ { type: "chore", release: "patch" },
+ { type: "ci", release: "patch" },
+ { type: "build", release: "patch" },
+ { type: "revert", release: "patch" },
+ ],
+ },
],
- };
-
-
-
\ No newline at end of file
+ [
+ "@semantic-release/release-notes-generator",
+ {
+ preset: "conventionalcommits",
+ presetConfig: {
+ types: [
+ { type: "feat", section: "Features", hidden: false },
+ { type: "fix", section: "Bug Fixes", hidden: false },
+ {
+ type: "perf",
+ section: "Performance Improvements",
+ hidden: false,
+ },
+ { type: "docs", section: "Documentation", hidden: false },
+ { type: "style", section: "Code Style", hidden: false },
+ { type: "refactor", section: "Code Refactoring", hidden: false },
+ { type: "test", section: "Tests", hidden: false },
+ { type: "chore", section: "Chores", hidden: false },
+ { type: "ci", section: "Continuous Integration", hidden: false },
+ { type: "build", section: "Build System", hidden: false },
+ { type: "revert", section: "Reverts", hidden: false },
+ ],
+ },
+ parserOpts: {
+ noteKeywords: ["BREAKING CHANGE", "BREAKING CHANGES", "BREAKING"],
+ },
+ },
+ ],
+ [
+ "@semantic-release/changelog",
+ {
+ changelogFile: "CHANGELOG.md",
+ },
+ ],
+ [
+ "@saithodev/semantic-release-gitea",
+ {
+ giteaUrl: "https://git.simonis.lol",
+ },
+ ],
+ ],
+};
--
2.47.2
From c4252c97e7d60702b635ac67102d4919466ed5f4 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:33:06 +0100
Subject: [PATCH 056/210] refactor: refactor application.properties
---
backend/src/main/resources/application.properties | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 7f00727..268279f 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,9 +1,9 @@
-spring.datasource.url=jdbc:postgresql://localhost:5432/postgresdb
+spring.datasource.url=jdbc:postgresql://${DB_HOST:localhost}:5432/postgresdb
spring.datasource.username=postgres_user
spring.datasource.password=postgres_pass
server.port=8080
spring.jpa.hibernate.ddl-auto=create-drop
-stripe.secret.key=sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I
+stripe.secret.key=${STRIPE_SECRET_KEY:sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I}
spring.application.name=lf12_starter
#client registration configuration
--
2.47.2
From 704cc22858953f7babb5f906c3436c294024f93f Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Thu, 13 Feb 2025 10:29:13 +0100
Subject: [PATCH 057/210] refactor: Redirect to orginal route after login,
restructure project files
---
frontend/src/app/app.routes.ts | 8 ++++----
frontend/src/app/auth.guard.ts | 14 +++++++++++---
.../home/home.component.html} | 0
.../home/home.component.ts} | 4 ++--
.../landing/landing.component.html} | 0
.../landing/landing.component.ts} | 6 +++---
6 files changed, 20 insertions(+), 12 deletions(-)
rename frontend/src/app/{homepage/homepage/homepage.component.html => feature/home/home.component.html} (100%)
rename frontend/src/app/{homepage/homepage/homepage.component.ts => feature/home/home.component.ts} (85%)
rename frontend/src/app/{landing-page/landing-page.component.html => feature/landing/landing.component.html} (100%)
rename frontend/src/app/{landing-page/landing-page.component.ts => feature/landing/landing.component.ts} (80%)
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index 02b958c..73ed20c 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -1,16 +1,16 @@
import { Routes } from '@angular/router';
-import { LandingPageComponent } from './landing-page/landing-page.component';
-import { HomepageComponent } from './homepage/homepage/homepage.component';
+import { LandingComponent } from './feature/landing/landing.component';
+import { HomeComponent } from './feature/home/home.component';
import { authGuard } from './auth.guard';
export const routes: Routes = [
{
path: '',
- component: LandingPageComponent,
+ component: LandingComponent,
},
{
path: 'home',
- component: HomepageComponent,
+ component: HomeComponent,
canActivate: [authGuard],
},
];
diff --git a/frontend/src/app/auth.guard.ts b/frontend/src/app/auth.guard.ts
index cb2cbe9..0743ff6 100644
--- a/frontend/src/app/auth.guard.ts
+++ b/frontend/src/app/auth.guard.ts
@@ -1,8 +1,11 @@
-import { CanActivateFn } from '@angular/router';
+import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';
import { inject } from '@angular/core';
import { KeycloakService } from 'keycloak-angular';
-export const authGuard: CanActivateFn = async () => {
+export const authGuard: CanActivateFn = async (
+ route: ActivatedRouteSnapshot,
+ state: RouterStateSnapshot
+) => {
const keycloakService = inject(KeycloakService);
const isLoggedIn = keycloakService.isLoggedIn();
@@ -10,6 +13,11 @@ export const authGuard: CanActivateFn = async () => {
return true;
}
- keycloakService.login();
+ const baseurl = window.location.origin;
+
+ keycloakService.login({
+ redirectUri: `${baseurl}${state.url}`,
+ });
+
return false;
};
diff --git a/frontend/src/app/homepage/homepage/homepage.component.html b/frontend/src/app/feature/home/home.component.html
similarity index 100%
rename from frontend/src/app/homepage/homepage/homepage.component.html
rename to frontend/src/app/feature/home/home.component.html
diff --git a/frontend/src/app/homepage/homepage/homepage.component.ts b/frontend/src/app/feature/home/home.component.ts
similarity index 85%
rename from frontend/src/app/homepage/homepage/homepage.component.ts
rename to frontend/src/app/feature/home/home.component.ts
index ff894dc..06aa423 100644
--- a/frontend/src/app/homepage/homepage/homepage.component.ts
+++ b/frontend/src/app/feature/home/home.component.ts
@@ -5,10 +5,10 @@ import { KeycloakService } from 'keycloak-angular';
selector: 'app-homepage',
standalone: true,
imports: [],
- templateUrl: './homepage.component.html',
+ templateUrl: './home.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
-export class HomepageComponent {
+export class HomeComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
logout() {
diff --git a/frontend/src/app/landing-page/landing-page.component.html b/frontend/src/app/feature/landing/landing.component.html
similarity index 100%
rename from frontend/src/app/landing-page/landing-page.component.html
rename to frontend/src/app/feature/landing/landing.component.html
diff --git a/frontend/src/app/landing-page/landing-page.component.ts b/frontend/src/app/feature/landing/landing.component.ts
similarity index 80%
rename from frontend/src/app/landing-page/landing-page.component.ts
rename to frontend/src/app/feature/landing/landing.component.ts
index 1291434..d2e28c0 100644
--- a/frontend/src/app/landing-page/landing-page.component.ts
+++ b/frontend/src/app/feature/landing/landing.component.ts
@@ -3,12 +3,12 @@ import { KeycloakService } from 'keycloak-angular';
import { RouterLink } from '@angular/router';
@Component({
- selector: 'app-landing-page',
+ selector: 'app-landing',
standalone: true,
imports: [RouterLink],
- templateUrl: './landing-page.component.html',
+ templateUrl: './landing.component.html',
})
-export class LandingPageComponent {
+export class LandingComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
public isLoggedIn = this.keycloakService.isLoggedIn();
--
2.47.2
From da01e272d71857fc5c447c9b47ad1c6aa7a1177c Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:38:32 +0100
Subject: [PATCH 058/210] refactor: outsource stripe key to environment
---
frontend/src/app/deposit/deposit.component.ts | 5 ++---
frontend/src/environments/environment.ts | 3 +++
2 files changed, 5 insertions(+), 3 deletions(-)
create mode 100644 frontend/src/environments/environment.ts
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
index 0da8395..e07ee85 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -3,6 +3,7 @@ import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angula
import { loadStripe, Stripe } from '@stripe/stripe-js';
import { DepositService } from '../service/deposit.service';
import { debounceTime } from 'rxjs';
+import { environment } from '../../environments/environment';
@Component({
selector: 'app-deposit',
@@ -29,9 +30,7 @@ export class DepositComponent implements OnInit {
}
});
- this.stripe = await loadStripe(
- 'pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG'
- );
+ this.stripe = await loadStripe(environment.STRIPE_KEY);
}
submit() {
diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts
new file mode 100644
index 0000000..f0dc69d
--- /dev/null
+++ b/frontend/src/environments/environment.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ STRIPE_KEY: 'pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG',
+}
--
2.47.2
From cd6ace28f4a7d0df485c964d8d90c3ab4ec693ec Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:42:39 +0100
Subject: [PATCH 059/210] style: style form
---
.../src/app/deposit/deposit.component.html | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
index cac83b2..9a0be93 100644
--- a/frontend/src/app/deposit/deposit.component.html
+++ b/frontend/src/app/deposit/deposit.component.html
@@ -1,8 +1,12 @@
-
--
2.47.2
From 7b020aee759f14308b4ab112368a6da0c56a2dae Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 10:42:53 +0100
Subject: [PATCH 060/210] refactor: run prettier
---
frontend/src/app/deposit/deposit.component.html | 13 +++++++++++--
frontend/src/environments/environment.ts | 5 +++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
index 9a0be93..1bdaf6e 100644
--- a/frontend/src/app/deposit/deposit.component.html
+++ b/frontend/src/app/deposit/deposit.component.html
@@ -4,9 +4,18 @@
-
+
-
+
Einzahlen
diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts
index f0dc69d..53866cc 100644
--- a/frontend/src/environments/environment.ts
+++ b/frontend/src/environments/environment.ts
@@ -1,3 +1,4 @@
export const environment = {
- STRIPE_KEY: 'pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG',
-}
+ STRIPE_KEY:
+ 'pk_test_51QrePYIvCfqz7ANgMizBorPpVjJ8S6gcaL4yvcMQnVaKyReqcQ6jqaQEF7aDZbDu8rNVsTZrw8ABek4ToxQX7KZe00jpGh8naG',
+};
--
2.47.2
From 372449cd049839c1702a13cdf4a54a6c8e3b9625 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Thu, 13 Feb 2025 10:58:13 +0100
Subject: [PATCH 061/210] style: Configure and run eslint
---
frontend/angular.json | 15 +-
frontend/bun.lock | 287 ++++++++++++++++++++++++++++--
frontend/eslint.config.js | 43 +++++
frontend/package.json | 10 +-
frontend/src/app/app.component.ts | 1 -
5 files changed, 335 insertions(+), 21 deletions(-)
create mode 100644 frontend/eslint.config.js
diff --git a/frontend/angular.json b/frontend/angular.json
index 96fc714..f7a1430 100644
--- a/frontend/angular.json
+++ b/frontend/angular.json
@@ -82,11 +82,24 @@
],
"scripts": []
}
+ },
+ "lint": {
+ "builder": "@angular-eslint/builder:lint",
+ "options": {
+ "lintFilePatterns": [
+ "src/**/*.ts",
+ "src/**/*.html"
+ ]
+ }
}
}
}
},
"cli": {
- "analytics": "33c8483f-3876-4eb5-9c9b-1001cab9b273"
+ "analytics": "33c8483f-3876-4eb5-9c9b-1001cab9b273",
+ "packageManager": "bun",
+ "schematicCollections": [
+ "angular-eslint"
+ ]
}
}
diff --git a/frontend/bun.lock b/frontend/bun.lock
index 5011117..dd78f81 100644
--- a/frontend/bun.lock
+++ b/frontend/bun.lock
@@ -25,6 +25,8 @@
"@angular/cli": "^18.2.2",
"@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0",
+ "angular-eslint": "19.1.0",
+ "eslint": "^9.20.0",
"jasmine-core": "~5.2.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0",
@@ -33,6 +35,7 @@
"karma-jasmine-html-reporter": "~2.1.0",
"prettier": "^3.4.2",
"typescript": "~5.5.2",
+ "typescript-eslint": "8.23.0",
},
},
},
@@ -51,6 +54,20 @@
"@angular-devkit/schematics": ["@angular-devkit/schematics@18.2.14", "", { "dependencies": { "@angular-devkit/core": "18.2.14", "jsonc-parser": "3.3.1", "magic-string": "0.30.11", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-mukjZIHHB7gWratq8fZwUq5WZ+1bF4feG/idXr1wgQ+/FqWjs2PP7HDesHVcPymmRulpTyCpB7TNB1O1fgnCpA=="],
+ "@angular-eslint/builder": ["@angular-eslint/builder@19.1.0", "", { "dependencies": { "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-LWdQMTES/7GySlpTNFJn3k33ZGmjjWlHI/+IHV7B3xHQ9hj4MPK4ACmE/PNOAIQ9LwQm7sKS+3cTMxOZQ/cvSg=="],
+
+ "@angular-eslint/bundled-angular-compiler": ["@angular-eslint/bundled-angular-compiler@19.1.0", "", {}, "sha512-HUJyukRvnh8Z9lIdxdblBRuBaPYEVv4iAYZMw3d+dn4rrM27Nt5oh3/zkwYrrPkt36tZdeXdDWrOuz9jgjVN5w=="],
+
+ "@angular-eslint/eslint-plugin": ["@angular-eslint/eslint-plugin@19.1.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.1.0", "@angular-eslint/utils": "19.1.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-TDO0+Ry+oNkxnaLHogKp1k2aey6IkJef5d7hathE4UFT6owjRizltWaRoX6bGw7Qu1yagVLL8L2Se8SddxSPAQ=="],
+
+ "@angular-eslint/eslint-plugin-template": ["@angular-eslint/eslint-plugin-template@19.1.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.1.0", "@angular-eslint/utils": "19.1.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-bIUizkCY40mnU8oAO1tLV7uN2H/cHf1evLlhpqlb9JYwc5dT2moiEhNDo61OtOgkJmDGNuThAeO9Xk9hGQc7nA=="],
+
+ "@angular-eslint/schematics": ["@angular-eslint/schematics@19.1.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/eslint-plugin": "19.1.0", "@angular-eslint/eslint-plugin-template": "19.1.0", "ignore": "7.0.3", "semver": "7.7.1", "strip-json-comments": "3.1.1" } }, "sha512-6S1FjmM7rZxc0u0W0KjqWYOkFQ0q89IGyjPkdUt1a8NwRnWg3VoXp4WYfeuZOjda/FEYuBS/E6rckLAMp0h6Aw=="],
+
+ "@angular-eslint/template-parser": ["@angular-eslint/template-parser@19.1.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.1.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-wbMi7adlC+uYqZo7NHNBShpNhFJRZsXLqihqvFpAUt1Ei6uDX8HR6MyMEDZ9tUnlqtPVW5nmbedPyLVG7HkjAA=="],
+
+ "@angular-eslint/utils": ["@angular-eslint/utils@19.1.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.1.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-mcb7hPMH/u6wwUwvsewrmgb9y9NWN6ZacvpUvKlTOxF/jOtTdsu0XfV4YB43sp2A8NWzYzX0Str4c8K1xSmuBQ=="],
+
"@angular/animations": ["@angular/animations@18.2.13", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "18.2.13" } }, "sha512-rG5J5Ek5Hg+Tz2NjkNOaG6PupiNK/lPfophXpsR1t/nWujqnMWX2krahD/i6kgD+jNWNKCJCYSOVvCx/BHOtKA=="],
"@angular/build": ["@angular/build@18.2.14", "", { "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1802.14", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.24.7", "@inquirer/confirm": "3.1.22", "@vitejs/plugin-basic-ssl": "1.1.0", "browserslist": "^4.23.0", "critters": "0.0.24", "esbuild": "0.23.0", "fast-glob": "3.3.2", "https-proxy-agent": "7.0.5", "listr2": "8.2.4", "lmdb": "3.0.13", "magic-string": "0.30.11", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.6.1", "rollup": "4.22.4", "sass": "1.77.6", "semver": "7.6.3", "vite": "5.4.14", "watchpack": "2.4.1" }, "peerDependencies": { "@angular/compiler-cli": "^18.0.0", "@angular/localize": "^18.0.0", "@angular/platform-server": "^18.0.0", "@angular/service-worker": "^18.0.0", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", "typescript": ">=5.4 <5.6" }, "optionalPeers": ["@angular/localize", "@angular/platform-server", "@angular/service-worker", "less", "postcss", "tailwindcss"] }, "sha512-9g24Oe/ZLULacW3hEpRCjSZIJPJTzN5BeFbA27epSV5NsrQOoeUGsEpRs90Zmt6eReO0fW1BGshWRoZtpSedcw=="],
@@ -333,6 +350,30 @@
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g=="],
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="],
+
+ "@eslint/core": ["@eslint/core@0.11.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="],
+
+ "@eslint/js": ["@eslint/js@9.20.0", "", {}, "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="],
+
"@inquirer/checkbox": ["@inquirer/checkbox@2.5.0", "", { "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/figures": "^1.0.5", "@inquirer/type": "^1.5.3", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" } }, "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA=="],
"@inquirer/confirm": ["@inquirer/confirm@3.1.22", "", { "dependencies": { "@inquirer/core": "^9.0.10", "@inquirer/type": "^1.5.2" } }, "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg=="],
@@ -571,6 +612,22 @@
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.23.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.23.0", "@typescript-eslint/type-utils": "8.23.0", "@typescript-eslint/utils": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.23.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.23.0", "@typescript-eslint/types": "8.23.0", "@typescript-eslint/typescript-estree": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.24.0", "", { "dependencies": { "@typescript-eslint/types": "8.24.0", "@typescript-eslint/visitor-keys": "8.24.0" } }, "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.23.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.23.0", "@typescript-eslint/utils": "8.23.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.24.0", "", {}, "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.24.0", "", { "dependencies": { "@typescript-eslint/types": "8.24.0", "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.24.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.24.0", "@typescript-eslint/types": "8.24.0", "@typescript-eslint/typescript-estree": "8.24.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ=="],
+
"@vitejs/plugin-basic-ssl": ["@vitejs/plugin-basic-ssl@1.1.0", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A=="],
"@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
@@ -617,18 +674,22 @@
"acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="],
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
"adjust-sourcemap-loader": ["adjust-sourcemap-loader@4.0.0", "", { "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" } }, "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A=="],
"agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="],
"aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="],
- "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
"ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
"ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="],
+ "angular-eslint": ["angular-eslint@19.1.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/builder": "19.1.0", "@angular-eslint/eslint-plugin": "19.1.0", "@angular-eslint/eslint-plugin-template": "19.1.0", "@angular-eslint/schematics": "19.1.0", "@angular-eslint/template-parser": "19.1.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*", "typescript-eslint": "^8.0.0" } }, "sha512-teauJL5Q6Cc7PBbGG52LF3Lf2s3aI5/Ksoh3MAsJ8Vgsf2cDwBjVxFZqTbAhMYzYp2UzVJ5knXIsammYHCVNBw=="],
+
"ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
"ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
@@ -643,10 +704,14 @@
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
"array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
"autoprefixer": ["autoprefixer@10.4.20", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g=="],
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
"babel-loader": ["babel-loader@9.1.3", "", { "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", "webpack": ">=5" } }, "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw=="],
"babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.12", "", { "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og=="],
@@ -785,6 +850,8 @@
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
"default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="],
"default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="],
@@ -869,11 +936,21 @@
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
- "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.20.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g=="],
+
+ "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
+
+ "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
+
+ "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
- "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
@@ -899,22 +976,28 @@
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
"fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="],
"fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="],
"faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="],
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
"finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="],
"find-cache-dir": ["find-cache-dir@4.0.0", "", { "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" } }, "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg=="],
- "find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="],
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
"flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="],
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
"flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="],
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
@@ -955,7 +1038,7 @@
"glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
- "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
+ "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
"globby": ["globby@14.0.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.1.0" } }, "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw=="],
@@ -963,6 +1046,8 @@
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
+
"handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
@@ -1107,9 +1192,13 @@
"jsesc": ["jsesc@2.5.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="],
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
- "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
@@ -1137,6 +1226,8 @@
"keycloak-js": ["keycloak-js@25.0.6", "", { "dependencies": { "js-sha256": "^0.11.0", "jwt-decode": "^4.0.0" } }, "sha512-Km+dc+XfNvY6a4az5jcxTK0zPk52ns9mAxLrHj7lF3V+riVYvQujfHmhayltJDjEpSOJ4C8a57LFNNKnNnRP2g=="],
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
"launch-editor": ["launch-editor@2.9.1", "", { "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w=="],
@@ -1145,6 +1236,8 @@
"less-loader": ["less-loader@12.2.0", "", { "peerDependencies": { "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg=="],
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
"license-webpack-plugin": ["license-webpack-plugin@4.0.2", "", { "dependencies": { "webpack-sources": "^3.0.0" } }, "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw=="],
"lightningcss": ["lightningcss@1.29.1", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-musl": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-x64-msvc": "1.29.1" } }, "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q=="],
@@ -1179,12 +1272,14 @@
"loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="],
- "locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="],
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
"lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
"lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
"log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
"log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
@@ -1263,6 +1358,8 @@
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
"needle": ["needle@3.3.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, "bin": { "needle": "bin/needle" } }, "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q=="],
"negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="],
@@ -1325,15 +1422,17 @@
"open": ["open@10.1.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw=="],
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
"ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="],
"ordered-binary": ["ordered-binary@1.5.3", "", {}, "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA=="],
"os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="],
- "p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="],
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
- "p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="],
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
"p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="],
@@ -1357,7 +1456,7 @@
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
- "path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
"path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
@@ -1399,6 +1498,8 @@
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
"prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="],
"proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="],
@@ -1413,7 +1514,7 @@
"prr": ["prr@1.0.1", "", {}, "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="],
- "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="],
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"qjobs": ["qjobs@1.2.0", "", {}, "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg=="],
@@ -1587,6 +1688,8 @@
"strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
@@ -1617,10 +1720,14 @@
"tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+ "ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="],
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"tuf-js": ["tuf-js@2.2.1", "", { "dependencies": { "@tufjs/models": "2.0.1", "debug": "^4.3.4", "make-fetch-happen": "^13.0.1" } }, "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA=="],
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
"type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
@@ -1629,6 +1736,8 @@
"typescript": ["typescript@5.5.4", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q=="],
+ "typescript-eslint": ["typescript-eslint@8.23.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.23.0", "@typescript-eslint/parser": "8.23.0", "@typescript-eslint/utils": "8.23.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ=="],
+
"ua-parser-js": ["ua-parser-js@0.7.40", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ=="],
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
@@ -1699,6 +1808,8 @@
"wildcard": ["wildcard@2.0.1", "", {}, "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="],
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
"wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="],
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
@@ -1715,7 +1826,7 @@
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
- "yocto-queue": ["yocto-queue@1.1.1", "", {}, "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g=="],
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
"yoctocolors-cjs": ["yoctocolors-cjs@2.1.2", "", {}, "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA=="],
@@ -1725,8 +1836,22 @@
"@angular-devkit/build-angular/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="],
+ "@angular-devkit/core/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
"@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+ "@angular-eslint/builder/@angular-devkit/architect": ["@angular-devkit/architect@0.1901.7", "", { "dependencies": { "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" } }, "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw=="],
+
+ "@angular-eslint/builder/@angular-devkit/core": ["@angular-devkit/core@19.1.7", "", { "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^4.0.0" }, "optionalPeers": ["chokidar"] }, "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ=="],
+
+ "@angular-eslint/schematics/@angular-devkit/core": ["@angular-devkit/core@19.1.7", "", { "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^4.0.0" }, "optionalPeers": ["chokidar"] }, "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ=="],
+
+ "@angular-eslint/schematics/@angular-devkit/schematics": ["@angular-devkit/schematics@19.1.7", "", { "dependencies": { "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg=="],
+
+ "@angular-eslint/schematics/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="],
+
+ "@angular-eslint/schematics/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
"@angular/compiler-cli/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"@babel/core/@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="],
@@ -1749,6 +1874,8 @@
"@babel/plugin-transform-classes/@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="],
+ "@babel/plugin-transform-classes/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
+
"@babel/plugin-transform-private-property-in-object/@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="],
"@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
@@ -1757,6 +1884,14 @@
"@babel/traverse/@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="],
+ "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="],
+
+ "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
+
"@inquirer/core/@inquirer/type": ["@inquirer/type@2.0.0", "", { "dependencies": { "mute-stream": "^1.0.0" } }, "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag=="],
"@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
@@ -1795,10 +1930,42 @@
"@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="],
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0" } }, "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw=="],
+
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.23.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.23.0", "@typescript-eslint/types": "8.23.0", "@typescript-eslint/typescript-estree": "8.23.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0" } }, "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ=="],
+
+ "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.24.0", "", { "dependencies": { "@typescript-eslint/types": "8.24.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.23.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.23.0", "@typescript-eslint/types": "8.23.0", "@typescript-eslint/typescript-estree": "8.23.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA=="],
+
+ "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.24.0", "", { "dependencies": { "@typescript-eslint/types": "8.24.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
+ "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
"accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
"adjust-sourcemap-loader/loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="],
+ "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "angular-eslint/@angular-devkit/core": ["@angular-devkit/core@19.1.7", "", { "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^4.0.0" }, "optionalPeers": ["chokidar"] }, "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ=="],
+
+ "angular-eslint/@angular-devkit/schematics": ["@angular-devkit/schematics@19.1.7", "", { "dependencies": { "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg=="],
+
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
@@ -1833,7 +2000,7 @@
"engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
- "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+ "ent/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="],
"execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
@@ -1923,6 +2090,8 @@
"path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+ "pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="],
+
"postcss-loader/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"promise-retry/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
@@ -1943,6 +2112,8 @@
"sass/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+ "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
"schema-utils/ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
"send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
@@ -1971,10 +2142,12 @@
"tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
- "uri-js/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.23.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.23.0", "@typescript-eslint/types": "8.23.0", "@typescript-eslint/typescript-estree": "8.23.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA=="],
"vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
+ "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
"webpack/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="],
"webpack-dev-server/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
@@ -1989,6 +2162,18 @@
"wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+ "@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@angular-eslint/builder/@angular-devkit/core/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "@angular-eslint/builder/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "@angular-eslint/schematics/@angular-devkit/core/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "@angular-eslint/schematics/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "@angular-eslint/schematics/@angular-devkit/schematics/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
+
"@babel/core/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
"@babel/traverse/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
@@ -2009,6 +2194,38 @@
"@tufjs/models/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0" } }, "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+ "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "angular-eslint/@angular-devkit/core/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "angular-eslint/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "angular-eslint/@angular-devkit/schematics/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
+
"body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
@@ -2063,10 +2280,16 @@
"node-gyp/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="],
+ "pkg-dir/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="],
+
+ "pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
+
"sass/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"sass/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+ "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
"send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
@@ -2081,6 +2304,12 @@
"tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0" } }, "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw=="],
+
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.23.0", "", {}, "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ=="],
+
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.23.0", "", { "dependencies": { "@typescript-eslint/types": "8.23.0", "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ=="],
+
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
@@ -2133,7 +2362,7 @@
"webpack-dev-server/rimraf/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
- "webpack/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+ "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
"webpack/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="],
@@ -2141,8 +2370,22 @@
"wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
+ "@angular-eslint/builder/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@angular-eslint/schematics/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
"@npmcli/package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
+ "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+ "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+ "angular-eslint/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
"cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
"cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
@@ -2161,16 +2404,28 @@
"node-gyp/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+ "pkg-dir/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="],
+
"sass/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+
"webpack-dev-server/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"webpack-dev-server/rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
- "webpack/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+ "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
"karma-coverage/istanbul-lib-instrument/@babel/core/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+ "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="],
+
+ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
"webpack-dev-server/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+ "pkg-dir/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.1.1", "", {}, "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g=="],
}
}
diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js
new file mode 100644
index 0000000..99a007a
--- /dev/null
+++ b/frontend/eslint.config.js
@@ -0,0 +1,43 @@
+// @ts-check
+const eslint = require("@eslint/js");
+const tseslint = require("typescript-eslint");
+const angular = require("angular-eslint");
+
+module.exports = tseslint.config(
+ {
+ files: ["**/*.ts"],
+ extends: [
+ eslint.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...tseslint.configs.stylistic,
+ ...angular.configs.tsRecommended,
+ ],
+ processor: angular.processInlineTemplates,
+ rules: {
+ "@angular-eslint/directive-selector": [
+ "error",
+ {
+ type: "attribute",
+ prefix: "app",
+ style: "camelCase",
+ },
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ type: "element",
+ prefix: "app",
+ style: "kebab-case",
+ },
+ ],
+ },
+ },
+ {
+ files: ["**/*.html"],
+ extends: [
+ ...angular.configs.templateRecommended,
+ ...angular.configs.templateAccessibility,
+ ],
+ rules: {},
+ }
+);
diff --git a/frontend/package.json b/frontend/package.json
index 962c3f0..2a1f257 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -8,7 +8,8 @@
"watch": "bunx @angular/cli build --watch --configuration development",
"test": "bunx @angular/cli test",
"format": "prettier --write \"src/**/*.{ts,html,css,scss}\"",
- "format:check": "prettier --check \"src/**/*.{ts,html,css,scss}\""
+ "format:check": "prettier --check \"src/**/*.{ts,html,css,scss}\"",
+ "lint": "ng lint"
},
"private": true,
"dependencies": {
@@ -33,6 +34,8 @@
"@angular/cli": "^18.2.2",
"@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0",
+ "angular-eslint": "19.1.0",
+ "eslint": "^9.20.0",
"jasmine-core": "~5.2.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0",
@@ -40,6 +43,7 @@
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"prettier": "^3.4.2",
- "typescript": "~5.5.2"
+ "typescript": "~5.5.2",
+ "typescript-eslint": "8.23.0"
}
-}
+}
\ No newline at end of file
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts
index 7acf29a..8dbb14d 100644
--- a/frontend/src/app/app.component.ts
+++ b/frontend/src/app/app.component.ts
@@ -13,5 +13,4 @@ import { KeycloakAngularModule } from 'keycloak-angular';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
- constructor() {}
}
--
2.47.2
From 3bea232dfb977640268df46ecc6d5d8b637391eb Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Thu, 13 Feb 2025 10:58:29 +0100
Subject: [PATCH 062/210] style: Run prettier
---
frontend/src/app/app.component.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts
index 8dbb14d..7dea888 100644
--- a/frontend/src/app/app.component.ts
+++ b/frontend/src/app/app.component.ts
@@ -12,5 +12,4 @@ import { KeycloakAngularModule } from 'keycloak-angular';
styleUrl: './app.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
-export class AppComponent {
-}
+export class AppComponent {}
--
2.47.2
From 43db82da8fd999aad2c6b1ab6371e13e1be5f0a8 Mon Sep 17 00:00:00 2001
From: Jan Klattenhoff
Date: Thu, 13 Feb 2025 11:00:53 +0100
Subject: [PATCH 063/210] ci: add eslint job to CI workflow
---
.gitea/workflows/ci.yml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index eaead1c..b1eaab8 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -4,6 +4,25 @@ on:
pull_request:
jobs:
+ eslint:
+ name: eslint
+ runs-on: vps-4
+ container:
+ image: catthehacker/ubuntu:act-latest
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ - name: Install bun
+ uses: oven-sh/setup-bun@v2
+ - name: Install dependencies
+ run: |
+ cd frontend
+ bun install
+ - name: Run Eslint
+ run: |
+ cd frontend
+ bun run lint
+
prettier:
name: prettier
runs-on: vps-4
--
2.47.2
From 1f49bc6a3d2be2414290d7c9d78b548503f76190 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 11:00:27 +0100
Subject: [PATCH 064/210] refactor: add dynamic host to success url
---
.../java/de/szut/casino/deposit/DepositController.java | 8 ++++++--
frontend/src/app/deposit/deposit.component.ts | 3 ++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
index 965946c..0e1ade5 100644
--- a/backend/src/main/java/de/szut/casino/deposit/DepositController.java
+++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
@@ -11,6 +11,7 @@ import de.szut.casino.deposit.dto.SessionIdDto;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.cassandra.CassandraProperties;
+import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -24,7 +25,10 @@ public class DepositController {
private String stripeKey;
@PostMapping("/deposit/checkout")
- public ResponseEntity checkout(@RequestBody @Valid AmountDto amountDto) throws StripeException {
+ public ResponseEntity checkout(
+ @RequestBody @Valid AmountDto amountDto,
+ @RequestHeader("Origin") String origin
+ ) throws StripeException {
Stripe.apiKey = stripeKey;
SessionCreateParams params = SessionCreateParams.builder()
@@ -34,7 +38,7 @@ public class DepositController {
.setQuantity(1L)
.setName("Einzahlung")
.build())
- .setSuccessUrl("http://localhost:8080/deposit/success")
+ .setSuccessUrl(origin+"/deposit/success")
.setMode(SessionCreateParams.Mode.PAYMENT)
.build();
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
index e07ee85..e55dbc6 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -4,11 +4,12 @@ import { loadStripe, Stripe } from '@stripe/stripe-js';
import { DepositService } from '../service/deposit.service';
import { debounceTime } from 'rxjs';
import { environment } from '../../environments/environment';
+import { NgIf } from '@angular/common';
@Component({
selector: 'app-deposit',
standalone: true,
- imports: [ReactiveFormsModule],
+ imports: [ReactiveFormsModule, NgIf],
templateUrl: './deposit.component.html',
styleUrl: './deposit.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
--
2.47.2
From e2927abe6085fd33f5734d2e170907e423a89d69 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 11:07:59 +0100
Subject: [PATCH 065/210] refactor: add lombok attributes to dto
---
.../szut/casino/deposit/dto/SessionIdDto.java | 24 +++++++------------
1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
index 67ade61..b3de1bc 100644
--- a/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
+++ b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java
@@ -1,21 +1,15 @@
package de.szut.casino.deposit.dto;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
public class SessionIdDto {
private String sessionId;
-
- public SessionIdDto() {
- }
-
- public SessionIdDto(String sessionId) {
- this.sessionId = sessionId;
- }
-
- public String getSessionId() {
- return sessionId;
- }
-
- public void setSessionId(String sessionId) {
- this.sessionId = sessionId;
- }
}
--
2.47.2
From b7a60f0c53ffcff04ede6298fcfb28dbdb7b1dcd Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Thu, 13 Feb 2025 11:11:08 +0100
Subject: [PATCH 066/210] style: run eslint
---
frontend/src/app/deposit/deposit.component.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts
index e55dbc6..0d56c70 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/deposit/deposit.component.ts
@@ -16,7 +16,7 @@ import { NgIf } from '@angular/common';
})
export class DepositComponent implements OnInit {
protected form!: FormGroup;
- protected errorMsg: string = '';
+ protected errorMsg = '';
private stripe: Stripe | null = null;
private service: DepositService = inject(DepositService);
--
2.47.2
From c7d62bb4e34c64c501760c31ca7aeabcb3226820 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Thu, 13 Feb 2025 11:35:30 +0100
Subject: [PATCH 067/210] feat: payment modal
---
frontend/angular.json | 2 ++
frontend/bun.lock | 6 ++++++
frontend/package.json | 2 ++
frontend/src/app/app.config.ts | 3 ++-
frontend/src/app/app.routes.ts | 2 +-
.../src/app/deposit/deposit.component.css | 0
.../src/app/deposit/deposit.component.html | 21 -------------------
.../feature/deposit/deposit.component.html | 20 ++++++++++++++++++
.../deposit/deposit.component.ts | 19 +++++++++++++----
.../src/app/feature/home/home.component.html | 2 +-
.../src/app/feature/home/home.component.ts | 13 +++++++++---
frontend/src/index.html | 6 ++++--
frontend/src/styles.css | 16 ++++++++++++++
13 files changed, 79 insertions(+), 33 deletions(-)
delete mode 100644 frontend/src/app/deposit/deposit.component.css
delete mode 100644 frontend/src/app/deposit/deposit.component.html
create mode 100644 frontend/src/app/feature/deposit/deposit.component.html
rename frontend/src/app/{ => feature}/deposit/deposit.component.ts (73%)
diff --git a/frontend/angular.json b/frontend/angular.json
index f7a1430..a6a1c7c 100644
--- a/frontend/angular.json
+++ b/frontend/angular.json
@@ -24,6 +24,7 @@
}
],
"styles": [
+ "@angular/material/prebuilt-themes/azure-blue.css",
"src/styles.css"
],
"scripts": []
@@ -78,6 +79,7 @@
}
],
"styles": [
+ "@angular/material/prebuilt-themes/azure-blue.css",
"src/styles.css"
],
"scripts": []
diff --git a/frontend/bun.lock b/frontend/bun.lock
index 2154b1a..f09b071 100644
--- a/frontend/bun.lock
+++ b/frontend/bun.lock
@@ -5,10 +5,12 @@
"name": "lf10-starter2024",
"dependencies": {
"@angular/animations": "^18.2.0",
+ "@angular/cdk": "~18.2.14",
"@angular/common": "^18.2.0",
"@angular/compiler": "^18.2.0",
"@angular/core": "^18.2.0",
"@angular/forms": "^18.2.0",
+ "@angular/material": "~18.2.14",
"@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
@@ -73,6 +75,8 @@
"@angular/build": ["@angular/build@18.2.14", "", { "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1802.14", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", "@babel/plugin-syntax-import-attributes": "7.24.7", "@inquirer/confirm": "3.1.22", "@vitejs/plugin-basic-ssl": "1.1.0", "browserslist": "^4.23.0", "critters": "0.0.24", "esbuild": "0.23.0", "fast-glob": "3.3.2", "https-proxy-agent": "7.0.5", "listr2": "8.2.4", "lmdb": "3.0.13", "magic-string": "0.30.11", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.6.1", "rollup": "4.22.4", "sass": "1.77.6", "semver": "7.6.3", "vite": "5.4.14", "watchpack": "2.4.1" }, "peerDependencies": { "@angular/compiler-cli": "^18.0.0", "@angular/localize": "^18.0.0", "@angular/platform-server": "^18.0.0", "@angular/service-worker": "^18.0.0", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", "typescript": ">=5.4 <5.6" }, "optionalPeers": ["@angular/localize", "@angular/platform-server", "@angular/service-worker", "less", "postcss", "tailwindcss"] }, "sha512-9g24Oe/ZLULacW3hEpRCjSZIJPJTzN5BeFbA27epSV5NsrQOoeUGsEpRs90Zmt6eReO0fW1BGshWRoZtpSedcw=="],
+ "@angular/cdk": ["@angular/cdk@18.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "optionalDependencies": { "parse5": "^7.1.2" }, "peerDependencies": { "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-vDyOh1lwjfVk9OqoroZAP8pf3xxKUvyl+TVR8nJxL4c5fOfUFkD7l94HaanqKSRwJcI2xiztuu92IVoHn8T33Q=="],
+
"@angular/cli": ["@angular/cli@18.2.14", "", { "dependencies": { "@angular-devkit/architect": "0.1802.14", "@angular-devkit/core": "18.2.14", "@angular-devkit/schematics": "18.2.14", "@inquirer/prompts": "5.3.8", "@listr2/prompt-adapter-inquirer": "2.0.15", "@schematics/angular": "18.2.14", "@yarnpkg/lockfile": "1.1.0", "ini": "4.1.3", "jsonc-parser": "3.3.1", "listr2": "8.2.4", "npm-package-arg": "11.0.3", "npm-pick-manifest": "9.1.0", "pacote": "18.0.6", "resolve": "1.22.8", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" } }, "sha512-kWgRRQtJPkr8iwN7DMbTi3sXOnv7H5QhbU/GgD3nNX3D8YCSPmnby4PAE/P3wn7FsIK9JsSchsCt7MZ37Urh9A=="],
"@angular/common": ["@angular/common@18.2.13", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "18.2.13", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-4ZqrNp1PoZo7VNvW+sbSc2CB2axP1sCH2wXl8B0wdjsj8JY1hF1OhuugwhpAHtGxqewed2kCXayE+ZJqSTV4jw=="],
@@ -85,6 +89,8 @@
"@angular/forms": ["@angular/forms@18.2.13", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "18.2.13", "@angular/core": "18.2.13", "@angular/platform-browser": "18.2.13", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-A67D867fu3DSBhdLWWZl/F5pr7v2+dRM2u3U7ZJ0ewh4a+sv+0yqWdJW+a8xIoiHxS+btGEJL2qAKJiH+MCFfg=="],
+ "@angular/material": ["@angular/material@18.2.14", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", "@angular/cdk": "18.2.14", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", "@angular/platform-browser": "^18.0.0 || ^19.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-28pxzJP49Mymt664WnCtPkKeg7kXUsQKTKGf/Kl95rNTEdTJLbnlcc8wV0rT0yQNR7kXgpfBnG7h0ETLv/iu5Q=="],
+
"@angular/platform-browser": ["@angular/platform-browser@18.2.13", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "18.2.13", "@angular/common": "18.2.13", "@angular/core": "18.2.13" }, "optionalPeers": ["@angular/animations"] }, "sha512-tu7ZzY6qD3ATdWFzcTcsAKe7M6cJeWbT/4/bF9unyGO3XBPcNYDKoiz10+7ap2PUd0fmPwvuvTvSNJiFEBnB8Q=="],
"@angular/platform-browser-dynamic": ["@angular/platform-browser-dynamic@18.2.13", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "18.2.13", "@angular/compiler": "18.2.13", "@angular/core": "18.2.13", "@angular/platform-browser": "18.2.13" } }, "sha512-kbQCf9+8EpuJC7buBxhSiwBtXvjAwAKh6MznD6zd2pyCYqfY6gfRCZQRtK59IfgVtKmEONWI9grEyNIRoTmqJg=="],
diff --git a/frontend/package.json b/frontend/package.json
index 6d79510..c6be094 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,10 +14,12 @@
"private": true,
"dependencies": {
"@angular/animations": "^18.2.0",
+ "@angular/cdk": "~18.2.14",
"@angular/common": "^18.2.0",
"@angular/compiler": "^18.2.0",
"@angular/core": "^18.2.0",
"@angular/forms": "^18.2.0",
+ "@angular/material": "~18.2.14",
"@angular/platform-browser": "^18.2.0",
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
diff --git a/frontend/src/app/app.config.ts b/frontend/src/app/app.config.ts
index e7761ba..f7dce41 100644
--- a/frontend/src/app/app.config.ts
+++ b/frontend/src/app/app.config.ts
@@ -12,6 +12,7 @@ import {
KeycloakService,
} from 'keycloak-angular';
import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
+import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
export const initializeKeycloak = (keycloak: KeycloakService) => async () =>
keycloak.init({
@@ -50,6 +51,6 @@ export const appConfig: ApplicationConfig = {
provide: HTTP_INTERCEPTORS,
useClass: KeycloakBearerInterceptor,
multi: true,
- },
+ }, provideAnimationsAsync(),
],
};
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index b58c796..028f3db 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -2,7 +2,7 @@ import { Routes } from '@angular/router';
import { LandingComponent } from './feature/landing/landing.component';
import { HomeComponent } from './feature/home/home.component';
import { authGuard } from './auth.guard';
-import { DepositComponent } from './deposit/deposit.component';
+import { DepositComponent } from './feature/deposit/deposit.component';
export const routes: Routes = [
{
diff --git a/frontend/src/app/deposit/deposit.component.css b/frontend/src/app/deposit/deposit.component.css
deleted file mode 100644
index e69de29..0000000
diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html
deleted file mode 100644
index 1bdaf6e..0000000
--- a/frontend/src/app/deposit/deposit.component.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
diff --git a/frontend/src/app/feature/deposit/deposit.component.html b/frontend/src/app/feature/deposit/deposit.component.html
new file mode 100644
index 0000000..79ac16d
--- /dev/null
+++ b/frontend/src/app/feature/deposit/deposit.component.html
@@ -0,0 +1,20 @@
+Guthaben aufladen
+
+
+
+
+ Abbrechen
+ Einzahlen
+
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/feature/deposit/deposit.component.ts
similarity index 73%
rename from frontend/src/app/deposit/deposit.component.ts
rename to frontend/src/app/feature/deposit/deposit.component.ts
index 0d56c70..7cfd834 100644
--- a/frontend/src/app/deposit/deposit.component.ts
+++ b/frontend/src/app/feature/deposit/deposit.component.ts
@@ -1,17 +1,23 @@
import { ChangeDetectionStrategy, Component, inject, OnInit } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { loadStripe, Stripe } from '@stripe/stripe-js';
-import { DepositService } from '../service/deposit.service';
+import { DepositService } from '../../service/deposit.service';
import { debounceTime } from 'rxjs';
-import { environment } from '../../environments/environment';
+import { environment } from '../../../environments/environment';
import { NgIf } from '@angular/common';
+import {
+ MatDialogActions,
+ MatDialogClose,
+ MatDialogContent,
+ MatDialogRef,
+ MatDialogTitle
+} from "@angular/material/dialog";
@Component({
selector: 'app-deposit',
standalone: true,
- imports: [ReactiveFormsModule, NgIf],
+ imports: [ReactiveFormsModule, NgIf, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose],
templateUrl: './deposit.component.html',
- styleUrl: './deposit.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DepositComponent implements OnInit {
@@ -19,6 +25,7 @@ export class DepositComponent implements OnInit {
protected errorMsg = '';
private stripe: Stripe | null = null;
private service: DepositService = inject(DepositService);
+ public dialogRef: MatDialogRef = inject(MatDialogRef);
async ngOnInit() {
this.form = new FormGroup({
@@ -48,4 +55,8 @@ export class DepositComponent implements OnInit {
this.stripe?.redirectToCheckout({ sessionId });
});
}
+
+ public closeDialog(): void {
+ this.dialogRef.close();
+ }
}
diff --git a/frontend/src/app/feature/home/home.component.html b/frontend/src/app/feature/home/home.component.html
index 6a710c5..b85ce29 100644
--- a/frontend/src/app/feature/home/home.component.html
+++ b/frontend/src/app/feature/home/home.component.html
@@ -5,7 +5,7 @@
Ausloggen
- Benutzer
+ Einzahlen
diff --git a/frontend/src/app/feature/home/home.component.ts b/frontend/src/app/feature/home/home.component.ts
index 06aa423..deeb4dc 100644
--- a/frontend/src/app/feature/home/home.component.ts
+++ b/frontend/src/app/feature/home/home.component.ts
@@ -1,5 +1,7 @@
-import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
-import { KeycloakService } from 'keycloak-angular';
+import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
+import {KeycloakService} from 'keycloak-angular';
+import {MatDialog} from "@angular/material/dialog";
+import {DepositComponent} from "../deposit/deposit.component";
@Component({
selector: 'app-homepage',
@@ -10,10 +12,15 @@ import { KeycloakService } from 'keycloak-angular';
})
export class HomeComponent {
private keycloakService: KeycloakService = inject(KeycloakService);
+ public dialog: MatDialog = inject(MatDialog);
- logout() {
+ public logout() {
const baseUrl = window.location.origin;
this.keycloakService.logout(`${baseUrl}/`);
}
+
+ public openDialog() {
+ this.dialog.open(DepositComponent);
+ }
}
diff --git a/frontend/src/index.html b/frontend/src/index.html
index 8d60cc1..bd4ced1 100644
--- a/frontend/src/index.html
+++ b/frontend/src/index.html
@@ -6,8 +6,10 @@
-
-
+
+
+
+